From 69997075e569da3edd43e242ef36f09311262412 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Sat, 3 Oct 2026 11:45:04 +0300 Subject: [PATCH 1/7] refactor!: simplify query and session ownership Use Query cancellation and native mutation results instead of HTTP registries, access epochs and copied scope state. Keep local auth ordering and mutation identity fences. Allow staged generated files to remain excluded from ESLint. Backend contract: WealthLedger/backend@d698ed9 BREAKING CHANGE: drop investment stateVersion/progress/resources from the client contract and use data/metadata readiness instead of rewritten query status. Cross-tab auth may require re-login. --- .ai/conventions/data.md | 13 ++ package.json | 2 +- scripts/check-release.cjs | 6 - .../BrokerageAccountList.stories.tsx | 2 - .../BrokerageAccountList.tsx | 3 +- src/features/auth/model/auth.vm.ts | 11 +- .../instrument-details/model/section.ts | 2 +- .../model/connection-boundary.ts | 2 - .../model/screen-sync.test.tsx | 51 +++---- .../tbank-connection/model/screen-sync.ts | 135 +++++------------- .../tbank-connection/model/sync.test.tsx | 22 +-- src/features/tbank-connection/model/sync.ts | 12 -- .../account-income/model/display.test.ts | 65 --------- src/pages/account-income/model/display.ts | 42 +----- .../AccountIncomePage.test.tsx | 30 +--- .../AccountIncomePage/AccountIncomePage.vm.ts | 6 - .../ui/AccountPage/AccountPage.test.tsx | 7 +- .../ui/AccountPage/AccountPage.vm.test.tsx | 7 +- src/shared/api/client.ts | 60 +------- src/shared/api/generated/schema.d.ts | 13 +- src/shared/api/index.ts | 1 - src/shared/api/resource-query.test.tsx | 64 ++++----- src/shared/api/resource-query.ts | 96 +++---------- src/shared/api/spec/openapi.json | 49 +------ src/test/resource.ts | 1 - 25 files changed, 151 insertions(+), 551 deletions(-) delete mode 100644 src/features/tbank-connection/model/sync.ts diff --git a/.ai/conventions/data.md b/.ai/conventions/data.md index a6ed4d1..8c07414 100644 --- a/.ai/conventions/data.md +++ b/.ai/conventions/data.md @@ -39,6 +39,10 @@ Authorization. Auth endpoints исключены из Bearer/retry middleware. R координируется single-flight; после `401` с `UNAUTHORIZED` возможен один retry. Не добавляй собственный refresh/retry loop в caller. +Cookie-writing requests упорядочены только в текущей вкладке. Cross-tab auth +synchronization не требуется; допустим reload/re-login. Web Locks и отдельные +token stores не добавляются. + Protected queries используют existing session-aware boundary; logout очищает session-scoped cache. Access token хранится только в памяти, refresh передаётся httpOnly cookie с `credentials: include`. Не сохраняй tokens в localStorage, @@ -50,6 +54,15 @@ GET subtree; ошибка mutation не меняет generation/cache. Это о от обычного фонового refetch. Даже повторное сохранение того же token начинает новую generation; поздний ответ прежней generation не попадает в новый кэш. +Отмена/reset принадлежат TanStack Query и generated queryFn с AbortSignal, +без HTTP request registry, URL-wide latest-read counters и access epochs. +Успешный HTTP с `data: null` остаётся query success; readiness выбирается по +data/metadata, без подмены query status и отдельного transport state. +Status синхронизации содержит только состояние работы. Resources читаются +через `sync=observe` во время работы и после завершения, без hash comparison. +Согласованность income entries/groups обеспечивает backend; frontend не +дублирует её runtime validator. + Mutations используют существующий generated client и query-key owner; после успеха обновляй/invalidируй только связанные данные. Optimistic update нужен конкретному UX и обязан иметь rollback/error behavior. diff --git a/package.json b/package.json index dcf0843..8c0daa1 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "lint:fix": "npm run build:packages && eslint . --fix --max-warnings=0" }, "lint-staged": { - "*.{js,mjs,cjs,ts,tsx}": "eslint --fix --max-warnings=0" + "*.{js,mjs,cjs,ts,tsx}": "eslint --fix --max-warnings=0 --no-warn-ignored" }, "dependencies": { "@hookform/resolvers": "5.9.1", diff --git a/scripts/check-release.cjs b/scripts/check-release.cjs index f8814a0..88ffd1c 100644 --- a/scripts/check-release.cjs +++ b/scripts/check-release.cjs @@ -6,12 +6,6 @@ const { version } = require("../package.json"); const git = (...arguments_) => execFileSync("git", arguments_, { encoding: "utf8" }).trim(); // eslint-disable-line sonarjs/no-os-command-from-path -- Repository checks use the developer/CI Git installation; arguments never invoke a shell. -assert.equal( - git("status", "--porcelain"), - "", - "Commit all changes before preparing a release", -); - const tag_ = git( "tag", "--merged", diff --git a/src/entities/brokerage-account/ui/BrokerageAccountList/BrokerageAccountList.stories.tsx b/src/entities/brokerage-account/ui/BrokerageAccountList/BrokerageAccountList.stories.tsx index e37c134..3e7dc7e 100644 --- a/src/entities/brokerage-account/ui/BrokerageAccountList/BrokerageAccountList.stories.tsx +++ b/src/entities/brokerage-account/ui/BrokerageAccountList/BrokerageAccountList.stories.tsx @@ -210,7 +210,6 @@ export const IndependentFreshness: Story freshness: "stale", lastSuccessfulAt: "2026-09-24T10:30:00Z", resourceKey: "portfolio/storybook-account", - stateVersion: "failed", sync: { errorCode: "TBANK_UNAVAILABLE", id: "failed", @@ -223,7 +222,6 @@ export const IndependentFreshness: Story freshness: "unknown", lastSuccessfulAt: null, resourceKey: "portfolio/waiting", - stateVersion: "waiting", sync: { errorCode: null, id: "waiting", state: "running" }, }, ], diff --git a/src/entities/brokerage-account/ui/BrokerageAccountList/BrokerageAccountList.tsx b/src/entities/brokerage-account/ui/BrokerageAccountList/BrokerageAccountList.tsx index 8d1e01b..a706ea1 100644 --- a/src/entities/brokerage-account/ui/BrokerageAccountList/BrokerageAccountList.tsx +++ b/src/entities/brokerage-account/ui/BrokerageAccountList/BrokerageAccountList.tsx @@ -64,8 +64,7 @@ const BrokerageAccountSourceStatus: FC = ( const { source } = props; const { t } = useTranslation(); - const isSyncing - = source?.sync.state === "running" || source?.sync.state === "queued"; + const isSyncing = source?.sync.state === "running"; const errorText = source?.sync.state === "failed" ? t("accounts.refreshError") : null; diff --git a/src/features/auth/model/auth.vm.ts b/src/features/auth/model/auth.vm.ts index 191d160..4079923 100644 --- a/src/features/auth/model/auth.vm.ts +++ b/src/features/auth/model/auth.vm.ts @@ -38,14 +38,10 @@ function useAuthProviderVm() { const authQueueRef = useRef>(Promise.resolve()); const refreshPromiseRef = useRef | undefined>(undefined); - // Cookie-writing requests share ordering, including across tabs with Web Locks. + // Order cookie-writing requests within this tab. Other tabs may reauthenticate. const serialize = useCallback((run: () => Promise): Promise => { // eslint-disable-next-line unicorn/prefer-await -- Attach the handler immediately and retain the pending promise for queue/race ordering. - const next = authQueueRef.current.then(async () => - "locks" in navigator - ? navigator.locks.request("wealth-ledger-refresh", run) - : run(), - ); + const next = authQueueRef.current.then(run); // eslint-disable-next-line unicorn/prefer-await -- Attach the handler immediately and retain the pending promise for queue/race ordering. authQueueRef.current = next.catch(() => {}); @@ -110,8 +106,7 @@ function useAuthProviderVm() { } // eslint-disable-next-line unicorn/prefer-await -- Attach the handler immediately and retain the pending promise for queue/race ordering. }).finally(() => { - if (refreshPromiseRef.current === pending) - refreshPromiseRef.current = undefined; + refreshPromiseRef.current = undefined; }); refreshPromiseRef.current = pending; diff --git a/src/features/instrument-details/model/section.ts b/src/features/instrument-details/model/section.ts index d0d5d17..399d903 100644 --- a/src/features/instrument-details/model/section.ts +++ b/src/features/instrument-details/model/section.ts @@ -34,7 +34,7 @@ function section( Boolean(query.data) && (query.isFetching || query.meta?.sync.state === "running" - || query.meta?.sync.state === "queued"), + ), retry: () => { void (retry ?? query.refetch)(); }, diff --git a/src/features/tbank-connection/model/connection-boundary.ts b/src/features/tbank-connection/model/connection-boundary.ts index 445e65c..22b86e8 100644 --- a/src/features/tbank-connection/model/connection-boundary.ts +++ b/src/features/tbank-connection/model/connection-boundary.ts @@ -2,7 +2,6 @@ import type { QueryClient } from "@tanstack/react-query"; import { apiQueryClient, - invalidateApiRequests, type paths, } from "@/shared/api"; @@ -27,7 +26,6 @@ function commitTbankConnectionBoundary( queryClient: QueryClient, status: TbankConnectionStatus, ) { - invalidateApiRequests(isInvestmentPath); queryClient.setQueryData(tbankConnectionQueryKey, status); void queryClient.resetQueries({ predicate: ({ queryKey }) => { diff --git a/src/features/tbank-connection/model/screen-sync.test.tsx b/src/features/tbank-connection/model/screen-sync.test.tsx index 037298a..dc39898 100644 --- a/src/features/tbank-connection/model/screen-sync.test.tsx +++ b/src/features/tbank-connection/model/screen-sync.test.tsx @@ -21,7 +21,7 @@ function auth() { } describe("page-owned screen synchronization", () => { - it("ignores a late sync acceptance after the account scope changes", async () => { + it("keeps the current scope when an older sync acceptance arrives last", async () => { auth(); const { promise: blocked, resolve: release } @@ -37,7 +37,7 @@ describe("page-owned screen synchronization", () => { }; posted.push(scope.accountId); - await blocked; + if (scope.accountId === "old") await blocked; return HttpResponse.json( { id: scope.accountId, now: "2026-09-25T00:00:00Z", scope }, @@ -49,7 +49,6 @@ describe("page-owned screen synchronization", () => { return HttpResponse.json({ id: params.id, - resources: [], state: "succeeded", }); }), @@ -69,12 +68,13 @@ describe("page-owned screen synchronization", () => { }); await waitFor(() => expect(posted).toEqual(["old"])); rerender({ accountId: "new" }); + await act(() => result.current.refresh()); + await waitFor(() => expect(polled).toEqual(["new"])); await act(async () => { release(); await pending; }); - await act(() => result.current.refresh()); - await waitFor(() => expect(polled).toEqual(["new"])); + expect(polled).toEqual(["new"]); expect(posted).toEqual(["old", "new"]); }); it.each([false, true])( @@ -91,7 +91,7 @@ describe("page-owned screen synchronization", () => { return isUnavailable ? HttpResponse.json({ code: "UNAVAILABLE" }, { status: 503 }) : HttpResponse.json( - resource([], { stateVersion: String(modes.length) }), + resource([], { dataRevision: String(modes.length) }), ); }), http.post("*/api/v1/tbank-sync", () => { @@ -129,7 +129,7 @@ describe("page-owned screen synchronization", () => { isUnavailable = false; await act(() => result.current.sync.retry()); await waitFor(() => expect(result.current.accounts.isSuccess).toBe(true)); - expect(result.current.accounts.meta?.stateVersion).toBe( + expect(result.current.accounts.meta?.dataRevision).toBe( cached ? "3" : "2", ); expect(modes).toEqual( @@ -169,15 +169,15 @@ describe("page-owned screen synchronization", () => { server.use( http.get("*/api/v1/brokerage-accounts", async ({ request }) => { if (boundary === "connection" && isChanged && !request.signal.aborted) - return HttpResponse.json(resource([], { stateVersion: "current" })); + return HttpResponse.json(resource([], { dataRevision: "current" })); if (!new URL(request.url).searchParams.has("sync")) return isChanged - ? HttpResponse.json(resource([], { stateVersion: "current" })) + ? HttpResponse.json(resource([], { dataRevision: "current" })) : HttpResponse.json({ code: "UNAVAILABLE" }, { status: 503 }); isRecovering = true; await blocked; - return HttpResponse.json(resource([], { stateVersion: "old" })); + return HttpResponse.json(resource([], { dataRevision: "old" })); }), ); const { queryClient, wrapper } = createQueryWrapper(); @@ -247,11 +247,11 @@ describe("page-owned screen synchronization", () => { if (boundary === "connection") await waitFor(() => // eslint-disable-next-line vitest/no-conditional-expect -- The fixed table case selects the expected outcome; every case asserts its own branch. - expect(result.current.accounts.meta?.stateVersion).toBe("current"), + expect(result.current.accounts.meta?.dataRevision).toBe("current"), ); expect(published).not.toContainEqual( expect.objectContaining({ - meta: expect.objectContaining({ stateVersion: "old" }) as unknown, + meta: expect.objectContaining({ dataRevision: "old" }) as unknown, }), ); unsubscribe(); @@ -281,7 +281,6 @@ describe("page-owned screen synchronization", () => { ? HttpResponse.json({ code: "UNAVAILABLE" }, { status: 503 }) : HttpResponse.json({ id: "recover", - resources: [resource([]).meta], state: "succeeded", }); }), @@ -316,7 +315,8 @@ describe("page-owned screen synchronization", () => { await waitFor(() => expect(result.current.accounts.isSuccess).toBe(true)); expect(result.current.accounts.data).toEqual([]); - expect(modes).toEqual([null, "observe"]); + expect(modes[0]).toBeNull(); + expect(modes.slice(1).every(mode => mode === "observe")).toBe(true); expect( queryClient .getQueryCache() @@ -332,7 +332,7 @@ describe("page-owned screen synchronization", () => { let polls = 0; const meta = () => - resource([], { stateVersion: isCompleted ? "2" : "1" }).meta; + resource([], { dataRevision: isCompleted ? "2" : "1" }).meta; server.use( http.get("*/api/v1/brokerage-accounts", ({ request }) => { @@ -361,8 +361,6 @@ describe("page-owned screen synchronization", () => { errorCode: null, id: "screen", now: "2026-09-25T00:00:00Z", - progress: { completed: 1, discovering: false, total: 1 }, - resources: [meta()], scope: { screen: "accounts" }, state: "succeeded", }, @@ -390,7 +388,7 @@ describe("page-owned screen synchronization", () => { ]); }); await waitFor(() => - expect(result.current.accounts.meta?.stateVersion).toBe("2"), + expect(result.current.accounts.meta?.dataRevision).toBe("2"), ); expect(bodies).toEqual([{ screen: "accounts" }]); @@ -427,7 +425,7 @@ describe("page-owned screen synchronization", () => { ? [] : null, { - stateVersion: isCompleted ? "covered" : "initial", + dataRevision: isCompleted ? "covered" : "initial", sync: { errorCode: null, id: "history", state: "running" }, }, ); @@ -446,12 +444,6 @@ describe("page-owned screen synchronization", () => { errorCode: null, id: "history", now: "2026-09-25T00:00:00Z", - progress: { - completed: isCompleted ? 1 : 0, - discovering: true, - total: 2, - }, - resources: [snapshot().meta], scope: null, state: "running", }, @@ -487,7 +479,8 @@ describe("page-owned screen synchronization", () => { await new Promise(resolve => setTimeout(resolve, 1100)); }); - expect(modes).toEqual([null, "observe"]); + expect(modes[0]).toBeNull(); + expect(modes.slice(1).every(mode => mode === "observe")).toBe(true); if (boundary === "leave") unmount(); else act(() => configureAuthClient()); const stopped = polls; @@ -545,8 +538,8 @@ describe("page-owned screen synchronization", () => { [], { + dataRevision: isObserved ? "covered" : "initial", resourceKey: "operations", - stateVersion: isObserved ? "covered" : "initial", sync: { errorCode: null, id: "dependency", @@ -570,7 +563,7 @@ describe("page-owned screen synchronization", () => { dependencies: [ { ...dependency, - stateVersion: isObserved ? "covered" : "initial", + dataRevision: isObserved ? "covered" : "initial", }, ], resourceKey: "projection", @@ -585,8 +578,6 @@ describe("page-owned screen synchronization", () => { errorCode: null, id: "dependency", now: "2026-09-25T00:00:00Z", - progress: { completed: 1, discovering: false, total: 1 }, - resources: [{ ...dependency, stateVersion: "covered" }], scope: null, state: "succeeded", }, diff --git a/src/features/tbank-connection/model/screen-sync.ts b/src/features/tbank-connection/model/screen-sync.ts index 5bfd3a7..00db54a 100644 --- a/src/features/tbank-connection/model/screen-sync.ts +++ b/src/features/tbank-connection/model/screen-sync.ts @@ -1,5 +1,5 @@ import { type QueryKey, useQueryClient } from "@tanstack/react-query"; -import { useEffect, useLayoutEffect, useRef, useState } from "react"; +import { useEffect, useRef } from "react"; import { ApiErrorCode, @@ -8,103 +8,49 @@ import { invalidateResourceAccess, type InvestmentResourceMeta, isApiErrorCode, + type paths, useAuthenticatedQueries, } from "@/shared/api"; -import { type InvestmentScreen, useTbankSync } from "./sync"; +type InvestmentScreen + = paths["/api/v1/tbank-sync"]["post"]["requestBody"]["content"]["application/json"]; type ScreenResource = { + isError: boolean; + isFetching: boolean; meta?: InvestmentResourceMeta; - observe: (version?: string) => Promise; + observe: () => Promise; queryKey: QueryKey; - transport: { - fetchStatus: "fetching" - | "idle" - | "paused"; - status: "error" - | "pending" - | "success"; - }; }; const STATUS_INTERVAL_MS = 1000; -function observeResource( - resource: ScreenResource, - latest: Map, - completedId: string | undefined, - observed: Map, -) { - if (!resource.meta) { - if (!completedId || resource.transport.fetchStatus !== "idle") return; - const key = `query:${JSON.stringify(resource.queryKey)}`; - if (observed.get(key) === completedId) return; - observed.set(key, completedId); - void resource.observe().catch(() => {}); - - return; - } - - const changed = [ - resource.meta, - ...(resource.meta.dependencies ?? []), - ].flatMap((current) => { - const notified = latest.get(current.resourceKey); - - return notified && notified.stateVersion !== current.stateVersion - ? [notified] - : []; +function useScreenSync(scope: InvestmentScreen, resources: ScreenResource[]) { + const mutation = apiQueryClient.useMutation("post", "/api/v1/tbank-sync", { + retry: false, }); - if (changed.length === 0) return; - - const notification = JSON.stringify( - changed.map(meta => [meta.resourceKey, meta.stateVersion]), - ); - - if (observed.get(resource.meta.resourceKey) === notification) return; - observed.set(resource.meta.resourceKey, notification); - - const own = changed.find( - meta => meta.resourceKey === resource.meta?.resourceKey, - ); - - void resource.observe(own?.stateVersion).catch(() => {}); -} - -function useScreenSync(scope: InvestmentScreen, resources: ScreenResource[]) { - const mutation = useTbankSync(); const client = useQueryClient(); const deniedRef = useRef(new Set()); const scopeKey = JSON.stringify(scope); - const [requested, setRequested] = useState(null); - const requestInFlightRef = useRef(null); - const currentScopeRef = useRef(scopeKey); - useLayoutEffect(() => { - currentScopeRef.current = scopeKey; - }, [scopeKey]); const isCurrentMutation = JSON.stringify(mutation.variables?.body) === scopeKey; - const observedRef = useRef(new Map()); + const observedRef = useRef(""); const ids = [ ...new Set([ - ...(requested?.scope === scopeKey ? [requested.id] : []), + ...(isCurrentMutation && mutation.data ? [mutation.data.id] : []), ...resources .flatMap(({ meta }) => meta ? [meta, ...(meta.dependencies ?? [])] : [], ) .flatMap(meta => meta.sync.id - && (meta.sync.state === "running" || meta.sync.state === "queued") + && meta.sync.state === "running" ? [meta.sync.id] : [], ), @@ -140,33 +86,29 @@ function useScreenSync(scope: InvestmentScreen, resources: ScreenResource[]) { invalidateResourceAccess(client, "brokerage", status.error); } - const latest = new Map(); + if (statuses.every(status => !status.data)) return; - const orderedStatuses = statuses.toSorted( - (a, b) => a.dataUpdatedAt - b.dataUpdatedAt, + const observation = JSON.stringify([ + scopeKey, + statuses.map(status => [ + status.data?.id, + status.data?.state, + status.dataUpdatedAt, + ]), + resources.map(resource => resource.queryKey), + ]); + + if (observedRef.current === observation) return; + observedRef.current = observation; + + const isCompleted = statuses.every( + status => status.data && status.data.state !== "running", ); - for (const status of orderedStatuses) { - const statusResources = status.data?.resources ?? []; - - for (const meta of statusResources) { - latest.set(meta.resourceKey, meta); - const dependencies = meta.dependencies ?? []; - for (const dependency of dependencies) - latest.set(dependency.resourceKey, dependency); - } - } - - const completed = statuses.find( - status => - requested?.scope === scopeKey - && status.data?.id === requested.id - && status.data.state !== "running", - )?.data; - for (const resource of resources) - observeResource(resource, latest, completed?.id, observedRef.current); - }, [client, statuses, resources, requested, scopeKey]); + if (isCompleted || !resource.isFetching) + void resource.observe().catch(() => {}); + }, [client, statuses, resources, scopeKey]); const isRefreshing = (isCurrentMutation && mutation.isPending) @@ -179,7 +121,7 @@ function useScreenSync(scope: InvestmentScreen, resources: ScreenResource[]) { return ( !status?.isError && (!status?.data || status.data.state === "running") - && (meta?.sync.state === "running" || meta?.sync.state === "queued") + && meta?.sync.state === "running" ); }); @@ -188,12 +130,7 @@ function useScreenSync(scope: InvestmentScreen, resources: ScreenResource[]) { requestInFlightRef.current = scopeKey; try { - const accepted = await mutation.mutateAsync({ body: scope }); - if ( - currentScopeRef.current === scopeKey - && requestInFlightRef.current === scopeKey - ) - setRequested({ id: accepted.id, scope: scopeKey }); + await mutation.mutateAsync({ body: scope }); } catch { /* @@ -212,7 +149,7 @@ function useScreenSync(scope: InvestmentScreen, resources: ScreenResource[]) { // A source failure (or explicit refresh with no read error) still needs a sync. const retry = async () => { const failed = resources.filter( - resource => resource.transport.status === "error", + resource => resource.isError, ); const failedStatuses = statuses.filter(status => status.isError); @@ -238,4 +175,4 @@ function useScreenSync(scope: InvestmentScreen, resources: ScreenResource[]) { }; } -export { useScreenSync }; +export { type InvestmentScreen, useScreenSync }; diff --git a/src/features/tbank-connection/model/sync.test.tsx b/src/features/tbank-connection/model/sync.test.tsx index b284931..61ad44a 100644 --- a/src/features/tbank-connection/model/sync.test.tsx +++ b/src/features/tbank-connection/model/sync.test.tsx @@ -8,13 +8,14 @@ import { createQueryWrapper } from "@/test/query"; import { resource } from "@/test/resource"; import { server } from "@/test/server"; +import type { InvestmentScreen } from "./screen-sync"; + import { useScreenSync } from "../index"; import { commitTbankConnectionBoundary } from "./connection-boundary"; -import { type InvestmentScreen, useTbankSync } from "./sync"; describe("sync connection and session boundaries", () => { it.each(["connection", "session"])( - "discards pending status and mutation after %s changes", + "keeps old status out of the cache after %s changes", async (boundary) => { let generation = 0; configureAuthClient({ @@ -57,8 +58,6 @@ describe("sync connection and session boundaries", () => { ...accepted, errorCode: null, now, - progress: { completed: 1, discovering: false, total: 1 }, - resources: [], state: "succeeded", }, ); @@ -84,7 +83,11 @@ describe("sync connection and session boundaries", () => { const accounts = useBrokerageAccounts(); useScreenSync({ screen: "accounts" }, [accounts]); - return { mutation: useTbankSync() }; + return { + mutation: apiQueryClient.useMutation("post", "/api/v1/tbank-sync", { + retry: false, + }), + }; }, { wrapper }, ); @@ -95,10 +98,8 @@ describe("sync connection and session boundaries", () => { mutation = result.current.mutation.mutateAsync({ body: screen }); }); - // eslint-disable-next-line vitest/valid-expect -- Attach rejection handling before releasing the request; the assertion is awaited below. - const discarded = expect(mutation).rejects.toMatchObject({ - name: "AbortError", - }); + // eslint-disable-next-line unicorn/prefer-await -- Handle rejection before changing the boundary and releasing the pending response. + const settled = mutation.catch(() => {}); await waitFor(() => expect(started).toBe(2)); await act(async () => { @@ -121,8 +122,7 @@ describe("sync connection and session boundaries", () => { release(); await blocked; }); - await discarded; - expect(result.current.mutation.data).toBeUndefined(); + await settled; const key = apiQueryClient.queryOptions( "get", diff --git a/src/features/tbank-connection/model/sync.ts b/src/features/tbank-connection/model/sync.ts deleted file mode 100644 index fadb494..0000000 --- a/src/features/tbank-connection/model/sync.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { apiQueryClient, type paths } from "@/shared/api"; - -type InvestmentScreen - = paths["/api/v1/tbank-sync"]["post"]["requestBody"]["content"]["application/json"]; - -function useTbankSync() { - return apiQueryClient.useMutation("post", "/api/v1/tbank-sync", { - retry: false, - }); -} - -export { type InvestmentScreen, useTbankSync }; diff --git a/src/pages/account-income/model/display.test.ts b/src/pages/account-income/model/display.test.ts index 60b7248..01ce9e7 100644 --- a/src/pages/account-income/model/display.test.ts +++ b/src/pages/account-income/model/display.test.ts @@ -44,71 +44,6 @@ function summary(currency: string, coupon: string, dividend: string) { }; } -describe("income membership validation", () => { - const entry: IncomeAnalytics["entries"][number] = { - accruedInterest: null, - category: "income", - commission: null, - description: "Купон", - figi: "FIGI", - id: "coupon-1", - instrumentKey: "income-group", - instrumentType: "bond", - instrumentUid: null, - logoName: null, - occurredAt: "2026-08-01T12:00:00Z", - payment: money("RUB", "10"), - price: null, - quantity: null, - ticker: "BOND", - type: "OPERATION_TYPE_COUPON", - }; - - const instrument: IncomeAnalytics["instruments"][number] = { - ...summary("RUB", "10", "0"), - displayName: "BOND", - figi: "FIGI", - instrumentType: "bond", - instrumentUid: null, - key: entry.instrumentKey, - receiptCount: 1, - ticker: "BOND", - }; - - const valid: IncomeAnalytics = { - ...analytics, - entries: [entry], - instruments: [instrument], - totalsByCurrency: [summary("RUB", "10", "0")], - }; - - it.each([ - ["missing key", undefined], - ["empty key", ""], - ["whitespace key", " "], - ["non-string key", 12], - ["unknown key", "not-in-breakdown"], - ])("rejects an entry with %s", (_name, instrumentKey) => { - // Deliberately malformed API data exercises the runtime validation boundary. - const response = { - ...valid, - entries: [{ ...entry, instrumentKey }], - } as unknown as IncomeAnalytics; - - expect(toIncomeDisplayModel(response)).toBeNull(); - }); - - it.each([ - ["duplicate instrument keys", { instruments: [instrument, instrument] }], - ["currency mismatch", { entries: [{ ...entry, payment: money("USD", "10") }] }], - ["receipt count mismatch", { instruments: [{ ...instrument, receiptCount: 2 }] }], - ["missing entries", { entries: [] }], - ["empty instrument key", { instruments: [{ ...instrument, key: "" }] }], - ])("rejects %s", (_name, invalid) => { - expect(toIncomeDisplayModel({ ...valid, ...invalid })).toBeNull(); - }); -}); - describe("income comparison display", () => { it.each([ ["25", "100", "+25 %"], diff --git a/src/pages/account-income/model/display.ts b/src/pages/account-income/model/display.ts index 22b8d80..59a2679 100644 --- a/src/pages/account-income/model/display.ts +++ b/src/pages/account-income/model/display.ts @@ -97,49 +97,14 @@ function formatIncomeChange( function toIncomeDisplayModel( analytics: IncomeAnalytics, meta?: IncomeAnalyticsMeta, -): IncomeDisplayModel | null { - const instruments = new Map< - string, - { - currency: string; - includedCount: number; - receiptCount: number; - } - >(); - - const currencies = new Set( - analytics.totalsByCurrency.map(({ currency }) => currency), - ); - - for (const instrument of analytics.instruments) { - if ( - typeof instrument.key !== "string" - || !instrument.key.trim() - || instruments.has(instrument.key) - || !currencies.has(instrument.total.currency) - ) - - return null; - instruments.set(instrument.key, { - currency: instrument.total.currency, - includedCount: 0, - receiptCount: instrument.receiptCount, - }); - } - +): IncomeDisplayModel { const entries: IncomeDisplayModel["entries"] = []; const occurrences = new Map(); for (const entry of analytics.entries) { - if (typeof entry.instrumentKey !== "string" || !entry.instrumentKey.trim()) - return null; - const instrument = instruments.get(entry.instrumentKey); - if (!instrument || entry.payment?.currency !== instrument.currency) - return null; const occurrenceKey = JSON.stringify([entry.instrumentKey, entry.id]); const occurrence = occurrences.get(occurrenceKey) ?? 0; occurrences.set(occurrenceKey, occurrence + 1); - instrument.includedCount += 1; entries.push({ key: JSON.stringify([ entry.instrumentKey, @@ -151,11 +116,6 @@ function toIncomeDisplayModel( }); } - for (const instrument of instruments.values()) { - if (instrument.includedCount !== instrument.receiptCount) - return null; - } - const dependencies = meta?.dependencies ?? []; const previous = dependencies.find(({ role }) => role === "previous"); const year = dependencies.find(({ role }) => role === "year"); diff --git a/src/pages/account-income/ui/AccountIncomePage/AccountIncomePage.test.tsx b/src/pages/account-income/ui/AccountIncomePage/AccountIncomePage.test.tsx index b52dbb8..106aef7 100644 --- a/src/pages/account-income/ui/AccountIncomePage/AccountIncomePage.test.tsx +++ b/src/pages/account-income/ui/AccountIncomePage/AccountIncomePage.test.tsx @@ -324,32 +324,6 @@ describe("AccountIncomePage", () => { expect(within(panel).getAllByRole("listitem")).toHaveLength(2); }); - it("rejects inconsistent analytics and recovers through retry", async () => { - let response = { - ...analytics, - entries: [ - { ...analytics.entries[0], instrumentKey: "not-in-breakdown" }, - analytics.entries[1], - ], - }; - - server.use( - http.get("*/api/v1/brokerage-accounts/account-1/income-analytics", () => - HttpResponse.json(resource(response)), - ), - ); - renderPage(); - const retry = await screen.findByRole("button", { name: "Повторить" }); - expect( - screen.queryByRole("region", { name: "Выплаты" }), - ).not.toBeInTheDocument(); - response = analytics; - fireEvent.click(retry); - expect( - await screen.findByRole("region", { name: "Выплаты" }), - ).toBeInTheDocument(); - }); - it("accepts an empty analytics response", async () => { server.use( http.get("*/api/v1/brokerage-accounts/account-1/income-analytics", () => @@ -709,15 +683,13 @@ describe("income period and snapshot boundary", () => { errorCode: null, id: "income", now: "2026-09-25T00:00:00Z", - progress: { completed: 1, discovering: false, total: 1 }, - resources: [resource(null, { stateVersion: "2" }).meta], scope: null, state: "succeeded", }, ), ), http.get("*/api/v1/brokerage-accounts/account-1/income-analytics", () => - HttpResponse.json(resource(analytics, { stateVersion: "2" })), + HttpResponse.json(resource(analytics, { dataRevision: "2" })), ), ); fireEvent.click(screen.getByRole("button", { name: "Повторить" })); diff --git a/src/pages/account-income/ui/AccountIncomePage/AccountIncomePage.vm.ts b/src/pages/account-income/ui/AccountIncomePage/AccountIncomePage.vm.ts index 3f22620..0d52a74 100644 --- a/src/pages/account-income/ui/AccountIncomePage/AccountIncomePage.vm.ts +++ b/src/pages/account-income/ui/AccountIncomePage/AccountIncomePage.vm.ts @@ -89,12 +89,6 @@ const useAccountIncomePageViewModel = (): AccountIncomePageViewModel => { } const display = toIncomeDisplayModel(analytics.data, analytics.meta); - if (!display) - return { - period, - retry: () => analytics.observe(), - state: "error", - }; const onSubmit = (values: IncomeForm) => { const from = parseDraftDate(values.from); diff --git a/src/pages/account/ui/AccountPage/AccountPage.test.tsx b/src/pages/account/ui/AccountPage/AccountPage.test.tsx index 1a8a691..94afba2 100644 --- a/src/pages/account/ui/AccountPage/AccountPage.test.tsx +++ b/src/pages/account/ui/AccountPage/AccountPage.test.tsx @@ -786,11 +786,6 @@ describe("AccountPage states", () => { errorCode: null, id: "overview", now: "2026-09-25T00:00:00Z", - progress: { completed: 1, discovering: false, total: 1 }, - resources: [ - resource(null, { resourceKey: "portfolio", stateVersion: "2" }) - .meta, - ], scope: { accountId: "account-1", screen: "account" }, state: "succeeded", }, @@ -871,7 +866,7 @@ describe("AccountPage states", () => { structure: { currencies: [], unvaluedCategories: [] }, totalsByCurrency: [{ currency: "USD", value: "-0.5" }], }, - { resourceKey: "portfolio", stateVersion: "2" }, + { dataRevision: "2", resourceKey: "portfolio" }, ), ), ); diff --git a/src/pages/account/ui/AccountPage/AccountPage.vm.test.tsx b/src/pages/account/ui/AccountPage/AccountPage.vm.test.tsx index 091d099..e0bea05 100644 --- a/src/pages/account/ui/AccountPage/AccountPage.vm.test.tsx +++ b/src/pages/account/ui/AccountPage/AccountPage.vm.test.tsx @@ -231,7 +231,7 @@ it("refreshes every overview section through one account descriptor and observat observed.push(path); return HttpResponse.json( - resource(data, { resourceKey: path, stateVersion: version }), + resource(data, { dataRevision: version, resourceKey: path }), ); }, ), @@ -256,11 +256,6 @@ it("refreshes every overview section through one account descriptor and observat errorCode: null, id: "overview", now: "2026-09-25T00:00:00Z", - progress: { completed: 4, discovering: false, total: 4 }, - resources: Object.keys(sections).map( - resourceKey => - resource(null, { resourceKey, stateVersion: version }).meta, - ), scope: null, state: "succeeded", }, diff --git a/src/shared/api/client.ts b/src/shared/api/client.ts index 3d50171..ea8d312 100644 --- a/src/shared/api/client.ts +++ b/src/shared/api/client.ts @@ -23,14 +23,6 @@ type AuthHandlers = { refresh: () => Promise; }; -const inFlight = new Set<{ invalidated: boolean; pathname: string }>(); -const latestReads = new Map(); - -function invalidateApiRequests(isMatches: (pathname: string) => boolean) { - for (const request of inFlight) - if (isMatches(request.pathname)) request.invalidated = true; -} - const sessionState: { handlers?: AuthHandlers; hasSession: boolean } = { hasSession: false, }; @@ -38,48 +30,6 @@ const sessionState: { handlers?: AuthHandlers; hasSession: boolean } = { const authSessionListeners = new Set<() => void>(); async function authenticatedFetch(request: Request): Promise { - const url = new URL(request.url); - url.searchParams.delete("sync"); - url.searchParams.sort(); - const key = `${request.method} ${url}`; - const ticket = { invalidated: false, pathname: url.pathname }; - - const read - = request.method === "GET" - ? (latestReads.get(key) ?? { pending: 0, sequence: 0 }) - : undefined; - - if (read) { - read.sequence += 1; - read.pending += 1; - latestReads.set(key, read); - } - - const sequence = read?.sequence; - inFlight.add(ticket); - - try { - return await fetchCurrent( - request, - () => !ticket.invalidated && (!read || sequence === read.sequence), - ); - } - finally { - inFlight.delete(ticket); - if (read && --read.pending === 0) latestReads.delete(key); - } -} - -function configureAuthClient(handlers?: AuthHandlers) { - if (!handlers) invalidateApiRequests(() => true); - sessionState.handlers = handlers; - setAuthenticatedSession(Boolean(sessionState.handlers?.accessToken())); -} - -async function fetchCurrent( - request: Request, - isLatest: () => boolean, -): Promise { const isAuthRequest = new URL(request.url).pathname.startsWith( "/api/v1/auth/", ); @@ -91,7 +41,7 @@ async function fetchCurrent( (session?.generation ? generation === session.generation() && generation === sessionState.handlers?.generation?.() - : session === sessionState.handlers) && isLatest(); + : session === sessionState.handlers); const token = session?.accessToken(); @@ -107,7 +57,6 @@ async function fetchCurrent( const retryRequest = authorized.clone(); const response = await fetch(authorized); - await response.clone().arrayBuffer(); if (!isAuthRequest && !isCurrent()) throw new DOMException("Session changed", "AbortError"); if ( @@ -139,12 +88,16 @@ async function fetchCurrent( const refreshedToken = sessionState.handlers.accessToken(); if (!refreshedToken) return response; const retried = await fetch(withToken(retryRequest, refreshedToken)); - await retried.clone().arrayBuffer(); if (!isCurrent()) throw new DOMException("Session changed", "AbortError"); return retried; } +function configureAuthClient(handlers?: AuthHandlers) { + sessionState.handlers = handlers; + setAuthenticatedSession(Boolean(sessionState.handlers?.accessToken())); +} + function hasAuthenticatedSession() { return sessionState.hasSession; } @@ -174,6 +127,5 @@ export { apiQueryClient, configureAuthClient, hasAuthenticatedSession as getAuthenticatedSessionSnapshot, - invalidateApiRequests, subscribeAuthenticatedSession, }; diff --git a/src/shared/api/generated/schema.d.ts b/src/shared/api/generated/schema.d.ts index 13d1c34..17f40f5 100644 --- a/src/shared/api/generated/schema.d.ts +++ b/src/shared/api/generated/schema.d.ts @@ -915,12 +915,11 @@ export interface components { InvestmentSyncDto: { id: string | null; /** @enum {string} */ - state: "idle" | "queued" | "running" | "failed"; + state: "idle" | "running" | "failed"; errorCode: string | null; }; InvestmentDependencyDto: { dataRevision: string; - stateVersion: string; unavailableReason?: string; coverage?: components["schemas"]["InvestmentCoverageDto"]; resourceKey: string; @@ -934,7 +933,6 @@ export interface components { }; InvestmentResourceMetaDto: { dataRevision: string; - stateVersion: string; unavailableReason?: string; coverage?: components["schemas"]["InvestmentCoverageDto"]; resourceKey: string; @@ -1126,7 +1124,6 @@ export interface components { }; IncomeDependencyDto: { dataRevision: string; - stateVersion: string; unavailableReason?: string; coverage?: components["schemas"]["InvestmentCoverageDto"]; resourceKey: string; @@ -1142,7 +1139,6 @@ export interface components { }; IncomeAnalyticsMetaDto: { dataRevision: string; - stateVersion: string; unavailableReason?: string; coverage?: components["schemas"]["InvestmentCoverageDto"]; resourceKey: string; @@ -1622,11 +1618,6 @@ export interface components { /** Format: date-time */ now: string; }; - TbankSyncProgressDto: { - completed: number; - total: number; - discovering: boolean; - }; TbankSyncStatusDto: { /** Format: uuid */ id: string; @@ -1636,8 +1627,6 @@ export interface components { /** @enum {string} */ state: "running" | "succeeded" | "failed" | "cancelled"; errorCode: string | null; - progress: components["schemas"]["TbankSyncProgressDto"]; - resources: components["schemas"]["InvestmentResourceMetaDto"][]; }; }; responses: never; diff --git a/src/shared/api/index.ts b/src/shared/api/index.ts index 49b5425..efdc54a 100644 --- a/src/shared/api/index.ts +++ b/src/shared/api/index.ts @@ -6,7 +6,6 @@ export { apiClient, apiQueryClient, configureAuthClient, - invalidateApiRequests, } from "./client"; export type { paths } from "./generated/schema"; export { ApiErrorCode, apiErrorCode, isApiErrorCode } from "./problem-details"; diff --git a/src/shared/api/resource-query.test.tsx b/src/shared/api/resource-query.test.tsx index 9ccbc2a..66a461d 100644 --- a/src/shared/api/resource-query.test.tsx +++ b/src/shared/api/resource-query.test.tsx @@ -2,7 +2,7 @@ import { act, renderHook, waitFor } from "@testing-library/react"; import { http, HttpResponse } from "msw"; import { describe, expect, it, vi } from "vitest"; -import { apiClient, configureAuthClient } from "@/shared/api"; +import { configureAuthClient } from "@/shared/api"; import { createQueryWrapper } from "@/test/query"; import { resource } from "@/test/resource"; import { server } from "@/test/server"; @@ -37,7 +37,7 @@ function auth() { } describe("persistent resource query lifecycle", () => { - it("observes into the canonical cache and rejects an old notified state before accepting the current one", async () => { + it("observes once into the canonical cache without another import", async () => { auth(); const modes: (null | string)[] = []; let observations = 0; @@ -51,7 +51,7 @@ describe("persistent resource query lifecycle", () => { return HttpResponse.json( resource(snapshot, { - stateVersion: observations > 1 ? "new" : "old", + dataRevision: observations > 0 ? "new" : "old", }), ); }, @@ -60,16 +60,16 @@ describe("persistent resource query lifecycle", () => { const { queryClient, wrapper } = createQueryWrapper(); const { result } = renderHook(() => usePrivateResource("a"), { wrapper }); await waitFor(() => expect(result.current.isSuccess).toBe(true)); - await act(() => result.current.observe("new")); - await waitFor(() => expect(result.current.meta?.stateVersion).toBe("new")); + await act(() => result.current.observe()); + await waitFor(() => expect(result.current.meta?.dataRevision).toBe("new")); - expect(modes).toEqual([null, "observe", "observe"]); + expect(modes).toEqual([null, "observe"]); expect(queryClient.getQueryCache().getAll()).toHaveLength(1); expect( queryClient.getQueryData(resourceOptions("a").queryKey), - ).toMatchObject({ data: snapshot, meta: { stateVersion: "new" } }); + ).toMatchObject({ data: snapshot, meta: { dataRevision: "new" } }); }); - it("does not convert missing or failed source data to empty financial success", async () => { + it("keeps successful HTTP state distinct from missing or failed source data", async () => { auth(); server.use( http.get("*/api/v1/brokerage-accounts/:accountId/portfolio", () => @@ -91,24 +91,17 @@ describe("persistent resource query lifecycle", () => { await waitFor(() => expect(result.current.meta?.sync.state).toBe("failed")); expect(result.current.data).toBeUndefined(); - expect(result.current.isSuccess).toBe(false); - expect(result.current.status).toBe("pending"); - expect(result.current.isPending).toBe(true); + expect(result.current.isSuccess).toBe(true); + expect(result.current.status).toBe("success"); + expect(result.current.isPending).toBe(false); expect(result.current.isLoading).toBe(false); - expect(result.current.transport).toEqual( - { - error: null, - fetchStatus: "idle", - status: "success", - }, - ); expect(result.current.meta?.availability).toBe("missing"); }); it("keeps the refetch envelope while exposing the refreshed resource payload", async () => { auth(); let isReady = false; - const refreshed = resource(snapshot, { stateVersion: "ready" }); + const refreshed = resource(snapshot, { dataRevision: "ready" }); server.use( http.get("*/api/v1/brokerage-accounts/:accountId/portfolio", () => HttpResponse.json(isReady ? refreshed : resource(null)), @@ -120,7 +113,7 @@ describe("persistent resource query lifecycle", () => { }); await waitFor(() => - expect(result.current.transport.status).toBe("success"), + expect(result.current.status).toBe("success"), ); await act(async () => { const missing = await result.current.refetch(); @@ -140,35 +133,40 @@ describe("persistent resource query lifecycle", () => { expect(result.current.isSuccess).toBe(true); expect(result.current.isPending).toBe(false); }); - it("rejects a late ordinary response when an observe response for that resource arrived first", async () => { + it("keeps the observed snapshot when an older query finishes later", async () => { auth(); const { promise: blocked, resolve: release } = Promise.withResolvers(); + let isStarted = false; server.use( http.get( "*/api/v1/brokerage-accounts/:accountId/portfolio", async ({ request }) => { - if (!new URL(request.url).searchParams.has("sync")) await blocked; + if (!new URL(request.url).searchParams.has("sync")) { + isStarted = true; + await blocked; + + return HttpResponse.json(resource({ ...snapshot, isStale: true })); + } return HttpResponse.json(resource(snapshot)); }, ), ); - const old = apiClient.GET( - "/api/v1/brokerage-accounts/{accountId}/portfolio", - { params: { path: { accountId: "a" } } }, - ); - - // eslint-disable-next-line vitest/valid-expect -- Attach rejection handling before releasing the request; the assertion is awaited below. - const rejected = expect(old).rejects.toMatchObject({ name: "AbortError" }); - await apiClient.GET("/api/v1/brokerage-accounts/{accountId}/portfolio", { - params: { path: { accountId: "a" }, query: { sync: "observe" } }, + const { result } = renderHook(() => usePrivateResource("a"), { + wrapper: createQueryWrapper().wrapper, }); - release(); - await rejected; + + await waitFor(() => expect(isStarted).toBe(true)); + await act(() => result.current.observe()); + await act(async () => { + release(); + await blocked; + }); + expect(result.current.data).toEqual(snapshot); }); it("clears private snapshots on confirmed access loss and fences another pending success", async () => { auth(); diff --git a/src/shared/api/resource-query.ts b/src/shared/api/resource-query.ts index 6a84724..0b663ef 100644 --- a/src/shared/api/resource-query.ts +++ b/src/shared/api/resource-query.ts @@ -3,7 +3,6 @@ import { type QueryFunctionContext, useQueryClient, type UseQueryOptions, - type UseQueryResult, } from "@tanstack/react-query"; import { useEffect } from "react"; @@ -13,8 +12,6 @@ import { useAuthenticatedQuery } from "./authenticated-query"; import { getAuthenticatedSessionSnapshot } from "./client"; import { ApiErrorCode, apiErrorCode, isApiErrorCode } from "./problem-details"; -const accessEpochs = new WeakMap>(); - type InvestmentResourceMeta = components["schemas"]["InvestmentResourceMetaDto"]; type Resource = { @@ -50,9 +47,6 @@ function invalidateResourceAccess( ].every(code => !isApiErrorCode(errorCode, code)) ) return; - const epochs = accessEpochs.get(client) ?? new Map(); - accessEpochs.set(client, epochs); - epochs.set(group, (epochs.get(group) ?? 0) + 1); const affected = { predicate: (cached: { meta?: Record }) => @@ -81,33 +75,6 @@ function observationKey(key: K): K { }] as unknown as K; } -function unwrapResourceResult( - result: UseQueryResult, -) { - const isMissing = result.isSuccess && result.data.data === null; - const data: T["data"] | undefined = result.data?.data; - const meta: T["meta"] | undefined = result.data?.meta; - - const status: UseQueryResult["status"] = isMissing - ? "pending" - : result.status; - - // Project resource fields; refetch still returns the transport envelope. - return { - ...result, - data: data ?? undefined, - isPending: result.isPending || isMissing, - isSuccess: result.isSuccess && !isMissing, - meta, - status, - transport: { - error: result.error, - fetchStatus: result.fetchStatus, - status: result.status, - }, - }; -} - // Observation changes transport mode, never the generated cache identity. function useResourceQuery( options: UseQueryOptions, @@ -119,35 +86,13 @@ function useResourceQuery( ? options.meta.accessGroup : undefined; - let epochs = accessEpochs.get(client); - - if (!epochs) { - epochs = new Map(); - accessEpochs.set(client, epochs); - } - - const groupEpochs = epochs; - const queryFunction = options.queryFn; - - const guarded - = typeof queryFunction === "function" - ? async (context: QueryFunctionContext) => { - const epoch = group ? (groupEpochs.get(group) ?? 0) : 0; - const result = await queryFunction(context); - if (group && epoch !== (groupEpochs.get(group) ?? 0)) - throw new DOMException("Access changed", "AbortError"); - - return result; - } - : queryFunction; - - const query = useAuthenticatedQuery({ ...options, queryFn: guarded }); + const query = useAuthenticatedQuery(options); useEffect(() => { if (group) invalidateResourceAccess(client, group, query.error); }, [client, group, query.error]); - const observe = async (expectedStateVersion?: string) => { - const queryFunction = guarded; + const observe = async () => { + const queryFunction = options.queryFn; if ( typeof queryFunction !== "function" || !query.isEnabled @@ -162,33 +107,34 @@ function useResourceQuery( queryFn: async (context: QueryFunctionContext) => { const queryKey = observationKey(context.queryKey); - const response = await queryFunction({ ...context, queryKey }); - - if ( - expectedStateVersion - && response.meta.stateVersion !== expectedStateVersion - ) { - // One more observational read; never turn a stale notification into an import. - const current = await queryFunction({ ...context, queryKey }); - if (current.meta.stateVersion !== expectedStateVersion) - throw new DOMException("Resource changed", "AbortError"); - - return current; - } - - return response; + return queryFunction({ ...context, queryKey }); }, retry: false, - // Observation validates raw resource metadata, before any observer projection. + // Keep the cache envelope independent of observer projection. select: undefined, staleTime: 0, }); }; + const data: T["data"] | undefined = query.data?.data; + const meta: T["meta"] | undefined = query.data?.meta; + + // Project resource fields; refetch still returns the transport envelope. return { - ...unwrapResourceResult(query), + data: data ?? undefined, + error: query.error, + fetchStatus: query.fetchStatus, + isEnabled: query.isEnabled, + isError: query.isError, + isFetching: query.isFetching, + isLoading: query.isLoading, + isPending: query.isPending, + isSuccess: query.isSuccess, + meta, observe, queryKey: options.queryKey, + refetch: query.refetch, + status: query.status, }; } diff --git a/src/shared/api/spec/openapi.json b/src/shared/api/spec/openapi.json index 370fa4e..21e7694 100644 --- a/src/shared/api/spec/openapi.json +++ b/src/shared/api/spec/openapi.json @@ -5947,7 +5947,6 @@ "type": "string", "enum": [ "idle", - "queued", "running", "failed" ] @@ -5969,9 +5968,6 @@ "dataRevision": { "type": "string" }, - "stateVersion": { - "type": "string" - }, "unavailableReason": { "type": "string" }, @@ -6008,7 +6004,6 @@ }, "required": [ "dataRevision", - "stateVersion", "resourceKey", "availability", "freshness", @@ -6022,9 +6017,6 @@ "dataRevision": { "type": "string" }, - "stateVersion": { - "type": "string" - }, "unavailableReason": { "type": "string" }, @@ -6067,7 +6059,6 @@ }, "required": [ "dataRevision", - "stateVersion", "resourceKey", "availability", "freshness", @@ -6912,9 +6903,6 @@ "dataRevision": { "type": "string" }, - "stateVersion": { - "type": "string" - }, "unavailableReason": { "type": "string" }, @@ -6959,7 +6947,6 @@ }, "required": [ "dataRevision", - "stateVersion", "resourceKey", "availability", "freshness", @@ -6974,9 +6961,6 @@ "dataRevision": { "type": "string" }, - "stateVersion": { - "type": "string" - }, "unavailableReason": { "type": "string" }, @@ -7020,7 +7004,6 @@ }, "required": [ "dataRevision", - "stateVersion", "resourceKey", "availability", "freshness", @@ -9017,25 +9000,6 @@ "now" ] }, - "TbankSyncProgressDto": { - "type": "object", - "properties": { - "completed": { - "type": "number" - }, - "total": { - "type": "number" - }, - "discovering": { - "type": "boolean" - } - }, - "required": [ - "completed", - "total", - "discovering" - ] - }, "TbankSyncStatusDto": { "type": "object", "properties": { @@ -9087,15 +9051,6 @@ "errorCode": { "type": "string", "nullable": true - }, - "progress": { - "$ref": "#/components/schemas/TbankSyncProgressDto" - }, - "resources": { - "type": "array", - "items": { - "$ref": "#/components/schemas/InvestmentResourceMetaDto" - } } }, "required": [ @@ -9103,9 +9058,7 @@ "scope", "now", "state", - "errorCode", - "progress", - "resources" + "errorCode" ] } } diff --git a/src/test/resource.ts b/src/test/resource.ts index f6d7204..c78ce20 100644 --- a/src/test/resource.ts +++ b/src/test/resource.ts @@ -12,7 +12,6 @@ function resource(data: T, meta: Partial = {}) { freshness: "fresh", lastSuccessfulAt: "2026-08-14T00:00:00Z", resourceKey: "fixture", - stateVersion: "1", sync: { errorCode: null, id: null, state: "idle" }, ...meta, } satisfies Meta, -- 2.54.0 From c096fc70ef442474c9b7766fdf5772b645166b92 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Sat, 3 Oct 2026 22:09:33 +0300 Subject: [PATCH 2/7] fix(deps): remove npm dependency on Nexus Nexus hosts release Docker images, not npm dependencies. Omit registry URLs using npm's native lockfile option. Versions and integrity hashes remain unchanged. --- package-lock.json | 1283 --------------------------------------------- 1 file changed, 1283 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5901fb8..686ebdc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -94,14 +94,12 @@ }, "node_modules/@adobe/css-tools": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz", "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==", "dev": true, "license": "MIT" }, "node_modules/@apideck/better-ajv-errors": { "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.7.tgz", "integrity": "sha512-TajUJwGWbDwkCx/CZi7tRE8PVB7simCvKJfHUsSdvps+aTM/PDPP4gkLmKnc+x3CE//y9i/nj74GqdL/hwk7Iw==", "dev": true, "license": "MIT", @@ -118,7 +116,6 @@ }, "node_modules/@asamuzakjp/css-color": { "version": "6.0.7", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-6.0.7.tgz", "integrity": "sha512-vC/bk1Lz7Tn/EfU9/apOTBk80/8dyGyWMowPoV1tJ52muDGsDqt2HPT2klrFUiY60MQmQv9q8yIht15JnBgDGw==", "dev": true, "license": "MIT", @@ -135,7 +132,6 @@ }, "node_modules/@asamuzakjp/dom-selector": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-8.3.2.tgz", "integrity": "sha512-93Z1N+BQNXysodoicpOIyNh2drHfz/CTf9nnT0FEx72GJcIiwgydD7tGAr78j41LsYn3hlRn+LdGPuBLn1Bl8Q==", "dev": true, "license": "MIT", @@ -151,7 +147,6 @@ }, "node_modules/@babel/code-frame": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", @@ -166,7 +161,6 @@ }, "node_modules/@babel/compat-data": { "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-8.0.5.tgz", "integrity": "sha512-YLsYoQMvL8l8WrGpN3Zj7O1wK5LEBN+cQtux7BcuHyxIXve724XG+zuJ1n3U1cUweRtTzQOA4IHbuQw3N34SZw==", "dev": true, "license": "MIT", @@ -176,7 +170,6 @@ }, "node_modules/@babel/core": { "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-8.0.5.tgz", "integrity": "sha512-2/oWkgTbBYoqioCWAE4XJobOrzwxTDa5/XjDP3tJ1BhDr/owcd9qnXBp4xc3/2G5X4bvXM04nrxbRJxFcXAxFQ==", "dev": true, "license": "MIT", @@ -208,7 +201,6 @@ }, "node_modules/@babel/core/node_modules/@babel/code-frame": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", "dev": true, "license": "MIT", @@ -222,7 +214,6 @@ }, "node_modules/@babel/core/node_modules/@babel/generator": { "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.5.tgz", "integrity": "sha512-f/TuhuMAxJqhwxEGNsJrswuG9VHmh0oNFoQoo6TbpgtFAz9wYZXcTAcWZMHfp7ljesr0RG04bp3Aos9GI59L7w==", "dev": true, "license": "MIT", @@ -240,7 +231,6 @@ }, "node_modules/@babel/core/node_modules/@babel/helper-globals": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0.tgz", "integrity": "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==", "dev": true, "license": "MIT", @@ -250,7 +240,6 @@ }, "node_modules/@babel/core/node_modules/@babel/helper-string-parser": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", "dev": true, "license": "MIT", @@ -260,7 +249,6 @@ }, "node_modules/@babel/core/node_modules/@babel/helper-validator-identifier": { "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.4.tgz", "integrity": "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==", "dev": true, "license": "MIT", @@ -270,7 +258,6 @@ }, "node_modules/@babel/core/node_modules/@babel/parser": { "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.5.tgz", "integrity": "sha512-51RXvQNFakaS0bTpYiGkxNbUVwkPO4kONv6EVLorZABxsx+KZ6Z7uSYvi/wmKS/+X+rfj9RvOw0/ZNh+cmI0Rw==", "dev": true, "license": "MIT", @@ -286,7 +273,6 @@ }, "node_modules/@babel/core/node_modules/@babel/template": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0.tgz", "integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==", "dev": true, "license": "MIT", @@ -301,7 +287,6 @@ }, "node_modules/@babel/core/node_modules/@babel/traverse": { "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.5.tgz", "integrity": "sha512-XFfnuvapSc/vJOcUO7kwORSvpBIvraofKEZ2dhT0PjiF21BRCD7YbAFC8UEeDJNeLoQz82/gVqzgX5hCzkCbdg==", "dev": true, "license": "MIT", @@ -320,7 +305,6 @@ }, "node_modules/@babel/core/node_modules/@babel/types": { "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.5.tgz", "integrity": "sha512-eVdMqi3ej5aHhyQ2Si6yD2cAWeV8FJK9UrhK5aL0Sd8hu5GhT+YswhVNbVheOGVYMg8kuGuMaUpkB3stjj4z8A==", "dev": true, "license": "MIT", @@ -334,7 +318,6 @@ }, "node_modules/@babel/core/node_modules/@jridgewell/gen-mapping": { "version": "0.4.0-beta.0", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.4.0-beta.0.tgz", "integrity": "sha512-JdGNkbE4GlNPYQhM0L95fBQr7ctLZJ276QXQLTad4t1oSdnnCI3fDq9DW3BqYAWv8Wc3+HS+4Gsii1oPMCfz1w==", "dev": true, "license": "MIT", @@ -345,14 +328,12 @@ }, "node_modules/@babel/core/node_modules/js-tokens": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", "dev": true, "license": "MIT" }, "node_modules/@babel/generator": { "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, "license": "MIT", @@ -369,7 +350,6 @@ }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", "dev": true, "license": "MIT", @@ -382,7 +362,6 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-8.0.5.tgz", "integrity": "sha512-Qk8ahMGooH5mz6uuhoDvfZGkUf/Mf3RTBucVVl4MKx4LKMTv872TeW8O92h15iVtlN8wAROBIpI1aV6x1z0LCQ==", "dev": true, "license": "MIT", @@ -399,7 +378,6 @@ }, "node_modules/@babel/helper-globals": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", @@ -409,7 +387,6 @@ }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", "dev": true, "license": "MIT", @@ -423,7 +400,6 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", @@ -437,7 +413,6 @@ }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", "dev": true, "license": "MIT", @@ -450,7 +425,6 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", "dev": true, "license": "MIT", @@ -460,7 +434,6 @@ }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", "dev": true, "license": "MIT", @@ -474,7 +447,6 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", @@ -484,7 +456,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", @@ -494,7 +465,6 @@ }, "node_modules/@babel/helper-validator-option": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-8.0.0.tgz", "integrity": "sha512-U4Dybxh4WESWHt5XhBeExi4DrY0/DNK1aHpQbsrQXCUbFHuMweT0TpLEWKvaraV2Y6fS+ZXunsZ8zIuZIgvF2Q==", "dev": true, "license": "MIT", @@ -504,7 +474,6 @@ }, "node_modules/@babel/helper-wrap-function": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz", "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==", "dev": true, "license": "MIT", @@ -519,7 +488,6 @@ }, "node_modules/@babel/helpers": { "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-8.0.5.tgz", "integrity": "sha512-fQtPOXjYOYv85PIdwotp2TJGVYOycX0PQq+l844fFAxOULtBy8BVF35GyeueX0r4KvDthqPH5xAI1clQPk/2uA==", "dev": true, "license": "MIT", @@ -533,7 +501,6 @@ }, "node_modules/@babel/helpers/node_modules/@babel/code-frame": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", "dev": true, "license": "MIT", @@ -547,7 +514,6 @@ }, "node_modules/@babel/helpers/node_modules/@babel/helper-string-parser": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", "dev": true, "license": "MIT", @@ -557,7 +523,6 @@ }, "node_modules/@babel/helpers/node_modules/@babel/helper-validator-identifier": { "version": "8.0.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.4.tgz", "integrity": "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==", "dev": true, "license": "MIT", @@ -567,7 +532,6 @@ }, "node_modules/@babel/helpers/node_modules/@babel/parser": { "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.5.tgz", "integrity": "sha512-51RXvQNFakaS0bTpYiGkxNbUVwkPO4kONv6EVLorZABxsx+KZ6Z7uSYvi/wmKS/+X+rfj9RvOw0/ZNh+cmI0Rw==", "dev": true, "license": "MIT", @@ -583,7 +547,6 @@ }, "node_modules/@babel/helpers/node_modules/@babel/template": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0.tgz", "integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==", "dev": true, "license": "MIT", @@ -598,7 +561,6 @@ }, "node_modules/@babel/helpers/node_modules/@babel/types": { "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.5.tgz", "integrity": "sha512-eVdMqi3ej5aHhyQ2Si6yD2cAWeV8FJK9UrhK5aL0Sd8hu5GhT+YswhVNbVheOGVYMg8kuGuMaUpkB3stjj4z8A==", "dev": true, "license": "MIT", @@ -612,14 +574,12 @@ }, "node_modules/@babel/helpers/node_modules/js-tokens": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", "dev": true, "license": "MIT" }, "node_modules/@babel/parser": { "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", @@ -635,7 +595,6 @@ }, "node_modules/@babel/runtime": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "license": "MIT", "engines": { @@ -644,7 +603,6 @@ }, "node_modules/@babel/template": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", @@ -659,7 +617,6 @@ }, "node_modules/@babel/traverse": { "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", @@ -678,7 +635,6 @@ }, "node_modules/@babel/types": { "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", @@ -692,7 +648,6 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", "dev": true, "license": "MIT", @@ -702,14 +657,12 @@ }, "node_modules/@blazediff/core": { "version": "1.10.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@blazediff/core/-/core-1.10.0.tgz", "integrity": "sha512-AOQff0zgR7cGsZL+4E7hVkmujoPUpm0J9xzWGWZj5wCjd3gmxESXAPfKyuzs93VdpQNFhHlBhfOjrcZ+XTERtQ==", "dev": true, "license": "MIT" }, "node_modules/@bramus/specificity": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", "dev": true, "license": "MIT", @@ -722,7 +675,6 @@ }, "node_modules/@cacheable/memory": { "version": "2.2.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@cacheable/memory/-/memory-2.2.0.tgz", "integrity": "sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==", "dev": true, "license": "MIT", @@ -735,7 +687,6 @@ }, "node_modules/@cacheable/utils": { "version": "2.5.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@cacheable/utils/-/utils-2.5.0.tgz", "integrity": "sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==", "dev": true, "license": "MIT", @@ -746,7 +697,6 @@ }, "node_modules/@commitlint/cli": { "version": "21.2.2", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-21.2.2.tgz", "integrity": "sha512-a+6hQxIxnpdvSvS2apvttPNbEliYsVC3PqFYDiiB2kjbwIsQsj1urvQ4Tkf70pKYozPalKAuRQmm/GHwndduqA==", "dev": true, "license": "MIT", @@ -769,7 +719,6 @@ }, "node_modules/@commitlint/config-conventional": { "version": "21.2.2", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-21.2.2.tgz", "integrity": "sha512-NxA37SZviusFUEYOQZ5hNnZ1h7O/KiemPkxjOlpzKJNnWxThiwc6/SaZhaPa8fyLvfRBAywhQhJJk8XESHWlpQ==", "dev": true, "license": "MIT", @@ -783,7 +732,6 @@ }, "node_modules/@commitlint/config-validator": { "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-21.2.0.tgz", "integrity": "sha512-t7AzNHAKeIdo/3NRGwzpufKHsKkPHmFs/56N2Fnsh0/r0rGtnQzTxk6vnFgjaGr4hdSQKNB50/KAhR9Yk4LJKA==", "dev": true, "license": "MIT", @@ -797,7 +745,6 @@ }, "node_modules/@commitlint/ensure": { "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-21.2.0.tgz", "integrity": "sha512-76IF9vDNS13lAzEEik9eKwzt8f9hYhWiwVXZ2AnyLCz5/f511FsEQ3pw1X3/zSQpdRLQU7i5qDMVKyXi1GWjSg==", "dev": true, "license": "MIT", @@ -811,7 +758,6 @@ }, "node_modules/@commitlint/execute-rule": { "version": "21.0.1", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-21.0.1.tgz", "integrity": "sha512-RifH+FmImozKBE6mozhF4K3r2RRKP7SMi/Q/zLCmExtp5e05lhHOUYqGBlFBAGNHaZxU/WYw1XuugYK9jQzqnA==", "dev": true, "license": "MIT", @@ -821,7 +767,6 @@ }, "node_modules/@commitlint/format": { "version": "21.2.2", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-21.2.2.tgz", "integrity": "sha512-v6fvxZSc/AvVMROlr3H34+1766bZSYApRUSCAMjWamStPjKMvZ8GdvVA5YW/VQNgbFTmcMz6OYmSTJEvIjPrfA==", "dev": true, "license": "MIT", @@ -835,7 +780,6 @@ }, "node_modules/@commitlint/is-ignored": { "version": "21.2.2", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-21.2.2.tgz", "integrity": "sha512-9UoKNgfFE3LU7FrzierCvk3CdDfMDeVGC86qZiT/n0TIjfq/dmZ9MHuXd45OTNRa26ZanmJRxEtmiXk/lEJihg==", "dev": true, "license": "MIT", @@ -849,7 +793,6 @@ }, "node_modules/@commitlint/is-ignored/node_modules/semver": { "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", @@ -862,7 +805,6 @@ }, "node_modules/@commitlint/lint": { "version": "21.2.2", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-21.2.2.tgz", "integrity": "sha512-Fy8JxEBzdmsYWFude/61GxXu5O+wEymwiRK2z9GL9R8mCsXphCoGxAFc5iHn5mjlfcSrhiiONE+ksf4KOjnaPg==", "dev": true, "license": "MIT", @@ -878,7 +820,6 @@ }, "node_modules/@commitlint/load": { "version": "21.2.2", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-21.2.2.tgz", "integrity": "sha512-0Tt6wDPX167cjKC5D4zhm0+20wJJG+TN/TKovMOspfSe78rOnKX+MNzlVNiu6HyQPZChPJ8QBH31MVt6Bb8fCg==", "dev": true, "license": "MIT", @@ -899,7 +840,6 @@ }, "node_modules/@commitlint/message": { "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-21.2.0.tgz", "integrity": "sha512-YxGoiXD/HXNXLJPrQwE5poXa+XH0CBEm+mdvbHQP0g6MV/dmJyUFCzPNzZbxL93GvZ70TmtTK0Z0/IBpAqHv8g==", "dev": true, "license": "MIT", @@ -909,7 +849,6 @@ }, "node_modules/@commitlint/parse": { "version": "21.2.2", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-21.2.2.tgz", "integrity": "sha512-MEkobPfvRp+z06Wro8HMG1BDGHzZmj82A1LH1nWeG3ipHpg/x4m6v3wEDvMBIKjRFUnfR3nBeFs3MVCr7UdAmg==", "dev": true, "license": "MIT", @@ -924,7 +863,6 @@ }, "node_modules/@commitlint/read": { "version": "21.2.1", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-21.2.1.tgz", "integrity": "sha512-hUW7EJQnNTL0vPOmVMNK4CrnrNBN0nN+JJHReFkdHO5y4iyHeEmTBwuC15OCqUTjxWo7idnH1LftfpWVIaPWIA==", "dev": true, "license": "MIT", @@ -940,7 +878,6 @@ }, "node_modules/@commitlint/resolve-extends": { "version": "21.2.2", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-21.2.2.tgz", "integrity": "sha512-RPkJ/IFi7sMUUVbZLqwWFtWw/zRDcfFsmrPSiTMrt5wb7AdxOr86EGQFvmGzef5QKV5IPBWWCujqVTw1RWX44A==", "dev": true, "license": "MIT", @@ -957,7 +894,6 @@ }, "node_modules/@commitlint/rules": { "version": "21.2.2", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-21.2.2.tgz", "integrity": "sha512-eplQzyYkBjYB1HyyRj8hkcK11Y9DU9nuBz7uOKEd6NpE9NGDytLFCAnlRE+OoiK/5sHEJsaz2RGhuWBvYzIbNA==", "dev": true, "license": "MIT", @@ -973,7 +909,6 @@ }, "node_modules/@commitlint/to-lines": { "version": "21.0.1", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-21.0.1.tgz", "integrity": "sha512-bd1BFII7p1EQZre9Kaj+kKaMFP3cFCdt21K7DItVux9XP5WjLgJ0/Uy1pJJh9aPwVJ6SKg62PxqlZaHI8hQAXw==", "dev": true, "license": "MIT", @@ -983,7 +918,6 @@ }, "node_modules/@commitlint/top-level": { "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-21.2.0.tgz", "integrity": "sha512-Y5gmQ+KxzqCrBFJfLvFEPvvwD3LDiNZoTT2yeFBm96M8qhmqSzQc5DvX3rheAaAMjyIvMXOCLS/mWfdpONsjyQ==", "dev": true, "license": "MIT", @@ -996,7 +930,6 @@ }, "node_modules/@commitlint/types": { "version": "21.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-21.2.0.tgz", "integrity": "sha512-7zVFCDB2reMvJH5dmbKnOQPjZEvjdJTH8jc0U/PIPU1r3/+vf5pD1HlfitV2MWsWXrvu7u39iY1lyLUPOaN0Gw==", "dev": true, "license": "MIT", @@ -1010,7 +943,6 @@ }, "node_modules/@conventional-changelog/git-client": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-3.1.2.tgz", "integrity": "sha512-jZqwnJwf7nboIlAcw/mkOjVa6DexCcUOgT2oOQgkoi3z9vR8tGFkcMy2BFcYwjhL9sYcDDXkRQDayiDieCoW7A==", "dev": true, "license": "MIT", @@ -1037,7 +969,6 @@ }, "node_modules/@conventional-changelog/git-client/node_modules/semver": { "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", @@ -1050,7 +981,6 @@ }, "node_modules/@conventional-changelog/template": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@conventional-changelog/template/-/template-1.4.0.tgz", "integrity": "sha512-aalGyl7dbB5PArRebDIX43ZvBlXrYm9uWzGJ26t+4SzJVPsOuvfILGGbw5X4yX7i50YEmJ8zvbiWnqH/AAnZqg==", "dev": true, "license": "MIT", @@ -1060,7 +990,6 @@ }, "node_modules/@csstools/color-helpers": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.1.tgz", "integrity": "sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==", "dev": true, "funding": [ @@ -1080,7 +1009,6 @@ }, "node_modules/@csstools/css-calc": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.4.0.tgz", "integrity": "sha512-XQKj5B7QiZcHiegCOCAzcAOJdhGgWOHbbu62h5e5mkHnn8lWcfiJhllkqWmxu5zWR9jucPHuo1iTB56P033hcg==", "dev": true, "funding": [ @@ -1104,7 +1032,6 @@ }, "node_modules/@csstools/css-color-parser": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.2.3.tgz", "integrity": "sha512-y4LpL+lmpuyKDiEFq2PnZUVFdAjsoB/qQJod79yLNokXyW7jewi+/WJ69EfItj8A2unWtxXnGjw6LYXgXu5ZjA==", "dev": true, "funding": [ @@ -1132,7 +1059,6 @@ }, "node_modules/@csstools/css-parser-algorithms": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", "dev": true, "funding": [ @@ -1155,7 +1081,6 @@ }, "node_modules/@csstools/css-syntax-patches-for-csstree": { "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.13.tgz", "integrity": "sha512-i9ZylF5QNhmNfPA9l0vHAWK4kPrbIp6g9lKgaiIFsIBz2F/WNB7OLrzlNNcCOm+h42bkaSD2v1PG+IBPHhc3ZA==", "dev": true, "funding": [ @@ -1180,7 +1105,6 @@ }, "node_modules/@csstools/css-tokenizer": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", "dev": true, "funding": [ @@ -1200,7 +1124,6 @@ }, "node_modules/@emnapi/core": { "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz", "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==", "dev": true, "license": "MIT", @@ -1212,7 +1135,6 @@ }, "node_modules/@emnapi/runtime": { "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", "dev": true, "license": "MIT", @@ -1223,7 +1145,6 @@ }, "node_modules/@emnapi/wasi-threads": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", "dev": true, "license": "MIT", @@ -1234,7 +1155,6 @@ }, "node_modules/@esbuild/aix-ppc64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", "cpu": [ "ppc64" @@ -1251,7 +1171,6 @@ }, "node_modules/@esbuild/android-arm": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", "cpu": [ "arm" @@ -1268,7 +1187,6 @@ }, "node_modules/@esbuild/android-arm64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", "cpu": [ "arm64" @@ -1285,7 +1203,6 @@ }, "node_modules/@esbuild/android-x64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", "cpu": [ "x64" @@ -1302,7 +1219,6 @@ }, "node_modules/@esbuild/darwin-arm64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", "cpu": [ "arm64" @@ -1319,7 +1235,6 @@ }, "node_modules/@esbuild/darwin-x64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", "cpu": [ "x64" @@ -1336,7 +1251,6 @@ }, "node_modules/@esbuild/freebsd-arm64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", "cpu": [ "arm64" @@ -1353,7 +1267,6 @@ }, "node_modules/@esbuild/freebsd-x64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", "cpu": [ "x64" @@ -1370,7 +1283,6 @@ }, "node_modules/@esbuild/linux-arm": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", "cpu": [ "arm" @@ -1387,7 +1299,6 @@ }, "node_modules/@esbuild/linux-arm64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", "cpu": [ "arm64" @@ -1404,7 +1315,6 @@ }, "node_modules/@esbuild/linux-ia32": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", "cpu": [ "ia32" @@ -1421,7 +1331,6 @@ }, "node_modules/@esbuild/linux-loong64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", "cpu": [ "loong64" @@ -1438,7 +1347,6 @@ }, "node_modules/@esbuild/linux-mips64el": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", "cpu": [ "mips64el" @@ -1455,7 +1363,6 @@ }, "node_modules/@esbuild/linux-ppc64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", "cpu": [ "ppc64" @@ -1472,7 +1379,6 @@ }, "node_modules/@esbuild/linux-riscv64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", "cpu": [ "riscv64" @@ -1489,7 +1395,6 @@ }, "node_modules/@esbuild/linux-s390x": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", "cpu": [ "s390x" @@ -1506,7 +1411,6 @@ }, "node_modules/@esbuild/linux-x64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", "cpu": [ "x64" @@ -1523,7 +1427,6 @@ }, "node_modules/@esbuild/netbsd-arm64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", "cpu": [ "arm64" @@ -1540,7 +1443,6 @@ }, "node_modules/@esbuild/netbsd-x64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", "cpu": [ "x64" @@ -1557,7 +1459,6 @@ }, "node_modules/@esbuild/openbsd-arm64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", "cpu": [ "arm64" @@ -1574,7 +1475,6 @@ }, "node_modules/@esbuild/openbsd-x64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", "cpu": [ "x64" @@ -1591,7 +1491,6 @@ }, "node_modules/@esbuild/openharmony-arm64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", "cpu": [ "arm64" @@ -1608,7 +1507,6 @@ }, "node_modules/@esbuild/sunos-x64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", "cpu": [ "x64" @@ -1625,7 +1523,6 @@ }, "node_modules/@esbuild/win32-arm64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", "cpu": [ "arm64" @@ -1642,7 +1539,6 @@ }, "node_modules/@esbuild/win32-ia32": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", "cpu": [ "ia32" @@ -1659,7 +1555,6 @@ }, "node_modules/@esbuild/win32-x64": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", "cpu": [ "x64" @@ -1676,7 +1571,6 @@ }, "node_modules/@eslint-community/eslint-utils": { "version": "4.10.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", "dev": true, "license": "MIT", @@ -1695,7 +1589,6 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", @@ -1705,7 +1598,6 @@ }, "node_modules/@eslint-react/ast": { "version": "5.21.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@eslint-react/ast/-/ast-5.21.0.tgz", "integrity": "sha512-9x+lQGJaVD7u6NIK6dx1/xZ0mJBcFlSVC9e9AVu4NOvZErFzVSK1tEP38iBFkP14bcqrLp7jbokze5FOC4gQGg==", "dev": true, "license": "MIT", @@ -1730,7 +1622,6 @@ }, "node_modules/@eslint-react/core": { "version": "5.21.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@eslint-react/core/-/core-5.21.0.tgz", "integrity": "sha512-PAuhwpWxFyFa6YPX771ttuo0W4Ggw/BannJ+4XJmPr0MV1a9s6tBiddMH5qWeWiuuQTT/5fmKzRWGcIMyr6iPg==", "dev": true, "license": "MIT", @@ -1759,7 +1650,6 @@ }, "node_modules/@eslint-react/eslint": { "version": "5.21.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@eslint-react/eslint/-/eslint-5.21.0.tgz", "integrity": "sha512-OdRp+P4s+d8CRd9rvv+5Ondp050imriYz4HH0qUM7REJpVl5NQewdwgYzQSlkJD6i+drmygt4gBh3hpwMPnBzA==", "dev": true, "license": "MIT", @@ -1782,7 +1672,6 @@ }, "node_modules/@eslint-react/eslint-plugin": { "version": "5.21.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@eslint-react/eslint-plugin/-/eslint-plugin-5.21.0.tgz", "integrity": "sha512-H4mlT5BiDu62Ya6QNMWxMka6Hz20SbWeeXhgxvW/sV2KInQv1UU5xvIMh3fWuBMKp8hWMheS5YGL/QmI3v7lGQ==", "dev": true, "license": "MIT", @@ -1810,7 +1699,6 @@ }, "node_modules/@eslint-react/jsx": { "version": "5.21.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@eslint-react/jsx/-/jsx-5.21.0.tgz", "integrity": "sha512-/dyHSVYm46aWt4ABZoZXuiXsU622UsONOHIHLodM8hZkgoL/IJC70LHn9ZYk8Dnj2bzWwAbktKrmNDoZDgkvbQ==", "dev": true, "license": "MIT", @@ -1838,7 +1726,6 @@ }, "node_modules/@eslint-react/shared": { "version": "5.21.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@eslint-react/shared/-/shared-5.21.0.tgz", "integrity": "sha512-IIeMqRpbPMcUGhsMaXqlRfELfNLTAmywC671kag/soW580s+8LKU4DkTIULoorD+XxPenXlB1t0SE3fze23whw==", "dev": true, "license": "MIT", @@ -1863,7 +1750,6 @@ }, "node_modules/@eslint-react/var": { "version": "5.21.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@eslint-react/var/-/var-5.21.0.tgz", "integrity": "sha512-segy1jD22R5mOP2GEmnwIDh0vdooJtTtsB+bWu3SC2LB6iLtASvDmIGUA7V0r6uz/YF8vyLf7iKTfv2liiMOBg==", "dev": true, "license": "MIT", @@ -1890,7 +1776,6 @@ }, "node_modules/@eslint/config-array": { "version": "0.23.5", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@eslint/config-array/-/config-array-0.23.5.tgz", "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", "dev": true, "license": "Apache-2.0", @@ -1905,7 +1790,6 @@ }, "node_modules/@eslint/config-helpers": { "version": "0.7.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", "dev": true, "license": "Apache-2.0", @@ -1918,7 +1802,6 @@ }, "node_modules/@eslint/core": { "version": "1.2.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@eslint/core/-/core-1.2.1.tgz", "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", "dev": true, "license": "Apache-2.0", @@ -1931,7 +1814,6 @@ }, "node_modules/@eslint/css-tree": { "version": "4.1.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@eslint/css-tree/-/css-tree-4.1.1.tgz", "integrity": "sha512-A+s89eP+yDAPkKjnIOfjlkGifg5J7GPn01nWx14UjBVWktfkxOU4975F9ZZ13xNxkGiblNcBaAqgKhnQrW6SWA==", "dev": true, "license": "MIT", @@ -1945,14 +1827,12 @@ }, "node_modules/@eslint/css-tree/node_modules/mdn-data": { "version": "2.35.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/mdn-data/-/mdn-data-2.35.0.tgz", "integrity": "sha512-k+1+dEIm2z/BEfdvYzT/fIyAGeDBo/1AJNJI4ilFXJRYoxP/3Ds+GP8shAOIq8jYXY9N5nGB3Ag104NsagmLAA==", "dev": true, "license": "CC0-1.0" }, "node_modules/@eslint/js": { "version": "10.0.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@eslint/js/-/js-10.0.1.tgz", "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", "dev": true, "license": "MIT", @@ -1973,7 +1853,6 @@ }, "node_modules/@eslint/object-schema": { "version": "3.0.5", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@eslint/object-schema/-/object-schema-3.0.5.tgz", "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", "dev": true, "license": "Apache-2.0", @@ -1983,7 +1862,6 @@ }, "node_modules/@eslint/plugin-kit": { "version": "0.7.3", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@eslint/plugin-kit/-/plugin-kit-0.7.3.tgz", "integrity": "sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==", "dev": true, "license": "Apache-2.0", @@ -1997,7 +1875,6 @@ }, "node_modules/@exodus/bytes": { "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", "dev": true, "license": "MIT", @@ -2015,7 +1892,6 @@ }, "node_modules/@floating-ui/core": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", "license": "MIT", "dependencies": { @@ -2024,7 +1900,6 @@ }, "node_modules/@floating-ui/dom": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", "license": "MIT", "dependencies": { @@ -2034,7 +1909,6 @@ }, "node_modules/@floating-ui/react": { "version": "0.27.20", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.20.tgz", "integrity": "sha512-CMqMy7OaXl9W0eq1Uy7L7i2Y/anPvHmFmESd2CEw0t5YvZhcVCeo4MBevAmswRllX7Y2dEidA4ozGPunLSTQpw==", "license": "MIT", "dependencies": { @@ -2049,7 +1923,6 @@ }, "node_modules/@floating-ui/react-dom": { "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", "license": "MIT", "dependencies": { @@ -2062,13 +1935,11 @@ }, "node_modules/@floating-ui/utils": { "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", "license": "MIT" }, "node_modules/@hookform/resolvers": { "version": "5.9.1", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.9.1.tgz", "integrity": "sha512-7b7vsbraJxKgjVSA1Nur9tLwj539WGJUBLA7QNvXnFoT2pM5Z7G+6rlukk4B2/QrTZy6huRtH6wKeESPKuIr6w==", "license": "MIT", "dependencies": { @@ -2178,7 +2049,6 @@ }, "node_modules/@humanfs/core": { "version": "0.19.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@humanfs/core/-/core-0.19.2.tgz", "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, "license": "Apache-2.0", @@ -2191,7 +2061,6 @@ }, "node_modules/@humanfs/node": { "version": "0.16.8", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@humanfs/node/-/node-0.16.8.tgz", "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, "license": "Apache-2.0", @@ -2206,7 +2075,6 @@ }, "node_modules/@humanfs/types": { "version": "0.15.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@humanfs/types/-/types-0.15.0.tgz", "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", "dev": true, "license": "Apache-2.0", @@ -2216,7 +2084,6 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", @@ -2230,7 +2097,6 @@ }, "node_modules/@humanwhocodes/retry": { "version": "0.4.3", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", @@ -2244,7 +2110,6 @@ }, "node_modules/@inquirer/ansi": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.8.tgz", "integrity": "sha512-WpQM+Ti6Z40EFwwt+uL2p4UabT+W179zHp6HhLVOzfbwnVn05IPO/eXIZXGNqcT1jbQ15SujNLzQ39k4QPPxBQ==", "dev": true, "license": "MIT", @@ -2254,7 +2119,6 @@ }, "node_modules/@inquirer/checkbox": { "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.2.5.tgz", "integrity": "sha512-bRt8J8m+Fot9CXv+zNQGXUq2ET0MggR1fPz7v6edN6MFYmsbfGnMmkmWZJEegMKqrAC8ej/o1sqisHZXZJMAfQ==", "dev": true, "license": "MIT", @@ -2278,7 +2142,6 @@ }, "node_modules/@inquirer/checkbox/node_modules/@inquirer/core": { "version": "12.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.3.tgz", "integrity": "sha512-wsSy0sznmXwkty+2PzZwx00Cazc/E0r0B7mAzdGROz2Ct+DFZXaK7WDjGZvgjRldxH5ZhFVfF2lgkYrqgOw2KA==", "dev": true, "license": "MIT", @@ -2305,7 +2168,6 @@ }, "node_modules/@inquirer/confirm": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.1.1.tgz", "integrity": "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==", "dev": true, "license": "MIT", @@ -2327,7 +2189,6 @@ }, "node_modules/@inquirer/core": { "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.2.1.tgz", "integrity": "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==", "dev": true, "license": "MIT", @@ -2354,7 +2215,6 @@ }, "node_modules/@inquirer/editor": { "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-5.3.3.tgz", "integrity": "sha512-YsKkS2q63IiLtaDK/9nqzdComN97SDQrmKiyNggN+ceP4ty+Z6VwyTz3FpjeUWeW1Efss2xHFKCC9sx7hnrsxg==", "dev": true, "license": "MIT", @@ -2377,7 +2237,6 @@ }, "node_modules/@inquirer/editor/node_modules/@inquirer/core": { "version": "12.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.3.tgz", "integrity": "sha512-wsSy0sznmXwkty+2PzZwx00Cazc/E0r0B7mAzdGROz2Ct+DFZXaK7WDjGZvgjRldxH5ZhFVfF2lgkYrqgOw2KA==", "dev": true, "license": "MIT", @@ -2404,7 +2263,6 @@ }, "node_modules/@inquirer/expand": { "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-5.1.5.tgz", "integrity": "sha512-uHuXLmXW+TtIfT/9vSBotypAkqn1n34Ul+CLGPos/xANyO4Ff5xZzkYhbKR4NEcfVK4a9mHQOpwVZzluSHFRGw==", "dev": true, "license": "MIT", @@ -2426,7 +2284,6 @@ }, "node_modules/@inquirer/expand/node_modules/@inquirer/core": { "version": "12.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.3.tgz", "integrity": "sha512-wsSy0sznmXwkty+2PzZwx00Cazc/E0r0B7mAzdGROz2Ct+DFZXaK7WDjGZvgjRldxH5ZhFVfF2lgkYrqgOw2KA==", "dev": true, "license": "MIT", @@ -2453,7 +2310,6 @@ }, "node_modules/@inquirer/external-editor": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-3.0.5.tgz", "integrity": "sha512-f3QQJRIX5ZEneBHNUIuPjmbdzHnmRFJA8r2dkcb8q+OM5Uv5KtnuAttQumnrjcBVBM3mcTX1CkmtAkU58VRZxg==", "dev": true, "license": "MIT", @@ -2475,7 +2331,6 @@ }, "node_modules/@inquirer/figures": { "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.9.tgz", "integrity": "sha512-EAWgUTGQ/Umgga51dE3B2PUHbufuXarDfg86uVgoSgNHNNQnyFKcOrQLWVqYMghuSyHh8+2HUH0Js9cTC1WAdg==", "dev": true, "license": "MIT", @@ -2485,7 +2340,6 @@ }, "node_modules/@inquirer/input": { "version": "5.1.6", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.1.6.tgz", "integrity": "sha512-HtcJhB2QFVXbLuJ5S3syhNbTUVxYvwqV4VRBDkQceBloC9bmTViUoRFP5PbSaDZb3HzfPmpuU/gG4ybVBz4FHA==", "dev": true, "license": "MIT", @@ -2507,7 +2361,6 @@ }, "node_modules/@inquirer/input/node_modules/@inquirer/core": { "version": "12.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.3.tgz", "integrity": "sha512-wsSy0sznmXwkty+2PzZwx00Cazc/E0r0B7mAzdGROz2Ct+DFZXaK7WDjGZvgjRldxH5ZhFVfF2lgkYrqgOw2KA==", "dev": true, "license": "MIT", @@ -2534,7 +2387,6 @@ }, "node_modules/@inquirer/number": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-4.2.3.tgz", "integrity": "sha512-6Yuwh1NGSbu1Lo4N1EWjXs1jKRntLg/ZCwhmeorEHde90v1XxAozdbd4Iu30eOQLW+6h1hp2O9ujNfLSbTPJnA==", "dev": true, "license": "MIT", @@ -2556,7 +2408,6 @@ }, "node_modules/@inquirer/number/node_modules/@inquirer/core": { "version": "12.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.3.tgz", "integrity": "sha512-wsSy0sznmXwkty+2PzZwx00Cazc/E0r0B7mAzdGROz2Ct+DFZXaK7WDjGZvgjRldxH5ZhFVfF2lgkYrqgOw2KA==", "dev": true, "license": "MIT", @@ -2583,7 +2434,6 @@ }, "node_modules/@inquirer/password": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-5.2.2.tgz", "integrity": "sha512-W9zYdyzogK+6110mqwaSJWCBu2yA5Q/OfnGSjjZB1bNpHlmUozXxTl0+QOZBNeVd6Qo81/qT75gW05gLAtITxw==", "dev": true, "license": "MIT", @@ -2606,7 +2456,6 @@ }, "node_modules/@inquirer/password/node_modules/@inquirer/core": { "version": "12.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.3.tgz", "integrity": "sha512-wsSy0sznmXwkty+2PzZwx00Cazc/E0r0B7mAzdGROz2Ct+DFZXaK7WDjGZvgjRldxH5ZhFVfF2lgkYrqgOw2KA==", "dev": true, "license": "MIT", @@ -2633,7 +2482,6 @@ }, "node_modules/@inquirer/prompts": { "version": "8.5.2", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.5.2.tgz", "integrity": "sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g==", "dev": true, "license": "MIT", @@ -2663,7 +2511,6 @@ }, "node_modules/@inquirer/rawlist": { "version": "5.3.5", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.3.5.tgz", "integrity": "sha512-1oHky1ONfCOwNrnkQGDE1oaSij/3fI6HFMSf2H/WsGO2lEyDX9My82iggITSy9ddSZ8yk8j9v41OI0fVoSIoaA==", "dev": true, "license": "MIT", @@ -2685,7 +2532,6 @@ }, "node_modules/@inquirer/rawlist/node_modules/@inquirer/core": { "version": "12.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.3.tgz", "integrity": "sha512-wsSy0sznmXwkty+2PzZwx00Cazc/E0r0B7mAzdGROz2Ct+DFZXaK7WDjGZvgjRldxH5ZhFVfF2lgkYrqgOw2KA==", "dev": true, "license": "MIT", @@ -2712,7 +2558,6 @@ }, "node_modules/@inquirer/search": { "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-4.3.3.tgz", "integrity": "sha512-fyuIU1Nbpvwlikjg3gXwJFDI11+EFjqQ7P+iByfmivIKQ1vmaykNrD/vy5unHuUqUpsOsnvJ25//tPF7E/RBRA==", "dev": true, "license": "MIT", @@ -2735,7 +2580,6 @@ }, "node_modules/@inquirer/search/node_modules/@inquirer/core": { "version": "12.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.3.tgz", "integrity": "sha512-wsSy0sznmXwkty+2PzZwx00Cazc/E0r0B7mAzdGROz2Ct+DFZXaK7WDjGZvgjRldxH5ZhFVfF2lgkYrqgOw2KA==", "dev": true, "license": "MIT", @@ -2762,7 +2606,6 @@ }, "node_modules/@inquirer/select": { "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.2.5.tgz", "integrity": "sha512-9kc15hr8r/kI+3DO/xLog5nOzTz1jqsHXa6JBFzmQKhkoJ8Slda1I1L/uD8ZSZ9tF1yp79wwXe7mclvX1rqR2Q==", "dev": true, "license": "MIT", @@ -2786,7 +2629,6 @@ }, "node_modules/@inquirer/select/node_modules/@inquirer/core": { "version": "12.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.3.tgz", "integrity": "sha512-wsSy0sznmXwkty+2PzZwx00Cazc/E0r0B7mAzdGROz2Ct+DFZXaK7WDjGZvgjRldxH5ZhFVfF2lgkYrqgOw2KA==", "dev": true, "license": "MIT", @@ -2813,7 +2655,6 @@ }, "node_modules/@inquirer/type": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.1.1.tgz", "integrity": "sha512-yJoHYrMnxIsJZCY+0Vb66Dy3he3kL3e2wOBKhoSwWWAzZAY82emlxwgprCtp6yRixvNRNq9ztfRWQYPNr3Go7A==", "dev": true, "license": "MIT", @@ -2831,7 +2672,6 @@ }, "node_modules/@isaacs/cliui": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", "dev": true, "license": "BlueOak-1.0.0", @@ -2841,7 +2681,6 @@ }, "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.7.0.tgz", "integrity": "sha512-qvsTEwEFefhdirGOPnu9Wp6ChfIwy2dBCRuETU3uE+4cC+PFoxMSiiEhxk4lOluA34eARHA0OxqsEUYDqRMgeQ==", "dev": true, "license": "MIT", @@ -2861,7 +2700,6 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", @@ -2872,7 +2710,6 @@ }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, "license": "MIT", @@ -2883,7 +2720,6 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", @@ -2893,7 +2729,6 @@ }, "node_modules/@jridgewell/source-map": { "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, "license": "MIT", @@ -2904,14 +2739,12 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", @@ -2922,7 +2755,6 @@ }, "node_modules/@keyv/bigmap": { "version": "1.3.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@keyv/bigmap/-/bigmap-1.3.1.tgz", "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", "dev": true, "license": "MIT", @@ -2939,14 +2771,12 @@ }, "node_modules/@keyv/serialize": { "version": "1.1.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@keyv/serialize/-/serialize-1.1.1.tgz", "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", "dev": true, "license": "MIT" }, "node_modules/@mantine/charts": { "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@mantine/charts/-/charts-9.6.1.tgz", "integrity": "sha512-fODlRdZuxMM7iPJHHSpOJFxtJWWhKq+iW+eThgkf/j87M1GonEdvPNV9OtJjEoWM+I51ZjZX9rQZ2g5ouoyTdg==", "license": "MIT", "peerDependencies": { @@ -2959,7 +2789,6 @@ }, "node_modules/@mantine/core": { "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@mantine/core/-/core-9.6.1.tgz", "integrity": "sha512-UkcPo8Zq0uSdodvyXV62HVmfIfHCcrjFrFrH0TggTy6Wtp8a78znGP8RJOz8zC9XSPpJmKjBQjg0M+nOvIzftA==", "license": "MIT", "dependencies": { @@ -2977,7 +2806,6 @@ }, "node_modules/@mantine/core/node_modules/type-fest": { "version": "5.9.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.9.0.tgz", "integrity": "sha512-yANm3Jr3GiJ1qgJlxGAVxTOIcEOk1rhQHamlXtnrCK7EHP4HeM9OGxtMg/W7HFdrVzw/ZWJKGVIJusVH85sLtw==", "license": "(MIT OR CC0-1.0)", "dependencies": { @@ -2992,7 +2820,6 @@ }, "node_modules/@mantine/dates": { "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@mantine/dates/-/dates-9.6.1.tgz", "integrity": "sha512-3NxfqrcwMuYB9wvxIhGhEhhazK3wcA2wG4AuNVFGJDd97ujWWAy+jGHqBF9jOusp/Mk4bn8u+3SuDICtLPDf5w==", "license": "MIT", "dependencies": { @@ -3008,7 +2835,6 @@ }, "node_modules/@mantine/hooks": { "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-9.6.1.tgz", "integrity": "sha512-pfxM95WozngB0ZALw6h99QV1TQ0qniOkFhzi0+dmSnKpxkVSR0xeNsvPpGDj9Teu+M69fRoE4IkzyMnu5Xld3w==", "license": "MIT", "peerDependencies": { @@ -3017,7 +2843,6 @@ }, "node_modules/@mdx-js/react": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "dev": true, "license": "MIT", @@ -3035,7 +2860,6 @@ }, "node_modules/@mswjs/interceptors": { "version": "0.41.9", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.9.tgz", "integrity": "sha512-VVPPgHyQ6ShqnrmDWuxjmUIsO9gWyOZFmuOfLd9LfBGQJwZfy0gvv9pbHSJuoFNIYC7ZDX9aoFwowjcdSC4E8w==", "dev": true, "license": "MIT", @@ -3053,14 +2877,12 @@ }, "node_modules/@mswjs/interceptors/node_modules/@open-draft/deferred-promise": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", "dev": true, "license": "MIT" }, "node_modules/@napi-rs/lzma-linux-x64-gnu": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", "cpu": [ "x64" @@ -3080,7 +2902,6 @@ }, "node_modules/@napi-rs/wasm-runtime": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.3.tgz", "integrity": "sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==", "dev": true, "license": "MIT", @@ -3102,7 +2923,6 @@ }, "node_modules/@octokit/auth-token": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", "dev": true, "license": "MIT", @@ -3112,7 +2932,6 @@ }, "node_modules/@octokit/core": { "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.8.tgz", "integrity": "sha512-L7y8eYc+AwxGr2PWI4WFt1VG4TiJ66c26BD16mXpYIlXxG0SMigM1+m4aTSlYyBr5BlQsGAlz8uDCoZN4SEMcg==", "dev": true, "license": "MIT", @@ -3131,7 +2950,6 @@ }, "node_modules/@octokit/endpoint": { "version": "11.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.5.tgz", "integrity": "sha512-iXa654H3yFafF/ieHkukfbgWo2rmXD2ceD0ZOtrPhw1bc3FDch1d9N/TNs0FQ1/cIbwb7kspUX8jzIs8nzb9DQ==", "dev": true, "license": "MIT", @@ -3145,7 +2963,6 @@ }, "node_modules/@octokit/graphql": { "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.5.tgz", "integrity": "sha512-bt/hm03LeU6Vy7FwTrkkC9p3XGT/lBwClglMqxBSe5/q0E5CdJTXeAqEI0vlw89/LF/G6tryTIH8HirZ3prMVg==", "dev": true, "license": "MIT", @@ -3160,14 +2977,12 @@ }, "node_modules/@octokit/openapi-types": { "version": "29.0.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-29.0.1.tgz", "integrity": "sha512-9qWOMFNxxLokERcms42rU0PTLqQmVs7g5E41TI4mCOxmpFayD1rfC7XxOL55cG9MBZLFlC31BrR37myMKardwg==", "dev": true, "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest": { "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz", "integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==", "dev": true, "license": "MIT", @@ -3183,14 +2998,12 @@ }, "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { "version": "27.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", "dev": true, "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", "dev": true, "license": "MIT", @@ -3200,7 +3013,6 @@ }, "node_modules/@octokit/plugin-request-log": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-6.0.0.tgz", "integrity": "sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q==", "dev": true, "license": "MIT", @@ -3213,7 +3025,6 @@ }, "node_modules/@octokit/plugin-rest-endpoint-methods": { "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz", "integrity": "sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==", "dev": true, "license": "MIT", @@ -3229,14 +3040,12 @@ }, "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { "version": "27.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", "dev": true, "license": "MIT" }, "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", "dev": true, "license": "MIT", @@ -3246,7 +3055,6 @@ }, "node_modules/@octokit/request": { "version": "10.0.16", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.16.tgz", "integrity": "sha512-A0zWGjHzISIb+9ccG8s0dq7LKO5zVpJLRICjgUb+sJxEWqn8RUHB1rD3AE51+PECvXHIxqZ1VVvs4fHTSD9nUQ==", "dev": true, "license": "MIT", @@ -3264,7 +3072,6 @@ }, "node_modules/@octokit/request-error": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.2.tgz", "integrity": "sha512-XZRuT3xZ84D3gYErI1DZvhJ33dCWVV6uzBtWkaBB4TvA/L6eOeTZodxLFVB44bBEEo3vEx7y00UfX1tBLrtLRg==", "dev": true, "license": "MIT", @@ -3277,7 +3084,6 @@ }, "node_modules/@octokit/rest": { "version": "22.0.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-22.0.1.tgz", "integrity": "sha512-Jzbhzl3CEexhnivb1iQ0KJ7s5vvjMWcmRtq5aUsKmKDrRW6z3r84ngmiFKFvpZjpiU/9/S6ITPFRpn5s/3uQJw==", "dev": true, "license": "MIT", @@ -3293,7 +3099,6 @@ }, "node_modules/@octokit/types": { "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-18.0.0.tgz", "integrity": "sha512-l6bAF43PNxkJp6g+W4PjoUSSkxHomXw2nOum5CTftJz1NlV3vu93NImgOYtLf6CbBUb5j+fiuzW0PPQ5JTSvZA==", "dev": true, "license": "MIT", @@ -3303,14 +3108,12 @@ }, "node_modules/@open-draft/deferred-promise": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-3.0.0.tgz", "integrity": "sha512-XW375UK8/9SqUVNVa6M0yEy8+iTi4QN5VZ7aZuRFQmy76LRwI9wy5F4YIBU6T+eTe2/DNDo8tqu8RHlwLHM6RA==", "dev": true, "license": "MIT" }, "node_modules/@open-draft/logger": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", "dev": true, "license": "MIT", @@ -3321,14 +3124,12 @@ }, "node_modules/@open-draft/until": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", "dev": true, "license": "MIT" }, "node_modules/@oxc-parser/binding-android-arm-eabi": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.148.0.tgz", "integrity": "sha512-pHASv9g5pASxb7akHERZNSkrEqPhFaUix98o7d9hbTpolnnFWl7UiRrcMhCsV1+iVO4/cJwKsbKRJTFNs2tdBQ==", "cpu": [ "arm" @@ -3345,7 +3146,6 @@ }, "node_modules/@oxc-parser/binding-android-arm64": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.148.0.tgz", "integrity": "sha512-sg/6Ez0KdAygsu0POELux9wN1Po2CP93WY8eNl4DBKIGprsd4QSHBXOb471Pu9i2OCD5sLkISSb2agZEhVn2Zw==", "cpu": [ "arm64" @@ -3362,7 +3162,6 @@ }, "node_modules/@oxc-parser/binding-darwin-arm64": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.148.0.tgz", "integrity": "sha512-yiSJmzGUvCUaJT8X3j40gVcX+ckuHQMuiOtF8DvzTs5+JtB/7XuHFPp4M+vv5u+HlBtDUd4Ks5pyHpWz8mfnkg==", "cpu": [ "arm64" @@ -3379,7 +3178,6 @@ }, "node_modules/@oxc-parser/binding-darwin-x64": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.148.0.tgz", "integrity": "sha512-6ZeklaamrMy4H2JmhvcJg6iip59tYILtuLaILxyAHT3l5FDxnI5ihVievAft5ZmAbqtlWHErOi1OpJK8gy1wcA==", "cpu": [ "x64" @@ -3396,7 +3194,6 @@ }, "node_modules/@oxc-parser/binding-freebsd-x64": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.148.0.tgz", "integrity": "sha512-vFsPx+a/qFECPnz/H8nC6x6MDvnWscLTCo/5muojEF54ERUq1kdgbvnWo95YnkhjF9sTIcG/uDxQBh1gffaufQ==", "cpu": [ "x64" @@ -3413,7 +3210,6 @@ }, "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.148.0.tgz", "integrity": "sha512-eOr3M+6iGbbxNL4PSS0VtsyQ2eOUxSBh00BqO22SbolDimPSYsBuLr/LCrZBkiqW2BoabhR6V4R8jrRAay7hjg==", "cpu": [ "arm" @@ -3430,7 +3226,6 @@ }, "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.148.0.tgz", "integrity": "sha512-58ZKDw0mQRbCNfrd2IDyV4o8T7enzGERJn41BH2tjrZVGyiKiFzcfDicuB7Zcpb/1xIOrObovr8Dja6lZi8dLw==", "cpu": [ "arm" @@ -3447,7 +3242,6 @@ }, "node_modules/@oxc-parser/binding-linux-arm64-gnu": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.148.0.tgz", "integrity": "sha512-Fnu95O4eZ5i++GPvIzBEZ8y4ddTLR+D9paYa8JRaRk6ZK7nHQiWP5xtrhcPQsXqgat1d7sU/d5rbbI0p1FTHSQ==", "cpu": [ "arm64" @@ -3467,7 +3261,6 @@ }, "node_modules/@oxc-parser/binding-linux-arm64-musl": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.148.0.tgz", "integrity": "sha512-3CQy/BMdx7N7H3qrcPxUL+a2CwUZodUcf6oq8iJuNZ9C6Ol1aq3mcWzsgySJ7CHFLvpX21ZDPp1r1X0QLbu/AQ==", "cpu": [ "arm64" @@ -3487,7 +3280,6 @@ }, "node_modules/@oxc-parser/binding-linux-ppc64-gnu": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.148.0.tgz", "integrity": "sha512-9LkaYvfiF8hMOw900csAvkf1oxE8XlmMeGowu5BcastSSwV8mKvKRMNU7HsV+ycyj1dQD8pX5qgOw8ja6SJacg==", "cpu": [ "ppc64" @@ -3507,7 +3299,6 @@ }, "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.148.0.tgz", "integrity": "sha512-2GBiM9h26dR4WJfhoMvnFMnFLf7m/kYs4UMqjvrOfQG4BV1nuTJDH22Zc2MQr3INZF7nSKYQ6xlhD3hQ7A6gug==", "cpu": [ "riscv64" @@ -3527,7 +3318,6 @@ }, "node_modules/@oxc-parser/binding-linux-riscv64-musl": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.148.0.tgz", "integrity": "sha512-uPqZexvKJmEgq4mAu36qe2xTfXZE7oyik1R7KtZ5tl8qKlq1U1fIqTFRUEBZqRGvforoTrGIpatRzcoPKO66RA==", "cpu": [ "riscv64" @@ -3547,7 +3337,6 @@ }, "node_modules/@oxc-parser/binding-linux-s390x-gnu": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.148.0.tgz", "integrity": "sha512-9oUHvnTbp7ZraFsTC8PN6XhdhPSSxZumYvixWl7Smi353gEULvK6yV0sXNVrdFMHQeaDKFCi8TgDhNK7/A+Y+Q==", "cpu": [ "s390x" @@ -3567,7 +3356,6 @@ }, "node_modules/@oxc-parser/binding-linux-x64-gnu": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.148.0.tgz", "integrity": "sha512-2qhDSJwKzbSZzF7lDqqk8sr/yXsmwr3PeUa4/nazIF+zFAYz1gVPEfC34GQtGxzJUUmklaYAL63368LEfrMeyw==", "cpu": [ "x64" @@ -3587,7 +3375,6 @@ }, "node_modules/@oxc-parser/binding-linux-x64-musl": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.148.0.tgz", "integrity": "sha512-qQoPDZUFV0bh9xA09XydmkjMBpgc1ukJuhMvzQ9QeVmFaHTS9W5TE5CoLmSl3QQyUP9OuHO3x/WPZTIIZPWR3Q==", "cpu": [ "x64" @@ -3607,7 +3394,6 @@ }, "node_modules/@oxc-parser/binding-openharmony-arm64": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.148.0.tgz", "integrity": "sha512-1UGbaQWEXUCLqAmaR5kwRDjx/R4S5LQKZkM9CHmaHkuKhriOF32aRLfS0jCRNE2yGQJLMEA1z9UucbBVqjXnDw==", "cpu": [ "arm64" @@ -3624,7 +3410,6 @@ }, "node_modules/@oxc-parser/binding-wasm32-wasi": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.127.0.tgz", "integrity": "sha512-T6KVD7rhLzFlwGRXMnxUFfkCZD8FHnb968wVXW1mXzgRFc5RNXOBY2mPPDZ77x5Ln76ltLMgtPg0cOkU1NSrEQ==", "cpu": [ "wasm32" @@ -3643,7 +3428,6 @@ }, "node_modules/@oxc-parser/binding-wasm32-wasi/node_modules/@emnapi/core": { "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", "dev": true, "license": "MIT", @@ -3655,7 +3439,6 @@ }, "node_modules/@oxc-parser/binding-wasm32-wasi/node_modules/@emnapi/runtime": { "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", "dev": true, "license": "MIT", @@ -3666,7 +3449,6 @@ }, "node_modules/@oxc-parser/binding-wasm32-wasi/node_modules/@emnapi/wasi-threads": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", "dev": true, "license": "MIT", @@ -3677,7 +3459,6 @@ }, "node_modules/@oxc-parser/binding-win32-arm64-msvc": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.148.0.tgz", "integrity": "sha512-pWKdzRDNG2+NK4h/V6U/CYERcfYD6u28h5IB/VJVsrZaD3muvE58tUj22lieL5vLZ+XFi1GPv9YXckZbJZ9BLA==", "cpu": [ "arm64" @@ -3694,7 +3475,6 @@ }, "node_modules/@oxc-parser/binding-win32-ia32-msvc": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.148.0.tgz", "integrity": "sha512-i3p4x+mvwtjcE1J5HM6V7ggsbXiznExN/4MkNyOy3dfXrVV3bnkSfmZxvo6/84qCVX4ShkpNE1SKt9biIF31GQ==", "cpu": [ "ia32" @@ -3711,7 +3491,6 @@ }, "node_modules/@oxc-parser/binding-win32-x64-msvc": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.148.0.tgz", "integrity": "sha512-Ye6vB7VQulghWYkYkECOBYFRVEizz4XyRTUAv+t8BuyurhKU7uD0P9eowL+mKG5Mf8MSYx+DI3Cm8SKZvYG7bQ==", "cpu": [ "x64" @@ -3728,7 +3507,6 @@ }, "node_modules/@oxc-project/types": { "version": "0.149.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.149.0.tgz", "integrity": "sha512-Efcc+iF0j3Bf67YjEqIqWXbX5XddXoK/Mw4K1/JuXwRCZ8N16VR7iT23nlCc9XrveFVh/E5Rqs2StT0V8v9LdA==", "dev": true, "license": "MIT", @@ -3738,7 +3516,6 @@ }, "node_modules/@oxc-resolver/binding-android-arm-eabi": { "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.24.2.tgz", "integrity": "sha512-y09e0L0SRI2OA2tUIrjBgoV3eH5hvUKXNkJqXmNo5V2WxIjyC7I7aJfRLMEVpA8yi95f90gFDvO0VMgrDw+vwA==", "cpu": [ "arm" @@ -3752,7 +3529,6 @@ }, "node_modules/@oxc-resolver/binding-android-arm64": { "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.24.2.tgz", "integrity": "sha512-cl4icWaZFnLdg8m6qtnh5rBMuGbxc/ptStFHLeCNwr+2cZjkjNwQu/jYRS0CHlnPecOJMpuS5M6/BH+0J/YkEg==", "cpu": [ "arm64" @@ -3766,7 +3542,6 @@ }, "node_modules/@oxc-resolver/binding-darwin-arm64": { "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.24.2.tgz", "integrity": "sha512-At29QEMF6HajbQvgY8K6OXnHD1x9rad74xBEfmCB6ZqCGsdq75aK7tOYcTbOanMy8qdIBrfL3SMr3p/lfSlb9w==", "cpu": [ "arm64" @@ -3780,7 +3555,6 @@ }, "node_modules/@oxc-resolver/binding-darwin-x64": { "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.24.2.tgz", "integrity": "sha512-A5Kqr1EUj4oIL5CF4WRssq/o5P0Y11cwoFouMRmQ7YnC/A8V93nv1nb7aSU8HwcgmXropjLNkVTl4MN87cu28Q==", "cpu": [ "x64" @@ -3794,7 +3568,6 @@ }, "node_modules/@oxc-resolver/binding-freebsd-x64": { "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.24.2.tgz", "integrity": "sha512-R5xkRBRRz7ceH/P5Jrc6G7FmdUdgpLYyESFAUDVTNQ9K0sGPxcp4ljiwEwEqsvNcQ4sYbMRrWcHHBCu7ksAJVw==", "cpu": [ "x64" @@ -3808,7 +3581,6 @@ }, "node_modules/@oxc-resolver/binding-linux-arm-gnueabihf": { "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.24.2.tgz", "integrity": "sha512-k/RuYL4L/R58IBn3wT5ma3Wh4k62bp1eYCFRWCmMsasUOqL+H6sW0VGFadEzKWXFFlz+2uIMoeMk9ySSZJHgbg==", "cpu": [ "arm" @@ -3822,7 +3594,6 @@ }, "node_modules/@oxc-resolver/binding-linux-arm-musleabihf": { "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.24.2.tgz", "integrity": "sha512-bnHAak3ujYfH5pKk4NieFNbvYvernfoQDgwLddbZ3OtMYrem87/qjlA+u+aKG0oZcqSLGCful/6/CEA+aeAgaA==", "cpu": [ "arm" @@ -3836,7 +3607,6 @@ }, "node_modules/@oxc-resolver/binding-linux-arm64-gnu": { "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.24.2.tgz", "integrity": "sha512-vDT3KHgzYp47gmtNOqL2VNhCyl5Zv643eyxm//A68J8DeUGXrvD1pZFiaT4jSfe+RInfnn1R2yVHye4enx6RnA==", "cpu": [ "arm64" @@ -3850,7 +3620,6 @@ }, "node_modules/@oxc-resolver/binding-linux-arm64-musl": { "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.24.2.tgz", "integrity": "sha512-+kMlQvbzfyEYtu5FcjE4p+ttBLpKW4d/AsAsuE69BxV6V4twZJeIQZFfD8gh/wqglY0MkPSezWXQH0jBV13MUw==", "cpu": [ "arm64" @@ -3864,7 +3633,6 @@ }, "node_modules/@oxc-resolver/binding-linux-ppc64-gnu": { "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.24.2.tgz", "integrity": "sha512-shjfMhmZ3gq9fv/w7bi3PnZlgOPG+2QAOFf0BJF0EgBSIGZ6PMLN2zbGEblTUYB/NKVDRyYhE2ff3dJ1QqNPkA==", "cpu": [ "ppc64" @@ -3878,7 +3646,6 @@ }, "node_modules/@oxc-resolver/binding-linux-riscv64-gnu": { "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.24.2.tgz", "integrity": "sha512-zGelwFR5oRo+b69k8Lrzun86DyUHzfKN6cnjbR9l7Z7NIRznOE/2ZvPa1IUKqAL2PzAXOdwkfVqNvO1H2RlpAw==", "cpu": [ "riscv64" @@ -3892,7 +3659,6 @@ }, "node_modules/@oxc-resolver/binding-linux-riscv64-musl": { "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.24.2.tgz", "integrity": "sha512-qxZ1SWCXJY0eyhAlP6Lmo9F2Nrtx7EkYj9oCgL8apDPCwXwCEDA2U697bbT81JIc2IrVjxO4KX6WU2N+oN9Z4w==", "cpu": [ "riscv64" @@ -3906,7 +3672,6 @@ }, "node_modules/@oxc-resolver/binding-linux-s390x-gnu": { "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.24.2.tgz", "integrity": "sha512-sGCecF3cx2DFlH4t/z7ApnOnXqN48p5p5mlHDEnHTAukQa2P+qMVE4CwyWE9W+q/m3QJ7kKfGrIjax31f44oFQ==", "cpu": [ "s390x" @@ -3920,7 +3685,6 @@ }, "node_modules/@oxc-resolver/binding-linux-x64-gnu": { "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.24.2.tgz", "integrity": "sha512-k/VlMMcSzMlahb3/fENM4rTlsJ0s3fFROA0KXPBmKggqmTSaE383sl8F3KCOXPLmVsYfW6hCitMhXCEtNeZxxg==", "cpu": [ "x64" @@ -3934,7 +3698,6 @@ }, "node_modules/@oxc-resolver/binding-linux-x64-musl": { "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.24.2.tgz", "integrity": "sha512-8hbnZyNi97b/8wapYaIF9+t9GmZKBW2vunaOc3h9HGJptH7b7XpvZqOTBSm/MpTjr7H497BlgOaSfLUdhmy2bw==", "cpu": [ "x64" @@ -3948,7 +3711,6 @@ }, "node_modules/@oxc-resolver/binding-openharmony-arm64": { "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-openharmony-arm64/-/binding-openharmony-arm64-11.24.2.tgz", "integrity": "sha512-MvyGik3a6pVgZ0t/kWlbmFxFLmXQJwgLsY2eYFHLpy0wGwRbfzeIGgDwQ3kXqE30z+kSXennRkCrT7TUvkptNg==", "cpu": [ "arm64" @@ -3962,7 +3724,6 @@ }, "node_modules/@oxc-resolver/binding-wasm32-wasi": { "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.24.2.tgz", "integrity": "sha512-vHcssMPwO08RTvj/c0iOBz90attxyG3wQJ0dTcyEQK43LRpcdLWZlV5feBhv6Isn6ahbQIzHbCgfa81+RiML0Q==", "cpu": [ "wasm32" @@ -3981,7 +3742,6 @@ }, "node_modules/@oxc-resolver/binding-win32-arm64-msvc": { "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.24.2.tgz", "integrity": "sha512-uokJqro2iBqkFvJdKQLP7d8/BUmFwESQFVmIJUQKj1Xn1a/LysJoe1vmeECLF5b3jsV8CAL5sEMJXX6SdK9Nhg==", "cpu": [ "arm64" @@ -3995,7 +3755,6 @@ }, "node_modules/@oxc-resolver/binding-win32-x64-msvc": { "version": "11.24.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.24.2.tgz", "integrity": "sha512-UqGPmo56KDfLlfXFAFIrNflHT8tFxWGEivWg3Zeyp4Uy2NlKN1FGPr6/BxcLGG3+kZ6Wp14g5Uj+n71boqZfiw==", "cpu": [ "x64" @@ -4009,7 +3768,6 @@ }, "node_modules/@phun-ky/typeof": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@phun-ky/typeof/-/typeof-2.0.3.tgz", "integrity": "sha512-oeQJs1aa8Ghke8JIK9yuq/+KjMiaYeDZ38jx7MhkXncXlUKjqQ3wEm2X3qCKyjo+ZZofZj+WsEEiqkTtRuE2xQ==", "dev": true, "license": "MIT", @@ -4023,14 +3781,12 @@ }, "node_modules/@polka/url": { "version": "1.0.0-next.29", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@polka/url/-/url-1.0.0-next.29.tgz", "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", "dev": true, "license": "MIT" }, "node_modules/@redocly/ajv": { "version": "8.11.2", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz", "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==", "dev": true, "license": "MIT", @@ -4047,14 +3803,12 @@ }, "node_modules/@redocly/config": { "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.0.tgz", "integrity": "sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==", "dev": true, "license": "MIT" }, "node_modules/@redocly/openapi-core": { "version": "1.34.20", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.20.tgz", "integrity": "sha512-ypeBZ/6BKXR9+7/TtbKhbl4UgD7raHhPS12oknlKno2A8+lnFkxIwiE/Aklu6L2cd/ioH+fCWuMxi9/p3EyAPw==", "dev": true, "license": "MIT", @@ -4076,14 +3830,12 @@ }, "node_modules/@redocly/openapi-core/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, "node_modules/@redocly/openapi-core/node_modules/brace-expansion": { "version": "2.1.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", "dev": true, "license": "MIT", @@ -4093,7 +3845,6 @@ }, "node_modules/@redocly/openapi-core/node_modules/minimatch": { "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, "license": "ISC", @@ -4106,7 +3857,6 @@ }, "node_modules/@reduxjs/toolkit": { "version": "2.12.0", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.12.0.tgz", "integrity": "sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==", "license": "MIT", "dependencies": { @@ -4132,7 +3882,6 @@ }, "node_modules/@release-it/conventional-changelog": { "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@release-it/conventional-changelog/-/conventional-changelog-12.0.0.tgz", "integrity": "sha512-b9N8/tUjO9JNH1u2fVSmq8QmbqnE//Y5iCgvPcytsk0pj0GhgGCp+VmfzhEBIdd+lVGZJKs+ZSaGaOHjtmtv7g==", "dev": true, "license": "MIT", @@ -4154,7 +3903,6 @@ }, "node_modules/@release-it/conventional-changelog/node_modules/semver": { "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", @@ -4167,7 +3915,6 @@ }, "node_modules/@rolldown/binding-android-arm-eabi": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.8.tgz", "integrity": "sha512-tN5aztYkKCte4i5SIrrz5yK/HMjEuCqCSCJa418jOV8tZ1cBY3YF2otxB1ktPxzsLA1BeTqwapK0bfjxNvHJVw==", "cpu": [ "arm" @@ -4184,7 +3931,6 @@ }, "node_modules/@rolldown/binding-android-arm64": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.8.tgz", "integrity": "sha512-dIYTWl9XprMUiQFoc55KUyk/oS8SKYH3zFl0LTR7RT0Xj4hgSVyuJcroH8JUu8RcpF8fTB6E0aOwCkZoYPcDSQ==", "cpu": [ "arm64" @@ -4201,7 +3947,6 @@ }, "node_modules/@rolldown/binding-darwin-arm64": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.8.tgz", "integrity": "sha512-PCSDQGXD2IyTEFrcgPyBM8jJuGmrbCMuoIOXdbEGVemruKACXoLQJrb+A45Z0L5t1RQkdfJprAYPkikbh7dzdA==", "cpu": [ "arm64" @@ -4218,7 +3963,6 @@ }, "node_modules/@rolldown/binding-darwin-x64": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.8.tgz", "integrity": "sha512-Uk7lRsGhPFHVX/sAUC6D5H9Ol30dFHd6iquokll2th3LpdJ3F5CzQB+7DHn0Ri2mG+U7k2zXiPHDrwZenXhwSA==", "cpu": [ "x64" @@ -4235,7 +3979,6 @@ }, "node_modules/@rolldown/binding-freebsd-x64": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.8.tgz", "integrity": "sha512-DjszaTEVogPqA5bYzsEeqDCQxbcp2fexQwKcRspYji2yzR68fCf+e4fx6kBSRDwX5/brZaHw/hWS9+A/+/w9sQ==", "cpu": [ "x64" @@ -4252,7 +3995,6 @@ }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.8.tgz", "integrity": "sha512-zmwa7FTmdzB6aaEEuuls18H6Ap5JmJPSoPTuXixeJZV6tG40SyLkApQtz1g8ptZtiEKqj9OM0oNLPh1AgvE31Q==", "cpu": [ "arm" @@ -4269,7 +4011,6 @@ }, "node_modules/@rolldown/binding-linux-arm64-gnu": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.8.tgz", "integrity": "sha512-KdYQDPHwJVnbFwdTGMgxsI9SqblBlz6STGM+w1We/d5B8OWWidYH0MwkU/uA1wM5fIpO2MkOVxXrNzzuZhw9ew==", "cpu": [ "arm64" @@ -4289,7 +4030,6 @@ }, "node_modules/@rolldown/binding-linux-arm64-musl": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.8.tgz", "integrity": "sha512-jFJTifHnNPY+yzOoNZQfSIysrVyXzEQPhPnOUjmD1bcQGHH6s7c8cViKWar8YplQImE5N9JRqMCLrM2CdxOrZA==", "cpu": [ "arm64" @@ -4309,7 +4049,6 @@ }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.8.tgz", "integrity": "sha512-FhiOziBDWPBjbcmRzfLyIJnaP7AVMFXT7YCXPjXxj7wKU3vx24RjrCNN/zjvVa+N2vVoHJwCoUBvsrN/DG3zIA==", "cpu": [ "ppc64" @@ -4329,7 +4068,6 @@ }, "node_modules/@rolldown/binding-linux-s390x-gnu": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.8.tgz", "integrity": "sha512-WnHfADMzOV2Y55wlx1hzzQnar/wDt/VdvWSD99r18Mz9ylNieIGOkRx3UV21h7m/eJvjySYJkO26VvGNFkwsIQ==", "cpu": [ "s390x" @@ -4349,7 +4087,6 @@ }, "node_modules/@rolldown/binding-linux-x64-gnu": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.8.tgz", "integrity": "sha512-H9tRr5ibfXFVLxbPOseVewewFpl28zcEdjRDt2FTUZU7odxP0gEv1ki4/kGmcGOh78oRwZuuQllGLZ9zTJp84g==", "cpu": [ "x64" @@ -4369,7 +4106,6 @@ }, "node_modules/@rolldown/binding-linux-x64-musl": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.8.tgz", "integrity": "sha512-UefiqfM3D6IVNlZ8tSGs9+Ejjud2T+oxO0IHADU45Y+lyEjD2dVFyZHbkfX0LUb5Zugo/oIv1eCO/KVYhgYJYA==", "cpu": [ "x64" @@ -4389,7 +4125,6 @@ }, "node_modules/@rolldown/binding-openharmony-arm64": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.8.tgz", "integrity": "sha512-637Ke4kWSy6rp9cxQ9gMOXlxPgIw/c1beASV4M//3+9I4uwBVOOl74G+e3zyU3u19U7RkRl/HuewixZ/Z6+Rjg==", "cpu": [ "arm64" @@ -4406,7 +4141,6 @@ }, "node_modules/@rolldown/binding-win32-arm64-msvc": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.8.tgz", "integrity": "sha512-xWBkPOF1Q9k/Gv1nQXnVdLxKu74jXppuOM4Z3mnypVUJJJwLsMl7hNJGRAUJoG8A5MgOI1ACKM+wBFxSJzKy4A==", "cpu": [ "arm64" @@ -4423,7 +4157,6 @@ }, "node_modules/@rolldown/binding-win32-x64-msvc": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.8.tgz", "integrity": "sha512-uz2ZvfgXbxqNwijjjbxrnvALwpyODDcgc1T1N8N3rf/DXKQmaFwmB4LX4yyjggpwN2obdQLb2rgirX5ffCWYng==", "cpu": [ "x64" @@ -4440,7 +4173,6 @@ }, "node_modules/@rolldown/plugin-babel": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@rolldown/plugin-babel/-/plugin-babel-0.2.4.tgz", "integrity": "sha512-ygmm2j/mN+aCvstHo0x3IOu4uc6LqXT9SJ3q4kpfG/+Yhfz0B+E47FITcC0FljZADwUFARP6E2kiE+Lc26D8wg==", "dev": true, "license": "MIT", @@ -4471,7 +4203,6 @@ }, "node_modules/@rolldown/plugin-babel/node_modules/picomatch": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", @@ -4484,14 +4215,12 @@ }, "node_modules/@rolldown/pluginutils": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "dev": true, "license": "MIT" }, "node_modules/@rollup/plugin-node-resolve": { "version": "16.0.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz", "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==", "dev": true, "license": "MIT", @@ -4516,14 +4245,12 @@ }, "node_modules/@rollup/plugin-node-resolve/node_modules/@types/resolve": { "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", "dev": true, "license": "MIT" }, "node_modules/@rollup/plugin-replace": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.3.tgz", "integrity": "sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==", "dev": true, "license": "MIT", @@ -4545,7 +4272,6 @@ }, "node_modules/@rollup/plugin-replace/node_modules/magic-string": { "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", @@ -4555,7 +4281,6 @@ }, "node_modules/@rollup/plugin-terser": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-1.0.0.tgz", "integrity": "sha512-FnCxhTBx6bMOYQrar6C8h3scPt8/JwIzw3+AJ2K++6guogH5fYaIFia+zZuhqv0eo1RN7W1Pz630SyvLbDjhtQ==", "dev": true, "license": "MIT", @@ -4578,7 +4303,6 @@ }, "node_modules/@rollup/pluginutils": { "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", "dev": true, "license": "MIT", @@ -4601,14 +4325,12 @@ }, "node_modules/@rollup/pluginutils/node_modules/estree-walker": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.4.tgz", "integrity": "sha512-I+BSHzTAhKN2n7ZwGZsegGcZjDpLqFOMAtJz/u6uFGe0pUFbq56dEHjqJV/ZUdRJtNXNxA+hREUatZBvMR3Oiw==", "cpu": [ "arm" @@ -4622,7 +4344,6 @@ }, "node_modules/@rollup/rollup-android-arm64": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.4.tgz", "integrity": "sha512-pu3BdjS2LtEzRu2elmGzS3fIeWSZy4BMDIaLNwjorO76+k2d0LMluijhsDx3KQyQBQ/lLUZCQA9/s6csvUfuhw==", "cpu": [ "arm64" @@ -4636,7 +4357,6 @@ }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.4.tgz", "integrity": "sha512-xfSrj9MHnWK9GaSqT9U0ImHtH/N8WZlHLx4cZHiuLcqs640hvZ3hLPd5UR2AZS57FaE8HrRUSpltbZdWRxHiDA==", "cpu": [ "arm64" @@ -4650,7 +4370,6 @@ }, "node_modules/@rollup/rollup-darwin-x64": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.4.tgz", "integrity": "sha512-bqU99PLJb/dqb3S0GIMdeuyAEETSUgZBoqXYd3Sd+WCsV+MmPhnN6JrotWyir31+QgH7EvvE5/mwGJlEoci8Fw==", "cpu": [ "x64" @@ -4664,7 +4383,6 @@ }, "node_modules/@rollup/rollup-freebsd-arm64": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.4.tgz", "integrity": "sha512-JinsFZ5G40oXQb+sUuiA5x689vhr6dDYK0H0NL+rwKdL6CqnmYN8PE4ZwfRSoIjrCxqTQG/SLfTtSvHeGxoVlw==", "cpu": [ "arm64" @@ -4678,7 +4396,6 @@ }, "node_modules/@rollup/rollup-freebsd-x64": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.4.tgz", "integrity": "sha512-GAdA4UxpiNm27cLHr2GqXBpAD0x9FqwYBY7/YSP0Ss0/PNi4k8gbviqpIpYbVSRBaS2ZcegXEzgTQMbRNCwxCw==", "cpu": [ "x64" @@ -4692,7 +4409,6 @@ }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.4.tgz", "integrity": "sha512-qDd6NoA1znaLjp4jR5U/KWCdLAKDJNB8W9ChbbDaKbo0xA+Atln5HK6LFCZ4oJQpemtRZA288DCirFRjrspptw==", "cpu": [ "arm" @@ -4709,7 +4425,6 @@ }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.4.tgz", "integrity": "sha512-WtB5Tz5KTNINb8ZA+8sQ7bmjuS1JrRT7YverYIhUGdWWDlpzVWmIwuZE+jidkEXUn1l0zrEkaIMa8dHF3NGcsA==", "cpu": [ "arm" @@ -4726,7 +4441,6 @@ }, "node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.4.tgz", "integrity": "sha512-VcQ3L1tjnkKzWjryAVaFhHEWcqOfICX9uxVVoDzm2t0DpgKRHd2zOpVrJc0xsWeBZcBFyYROCIBdyR/fS174pg==", "cpu": [ "arm64" @@ -4743,7 +4457,6 @@ }, "node_modules/@rollup/rollup-linux-arm64-musl": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.4.tgz", "integrity": "sha512-6+ZQX6P5s0cMDN2Ypb8Lbm2+/sZYmZjdaYny992ujUU9UKi/4CWoJWsl1pNvjWJHNHGK51m+jKGLlh1ylb2ifQ==", "cpu": [ "arm64" @@ -4760,7 +4473,6 @@ }, "node_modules/@rollup/rollup-linux-loong64-gnu": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.4.tgz", "integrity": "sha512-D72ZnvkFkBXOfzMMQLcwfPLyGkKb7HZ9/mf97B7v6/P5Lbv4oFOtSY/uHbS8lH6uKUOxoKiuokdb50XZSzzbJw==", "cpu": [ "loong64" @@ -4777,7 +4489,6 @@ }, "node_modules/@rollup/rollup-linux-loong64-musl": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.4.tgz", "integrity": "sha512-piU6BxeqA3O9KSu3kRCIQQtNqFFaTu21SEV4FwaRZowpnj3bLaWPZHw+xFqCs0XlJ+aOH3PTRWGoglH+mKA/OA==", "cpu": [ "loong64" @@ -4794,7 +4505,6 @@ }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.4.tgz", "integrity": "sha512-/5PGpHwqt2EEEOUs1XwzubE/ucr0dWDQ+to3zqi4Ds7EWpwtQ79wXc4JBoxqj/OwpawTsKWzJxHfSuBOq3DrWA==", "cpu": [ "ppc64" @@ -4811,7 +4521,6 @@ }, "node_modules/@rollup/rollup-linux-ppc64-musl": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.4.tgz", "integrity": "sha512-cX3beZDLWt7G2oJF+nhChiT+qtaihs+S2xi7ziGmVB+2pwPng6D0Ed0HmElQOgv2UsUmSJJLGwpBao/3TDx3VA==", "cpu": [ "ppc64" @@ -4828,7 +4537,6 @@ }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.4.tgz", "integrity": "sha512-1uz2mGWHyptR7DgHHrlbdRAjXK7v7elGZ9lMja910/RP+ZYbX6xAmCiU9UZSX4hqmgtHMv6lr5l3kq1HIOpcag==", "cpu": [ "riscv64" @@ -4845,7 +4553,6 @@ }, "node_modules/@rollup/rollup-linux-riscv64-musl": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.4.tgz", "integrity": "sha512-nLS8topojxyz7SRpKR2IODRpQ0XPZ+xaOXvT3+hqK/Uy8Lo5HFgkkIBiIrCu5tL5YqzTvgovGw55PwpahTAGig==", "cpu": [ "riscv64" @@ -4862,7 +4569,6 @@ }, "node_modules/@rollup/rollup-linux-s390x-gnu": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.4.tgz", "integrity": "sha512-gs7DRKotr3l3q+jGPQBjH0ng1FjlEDm5ueQrkw5JtQvtLyEIcLASqAEaor56BhkKRzk+IcQzrcanBdb/bBQn8g==", "cpu": [ "s390x" @@ -4879,7 +4585,6 @@ }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.4.tgz", "integrity": "sha512-791ET7W17NnScOZM7h4dX5hYspxE28htPFsb1awY/NRR8+PRNkS53e475rDdxXXDrP+kwnCcNWg9CX5ztn/Aqw==", "cpu": [ "x64" @@ -4896,7 +4601,6 @@ }, "node_modules/@rollup/rollup-linux-x64-musl": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.4.tgz", "integrity": "sha512-iwZQRcmj7g88g3tzefIrQY7qvmuA/cfYwhrDtTBhsmukO4U2huVO5W+86XacUMRvdSFVAc6kZUZy21JaRwiB9w==", "cpu": [ "x64" @@ -4913,7 +4617,6 @@ }, "node_modules/@rollup/rollup-openbsd-x64": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.4.tgz", "integrity": "sha512-dVHFp9gRWrdTpnqQuGfCwd7hOQDatK1VCP2iWhLY/cGrOQs/ucFzJ6A5SRqbXX12ZDI8EUuejSM5kwg+ja7Png==", "cpu": [ "x64" @@ -4927,7 +4630,6 @@ }, "node_modules/@rollup/rollup-openharmony-arm64": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.4.tgz", "integrity": "sha512-t3NlauOW6gxZVVFcBEnO62Cb4wbyDFL416gTg1uFI/2tgqYQlf69FbSE115Ajre9I+c26Lk4mcmdFUsS/DGifQ==", "cpu": [ "arm64" @@ -4941,7 +4643,6 @@ }, "node_modules/@rollup/rollup-win32-arm64-msvc": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.4.tgz", "integrity": "sha512-xWuIaSye5FWZF8+UYtVEcHtRJDN5kN9Kfgxx3Kq8XIov9KSKbc1fiqQCm90SKrgQbUXZelbnUhnlUJmfSE7P9A==", "cpu": [ "arm64" @@ -4955,7 +4656,6 @@ }, "node_modules/@rollup/rollup-win32-ia32-msvc": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.4.tgz", "integrity": "sha512-9ALJJUOg/ZflMJepVo2PlgsGxSaxN7SQ4Z8GoZfVlarWr6r3rkHUNsd/zAio7p4YMtChSMXPionxej4Hkf6CXQ==", "cpu": [ "ia32" @@ -4969,7 +4669,6 @@ }, "node_modules/@rollup/rollup-win32-x64-gnu": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.4.tgz", "integrity": "sha512-blj9z5qx/Pv4WU0W1NMFDB97e0JH5ed+aZGywW8WCvp/NhWX/4PFAq5uu6Q0AebNn+Vo6KzUYDT++JzTT5ojlQ==", "cpu": [ "x64" @@ -4983,7 +4682,6 @@ }, "node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.4.tgz", "integrity": "sha512-Erx822VRBwLa124shbj+wNXe//BOgMEctDV0m1aqTQdNO1S69DgNUCFKC1RCeZfixs1J31l6igk1ziyXErbigQ==", "cpu": [ "x64" @@ -4997,7 +4695,6 @@ }, "node_modules/@simple-libs/child-process-utils": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@simple-libs/child-process-utils/-/child-process-utils-2.0.0.tgz", "integrity": "sha512-dvNoRKLijXnD0XoJAz94pbNuB5GQgDr55UhpSPhffDkTT0Cmcqh9jSCOtwfT2d4H6MI9E7c4SgtMuJXZ6F3c6A==", "dev": true, "license": "MIT", @@ -5013,7 +4710,6 @@ }, "node_modules/@simple-libs/hosted-git-info": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@simple-libs/hosted-git-info/-/hosted-git-info-2.0.0.tgz", "integrity": "sha512-55XwK/GYgV58PuN8lZFhI1qRxdKoMLJocXl/yM1EPqazFDmM4QWY7q6BxPCPDNKTNunj794DSD4h0H7SrqUdMg==", "dev": true, "license": "MIT", @@ -5026,7 +4722,6 @@ }, "node_modules/@simple-libs/normalize-package-data": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@simple-libs/normalize-package-data/-/normalize-package-data-1.0.0.tgz", "integrity": "sha512-/EOmFBekV9tGee8gac/k+5Ox3twkypNqh5TfxA9vTkmcJkjm6f1xqrlstDNOrEhTvnYyVtU6Du2ZhY/IV1+9GA==", "dev": true, "license": "MIT", @@ -5043,7 +4738,6 @@ }, "node_modules/@simple-libs/normalize-package-data/node_modules/semver": { "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", @@ -5056,7 +4750,6 @@ }, "node_modules/@simple-libs/stream-utils": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-2.0.0.tgz", "integrity": "sha512-fCTuZK4QBa+39Oz9l4OGfJfz+GpwCp3AqO7Zch3to99xHPgstVsRFpeQ8LNd2o1Gv8raL2mCFwiaHh7bFSp5DQ==", "dev": true, "license": "MIT", @@ -5069,26 +4762,22 @@ }, "node_modules/@sonarsource/analyzer-commons-configurations": { "version": "2.31.0-5284", - "resolved": "https://registry.npmjs.org/@sonarsource/analyzer-commons-configurations/-/analyzer-commons-configurations-2.31.0-5284.tgz", "integrity": "sha512-ruk3blMs9BE9RNSp9LPpWZAIjxJmq4Cp00E3cELIHz7Kym3WxdWGRlKOMYLRQ5tJg/de7jN5AtEElY3bGIfTcw==", "dev": true, "license": "LGPL-3.0-only" }, "node_modules/@standard-schema/spec": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", "license": "MIT" }, "node_modules/@standard-schema/utils": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", "license": "MIT" }, "node_modules/@storybook/addon-docs": { "version": "10.6.0", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-10.6.0.tgz", "integrity": "sha512-Fk3rUQWeGyCfL170OkmRp6Ruyv7MHPb/xrKa6YNk7FlGmlVLi5tKzh2T/0J13vWEy8wiu2MV3IBu8iRsaUR+Cw==", "dev": true, "license": "MIT", @@ -5117,7 +4806,6 @@ }, "node_modules/@storybook/builder-vite": { "version": "10.6.0", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.6.0.tgz", "integrity": "sha512-7zt8tYB6dnSO8fbjUz91MHexGDpf9HrLlA3FAmlVb+2ZL3eWUs499L3I6BDUymcWu7oW5WCBJlB8ERj8ZLLzig==", "dev": true, "license": "MIT", @@ -5135,14 +4823,12 @@ }, "node_modules/@storybook/global": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", "dev": true, "license": "MIT" }, "node_modules/@storybook/icons": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-2.1.0.tgz", "integrity": "sha512-Fxh9vYpX9bQqFeHRiY8h2ApeRGDzRSMLwJwNZ/AIRqnyOKHxRKL+yFe+ctEkVJmuptRE9u1Hrn8ZZNHyfDKKNg==", "dev": true, "license": "MIT", @@ -5152,7 +4838,6 @@ }, "node_modules/@storybook/react": { "version": "10.6.0", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-10.6.0.tgz", "integrity": "sha512-0xfYYPRHcr5ta1hmXJCSezH4JGuUHJ+xVF9f1j+Y/MWEMOQE4wnaKWKsk/HLrDjZkT5hKfvmogt9b0yduP6zEQ==", "dev": true, "license": "MIT", @@ -5188,7 +4873,6 @@ }, "node_modules/@storybook/react-dom-shim": { "version": "10.6.0", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.6.0.tgz", "integrity": "sha512-ZE0l4xL6d00rKFeJhRDuh0t3r+/2ffhx47lIyaSWrTD5kuM3nDjKDxCIWwX4E3gLV+oNX8E1prXRMuEWJUJwJg==", "dev": true, "license": "MIT", @@ -5214,7 +4898,6 @@ }, "node_modules/@storybook/react-vite": { "version": "10.6.0", - "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-10.6.0.tgz", "integrity": "sha512-nc1dqnmjGOcDJvPCkAn4Hmu1gi7dNHHoibNmlBp0d1adosejELZxuNjHBkPl/KxZjbzP3jljQHnHB/guxd8e2g==", "dev": true, "license": "MIT", @@ -5248,7 +4931,6 @@ }, "node_modules/@stylistic/eslint-plugin": { "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz", "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==", "dev": true, "license": "MIT", @@ -5269,7 +4951,6 @@ }, "node_modules/@stylistic/eslint-plugin/node_modules/eslint-visitor-keys": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", @@ -5282,7 +4963,6 @@ }, "node_modules/@stylistic/eslint-plugin/node_modules/espree": { "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", @@ -5300,7 +4980,6 @@ }, "node_modules/@tanstack/eslint-plugin-query": { "version": "5.104.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@tanstack/eslint-plugin-query/-/eslint-plugin-query-5.104.0.tgz", "integrity": "sha512-WHStlNTKraESaAjeuZ0zJr+t3ZigZgAJ/FQX1sdLGSF+U0vXlHgcAoPqm27VixMRyXaFHCx9xBJiUmPNcxMpjQ==", "dev": true, "license": "MIT", @@ -5323,7 +5002,6 @@ }, "node_modules/@tanstack/query-core": { "version": "5.102.8", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.102.8.tgz", "integrity": "sha512-ZNjkJ33CqvPNec/6lZBnHqLc3EVGPZ9ySLhYahU9TcuRFdmwXewuj0c4hwSWcGHqEUwcSrKeZ+oGcvPBqXcQcg==", "license": "MIT", "funding": { @@ -5333,7 +5011,6 @@ }, "node_modules/@tanstack/react-query": { "version": "5.102.8", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.102.8.tgz", "integrity": "sha512-TYBea4OuXWD7MhaSHq069TWbFe7rcwWN6kzT7JF0OKi1K6c1gTv2IzD6A6ExJsCMozdkqBWeuIUZmu4KQg0O5A==", "license": "MIT", "dependencies": { @@ -5349,7 +5026,6 @@ }, "node_modules/@testing-library/dom": { "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", @@ -5369,7 +5045,6 @@ }, "node_modules/@testing-library/jest-dom": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-7.0.1.tgz", "integrity": "sha512-oMDTC3oA+6CXSO2JZnvOI7CA6oVub6kij5ggk9ohwye5slmkwxYDXcPOVxgMw/RQlticjtO0C1RZkR97HgrWMw==", "dev": true, "license": "MIT", @@ -5398,14 +5073,12 @@ }, "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", "dev": true, "license": "MIT" }, "node_modules/@testing-library/react": { "version": "16.3.3", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.3.tgz", "integrity": "sha512-Uo193NgQbPMz6lrrhtRQQFcMC6Re/ELLFbbuVL30WDlZxlpZf9/lMHTAVxPRLw1q1iu9OJmR1c2BLiENRstdBg==", "dev": true, "license": "MIT", @@ -5433,7 +5106,6 @@ }, "node_modules/@testing-library/user-event": { "version": "14.6.7", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.7.tgz", "integrity": "sha512-MPCpX8bxe8zS+JmmTwLp8jd0dy1rAm60Te/SL8JrQM3qvQJcBOs1d7IefJMyZzqM3EWBrDn/LWDt1BCGu4ASfg==", "dev": true, "license": "MIT", @@ -5447,7 +5119,6 @@ }, "node_modules/@trickfilm400/rollup-plugin-off-main-thread": { "version": "3.0.0-pre1", - "resolved": "https://registry.npmjs.org/@trickfilm400/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-3.0.0-pre1.tgz", "integrity": "sha512-/67zpWDBLV+oYAEL682s1ktXL0HgqX76f6gaVGkGnVZlBbm1zd0v4Bz8MFF2GGhoX9rvfq3KSQHubFHwa6w6/Q==", "dev": true, "license": "Apache-2.0", @@ -5463,7 +5134,6 @@ }, "node_modules/@trickfilm400/rollup-plugin-off-main-thread/node_modules/magic-string": { "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", @@ -5473,7 +5143,6 @@ }, "node_modules/@tybys/wasm-util": { "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", "dev": true, "license": "MIT", @@ -5484,14 +5153,12 @@ }, "node_modules/@types/aria-query": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", @@ -5505,7 +5172,6 @@ }, "node_modules/@types/babel__generator": { "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", @@ -5515,7 +5181,6 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", @@ -5526,7 +5191,6 @@ }, "node_modules/@types/babel__traverse": { "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", @@ -5536,7 +5200,6 @@ }, "node_modules/@types/chai": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "license": "MIT", @@ -5547,25 +5210,21 @@ }, "node_modules/@types/d3-array": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", "license": "MIT" }, "node_modules/@types/d3-color": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", "license": "MIT" }, "node_modules/@types/d3-ease": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", "license": "MIT" }, "node_modules/@types/d3-interpolate": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", "license": "MIT", "dependencies": { @@ -5574,13 +5233,11 @@ }, "node_modules/@types/d3-path": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", "license": "MIT" }, "node_modules/@types/d3-scale": { "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", "license": "MIT", "dependencies": { @@ -5589,7 +5246,6 @@ }, "node_modules/@types/d3-shape": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.2.0.tgz", "integrity": "sha512-kVd74ta9eof3eJOvbNd1vGKS/XERRyQbT26Og63hIsvDO84cjD5gEOhsXf26w3FSoNlPVz84DOFcKv/oou+fMw==", "license": "MIT", "dependencies": { @@ -5598,75 +5254,64 @@ }, "node_modules/@types/d3-time": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", "license": "MIT" }, "node_modules/@types/d3-timer": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", "license": "MIT" }, "node_modules/@types/deep-eql": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, "license": "MIT" }, "node_modules/@types/doctrine": { "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", "dev": true, "license": "MIT" }, "node_modules/@types/esrecurse": { "version": "4.3.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@types/esrecurse/-/esrecurse-4.3.1.tgz", "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", "dev": true, "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, "license": "MIT" }, "node_modules/@types/gensync": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.5.tgz", "integrity": "sha512-MbsRCT7mTikHwKZ0X+LVUTLRrZZRLipTuXEO9qOYO+zmjMVk81axyClMROf6uoPD9MRVu46bx8zoR0Ad9q3NAg==", "dev": true, "license": "MIT" }, "node_modules/@types/jsesc": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@types/jsesc/-/jsesc-2.5.1.tgz", "integrity": "sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==", "dev": true, "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/mdx": { "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.14.tgz", "integrity": "sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==", "dev": true, "license": "MIT" }, "node_modules/@types/node": { "version": "24.13.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.4.tgz", "integrity": "sha512-YJ7EqCstVTzIr0fMr7qul/977en+pQHrfmuKIo6Zr9i75Be21dr3MovcfvGtyvi2HAUrRerWps5sMO9I7WaxDw==", "dev": true, "license": "MIT", @@ -5676,14 +5321,12 @@ }, "node_modules/@types/parse-path": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/parse-path/-/parse-path-7.0.3.tgz", "integrity": "sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg==", "dev": true, "license": "MIT" }, "node_modules/@types/react": { "version": "19.3.0", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", "devOptional": true, "license": "MIT", @@ -5693,7 +5336,6 @@ }, "node_modules/@types/react-dom": { "version": "19.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.3.0.tgz", "integrity": "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==", "dev": true, "license": "MIT", @@ -5703,14 +5345,12 @@ }, "node_modules/@types/resolve": { "version": "1.20.6", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", "dev": true, "license": "MIT" }, "node_modules/@types/set-cookie-parser": { "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@types/set-cookie-parser/-/set-cookie-parser-2.4.10.tgz", "integrity": "sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==", "dev": true, "license": "MIT", @@ -5720,27 +5360,23 @@ }, "node_modules/@types/statuses": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", "dev": true, "license": "MIT" }, "node_modules/@types/trusted-types": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "dev": true, "license": "MIT" }, "node_modules/@types/use-sync-external-store": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.70.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.70.1.tgz", "integrity": "sha512-nDNrUQ/4ruSNYbu749TRY7cfrzPtoLHEXSNBI8aaNY32LlZCajixqRf3FqcKC4p5Cam4VOHYx/t+i5+nKXvrqA==", "dev": true, "license": "MIT", @@ -5769,7 +5405,6 @@ }, "node_modules/@typescript-eslint/parser": { "version": "8.70.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@typescript-eslint/parser/-/parser-8.70.1.tgz", "integrity": "sha512-nO974WLllwhSFWQXnMLj6nDGa8f0khKEz1JzpPJ1u7Vm/4X1X6ZHajpoknU4bb41vJyMB0HHVyS2GqdhWfIXZw==", "dev": true, "license": "MIT", @@ -5794,7 +5429,6 @@ }, "node_modules/@typescript-eslint/project-service": { "version": "8.70.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@typescript-eslint/project-service/-/project-service-8.70.1.tgz", "integrity": "sha512-62xOgboPfwc3/IgPSX/W6oQR3ZbF04194FPGUGH8HL8iLFHbt/456/8Ph1wLNUgVF+s94FlHoipBsz+v7+LMnA==", "dev": true, "license": "MIT", @@ -5816,7 +5450,6 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "8.70.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@typescript-eslint/scope-manager/-/scope-manager-8.70.1.tgz", "integrity": "sha512-Pa0EeSeAusQc1WbjQMac+YfenewYTBu0KjgYvkUKwhXaHUKbFog23Dm/rp0DX/6tyYOQ3Xl1a+3EcFNZynGHCw==", "dev": true, "license": "MIT", @@ -5834,7 +5467,6 @@ }, "node_modules/@typescript-eslint/tsconfig-utils": { "version": "8.70.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.70.1.tgz", "integrity": "sha512-jumze1fPI+sDOaM2TWGQdn39PDxTr7TZGeuyLkAbNyx2vtMT3uRnVKChN0hfht5V2TugphJzF6bYXvBcE09qqg==", "dev": true, "license": "MIT", @@ -5851,7 +5483,6 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "8.70.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@typescript-eslint/type-utils/-/type-utils-8.70.1.tgz", "integrity": "sha512-7zKTnyvaVWqzLZHPFQtX1hVHqgkMC+WebPWakNCSyrQVbIP1AM0L0TlBZtACldIRb6PptI8Odk+jyZ5kP3B1VA==", "dev": true, "license": "MIT", @@ -5876,7 +5507,6 @@ }, "node_modules/@typescript-eslint/types": { "version": "8.70.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@typescript-eslint/types/-/types-8.70.1.tgz", "integrity": "sha512-Dm1ypdhhrGCTyyehxElhgJ6kgk8MVCv5qXdoOVqPr1uqk42jX8KjrZqhROvdShczA8qrDoYiOWn1ykWlx2k81Q==", "dev": true, "license": "MIT", @@ -5890,7 +5520,6 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "8.70.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@typescript-eslint/typescript-estree/-/typescript-estree-8.70.1.tgz", "integrity": "sha512-TU8PwyGN0PQJUcE96mw8eCQ44SmxGdQlJmlWakHaHQ15eIuuvye5yNtmh/i6oS88jzXVQB71xdNkbkB/fMwL0g==", "dev": true, "license": "MIT", @@ -5918,7 +5547,6 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.8.5", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", @@ -5931,7 +5559,6 @@ }, "node_modules/@typescript-eslint/utils": { "version": "8.70.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@typescript-eslint/utils/-/utils-8.70.1.tgz", "integrity": "sha512-Esgul8MsnKnRLdYU2Eb2cRV9bS5HJYtKj1ByJnOzzG2M58DGdSUQ1jUuILxipqcpB2h9WLrbD5GijIWUjX/Tqw==", "dev": true, "license": "MIT", @@ -5955,7 +5582,6 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "8.70.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@typescript-eslint/visitor-keys/-/visitor-keys-8.70.1.tgz", "integrity": "sha512-Vwj9lUIW5Xq3wQ9w6gv3R86g1hMK8f2zNOdGTAgeXUMMXFK78G9ruCjjqutHMNJc0+CH7LYRnHeUB9IT8wFmcw==", "dev": true, "license": "MIT", @@ -5973,7 +5599,6 @@ }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { "version": "5.0.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", @@ -5986,7 +5611,6 @@ }, "node_modules/@unrs/resolver-binding-android-arm-eabi": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==", "cpu": [ "arm" @@ -6000,7 +5624,6 @@ }, "node_modules/@unrs/resolver-binding-android-arm64": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==", "cpu": [ "arm64" @@ -6014,7 +5637,6 @@ }, "node_modules/@unrs/resolver-binding-darwin-arm64": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==", "cpu": [ "arm64" @@ -6028,7 +5650,6 @@ }, "node_modules/@unrs/resolver-binding-darwin-x64": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==", "cpu": [ "x64" @@ -6042,7 +5663,6 @@ }, "node_modules/@unrs/resolver-binding-freebsd-x64": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==", "cpu": [ "x64" @@ -6056,7 +5676,6 @@ }, "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==", "cpu": [ "arm" @@ -6070,7 +5689,6 @@ }, "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==", "cpu": [ "arm" @@ -6084,7 +5702,6 @@ }, "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==", "cpu": [ "arm64" @@ -6101,7 +5718,6 @@ }, "node_modules/@unrs/resolver-binding-linux-arm64-musl": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==", "cpu": [ "arm64" @@ -6118,7 +5734,6 @@ }, "node_modules/@unrs/resolver-binding-linux-loong64-gnu": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==", "cpu": [ "loong64" @@ -6135,7 +5750,6 @@ }, "node_modules/@unrs/resolver-binding-linux-loong64-musl": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==", "cpu": [ "loong64" @@ -6152,7 +5766,6 @@ }, "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==", "cpu": [ "ppc64" @@ -6169,7 +5782,6 @@ }, "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==", "cpu": [ "riscv64" @@ -6186,7 +5798,6 @@ }, "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==", "cpu": [ "riscv64" @@ -6203,7 +5814,6 @@ }, "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==", "cpu": [ "s390x" @@ -6220,7 +5830,6 @@ }, "node_modules/@unrs/resolver-binding-linux-x64-gnu": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==", "cpu": [ "x64" @@ -6237,7 +5846,6 @@ }, "node_modules/@unrs/resolver-binding-linux-x64-musl": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==", "cpu": [ "x64" @@ -6254,7 +5862,6 @@ }, "node_modules/@unrs/resolver-binding-openharmony-arm64": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==", "cpu": [ "arm64" @@ -6268,7 +5875,6 @@ }, "node_modules/@unrs/resolver-binding-wasm32-wasi": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==", "cpu": [ "wasm32" @@ -6287,7 +5893,6 @@ }, "node_modules/@unrs/resolver-binding-wasm32-wasi/node_modules/@emnapi/core": { "version": "1.10.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@emnapi/core/-/core-1.10.0.tgz", "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", "dev": true, "license": "MIT", @@ -6299,7 +5904,6 @@ }, "node_modules/@unrs/resolver-binding-wasm32-wasi/node_modules/@emnapi/runtime": { "version": "1.10.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@emnapi/runtime/-/runtime-1.10.0.tgz", "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", "dev": true, "license": "MIT", @@ -6310,7 +5914,6 @@ }, "node_modules/@unrs/resolver-binding-wasm32-wasi/node_modules/@emnapi/wasi-threads": { "version": "1.2.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", "dev": true, "license": "MIT", @@ -6321,7 +5924,6 @@ }, "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==", "cpu": [ "arm64" @@ -6335,7 +5937,6 @@ }, "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==", "cpu": [ "ia32" @@ -6349,7 +5950,6 @@ }, "node_modules/@unrs/resolver-binding-win32-x64-msvc": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==", "cpu": [ "x64" @@ -6363,7 +5963,6 @@ }, "node_modules/@vitejs/plugin-react": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.1.tgz", "integrity": "sha512-yxLaQV9gkhS8ezJqCM6+ndU7mDY6gqAg75NQ+0IjwEI8IYOmQCgkRwHKVSfWXW076DsqMo0Dk+0FK1U+M5RgFw==", "dev": true, "license": "MIT", @@ -6393,7 +5992,6 @@ }, "node_modules/@vitest/browser": { "version": "5.0.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@vitest/browser/-/browser-5.0.0.tgz", "integrity": "sha512-JC9FG5xIRxPHXJPcdCaluIJcEoeM0IwGQ3xneuJk09LXKHRNs40BqWDWymQikbb20yOpYvzpKzmYgPRuSzKmvg==", "dev": true, "license": "MIT", @@ -6417,7 +6015,6 @@ }, "node_modules/@vitest/browser-playwright": { "version": "5.0.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@vitest/browser-playwright/-/browser-playwright-5.0.0.tgz", "integrity": "sha512-N+gED9y4/8pypaHjz/x0ah3CjoBr+N0hWWT+Gq4VXtMzyB+rUIdHni0ulzpD1j4H77iWy5Jg8PRMlVn6kjxo6g==", "dev": true, "license": "MIT", @@ -6441,7 +6038,6 @@ }, "node_modules/@vitest/coverage-v8": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-5.0.0.tgz", "integrity": "sha512-toMg6PZGCIa/lQNCDoASrfb1ly4hsUKXFtFYC9kD4t78o5Y6LyNJU7AENt8eHPr3quYdxaxK7hj2mnbFfUk9NA==", "dev": true, "license": "MIT", @@ -6470,7 +6066,6 @@ }, "node_modules/@vitest/eslint-plugin": { "version": "1.6.27", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@vitest/eslint-plugin/-/eslint-plugin-1.6.27.tgz", "integrity": "sha512-X1RCAfwbatG4GFbJ/1PIHP9MSZMt0JJThqbYID+vS4L783k6QGlLPe421wQE8dHXuGCcenVLsydiM4qzsYWxhg==", "dev": true, "license": "MIT", @@ -6501,7 +6096,6 @@ }, "node_modules/@vitest/istanbul-lib-coverage": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@vitest/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.1.tgz", "integrity": "sha512-k3DJZ8LhMBK9NS4SclF1ASD3OgXEWDorbIcPTRDK0/Zae6fRvu+fJRxtFdLfHsa9Y24beCdPnoNZ4LviTNstfA==", "dev": true, "license": "MIT", @@ -6511,7 +6105,6 @@ }, "node_modules/@vitest/istanbul-lib-report": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@vitest/istanbul-lib-report/-/istanbul-lib-report-1.0.1.tgz", "integrity": "sha512-1EOLRfsTMnyAr3+kEAsP4o9dhaDlGPpD7H5iLBBeq//YpNB1VIahkPhB+eRp9N2Dkfw8oySROjE3yf9XDeaIkQ==", "dev": true, "license": "MIT", @@ -6524,7 +6117,6 @@ }, "node_modules/@vitest/mocker": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-5.0.0.tgz", "integrity": "sha512-66PGTMIiVJP3t4a5yxU9qPtf7MdTBs8jmToMvy+HVflB3Yy13WJZTtPePdvU+wjRV02SKK5doLbSA6o9pwOmiA==", "dev": true, "license": "MIT", @@ -6552,7 +6144,6 @@ }, "node_modules/@vitest/pretty-format": { "version": "5.0.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@vitest/pretty-format/-/pretty-format-5.0.0.tgz", "integrity": "sha512-PVRNuB3wpReb4SQEs4zTKM4KWFhQ5pw3spE8naoDJNB5T5aWRzGKHwXcLUllr0WeOTXpB6bSr3CJLo5+7XQSSQ==", "dev": true, "license": "MIT", @@ -6565,7 +6156,6 @@ }, "node_modules/@vitest/spy": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-5.0.0.tgz", "integrity": "sha512-uy+luWBAPw9XfthoHi5AkfHUnuPYEESjl0p/r+meoBnU8bxg5GDQ3Ey8MjcJ6sqahkL4PFyrvfMJJBw7LbU06g==", "dev": true, "license": "MIT", @@ -6575,7 +6165,6 @@ }, "node_modules/@vitest/ui": { "version": "5.0.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@vitest/ui/-/ui-5.0.0.tgz", "integrity": "sha512-h2FIFwggCY2GxUd2UdQoYNVQkOIqEQLPhNREcl3FUiRsdzQep7NWwYbSmhGEA9nFLPDq5pXzRMcBZQU8Py83sg==", "dev": true, "license": "MIT", @@ -6596,7 +6185,6 @@ }, "node_modules/@vitest/utils": { "version": "5.0.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@vitest/utils/-/utils-5.0.0.tgz", "integrity": "sha512-dO++xL3vDfvhTAVimfkuQUA3k+JClIF1i1vAkPqpcGAthRmeWnXmHB7YPViPvgCwviX8u7Y5W1u2N//AaQr3fw==", "dev": true, "license": "MIT", @@ -6623,14 +6211,12 @@ }, "node_modules/@webcontainer/env": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@webcontainer/env/-/env-1.1.1.tgz", "integrity": "sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==", "dev": true, "license": "MIT" }, "node_modules/acorn": { "version": "8.18.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "dev": true, "license": "MIT", @@ -6643,7 +6229,6 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", @@ -6653,14 +6238,12 @@ }, "node_modules/acorn-jsx-walk": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/acorn-jsx-walk/-/acorn-jsx-walk-2.0.0.tgz", "integrity": "sha512-uuo6iJj4D4ygkdzd6jPtcxs8vZgDX9YFIkqczGImoypX2fQ4dVImmu3UzA4ynixCIMTrEOWW+95M2HuBaCEOVA==", "dev": true, "license": "MIT" }, "node_modules/acorn-loose": { "version": "8.5.2", - "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.5.2.tgz", "integrity": "sha512-PPvV6g8UGMGgjrMu+n/f9E/tCSkNQ2Y97eFvuVdJfG11+xdIeDcLyNdC8SHcrHbRqkfwLASdplyR6B6sKM1U4A==", "dev": true, "license": "MIT", @@ -6673,7 +6256,6 @@ }, "node_modules/acorn-walk": { "version": "8.3.5", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "dev": true, "license": "MIT", @@ -6686,7 +6268,6 @@ }, "node_modules/agent-base": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, "license": "MIT", @@ -6696,7 +6277,6 @@ }, "node_modules/ajv": { "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "devOptional": true, "license": "MIT", @@ -6713,7 +6293,6 @@ }, "node_modules/ansi-colors": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, "license": "MIT", @@ -6723,7 +6302,6 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", @@ -6733,7 +6311,6 @@ }, "node_modules/ansi-styles": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", @@ -6746,14 +6323,12 @@ }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/argue-cli": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/argue-cli/-/argue-cli-3.1.0.tgz", "integrity": "sha512-DhBpBfXL4SS2uC0N922MMajKR3CdrTG0u2or1PNYgXMsrSzViJrbtvT0nCLlLGUI0plam/ZZCs7aAauHtW9thw==", "dev": true, "license": "MIT", @@ -6766,7 +6341,6 @@ }, "node_modules/aria-query": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "license": "Apache-2.0", @@ -6776,7 +6350,6 @@ }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", @@ -6793,7 +6366,6 @@ }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", @@ -6815,7 +6387,6 @@ }, "node_modules/assertion-error": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", @@ -6825,7 +6396,6 @@ }, "node_modules/ast-types": { "version": "0.16.3", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.3.tgz", "integrity": "sha512-FvWoWYfSCM6kRxCSH+MGLHIKKGRL6A6AW7Zek2O32REPQRdg131428uRTKMBYAeRd3XXAaHDS60Wpri7CdKDrA==", "dev": true, "license": "MIT", @@ -6838,7 +6408,6 @@ }, "node_modules/ast-v8-to-istanbul": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.5.tgz", "integrity": "sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==", "dev": true, "license": "MIT", @@ -6850,21 +6419,18 @@ }, "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", "dev": true, "license": "MIT" }, "node_modules/async": { "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true, "license": "MIT" }, "node_modules/async-function": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, "license": "MIT", @@ -6874,7 +6440,6 @@ }, "node_modules/async-retry": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", "dev": true, "license": "MIT", @@ -6884,7 +6449,6 @@ }, "node_modules/at-least-node": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, "license": "ISC", @@ -6894,7 +6458,6 @@ }, "node_modules/available-typed-arrays": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", @@ -6910,7 +6473,6 @@ }, "node_modules/babel-plugin-react-compiler": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", "dev": true, "license": "MIT", @@ -6920,7 +6482,6 @@ }, "node_modules/balanced-match": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", @@ -6930,7 +6491,6 @@ }, "node_modules/baseline-browser-mapping": { "version": "2.11.23", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.23.tgz", "integrity": "sha512-le521dGVfxM7yRX0EikCoSz+rOK+hHzdDt/E7mG1jOJB/6WAAUuwVroLwaB7ApaUsz5Q0kFlDXLSA9MheUIfRQ==", "dev": true, "license": "Apache-2.0", @@ -6943,7 +6503,6 @@ }, "node_modules/basic-ftp": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-6.2.1.tgz", "integrity": "sha512-bK67isD+lKq46AU8vNtjvMaT2ZqAOAmNCbxUHlFBRD4k15NWxyEjmaKtZPlgce58So4BNTjITGQOVTjL9y0ECA==", "dev": true, "license": "MIT", @@ -6953,14 +6512,12 @@ }, "node_modules/before-after-hook": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", "dev": true, "license": "Apache-2.0" }, "node_modules/bidi-js": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.1.0.tgz", "integrity": "sha512-fX1Onk0tdVPC7obPWB5EbJ1z7NVhLq4m2xZLq2YXBkxzMXIGRpNMU88n0EPgWseKl12J7zXs7qrDxPK4sRs2fg==", "dev": true, "license": "MIT", @@ -6970,7 +6527,6 @@ }, "node_modules/brace-expansion": { "version": "5.0.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "dev": true, "license": "MIT", @@ -6983,7 +6539,6 @@ }, "node_modules/browserslist": { "version": "4.28.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.9.tgz", "integrity": "sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==", "dev": true, "funding": [ @@ -7017,14 +6572,12 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, "license": "MIT" }, "node_modules/builtin-modules": { "version": "5.4.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/builtin-modules/-/builtin-modules-5.4.0.tgz", "integrity": "sha512-JCWSCdun+4Ovd9BhM/Vtlmwb7oD6Wl4YiPRXXwhAuwlPhW1un/MKgXn7GZoFm53ginnoNzus69V8JWx0K393jg==", "dev": true, "license": "MIT", @@ -7037,7 +6590,6 @@ }, "node_modules/bundle-name": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, "license": "MIT", @@ -7053,7 +6605,6 @@ }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "license": "MIT", @@ -7063,7 +6614,6 @@ }, "node_modules/c12": { "version": "3.3.4", - "resolved": "https://registry.npmjs.org/c12/-/c12-3.3.4.tgz", "integrity": "sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==", "dev": true, "license": "MIT", @@ -7092,7 +6642,6 @@ }, "node_modules/cacheable": { "version": "2.5.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/cacheable/-/cacheable-2.5.0.tgz", "integrity": "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==", "dev": true, "license": "MIT", @@ -7106,7 +6655,6 @@ }, "node_modules/call-bind": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "dev": true, "license": "MIT", @@ -7125,7 +6673,6 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "license": "MIT", @@ -7139,7 +6686,6 @@ }, "node_modules/call-bound": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "license": "MIT", @@ -7156,7 +6702,6 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", @@ -7166,7 +6711,6 @@ }, "node_modules/caniuse-lite": { "version": "1.0.30001810", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", "dev": true, "funding": [ @@ -7187,7 +6731,6 @@ }, "node_modules/chai": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", @@ -7197,7 +6740,6 @@ }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", @@ -7214,7 +6756,6 @@ }, "node_modules/chalk/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", @@ -7230,7 +6771,6 @@ }, "node_modules/chalk/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", @@ -7243,21 +6783,18 @@ }, "node_modules/change-case": { "version": "5.4.4", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", "dev": true, "license": "MIT" }, "node_modules/chardet": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz", "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==", "dev": true, "license": "MIT" }, "node_modules/check-error": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", "dev": true, "license": "MIT", @@ -7267,7 +6804,6 @@ }, "node_modules/chokidar": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "dev": true, "license": "MIT", @@ -7283,7 +6819,6 @@ }, "node_modules/ci-info": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, "funding": [ @@ -7299,7 +6834,6 @@ }, "node_modules/cli-cursor": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", @@ -7315,7 +6849,6 @@ }, "node_modules/cli-spinners": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", "dev": true, "license": "MIT", @@ -7328,7 +6861,6 @@ }, "node_modules/cli-width": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, "license": "ISC", @@ -7338,7 +6870,6 @@ }, "node_modules/cliui": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "dev": true, "license": "ISC", @@ -7353,7 +6884,6 @@ }, "node_modules/cliui/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", @@ -7371,7 +6901,6 @@ }, "node_modules/clsx": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", "engines": { @@ -7380,7 +6909,6 @@ }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", @@ -7393,21 +6921,18 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/colorette": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", "dev": true, "license": "MIT" }, "node_modules/commander": { "version": "15.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-15.0.0.tgz", "integrity": "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==", "dev": true, "license": "MIT", @@ -7417,7 +6942,6 @@ }, "node_modules/comment-parser": { "version": "1.4.9", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/comment-parser/-/comment-parser-1.4.9.tgz", "integrity": "sha512-+2AvZKjJaNq9GQljm3tr0utwrig5BL+jgJGvz5rDpGKNIp+ojcRXWUwBbh/sGIi1QCprR6PsKFakub+w1v+4hQ==", "dev": true, "license": "MIT", @@ -7427,7 +6951,6 @@ }, "node_modules/common-tags": { "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", "dev": true, "license": "MIT", @@ -7437,14 +6960,12 @@ }, "node_modules/compare-versions": { "version": "6.1.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/compare-versions/-/compare-versions-6.1.1.tgz", "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", "dev": true, "license": "MIT" }, "node_modules/concat-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "dev": true, "engines": [ @@ -7460,14 +6981,12 @@ }, "node_modules/confbox": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", "dev": true, "license": "MIT" }, "node_modules/content-type": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-3.1.0.tgz", "integrity": "sha512-z26wZR7iXahgpSK7XgnB4IbRVmUNSODvsX9qC9TAru7AcWGiqn5YKy+OH3PLRrwyAnewykKhCqnD+VV3a8uT8Q==", "dev": true, "license": "MIT", @@ -7481,7 +7000,6 @@ }, "node_modules/conventional-changelog": { "version": "8.1.3", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-8.1.3.tgz", "integrity": "sha512-fOMwLCxm46znJKPB08jLxl1FD8SOZOQHktlzCVhvhhVUfq0KgQSryoYXsRRHs1aRlZPR1/QK5wztnY8sBNC2AA==", "dev": true, "license": "MIT", @@ -7505,7 +7023,6 @@ }, "node_modules/conventional-changelog-angular": { "version": "9.3.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-9.3.0.tgz", "integrity": "sha512-0MWQLVUT1oVCsUGs9aAWteBVxPlLwJTn5VbQH7B0B3fDizZgrJ9QGnKl/2mp1+5P7153GCBCjO/v1aKJ6eysCg==", "dev": true, "license": "ISC", @@ -7518,7 +7035,6 @@ }, "node_modules/conventional-changelog-conventionalcommits": { "version": "10.4.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-10.4.0.tgz", "integrity": "sha512-Rriac6ZrAlVm6cy9Bz4NSp+WMHpwNXoPIYex+HjCgduAVUSbnew29DQjQw0C4g9u3HtSYzGiGY+pdBXAZo+4aA==", "dev": true, "license": "ISC", @@ -7531,7 +7047,6 @@ }, "node_modules/conventional-changelog-preset-loader": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-6.0.1.tgz", "integrity": "sha512-GZ8E3RQzXQb3JFy0pKl8oeSf7ENIhvAMvJr+PlWkavZOesLHHdhkfNJ4SvW35eo1Fu2+EyVxWQ1tVvtzAG2iWg==", "dev": true, "license": "MIT", @@ -7541,7 +7056,6 @@ }, "node_modules/conventional-changelog-writer": { "version": "9.2.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-9.2.1.tgz", "integrity": "sha512-StlYSmW3wLedRaqohJMpP3YuWiAqtgD0/cpsai9frdDkXv7rxj0hRbpJrubPYvJxJsjplONsOobEQnPuS9UgCg==", "dev": true, "license": "MIT", @@ -7561,7 +7075,6 @@ }, "node_modules/conventional-changelog-writer/node_modules/semver": { "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", @@ -7574,7 +7087,6 @@ }, "node_modules/conventional-commits-filter": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-6.0.1.tgz", "integrity": "sha512-cs+LadpH7Kpw0M3k8wurk+sOVVDAENA0iK4OBOrkL94j5lEVYRJ4j3zd2bhY9qgzyrPqthdcYT3axzRN7AliMg==", "dev": true, "license": "MIT", @@ -7584,7 +7096,6 @@ }, "node_modules/conventional-commits-parser": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-7.1.2.tgz", "integrity": "sha512-O+x4N2yH+ijvqWlIyTHsXTAP+algNWgGbjY2duCe8w2vUMvUB95cLRslCPfTMQyLAKlet3bhZTdu6ozn4M+QJQ==", "dev": true, "license": "MIT", @@ -7601,7 +7112,6 @@ }, "node_modules/conventional-recommended-bump": { "version": "12.1.0", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-12.1.0.tgz", "integrity": "sha512-HTNG3kEZXOOfKwrEx54ljURU9bG4nVPQzXMyCSeUcA/PE8EpNpQNujSrbXNBI8QZyN35zM+pVw+FuQk4KqHSHg==", "dev": true, "license": "MIT", @@ -7621,14 +7131,12 @@ }, "node_modules/convert-source-map": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, "node_modules/cookie": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", "dev": true, "license": "MIT", @@ -7642,13 +7150,11 @@ }, "node_modules/cookie-es": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-3.1.1.tgz", "integrity": "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==", "license": "MIT" }, "node_modules/core-js-compat": { "version": "3.50.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.50.0.tgz", "integrity": "sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==", "dev": true, "license": "MIT", @@ -7665,7 +7171,6 @@ }, "node_modules/cosmiconfig": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", "dev": true, "license": "MIT", @@ -7692,7 +7197,6 @@ }, "node_modules/cosmiconfig-typescript-loader": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.3.0.tgz", "integrity": "sha512-Akr82WH1Wfqatyiqpj8HDkO2o2KmJRu1FhKfSNJP3K4IdXwHfEyL7MOb62i1AGQVLtIQM+iCE9CGOtrfhR+mmA==", "dev": true, "license": "MIT", @@ -7710,7 +7214,6 @@ }, "node_modules/cosmiconfig/node_modules/parse-json": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "license": "MIT", @@ -7729,7 +7232,6 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", @@ -7744,7 +7246,6 @@ }, "node_modules/crypto-random-string": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, "license": "MIT", @@ -7754,7 +7255,6 @@ }, "node_modules/css-tree": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "dev": true, "license": "MIT", @@ -7768,21 +7268,18 @@ }, "node_modules/css.escape": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", "dev": true, "license": "MIT" }, "node_modules/csstype": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "devOptional": true, "license": "MIT" }, "node_modules/d3-array": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "license": "ISC", "dependencies": { @@ -7794,7 +7291,6 @@ }, "node_modules/d3-color": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", "license": "ISC", "engines": { @@ -7803,7 +7299,6 @@ }, "node_modules/d3-ease": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", "license": "BSD-3-Clause", "engines": { @@ -7812,7 +7307,6 @@ }, "node_modules/d3-format": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", "license": "ISC", "engines": { @@ -7821,7 +7315,6 @@ }, "node_modules/d3-interpolate": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "license": "ISC", "dependencies": { @@ -7833,7 +7326,6 @@ }, "node_modules/d3-path": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", "license": "ISC", "engines": { @@ -7842,7 +7334,6 @@ }, "node_modules/d3-scale": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "license": "ISC", "dependencies": { @@ -7858,7 +7349,6 @@ }, "node_modules/d3-shape": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", "license": "ISC", "dependencies": { @@ -7870,7 +7360,6 @@ }, "node_modules/d3-time": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "license": "ISC", "dependencies": { @@ -7882,7 +7371,6 @@ }, "node_modules/d3-time-format": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "license": "ISC", "dependencies": { @@ -7894,7 +7382,6 @@ }, "node_modules/d3-timer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", "license": "ISC", "engines": { @@ -7903,7 +7390,6 @@ }, "node_modules/data-uri-to-buffer": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-8.0.0.tgz", "integrity": "sha512-6UHfyCux51b8PTGDgveqtz1tvphBku5DrMKKJbFAZAJOI2zsjDpDoYE1+QGj7FOMS4BdTFNJsJiR3zEB0xH0yQ==", "dev": true, "license": "MIT", @@ -7913,7 +7399,6 @@ }, "node_modules/data-urls": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", "dev": true, "license": "MIT", @@ -7927,7 +7412,6 @@ }, "node_modules/data-urls/node_modules/whatwg-url": { "version": "16.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", "dev": true, "license": "MIT", @@ -7942,7 +7426,6 @@ }, "node_modules/data-view-buffer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", @@ -7960,7 +7443,6 @@ }, "node_modules/data-view-byte-length": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", @@ -7978,7 +7460,6 @@ }, "node_modules/data-view-byte-offset": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", @@ -7996,13 +7477,11 @@ }, "node_modules/dayjs": { "version": "1.11.23", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.23.tgz", "integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==", "license": "MIT" }, "node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", @@ -8020,20 +7499,17 @@ }, "node_modules/decimal.js": { "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", "dev": true, "license": "MIT" }, "node_modules/decimal.js-light": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", "license": "MIT" }, "node_modules/deep-eql": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, "license": "MIT", @@ -8043,14 +7519,12 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "license": "MIT", @@ -8060,7 +7534,6 @@ }, "node_modules/default-browser": { "version": "5.5.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.1.tgz", "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==", "dev": true, "license": "MIT", @@ -8077,7 +7550,6 @@ }, "node_modules/default-browser-id": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", "dev": true, "license": "MIT", @@ -8090,7 +7562,6 @@ }, "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "license": "MIT", @@ -8108,7 +7579,6 @@ }, "node_modules/define-lazy-prop": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, "license": "MIT", @@ -8121,7 +7591,6 @@ }, "node_modules/define-properties": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "license": "MIT", @@ -8139,14 +7608,12 @@ }, "node_modules/defu": { "version": "6.1.7", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", "dev": true, "license": "MIT" }, "node_modules/degenerator": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-7.0.1.tgz", "integrity": "sha512-ABErK0IefDSyHjlPH7WUEenIAX2rPPnrDcDM+TS3z3+zu9TfyKKi07BQM+8rmxpdE2y1v5fjjdoAS/x4D2U60w==", "dev": true, "license": "MIT", @@ -8164,7 +7631,6 @@ }, "node_modules/degenerator/node_modules/ast-types": { "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", "dev": true, "license": "MIT", @@ -8177,7 +7643,6 @@ }, "node_modules/dependency-cruiser": { "version": "18.2.0", - "resolved": "https://registry.npmjs.org/dependency-cruiser/-/dependency-cruiser-18.2.0.tgz", "integrity": "sha512-xMDoLD0no6pDInR8/4rIIqZ4mERDnsjezk8PkNORYSfBLvjCOogUxaruepmi1uQtZQlYUgdT2u7G3jTlgKqNjw==", "dev": true, "license": "MIT", @@ -8215,7 +7680,6 @@ }, "node_modules/dependency-cruiser/node_modules/semver": { "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", @@ -8228,7 +7692,6 @@ }, "node_modules/dequal": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "license": "MIT", @@ -8238,14 +7701,12 @@ }, "node_modules/destr": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", "dev": true, "license": "MIT" }, "node_modules/detect-indent": { "version": "7.0.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/detect-indent/-/detect-indent-7.0.2.tgz", "integrity": "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==", "dev": true, "license": "MIT", @@ -8258,7 +7719,6 @@ }, "node_modules/detect-libc": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, "license": "Apache-2.0", @@ -8268,13 +7728,11 @@ }, "node_modules/detect-node-es": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", "license": "MIT" }, "node_modules/doctrine": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "license": "Apache-2.0", @@ -8287,14 +7745,12 @@ }, "node_modules/dom-accessibility-api": { "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, "license": "MIT" }, "node_modules/dotenv": { "version": "17.4.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", "dev": true, "license": "BSD-2-Clause", @@ -8307,7 +7763,6 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "license": "MIT", @@ -8322,7 +7777,6 @@ }, "node_modules/ejs": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "license": "Apache-2.0", @@ -8338,21 +7792,18 @@ }, "node_modules/electron-to-chromium": { "version": "1.5.427", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.427.tgz", "integrity": "sha512-n14zb3FdsChZ2BNobqNHAJMcP3ifFv4paox2LvCrfVAQcqGiSURgbJl+PfMpHVCNFkStnNc+RRVtPBTVW5PDgw==", "dev": true, "license": "ISC" }, "node_modules/emoji-regex": { "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "dev": true, "license": "MIT" }, "node_modules/empathic": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.1.tgz", "integrity": "sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==", "dev": true, "license": "MIT", @@ -8362,7 +7813,6 @@ }, "node_modules/enhanced-resolve": { "version": "5.24.5", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", "dev": true, "license": "MIT", @@ -8376,7 +7826,6 @@ }, "node_modules/entities": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", "dev": true, "license": "BSD-2-Clause", @@ -8389,7 +7838,6 @@ }, "node_modules/env-paths": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, "license": "MIT", @@ -8399,7 +7847,6 @@ }, "node_modules/error-ex": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", @@ -8409,7 +7856,6 @@ }, "node_modules/es-abstract": { "version": "1.24.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", "dev": true, "license": "MIT", @@ -8478,7 +7924,6 @@ }, "node_modules/es-abstract-get": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", "dev": true, "license": "MIT", @@ -8497,7 +7942,6 @@ }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, "license": "MIT", @@ -8507,7 +7951,6 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, "license": "MIT", @@ -8517,14 +7960,12 @@ }, "node_modules/es-module-lexer": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", "dev": true, "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "dev": true, "license": "MIT", @@ -8537,7 +7978,6 @@ }, "node_modules/es-set-tostringtag": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "license": "MIT", @@ -8553,7 +7993,6 @@ }, "node_modules/es-to-primitive": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", "dev": true, "license": "MIT", @@ -8574,7 +8013,6 @@ }, "node_modules/es-toolkit": { "version": "1.50.0", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.50.0.tgz", "integrity": "sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==", "license": "MIT", "workspaces": [ @@ -8585,7 +8023,6 @@ }, "node_modules/esbuild": { "version": "0.28.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", "dev": true, "hasInstallScript": true, @@ -8627,7 +8064,6 @@ }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", @@ -8637,7 +8073,6 @@ }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", @@ -8650,7 +8085,6 @@ }, "node_modules/escodegen": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, "license": "BSD-2-Clause", @@ -8672,7 +8106,6 @@ }, "node_modules/eslint": { "version": "10.11.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/eslint/-/eslint-10.11.0.tgz", "integrity": "sha512-P7a6UEEqb9G95MYAtqkmsTbVXIYyzIfl6NGOIJk162PaahFxFyeGcrlXYFSiagECg4sEm8IseJdZBKR3rx6MsQ==", "dev": true, "license": "MIT", @@ -8731,7 +8164,6 @@ }, "node_modules/eslint-import-context": { "version": "0.1.9", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/eslint-import-context/-/eslint-import-context-0.1.9.tgz", "integrity": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==", "dev": true, "license": "MIT", @@ -8756,7 +8188,6 @@ }, "node_modules/eslint-import-resolver-typescript": { "version": "4.4.5", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.5.tgz", "integrity": "sha512-nbE5XLph6TLtGYcu/U6e6ZVXyKBhbDWK5cLGk76eJ7NdZpwf1P9EFkpt1Z01mNZNrrilsAYWKH6zUkL4reoXbw==", "dev": true, "license": "ISC", @@ -8791,7 +8222,6 @@ }, "node_modules/eslint-plugin-import-x": { "version": "4.17.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/eslint-plugin-import-x/-/eslint-plugin-import-x-4.17.1.tgz", "integrity": "sha512-4cdstYkKCyjumM2Q9NSI03K8D2a9F4Ssz33K2lv2hQa4KmR9jPLwk3uWGtNvclfqBrPGfGuMBwsGMbe6dMRbfg==", "dev": true, "license": "MIT", @@ -8828,7 +8258,6 @@ }, "node_modules/eslint-plugin-import-x/node_modules/semver": { "version": "7.8.5", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", @@ -8841,7 +8270,6 @@ }, "node_modules/eslint-plugin-jest-dom": { "version": "5.10.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest-dom/-/eslint-plugin-jest-dom-5.10.1.tgz", "integrity": "sha512-IIJdzbACbhJUJyMAqpA9E9gxp1Gv29TeQ3DtL+pepwP8Oq2WiqjOB2HbnEIs23h0ewdKIZRDI56yLro2eUO+DA==", "dev": true, "license": "MIT", @@ -8865,7 +8293,6 @@ }, "node_modules/eslint-plugin-no-unsanitized": { "version": "4.1.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.1.5.tgz", "integrity": "sha512-MSB4hXPVFQrI8weqzs6gzl7reP2k/qSjtCoL2vUMSDejIIq9YL1ZKvq5/ORBXab/PvfBBrWO2jWviYpL+4Ghfg==", "dev": true, "license": "MPL-2.0", @@ -8875,7 +8302,6 @@ }, "node_modules/eslint-plugin-perfectionist": { "version": "5.12.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-5.12.1.tgz", "integrity": "sha512-krdSE7Dz+TCtcVr2+rfNhlOIFFBJcUdoRvjaN7JQnsaVnxJw+BZh9wMkY3MSLCJat+yW+UPTQLKS82Epc7MGZA==", "dev": true, "license": "MIT", @@ -8898,7 +8324,6 @@ }, "node_modules/eslint-plugin-react-dom": { "version": "5.21.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/eslint-plugin-react-dom/-/eslint-plugin-react-dom-5.21.0.tgz", "integrity": "sha512-OtaQ73uqxnmjZ7muFthEbnVvJKrQ4MJneO21MFiZ5AR7XfVxew/cMOKJpr42Yvf5P8m7iB/QBRG8BHwXeqinxQ==", "dev": true, "license": "MIT", @@ -8928,7 +8353,6 @@ }, "node_modules/eslint-plugin-react-hooks": { "version": "7.1.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", "dev": true, "license": "MIT", @@ -8948,7 +8372,6 @@ }, "node_modules/eslint-plugin-react-hooks/node_modules/@babel/compat-data": { "version": "7.29.7", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@babel/compat-data/-/compat-data-7.29.7.tgz", "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", @@ -8958,7 +8381,6 @@ }, "node_modules/eslint-plugin-react-hooks/node_modules/@babel/core": { "version": "7.29.7", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@babel/core/-/core-7.29.7.tgz", "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", @@ -8989,7 +8411,6 @@ }, "node_modules/eslint-plugin-react-hooks/node_modules/@babel/helper-compilation-targets": { "version": "7.29.7", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", @@ -9006,7 +8427,6 @@ }, "node_modules/eslint-plugin-react-hooks/node_modules/@babel/helper-module-transforms": { "version": "7.29.7", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", @@ -9024,7 +8444,6 @@ }, "node_modules/eslint-plugin-react-hooks/node_modules/@babel/helper-validator-option": { "version": "7.29.7", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", @@ -9034,7 +8453,6 @@ }, "node_modules/eslint-plugin-react-hooks/node_modules/@babel/helpers": { "version": "7.29.7", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/@babel/helpers/-/helpers-7.29.7.tgz", "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", @@ -9048,7 +8466,6 @@ }, "node_modules/eslint-plugin-react-hooks/node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", @@ -9058,7 +8475,6 @@ }, "node_modules/eslint-plugin-react-jsx": { "version": "5.21.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/eslint-plugin-react-jsx/-/eslint-plugin-react-jsx-5.21.0.tgz", "integrity": "sha512-ASHUFiPwlWR13LvZcXVXvieFqpb7EXv74T6y1IqrbAj17X36O+G90UXvkxcSF12lZkLHc1sImjsi0fUXPtFtTw==", "dev": true, "license": "MIT", @@ -9086,7 +8502,6 @@ }, "node_modules/eslint-plugin-react-naming-convention": { "version": "5.21.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/eslint-plugin-react-naming-convention/-/eslint-plugin-react-naming-convention-5.21.0.tgz", "integrity": "sha512-aLE48o2hsDAkrGGBvsQNXAP+y5bnpvnqAipIE/EebiosOoY+3ty7j8Ep6f8q6+0bz6wVwZUmSEnI439p1DRA4Q==", "dev": true, "license": "MIT", @@ -9115,7 +8530,6 @@ }, "node_modules/eslint-plugin-react-refresh": { "version": "0.5.7", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.7.tgz", "integrity": "sha512-XhJSzLljuYD4UjNuFGJu2v7aD3sqNVK12w5/DCUfrNfHWegZo2+TsavNx8MuxMwEquuFAzNbNfXKU0WoZ+YUIg==", "dev": true, "license": "MIT", @@ -9125,7 +8539,6 @@ }, "node_modules/eslint-plugin-react-rsc": { "version": "5.21.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/eslint-plugin-react-rsc/-/eslint-plugin-react-rsc-5.21.0.tgz", "integrity": "sha512-v7Q6H0vHF/EPF2k3pnWcm9W38Nk/fjTRlZkrqjOU7EFNR2vvrzJ8196geyJwYQCG0duXyCQMOv8ZnDI7LYhkYQ==", "dev": true, "license": "MIT", @@ -9153,7 +8566,6 @@ }, "node_modules/eslint-plugin-react-web-api": { "version": "5.21.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/eslint-plugin-react-web-api/-/eslint-plugin-react-web-api-5.21.0.tgz", "integrity": "sha512-0V05F7DrUWNbeYTZQKF/cp//vFjQzexVByCWqlitkN3hm+d7NXqSLQ/dt2a0gvxSIWaz9gm3BdCmgNN0CEVCmg==", "dev": true, "license": "MIT", @@ -9182,7 +8594,6 @@ }, "node_modules/eslint-plugin-react-x": { "version": "5.21.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/eslint-plugin-react-x/-/eslint-plugin-react-x-5.21.0.tgz", "integrity": "sha512-FEdx6h4Xf0aakOb4p6Pk1LpZCpxF0ArC0AMaLYQQEOOF5Z6OSRIZNWj6yKne64xQ6Ss6jQHicOheqbkg7Q0rPg==", "dev": true, "license": "MIT", @@ -9217,7 +8628,6 @@ }, "node_modules/eslint-plugin-regexp": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-regexp/-/eslint-plugin-regexp-3.3.1.tgz", "integrity": "sha512-58bGUci/AaWAo1ETj6Lsnmy6QXwnSyVONRA805828nnqp7vrTwdaQMc02vtowmYB3A5OB3SLr3r5HgmfxX4dLg==", "dev": true, "license": "MIT", @@ -9239,7 +8649,6 @@ }, "node_modules/eslint-plugin-security": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-4.1.0.tgz", "integrity": "sha512-cB4H72o/w8C0cm4uHJOnXMJz7MYTTuOwhn2X7PMuzZwfwqUoHK/ASHT6WKP+95lFk5Hkf3xfpiXB8a1+cef4rg==", "dev": true, "license": "Apache-2.0", @@ -9255,7 +8664,6 @@ }, "node_modules/eslint-plugin-sonarjs": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-4.2.1.tgz", "integrity": "sha512-WGsnVkUxmHyBOytShcIeE+vhQaS8e+gYgbHNNi4y2e5Zj+DpE2DLTvarqDUhNwjceTZHGLgevSgfBSEVkt4EaA==", "dev": true, "license": "LGPL-3.0-only", @@ -9281,7 +8689,6 @@ }, "node_modules/eslint-plugin-sonarjs/node_modules/builtin-modules": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, "license": "MIT", @@ -9294,7 +8701,6 @@ }, "node_modules/eslint-plugin-sonarjs/node_modules/semver": { "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", @@ -9307,7 +8713,6 @@ }, "node_modules/eslint-plugin-storybook": { "version": "10.6.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/eslint-plugin-storybook/-/eslint-plugin-storybook-10.6.0.tgz", "integrity": "sha512-HK3yD5Nslv97buJ5JfT1xFkTOoyJgGIENmBoZZI3F8t2UpBzb/dHpKyCh5bQ8AvJWnhoM/WAtDNqyd9nq6xgcg==", "dev": true, "license": "MIT", @@ -9321,7 +8726,6 @@ }, "node_modules/eslint-plugin-testing-library": { "version": "7.16.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/eslint-plugin-testing-library/-/eslint-plugin-testing-library-7.16.2.tgz", "integrity": "sha512-8gleGnQXK2ZA3hHwjCwpYTZvM+9VsrJ+/9kDI8CjqAQGAdMQOdn/rJNu7ZySENuiWlGKQWyZJ4ZjEg2zamaRHw==", "dev": true, "license": "MIT", @@ -9338,7 +8742,6 @@ }, "node_modules/eslint-plugin-unicorn": { "version": "76.0.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/eslint-plugin-unicorn/-/eslint-plugin-unicorn-76.0.0.tgz", "integrity": "sha512-3ywJrCMHKYhcBP5yFzGaOOX3dY7+iR3hvpuoS/0EnhRFgVWLejly+t4fOdJvWQxJdHZl1C+QBW7hybXPDld4Pw==", "dev": true, "license": "MIT", @@ -9376,7 +8779,6 @@ }, "node_modules/eslint-plugin-unicorn/node_modules/indent-string": { "version": "5.0.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "license": "MIT", @@ -9389,7 +8791,6 @@ }, "node_modules/eslint-plugin-unicorn/node_modules/semver": { "version": "7.8.5", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", @@ -9402,7 +8803,6 @@ }, "node_modules/eslint-plugin-unicorn/node_modules/strip-indent": { "version": "4.1.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/strip-indent/-/strip-indent-4.1.1.tgz", "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", "dev": true, "license": "MIT", @@ -9415,7 +8815,6 @@ }, "node_modules/eslint-scope": { "version": "9.1.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/eslint-scope/-/eslint-scope-9.1.2.tgz", "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", "dev": true, "license": "BSD-2-Clause", @@ -9434,7 +8833,6 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", @@ -9447,7 +8845,6 @@ }, "node_modules/eslint/node_modules/ajv": { "version": "6.15.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", @@ -9464,7 +8861,6 @@ }, "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "5.0.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", @@ -9477,7 +8873,6 @@ }, "node_modules/eslint/node_modules/ignore": { "version": "5.3.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", @@ -9487,14 +8882,12 @@ }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, "node_modules/espree": { "version": "11.2.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/espree/-/espree-11.2.0.tgz", "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "dev": true, "license": "BSD-2-Clause", @@ -9512,7 +8905,6 @@ }, "node_modules/espree/node_modules/eslint-visitor-keys": { "version": "5.0.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", @@ -9525,7 +8917,6 @@ }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, "license": "BSD-2-Clause", @@ -9539,7 +8930,6 @@ }, "node_modules/esquery": { "version": "1.7.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/esquery/-/esquery-1.7.0.tgz", "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", @@ -9552,7 +8942,6 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", @@ -9565,7 +8954,6 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", @@ -9575,7 +8963,6 @@ }, "node_modules/estree-walker": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", @@ -9585,7 +8972,6 @@ }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", @@ -9595,7 +8981,6 @@ }, "node_modules/eta": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eta/-/eta-4.6.0.tgz", "integrity": "sha512-lW6is4T1NFOYnmqGZIfvixqj7A7sSvScF+DN8EK6K58xI5MZ5UvYe0GjopxOXQtZvUn4eDdVuZ8XSoYWTMEKwA==", "dev": true, "license": "MIT", @@ -9608,13 +8993,11 @@ }, "node_modules/eventemitter3": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, "node_modules/expect-type": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", "dev": true, "license": "Apache-2.0", @@ -9624,42 +9007,36 @@ }, "node_modules/exsolve": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz", "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==", "dev": true, "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "devOptional": true, "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, "node_modules/fast-string-truncated-width": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", "dev": true, "license": "MIT" }, "node_modules/fast-string-width": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", "dev": true, "license": "MIT", @@ -9669,7 +9046,6 @@ }, "node_modules/fast-uri": { "version": "3.1.8", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", "devOptional": true, "funding": [ @@ -9686,7 +9062,6 @@ }, "node_modules/fast-wrap-ansi": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", "dev": true, "license": "MIT", @@ -9696,7 +9071,6 @@ }, "node_modules/fd-package-json": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fd-package-json/-/fd-package-json-2.0.0.tgz", "integrity": "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==", "dev": true, "license": "MIT", @@ -9706,7 +9080,6 @@ }, "node_modules/fdir": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", @@ -9724,14 +9097,12 @@ }, "node_modules/fflate": { "version": "0.8.3", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/fflate/-/fflate-0.8.3.tgz", "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", "dev": true, "license": "MIT" }, "node_modules/file-entry-cache": { "version": "11.1.5", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/file-entry-cache/-/file-entry-cache-11.1.5.tgz", "integrity": "sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==", "dev": true, "license": "MIT", @@ -9741,7 +9112,6 @@ }, "node_modules/filelist": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", "dev": true, "license": "Apache-2.0", @@ -9751,14 +9121,12 @@ }, "node_modules/filelist/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, "node_modules/filelist/node_modules/brace-expansion": { "version": "2.1.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", "dev": true, "license": "MIT", @@ -9768,7 +9136,6 @@ }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, "license": "ISC", @@ -9781,7 +9148,6 @@ }, "node_modules/find-up": { "version": "5.0.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", @@ -9798,7 +9164,6 @@ }, "node_modules/find-up-simple": { "version": "1.0.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/find-up-simple/-/find-up-simple-1.0.1.tgz", "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", "dev": true, "license": "MIT", @@ -9811,7 +9176,6 @@ }, "node_modules/flat-cache": { "version": "6.1.23", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/flat-cache/-/flat-cache-6.1.23.tgz", "integrity": "sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==", "dev": true, "license": "MIT", @@ -9823,14 +9187,12 @@ }, "node_modules/flatted": { "version": "3.4.4", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/flatted/-/flatted-3.4.4.tgz", "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", "dev": true, "license": "ISC" }, "node_modules/for-each": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", @@ -9846,7 +9208,6 @@ }, "node_modules/foreground-child": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, "license": "ISC", @@ -9863,7 +9224,6 @@ }, "node_modules/formatly": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/formatly/-/formatly-0.7.0.tgz", "integrity": "sha512-7CXJtIIA0zy/u12StsYk25qVKxvdLA2ep2sTNxK3ov0mGNIIDqIvAXDSgTnAfDJFsPfWjuz0WjfYSdpvnLA5Tg==", "dev": true, "license": "MIT", @@ -9880,7 +9240,6 @@ }, "node_modules/framer-motion": { "version": "13.2.0", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-13.2.0.tgz", "integrity": "sha512-9E33ebgMaO33w1nN/jEdW8z3/GO483fMi4rqbMG9rt83XgW9QLKRe4NcmJ8s+fQ3O34++UHrIQwlIWGIWTITjA==", "license": "MIT", "dependencies": { @@ -9903,7 +9262,6 @@ }, "node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "license": "MIT", @@ -9919,7 +9277,6 @@ }, "node_modules/fsevents": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, @@ -9934,7 +9291,6 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, "license": "MIT", @@ -9944,7 +9300,6 @@ }, "node_modules/function.prototype.name": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", "dev": true, "license": "MIT", @@ -9968,14 +9323,12 @@ }, "node_modules/functional-red-black-tree": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true, "license": "MIT" }, "node_modules/functions-have-names": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", @@ -9985,7 +9338,6 @@ }, "node_modules/generator-function": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", "dev": true, "license": "MIT", @@ -9995,7 +9347,6 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", @@ -10005,7 +9356,6 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", @@ -10015,7 +9365,6 @@ }, "node_modules/get-east-asian-width": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", "dev": true, "license": "MIT", @@ -10028,7 +9377,6 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", @@ -10053,7 +9401,6 @@ }, "node_modules/get-nonce": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", "license": "MIT", "engines": { @@ -10062,14 +9409,12 @@ }, "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "dev": true, "license": "ISC" }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, "license": "MIT", @@ -10083,7 +9428,6 @@ }, "node_modules/get-symbol-description": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", @@ -10101,7 +9445,6 @@ }, "node_modules/get-tsconfig": { "version": "4.14.3", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.3.tgz", "integrity": "sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==", "dev": true, "license": "MIT", @@ -10114,7 +9457,6 @@ }, "node_modules/get-uri": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-8.0.1.tgz", "integrity": "sha512-/5N/P4Lrh0p/mDwlDRi7Y1+P2o/OyzZI3l6Iz1Ov6XXwwm1y3RlZLuo3gVgML99djrEDtV980bBxSuOeHLk8ww==", "dev": true, "license": "MIT", @@ -10129,7 +9471,6 @@ }, "node_modules/giget": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/giget/-/giget-3.3.1.tgz", "integrity": "sha512-r+mvuDjrjMpsdw46Kmeydb8bdHm7wOKw8wNBtTndkjbPjgAp5oUJUxRE76wZFknxIPokfWvep2qSXK37aXE6zg==", "dev": true, "license": "MIT", @@ -10139,7 +9480,6 @@ }, "node_modules/git-up": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-8.1.1.tgz", "integrity": "sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==", "dev": true, "license": "MIT", @@ -10150,7 +9490,6 @@ }, "node_modules/git-url-parse": { "version": "16.1.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-16.1.0.tgz", "integrity": "sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==", "dev": true, "license": "MIT", @@ -10160,7 +9499,6 @@ }, "node_modules/glob": { "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, "license": "BlueOak-1.0.0", @@ -10178,7 +9516,6 @@ }, "node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", @@ -10191,7 +9528,6 @@ }, "node_modules/global-directory": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-5.0.0.tgz", "integrity": "sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==", "dev": true, "license": "MIT", @@ -10207,7 +9543,6 @@ }, "node_modules/globals": { "version": "17.12.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/globals/-/globals-17.12.0.tgz", "integrity": "sha512-cezEd/DTyyht9cvSSURyygXPfy04GtWO/5e6ZPvH7fCtjKz9PYOmuawphw1Ctd1f6C+5JypXfGD7ahNMXvevBA==", "dev": true, "license": "MIT", @@ -10220,7 +9555,6 @@ }, "node_modules/globalthis": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", @@ -10237,7 +9571,6 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", @@ -10250,14 +9583,12 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "license": "ISC" }, "node_modules/graphql": { "version": "16.14.2", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.14.2.tgz", "integrity": "sha512-Chq1s4CY7jmh8gO2qvLIJyfCDIN+EHLFW/9iShnp1z8FjBQMoodWP1kDC36VAMXXIvAjj4ARa7ntfAV2BrjsbA==", "dev": true, "license": "MIT", @@ -10267,7 +9598,6 @@ }, "node_modules/has-bigints": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", @@ -10280,7 +9610,6 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", @@ -10290,7 +9619,6 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "license": "MIT", @@ -10303,7 +9631,6 @@ }, "node_modules/has-proto": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "license": "MIT", @@ -10319,7 +9646,6 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", @@ -10332,7 +9658,6 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", @@ -10348,7 +9673,6 @@ }, "node_modules/hashery": { "version": "1.5.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/hashery/-/hashery-1.5.1.tgz", "integrity": "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==", "dev": true, "license": "MIT", @@ -10361,7 +9685,6 @@ }, "node_modules/hasown": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, "license": "MIT", @@ -10374,7 +9697,6 @@ }, "node_modules/headers-polyfill": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-5.0.1.tgz", "integrity": "sha512-1TJ6Fih/b8h5TIcv+1+Hw0PDQWJTKDKzFZzcKOiW1wJza3XoAQlkCuXLbymPYB8+ZQyw8mHvdw560e8zVFIWyA==", "dev": true, "license": "MIT", @@ -10385,21 +9707,18 @@ }, "node_modules/headers-polyfill/node_modules/set-cookie-parser": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.1.2.tgz", "integrity": "sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw==", "dev": true, "license": "MIT" }, "node_modules/hermes-estree": { "version": "0.25.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/hermes-estree/-/hermes-estree-0.25.1.tgz", "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", "dev": true, "license": "MIT" }, "node_modules/hermes-parser": { "version": "0.25.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/hermes-parser/-/hermes-parser-0.25.1.tgz", "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", "dev": true, "license": "MIT", @@ -10409,14 +9728,12 @@ }, "node_modules/hookified": { "version": "1.15.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/hookified/-/hookified-1.15.1.tgz", "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==", "dev": true, "license": "MIT" }, "node_modules/html-encoding-sniffer": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", "dev": true, "license": "MIT", @@ -10429,7 +9746,6 @@ }, "node_modules/html-parse-stringify": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-4.0.1.tgz", "integrity": "sha512-0zHsZJrK7S3K2aucXWL6ycoYJ/iNtIcFHC/nYQgFklPtrv5LpJctIiSCroWZWeuoXvuyFdzp6KzjJQ+OT5MfFw==", "license": "MIT", "funding": { @@ -10438,7 +9754,6 @@ }, "node_modules/http-proxy-agent": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-9.1.0.tgz", "integrity": "sha512-2NxoveTT58mjYT4n3RPTEfCZGLMbidoO8XEieXfpSYxu+PQJ1qpx4ypwH6N+uF9twBPIvRRgvkvW5HUTYWENig==", "dev": true, "license": "MIT", @@ -10453,7 +9768,6 @@ }, "node_modules/http-proxy-agent/node_modules/agent-base": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-9.0.0.tgz", "integrity": "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==", "dev": true, "license": "MIT", @@ -10463,7 +9777,6 @@ }, "node_modules/https-proxy-agent": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "license": "MIT", @@ -10477,7 +9790,6 @@ }, "node_modules/husky": { "version": "9.1.7", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true, "license": "MIT", @@ -10493,7 +9805,6 @@ }, "node_modules/i18next": { "version": "26.4.2", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.4.2.tgz", "integrity": "sha512-RX+R0VLg13IbvRuJSxnqykUFS9vQZTl8wYpWPCIUDWVrSGjsQywB5Y+pjzrkboxGAuYfJZVH1InFTdgBdxq6ug==", "funding": [ { @@ -10521,7 +9832,6 @@ }, "node_modules/iconv-lite": { "version": "0.7.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", "dev": true, "license": "MIT", @@ -10538,14 +9848,12 @@ }, "node_modules/idb": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", "dev": true, "license": "ISC" }, "node_modules/identifier-regex": { "version": "1.1.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/identifier-regex/-/identifier-regex-1.1.0.tgz", "integrity": "sha512-SLX4H/vtcYlYnL7XqnuJKHU7Z8517TgsW9nmQiGOgMCjQ8V/deLYu6bEmbGoXe7WMMhc9+EUGyFFneHja8KabA==", "dev": true, "license": "MIT", @@ -10561,7 +9869,6 @@ }, "node_modules/ignore": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", "dev": true, "license": "MIT", @@ -10571,7 +9878,6 @@ }, "node_modules/immer": { "version": "11.1.18", - "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.18.tgz", "integrity": "sha512-EQyQtLiYW029lyoczMl/Hh4Xu7cDecSc58JRYpHyL4tIAu3eqd1yJzQX04d2BZHDkzFFvm6qJEJWOtfDSWAXbQ==", "license": "MIT", "funding": { @@ -10581,7 +9887,6 @@ }, "node_modules/import-fresh": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", @@ -10598,7 +9903,6 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", @@ -10608,7 +9912,6 @@ }, "node_modules/import-meta-resolve": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", "dev": true, "license": "MIT", @@ -10619,7 +9922,6 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", @@ -10629,7 +9931,6 @@ }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "license": "MIT", @@ -10639,7 +9940,6 @@ }, "node_modules/index-to-position": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", "dev": true, "license": "MIT", @@ -10652,14 +9952,12 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "license": "ISC" }, "node_modules/ini": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", "dev": true, "license": "ISC", @@ -10669,7 +9967,6 @@ }, "node_modules/internal-slot": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "license": "MIT", @@ -10684,7 +9981,6 @@ }, "node_modules/internmap": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", "license": "ISC", "engines": { @@ -10693,7 +9989,6 @@ }, "node_modules/interpret": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, "license": "MIT", @@ -10703,7 +9998,6 @@ }, "node_modules/ip-address": { "version": "10.7.2", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.7.2.tgz", "integrity": "sha512-7H/2gFSIitxc0hG3nOI1glS8QLo/EHBFFLk8vEUjXY/xu0AdL8jZ9U1IzO2PUm0d2D/ofQcAifb0g6OBkt8U7w==", "dev": true, "license": "MIT", @@ -10713,7 +10007,6 @@ }, "node_modules/is-array-buffer": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "license": "MIT", @@ -10731,14 +10024,12 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true, "license": "MIT" }, "node_modules/is-async-function": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "license": "MIT", @@ -10758,7 +10049,6 @@ }, "node_modules/is-bigint": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "license": "MIT", @@ -10774,7 +10064,6 @@ }, "node_modules/is-boolean-object": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, "license": "MIT", @@ -10791,7 +10080,6 @@ }, "node_modules/is-builtin-module": { "version": "5.0.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/is-builtin-module/-/is-builtin-module-5.0.0.tgz", "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==", "dev": true, "license": "MIT", @@ -10807,7 +10095,6 @@ }, "node_modules/is-bun-module": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", "dev": true, "license": "MIT", @@ -10817,7 +10104,6 @@ }, "node_modules/is-bun-module/node_modules/semver": { "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", @@ -10830,7 +10116,6 @@ }, "node_modules/is-callable": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "license": "MIT", @@ -10843,7 +10128,6 @@ }, "node_modules/is-core-module": { "version": "2.16.2", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, "license": "MIT", @@ -10859,7 +10143,6 @@ }, "node_modules/is-data-view": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", @@ -10877,7 +10160,6 @@ }, "node_modules/is-date-object": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", @@ -10894,7 +10176,6 @@ }, "node_modules/is-docker": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, "license": "MIT", @@ -10910,7 +10191,6 @@ }, "node_modules/is-document.all": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", "dev": true, "license": "MIT", @@ -10926,7 +10206,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", @@ -10936,7 +10215,6 @@ }, "node_modules/is-finalizationregistry": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", @@ -10952,7 +10230,6 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", @@ -10962,7 +10239,6 @@ }, "node_modules/is-generator-function": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", @@ -10982,7 +10258,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", @@ -10995,7 +10270,6 @@ }, "node_modules/is-in-ssh": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", "dev": true, "license": "MIT", @@ -11008,7 +10282,6 @@ }, "node_modules/is-inside-container": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, "license": "MIT", @@ -11027,7 +10300,6 @@ }, "node_modules/is-installed-globally": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", "dev": true, "license": "MIT", @@ -11044,7 +10316,6 @@ }, "node_modules/is-installed-globally/node_modules/global-directory": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", "dev": true, "license": "MIT", @@ -11060,7 +10331,6 @@ }, "node_modules/is-installed-globally/node_modules/ini": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", "dev": true, "license": "ISC", @@ -11070,7 +10340,6 @@ }, "node_modules/is-interactive": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "dev": true, "license": "MIT", @@ -11083,7 +10352,6 @@ }, "node_modules/is-map": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", @@ -11096,14 +10364,12 @@ }, "node_modules/is-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true, "license": "MIT" }, "node_modules/is-negative-zero": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "license": "MIT", @@ -11116,14 +10382,12 @@ }, "node_modules/is-node-process": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", "dev": true, "license": "MIT" }, "node_modules/is-number-object": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", @@ -11140,7 +10404,6 @@ }, "node_modules/is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "dev": true, "license": "MIT", @@ -11150,7 +10413,6 @@ }, "node_modules/is-path-inside": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", "dev": true, "license": "MIT", @@ -11163,7 +10425,6 @@ }, "node_modules/is-plain-obj": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, "license": "MIT", @@ -11176,14 +10437,12 @@ }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true, "license": "MIT" }, "node_modules/is-regex": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", @@ -11202,7 +10461,6 @@ }, "node_modules/is-regexp": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", "dev": true, "license": "MIT", @@ -11212,7 +10470,6 @@ }, "node_modules/is-set": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "license": "MIT", @@ -11225,7 +10482,6 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", @@ -11241,7 +10497,6 @@ }, "node_modules/is-ssh": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", "dev": true, "license": "MIT", @@ -11251,7 +10506,6 @@ }, "node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "license": "MIT", @@ -11264,7 +10518,6 @@ }, "node_modules/is-string": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", @@ -11281,7 +10534,6 @@ }, "node_modules/is-symbol": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", @@ -11299,7 +10551,6 @@ }, "node_modules/is-typed-array": { "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", @@ -11315,7 +10566,6 @@ }, "node_modules/is-unicode-supported": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true, "license": "MIT", @@ -11328,7 +10578,6 @@ }, "node_modules/is-weakmap": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", @@ -11341,7 +10590,6 @@ }, "node_modules/is-weakref": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", @@ -11357,7 +10605,6 @@ }, "node_modules/is-weakset": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", @@ -11374,7 +10621,6 @@ }, "node_modules/is-wsl": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "dev": true, "license": "MIT", @@ -11390,21 +10636,18 @@ }, "node_modules/isarray": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, "node_modules/issue-parser": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.2.tgz", "integrity": "sha512-7atWPjhGEIX3JEtMrOYd8TKzboYlq+5sNbdl9POiLYOI14G5HZiQbZP0Xj5EZdrufQVXfJlpTV0hys0CuxwxZw==", "dev": true, "license": "MIT", @@ -11421,7 +10664,6 @@ }, "node_modules/jackspeak": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", "dev": true, "license": "BlueOak-1.0.0", @@ -11437,7 +10679,6 @@ }, "node_modules/jake": { "version": "10.9.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", "dev": true, "license": "Apache-2.0", @@ -11455,7 +10696,6 @@ }, "node_modules/jiti": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "dev": true, "license": "MIT", @@ -11465,7 +10705,6 @@ }, "node_modules/js-levenshtein": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", "dev": true, "license": "MIT", @@ -11475,14 +10714,12 @@ }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, "node_modules/js-yaml": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", "dev": true, "funding": [ @@ -11505,7 +10742,6 @@ }, "node_modules/jsdoc-type-pratt-parser": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-9.2.2.tgz", "integrity": "sha512-eFY7Rlscvv/BpY6UsVsjKwMhu1tJO/F4U/vC9g3yeRy/JqszuO1UP6Vdq+85G+3FP6fEw/sWR8a5ftPFY86csw==", "dev": true, "license": "MIT", @@ -11519,7 +10755,6 @@ }, "node_modules/jsdoc-type-pratt-parser/node_modules/@types/node": { "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.3.tgz", "integrity": "sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg==", "dev": true, "license": "MIT", @@ -11529,14 +10764,12 @@ }, "node_modules/jsdoc-type-pratt-parser/node_modules/undici-types": { "version": "8.9.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz", "integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==", "dev": true, "license": "MIT" }, "node_modules/jsdom": { "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-30.0.1.tgz", "integrity": "sha512-52v7mUVUfNQVYYqE1lcdaymWL0njO7lTLUog6ZvW2U5KsbiLk/GnZlVJ+qx0xfNJZ6Gn+KSpPNE52vurbxZwrA==", "dev": true, "license": "MIT", @@ -11577,7 +10810,6 @@ }, "node_modules/jsesc": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", @@ -11590,35 +10822,30 @@ }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "devOptional": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "node_modules/json-with-bigint": { "version": "3.5.12", - "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.12.tgz", "integrity": "sha512-uwbF/wSSuOgC7qqlq27Xp5B6a2MHVug3t0idZdTqu0JnlFvgJuH7ju+KAk/J06C7GfhoYy2gnb9wz2INqcne7w==", "dev": true, "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", @@ -11631,14 +10858,12 @@ }, "node_modules/jsonc-parser": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "dev": true, "license": "MIT" }, "node_modules/jsonfile": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", @@ -11651,7 +10876,6 @@ }, "node_modules/jsonpointer": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", "dev": true, "license": "MIT", @@ -11661,7 +10885,6 @@ }, "node_modules/jsx-ast-utils-x": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/jsx-ast-utils-x/-/jsx-ast-utils-x-0.1.0.tgz", "integrity": "sha512-eQQBjBnsVtGacsG9uJNB8qOr3yA8rga4wAaGG1qRcBzSIvfhERLrWxMAM1hp5fcS6Abo8M4+bUBTekYR0qTPQw==", "dev": true, "license": "MIT", @@ -11671,7 +10894,6 @@ }, "node_modules/keyv": { "version": "5.6.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/keyv/-/keyv-5.6.0.tgz", "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "dev": true, "license": "MIT", @@ -11681,7 +10903,6 @@ }, "node_modules/kleur": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, "license": "MIT", @@ -11691,7 +10912,6 @@ }, "node_modules/knip": { "version": "6.35.1", - "resolved": "https://registry.npmjs.org/knip/-/knip-6.35.1.tgz", "integrity": "sha512-22wnEnv4do2fvoeJsxpFCG/MBxReNxoCVBccaCl7suUJsG+F0UvxI9ycxZ9YgtLHSSjrZl5tOas0JZ/R1vJ93g==", "dev": true, "funding": [ @@ -11730,7 +10950,6 @@ }, "node_modules/knip/node_modules/jiti": { "version": "2.7.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", "dev": true, "license": "MIT", @@ -11740,7 +10959,6 @@ }, "node_modules/knip/node_modules/picomatch": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", @@ -11753,7 +10971,6 @@ }, "node_modules/leven": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, "license": "MIT", @@ -11763,7 +10980,6 @@ }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", @@ -11777,7 +10993,6 @@ }, "node_modules/lightningcss": { "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", "dev": true, "license": "MPL-2.0", @@ -11807,7 +11022,6 @@ }, "node_modules/lightningcss-android-arm64": { "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", "cpu": [ "arm64" @@ -11828,7 +11042,6 @@ }, "node_modules/lightningcss-darwin-arm64": { "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", "cpu": [ "arm64" @@ -11849,7 +11062,6 @@ }, "node_modules/lightningcss-darwin-x64": { "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", "cpu": [ "x64" @@ -11870,7 +11082,6 @@ }, "node_modules/lightningcss-freebsd-x64": { "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", "cpu": [ "x64" @@ -11891,7 +11102,6 @@ }, "node_modules/lightningcss-linux-arm-gnueabihf": { "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", "cpu": [ "arm" @@ -11912,7 +11122,6 @@ }, "node_modules/lightningcss-linux-arm64-gnu": { "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", "cpu": [ "arm64" @@ -11933,7 +11142,6 @@ }, "node_modules/lightningcss-linux-arm64-musl": { "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", "cpu": [ "arm64" @@ -11954,7 +11162,6 @@ }, "node_modules/lightningcss-linux-x64-gnu": { "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", "cpu": [ "x64" @@ -11975,7 +11182,6 @@ }, "node_modules/lightningcss-linux-x64-musl": { "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", "cpu": [ "x64" @@ -11996,7 +11202,6 @@ }, "node_modules/lightningcss-win32-arm64-msvc": { "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", "cpu": [ "arm64" @@ -12017,7 +11222,6 @@ }, "node_modules/lightningcss-win32-x64-msvc": { "version": "1.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", "cpu": [ "x64" @@ -12038,14 +11242,12 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, "license": "MIT" }, "node_modules/lint-staged": { "version": "17.5.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-17.5.1.tgz", "integrity": "sha512-7EDuco1xnBMeVpvAbeMq1U5KXwJGLmY8q6l+Ye78r36C4mPc+Vg1Z2SK8gHyRTyvPro90A0q5/FAZ+Au23d6QQ==", "dev": true, "license": "MIT", @@ -12069,7 +11271,6 @@ }, "node_modules/lint-staged/node_modules/picomatch": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", @@ -12082,7 +11283,6 @@ }, "node_modules/lint-staged/node_modules/tinyexec": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz", "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==", "dev": true, "license": "MIT", @@ -12092,7 +11292,6 @@ }, "node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", @@ -12108,56 +11307,48 @@ }, "node_modules/lodash.capitalize": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", "dev": true, "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true, "license": "MIT" }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", "dev": true, "license": "MIT" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "dev": true, "license": "MIT" }, "node_modules/lodash.isstring": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "dev": true, "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, "node_modules/lodash.uniqby": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", "dev": true, "license": "MIT" }, "node_modules/log-symbols": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", "dev": true, "license": "MIT", @@ -12174,14 +11365,12 @@ }, "node_modules/loupe": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", "dev": true, "license": "MIT" }, "node_modules/lru-cache": { "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "dev": true, "license": "BlueOak-1.0.0", @@ -12191,7 +11380,6 @@ }, "node_modules/lz-string": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", @@ -12201,7 +11389,6 @@ }, "node_modules/macos-release": { "version": "3.5.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.5.1.tgz", "integrity": "sha512-Lci/1in+elqZ589PXnfP/iwZXpwQifTM94WJRQwG2tZSdfY7NfB/aUaTARHrohWCgHlXoabeaeXRDOnF5X9JQw==", "dev": true, "license": "MIT", @@ -12214,7 +11401,6 @@ }, "node_modules/magic-string": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.3.1.tgz", "integrity": "sha512-rm91zr2Ou+XueDTohjQQjdQEcYM6zVi8KVUCG8Ec3vHwUEKrhSdCNyfuIywkA6hcCAteIn0ZOtAHA6eGpiX+Pg==", "dev": true, "license": "MIT", @@ -12224,7 +11410,6 @@ }, "node_modules/magicast": { "version": "0.5.4", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.4.tgz", "integrity": "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==", "dev": true, "license": "MIT", @@ -12236,7 +11421,6 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, "license": "MIT", @@ -12246,14 +11430,12 @@ }, "node_modules/mdn-data": { "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", "dev": true, "license": "CC0-1.0" }, "node_modules/mime-db": { "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "dev": true, "license": "MIT", @@ -12263,7 +11445,6 @@ }, "node_modules/mime-types": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "dev": true, "license": "MIT", @@ -12280,7 +11461,6 @@ }, "node_modules/mimic-function": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, "license": "MIT", @@ -12293,7 +11473,6 @@ }, "node_modules/min-indent": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, "license": "MIT", @@ -12303,7 +11482,6 @@ }, "node_modules/minimatch": { "version": "10.2.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, "license": "BlueOak-1.0.0", @@ -12319,7 +11497,6 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "license": "MIT", @@ -12329,7 +11506,6 @@ }, "node_modules/minipass": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, "license": "BlueOak-1.0.0", @@ -12339,7 +11515,6 @@ }, "node_modules/motion": { "version": "13.2.0", - "resolved": "https://registry.npmjs.org/motion/-/motion-13.2.0.tgz", "integrity": "sha512-4Hrb5vD6HhjFstLUiCmWvtpsw+WTpP4R+QXfSDYZBz7+uxE/LrRg3aV0ReJxHrTRffHhbIE6svEqnotngXvesQ==", "license": "MIT", "dependencies": { @@ -12361,7 +11536,6 @@ }, "node_modules/motion-dom": { "version": "13.2.0", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-13.2.0.tgz", "integrity": "sha512-N6gdSoWRDk0Rh/fVtlqUtLs+fEN3ELFZI3cn3IQE9Mnf3E+Mh8wjO6MstzCOPFh4Yf0L1as5m2eUyYWj8ylVSQ==", "license": "MIT", "dependencies": { @@ -12370,13 +11544,11 @@ }, "node_modules/motion-utils": { "version": "13.0.0", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-13.0.0.tgz", "integrity": "sha512-7DnN7TmbLcYXcG4RVadXIihWlyuM9afoUww8Y5Agg431kGKiuL2/OMyP4mJ5wLz+pvN3t5ySClLOaVXJ+wekRQ==", "license": "MIT" }, "node_modules/mrmime": { "version": "2.0.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/mrmime/-/mrmime-2.0.1.tgz", "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, "license": "MIT", @@ -12386,14 +11558,12 @@ }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, "node_modules/msw": { "version": "2.15.0", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.15.0.tgz", "integrity": "sha512-2wQAmKkQKxRuXvYJxVhPGG0wZNBQyD06oJvxqw90XqLvptdqxdlHrFUfEteKkpaNORX3Xzc+HtEl/q0nfmN2wQ==", "dev": true, "hasInstallScript": true, @@ -12438,7 +11608,6 @@ }, "node_modules/msw/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", @@ -12454,7 +11623,6 @@ }, "node_modules/msw/node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "license": "ISC", @@ -12469,14 +11637,12 @@ }, "node_modules/msw/node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, "node_modules/msw/node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", @@ -12491,7 +11657,6 @@ }, "node_modules/msw/node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", @@ -12504,7 +11669,6 @@ }, "node_modules/msw/node_modules/type-fest": { "version": "5.8.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.8.0.tgz", "integrity": "sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==", "dev": true, "license": "(MIT OR CC0-1.0)", @@ -12520,7 +11684,6 @@ }, "node_modules/msw/node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", @@ -12538,7 +11701,6 @@ }, "node_modules/msw/node_modules/yargs": { "version": "17.7.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", "dev": true, "license": "MIT", @@ -12557,7 +11719,6 @@ }, "node_modules/mute-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz", "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==", "dev": true, "license": "ISC", @@ -12567,7 +11728,6 @@ }, "node_modules/nanoid": { "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "dev": true, "funding": [ @@ -12586,7 +11746,6 @@ }, "node_modules/napi-postinstall": { "version": "0.3.4", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/napi-postinstall/-/napi-postinstall-0.3.4.tgz", "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", "dev": true, "license": "MIT", @@ -12602,14 +11761,12 @@ }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, "node_modules/natural-orderby": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-5.0.0.tgz", "integrity": "sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==", "dev": true, "license": "MIT", @@ -12619,7 +11776,6 @@ }, "node_modules/netmask": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz", "integrity": "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==", "dev": true, "license": "MIT", @@ -12629,7 +11785,6 @@ }, "node_modules/new-github-release-url": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", "dev": true, "license": "MIT", @@ -12645,7 +11800,6 @@ }, "node_modules/new-github-release-url/node_modules/type-fest": { "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, "license": "(MIT OR CC0-1.0)", @@ -12658,7 +11812,6 @@ }, "node_modules/node-releases": { "version": "2.0.55", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.55.tgz", "integrity": "sha512-mIrE/Cw9y+9Au6dS5vDKDhQza9YvG6w+ZrS6X+ZzA7yFW/soAeaups4Qzn1bL6g5FVy8WtP79+0j82oPIbqRjQ==", "dev": true, "license": "MIT", @@ -12668,7 +11821,6 @@ }, "node_modules/object-inspect": { "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", @@ -12681,7 +11833,6 @@ }, "node_modules/object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "license": "MIT", @@ -12691,7 +11842,6 @@ }, "node_modules/object.assign": { "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, "license": "MIT", @@ -12712,7 +11862,6 @@ }, "node_modules/obug": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", "dev": true, "funding": [ @@ -12726,14 +11875,12 @@ }, "node_modules/ohash": { "version": "2.0.12", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.12.tgz", "integrity": "sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==", "dev": true, "license": "MIT" }, "node_modules/onetime": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", @@ -12749,7 +11896,6 @@ }, "node_modules/open": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", "dev": true, "license": "MIT", @@ -12768,7 +11914,6 @@ }, "node_modules/openapi-fetch": { "version": "0.17.0", - "resolved": "https://registry.npmjs.org/openapi-fetch/-/openapi-fetch-0.17.0.tgz", "integrity": "sha512-PsbZR1wAPcG91eEthKhN+Zn92FMHxv+/faECIwjXdxfTODGSGegYv0sc1Olz+HYPvKOuoXfp+0pA2XVt2cI0Ig==", "license": "MIT", "dependencies": { @@ -12777,7 +11922,6 @@ }, "node_modules/openapi-react-query": { "version": "0.5.4", - "resolved": "https://registry.npmjs.org/openapi-react-query/-/openapi-react-query-0.5.4.tgz", "integrity": "sha512-V9lRiozjHot19/BYSgXYoyznDxDJQhEBSdi26+SJ0UqjMANLQhkni4XG+Z7e3Ag7X46ZLMrL9VxYkghU3QvbWg==", "license": "MIT", "dependencies": { @@ -12790,7 +11934,6 @@ }, "node_modules/openapi-typescript": { "version": "7.13.0", - "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.13.0.tgz", "integrity": "sha512-EFP392gcqXS7ntPvbhBzbF8TyBA+baIYEm791Hy5YkjDYKTnk/Tn5OQeKm5BIZvJihpp8Zzr4hzx0Irde1LNGQ==", "dev": true, "license": "MIT", @@ -12811,13 +11954,11 @@ }, "node_modules/openapi-typescript-helpers": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.1.0.tgz", "integrity": "sha512-OKTGPthhivLw/fHz6c3OPtg72vi86qaMlqbJuVJ23qOvQ+53uw1n7HdmkJFibloF7QEjDrDkzJiOJuockM/ljw==", "license": "MIT" }, "node_modules/optionator": { "version": "0.9.4", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", @@ -12835,7 +11976,6 @@ }, "node_modules/ora": { "version": "9.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-9.4.1.tgz", "integrity": "sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==", "dev": true, "license": "MIT", @@ -12858,7 +11998,6 @@ }, "node_modules/ora/node_modules/chalk": { "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, "license": "MIT", @@ -12871,7 +12010,6 @@ }, "node_modules/os-name": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-7.0.0.tgz", "integrity": "sha512-/HfRU/lPPr4T2VigM+cvM3cU77es+XF4OEAa4aE5zpdvrxHGD2NmH0AFIWpMNAb+CsZL45rlcIO49Re0ZcRseg==", "dev": true, "license": "MIT", @@ -12888,14 +12026,12 @@ }, "node_modules/outvariant": { "version": "1.4.3", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", "dev": true, "license": "MIT" }, "node_modules/own-keys": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz", "integrity": "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==", "dev": true, "license": "MIT", @@ -12914,7 +12050,6 @@ }, "node_modules/oxc-parser": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.148.0.tgz", "integrity": "sha512-syxUKHeUll89RIABQADcI7sikYrwyssvA6gj4phSSIPezKVM8yMaLAiLLSc7fmzVvrwybfFGFbW5zme9sX87rg==", "dev": true, "license": "MIT", @@ -12951,7 +12086,6 @@ }, "node_modules/oxc-parser/node_modules/@oxc-project/types": { "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.148.0.tgz", "integrity": "sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==", "dev": true, "license": "MIT", @@ -12961,7 +12095,6 @@ }, "node_modules/oxc-resolver": { "version": "11.24.2", - "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.24.2.tgz", "integrity": "sha512-FY91FiDBj7ls5MsFS9jN3tjz2o0/zsdSsymlakySaBwVJZorHhkWyICLZMKxlu1R9vYo+sd3z1jwb4J8x7bNDw==", "dev": true, "license": "MIT", @@ -12992,7 +12125,6 @@ }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", @@ -13008,7 +12140,6 @@ }, "node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", @@ -13024,7 +12155,6 @@ }, "node_modules/pac-proxy-agent": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-9.1.0.tgz", "integrity": "sha512-1aU+1mpj3DrQPfo3gh+3Gap3G5x+axnMx1P/y0ZF2ch7kb2meyOCAH8K2k9d27ROsTE7TnAerzxqF9aon2jqnA==", "dev": true, "license": "MIT", @@ -13044,7 +12174,6 @@ }, "node_modules/pac-proxy-agent/node_modules/agent-base": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-9.0.0.tgz", "integrity": "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==", "dev": true, "license": "MIT", @@ -13054,7 +12183,6 @@ }, "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-9.1.0.tgz", "integrity": "sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA==", "dev": true, "license": "MIT", @@ -13069,7 +12197,6 @@ }, "node_modules/pac-resolver": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-9.0.1.tgz", "integrity": "sha512-lJbS008tmkj08VhoM8Hzuv/VE5tK9MS0OIQ/7+s0lIF+BYhiQWFYzkSpML7lXs9iBu2jfmzBTLzhe9n6BX+dYw==", "dev": true, "license": "MIT", @@ -13086,21 +12213,18 @@ }, "node_modules/package-json-from-dist": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true, "license": "BlueOak-1.0.0" }, "node_modules/package-manager-detector": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz", "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==", "dev": true, "license": "MIT" }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", @@ -13113,7 +12237,6 @@ }, "node_modules/parse-json": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", "dev": true, "license": "MIT", @@ -13131,7 +12254,6 @@ }, "node_modules/parse-path": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz", "integrity": "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==", "dev": true, "license": "MIT", @@ -13141,7 +12263,6 @@ }, "node_modules/parse-url": { "version": "9.2.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-9.2.0.tgz", "integrity": "sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==", "dev": true, "license": "MIT", @@ -13155,7 +12276,6 @@ }, "node_modules/parse5": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", "dev": true, "license": "MIT", @@ -13168,7 +12288,6 @@ }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", @@ -13178,7 +12297,6 @@ }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", @@ -13188,14 +12306,12 @@ }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, "license": "MIT" }, "node_modules/path-scurry": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, "license": "BlueOak-1.0.0", @@ -13212,21 +12328,18 @@ }, "node_modules/path-to-regexp": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", "dev": true, "license": "MIT" }, "node_modules/pathe": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, "license": "MIT" }, "node_modules/pathval": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", "dev": true, "license": "MIT", @@ -13236,21 +12349,18 @@ }, "node_modules/perfect-debounce": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", "dev": true, "license": "MIT" }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "dev": true, "license": "MIT", @@ -13263,7 +12373,6 @@ }, "node_modules/pkg-types": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.3.tgz", "integrity": "sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w==", "dev": true, "license": "MIT", @@ -13275,14 +12384,12 @@ }, "node_modules/pkg-types/node_modules/confbox": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.3.1.tgz", "integrity": "sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA==", "dev": true, "license": "MIT" }, "node_modules/playwright": { "version": "1.63.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/playwright/-/playwright-1.63.0.tgz", "integrity": "sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==", "dev": true, "license": "Apache-2.0", @@ -13298,7 +12405,6 @@ }, "node_modules/playwright-core": { "version": "1.63.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/playwright-core/-/playwright-core-1.63.0.tgz", "integrity": "sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==", "dev": true, "license": "Apache-2.0", @@ -13311,7 +12417,6 @@ }, "node_modules/pluralize": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true, "license": "MIT", @@ -13321,7 +12426,6 @@ }, "node_modules/pngjs": { "version": "7.0.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/pngjs/-/pngjs-7.0.0.tgz", "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", "dev": true, "license": "MIT", @@ -13331,7 +12435,6 @@ }, "node_modules/possible-typed-array-names": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, "license": "MIT", @@ -13341,7 +12444,6 @@ }, "node_modules/postcss": { "version": "8.5.28", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", "dev": true, "funding": [ @@ -13370,7 +12472,6 @@ }, "node_modules/powershell-utils": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.1.tgz", "integrity": "sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==", "dev": true, "license": "MIT", @@ -13383,7 +12484,6 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", @@ -13393,7 +12493,6 @@ }, "node_modules/pretty-bytes": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", "dev": true, "license": "MIT", @@ -13406,7 +12505,6 @@ }, "node_modules/pretty-format": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", @@ -13421,14 +12519,12 @@ }, "node_modules/pretty-format/node_modules/react-is": { "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, "license": "MIT" }, "node_modules/prompts": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "license": "MIT", @@ -13442,14 +12538,12 @@ }, "node_modules/protocols": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", "dev": true, "license": "MIT" }, "node_modules/proxy-agent": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-8.0.2.tgz", "integrity": "sha512-idLLRewuemWd7GH/BDJzGiB0dWGfT2SQs3jy6NtZtGWU9uPTTSdeC1/cdbqLwgzhfv027daGFuXX426e2Eg20A==", "dev": true, "license": "MIT", @@ -13469,7 +12563,6 @@ }, "node_modules/proxy-agent-negotiate": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-agent-negotiate/-/proxy-agent-negotiate-1.1.0.tgz", "integrity": "sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ==", "dev": true, "license": "MIT", @@ -13487,7 +12580,6 @@ }, "node_modules/proxy-agent/node_modules/agent-base": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-9.0.0.tgz", "integrity": "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==", "dev": true, "license": "MIT", @@ -13497,7 +12589,6 @@ }, "node_modules/proxy-agent/node_modules/https-proxy-agent": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-9.1.0.tgz", "integrity": "sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA==", "dev": true, "license": "MIT", @@ -13512,7 +12603,6 @@ }, "node_modules/proxy-agent/node_modules/lru-cache": { "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "license": "ISC", @@ -13522,7 +12612,6 @@ }, "node_modules/proxy-from-env": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", "dev": true, "license": "MIT", @@ -13532,7 +12621,6 @@ }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", @@ -13542,7 +12630,6 @@ }, "node_modules/qified": { "version": "0.10.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/qified/-/qified-0.10.1.tgz", "integrity": "sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==", "dev": true, "license": "MIT", @@ -13555,21 +12642,18 @@ }, "node_modules/qified/node_modules/hookified": { "version": "2.2.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/hookified/-/hookified-2.2.0.tgz", "integrity": "sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==", "dev": true, "license": "MIT" }, "node_modules/quickjs-wasi": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/quickjs-wasi/-/quickjs-wasi-2.2.0.tgz", "integrity": "sha512-zQxXmQMrEoD3S+jQdYsloq4qAuaxKFHZj6hHqOYGwB2iQZH+q9e/lf5zQPXCKOk0WJuAjzRFbO4KwHIp2D05Iw==", "dev": true, "license": "MIT" }, "node_modules/quote-js-string": { "version": "0.1.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/quote-js-string/-/quote-js-string-0.1.0.tgz", "integrity": "sha512-Y3NoRtprEEZQD8RfxMCfS0ZTqc4e+i18OrXEXAvpM6TfC/3y+0L5rNbZiSnbBBEkDfFzbpd8o+cE8q3/anjMGA==", "dev": true, "license": "MIT", @@ -13582,7 +12666,6 @@ }, "node_modules/rc9": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/rc9/-/rc9-3.1.0.tgz", "integrity": "sha512-ufjkNVzbRHKcCOmTahZkmVsyc3W+MSk3jY03m+a7tGHkIsdVMG9l10/3HvFbWkkKzY5VFp3pkRsIo/UYgmFL7Q==", "dev": true, "license": "MIT", @@ -13593,7 +12676,6 @@ }, "node_modules/react": { "version": "19.3.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.3.0.tgz", "integrity": "sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==", "license": "MIT", "engines": { @@ -13602,7 +12684,6 @@ }, "node_modules/react-docgen": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-8.0.3.tgz", "integrity": "sha512-aEZ9qP+/M+58x2qgfSFEWH1BxLyHe5+qkLNJOZQb5iGS017jpbRnoKhNRrXPeA6RfBrZO5wZrT9DMC1UqE1f1w==", "dev": true, "license": "MIT", @@ -13624,7 +12705,6 @@ }, "node_modules/react-docgen-typescript": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.4.0.tgz", "integrity": "sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==", "dev": true, "license": "MIT", @@ -13634,7 +12714,6 @@ }, "node_modules/react-docgen/node_modules/@babel/compat-data": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", @@ -13644,7 +12723,6 @@ }, "node_modules/react-docgen/node_modules/@babel/core": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", @@ -13675,7 +12753,6 @@ }, "node_modules/react-docgen/node_modules/@babel/helper-compilation-targets": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", @@ -13692,7 +12769,6 @@ }, "node_modules/react-docgen/node_modules/@babel/helper-module-transforms": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", @@ -13710,7 +12786,6 @@ }, "node_modules/react-docgen/node_modules/@babel/helper-validator-option": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", @@ -13720,7 +12795,6 @@ }, "node_modules/react-docgen/node_modules/@babel/helpers": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", @@ -13734,7 +12808,6 @@ }, "node_modules/react-docgen/node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", @@ -13744,7 +12817,6 @@ }, "node_modules/react-docgen/node_modules/strip-indent": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz", "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==", "dev": true, "license": "MIT", @@ -13757,7 +12829,6 @@ }, "node_modules/react-dom": { "version": "19.3.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.0.tgz", "integrity": "sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==", "license": "MIT", "dependencies": { @@ -13769,7 +12840,6 @@ }, "node_modules/react-hook-form": { "version": "7.88.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.88.0.tgz", "integrity": "sha512-QRaLOWhX93YCnMiRfnOFRSwWXZNt8qhm2JTZwypoDvKpSffTJHmpzMXt8U6PV5UThvL3IiiLDUWe2nHMtz6Mmw==", "license": "MIT", "engines": { @@ -13785,7 +12855,6 @@ }, "node_modules/react-i18next": { "version": "17.0.14", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-17.0.14.tgz", "integrity": "sha512-ZpMBfJL3BiXPuYHj5QMY1GwvKJNhE1vCxOJQ8BoMBdHP5XONTfi/Qss1nuRlnFdIl72PKo2jPmw+fxuLjRFgaQ==", "license": "MIT", "dependencies": { @@ -13812,13 +12881,11 @@ }, "node_modules/react-is": { "version": "19.3.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.3.0.tgz", "integrity": "sha512-UpMYezM4v5/18F28aC66AEsjXIgE02kyEMH6yLdgLXu/UTfa1Ntwck/nNLrbqJsEXW7gPb0coNO9FQse9WTovA==", "license": "MIT" }, "node_modules/react-number-format": { "version": "5.4.5", - "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.5.tgz", "integrity": "sha512-y8O2yHHj3w0aE9XO8d2BCcUOOdQTRSVq+WIuMlLVucAm5XNjJAy+BoOJiuQMldVYVOKTMyvVNfnbl2Oqp+YxGw==", "license": "MIT", "peerDependencies": { @@ -13828,7 +12895,6 @@ }, "node_modules/react-redux": { "version": "9.3.0", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.3.0.tgz", "integrity": "sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==", "license": "MIT", "dependencies": { @@ -13851,7 +12917,6 @@ }, "node_modules/react-remove-scroll": { "version": "2.7.2", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", "license": "MIT", "dependencies": { @@ -13876,7 +12941,6 @@ }, "node_modules/react-remove-scroll-bar": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", "license": "MIT", "dependencies": { @@ -13898,7 +12962,6 @@ }, "node_modules/react-router": { "version": "8.3.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-8.3.1.tgz", "integrity": "sha512-TEOpiO2g0TJHEOJeRVv4amUFun9v1npCKszvcquNvzETUtJ8udV86ah5eFoHT7g26bsBvT6EiIhqulR8eDF++A==", "license": "MIT", "dependencies": { @@ -13919,7 +12982,6 @@ }, "node_modules/react-style-singleton": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", "license": "MIT", "dependencies": { @@ -13941,7 +13003,6 @@ }, "node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "license": "MIT", @@ -13956,7 +13017,6 @@ }, "node_modules/readdirp": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", "dev": true, "license": "MIT", @@ -13970,7 +13030,6 @@ }, "node_modules/recast": { "version": "0.23.21", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.21.tgz", "integrity": "sha512-mFAyJq9vUbSTARLZUvAEf1z3YxlvAwswbmxMx2mPA/MSm4KmpwvwvhsH/NIrZhyOuwD60Lzyw2qh83uCbgTPYw==", "dev": true, "license": "MIT", @@ -13987,7 +13046,6 @@ }, "node_modules/recharts": { "version": "3.10.1", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.10.1.tgz", "integrity": "sha512-QXFrvt6IVcw7eeZCoyXTwkIJAX3Dv1nyVhMicXJ47GsGDDpcN8z6o644DibE9XjpBTThtsomLKnTV6lc+cVFUA==", "license": "MIT", "workspaces": [ @@ -14017,7 +13075,6 @@ }, "node_modules/rechoir": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "license": "MIT", @@ -14030,7 +13087,6 @@ }, "node_modules/redent": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, "license": "MIT", @@ -14044,13 +13100,11 @@ }, "node_modules/redux": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", "license": "MIT" }, "node_modules/redux-thunk": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", "license": "MIT", "peerDependencies": { @@ -14059,7 +13113,6 @@ }, "node_modules/refa": { "version": "0.12.1", - "resolved": "https://registry.npmjs.org/refa/-/refa-0.12.1.tgz", "integrity": "sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==", "dev": true, "license": "MIT", @@ -14072,7 +13125,6 @@ }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "license": "MIT", @@ -14095,14 +13147,12 @@ }, "node_modules/regenerate": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true, "license": "MIT" }, "node_modules/regenerate-unicode-properties": { "version": "10.2.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "dev": true, "license": "MIT", @@ -14115,7 +13165,6 @@ }, "node_modules/regexp-ast-analysis": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regexp-ast-analysis/-/regexp-ast-analysis-0.7.1.tgz", "integrity": "sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==", "dev": true, "license": "MIT", @@ -14129,7 +13178,6 @@ }, "node_modules/regexp-tree": { "version": "0.1.27", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", "dev": true, "license": "MIT", @@ -14139,7 +13187,6 @@ }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "license": "MIT", @@ -14160,7 +13207,6 @@ }, "node_modules/regexpu-core": { "version": "6.4.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", "dev": true, "license": "MIT", @@ -14178,14 +13224,12 @@ }, "node_modules/regjsgen": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", "dev": true, "license": "MIT" }, "node_modules/regjsparser": { "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.3.tgz", "integrity": "sha512-ycwFAS14Jw4mppvmK4GR/J6u3WpWpjkEApehuHtLc/8VpPNpDMbQ4WjqwplXifGeyKOzHSFLmSPqzksDQE2Sfg==", "dev": true, "license": "BSD-2-Clause", @@ -14198,7 +13242,6 @@ }, "node_modules/release-it": { "version": "21.0.2", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-21.0.2.tgz", "integrity": "sha512-QwyDnWiQNB4d8Hc2b5FLMHcsKz9S2O1dMNnPB7w+0knsL5r8+qbnznDA1X7Bw5D863+Ud7eRHc71Cfth5Tlrgg==", "dev": true, "funding": [ @@ -14245,7 +13288,6 @@ }, "node_modules/release-it/node_modules/open": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", "dev": true, "license": "MIT", @@ -14266,7 +13308,6 @@ }, "node_modules/release-it/node_modules/powershell-utils": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", "dev": true, "license": "MIT", @@ -14279,7 +13320,6 @@ }, "node_modules/release-it/node_modules/semver": { "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", @@ -14292,7 +13332,6 @@ }, "node_modules/release-it/node_modules/undici": { "version": "7.29.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.1.tgz", "integrity": "sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==", "dev": true, "license": "MIT", @@ -14302,7 +13341,6 @@ }, "node_modules/release-it/node_modules/wsl-utils": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", "dev": true, "license": "MIT", @@ -14319,7 +13357,6 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", @@ -14329,7 +13366,6 @@ }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "devOptional": true, "license": "MIT", @@ -14339,7 +13375,6 @@ }, "node_modules/requireindex": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", "dev": true, "license": "MIT", @@ -14349,13 +13384,11 @@ }, "node_modules/reselect": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.2.0.tgz", "integrity": "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==", "license": "MIT" }, "node_modules/reserved-identifiers": { "version": "1.2.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==", "dev": true, "license": "MIT", @@ -14368,7 +13401,6 @@ }, "node_modules/resolve": { "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", @@ -14390,7 +13422,6 @@ }, "node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", @@ -14400,7 +13431,6 @@ }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", @@ -14410,7 +13440,6 @@ }, "node_modules/restore-cursor": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", @@ -14427,7 +13456,6 @@ }, "node_modules/retry": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, "license": "MIT", @@ -14437,14 +13465,12 @@ }, "node_modules/rettime": { "version": "0.11.11", - "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.11.11.tgz", "integrity": "sha512-ILJRqVWBCTlg9r42fFgwVZx1gnFAcQF8mRoMkbgQfIrjEDf9nbBFDFx00oloOa+Q869FUtaYDXZvEfnecQSCoQ==", "dev": true, "license": "MIT" }, "node_modules/rolldown": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.8.tgz", "integrity": "sha512-Z67nTmhZe7anqnM/EjI392w5i/ANUinjip7QYsOyN37oayduxt3ksdX0hf5OOamkAd53BiIHfbfSzfUmzKFQqQ==", "dev": true, "license": "MIT", @@ -14478,7 +13504,6 @@ }, "node_modules/rollup": { "version": "4.63.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.4.tgz", "integrity": "sha512-4U0liVayNIoLp3GFl1FcI8561WepLnZ1rqfraGh7S9B3Ur5F9S283y8Futii7RUU2C/97tOBmBy7nYvhoiOpbQ==", "dev": true, "license": "MIT", @@ -14524,7 +13549,6 @@ }, "node_modules/run-applescript": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", "dev": true, "license": "MIT", @@ -14537,7 +13561,6 @@ }, "node_modules/safe-array-concat": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", "dev": true, "license": "MIT", @@ -14557,7 +13580,6 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ @@ -14578,7 +13600,6 @@ }, "node_modules/safe-push-apply": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, "license": "MIT", @@ -14595,7 +13616,6 @@ }, "node_modules/safe-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", "dev": true, "license": "MIT", @@ -14605,7 +13625,6 @@ }, "node_modules/safe-regex-test": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "license": "MIT", @@ -14623,14 +13642,12 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "license": "MIT" }, "node_modules/saxes": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dev": true, "license": "ISC", @@ -14643,13 +13660,11 @@ }, "node_modules/scheduler": { "version": "0.28.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", "license": "MIT" }, "node_modules/scslre": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/scslre/-/scslre-0.3.0.tgz", "integrity": "sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==", "dev": true, "license": "MIT", @@ -14664,7 +13679,6 @@ }, "node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", @@ -14674,7 +13688,6 @@ }, "node_modules/serialize-javascript": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.1.2.tgz", "integrity": "sha512-GL2BWwVa6JydKO6l/ljVgjAZF4QJ3S7dWDWi53s5GZT8PJzD2fNxi67HANQGKAqPrwEpL5ba7gUBGi0Ls/sEoQ==", "dev": true, "license": "BSD-3-Clause", @@ -14684,7 +13697,6 @@ }, "node_modules/set-function-length": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "license": "MIT", @@ -14702,7 +13714,6 @@ }, "node_modules/set-function-name": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "license": "MIT", @@ -14718,7 +13729,6 @@ }, "node_modules/set-proto": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", "dev": true, "license": "MIT", @@ -14733,7 +13743,6 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", @@ -14746,7 +13755,6 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", @@ -14756,7 +13764,6 @@ }, "node_modules/side-channel": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "dev": true, "license": "MIT", @@ -14776,7 +13783,6 @@ }, "node_modules/side-channel-list": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, "license": "MIT", @@ -14793,7 +13799,6 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, "license": "MIT", @@ -14812,7 +13817,6 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, "license": "MIT", @@ -14832,14 +13836,12 @@ }, "node_modules/siginfo": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, "license": "ISC" }, "node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", @@ -14852,7 +13854,6 @@ }, "node_modules/sirv": { "version": "3.0.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/sirv/-/sirv-3.0.2.tgz", "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", "dev": true, "license": "MIT", @@ -14867,14 +13868,12 @@ }, "node_modules/sisteransi": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true, "license": "MIT" }, "node_modules/smart-buffer": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, "license": "MIT", @@ -14885,7 +13884,6 @@ }, "node_modules/smob": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/smob/-/smob-1.6.2.tgz", "integrity": "sha512-RQsvleCbF8cVHEv+xuDGaA4pOizFqJ0GgjtMSRo6oP8pnN7WsigHgVGey6aILRBKv4W2YOMHLqbKdnB6hpB9fw==", "dev": true, "license": "MIT", @@ -14895,7 +13893,6 @@ }, "node_modules/smol-toml": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.8.0.tgz", "integrity": "sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==", "dev": true, "license": "BSD-3-Clause", @@ -14908,7 +13905,6 @@ }, "node_modules/socks": { "version": "2.8.10", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.10.tgz", "integrity": "sha512-e0VyvkVTwVYViNovRkZ9aodhxVlyoMn7eJhVUPxZ+eK9P/7CBkxvvsBOHqFPEH416726W8tLXXXjKwqgTErrCQ==", "dev": true, "license": "MIT", @@ -14923,7 +13919,6 @@ }, "node_modules/socks-proxy-agent": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-10.1.0.tgz", "integrity": "sha512-WlMj/67cEJ6MDI1OcsnjuYKDNDoyPCCYZ249kuuXPiMDw9F8PXkVaQ7YWu3siTydfQ/4BEZcvGzu+aYvz7dDCQ==", "dev": true, "license": "MIT", @@ -14938,7 +13933,6 @@ }, "node_modules/socks-proxy-agent/node_modules/agent-base": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-9.0.0.tgz", "integrity": "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==", "dev": true, "license": "MIT", @@ -14948,7 +13942,6 @@ }, "node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", @@ -14958,7 +13951,6 @@ }, "node_modules/source-map-js": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "license": "BSD-3-Clause", @@ -14968,7 +13960,6 @@ }, "node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "license": "MIT", @@ -14979,7 +13970,6 @@ }, "node_modules/stable-hash-x": { "version": "0.2.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/stable-hash-x/-/stable-hash-x-0.2.0.tgz", "integrity": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==", "dev": true, "license": "MIT", @@ -14989,14 +13979,12 @@ }, "node_modules/stackback": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, "license": "MIT" }, "node_modules/statuses": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "dev": true, "license": "MIT", @@ -15006,14 +13994,12 @@ }, "node_modules/std-env": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", "dev": true, "license": "MIT" }, "node_modules/stdin-discarder": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.2.tgz", "integrity": "sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==", "dev": true, "license": "MIT", @@ -15026,7 +14012,6 @@ }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", "dev": true, "license": "MIT", @@ -15040,7 +14025,6 @@ }, "node_modules/storybook": { "version": "10.6.0", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.6.0.tgz", "integrity": "sha512-H48X6AURAFTpfN2zEux6vNesee5Oq8Gxj1IanYmblPZ218sfKSeyyerF1NC7GD7BrruoC8L4/cU0zII4y+d6zw==", "dev": true, "license": "MIT", @@ -15089,7 +14073,6 @@ }, "node_modules/storybook/node_modules/@emnapi/core": { "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.0.tgz", "integrity": "sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==", "dev": true, "license": "MIT", @@ -15101,7 +14084,6 @@ }, "node_modules/storybook/node_modules/@emnapi/runtime": { "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.0.tgz", "integrity": "sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==", "dev": true, "license": "MIT", @@ -15112,7 +14094,6 @@ }, "node_modules/storybook/node_modules/@oxc-parser/binding-android-arm-eabi": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.127.0.tgz", "integrity": "sha512-0LC7ye4hvqbIKxAzThzvswgHLFu2AURKzYLeSVvLdu2TBOYWQDmHnTqPLeA597BcUCxiLqLsS4CJ5uoI5WYWCQ==", "cpu": [ "arm" @@ -15129,7 +14110,6 @@ }, "node_modules/storybook/node_modules/@oxc-parser/binding-android-arm64": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.127.0.tgz", "integrity": "sha512-b5jtVTH6AU5CJXHNdj7Jj9IEiR9yVjjnwHzPJhGyHGPdcsZSzBCkS9GBbV33niRMvKthDwQRFRJfI4a+k4PvYg==", "cpu": [ "arm64" @@ -15146,7 +14126,6 @@ }, "node_modules/storybook/node_modules/@oxc-parser/binding-darwin-arm64": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.127.0.tgz", "integrity": "sha512-obCE8B7ISKkJidjlhv9xRGJPOSDG2Yu6PRga9Ruaz35uintHxbp1Ki/Yc71wx4rj3Edrm0a1kzG1TAwit0wFpg==", "cpu": [ "arm64" @@ -15163,7 +14142,6 @@ }, "node_modules/storybook/node_modules/@oxc-parser/binding-darwin-x64": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.127.0.tgz", "integrity": "sha512-JL6Xb5IwPQT8rUzlpsX7E+AgfcdNklXNPFp8pjCQQ5MQOQo5rtEB2ui+3Hgg9Sn7Y9Egj6YOLLiHhLpdAe12Aw==", "cpu": [ "x64" @@ -15180,7 +14158,6 @@ }, "node_modules/storybook/node_modules/@oxc-parser/binding-freebsd-x64": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.127.0.tgz", "integrity": "sha512-SDQ/3MQFw58fqQz3Z1PhSKFF3JoCF4gmlNjziDm8X02tTahCw0qJbd7FGPDKw1i4VTBZene9JPyC3mHtSvi+wA==", "cpu": [ "x64" @@ -15197,7 +14174,6 @@ }, "node_modules/storybook/node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.127.0.tgz", "integrity": "sha512-Av+D1MIqzV0YMGPT9we2SIZaMKD7Cxs4CvXSx/yxaWHewZjYEjScpOf5igc8IILASViw4WTnjlwUdI1KzVtDHQ==", "cpu": [ "arm" @@ -15214,7 +14190,6 @@ }, "node_modules/storybook/node_modules/@oxc-parser/binding-linux-arm-musleabihf": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.127.0.tgz", "integrity": "sha512-Cs2fdJ8cPpFdeebj6p4dag8A4+56hPvZ0AhQQzlaLswGz1tz7bXt1nETLeorrM9+AMcWFFkqxcXwDGfTVidY8g==", "cpu": [ "arm" @@ -15231,7 +14206,6 @@ }, "node_modules/storybook/node_modules/@oxc-parser/binding-linux-arm64-gnu": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.127.0.tgz", "integrity": "sha512-qdOfTcT6SY8gsJrrV92uyEUyjqMGPpIB5JZUG6QN5dukYd+7/j0kX6MwK1DgQj39jtUYixxPiaRUiEN1+0CXgQ==", "cpu": [ "arm64" @@ -15248,7 +14222,6 @@ }, "node_modules/storybook/node_modules/@oxc-parser/binding-linux-arm64-musl": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.127.0.tgz", "integrity": "sha512-EoTCZneNFU/P2qrpEM+RHmQwt+CvDkyGESG6qhr7KaegXLZwePfbrkCDfAk8/rhxbDUVGsZILX+2tqPzFtoFWA==", "cpu": [ "arm64" @@ -15265,7 +14238,6 @@ }, "node_modules/storybook/node_modules/@oxc-parser/binding-linux-ppc64-gnu": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.127.0.tgz", "integrity": "sha512-zALjmZYgxFLHjXeudcDF0xFGNydTAtkAeXAr2EuC17ywCyFxcmQra4w0BMde0Yi/re4Bi4iwEoEXtYN7l6eBLQ==", "cpu": [ "ppc64" @@ -15282,7 +14254,6 @@ }, "node_modules/storybook/node_modules/@oxc-parser/binding-linux-riscv64-gnu": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.127.0.tgz", "integrity": "sha512-fPP8M6zQLS7Jz7o9d5ArUSuAuSK3e+WCYVrCpdzeCOejidtZExJ9tjhDrAd3HEPqARBCPmdpqxESPFqy44vkBQ==", "cpu": [ "riscv64" @@ -15299,7 +14270,6 @@ }, "node_modules/storybook/node_modules/@oxc-parser/binding-linux-riscv64-musl": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.127.0.tgz", "integrity": "sha512-7IcC4Ao02oGpfnjt+X/oF4U2mllo2qoSkw5xxiXNKL9MCTsTiAC6616beOuehdxGcnz1bRoPC1RQ2f1GQDdN+g==", "cpu": [ "riscv64" @@ -15316,7 +14286,6 @@ }, "node_modules/storybook/node_modules/@oxc-parser/binding-linux-s390x-gnu": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.127.0.tgz", "integrity": "sha512-pbXIhiNFHoqWeqDNLiJ9JkpHz1IM9k4DXa66x+1GTWMG7iLxtkXgE53iiuKSXwmk3zIYmaPVfBvgcAhS583K4Q==", "cpu": [ "s390x" @@ -15333,7 +14302,6 @@ }, "node_modules/storybook/node_modules/@oxc-parser/binding-linux-x64-gnu": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.127.0.tgz", "integrity": "sha512-MYCguB9RvBvlSd6gbuNI7QwiLoCCAlGnlRJFPrzLI6U1/9wkC/WK6LtBAUln55H1Ctqw45PWmqrobKoMhsYQzQ==", "cpu": [ "x64" @@ -15350,7 +14318,6 @@ }, "node_modules/storybook/node_modules/@oxc-parser/binding-linux-x64-musl": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.127.0.tgz", "integrity": "sha512-5eY0B/bxf1xIUxb4NOTvOI3KWtBQfPWYyKAzgcrCt0mDibSZygVpO1Pz8bkeiSZ5Jj9+M09dkggG3H8I5d0Uyg==", "cpu": [ "x64" @@ -15367,7 +14334,6 @@ }, "node_modules/storybook/node_modules/@oxc-parser/binding-openharmony-arm64": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.127.0.tgz", "integrity": "sha512-Gld0ajrFTUXNtdw20fVBuTQx66FA75nIVg+//pPfR3sXkuABB4mTBhl3r9JNzrJpgW//qiwxf0nWXUWGJSL3UQ==", "cpu": [ "arm64" @@ -15384,7 +14350,6 @@ }, "node_modules/storybook/node_modules/@oxc-parser/binding-win32-arm64-msvc": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.127.0.tgz", "integrity": "sha512-Ujvw4X+LD1CCGULcsQcvb4YNVoBGqt+JHgNNzGGaCImELiZLk477ifUH53gIbE7EKd933NdTi25JWEr9K2HwXw==", "cpu": [ "arm64" @@ -15401,7 +14366,6 @@ }, "node_modules/storybook/node_modules/@oxc-parser/binding-win32-ia32-msvc": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.127.0.tgz", "integrity": "sha512-0cwxKO7KHQQQfo4Uf4B2SQrhgm+cJaP9OvFFhx52Tkg4bezsacu83GB2/In5bC415Ueeym+kXdnge/57rbSfTw==", "cpu": [ "ia32" @@ -15418,7 +14382,6 @@ }, "node_modules/storybook/node_modules/@oxc-parser/binding-win32-x64-msvc": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.127.0.tgz", "integrity": "sha512-rOrnSQSCbhI2kowr9XxE7m9a8oQXnBHjnS6j95LxxAnEZ0+Fz20WlRXG4ondQb+ejjt2KOsa65sE6++L6kUd+w==", "cpu": [ "x64" @@ -15435,7 +14398,6 @@ }, "node_modules/storybook/node_modules/@oxc-project/types": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==", "dev": true, "license": "MIT", @@ -15445,7 +14407,6 @@ }, "node_modules/storybook/node_modules/@oxc-resolver/binding-android-arm-eabi": { "version": "11.21.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm-eabi/-/binding-android-arm-eabi-11.21.2.tgz", "integrity": "sha512-xQoCRv+gKax9KTdwdaQNnAFOai8neay7g3jExDIORzhbrejwGSJaZNTdOJHR5ziLg2joMxOCMOFMo4zuxza2uQ==", "cpu": [ "arm" @@ -15459,7 +14420,6 @@ }, "node_modules/storybook/node_modules/@oxc-resolver/binding-android-arm64": { "version": "11.21.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-android-arm64/-/binding-android-arm64-11.21.2.tgz", "integrity": "sha512-HF5oiE2L05yInPYCFD/4uxSrEZW4SuIfn99Y6L1xnJnzl066JR+MJs2rIdstw8A2MPlAKH+13dpFPNycjqzvGg==", "cpu": [ "arm64" @@ -15473,7 +14433,6 @@ }, "node_modules/storybook/node_modules/@oxc-resolver/binding-darwin-arm64": { "version": "11.21.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-arm64/-/binding-darwin-arm64-11.21.2.tgz", "integrity": "sha512-UX4u49CVCAD8QZNELaW8eMGgMAGwFWYEPbvNsh+3r/gs4NX3KfpiACMVwRQT0EuH3uat9hM5Zl+Ppm9pJD8tgg==", "cpu": [ "arm64" @@ -15487,7 +14446,6 @@ }, "node_modules/storybook/node_modules/@oxc-resolver/binding-darwin-x64": { "version": "11.21.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-darwin-x64/-/binding-darwin-x64-11.21.2.tgz", "integrity": "sha512-J9xPx7YBkrRmJ+xl561ztnMWEc1aOyjEIxBiGX1dVb3u7bGSnfObfcZk+Pd+uM0HZAPNsQ1xvD8j52A/uOSqNQ==", "cpu": [ "x64" @@ -15501,7 +14459,6 @@ }, "node_modules/storybook/node_modules/@oxc-resolver/binding-freebsd-x64": { "version": "11.21.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-freebsd-x64/-/binding-freebsd-x64-11.21.2.tgz", "integrity": "sha512-fRlt7OvSaQkWj6+EDTVxawVxOlqJB2QSnBfkeCyK4RTvsGctbw3BiH2Tb7DzMs7bikc4BRBpvWP5zF9K8b54Zg==", "cpu": [ "x64" @@ -15515,7 +14472,6 @@ }, "node_modules/storybook/node_modules/@oxc-resolver/binding-linux-arm-gnueabihf": { "version": "11.21.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-11.21.2.tgz", "integrity": "sha512-gK+vPUcPQITkGwBKpZGrcDHSlU6eDGl7AQacxS2CEKAZIBHWkOVFeJwLZ4tYnA1acJqRM5lt7yYwPCVqGHIJ7A==", "cpu": [ "arm" @@ -15529,7 +14485,6 @@ }, "node_modules/storybook/node_modules/@oxc-resolver/binding-linux-arm-musleabihf": { "version": "11.21.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-11.21.2.tgz", "integrity": "sha512-L/Rgas7SrOKy/z7IH+HxSFRqVO4PuLDKLEGKvnhoCBBq3UJ0YzGBou3qMzaAGgkJwsIvX2pBF+7ojzfUhLiZxQ==", "cpu": [ "arm" @@ -15543,7 +14498,6 @@ }, "node_modules/storybook/node_modules/@oxc-resolver/binding-linux-arm64-gnu": { "version": "11.21.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-11.21.2.tgz", "integrity": "sha512-CUEYvlX1Fk7E9kUMzuswru1J9HLxMwnpDeQGjQuI4ZH+iNCoa2X9T+pvyzrbsgl7WnIeTFTlNlHsRfVdf5g9/g==", "cpu": [ "arm64" @@ -15557,7 +14511,6 @@ }, "node_modules/storybook/node_modules/@oxc-resolver/binding-linux-arm64-musl": { "version": "11.21.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-arm64-musl/-/binding-linux-arm64-musl-11.21.2.tgz", "integrity": "sha512-ViN1ZibQyxwC67GpoP33oo+S9UyUnkog13vzQb9+v9bCNvrVzJuk0MRdacjtv/9xfRMVF/eqHFyl8YOeykI10Q==", "cpu": [ "arm64" @@ -15571,7 +14524,6 @@ }, "node_modules/storybook/node_modules/@oxc-resolver/binding-linux-ppc64-gnu": { "version": "11.21.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-11.21.2.tgz", "integrity": "sha512-CU1sCqWnhGqYD5I1HedHk5pujrn7ssDkNB/AEQd/pd3D/EojVSgJUlpbafwIbyhia3PgIfkvdFpRPWSALzVumA==", "cpu": [ "ppc64" @@ -15585,7 +14537,6 @@ }, "node_modules/storybook/node_modules/@oxc-resolver/binding-linux-riscv64-gnu": { "version": "11.21.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-11.21.2.tgz", "integrity": "sha512-jWVyZtIHca4Gb96x7dag+y69vlei7ffjrsveLkmf2ZhqEAz6ZSBnY1GWvgZUaZlwZP62A3xD092BW97Q5VGc+g==", "cpu": [ "riscv64" @@ -15599,7 +14550,6 @@ }, "node_modules/storybook/node_modules/@oxc-resolver/binding-linux-riscv64-musl": { "version": "11.21.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-11.21.2.tgz", "integrity": "sha512-LF29obFqNgBUgDX7rmUK7M4D0JQG5LxhYzn3xXmECcHU9aQAdWG7NiY052qybtesEdwHQXKNTWYQ7mTsybNvWg==", "cpu": [ "riscv64" @@ -15613,7 +14563,6 @@ }, "node_modules/storybook/node_modules/@oxc-resolver/binding-linux-s390x-gnu": { "version": "11.21.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-11.21.2.tgz", "integrity": "sha512-+NYcm+cCHBbtdQQ3A4phQTSuVRYnNHz7wrl9XRAPEovcdoqi0mb1K5ZOl+jN54ZD+q1zz3V0vltbFJmzecJKmw==", "cpu": [ "s390x" @@ -15627,7 +14576,6 @@ }, "node_modules/storybook/node_modules/@oxc-resolver/binding-linux-x64-gnu": { "version": "11.21.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-gnu/-/binding-linux-x64-gnu-11.21.2.tgz", "integrity": "sha512-UQqZDdG2r2HhAOsZEgufkIWHPQ886IUyuJQkoZByvzhW8j51R4UNzGBJFkTiTnLhQnggwJRdJgFWK4uY6ZVIMw==", "cpu": [ "x64" @@ -15641,7 +14589,6 @@ }, "node_modules/storybook/node_modules/@oxc-resolver/binding-linux-x64-musl": { "version": "11.21.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-linux-x64-musl/-/binding-linux-x64-musl-11.21.2.tgz", "integrity": "sha512-3Q9PMRjalWkT6NZ4jfujuqTCFwoWErg3y3BnOgb544B8IMw4PktiwWOigMfOHNRLMghZeJ7hpfpZf4CP7rV7Og==", "cpu": [ "x64" @@ -15655,7 +14602,6 @@ }, "node_modules/storybook/node_modules/@oxc-resolver/binding-openharmony-arm64": { "version": "11.21.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-openharmony-arm64/-/binding-openharmony-arm64-11.21.2.tgz", "integrity": "sha512-Eljeq3ndtyKhM+Es8LITi4Zl2htzuRZcrPMF3kMCsrILztvU6AjZ3FuEhHHKobPUB9rMpzLpJP5bDqXI7r+iog==", "cpu": [ "arm64" @@ -15669,7 +14615,6 @@ }, "node_modules/storybook/node_modules/@oxc-resolver/binding-wasm32-wasi": { "version": "11.21.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-wasm32-wasi/-/binding-wasm32-wasi-11.21.2.tgz", "integrity": "sha512-HGDbNsIywqc4LxU38+CTJNnB/6BF7rheWOJ259b4eE0aEnelYblC8x+1tEd63bp31fYne63RQz9Jb4yVnC7Yig==", "cpu": [ "wasm32" @@ -15688,7 +14633,6 @@ }, "node_modules/storybook/node_modules/@oxc-resolver/binding-win32-arm64-msvc": { "version": "11.21.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-11.21.2.tgz", "integrity": "sha512-iWx25CBEgH49iE9q5coEGI/jb1jl5kkCY9z6U5Og67xCkQ/WFMDc2J5U78+AE91SUxM2NqSLhJC8/PLfWnImww==", "cpu": [ "arm64" @@ -15702,7 +14646,6 @@ }, "node_modules/storybook/node_modules/@oxc-resolver/binding-win32-x64-msvc": { "version": "11.21.2", - "resolved": "https://registry.npmjs.org/@oxc-resolver/binding-win32-x64-msvc/-/binding-win32-x64-msvc-11.21.2.tgz", "integrity": "sha512-VPoCAhKvCQTlG7vxqaBXcmuvbh77BfnGXj8g0pbvVXpm1F/R8rDVwqIWcEbMzrI1JvJlm8v7T9uMVQb6UctMRg==", "cpu": [ "x64" @@ -15716,7 +14659,6 @@ }, "node_modules/storybook/node_modules/@testing-library/jest-dom": { "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", "dev": true, "license": "MIT", @@ -15736,7 +14678,6 @@ }, "node_modules/storybook/node_modules/@vitest/expect": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", "dev": true, "license": "MIT", @@ -15753,7 +14694,6 @@ }, "node_modules/storybook/node_modules/@vitest/pretty-format": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", "dev": true, "license": "MIT", @@ -15766,7 +14706,6 @@ }, "node_modules/storybook/node_modules/@vitest/spy": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", "dev": true, "license": "MIT", @@ -15779,7 +14718,6 @@ }, "node_modules/storybook/node_modules/@vitest/utils": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", "dev": true, "license": "MIT", @@ -15794,7 +14732,6 @@ }, "node_modules/storybook/node_modules/chai": { "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "dev": true, "license": "MIT", @@ -15811,14 +14748,12 @@ }, "node_modules/storybook/node_modules/dom-accessibility-api": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", "dev": true, "license": "MIT" }, "node_modules/storybook/node_modules/oxc-parser": { "version": "0.127.0", - "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.127.0.tgz", "integrity": "sha512-bkgD4qHlN7WxLdX8bLXdaU54TtQtAIg/ZBAfm0aje/mo3MRDo3P0hZSgr4U7O3xfX+fQmR5AP04JS/TGcZLcFA==", "dev": true, "license": "MIT", @@ -15856,7 +14791,6 @@ }, "node_modules/storybook/node_modules/oxc-resolver": { "version": "11.21.2", - "resolved": "https://registry.npmjs.org/oxc-resolver/-/oxc-resolver-11.21.2.tgz", "integrity": "sha512-w5tLwYN3Zo24w5EeWJjJWZOwhYqTtC8PS2B1tIt7BZUuqTIcU07sQValbDw+rq7+AuAGzOHklgK+ifsy4lpXfw==", "dev": true, "license": "MIT", @@ -15887,7 +14821,6 @@ }, "node_modules/storybook/node_modules/semver": { "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", @@ -15900,7 +14833,6 @@ }, "node_modules/storybook/node_modules/tinyrainbow": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, "license": "MIT", @@ -15910,14 +14842,12 @@ }, "node_modules/strict-event-emitter": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", "dev": true, "license": "MIT" }, "node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "license": "MIT", @@ -15927,7 +14857,6 @@ }, "node_modules/string-argv": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, "license": "MIT", @@ -15937,14 +14866,12 @@ }, "node_modules/string-ts": { "version": "2.3.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/string-ts/-/string-ts-2.3.1.tgz", "integrity": "sha512-xSJq+BS52SaFFAVxuStmx6n5aYZU571uYUnUrPXkPFCfdHyZMMlbP2v2Wx5sNBnAVzq/2+0+mcBLBa3Xa5ubYw==", "dev": true, "license": "MIT" }, "node_modules/string-width": { "version": "8.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", "dev": true, "license": "MIT", @@ -15961,7 +14888,6 @@ }, "node_modules/string.prototype.matchall": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.1.0.tgz", "integrity": "sha512-tHNHTxInrYLCga9O9YGxWA3G9/nnzQw8UGAyqGx3Ar1pSTTzIuM4woFSq4SowkXCjJIwq5sIiQvEfRI9tCH1qQ==", "dev": true, "license": "MIT", @@ -15989,7 +14915,6 @@ }, "node_modules/string.prototype.trim": { "version": "1.2.11", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", "dev": true, "license": "MIT", @@ -16012,7 +14937,6 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", "dev": true, "license": "MIT", @@ -16031,7 +14955,6 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "license": "MIT", @@ -16049,7 +14972,6 @@ }, "node_modules/stringify-object": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "dev": true, "license": "BSD-2-Clause", @@ -16064,7 +14986,6 @@ }, "node_modules/strip-ansi": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", @@ -16080,7 +15001,6 @@ }, "node_modules/strip-ansi/node_modules/ansi-regex": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", "dev": true, "license": "MIT", @@ -16093,7 +15013,6 @@ }, "node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", @@ -16103,7 +15022,6 @@ }, "node_modules/strip-comments": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", "dev": true, "license": "MIT", @@ -16113,7 +15031,6 @@ }, "node_modules/strip-indent": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, "license": "MIT", @@ -16126,7 +15043,6 @@ }, "node_modules/strip-json-comments": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz", "integrity": "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==", "dev": true, "license": "MIT", @@ -16139,7 +15055,6 @@ }, "node_modules/supports-color": { "version": "10.2.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", "dev": true, "license": "MIT", @@ -16152,7 +15067,6 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "license": "MIT", @@ -16165,20 +15079,17 @@ }, "node_modules/symbol-tree": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true, "license": "MIT" }, "node_modules/tabbable": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz", "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==", "license": "MIT" }, "node_modules/tagged-tag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", "license": "MIT", "engines": { @@ -16190,7 +15101,6 @@ }, "node_modules/tapable": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "dev": true, "license": "MIT", @@ -16204,7 +15114,6 @@ }, "node_modules/temp-dir": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, "license": "MIT", @@ -16214,7 +15123,6 @@ }, "node_modules/tempy": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", "dev": true, "license": "MIT", @@ -16233,7 +15141,6 @@ }, "node_modules/tempy/node_modules/type-fest": { "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", "dev": true, "license": "(MIT OR CC0-1.0)", @@ -16246,7 +15153,6 @@ }, "node_modules/terser": { "version": "5.51.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.51.2.tgz", "integrity": "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==", "dev": true, "license": "BSD-2-Clause", @@ -16265,20 +15171,17 @@ }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "license": "MIT" }, "node_modules/tiny-invariant": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "license": "MIT" }, "node_modules/tinybench": { "version": "6.1.4", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-6.1.4.tgz", "integrity": "sha512-9APumHG7r4yOk4X4WlkmE71aZcv1gvin1czO3OQ1U9iJcFA5Ja/ygyb0vPOVHTthFozUYs8CLoLUlM8grb2lTQ==", "dev": true, "license": "MIT", @@ -16288,7 +15191,6 @@ }, "node_modules/tinyexec": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", "dev": true, "license": "MIT", @@ -16298,7 +15200,6 @@ }, "node_modules/tinyglobby": { "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", @@ -16315,7 +15216,6 @@ }, "node_modules/tinyrainbow": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.1.tgz", "integrity": "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==", "dev": true, "license": "MIT", @@ -16325,7 +15225,6 @@ }, "node_modules/tinyspy": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.6.tgz", "integrity": "sha512-u8KszXvGfU68hVcZpRHKG28T0krMuv2G5nDhiHaMLen/gIuFEgIJhaJuO69qjnXg5paSrbPMFfx3brNuN8eVSg==", "dev": true, "license": "MIT", @@ -16335,7 +15234,6 @@ }, "node_modules/tldts": { "version": "7.4.10", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.10.tgz", "integrity": "sha512-GgouD1B+sWwvkaEq8vXC15DjQitxbvs12oIXELpconwm+Tg3zfcEv4jgzq3vtKverDXsg3VI8aRgNL2Nra0Iog==", "dev": true, "license": "MIT", @@ -16348,14 +15246,12 @@ }, "node_modules/tldts-core": { "version": "7.4.10", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.10.tgz", "integrity": "sha512-KnQjp53ZekKgm/r3l+u8kJGGzYgrWdP8+Mql7a4vijh2WE0IrZWspQj/TpTxDho/YxO+AnOZnIjQcCD+q6iJsw==", "dev": true, "license": "MIT" }, "node_modules/totalist": { "version": "3.0.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/totalist/-/totalist-3.0.1.tgz", "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, "license": "MIT", @@ -16365,7 +15261,6 @@ }, "node_modules/tough-cookie": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.2.tgz", "integrity": "sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==", "dev": true, "license": "BSD-3-Clause", @@ -16378,7 +15273,6 @@ }, "node_modules/tr46": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", "dev": true, "license": "MIT", @@ -16391,7 +15285,6 @@ }, "node_modules/ts-api-utils": { "version": "2.5.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/ts-api-utils/-/ts-api-utils-2.5.0.tgz", "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, "license": "MIT", @@ -16404,7 +15297,6 @@ }, "node_modules/ts-dedent": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.3.0.tgz", "integrity": "sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==", "dev": true, "license": "MIT", @@ -16414,14 +15306,12 @@ }, "node_modules/ts-pattern": { "version": "5.9.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/ts-pattern/-/ts-pattern-5.9.0.tgz", "integrity": "sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==", "dev": true, "license": "MIT" }, "node_modules/tsconfig-paths": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "license": "MIT", @@ -16436,7 +15326,6 @@ }, "node_modules/tsconfig-paths-webpack-plugin": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.2.0.tgz", "integrity": "sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==", "dev": true, "license": "MIT", @@ -16452,13 +15341,11 @@ }, "node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", @@ -16471,7 +15358,6 @@ }, "node_modules/type-fest": { "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, "license": "(MIT OR CC0-1.0)", @@ -16484,7 +15370,6 @@ }, "node_modules/typed-array-buffer": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "license": "MIT", @@ -16499,7 +15384,6 @@ }, "node_modules/typed-array-byte-length": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "license": "MIT", @@ -16519,7 +15403,6 @@ }, "node_modules/typed-array-byte-offset": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.5.tgz", "integrity": "sha512-0FHJvLPqZ7KJzp17O13jfsAjsqazgrxBu2zEK95PmUz8lv2+GjRuxUInCr2Rk9Dms3ihN21zJ929ZO43yJ95QQ==", "dev": true, "license": "MIT", @@ -16540,7 +15423,6 @@ }, "node_modules/typed-array-length": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", "dev": true, "license": "MIT", @@ -16561,14 +15443,12 @@ }, "node_modules/typedarray": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true, "license": "MIT" }, "node_modules/typescript": { "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", @@ -16582,7 +15462,6 @@ }, "node_modules/typescript-eslint": { "version": "8.70.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/typescript-eslint/-/typescript-eslint-8.70.1.tgz", "integrity": "sha512-AcWG7KDjZ2THNXsgwttMaGmzVi0VFRlFYfqFHYQRbDpF3owuYbuiL8c7UUrd2k8s3PoSfIQrWfrGXfcElrWLYA==", "dev": true, "license": "MIT", @@ -16606,7 +15485,6 @@ }, "node_modules/unbash": { "version": "4.0.11", - "resolved": "https://registry.npmjs.org/unbash/-/unbash-4.0.11.tgz", "integrity": "sha512-FoSOKV7NEofQSkAefMVHam4ZPKYMxjAydxiV72UFEDNV/YofxjGfiZ2A9pZjdL/lRJzTjcu4PABo1JYJX8N5iQ==", "dev": true, "license": "ISC", @@ -16616,7 +15494,6 @@ }, "node_modules/unbox-primitive": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "license": "MIT", @@ -16635,7 +15512,6 @@ }, "node_modules/undici": { "version": "8.10.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.2.tgz", "integrity": "sha512-/y4/bH9YNU5hi9NIrpOuvGXFcxrj3CMrV+/AYpowAYTpHn8gX/XPFjNy766FPoYY0miQhdW977JFWKGNhBdwyQ==", "dev": true, "license": "MIT", @@ -16645,14 +15521,12 @@ }, "node_modules/undici-types": { "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, "license": "MIT", @@ -16662,7 +15536,6 @@ }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "license": "MIT", @@ -16676,7 +15549,6 @@ }, "node_modules/unicode-match-property-value-ecmascript": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", "dev": true, "license": "MIT", @@ -16686,7 +15558,6 @@ }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", "dev": true, "license": "MIT", @@ -16696,7 +15567,6 @@ }, "node_modules/unique-string": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "license": "MIT", @@ -16709,14 +15579,12 @@ }, "node_modules/universal-user-agent": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", "dev": true, "license": "ISC" }, "node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", @@ -16726,7 +15594,6 @@ }, "node_modules/unplugin": { "version": "2.3.11", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", "dev": true, "license": "MIT", @@ -16742,7 +15609,6 @@ }, "node_modules/unrs-resolver": { "version": "1.12.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/unrs-resolver/-/unrs-resolver-1.12.2.tgz", "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==", "dev": true, "hasInstallScript": true, @@ -16780,7 +15646,6 @@ }, "node_modules/until-async": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", "dev": true, "license": "MIT", @@ -16790,7 +15655,6 @@ }, "node_modules/upath": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true, "license": "MIT", @@ -16801,7 +15665,6 @@ }, "node_modules/update-browserslist-db": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz", "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==", "dev": true, "funding": [ @@ -16832,7 +15695,6 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", @@ -16842,14 +15704,12 @@ }, "node_modules/uri-js-replace": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz", "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==", "dev": true, "license": "MIT" }, "node_modules/url-join": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", "dev": true, "license": "MIT", @@ -16859,7 +15719,6 @@ }, "node_modules/use-callback-ref": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", "license": "MIT", "dependencies": { @@ -16880,7 +15739,6 @@ }, "node_modules/use-sidecar": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", "license": "MIT", "dependencies": { @@ -16902,7 +15760,6 @@ }, "node_modules/use-sync-external-store": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", "license": "MIT", "peerDependencies": { @@ -16911,14 +15768,12 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true, "license": "MIT" }, "node_modules/verkit": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/verkit/-/verkit-0.3.2.tgz", "integrity": "sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==", "dev": true, "license": "MIT", @@ -16931,7 +15786,6 @@ }, "node_modules/victory-vendor": { "version": "37.3.6", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", "license": "MIT AND ISC", "dependencies": { @@ -16953,7 +15807,6 @@ }, "node_modules/vite": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.0.tgz", "integrity": "sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ==", "dev": true, "license": "MIT", @@ -17031,7 +15884,6 @@ }, "node_modules/vite-plugin-pwa": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-1.3.0.tgz", "integrity": "sha512-c5kMgN+ITrOtHXp8PAtk2uOIEea6XjP/unCGxOWWBzQ6qa65qj/awHg0wf+QF9E/2u9vh86LqxPwzEPNbM2r5A==", "dev": true, "license": "MIT", @@ -17062,7 +15914,6 @@ }, "node_modules/vite/node_modules/picomatch": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", @@ -17075,7 +15926,6 @@ }, "node_modules/vitest": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-5.0.0.tgz", "integrity": "sha512-gpsMNoRhMjMktVxPtstOH4/PJuPyovVaMDr4oDilXaGH1EcqM2OE96SoHT2VIQ6fTGtTjqmHDrEu2X9RQiXf8Q==", "dev": true, "license": "MIT", @@ -17158,7 +16008,6 @@ }, "node_modules/vitest/node_modules/picomatch": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", @@ -17171,7 +16020,6 @@ }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dev": true, "license": "MIT", @@ -17184,7 +16032,6 @@ }, "node_modules/walk-up-path": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz", "integrity": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==", "dev": true, "license": "ISC", @@ -17194,7 +16041,6 @@ }, "node_modules/watskeburt": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/watskeburt/-/watskeburt-6.0.0.tgz", "integrity": "sha512-jfiuDABaxSkC71T6oZ3vCS99roYkSHm/+As+G0Dz8taAHQb+SJBvLEm5RlsgG71XdfAj3rv7eudUBTgwcQUPlQ==", "dev": true, "license": "MIT", @@ -17207,7 +16053,6 @@ }, "node_modules/webidl-conversions": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", "dev": true, "license": "BSD-2-Clause", @@ -17217,14 +16062,12 @@ }, "node_modules/webpack-virtual-modules": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", "dev": true, "license": "MIT" }, "node_modules/whatwg-mimetype": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", "dev": true, "license": "MIT", @@ -17234,7 +16077,6 @@ }, "node_modules/whatwg-url": { "version": "17.1.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-17.1.1.tgz", "integrity": "sha512-ohjk1mdUebJVadRt3bAhQhx8lSnISq+GDttK79LFl8EHQkAPvzwctoasC4hs8tBt6kLAncBWWyq1N52qEfKvDw==", "dev": true, "license": "MIT", @@ -17249,7 +16091,6 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", @@ -17265,7 +16106,6 @@ }, "node_modules/which-boxed-primitive": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, "license": "MIT", @@ -17285,7 +16125,6 @@ }, "node_modules/which-builtin-type": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, "license": "MIT", @@ -17313,7 +16152,6 @@ }, "node_modules/which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "license": "MIT", @@ -17332,7 +16170,6 @@ }, "node_modules/which-typed-array": { "version": "1.1.24", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.24.tgz", "integrity": "sha512-wk4Mf4pR5mRP7eYuuTBCIQ9d0ud2Fv2jRLQpfgnRjbOxAFHmjKFValgTpitVKzJJS8ajnYQV2Du1SZ8j6b/EUQ==", "dev": true, "license": "MIT", @@ -17354,7 +16191,6 @@ }, "node_modules/why-is-node-running": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", @@ -17371,14 +16207,12 @@ }, "node_modules/wildcard-match": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.4.tgz", "integrity": "sha512-wldeCaczs8XXq7hj+5d/F38JE2r7EXgb6WQDM84RVwxy81T/sxB5e9+uZLK9Q9oNz1mlvjut+QtvgaOQFPVq/g==", "dev": true, "license": "ISC" }, "node_modules/windows-release": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-7.1.1.tgz", "integrity": "sha512-0GBwC9WmR8Bm3WYiz3FC391054BsFHZ2gzBVdYj9uj5eIVYzbn/YPYCYW9SWdh9vwnLuzpn1UGwJKiMG4F236w==", "dev": true, "license": "MIT", @@ -17394,7 +16228,6 @@ }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", @@ -17404,7 +16237,6 @@ }, "node_modules/workbox-background-sync": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.4.1.tgz", "integrity": "sha512-HhT7KE8tOWDm02wRNshXUnUPofMlhenF2DBdUnDPOubhizzPeItkYTmAB6td1Z2cjYPa98vzEiPLEuzn5hN66g==", "dev": true, "license": "MIT", @@ -17415,7 +16247,6 @@ }, "node_modules/workbox-broadcast-update": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.4.1.tgz", "integrity": "sha512-uAlgslKLvbQY+suirIdnBCSYrcgBhjp81Nj4l1lj/Jmj0MJO2CJERnCJjT0GFVwmReV0N+zs78K6gqd5gr9/+A==", "dev": true, "license": "MIT", @@ -17425,7 +16256,6 @@ }, "node_modules/workbox-build": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.4.1.tgz", "integrity": "sha512-SDhxIvEAde9Gy/5w4Yo1Jh/M49Z0qE3q0oteyE8zGq0DScxFqVBcCtIXFuLtmtxRQZCMbf0prco4VyEu3KBQuw==", "dev": true, "license": "MIT", @@ -17474,7 +16304,6 @@ }, "node_modules/workbox-build/node_modules/@babel/compat-data": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", @@ -17484,7 +16313,6 @@ }, "node_modules/workbox-build/node_modules/@babel/core": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", @@ -17515,7 +16343,6 @@ }, "node_modules/workbox-build/node_modules/@babel/helper-compilation-targets": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", @@ -17532,7 +16359,6 @@ }, "node_modules/workbox-build/node_modules/@babel/helper-create-class-features-plugin": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", "dev": true, "license": "MIT", @@ -17554,7 +16380,6 @@ }, "node_modules/workbox-build/node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz", "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==", "dev": true, "license": "MIT", @@ -17572,7 +16397,6 @@ }, "node_modules/workbox-build/node_modules/@babel/helper-define-polyfill-provider": { "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", "dev": true, "license": "MIT", @@ -17589,7 +16413,6 @@ }, "node_modules/workbox-build/node_modules/@babel/helper-module-transforms": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", @@ -17607,7 +16430,6 @@ }, "node_modules/workbox-build/node_modules/@babel/helper-remap-async-to-generator": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz", "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==", "dev": true, "license": "MIT", @@ -17625,7 +16447,6 @@ }, "node_modules/workbox-build/node_modules/@babel/helper-replace-supers": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", "dev": true, "license": "MIT", @@ -17643,7 +16464,6 @@ }, "node_modules/workbox-build/node_modules/@babel/helper-validator-option": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", @@ -17653,7 +16473,6 @@ }, "node_modules/workbox-build/node_modules/@babel/helpers": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", @@ -17667,7 +16486,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz", "integrity": "sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==", "dev": true, "license": "MIT", @@ -17684,7 +16502,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz", "integrity": "sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==", "dev": true, "license": "MIT", @@ -17700,7 +16517,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz", "integrity": "sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==", "dev": true, "license": "MIT", @@ -17716,7 +16532,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz", "integrity": "sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==", "dev": true, "license": "MIT", @@ -17733,7 +16548,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz", "integrity": "sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==", "dev": true, "license": "MIT", @@ -17751,7 +16565,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz", "integrity": "sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==", "dev": true, "license": "MIT", @@ -17768,7 +16581,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, "license": "MIT", @@ -17781,7 +16593,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz", "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==", "dev": true, "license": "MIT", @@ -17797,7 +16608,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", "dev": true, "license": "MIT", @@ -17813,7 +16623,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "license": "MIT", @@ -17830,7 +16639,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", "dev": true, "license": "MIT", @@ -17846,7 +16654,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-async-generator-functions": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz", "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==", "dev": true, "license": "MIT", @@ -17864,7 +16671,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz", "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==", "dev": true, "license": "MIT", @@ -17882,7 +16688,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz", "integrity": "sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==", "dev": true, "license": "MIT", @@ -17898,7 +16703,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-block-scoping": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz", "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==", "dev": true, "license": "MIT", @@ -17914,7 +16718,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-class-properties": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==", "dev": true, "license": "MIT", @@ -17931,7 +16734,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-class-static-block": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz", "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==", "dev": true, "license": "MIT", @@ -17948,7 +16750,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-classes": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz", "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==", "dev": true, "license": "MIT", @@ -17969,7 +16770,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-computed-properties": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz", "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==", "dev": true, "license": "MIT", @@ -17986,7 +16786,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-destructuring": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz", "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==", "dev": true, "license": "MIT", @@ -18003,7 +16802,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz", "integrity": "sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==", "dev": true, "license": "MIT", @@ -18020,7 +16818,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz", "integrity": "sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==", "dev": true, "license": "MIT", @@ -18036,7 +16833,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz", "integrity": "sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==", "dev": true, "license": "MIT", @@ -18053,7 +16849,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-dynamic-import": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz", "integrity": "sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==", "dev": true, "license": "MIT", @@ -18069,7 +16864,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-explicit-resource-management": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz", "integrity": "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==", "dev": true, "license": "MIT", @@ -18086,7 +16880,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz", "integrity": "sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==", "dev": true, "license": "MIT", @@ -18102,7 +16895,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-export-namespace-from": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz", "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==", "dev": true, "license": "MIT", @@ -18118,7 +16910,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-for-of": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz", "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==", "dev": true, "license": "MIT", @@ -18135,7 +16926,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-function-name": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz", "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==", "dev": true, "license": "MIT", @@ -18153,7 +16943,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-json-strings": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz", "integrity": "sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==", "dev": true, "license": "MIT", @@ -18169,7 +16958,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-literals": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz", "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==", "dev": true, "license": "MIT", @@ -18185,7 +16973,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-logical-assignment-operators": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz", "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==", "dev": true, "license": "MIT", @@ -18201,7 +16988,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz", "integrity": "sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==", "dev": true, "license": "MIT", @@ -18217,7 +17003,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-modules-amd": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz", "integrity": "sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==", "dev": true, "license": "MIT", @@ -18234,7 +17019,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", "dev": true, "license": "MIT", @@ -18251,7 +17035,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.8.tgz", "integrity": "sha512-6iSnEK0zlkLKU4heofK/AdmRD4e2SHVpJMtrwnTCzhnaM98ria4rTrOXBBi45BTTYnJtO8txnPsX4fChYXkmeA==", "dev": true, "license": "MIT", @@ -18270,7 +17053,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-modules-umd": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz", "integrity": "sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==", "dev": true, "license": "MIT", @@ -18287,7 +17069,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz", "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==", "dev": true, "license": "MIT", @@ -18304,7 +17085,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-new-target": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz", "integrity": "sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==", "dev": true, "license": "MIT", @@ -18320,7 +17100,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-nullish-coalescing-operator": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==", "dev": true, "license": "MIT", @@ -18336,7 +17115,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-numeric-separator": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz", "integrity": "sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==", "dev": true, "license": "MIT", @@ -18352,7 +17130,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-object-rest-spread": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz", "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==", "dev": true, "license": "MIT", @@ -18372,7 +17149,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-object-super": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz", "integrity": "sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==", "dev": true, "license": "MIT", @@ -18389,7 +17165,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-optional-catch-binding": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz", "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==", "dev": true, "license": "MIT", @@ -18405,7 +17180,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-optional-chaining": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==", "dev": true, "license": "MIT", @@ -18422,7 +17196,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-parameters": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz", "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==", "dev": true, "license": "MIT", @@ -18438,7 +17211,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-private-methods": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz", "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==", "dev": true, "license": "MIT", @@ -18455,7 +17227,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-private-property-in-object": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz", "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==", "dev": true, "license": "MIT", @@ -18473,7 +17244,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-property-literals": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz", "integrity": "sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==", "dev": true, "license": "MIT", @@ -18489,7 +17259,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-regenerator": { "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.8.tgz", "integrity": "sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg==", "dev": true, "license": "MIT", @@ -18505,7 +17274,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-regexp-modifiers": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz", "integrity": "sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==", "dev": true, "license": "MIT", @@ -18522,7 +17290,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-reserved-words": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz", "integrity": "sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==", "dev": true, "license": "MIT", @@ -18538,7 +17305,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz", "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==", "dev": true, "license": "MIT", @@ -18554,7 +17320,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-spread": { "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.8.tgz", "integrity": "sha512-4S9ksMGVWUshvgK0mKfvZky7leuG5/uoFVwMpAomJ8bMoDJiNHRVmc1EglwW/CmGVSqqWpEbXm9FmbRit22qoA==", "dev": true, "license": "MIT", @@ -18571,7 +17336,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz", "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==", "dev": true, "license": "MIT", @@ -18587,7 +17351,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-template-literals": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz", "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==", "dev": true, "license": "MIT", @@ -18603,7 +17366,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz", "integrity": "sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==", "dev": true, "license": "MIT", @@ -18619,7 +17381,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz", "integrity": "sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==", "dev": true, "license": "MIT", @@ -18635,7 +17396,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-unicode-property-regex": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz", "integrity": "sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==", "dev": true, "license": "MIT", @@ -18652,7 +17412,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz", "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==", "dev": true, "license": "MIT", @@ -18669,7 +17428,6 @@ }, "node_modules/workbox-build/node_modules/@babel/plugin-transform-unicode-sets-regex": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz", "integrity": "sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==", "dev": true, "license": "MIT", @@ -18686,7 +17444,6 @@ }, "node_modules/workbox-build/node_modules/@babel/preset-env": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.7.tgz", "integrity": "sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==", "dev": true, "license": "MIT", @@ -18772,7 +17529,6 @@ }, "node_modules/workbox-build/node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "license": "MIT", @@ -18787,7 +17543,6 @@ }, "node_modules/workbox-build/node_modules/@rollup/plugin-babel": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.1.0.tgz", "integrity": "sha512-dFZNuFD2YRcoomP4oYf+DvQNSUA9ih+A3vUqopQx5EdtPGo3WBnQcI/S8pwpz91UsGfL0HsMSOlaMld8HrbubA==", "dev": true, "license": "MIT", @@ -18814,7 +17569,6 @@ }, "node_modules/workbox-build/node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.17", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", "dev": true, "license": "MIT", @@ -18829,7 +17583,6 @@ }, "node_modules/workbox-build/node_modules/babel-plugin-polyfill-corejs3": { "version": "0.14.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", "dev": true, "license": "MIT", @@ -18843,7 +17596,6 @@ }, "node_modules/workbox-build/node_modules/babel-plugin-polyfill-regenerator": { "version": "0.6.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", "dev": true, "license": "MIT", @@ -18856,7 +17608,6 @@ }, "node_modules/workbox-build/node_modules/glob": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, @@ -18881,7 +17632,6 @@ }, "node_modules/workbox-build/node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", @@ -18891,7 +17641,6 @@ }, "node_modules/workbox-build/node_modules/pretty-bytes": { "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, "license": "MIT", @@ -18904,7 +17653,6 @@ }, "node_modules/workbox-build/node_modules/source-map": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0.tgz", "integrity": "sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ==", "dev": true, "license": "BSD-3-Clause", @@ -18914,7 +17662,6 @@ }, "node_modules/workbox-cacheable-response": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.4.1.tgz", "integrity": "sha512-8xaFoJdDc2OjrlbbL3gEeBO1WKcMwRqwLRupgqahYXu75yXajPLuwrbXMrIGZuWYXrQwk0xDjOxZ/ujCy/oJYw==", "dev": true, "license": "MIT", @@ -18924,14 +17671,12 @@ }, "node_modules/workbox-core": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.4.1.tgz", "integrity": "sha512-DT+vu46eh/2vRsSHTY4Xmc32Z1rr9PRlQUXr1Dx30ZuXRWwOsvZgGgcwxcasubQLQmbTNYZjv44LkBAQ4tT5tQ==", "dev": true, "license": "MIT" }, "node_modules/workbox-expiration": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.4.1.tgz", "integrity": "sha512-lRKUF7b+OGbeXkQk1s6MHXOa3d7Xxf7Of31W6c6hCfipfIyrtdWZ89stq21AHZMaoG7VNFoHply4Ox+rU31TWg==", "dev": true, "license": "MIT", @@ -18942,7 +17687,6 @@ }, "node_modules/workbox-google-analytics": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.4.1.tgz", "integrity": "sha512-Mks1JwLEt++ZAkF6sS1OpSh9RtAMIsiDgRpK+codiHGIPXeaUOgi4cPc3GFadUl8V5QPeypEk8Oxgl3HlwVzHw==", "dev": true, "license": "MIT", @@ -18955,7 +17699,6 @@ }, "node_modules/workbox-navigation-preload": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.4.1.tgz", "integrity": "sha512-C4KVsjPcYKJOhr631AxR9XoG2rLF3QiTk5aMv36MXOjtWvm8axwNFAtKUPGsWUwLXXAMgYM1En7fsvndaXeXRQ==", "dev": true, "license": "MIT", @@ -18965,7 +17708,6 @@ }, "node_modules/workbox-precaching": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.4.1.tgz", "integrity": "sha512-cdr/9qByww7yzEp7zg/qI4ukUrrNjQLgN+ONQRpjy/VqGQXwkgHwr00KksGJK8v0VifwDXBb8a4cWNZH71jn3Q==", "dev": true, "license": "MIT", @@ -18977,7 +17719,6 @@ }, "node_modules/workbox-range-requests": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.4.1.tgz", "integrity": "sha512-7i2oxAUE82gHdAJBCAQ04JzNOdRPqzuOzGfoUyJpFSmeqBNYGPrAH8GPoPjUQTfp+NycwrD2H68VtuF8qxv0vQ==", "dev": true, "license": "MIT", @@ -18987,7 +17728,6 @@ }, "node_modules/workbox-recipes": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.4.1.tgz", "integrity": "sha512-gnbVfmV4/TtmQaM4x9AtuXhcdstJsep3XMVeztOrQVPT+R6+6DeBjGTCQ7fFCXm+4GEHUA5VEBTyi5+4gWGeog==", "dev": true, "license": "MIT", @@ -19002,7 +17742,6 @@ }, "node_modules/workbox-routing": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.4.1.tgz", "integrity": "sha512-yubJGErZOusuidAenaL5ypfhQOa7urxP/f8E0ws7FPb4039RiWXUWBAyUkmUoOL/BcQGen3h0J8872d51IYxtA==", "dev": true, "license": "MIT", @@ -19012,7 +17751,6 @@ }, "node_modules/workbox-strategies": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.4.1.tgz", "integrity": "sha512-GZxpaw9NbmOelj7667uZ2kpk5BFpOGbO4X0qjwh5ls8XQ8C+Lha5LQchTiUzsTFSS+NlUpftYAyOVXvQUrcqOQ==", "dev": true, "license": "MIT", @@ -19022,7 +17760,6 @@ }, "node_modules/workbox-streams": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.4.1.tgz", "integrity": "sha512-HWWtraKUbJknd9kgqGcpQ3G114HOPYvqs8HaJMDs2ebLNAimDkVDaWfAXE6Ybl+m8U6KsCE6pWyLYuigWmnAXw==", "dev": true, "license": "MIT", @@ -19033,14 +17770,12 @@ }, "node_modules/workbox-sw": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.4.1.tgz", "integrity": "sha512-fez5f2DUlDJWTFYkCWQpY10N8gtztd849NswCbVFk0QlcSM4HT5A8x4g4ii650yem4I8tHY0R7JZahwp3ltIPw==", "dev": true, "license": "MIT" }, "node_modules/workbox-window": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.4.1.tgz", "integrity": "sha512-notZDH2u8VXaqyuD7xaqIfEFi6SRM4SUSd7ewe9PDsVqADuepxX2ZMY3uvuZGxzY5ZOsGC/vD3A/3smFtJt4/A==", "dev": true, "license": "MIT", @@ -19051,7 +17786,6 @@ }, "node_modules/wrap-ansi": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", @@ -19069,7 +17803,6 @@ }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", @@ -19082,7 +17815,6 @@ }, "node_modules/wrap-ansi/node_modules/string-width": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", @@ -19100,7 +17832,6 @@ }, "node_modules/ws": { "version": "8.21.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", "dev": true, "license": "MIT", @@ -19122,7 +17853,6 @@ }, "node_modules/wsl-utils": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", "dev": true, "license": "MIT", @@ -19138,7 +17868,6 @@ }, "node_modules/xml-name-validator": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "dev": true, "license": "Apache-2.0", @@ -19148,14 +17877,12 @@ }, "node_modules/xmlchars": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true, "license": "MIT" }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "license": "ISC", @@ -19165,14 +17892,12 @@ }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, "node_modules/yaml": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", "dev": true, "license": "ISC", @@ -19188,14 +17913,12 @@ }, "node_modules/yaml-ast-parser": { "version": "0.0.43", - "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", "dev": true, "license": "Apache-2.0" }, "node_modules/yargs": { "version": "18.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz", "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==", "dev": true, "license": "MIT", @@ -19213,7 +17936,6 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", @@ -19223,7 +17945,6 @@ }, "node_modules/yargs/node_modules/yargs-parser": { "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "dev": true, "license": "ISC", @@ -19233,7 +17954,6 @@ }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", @@ -19246,7 +17966,6 @@ }, "node_modules/yoctocolors": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz", "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==", "dev": true, "license": "MIT", @@ -19259,7 +17978,6 @@ }, "node_modules/zod": { "version": "4.6.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.4.tgz", "integrity": "sha512-AXSD6hvGdvRjajG/l1cC+d6IrhH+sjmPKtYeQdJIK8MFJl3LyClzS+o/YsVC+zQZPupAaeH5skwwm8YqYH7BqA==", "license": "MIT", "funding": { @@ -19268,7 +17986,6 @@ }, "node_modules/zod-validation-error": { "version": "4.0.2", - "resolved": "https://nexus.personal.ksv741.ru/repository/npm-all/zod-validation-error/-/zod-validation-error-4.0.2.tgz", "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", "dev": true, "license": "MIT", -- 2.54.0 From 5b30bb802a4ec43c036066f9a7e178f37e747a0b Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Tue, 6 Oct 2026 07:01:58 +0300 Subject: [PATCH 3/7] feat: add quiet reading with rare confirmations Part of the quiet-user-feedback change; docs and specs land in their own repositories. --- package-lock.json | 92 ++++- package.json | 1 + src/app/routes/AppRoutes/AllAccounts.test.tsx | 16 +- src/app/ui/App.tsx | 9 +- src/entities/bank-card/api/banking.test.tsx | 4 +- .../ui/BankCardForm/BankCardForm.vm.ts | 12 +- .../ui/BankSummary/BankSummary.stories.tsx | 1 - .../ui/BankSummary/BankSummary.view.tsx | 15 +- .../model/useBrokerageOperationHistory.ts | 28 +- .../BrokerageEventsPreview.tsx | 22 +- .../instrument-details/model/section.test.ts | 33 +- .../instrument-details/model/section.ts | 40 +-- .../ui/InstrumentEvents.view.tsx | 4 +- .../InstrumentHeader.view.tsx | 12 +- .../ui/InstrumentPageState.view.tsx | 9 +- .../ui/InstrumentSection.view.tsx | 35 +- .../InstrumentSearch.test.tsx | 7 +- .../InstrumentSearch.view.tsx | 14 - .../model/screen-sync.test.tsx | 319 +++++++++--------- .../tbank-connection/model/screen-sync.ts | 107 +++++- .../TbankConnectionSection.test.tsx | 22 +- .../TbankConnectionSectionLoaded.vm.ts | 7 + .../AccountEventsPage.filters.test.tsx | 27 +- .../AccountEventsPage.test.tsx | 8 +- .../AccountEventsPage/AccountEventsPage.vm.ts | 36 +- .../AccountEventsPageError.view.tsx | 4 +- .../AccountEventsPageLoaded.view.tsx | 24 -- .../AccountIncomePage.test.tsx | 73 +--- .../AccountIncomePage/AccountIncomePage.vm.ts | 32 +- .../AccountIncomePageError.view.tsx | 4 +- .../AccountIncomePageLoaded.view.tsx | 41 +-- .../AccountOperationsPage.test.tsx | 22 +- .../AccountOperationsPage.vm.ts | 53 +-- .../AccountOperationsPageError.view.tsx | 14 +- .../AccountOperationsPageLoaded.view.tsx | 24 -- src/pages/account/model/previews.ts | 27 +- .../ui/AccountPage/AccountPage.test.tsx | 74 ++-- .../account/ui/AccountPage/AccountPage.tsx | 8 - .../ui/AccountPage/AccountPage.vm.test.tsx | 51 +-- .../account/ui/AccountPage/AccountPage.vm.ts | 59 ++-- .../components/AccountPageEmpty.view.tsx | 13 - .../components/AccountPageError.view.tsx | 20 +- .../components/AccountPageLoaded.view.tsx | 29 +- .../components/IncomeSummary.view.tsx | 35 +- .../components/RecentOperations.view.tsx | 18 +- .../ui/AccountsPage/AccountsPage.test.tsx | 50 ++- .../accounts/ui/AccountsPage/AccountsPage.tsx | 16 +- .../ui/AccountsPage/AccountsPage.vm.ts | 57 ++-- .../components/AccountsPageEmpty.view.tsx | 20 +- .../components/AccountsPageError.view.tsx | 27 +- .../components/AccountsPageLoaded.view.tsx | 11 +- src/pages/bond/ui/BondPage/BondPage.test.tsx | 36 +- src/pages/bond/ui/BondPage/BondPage.tsx | 1 - src/pages/bond/ui/BondPage/BondPage.view.tsx | 15 - src/pages/bond/ui/BondPage/BondPage.vm.ts | 22 +- src/pages/bonds/ui/BondsPage/BondsPage.vm.ts | 10 +- src/pages/card/ui/CardPage/CardPage.test.tsx | 35 +- src/pages/card/ui/CardPage/CardPage.view.tsx | 24 +- src/pages/card/ui/CardPage/CardPage.vm.ts | 5 - .../ui/DeleteOperation/DeleteOperation.vm.ts | 7 + .../card/ui/OperationForm/OperationForm.vm.ts | 8 + .../cards/ui/CardsPage/CardsPage.test.tsx | 35 +- .../cards/ui/CardsPage/CardsPage.view.tsx | 24 -- src/pages/cards/ui/CardsPage/CardsPage.vm.ts | 3 - .../stock/ui/StockPage/StockPage.test.tsx | 91 +---- src/pages/stock/ui/StockPage/StockPage.tsx | 1 - .../stock/ui/StockPage/StockPage.view.tsx | 13 +- src/pages/stock/ui/StockPage/StockPage.vm.ts | 22 +- .../components/StockCompany.view.tsx | 20 +- .../StockPage/components/StockQuote.view.tsx | 6 - .../stocks/ui/StocksPage/StocksPage.vm.ts | 10 +- src/shared/api/client.test.ts | 199 ++++++++++- src/shared/api/client.ts | 171 +++++++++- src/shared/i18n/locales/ru.ts | 7 + src/shared/lib/index.ts | 4 + src/shared/lib/initial-availability.test.tsx | 107 ++++++ src/shared/lib/initial-availability.ts | 49 +++ 77 files changed, 1352 insertions(+), 1259 deletions(-) create mode 100644 src/shared/lib/initial-availability.test.tsx create mode 100644 src/shared/lib/initial-availability.ts diff --git a/package-lock.json b/package-lock.json index 686ebdc..527dcbf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@mantine/core": "9.6.1", "@mantine/dates": "9.6.1", "@mantine/hooks": "9.6.1", + "@mantine/notifications": "9.6.1", "@tanstack/react-query": "5.102.8", "@wealthledger/icons": "file:packages/icons", "@wealthledger/tokens": "file:packages/tokens", @@ -2841,6 +2842,31 @@ "react": "^19.2.0" } }, + "node_modules/@mantine/notifications": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@mantine/notifications/-/notifications-9.6.1.tgz", + "integrity": "sha512-6bikkVCAf6wd1KO/oVhBuXGDZ+HcWeNGCEvdgkL0pQ6jmjzd24ShW6UnbGu6aLABhYxQdfLnrE1cbOjC93Tj6A==", + "license": "MIT", + "dependencies": { + "@mantine/store": "9.6.1", + "react-transition-group": "4.4.5" + }, + "peerDependencies": { + "@mantine/core": "9.6.1", + "@mantine/hooks": "9.6.1", + "react": "^19.2.0", + "react-dom": "^19.2.0" + } + }, + "node_modules/@mantine/store": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@mantine/store/-/store-9.6.1.tgz", + "integrity": "sha512-KePeOIAg2n7wkHlxFxF7s6qYeD9EE/GrFIK3cc329nTSDIEIJQ+oFQv1S/t4sZJTIz7YnBlRuvA9Wc8pRg8TRA==", + "license": "MIT", + "peerDependencies": { + "react": "^19.2.0" + } + }, "node_modules/@mdx-js/react": { "version": "3.1.1", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", @@ -7275,7 +7301,6 @@ "node_modules/csstype": { "version": "3.2.3", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "devOptional": true, "license": "MIT" }, "node_modules/d3-array": { @@ -7749,6 +7774,16 @@ "dev": true, "license": "MIT" }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dotenv": { "version": "17.4.2", "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", @@ -10715,7 +10750,6 @@ "node_modules/js-tokens": { "version": "4.0.0", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -11363,6 +11397,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/loupe": { "version": "3.2.1", "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", @@ -11819,6 +11865,15 @@ "node": ">=18" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", @@ -12536,6 +12591,23 @@ "node": ">= 6" } }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, "node_modules/protocols": { "version": "2.0.2", "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", @@ -13001,6 +13073,22 @@ } } }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", diff --git a/package.json b/package.json index 8c0daa1..a43bf4e 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "@mantine/core": "9.6.1", "@mantine/dates": "9.6.1", "@mantine/hooks": "9.6.1", + "@mantine/notifications": "9.6.1", "@tanstack/react-query": "5.102.8", "@wealthledger/icons": "file:packages/icons", "@wealthledger/tokens": "file:packages/tokens", diff --git a/src/app/routes/AppRoutes/AllAccounts.test.tsx b/src/app/routes/AppRoutes/AllAccounts.test.tsx index 023debe..1226035 100644 --- a/src/app/routes/AppRoutes/AllAccounts.test.tsx +++ b/src/app/routes/AppRoutes/AllAccounts.test.tsx @@ -369,7 +369,9 @@ describe("All accounts routes", () => { renderPage("/accounts/all/operations?from=2026-08-01&to=2026-08-31"); await screen.findAllByText("Выплата купона"); fireEvent.click(screen.getByRole("button", { name: "Далее" })); - fireEvent.click(await screen.findByRole("button", { name: "Повторить" })); + await waitFor(() => { + expect(screen.queryByRole("button", { name: "Повторить" })).not.toBeInTheDocument(); + }); expect(await screen.findAllByText("Выплата купона")).toHaveLength(2); expect(screen.getByLabelText("Текущий путь")).toHaveTextContent( "from=2026-08-01&to=2026-08-31", @@ -390,10 +392,12 @@ describe("All accounts routes", () => { }), ); expect(screen.getAllByText("Сбербанк")).toHaveLength(1); - expect( - await screen.findByRole("button", { - name: "Повторить", - }), - ).toBeInTheDocument(); + await waitFor(() => { + expect( + screen.queryByRole("button", { + name: "Повторить", + }), + ).not.toBeInTheDocument(); + }); }); }); diff --git a/src/app/ui/App.tsx b/src/app/ui/App.tsx index db26d02..4a196cc 100644 --- a/src/app/ui/App.tsx +++ b/src/app/ui/App.tsx @@ -2,6 +2,7 @@ import type { FC } from "react"; import { MantineProvider } from "@mantine/core"; import { DatesProvider } from "@mantine/dates"; +import { Notifications } from "@mantine/notifications"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { cssVariablesResolver, theme } from "@wealthledger/ui/theme"; import { BrowserRouter } from "react-router"; @@ -11,7 +12,11 @@ import { AuthProvider } from "@/features/auth"; const queryClient = new QueryClient({ defaultOptions: { - queries: { refetchOnWindowFocus: false, retry: false }, + queries: { + refetchOnReconnect: true, + refetchOnWindowFocus: true, + retry: false, + }, }, }); @@ -31,6 +36,8 @@ const App: FC = () => { + + diff --git a/src/entities/bank-card/api/banking.test.tsx b/src/entities/bank-card/api/banking.test.tsx index 2ec2666..86fd5b4 100644 --- a/src/entities/bank-card/api/banking.test.tsx +++ b/src/entities/bank-card/api/banking.test.tsx @@ -147,7 +147,7 @@ describe("banking API", () => { expect(url.searchParams.get("from")).toBe("2026-09-01"); expect(url.searchParams.get("to")).toBe("2026-09-30"); if (isFail && page === 2) - return HttpResponse.json({ code: "FAILED" }, { status: 500 }); + return HttpResponse.json({ code: "NOT_FOUND" }, { status: 404 }); return HttpResponse.json({ hasNext: page === 1, @@ -299,7 +299,7 @@ describe("banking API", () => { expect(result.current.query.data?.balance.value).toBe("100"); server.use( http.get("*/api/v1/bank-cards/a", () => - HttpResponse.json({ code: "INTERNAL_ERROR" }, { status: 500 }), + HttpResponse.json({ code: "NOT_FOUND" }, { status: 404 }), ), ); await act(() => result.current.query.refetch()); diff --git a/src/entities/bank-card/ui/BankCardForm/BankCardForm.vm.ts b/src/entities/bank-card/ui/BankCardForm/BankCardForm.vm.ts index 4add66a..20fbbe5 100644 --- a/src/entities/bank-card/ui/BankCardForm/BankCardForm.vm.ts +++ b/src/entities/bank-card/ui/BankCardForm/BankCardForm.vm.ts @@ -1,4 +1,5 @@ import { zodResolver } from "@hookform/resolvers/zod"; +import { notifications } from "@mantine/notifications"; import { useState } from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; @@ -71,7 +72,7 @@ function useBankCardFormVm(props: BankCardFormProps) { openingDate: values.openingDate, }; - if (props.card) + if (props.card) { await updateCard.mutateAsync({ body: { ...metadata, @@ -80,12 +81,19 @@ function useBankCardFormVm(props: BankCardFormProps) { }, id: props.card.id, }); - else + } + else { await cardCreation.mutateAsync({ id: intent, ...metadata, ...financial, }); + notifications.show({ + id: "bank-card-created-" + intent, + message: t("bank.cardSaved"), + }); + } + setOpened(false); } catch (error_) { diff --git a/src/entities/bank-card/ui/BankSummary/BankSummary.stories.tsx b/src/entities/bank-card/ui/BankSummary/BankSummary.stories.tsx index 897713b..1ed7fd9 100644 --- a/src/entities/bank-card/ui/BankSummary/BankSummary.stories.tsx +++ b/src/entities/bank-card/ui/BankSummary/BankSummary.stories.tsx @@ -47,7 +47,6 @@ const meta error: false, fetching: false, loading: false, - retry: () => {}, }, component: BankSummaryView, parameters: { diff --git a/src/entities/bank-card/ui/BankSummary/BankSummary.view.tsx b/src/entities/bank-card/ui/BankSummary/BankSummary.view.tsx index 4bd575f..52fccc6 100644 --- a/src/entities/bank-card/ui/BankSummary/BankSummary.view.tsx +++ b/src/entities/bank-card/ui/BankSummary/BankSummary.view.tsx @@ -1,6 +1,6 @@ import type { CSSProperties, FC } from "react"; -import { Button, Group, Skeleton, Stack, Text, Title } from "@mantine/core"; +import { Skeleton, Stack, Text, Title } from "@mantine/core"; import { OperationIcon } from "@wealthledger/icons"; import { LoadingSkeleton } from "@wealthledger/ui"; import { useTranslation } from "react-i18next"; @@ -20,7 +20,6 @@ type BankSummaryViewProps = { error: boolean; fetching: boolean; loading: boolean; - retry: () => void; }; const BankSummaryViewCategories: FC = (props) => { @@ -101,17 +100,7 @@ const BankSummaryView: FC = (props) => { - {props.error && ( - - {t(props.data ? "bank.refreshError" : "bank.error")} - - - - )} - - {props.data && props.fetching && {t("bank.refreshing")}} + {props.error && !props.data && {t("bank.error")}} ); }; diff --git a/src/entities/broker-operation/model/useBrokerageOperationHistory.ts b/src/entities/broker-operation/model/useBrokerageOperationHistory.ts index 3147b8c..1ab9a25 100644 --- a/src/entities/broker-operation/model/useBrokerageOperationHistory.ts +++ b/src/entities/broker-operation/model/useBrokerageOperationHistory.ts @@ -1,5 +1,5 @@ import { hashKey, useQueryClient } from "@tanstack/react-query"; -import { useState } from "react"; +import { useEffect, useState } from "react"; import { ApiErrorCode, apiErrorCode, isApiErrorCode } from "@/shared/api"; @@ -29,15 +29,28 @@ function useBrokerageOperationHistory( cursor: cursors.at(-1), }); + const isInvalidCursor = isApiErrorCode( + apiErrorCode(operations.error), + ApiErrorCode.InvalidOperationsCursor, + ); + + const isRecoveringInvalidCursor = cursors.length > 0 && isInvalidCursor; + const reset = () => setPagination({ cursors: [], scope }); + useEffect(() => { + if (!isRecoveringInvalidCursor) return; + + const timeout = setTimeout(() => { + setPagination({ cursors: [], scope }); + void client.invalidateQueries({ exact: true, queryKey }); + }, 0); + + return () => clearTimeout(timeout); + }, [client, isRecoveringInvalidCursor, queryKey, scope]); + const retry = (retryScreen: () => unknown) => { - if ( - isApiErrorCode( - apiErrorCode(operations.error), - ApiErrorCode.InvalidOperationsCursor, - ) - ) { + if (isInvalidCursor) { reset(); void client.invalidateQueries({ exact: true, @@ -49,6 +62,7 @@ function useBrokerageOperationHistory( return { hasPrevious: cursors.length > 0, + isRecoveringInvalidCursor, onNext: () => { if (operations.data?.nextCursor) setPagination({ diff --git a/src/entities/brokerage-event/ui/BrokerageEventsPreview/BrokerageEventsPreview.tsx b/src/entities/brokerage-event/ui/BrokerageEventsPreview/BrokerageEventsPreview.tsx index 40e3734..5855d0a 100644 --- a/src/entities/brokerage-event/ui/BrokerageEventsPreview/BrokerageEventsPreview.tsx +++ b/src/entities/brokerage-event/ui/BrokerageEventsPreview/BrokerageEventsPreview.tsx @@ -1,12 +1,10 @@ import type { FC } from "react"; -import { Alert, Button, Skeleton, Stack, Text } from "@mantine/core"; +import { Button, Skeleton, Stack, Text } from "@mantine/core"; import { LoadingSkeleton } from "@wealthledger/ui"; import { useTranslation } from "react-i18next"; import { Link } from "react-router"; -import { SourceSyncStatus } from "@/shared/ui"; - import type { BrokerageEvent } from "../../api/useBrokerageEvents"; import { brokerageEventKey } from "../../model/event-key"; @@ -19,9 +17,6 @@ type BrokerageEventsPreviewProps = { type BrokerageEventsPreviewState = | { items: BrokerageEvent[]; - lastSuccessfulAt?: null | string; - refreshError?: boolean; - stale?: boolean; state: "loaded" | "partial"; to: string; } @@ -33,28 +28,15 @@ const BrokerageEventsPreview: FC = (props) => { const { events } = props; const { t } = useTranslation(); - const errorText - = events.state === "loaded" && events.refreshError - ? t("accounts.refreshError") - : null; - return ( - {events.state === "loaded" && ( - - )} - {events.state === "loading" && ( {["first", "second", "third"].map(placeholder => )} )} - {events.state === "error" && {t("events.recentError")}} + {events.state === "error" && {t("states.unavailableText")}} {events.state === "empty" && {t("events.recentEmpty")}} diff --git a/src/features/instrument-details/model/section.test.ts b/src/features/instrument-details/model/section.test.ts index b2ff22d..40b5527 100644 --- a/src/features/instrument-details/model/section.test.ts +++ b/src/features/instrument-details/model/section.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it, vi } from "vitest"; +import { describe, expect, it } from "vitest"; import { resource } from "@/test/resource"; @@ -13,9 +13,7 @@ describe("instrument source and transport presentation", () => { const state = section({ data, isError: false, - isFetching: false, meta: resource(data, { availability }).meta, - refetch: vi.fn(), }); expect(state.loading).toBe(availability === "missing"); @@ -23,39 +21,40 @@ describe("instrument source and transport presentation", () => { expect(state.hasData).toBe(availability !== "missing"); }, ); - it("preserves a full fresh source and timestamp when force fails, while offering scoped retry", () => { - const retry = vi.fn(); - const refetch = vi.fn(); + it("preserves empty successful data instead of treating it as missing", () => { + const state = section({ + data: [], + isError: false, + meta: resource([]).meta, + }); + expect(state).toMatchObject({ + error: false, + hasData: true, + loading: false, + }); + }); + + it("preserves a full source when force fails", () => { const meta = resource([], { sync: { errorCode: "TBANK_UNAVAILABLE", id: "work", state: "failed" }, }).meta; - const state = section( - { data: [], isError: false, isFetching: false, meta, refetch }, - retry, - ); + const state = section({ data: [], isError: false, meta }); expect(state).toMatchObject({ error: true, hasData: true, - lastSuccessfulAt: meta.lastSuccessfulAt, loading: false, - refreshing: false, }); - state.retry(); - expect(retry).toHaveBeenCalledOnce(); - expect(refetch).not.toHaveBeenCalled(); }); it("shows source failure without a false loading or empty result", () => { const state = section({ data: undefined, isError: false, - isFetching: false, meta: resource(null, { sync: { errorCode: "TBANK_UNAVAILABLE", id: "work", state: "failed" }, }).meta, - refetch: vi.fn(), }); expect(state).toMatchObject({ diff --git a/src/features/instrument-details/model/section.ts b/src/features/instrument-details/model/section.ts index 399d903..898ea88 100644 --- a/src/features/instrument-details/model/section.ts +++ b/src/features/instrument-details/model/section.ts @@ -3,43 +3,27 @@ import type { InvestmentResourceMeta } from "@/shared/api"; type SectionState = { error: boolean; hasData: boolean; - lastSuccessfulAt?: null | string; loading: boolean; partial?: boolean; - refreshing: boolean; - retry: () => void; - sourceError?: boolean; - stale?: boolean; }; -function section( - query: { - data: unknown; - isError: boolean; - isFetching: boolean; - meta?: InvestmentResourceMeta; - refetch: () => unknown; - }, - retry?: () => unknown, -): SectionState { +function hasSectionData(data: unknown) { + return data !== undefined; +} + +function section(query: { + data: unknown; + isError: boolean; + meta?: InvestmentResourceMeta; +}): SectionState { const isError = query.isError || query.meta?.sync.state === "failed"; + const hasData = hasSectionData(query.data); return { error: isError, - hasData: Boolean(query.data), - lastSuccessfulAt: query.meta?.lastSuccessfulAt, - loading: !query.data && !isError, + hasData, + loading: !hasData && !isError, partial: query.meta?.availability === "partial", - refreshing: - Boolean(query.data) - && (query.isFetching - || query.meta?.sync.state === "running" - ), - retry: () => { - void (retry ?? query.refetch)(); - }, - sourceError: query.meta?.sync.state === "failed", - stale: query.meta?.freshness === "stale", }; } diff --git a/src/features/instrument-details/ui/InstrumentEvents.view.tsx b/src/features/instrument-details/ui/InstrumentEvents.view.tsx index 6d6b75d..13e3f98 100644 --- a/src/features/instrument-details/ui/InstrumentEvents.view.tsx +++ b/src/features/instrument-details/ui/InstrumentEvents.view.tsx @@ -86,7 +86,7 @@ const InstrumentEvents: FC = (props) => { {children} diff --git a/src/features/instrument-details/ui/InstrumentPageState.view.tsx b/src/features/instrument-details/ui/InstrumentPageState.view.tsx index aa6fb61..1f502ee 100644 --- a/src/features/instrument-details/ui/InstrumentPageState.view.tsx +++ b/src/features/instrument-details/ui/InstrumentPageState.view.tsx @@ -1,6 +1,6 @@ import type { FC } from "react"; -import { Anchor, Button, Skeleton, Stack, Text, Title } from "@mantine/core"; +import { Anchor, Skeleton, Stack, Text, Title } from "@mantine/core"; import { LoadingSkeleton } from "@wealthledger/ui"; import { useTranslation } from "react-i18next"; import { Link } from "react-router"; @@ -11,11 +11,10 @@ type InstrumentPageStateProps = { code?: string; kind: "bond" | "stock"; loading: boolean; - retry: () => void; }; const InstrumentPageState: FC = (props) => { - const { code, kind, loading, retry } = props; + const { code, kind, loading } = props; const { t } = useTranslation(); if (loading) return ( @@ -55,10 +54,6 @@ const InstrumentPageState: FC = (props) => { {t("accounts.openSettings")} - - ); }; diff --git a/src/features/instrument-details/ui/InstrumentSection.view.tsx b/src/features/instrument-details/ui/InstrumentSection.view.tsx index 64694b9..5c37ba1 100644 --- a/src/features/instrument-details/ui/InstrumentSection.view.tsx +++ b/src/features/instrument-details/ui/InstrumentSection.view.tsx @@ -2,7 +2,6 @@ import type { FC, PropsWithChildren, ReactNode } from "react"; import { Alert, - Button, Group, Paper, Skeleton, @@ -13,8 +12,6 @@ import { import { LoadingSkeleton } from "@wealthledger/ui"; import { useTranslation } from "react-i18next"; -import { SourceSyncStatus } from "@/shared/ui"; - import type { SectionState } from "../model/section"; import classes from "./InstrumentDetails.module.css"; @@ -33,10 +30,6 @@ type InstrumentSectionProps = PropsWithChildren<{ const InstrumentSection: FC = (props) => { const { t } = useTranslation(); - const readError = t( - props.state.hasData ? "accounts.refreshError" : "stock.sectionError", - ); - const sectionClassName = props.embedded ? classes.embeddedSection : classes.section; @@ -80,35 +73,11 @@ const InstrumentSection: FC = (props) => { {props.controls} - - {!!props.state.partial && {t("investment.partial")}} - {!!props.state.refreshing && ( - - {t("accounts.refreshing")} - - )} - - {!!props.state.error && ( + {!!(props.state.error && !props.state.hasData) && ( - - - {props.state.sourceError ? t("investment.syncFailed") : readError} - - - - + {t("stock.sectionError")} )} diff --git a/src/features/instrument-search/ui/InstrumentSearch/InstrumentSearch.test.tsx b/src/features/instrument-search/ui/InstrumentSearch/InstrumentSearch.test.tsx index 4f16310..1bdeb77 100644 --- a/src/features/instrument-search/ui/InstrumentSearch/InstrumentSearch.test.tsx +++ b/src/features/instrument-search/ui/InstrumentSearch/InstrumentSearch.test.tsx @@ -1,7 +1,7 @@ import type { ComponentProps } from "react"; import { MantineProvider } from "@mantine/core"; -import { fireEvent, render, screen } from "@testing-library/react"; +import { render, screen } from "@testing-library/react"; import { MemoryRouter } from "react-router"; import { expect, it, vi } from "vitest"; @@ -16,8 +16,6 @@ it("keeps cached results on failure, hides them during a new search and distingu partial: false, query: "SBER", ready: true, - refreshing: false, - retry: vi.fn(), }; const cached = [Сбербанк]; @@ -44,8 +42,7 @@ it("keeps cached results on failure, hides them during a new search and distingu expect( screen.getByRole("link", { name: "Открыть настройки T-Bank" }), ).toHaveAttribute("href", "/settings"); - fireEvent.click(screen.getByRole("button", { name: "Повторить" })); - expect(vm.retry).toHaveBeenCalledOnce(); + expect(screen.queryByRole("button", { name: "Повторить" })).not.toBeInTheDocument(); rerender(view({ loading: true, ready: false })); expect(screen.queryByRole("link", { name: "Сбербанк" })).not.toBeInTheDocument(); diff --git a/src/features/instrument-search/ui/InstrumentSearch/InstrumentSearch.view.tsx b/src/features/instrument-search/ui/InstrumentSearch/InstrumentSearch.view.tsx index e56ff5f..b99ed45 100644 --- a/src/features/instrument-search/ui/InstrumentSearch/InstrumentSearch.view.tsx +++ b/src/features/instrument-search/ui/InstrumentSearch/InstrumentSearch.view.tsx @@ -3,7 +3,6 @@ import type { ChangeEvent, FC, ReactNode } from "react"; import { Alert, Anchor, - Button, Skeleton, Stack, Text, @@ -28,8 +27,6 @@ type InstrumentSearchProps = { partial: boolean; query: string; ready: boolean; - refreshing: boolean; - retry: () => void; }; }; @@ -77,14 +74,6 @@ const InstrumentSearch: FC = (props) => { - - {!!vm.partial && {t("investment.partial")}} = (props) => { {t("accounts.openSettings")} - )} diff --git a/src/features/tbank-connection/model/screen-sync.test.tsx b/src/features/tbank-connection/model/screen-sync.test.tsx index dc39898..aef200c 100644 --- a/src/features/tbank-connection/model/screen-sync.test.tsx +++ b/src/features/tbank-connection/model/screen-sync.test.tsx @@ -78,7 +78,7 @@ describe("page-owned screen synchronization", () => { expect(posted).toEqual(["old", "new"]); }); it.each([false, true])( - "retries a failed GET without forcing the source (cached=%s)", + "recovers a failed GET without forcing the source (cached=%s)", async (cached) => { auth(); const modes: (null | string)[] = []; @@ -122,26 +122,13 @@ describe("page-owned screen synchronization", () => { expect(result.current.accounts.isSuccess).toBe(true), ); isUnavailable = true; - await act(() => result.current.accounts.refetch()); + void result.current.accounts.refetch(); } - await waitFor(() => expect(result.current.accounts.isError).toBe(true)); isUnavailable = false; - await act(() => result.current.sync.retry()); await waitFor(() => expect(result.current.accounts.isSuccess).toBe(true)); - expect(result.current.accounts.meta?.dataRevision).toBe( - cached ? "3" : "2", - ); - expect(modes).toEqual( - cached - ? [ - null, - null, - "observe", - ] - : [null, "observe"], - ); expect(posts).toBe(0); + expect(modes.every(mode => mode === null)).toBe(true); expect(result.current.disabled.data).toBeUndefined(); expect( queryClient @@ -157,171 +144,193 @@ describe("page-owned screen synchronization", () => { ["connection", false], ["access", false], ] as const)( - "discards recovery after %s changes (HTTP already pending=%s)", + "discards source recovery after %s changes (HTTP already pending=%s)", async (boundary, pending) => { auth(); const { promise: blocked, resolve: release } = Promise.withResolvers(); - let isRecovering = false; + let recoveryRequests = 0; let isChanged = false; - server.use( - http.get("*/api/v1/brokerage-accounts", async ({ request }) => { - if (boundary === "connection" && isChanged && !request.signal.aborted) - return HttpResponse.json(resource([], { dataRevision: "current" })); - if (!new URL(request.url).searchParams.has("sync")) - return isChanged - ? HttpResponse.json(resource([], { dataRevision: "current" })) - : HttpResponse.json({ code: "UNAVAILABLE" }, { status: 503 }); - isRecovering = true; - await blocked; - return HttpResponse.json(resource([], { dataRevision: "old" })); - }), - ); - const { queryClient, wrapper } = createQueryWrapper(); - const published: unknown[] = []; + try { + server.use( + http.get("*/api/v1/brokerage-accounts", async () => { + if (isChanged) + return HttpResponse.json( + resource([], { dataRevision: "current" }), + ); - const unsubscribe = queryClient.getQueryCache().subscribe((event) => { - if (event.type === "updated" && event.action.type === "success") - published.push(event.query.state.data); - }); + if (recoveryRequests > 0) { + recoveryRequests += 1; + await blocked; - const { result } = renderHook( - () => { - const accounts = useBrokerageAccounts(); + return HttpResponse.json(resource([], { dataRevision: "old" })); + } - return { - accounts, - sync: useScreenSync({ screen: "accounts" }, [accounts]), - }; - }, - { wrapper }, - ); + recoveryRequests += 1; - await waitFor(() => expect(result.current.accounts.isError).toBe(true)); - let recovery!: Promise; - act(() => { - recovery = result.current.sync.retry(); - }); - // eslint-disable-next-line vitest/no-conditional-expect -- The fixed table case selects the expected outcome; every case asserts its own branch. - if (pending) await waitFor(() => expect(isRecovering).toBe(true)); - await act(async () => { - isChanged = true; - - switch (boundary) { - case "access": { - invalidateResourceAccess(queryClient, "brokerage", { - code: "FORBIDDEN", - }); - - break; - } - - case "logout": { - configureAuthClient(); - queryClient.clear(); - - break; - } - - case "session": { - auth(); - queryClient.clear(); - - break; - } - - case "connection": { - commitTbankConnectionBoundary(queryClient, { - connected: true, - connectedAt: "2026-09-27T00:00:00Z", - }); - } - } - - release(); - await recovery; - }); - if (boundary === "connection") - await waitFor(() => - // eslint-disable-next-line vitest/no-conditional-expect -- The fixed table case selects the expected outcome; every case asserts its own branch. - expect(result.current.accounts.meta?.dataRevision).toBe("current"), + return HttpResponse.json( + resource(null, { + sync: { + errorCode: "TBANK_UNAVAILABLE", + id: "failed", + state: "failed", + }, + }), + ); + }), ); - expect(published).not.toContainEqual( - expect.objectContaining({ - meta: expect.objectContaining({ dataRevision: "old" }) as unknown, - }), - ); - unsubscribe(); + const { queryClient, wrapper } = createQueryWrapper(); + const published: unknown[] = []; + + const unsubscribe = queryClient.getQueryCache().subscribe((event) => { + if (event.type === "updated" && event.action.type === "success") + published.push(event.query.state.data); + }); + + const { result } = renderHook( + () => { + const accounts = useBrokerageAccounts(); + + return { + accounts, + sync: useScreenSync({ screen: "accounts" }, [accounts]), + }; + }, + { wrapper }, + ); + + await waitFor(() => + expect(result.current.accounts.meta?.sync.state).toBe("failed"), + ); + vi.useFakeTimers(); + if (pending) + await act(() => vi.advanceTimersByTimeAsync(5000)); + expect(recoveryRequests).toBeGreaterThanOrEqual(1); + + await act(async () => { + isChanged = true; + + switch (boundary) { + case "access": { + invalidateResourceAccess(queryClient, "brokerage", { + code: "FORBIDDEN", + }); + + break; + } + + case "logout": { + configureAuthClient(); + queryClient.clear(); + + break; + } + + case "session": { + auth(); + queryClient.clear(); + + break; + } + + case "connection": { + commitTbankConnectionBoundary(queryClient, { + connected: true, + connectedAt: "2026-09-27T00:00:00Z", + }); + } + } + + release(); + if (!pending) await vi.advanceTimersByTimeAsync(5000); + }); + vi.useRealTimers(); + if (boundary === "connection" && !pending) + await waitFor(() => + // eslint-disable-next-line vitest/no-conditional-expect -- The fixed table case selects the expected outcome; every case asserts its own branch. + expect(result.current.accounts.meta?.dataRevision).toBe("current"), + ); + expect(published).not.toContainEqual( + expect.objectContaining({ + meta: expect.objectContaining({ dataRevision: "old" }) as unknown, + }), + ); + unsubscribe(); + } + finally { + vi.useRealTimers(); + } }, ); it.each([false, true])( - "recovers an initial GET failure after forced sync without metadata (status retry=%s)", + "recovers an initial GET failure without forced sync (status retry=%s)", async (retryStatus) => { auth(); const modes: (null | string)[] = []; + let posts = 0; let polls = 0; - server.use( - http.get("*/api/v1/brokerage-accounts", ({ request }) => { - modes.push(new URL(request.url).searchParams.get("sync")); - return modes.length === 1 - ? HttpResponse.json({ code: "UNAVAILABLE" }, { status: 503 }) - : HttpResponse.json(resource([])); - }), - http.post("*/api/v1/tbank-sync", () => - HttpResponse.json({ id: "recover" }, { status: 202 }), - ), - http.get("*/api/v1/tbank-sync/:id", () => { - polls += 1; + try { + server.use( + http.get("*/api/v1/brokerage-accounts", ({ request }) => { + modes.push(new URL(request.url).searchParams.get("sync")); - return retryStatus && polls === 1 - ? HttpResponse.json({ code: "UNAVAILABLE" }, { status: 503 }) - : HttpResponse.json({ - id: "recover", - state: "succeeded", - }); - }), - ); - const { queryClient, wrapper } = createQueryWrapper(); + return modes.length === 1 + ? HttpResponse.json({ code: "UNAVAILABLE" }, { status: 503 }) + : HttpResponse.json(resource([])); + }), + http.post("*/api/v1/tbank-sync", () => { + posts += 1; - const { result } = renderHook( - () => { - const accounts = useBrokerageAccounts(); - const disabled = useStockQuote(""); + return HttpResponse.json({ id: "recover" }, { status: 202 }); + }), + http.get("*/api/v1/tbank-sync/:id", () => { + polls += 1; - return { - accounts, - sync: useScreenSync({ screen: "accounts" }, [accounts, disabled]), - }; - }, - { wrapper }, - ); - - await waitFor(() => expect(result.current.accounts.isError).toBe(true)); - expect(result.current.accounts.meta).toBeUndefined(); - await act(() => result.current.sync.refresh()); - - if (retryStatus) { - await waitFor(() => - // eslint-disable-next-line vitest/no-conditional-expect -- The fixed table case selects the expected outcome; every case asserts its own branch. - expect(result.current.sync.transportError).toBe(true), + return retryStatus && polls === 1 + ? HttpResponse.json({ code: "UNAVAILABLE" }, { status: 503 }) + : HttpResponse.json({ + id: "recover", + state: "succeeded", + }); + }), ); - await act(() => result.current.sync.retry()); + const { queryClient, wrapper } = createQueryWrapper(); + + const { result } = renderHook( + () => { + const accounts = useBrokerageAccounts(); + const disabled = useStockQuote(""); + + return { + accounts, + sync: useScreenSync({ screen: "accounts" }, [accounts, disabled]), + }; + }, + { wrapper }, + ); + + await waitFor( + () => expect(result.current.accounts.isSuccess).toBe(true), + { timeout: 3000 }, + ); + expect(result.current.accounts.data).toEqual([]); + + expect(modes).toEqual([null, null]); + expect(posts).toBe(0); + expect(polls).toBe(0); + expect( + queryClient + .getQueryCache() + .findAll({ queryKey: ["get", "/api/v1/brokerage-accounts"] }), + ).toHaveLength(1); + } + finally { + vi.useRealTimers(); } - - await waitFor(() => expect(result.current.accounts.isSuccess).toBe(true)); - expect(result.current.accounts.data).toEqual([]); - - expect(modes[0]).toBeNull(); - expect(modes.slice(1).every(mode => mode === "observe")).toBe(true); - expect( - queryClient - .getQueryCache() - .findAll({ queryKey: ["get", "/api/v1/brokerage-accounts"] }), - ).toHaveLength(1); }, ); it("posts only its scope once and observes completion without importing again", async () => { diff --git a/src/features/tbank-connection/model/screen-sync.ts b/src/features/tbank-connection/model/screen-sync.ts index 00db54a..0809222 100644 --- a/src/features/tbank-connection/model/screen-sync.ts +++ b/src/features/tbank-connection/model/screen-sync.ts @@ -1,4 +1,9 @@ -import { type QueryKey, useQueryClient } from "@tanstack/react-query"; +import { + focusManager, + onlineManager, + type QueryKey, + useQueryClient, +} from "@tanstack/react-query"; import { useEffect, useRef } from "react"; import { @@ -21,9 +26,39 @@ type ScreenResource = { meta?: InvestmentResourceMeta; observe: () => Promise; queryKey: QueryKey; + refetch: () => Promise; }; const STATUS_INTERVAL_MS = 1000; +const FIRST_SOURCE_RECOVERY_DELAY_MS = 5000; +const SECOND_SOURCE_RECOVERY_DELAY_MS = 15_000; + +function requiresSourceRecovery(meta?: InvestmentResourceMeta): boolean { + if (!meta || meta.unavailableReason) return false; + + return ["cancelled", "failed"].includes(meta.sync.state) + || meta.availability === "missing" + || meta.freshness === "stale" + || (meta.dependencies ?? []).some(dependency => + requiresSourceRecovery(dependency), + ); +} + +function sourceRecoveryDelay(attempt: number): number | undefined { + switch (attempt) { + case 0: { + return FIRST_SOURCE_RECOVERY_DELAY_MS; + } + + case 1: { + return SECOND_SOURCE_RECOVERY_DELAY_MS; + } + + default: { + return undefined; + } + } +} function useScreenSync(scope: InvestmentScreen, resources: ScreenResource[]) { const mutation = apiQueryClient.useMutation("post", "/api/v1/tbank-sync", { @@ -35,6 +70,9 @@ function useScreenSync(scope: InvestmentScreen, resources: ScreenResource[]) { const scopeKey = JSON.stringify(scope); const requestInFlightRef = useRef(null); + const lifecycleRecoveryRef = useRef(new Set()); + const sourceRecoveryRef = useRef(new Map()); + const sourceTimersRef = useRef(new Set>()); const isCurrentMutation = JSON.stringify(mutation.variables?.body) === scopeKey; @@ -110,6 +148,73 @@ function useScreenSync(scope: InvestmentScreen, resources: ScreenResource[]) { void resource.observe().catch(() => {}); }, [client, statuses, resources, scopeKey]); + useEffect(() => { + const timers = sourceTimersRef.current; + const attempts = sourceRecoveryRef.current; + + return () => { + for (const timer of timers) clearTimeout(timer); + timers.clear(); + attempts.clear(); + }; + }, [scopeKey]); + + useEffect(() => { + for (const resource of resources) { + if ( + !requiresSourceRecovery(resource.meta) + || resource.isFetching + ) continue; + + const key = JSON.stringify([scopeKey, resource.queryKey]); + const attempt = sourceRecoveryRef.current.get(key) ?? 0; + const delay = sourceRecoveryDelay(attempt); + if (delay === undefined) continue; + + sourceRecoveryRef.current.set(key, attempt + 1); + + const timer = setTimeout(() => { + sourceTimersRef.current.delete(timer); + void resource.refetch().catch(() => {}); + }, delay); + + sourceTimersRef.current.add(timer); + } + }, [resources, scopeKey]); + + useEffect(() => { + const recover = () => { + for (const resource of resources) { + if ( + !requiresSourceRecovery(resource.meta) + || resource.isFetching + ) continue; + + const key = JSON.stringify([scopeKey, resource.queryKey]); + if (lifecycleRecoveryRef.current.has(key)) continue; + + sourceRecoveryRef.current.delete(key); + lifecycleRecoveryRef.current.add(key); + void resource.refetch() + .catch(() => {}) + .finally(() => lifecycleRecoveryRef.current.delete(key)); + } + }; + + const unsubscribeFocus = focusManager.subscribe((focused) => { + if (focused) recover(); + }); + + const unsubscribeOnline = onlineManager.subscribe((online) => { + if (online) recover(); + }); + + return () => { + unsubscribeFocus(); + unsubscribeOnline(); + }; + }, [resources, scopeKey]); + const isRefreshing = (isCurrentMutation && mutation.isPending) || statuses.some( diff --git a/src/features/tbank-connection/ui/TbankConnectionSection/TbankConnectionSection.test.tsx b/src/features/tbank-connection/ui/TbankConnectionSection/TbankConnectionSection.test.tsx index 6d7d1b6..334d210 100644 --- a/src/features/tbank-connection/ui/TbankConnectionSection/TbankConnectionSection.test.tsx +++ b/src/features/tbank-connection/ui/TbankConnectionSection/TbankConnectionSection.test.tsx @@ -127,9 +127,11 @@ describe("TbankConnectionSection", () => { const token = screen.getByLabelText("Token T-Bank"); fireEvent.change(token, { target: { value: "replacement-draft" } }); finishRefetch?.(); - expect( - await screen.findByText(/Не удалось обновить статус подключения/), - ).toBeVisible(); + await waitFor(() => { + expect( + screen.queryByText(/Не удалось обновить статус подключения/), + ).not.toBeInTheDocument(); + }); expect(screen.getByLabelText("Token T-Bank")).toBe(token); expect(token).toHaveValue("replacement-draft"); expect(screen.getByText("Подключено с 14.08.2026")).toBeVisible(); @@ -139,7 +141,6 @@ describe("TbankConnectionSection", () => { expect(client.getQueryData(portfolioQueryKey)).toEqual({ source: "previous-connection", }); - fireEvent.click(screen.getByRole("button", { name: "Повторить" })); await waitFor(() => expect(reads).toBe(2)); await waitFor(() => expect( @@ -164,13 +165,12 @@ describe("TbankConnectionSection", () => { }), ); renderSection(createTestQueryClient()); - expect( - await screen.findByText(/Не удалось загрузить статус подключения/), - ).toBeVisible(); - expect(screen.queryByLabelText("Token T-Bank")).not.toBeInTheDocument(); - fireEvent.click(screen.getByRole("button", { name: "Повторить" })); - expect(await screen.findByLabelText("Token T-Bank")).toBeVisible(); - expect(reads).toBe(2); + await waitFor(() => { + expect( + screen.queryByText(/Не удалось загрузить статус подключения/), + ).not.toBeInTheDocument(); + }); + expect(reads).toBe(1); }); it("commits connection status and resets the complete brokerage query subtree after connecting", async () => { const client = seededClient(); diff --git a/src/features/tbank-connection/ui/TbankConnectionSection/TbankConnectionSectionLoaded.vm.ts b/src/features/tbank-connection/ui/TbankConnectionSection/TbankConnectionSectionLoaded.vm.ts index 5ec16f6..ac354e5 100644 --- a/src/features/tbank-connection/ui/TbankConnectionSection/TbankConnectionSectionLoaded.vm.ts +++ b/src/features/tbank-connection/ui/TbankConnectionSection/TbankConnectionSectionLoaded.vm.ts @@ -1,3 +1,4 @@ +import { notifications } from "@mantine/notifications"; import { useQueryClient } from "@tanstack/react-query"; import { useEffect, useRef, useState } from "react"; import { useForm } from "react-hook-form"; @@ -32,6 +33,12 @@ function useTbankConnectionSectionLoadedVm(status: TbankConnectionStatus) { onSuccess: (data) => { commitTbankConnectionBoundary(queryClient, data); reset(); + + if (status.connected && data.connected) + notifications.show({ + id: "tbank-token-replaced-" + crypto.randomUUID(), + message: t("tbank.tokenReplaced"), + }); }, }); diff --git a/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.filters.test.tsx b/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.filters.test.tsx index 4a75e0c..33015bf 100644 --- a/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.filters.test.tsx +++ b/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.filters.test.tsx @@ -3,7 +3,6 @@ import type { FC } from "react"; import { MantineProvider } from "@mantine/core"; import { QueryClientProvider } from "@tanstack/react-query"; import { - act, fireEvent, render, renderHook, @@ -115,7 +114,6 @@ describe("Upcoming event date filters", () => { "keeps event calendar dates in GET and source sync requests: %s", async (search) => { const requested: string[] = []; - const syncRequests: unknown[] = []; server.use( http.get("*/api/v1/brokerage-accounts/all/events", ({ request }) => { requested.push(new URL(request.url).search); @@ -133,16 +131,7 @@ describe("Upcoming event date filters", () => { ), ); }), - http.post("*/api/v1/tbank-sync", async ({ request }) => { - syncRequests.push(await request.json()); - - return HttpResponse.json( - { code: "TBANK_UNAVAILABLE" }, - { status: 503 }, - ); - }), ); - const period = Object.fromEntries(new URLSearchParams(search)); const queryClient = createTestQueryClient(); const { result } = renderHook( @@ -162,15 +151,6 @@ describe("Upcoming event date filters", () => { await waitFor(() => expect(result.current.state).toBe("error")); expect(requested).toEqual([`?${search}`]); - expect(syncRequests).toEqual([]); - act(() => { - if (result.current.state === "error") result.current.retry(); - }); - await waitFor(() => - expect(syncRequests).toEqual([ - { accountId: "all", screen: "events", ...period }, - ]), - ); }, ); @@ -232,7 +212,7 @@ describe("Upcoming event date filters", () => { ), ); renderEvents(accountId, ["?from=2099-02-01"]); - await screen.findByRole("button", { name: "Повторить" }); + await screen.findByRole("button", { name: "Сбросить" }); fireEvent.click(screen.getByRole("button", { name: "Сбросить" })); await screen.findByLabelText("Период"); expect(screen.getByLabelText("URL")).toBeEmptyDOMElement(); @@ -300,7 +280,7 @@ describe("Upcoming event date filters", () => { ); }); -it("retains the previous complete forecast and timestamp when its source refresh fails", async () => { +it("retains the previous complete forecast when its source refresh fails", async () => { configureAuthClient({ accessToken: () => "synthetic", clear: vi.fn(), @@ -343,9 +323,6 @@ it("retains the previous complete forecast and timestamp when its source refresh await waitFor(() => expect(result.current).toMatchObject({ events, - lastSuccessfulAt: snapshot.meta.lastSuccessfulAt, - refreshError: true, - sourceError: true, state: "loaded", }), ); diff --git a/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.test.tsx b/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.test.tsx index 9308ae7..4bfa29e 100644 --- a/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.test.tsx +++ b/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.test.tsx @@ -159,8 +159,7 @@ describe("AccountEventsPage", () => { expect(screen.getAllByText("O")).toHaveLength(2); }); - it("renders empty and retryable error states", () => { - const refetch = vi.fn(); + it("renders empty and quiet error states", async () => { const { rerender } = renderPage(); expect( screen.getByText("За выбранный период событий не найдено"), @@ -169,7 +168,6 @@ describe("AccountEventsPage", () => { data: undefined, isError: true, isLoading: false, - refetch, } as never); rerender( @@ -178,8 +176,8 @@ describe("AccountEventsPage", () => { , ); - fireEvent.click(screen.getByRole("button", { name: "Повторить" })); - expect(refresh).toHaveBeenCalledOnce(); + expect(await screen.findByRole("button", { name: "Сбросить" })).toBeVisible(); + expect(screen.queryByRole("button", { name: "Повторить" })).not.toBeInTheDocument(); }); it("shows a structural busy state before events are available", () => { diff --git a/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.vm.ts b/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.vm.ts index f9707e0..ce2a856 100644 --- a/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.vm.ts +++ b/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.vm.ts @@ -6,25 +6,20 @@ import { useBrokerageEvents, } from "@/entities/brokerage-event"; import { useScreenSync } from "@/features/tbank-connection"; -import { isValidPeriod, useUrlPeriod } from "@/shared/lib"; +import { isValidPeriod, useInitialAvailability, useUrlPeriod } from "@/shared/lib"; type AccountEventsPageViewModel = | { canApply: boolean; draftPeriod: [null | string, null | string]; events: BrokerageEvent[]; - lastSuccessfulAt?: null | string; onApply: () => void; onPeriodChange: (value: [null | string, null | string]) => void; onReset: () => void; partial?: boolean; - refreshError: boolean; - refreshing: boolean; - retry: () => void; - sourceError?: boolean; state: "loaded"; } - | { onReset: () => void; retry: () => void; state: "error" } + | { onReset: () => void; state: "error" } | { state: "loading" }; function useAccountEventsPageViewModel(): AccountEventsPageViewModel { @@ -56,7 +51,7 @@ function useAccountEventsPageViewModel(): AccountEventsPageViewModel { ...(appliedTo && { to: appliedTo }), }); - const sync = useScreenSync( + useScreenSync( { accountId, screen: "events", @@ -66,7 +61,15 @@ function useAccountEventsPageViewModel(): AccountEventsPageViewModel { [events], ); - if (events.isLoading) return { state: "loading" }; + const availability = useInitialAvailability({ + hasContent: !!events.data, + identity: scope, + isError: events.isError || events.meta?.sync.state === "failed", + isFetching: events.isFetching, + }); + + if (availability === "loading" && events.isLoading) + return { state: "loading" }; const onReset = () => { setDraftPeriod([null, null]); @@ -76,12 +79,12 @@ function useAccountEventsPageViewModel(): AccountEventsPageViewModel { if ((events.isError || events.meta?.sync.state === "failed") && !events.data) return { onReset, - retry: () => { - void sync.retry(); - }, state: "error", }; - if (!events.data) return { state: "loading" }; + if (!events.data) + return availability === "unavailable" + ? { onReset, state: "error" } + : { state: "loading" }; return { canApply: @@ -89,7 +92,6 @@ function useAccountEventsPageViewModel(): AccountEventsPageViewModel { && isValidPeriod(draftFrom, draftTo), draftPeriod, events: events.data.events, - lastSuccessfulAt: events.meta?.lastSuccessfulAt, onApply: () => { if (!isValidPeriod(draftFrom, draftTo)) return; setSearchParameters({ @@ -100,12 +102,6 @@ function useAccountEventsPageViewModel(): AccountEventsPageViewModel { onPeriodChange: setDraftPeriod, onReset, partial: events.meta?.availability !== "complete", - refreshError: events.isError || sync.sourceError || sync.transportError, - refreshing: events.isFetching || sync.refreshing, - retry: () => { - void sync.retry(); - }, - sourceError: sync.sourceError, state: "loaded", }; } diff --git a/src/pages/account-events/ui/AccountEventsPage/components/AccountEventsPageError.view.tsx b/src/pages/account-events/ui/AccountEventsPage/components/AccountEventsPageError.view.tsx index 9630812..86666b5 100644 --- a/src/pages/account-events/ui/AccountEventsPage/components/AccountEventsPageError.view.tsx +++ b/src/pages/account-events/ui/AccountEventsPage/components/AccountEventsPageError.view.tsx @@ -4,7 +4,7 @@ import { Button, Group } from "@mantine/core"; import { StateView } from "@wealthledger/ui"; import { useTranslation } from "react-i18next"; -type AccountEventsPageErrorProps = { onReset: () => void; retry: () => void }; +type AccountEventsPageErrorProps = { onReset: () => void }; const AccountEventsPageError: FC = (props) => { const { t } = useTranslation(); @@ -13,8 +13,6 @@ const AccountEventsPageError: FC = (props) => { - - diff --git a/src/pages/account-events/ui/AccountEventsPage/components/AccountEventsPageLoaded.view.tsx b/src/pages/account-events/ui/AccountEventsPage/components/AccountEventsPageLoaded.view.tsx index 624ab0c..dd0743c 100644 --- a/src/pages/account-events/ui/AccountEventsPage/components/AccountEventsPageLoaded.view.tsx +++ b/src/pages/account-events/ui/AccountEventsPage/components/AccountEventsPageLoaded.view.tsx @@ -4,7 +4,6 @@ import { Alert, Button, Group, - Progress, Stack, Text, Title, @@ -16,7 +15,6 @@ import { BrokerageEventCard, brokerageEventKey, } from "@/entities/brokerage-event"; -import { SourceSyncStatus } from "@/shared/ui"; import type { AccountEventsPageViewModel } from "../AccountEventsPage.vm"; @@ -55,32 +53,10 @@ const AccountEventsPageLoaded: FC = (props) => { return ( - - {t("events.title")} - - {!!props.partial && {t("investment.partial")}} - {!!props.refreshing && } - - {!!props.refreshError && ( - - {t( - props.sourceError - ? "investment.syncFailed" - : "accounts.refreshError", - )} - - - - )} - {t("events.hint")} diff --git a/src/pages/account-income/ui/AccountIncomePage/AccountIncomePage.test.tsx b/src/pages/account-income/ui/AccountIncomePage/AccountIncomePage.test.tsx index 106aef7..8d1676d 100644 --- a/src/pages/account-income/ui/AccountIncomePage/AccountIncomePage.test.tsx +++ b/src/pages/account-income/ui/AccountIncomePage/AccountIncomePage.test.tsx @@ -195,7 +195,6 @@ describe("AccountIncomePage", () => { it("keeps income calendar dates in GET and source sync requests", async () => { const requested: string[] = []; - const syncRequests: unknown[] = []; server.use( http.get( "*/api/v1/brokerage-accounts/:accountId/income-analytics", @@ -216,30 +215,11 @@ describe("AccountIncomePage", () => { ); }, ), - http.post("*/api/v1/tbank-sync", async ({ request }) => { - syncRequests.push(await request.json()); - - return HttpResponse.json( - { code: "TBANK_UNAVAILABLE" }, - { status: 503 }, - ); - }), ); renderPage("from=2024-02-29&to=2024-03-01"); - const retry = await screen.findByRole("button", { name: "Повторить" }); + await screen.findByText("Не удалось рассчитать пассивный доход"); expect(requested).toEqual(["?from=2024-02-29&to=2024-03-01"]); - expect(syncRequests).toEqual([]); - fireEvent.click(retry); - await waitFor(() => - expect(syncRequests).toEqual([ - { - accountId: "account-1", - from: "2024-02-29", - screen: "income", - to: "2024-03-01", - }, - ]), - ); + expect(screen.queryByRole("button", { name: "Повторить" })).not.toBeInTheDocument(); }); it("requests a multi-year period from the URL without resetting it", async () => { @@ -486,7 +466,7 @@ describe("AccountIncomePage", () => { ).toBeVisible(); }); - it("shows a recoverable realized error", async () => { + it("shows a quiet realized error", async () => { server.use( http.get( "*/api/v1/brokerage-accounts/account-1/income-analytics", @@ -495,8 +475,11 @@ describe("AccountIncomePage", () => { ); renderPage(); expect( - await screen.findByRole("button", { name: "Повторить" }), + await screen.findByText("Не удалось рассчитать пассивный доход", undefined, { + timeout: 4000, + }), ).toBeInTheDocument(); + expect(screen.queryByRole("button", { name: "Повторить" })).not.toBeInTheDocument(); }); }); @@ -631,7 +614,7 @@ describe("income period and snapshot boundary", () => { expect(requests).toEqual(["?from=2026-09-01&to=2026-09-01"]); }); - it("keeps valid data and draft during refetch, warns on failure and retries", async () => { + it("keeps valid data and draft during refetch failure", async () => { respondWithRequestedPeriod([]); const { queryClient } = renderPage(); await screen.findByLabelText("Период"); @@ -653,51 +636,13 @@ describe("income period and snapshot boundary", () => { act(() => { void queryClient.invalidateQueries(); }); - expect( - await screen.findByRole("status", { name: "Обновляем пассивный доход" }), - ).toBeInTheDocument(); expect(screen.getByRole("region", { name: "Выплаты" })).toBeVisible(); expect(screen.getByLabelText("Период")).toHaveTextContent( "02.08.2026 – 27.08.2026", ); release(); - expect( - await screen.findByText(/Показан последний загруженный результат/), - ).toBeInTheDocument(); expect(screen.getByRole("region", { name: "Выплаты" })).toBeVisible(); - server.use( - http.post("*/api/v1/tbank-sync", () => - HttpResponse.json( - { - id: "income", - now: "2026-09-25T00:00:00Z", - scope: { accountId: "account-1", screen: "income" }, - }, - { status: 202 }, - ), - ), - http.get("*/api/v1/tbank-sync/:id", () => - - HttpResponse.json( - { - errorCode: null, - id: "income", - now: "2026-09-25T00:00:00Z", - scope: null, - state: "succeeded", - }, - ), - ), - http.get("*/api/v1/brokerage-accounts/account-1/income-analytics", () => - HttpResponse.json(resource(analytics, { dataRevision: "2" })), - ), - ); - fireEvent.click(screen.getByRole("button", { name: "Повторить" })); - await waitFor(() => - expect( - screen.queryByText(/Показан последний загруженный результат/), - ).not.toBeInTheDocument(), - ); + expect(screen.queryByText(/Показан последний загруженный результат/)).not.toBeInTheDocument(); expect(screen.getByLabelText("Период")).toHaveTextContent( "02.08.2026 – 27.08.2026", ); diff --git a/src/pages/account-income/ui/AccountIncomePage/AccountIncomePage.vm.ts b/src/pages/account-income/ui/AccountIncomePage/AccountIncomePage.vm.ts index 0d52a74..7d4bc42 100644 --- a/src/pages/account-income/ui/AccountIncomePage/AccountIncomePage.vm.ts +++ b/src/pages/account-income/ui/AccountIncomePage/AccountIncomePage.vm.ts @@ -5,7 +5,7 @@ import { useParams, useSearchParams } from "react-router"; import { type IncomeAnalytics, useIncomeAnalytics } from "@/entities/income"; import { useScreenSync } from "@/features/tbank-connection"; -import { isValidPeriod, moscowDate } from "@/shared/lib"; +import { isValidPeriod, moscowDate, useInitialAvailability } from "@/shared/lib"; import { type IncomeDisplayModel, @@ -27,19 +27,13 @@ type AccountIncomePageViewModel display: IncomeDisplayModel; form: ReturnType>; formRevision: string; - lastSuccessfulAt?: null | string; onReset: () => void; onSubmit: (values: IncomeForm) => void; partial?: boolean; - refreshError: boolean; - refreshing: boolean; - retry: () => Promise | undefined; - sourceError?: boolean; state: "loaded"; } | { period: IncomePeriod; - retry: () => Promise | undefined; state: "error"; } | { state: "loading" }; @@ -69,7 +63,7 @@ const useAccountIncomePageViewModel = (): AccountIncomePageViewModel => { const [resetRevision, setResetRevision] = useState(0); const analytics = useIncomeAnalytics(accountId, period); - const sync = useScreenSync( + useScreenSync( { accountId, from: period.from, screen: "income", to: period.to }, [analytics], ); @@ -82,11 +76,20 @@ const useAccountIncomePageViewModel = (): AccountIncomePageViewModel => { form.reset(draftPeriod(period)); }, [accountId, form, period]); - if (analytics.isLoading || !analytics.data) { - return analytics.isError || analytics.meta?.sync.state === "failed" - ? { period, retry: sync.retry, state: "error" } + const availability = useInitialAvailability({ + hasContent: !!analytics.data, + identity: `${accountId}:${period.from}:${period.to}`, + isError: analytics.isError || analytics.meta?.sync.state === "failed", + isFetching: analytics.isFetching, + }); + + if (availability === "loading" && analytics.isLoading) + return { state: "loading" }; + + if (!analytics.data) + return availability === "unavailable" + ? { period, state: "error" } : { state: "loading" }; - } const display = toIncomeDisplayModel(analytics.data, analytics.meta); @@ -109,14 +112,9 @@ const useAccountIncomePageViewModel = (): AccountIncomePageViewModel => { display, form, formRevision: `${accountId}:${period.from}:${period.to}:${resetRevision}`, - lastSuccessfulAt: analytics.meta?.lastSuccessfulAt, onReset, onSubmit, partial: analytics.meta?.availability !== "complete", - refreshError: analytics.isError || sync.sourceError || sync.transportError, - refreshing: analytics.isFetching || sync.refreshing, - retry: sync.retry, - sourceError: sync.sourceError, state: "loaded", }; }; diff --git a/src/pages/account-income/ui/AccountIncomePage/components/AccountIncomePageError.view.tsx b/src/pages/account-income/ui/AccountIncomePage/components/AccountIncomePageError.view.tsx index e4603ea..bdaf3bd 100644 --- a/src/pages/account-income/ui/AccountIncomePage/components/AccountIncomePageError.view.tsx +++ b/src/pages/account-income/ui/AccountIncomePage/components/AccountIncomePageError.view.tsx @@ -1,6 +1,5 @@ import type { FC } from "react"; -import { Button } from "@mantine/core"; import { StateView } from "@wealthledger/ui"; import { useTranslation } from "react-i18next"; @@ -8,12 +7,11 @@ import type { AccountIncomePageViewModel } from "../AccountIncomePage.vm"; type ErrorProps = Extract; -const AccountIncomePageError: FC = (props) => { +const AccountIncomePageError: FC = () => { const { t } = useTranslation(); return ( {t("income.retry")}} error text={t("income.errorText")} title={t("income.errorTitle")} diff --git a/src/pages/account-income/ui/AccountIncomePage/components/AccountIncomePageLoaded.view.tsx b/src/pages/account-income/ui/AccountIncomePage/components/AccountIncomePageLoaded.view.tsx index 219c1f6..50db1bc 100644 --- a/src/pages/account-income/ui/AccountIncomePage/components/AccountIncomePageLoaded.view.tsx +++ b/src/pages/account-income/ui/AccountIncomePage/components/AccountIncomePageLoaded.view.tsx @@ -2,19 +2,13 @@ import type { FC } from "react"; import { Alert, - Button, - Group, - Loader, Stack, - Text, Title, } from "@mantine/core"; import { StateView } from "@wealthledger/ui"; import { FormProvider } from "react-hook-form"; import { useTranslation } from "react-i18next"; -import { SourceSyncStatus } from "@/shared/ui"; - import type { AccountIncomePageViewModel } from "../AccountIncomePage.vm"; import classes from "../AccountIncomePage.module.css"; @@ -40,21 +34,14 @@ const AccountIncomePageLoadedSummary: FC = (props) => { }; const AccountIncomePageLoaded: FC = (props) => { - const { display, form, onReset, onSubmit, refreshError, refreshing, retry } - = props; + const { display, form, onReset, onSubmit } = props; const { t } = useTranslation(); return ( - - {t("income.title")} - - = (props) => { /> - {!!refreshing && ( - - - - {t("income.refreshing")} - - )} - - {!!refreshError && ( - - - - {t( - props.sourceError - ? "investment.syncFailed" - : "income.refreshError", - )} - - - - - - )} - {t("income.taxBoundary")} diff --git a/src/pages/account-operations/ui/AccountOperationsPage/AccountOperationsPage.test.tsx b/src/pages/account-operations/ui/AccountOperationsPage/AccountOperationsPage.test.tsx index ab4f146..6a0f9fe 100644 --- a/src/pages/account-operations/ui/AccountOperationsPage/AccountOperationsPage.test.tsx +++ b/src/pages/account-operations/ui/AccountOperationsPage/AccountOperationsPage.test.tsx @@ -346,7 +346,7 @@ describe("AccountOperationsPage", () => { , ); - await screen.findByRole("button", { name: "Повторить" }); + await screen.findByRole("button", { name: "Сбросить" }); fireEvent.click(screen.getByRole("button", { name: "Сбросить" })); await screen.findByLabelText("Период"); expect(screen.getByLabelText("URL")).toBeEmptyDOMElement(); @@ -484,7 +484,9 @@ describe("AccountOperationsPage", () => { ); renderPage(); expect( - await screen.findByText("Не удалось загрузить журнал"), + await screen.findByText("Не удалось загрузить журнал", undefined, { + timeout: 4000, + }), ).toBeInTheDocument(); }); }); @@ -520,7 +522,7 @@ it("keeps UTC operation boundaries in GET and source sync requests", async () => }), ); renderPage("?from=2024-02-29&to=2024-03-01&categories=trade"); - const retry = await screen.findByRole("button", { name: "Повторить" }); + await screen.findByRole("button", { name: "Сбросить" }); expect(requested).toEqual([ { categories: "trade", @@ -530,19 +532,6 @@ it("keeps UTC operation boundaries in GET and source sync requests", async () => }, ]); expect(syncRequests).toEqual([]); - fireEvent.click(retry); - await waitFor(() => - expect(syncRequests).toEqual([ - { - accountId: "account-1", - categories: ["trade"], - from: "2024-02-29T00:00:00.000Z", - limit: 100, - screen: "operations", - to: "2024-03-01T23:59:59.999Z", - }, - ]), - ); }); it("does not label incomplete empty operations as a confirmed empty period", async () => { @@ -595,7 +584,6 @@ it("recovers an invalid cursor at the first page without clearing applied filter ); renderPage("?from=2026-08-01&to=2026-08-14&categories=trade"); fireEvent.click(await screen.findByRole("button", { name: "Далее" })); - fireEvent.click(await screen.findByRole("button", { name: "Повторить" })); await waitFor(() => expect(searches).toHaveLength(3)); assert.isDefined(searches[0]); assert.isDefined(searches[2]); diff --git a/src/pages/account-operations/ui/AccountOperationsPage/AccountOperationsPage.vm.ts b/src/pages/account-operations/ui/AccountOperationsPage/AccountOperationsPage.vm.ts index 6b9f5fe..db29494 100644 --- a/src/pages/account-operations/ui/AccountOperationsPage/AccountOperationsPage.vm.ts +++ b/src/pages/account-operations/ui/AccountOperationsPage/AccountOperationsPage.vm.ts @@ -11,7 +11,7 @@ import { } from "@/entities/broker-operation"; import { useScreenSync } from "@/features/tbank-connection"; import { ApiErrorCode, apiErrorCode, isApiErrorCode } from "@/shared/api"; -import { isValidPeriod, useUrlPeriod } from "@/shared/lib"; +import { isValidPeriod, useInitialAvailability, useUrlPeriod } from "@/shared/lib"; const operationCategorySet = new Set(operationCategories); @@ -24,7 +24,6 @@ type AccountOperationsPageViewModel hasPrevious: boolean; historyLoading?: boolean; items: BrokerageOperation[]; - lastSuccessfulAt?: null | string; onApply: () => void; onCategoriesChange: (value: string[]) => void; onNext: () => void; @@ -32,13 +31,9 @@ type AccountOperationsPageViewModel onPrevious: () => void; onReset: () => void; partial?: boolean; - refreshError?: boolean; - refreshing?: boolean; - retry?: () => void; - sourceError?: boolean; state: "loaded"; } - | { onReset: () => void; retry: () => void; state: "error" } + | { onReset: () => void; state: "error" } | { state: "loading" }; const useAccountOperationsPageVm = (): AccountOperationsPageViewModel => { @@ -85,19 +80,28 @@ const useAccountOperationsPageVm = (): AccountOperationsPageViewModel => { history.reset(); } - const sync = useScreenSync( + useScreenSync( { accountId, screen: "operations", ...firstPageQuery }, [operations], ); - if (operations.isLoading) return { state: "loading" }; + const availability = useInitialAvailability({ + hasContent: !!operations.data, + identity: scope, + isError: operations.isError || operations.meta?.sync.state === "failed", + isFetching: operations.isFetching, + }); + + if (availability === "loading" && operations.isLoading) + return { state: "loading" }; + + if (history.isRecoveringInvalidCursor) + return { state: "loading" }; const resetQueryKey = brokerageOperationsQueryOptions(accountId, { limit: 100, }).queryKey; - const retry = () => history.retry(sync.retry); - const onReset = () => { setDraftPeriod([null, null]); setDraftCategories([]); @@ -106,16 +110,22 @@ const useAccountOperationsPageVm = (): AccountOperationsPageViewModel => { void queryClient.invalidateQueries({ queryKey: resetQueryKey }); }; + const isInvalidCursor = isApiErrorCode( + apiErrorCode(operations.error), + ApiErrorCode.InvalidOperationsCursor, + ); + if ( - (operations.isError || operations.meta?.sync.state === "failed") - && (!operations.data - || isApiErrorCode( - apiErrorCode(operations.error), - ApiErrorCode.InvalidOperationsCursor, - )) + (isInvalidCursor || !operations.data) + && (operations.isError || operations.meta?.sync.state === "failed") ) - return { onReset, retry, state: "error" }; - if (!operations.data) return { state: "loading" }; + return { onReset, state: "error" }; + + if (!operations.data) + return availability === "unavailable" + ? { onReset, state: "error" } + : { state: "loading" }; + const nextCursor = operations.data.nextCursor; const isDirty @@ -133,7 +143,6 @@ const useAccountOperationsPageVm = (): AccountOperationsPageViewModel => { operations.meta?.coverage?.historyState === "loading" || operations.meta?.coverage?.historyState === "partial", items: operations.data.items, - lastSuccessfulAt: operations.meta?.lastSuccessfulAt, onApply: () => { if (!isValidPeriod(draftFrom, draftTo)) return; setSearchParameters({ @@ -155,10 +164,6 @@ const useAccountOperationsPageVm = (): AccountOperationsPageViewModel => { onPrevious: history.onPrevious, onReset, partial: operations.meta?.availability !== "complete", - refreshError: operations.isError || sync.sourceError || sync.transportError, - refreshing: operations.isFetching || sync.refreshing, - retry, - sourceError: sync.sourceError, state: "loaded", }; }; diff --git a/src/pages/account-operations/ui/AccountOperationsPage/components/AccountOperationsPageError.view.tsx b/src/pages/account-operations/ui/AccountOperationsPage/components/AccountOperationsPageError.view.tsx index fd1fdf6..a45e4a0 100644 --- a/src/pages/account-operations/ui/AccountOperationsPage/components/AccountOperationsPageError.view.tsx +++ b/src/pages/account-operations/ui/AccountOperationsPage/components/AccountOperationsPageError.view.tsx @@ -1,6 +1,6 @@ import type { FC } from "react"; -import { Button, Group } from "@mantine/core"; +import { Button } from "@mantine/core"; import { StateView } from "@wealthledger/ui"; import { useTranslation } from "react-i18next"; @@ -14,21 +14,15 @@ type AccountOperationsPageErrorProps = Extract< const AccountOperationsPageError: FC = ( props, ) => { - const { retry } = props; const { t } = useTranslation(); return ( - - - - + )} - error text={t("ledger.errorText")} title={t("ledger.errorTitle")} /> diff --git a/src/pages/account-operations/ui/AccountOperationsPage/components/AccountOperationsPageLoaded.view.tsx b/src/pages/account-operations/ui/AccountOperationsPage/components/AccountOperationsPageLoaded.view.tsx index 504c644..18a69e7 100644 --- a/src/pages/account-operations/ui/AccountOperationsPage/components/AccountOperationsPageLoaded.view.tsx +++ b/src/pages/account-operations/ui/AccountOperationsPage/components/AccountOperationsPageLoaded.view.tsx @@ -5,7 +5,6 @@ import { Button, Group, MultiSelect, - Progress, Stack, Title, } from "@mantine/core"; @@ -14,7 +13,6 @@ import { StateView } from "@wealthledger/ui"; import { useTranslation } from "react-i18next"; import { LedgerEntryRow, operationCategories } from "@/entities/broker-operation"; -import { SourceSyncStatus } from "@/shared/ui"; import type { AccountOperationsPageViewModel } from "../AccountOperationsPage.vm"; @@ -62,34 +60,12 @@ const AccountOperationsPageLoaded: FC = ( return ( - - {t("ledger.title")} - - {!!props.partial && {t("investment.partial")}} {!!props.historyLoading && {t("investment.history")}} - {!!props.refreshing && } - - {!!props.refreshError && ( - - {t( - props.sourceError - ? "investment.syncFailed" - : "accounts.refreshError", - )} - - - - )} - Promise | undefined; state: "error"; to: string } - | { state: "empty" | "loading" | "partial"; to: string; - }; + } + | { state: "error"; to: string } + | { + state: "loaded"; + summary: IncomeSummary; + to: string; + } + ; type AccountPageRecentEvents = BrokerageEventsPreviewState; @@ -57,20 +55,16 @@ type PreviewResource = { function toIncomeSummary( accountId: string | undefined, income: PreviewResource, - retry: () => Promise, ): AccountPageIncomeSummary { const to = `/accounts/${accountId}/income`; if (!income.data && !income.isError && income.meta?.sync.state !== "failed") return { state: "loading", to }; if (income.meta?.availability === "partial") return { state: "partial", to }; if (!income.data && (income.isError || income.meta?.sync.state === "failed")) - return { retry, state: "error", to }; + return { state: "error", to }; if (!income.data?.totalsByCurrency.length) return { state: "empty", to }; return { - lastSuccessfulAt: income.meta?.lastSuccessfulAt, - refreshError: income.isError || income.meta?.sync.state === "failed", - stale: income.meta?.freshness === "stale", state: "loaded", summary: income.data, to, @@ -97,9 +91,6 @@ function toRecentEvents( return { items, - lastSuccessfulAt: events.meta?.lastSuccessfulAt, - refreshError: events.isError || events.meta?.sync.state === "failed", - stale: events.meta?.freshness === "stale", state: "loaded", to, }; diff --git a/src/pages/account/ui/AccountPage/AccountPage.test.tsx b/src/pages/account/ui/AccountPage/AccountPage.test.tsx index 94afba2..de60722 100644 --- a/src/pages/account/ui/AccountPage/AccountPage.test.tsx +++ b/src/pages/account/ui/AccountPage/AccountPage.test.tsx @@ -1,7 +1,6 @@ import { MantineProvider } from "@mantine/core"; import { type QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { - fireEvent, render, screen, waitFor, @@ -261,7 +260,7 @@ describe("AccountPage states", () => { it.each(["NOT_FOUND", "TBANK_NOT_CONNECTED", "INVALID_TBANK_TOKEN"])( "does not offer retry without cached data for %s", (code) => { - renderPage(); + renderPage(); expect( screen.queryByRole("button", { name: "Повторить" }), ).not.toBeInTheDocument(); @@ -274,12 +273,16 @@ describe("AccountPage states", () => { }, ); - it.each(["TBANK_UNAVAILABLE", "UNKNOWN"])("allows retry for %s", (code) => { - const retry = vi.fn(); - renderPage(); - fireEvent.click(screen.getByRole("button", { name: "Повторить" })); - expect(retry).toHaveBeenCalledOnce(); - }); + it.each(["TBANK_UNAVAILABLE", "UNKNOWN"])( + "shows neutral unavailable without retry for %s", + (code) => { + renderPage(); + expect(screen.getByRole("heading", { name: "Пока недоступно" })) + .toBeInTheDocument(); + expect(screen.queryByRole("button", { name: "Повторить" })) + .not.toBeInTheDocument(); + }, + ); it("shows supplied cash separately without adding currency instruments or recalculating totals", () => { renderPage( @@ -405,11 +408,9 @@ describe("AccountPage states", () => { expect( screen.getByRole("heading", { level: 1, name: "Портфель" }), ).toBeInTheDocument(); - expect( - screen.getByText( - "T-Bank временно недоступен. Показан последний успешный снимок.", - ), - ).toBeInTheDocument(); + expect(screen.queryByText(/T-Bank временно недоступен/)) + .not.toBeInTheDocument(); + expect(screen.queryByText(/Данные получены/)).not.toBeInTheDocument(); expect(screen.getByRole("button", { name: "Акции" })).toBeInTheDocument(); expect( screen.getByRole("button", { name: "Облигации" }), @@ -573,7 +574,7 @@ describe("AccountPage states", () => { ); expect( - screen.getByText("Не удалось загрузить последние события."), + screen.getByText("Пока недоступно"), ).toBeInTheDocument(); expect(screen.getByText("Вторая")).toBeInTheDocument(); }); @@ -742,13 +743,13 @@ describe("AccountPage states", () => { ); expect( - screen.getByText("Не удалось загрузить будущие события."), + screen.getByText("Данные появятся здесь, когда чтение восстановится."), ).toBeInTheDocument(); expect(screen.getByText("Вторая")).toBeInTheDocument(); }); it.each([503])( - "preserves totals and UTC snapshot through refresh error %i, retry and success", + "preserves totals quietly through refresh error %i and success", async (status) => { const initialPortfolio: Portfolio = { @@ -821,40 +822,30 @@ describe("AccountPage states", () => { }); expect(structure).toHaveTextContent("10 ₽"); - const snapshotText = screen.getByText(/Данные получены/).textContent; - expect(snapshotText).toContain("10:00"); + expect(screen.queryByText(/Данные получены/)).not.toBeInTheDocument(); void queryClient.invalidateQueries({ queryKey: portfolioQueryOptions("account-1").queryKey, }); - expect( - await screen.findByText( - "Не удалось обновить портфель. Показан последний полученный снимок.", - ), - ).toBeInTheDocument(); - expect( - screen.getByText( - "T-Bank временно недоступен. Показан последний успешный снимок.", - ), - ).toBeInTheDocument(); + await waitFor(() => expect(requestCount).toBe(2)); + expect(screen.queryByText(/Не удалось обновить портфель/)) + .not.toBeInTheDocument(); + expect(screen.queryByText(/T-Bank временно недоступен/)) + .not.toBeInTheDocument(); expect(screen.getByText("Вторая")).toBeInTheDocument(); expect( screen.getAllByRole("definition").map(node => node.textContent), ).toEqual(["1 234,5 ₽", "0,5 $"]); - // eslint-disable-next-line jest-dom/prefer-to-have-text-content -- The cached timestamp must remain exactly unchanged. - expect(screen.getByText(/Данные получены/).textContent).toBe( - snapshotText, - ); - fireEvent.click(screen.getByRole("button", { name: "Повторить" })); + expect(screen.queryByRole("button", { name: "Повторить" })) + .not.toBeInTheDocument(); + void queryClient.invalidateQueries({ + queryKey: portfolioQueryOptions("account-1").queryKey, + }); await waitFor(() => expect(requestCount).toBe(3)); expect(structure).toHaveTextContent("10 ₽"); expect( screen.getAllByRole("definition").map(node => node.textContent), ).toEqual(["1 234,5 ₽", "0,5 $"]); - // eslint-disable-next-line jest-dom/prefer-to-have-text-content -- The cached timestamp must remain exactly unchanged. - expect(screen.getByText(/Данные получены/).textContent).toBe( - snapshotText, - ); resolveRetry?.( HttpResponse.json( resource( @@ -875,7 +866,7 @@ describe("AccountPage states", () => { screen.getAllByRole("definition").map(node => node.textContent), ).toEqual(["-0,5 $", "2,50 €"]), ); - expect(screen.getByText(/Данные получены/)).toHaveTextContent("11:30"); + expect(screen.queryByText(/Данные получены/)).not.toBeInTheDocument(); expect(structure).not.toHaveTextContent("10 ₽"); expect(structure).toHaveTextContent("Нет положительной стоимости"); expect( @@ -916,13 +907,12 @@ describe("AccountPage states", () => { expect( screen.getAllByRole("definition").map(node => node.textContent), ).toEqual(["1 234,5 ₽", "0,5 $"]); - expect(screen.getByText(/Данные получены/)).toHaveTextContent("10:00"); + expect(screen.queryByText(/Данные получены/)).not.toBeInTheDocument(); expect( screen.queryByRole("status", { name: "Загрузка" }), ).not.toBeInTheDocument(); - expect( - screen.getByRole("status", { name: "Обновляем портфель" }), - ).toBeInTheDocument(); + expect(screen.queryByRole("status", { name: "Обновляем портфель" })) + .not.toBeInTheDocument(); resolveRefresh?.(HttpResponse.json(resource(portfolio))); }); diff --git a/src/pages/account/ui/AccountPage/AccountPage.tsx b/src/pages/account/ui/AccountPage/AccountPage.tsx index edf4835..81b5417 100644 --- a/src/pages/account/ui/AccountPage/AccountPage.tsx +++ b/src/pages/account/ui/AccountPage/AccountPage.tsx @@ -18,10 +18,6 @@ const AccountPage: FC = () => { incomeSummary={viewModel.incomeSummary} recentEvents={viewModel.recentEvents} recentOperations={viewModel.recentOperations} - refreshError={viewModel.refreshError} - refreshing={viewModel.refreshing} - retry={viewModel.retry} - sourceError={viewModel.sourceError} /> ); @@ -35,10 +31,6 @@ const AccountPage: FC = () => { positionSections={viewModel.positionSections} recentEvents={viewModel.recentEvents} recentOperations={viewModel.recentOperations} - refreshError={viewModel.refreshError} - refreshing={viewModel.refreshing} - retry={viewModel.retry} - sourceError={viewModel.sourceError} /> ); }; diff --git a/src/pages/account/ui/AccountPage/AccountPage.vm.test.tsx b/src/pages/account/ui/AccountPage/AccountPage.vm.test.tsx index e0bea05..b6baf4e 100644 --- a/src/pages/account/ui/AccountPage/AccountPage.vm.test.tsx +++ b/src/pages/account/ui/AccountPage/AccountPage.vm.test.tsx @@ -1,7 +1,7 @@ import type { FC, PropsWithChildren } from "react"; import { MantineProvider } from "@mantine/core"; -import { act, renderHook, waitFor } from "@testing-library/react"; +import { renderHook, waitFor } from "@testing-library/react"; import { http, HttpResponse } from "msw"; import { MemoryRouter, Route, Routes } from "react-router"; import { describe, expect, it, vi } from "vitest"; @@ -147,10 +147,10 @@ describe("useAccountPageViewModel", () => { HttpResponse.json(resource(portfolio)), ), http.get("*/api/v1/brokerage-accounts/:accountId/operations", () => - HttpResponse.json({ code: "TBANK_UNAVAILABLE" }, { status: 503 }), + HttpResponse.json({ code: "DEMO_FAILURE" }, { status: 400 }), ), http.get("*/api/v1/brokerage-accounts/:accountId/events", () => - HttpResponse.json({ code: "MOEX_UNAVAILABLE" }, { status: 503 }), + HttpResponse.json({ code: "DEMO_FAILURE" }, { status: 400 }), ), ); @@ -208,7 +208,7 @@ it("keeps overview sections independent when their source data is incomplete", a ); }); -it("refreshes every overview section through one account descriptor and observational reads", async () => { +it("keeps overview sections loaded without exposing technical retry", async () => { configureTestAuth(); const sections: Record @@ -219,48 +219,17 @@ it("refreshes every overview section through one account descriptor and observat portfolio, }; - const observed: string[] = []; - const scopes: unknown[] = []; - let version = "1"; server.use( ...Object.entries(sections).map(([path, data]) => http.get( `*/api/v1/brokerage-accounts/:accountId/${path}`, - ({ request }) => { - if (new URL(request.url).searchParams.get("sync") === "observe") - observed.push(path); - + () => { return HttpResponse.json( - resource(data, { dataRevision: version, resourceKey: path }), + resource(data, { dataRevision: "1", resourceKey: path }), ); }, ), ), - http.post("*/api/v1/tbank-sync", async ({ request }) => { - scopes.push(await request.json()); - version = "2"; - - return HttpResponse.json( - { - id: "overview", - now: "2026-09-25T00:00:00Z", - scope: { accountId: "account-1", screen: "account" }, - }, - { status: 202 }, - ); - }), - http.get("*/api/v1/tbank-sync/:id", () => - - HttpResponse.json( - { - errorCode: null, - id: "overview", - now: "2026-09-25T00:00:00Z", - scope: null, - state: "succeeded", - }, - ), - ), ); const { result } = renderHook(() => useAccountPageViewModel(), { @@ -275,11 +244,5 @@ it("refreshes every overview section through one account descriptor and observat state: "loaded", }), ); - await act(async () => { - if (result.current.state === "loaded") await result.current.retry(); - }); - await waitFor(() => - expect(new Set(observed)).toEqual(new Set(Object.keys(sections))), - ); - expect(scopes).toEqual([{ accountId: "account-1", screen: "account" }]); + expect(result.current).not.toHaveProperty("retry"); }); diff --git a/src/pages/account/ui/AccountPage/AccountPage.vm.ts b/src/pages/account/ui/AccountPage/AccountPage.vm.ts index 77c0341..675e83f 100644 --- a/src/pages/account/ui/AccountPage/AccountPage.vm.ts +++ b/src/pages/account/ui/AccountPage/AccountPage.vm.ts @@ -13,7 +13,8 @@ import { import { useIncomeSummary } from "@/entities/income"; import { usePortfolio } from "@/entities/portfolio"; import { useScreenSync } from "@/features/tbank-connection"; -import { apiErrorCode } from "@/shared/api"; +import { ApiErrorCode, apiErrorCode, isApiErrorCode } from "@/shared/api"; +import { useInitialAvailability } from "@/shared/lib"; import { type AccountPagePositionSection, @@ -35,10 +36,6 @@ type AccountPageContent = { partial?: boolean; recentEvents: AccountPageRecentEvents; recentOperations: AccountPageRecentOperations; - refreshError: boolean; - refreshing: boolean; - retry: () => Promise | undefined; - sourceError?: boolean; }; type AccountPageEmptyViewModel = AccountPageContent & { @@ -54,9 +51,16 @@ type AccountPageLoadedViewModel = AccountPageContent & { type AccountPageViewModel = | AccountPageEmptyViewModel | AccountPageLoadedViewModel - | { code?: string; retry: () => Promise | undefined; state: "error" } + | { code?: string; state: "error" } | { state: "loading" }; +function isPortfolioAccessFailure(code?: string) { + return isApiErrorCode(code, ApiErrorCode.Forbidden) + || isApiErrorCode(code, ApiErrorCode.InvalidTbankToken) + || isApiErrorCode(code, ApiErrorCode.NotFound) + || isApiErrorCode(code, ApiErrorCode.TbankNotConnected); +} + function useAccountPageViewModel(): AccountPageViewModel { const { accountId } = useParams(); const portfolio = usePortfolio(accountId); @@ -69,7 +73,7 @@ function useAccountPageViewModel(): AccountPageViewModel { const income = useIncomeSummary(accountId); const accounts = useBrokerageAccounts(); - const sync = useScreenSync({ accountId, screen: "account" }, [ + useScreenSync({ accountId, screen: "account" }, [ accounts, portfolio, operations, @@ -77,32 +81,28 @@ function useAccountPageViewModel(): AccountPageViewModel { income, ]); - if (!portfolio.data) { - if (portfolio.isError || portfolio.meta?.sync.state === "failed") - return { - code: apiErrorCode(portfolio.error), - retry: sync.retry, - state: "error" as const, - }; + const code = apiErrorCode(portfolio.error); + const isAccessFailure = isPortfolioAccessFailure(code); - return { state: "loading" as const }; - } + const availability = useInitialAvailability({ + hasContent: !!portfolio.data, + identity: accountId ?? "account", + isError: portfolio.isError || portfolio.meta?.sync.state === "failed", + isFetching: portfolio.isFetching, + }); + + if (isAccessFailure) return { code, state: "error" as const }; + + if (!portfolio.data) + return { + state: availability === "unavailable" ? "error" : "loading", + } as const; const account = accounts.data?.find(item => item.id === accountId); const recentOperations = toRecentOperations(accountId, operations); const recentEvents = toRecentEvents(accountId, events); - const incomeSummary = toIncomeSummary( - accountId, income, () => income.refetch(), - ); - - const refresh = { - partial: portfolio.meta?.availability === "partial", - refreshError: portfolio.isError || sync.transportError || sync.sourceError, - refreshing: portfolio.isFetching || sync.refreshing, - retry: sync.retry, - sourceError: sync.sourceError, - }; + const incomeSummary = toIncomeSummary(accountId, income); if ( portfolio.meta?.availability === "complete" @@ -116,19 +116,20 @@ function useAccountPageViewModel(): AccountPageViewModel { recentEvents, recentOperations, state: "empty" as const, - ...refresh, }; + const isPartial = portfolio.meta?.availability === "partial"; + return { account, accountId, incomeSummary, + partial: isPartial, portfolio: portfolio.data, positionSections: toAccountPagePositionSections(portfolio.data), recentEvents, recentOperations, state: "loaded" as const, - ...refresh, }; } diff --git a/src/pages/account/ui/AccountPage/components/AccountPageEmpty.view.tsx b/src/pages/account/ui/AccountPage/components/AccountPageEmpty.view.tsx index 1d3a28b..bf9c35d 100644 --- a/src/pages/account/ui/AccountPage/components/AccountPageEmpty.view.tsx +++ b/src/pages/account/ui/AccountPage/components/AccountPageEmpty.view.tsx @@ -7,7 +7,6 @@ import { useTranslation } from "react-i18next"; import type { BrokerageAccount } from "@/entities/brokerage-account"; import { BrokerageEventsPreview } from "@/entities/brokerage-event"; -import { InvestmentRefreshState } from "@/features/tbank-connection"; import type { AccountPageIncomeSummary, @@ -26,10 +25,6 @@ type AccountPageEmptyProps = { incomeSummary?: AccountPageIncomeSummary; recentEvents: AccountPageRecentEvents; recentOperations: AccountPageRecentOperations; - refreshError?: boolean; - refreshing?: boolean; - retry?: () => void; - sourceError?: boolean; }; const AccountPageEmpty: FC = (props) => { @@ -45,14 +40,6 @@ const AccountPageEmpty: FC = (props) => { - - void }; +type AccountPageErrorProps = { code?: string }; const AccountPageError: FC = (props) => { - const { code, retry } = props; + const { code } = props; const { t } = useTranslation(); if (isApiErrorCode(code, ApiErrorCode.NotFound)) return ( @@ -25,6 +25,7 @@ const AccountPageError: FC = (props) => { title={t("portfolio.accountUnavailableTitle")} /> ); + if ( isApiErrorCode(code, ApiErrorCode.TbankNotConnected) || isApiErrorCode(code, ApiErrorCode.InvalidTbankToken) @@ -41,22 +42,11 @@ const AccountPageError: FC = (props) => { title={t("portfolio.connectionErrorTitle")} /> ); - if (isApiErrorCode(code, ApiErrorCode.TbankUnavailable)) - return ( - {t("accounts.retry")}} - error - text={t("accounts.unavailableText")} - title={t("accounts.unavailableTitle")} - /> - ); return ( {t("accounts.retry")}} - error - text={t("states.errorText")} - title={t("states.errorTitle")} + text={t("states.unavailableText")} + title={t("states.unavailableTitle")} /> ); }; diff --git a/src/pages/account/ui/AccountPage/components/AccountPageLoaded.view.tsx b/src/pages/account/ui/AccountPage/components/AccountPageLoaded.view.tsx index c302c24..892b1c9 100644 --- a/src/pages/account/ui/AccountPage/components/AccountPageLoaded.view.tsx +++ b/src/pages/account/ui/AccountPage/components/AccountPageLoaded.view.tsx @@ -1,14 +1,12 @@ import type { FC } from "react"; -import { Accordion, Alert, Stack, Text } from "@mantine/core"; +import { Accordion, Alert, Stack } from "@mantine/core"; import { useTranslation } from "react-i18next"; import type { BrokerageAccount } from "@/entities/brokerage-account"; import type { Portfolio } from "@/entities/portfolio"; import { BrokerageEventsPreview } from "@/entities/brokerage-event"; -import { InvestmentRefreshState } from "@/features/tbank-connection"; -import { formatSnapshotTime } from "@/shared/lib"; import type { AccountPagePositionSection } from "../../../model/positions"; import type { @@ -34,10 +32,6 @@ type AccountPageLoadedProps = { positionSections: AccountPagePositionSection[]; recentEvents: AccountPageRecentEvents; recentOperations: AccountPageRecentOperations; - refreshError?: boolean; - refreshing?: boolean; - retry?: () => void; - sourceError?: boolean; }; const AccountPageLoaded: FC = (props) => { @@ -55,27 +49,6 @@ const AccountPageLoaded: FC = (props) => { - - - {!!props.portfolio.isStale && {t("portfolio.staleWarning")}} - - - {t( - props.accountId === "all" - ? "portfolio.allUpdatedAt" - : "portfolio.updatedAt", - { - date: formatSnapshotTime(props.portfolio.lastSuccessfulAt), - }, - )} - - {props.partial ? {t("investment.partial")} : } diff --git a/src/pages/account/ui/AccountPage/components/IncomeSummary.view.tsx b/src/pages/account/ui/AccountPage/components/IncomeSummary.view.tsx index 7a7afcf..56d91a3 100644 --- a/src/pages/account/ui/AccountPage/components/IncomeSummary.view.tsx +++ b/src/pages/account/ui/AccountPage/components/IncomeSummary.view.tsx @@ -8,30 +8,30 @@ import { Link } from "react-router"; import type { IncomeSummary as IncomeSummaryData } from "@/entities/income"; import { formatMoney } from "@/shared/lib"; -import { SourceSyncStatus } from "@/shared/ui"; type IncomeSummaryProps = | { - lastSuccessfulAt?: null | string; - refreshError?: boolean; - stale?: boolean; + state: "empty"; + to: string; + } + | { state: "error"; to: string } + | { state: "loaded"; summary: IncomeSummaryData; to: string; } - | { retry: () => void; state: "error"; to: string } - | { state: "empty"; to: string } - | { state: "loading"; to: string } - | { state: "partial"; to: string }; + | { + state: "loading"; + to: string; + } + | { + state: "partial"; + to: string; + }; const IncomeSummary: FC = (props) => { const { t } = useTranslation(); - const errorText - = props.state === "loaded" && props.refreshError - ? t("income.refreshError") - : null; - if (props.state === "loading" || props.state === "partial") return ( @@ -45,9 +45,6 @@ const IncomeSummary: FC = (props) => { if (props.state === "error") return ( {t("income.summaryRetry")} - } error text={t("income.errorText")} title={t("income.summaryError")} @@ -66,12 +63,6 @@ const IncomeSummary: FC = (props) => { return ( - - {props.summary.totalsByCurrency.map(total => ( {formatMoney(total.total)} diff --git a/src/pages/account/ui/AccountPage/components/RecentOperations.view.tsx b/src/pages/account/ui/AccountPage/components/RecentOperations.view.tsx index 7e6acf1..84d5918 100644 --- a/src/pages/account/ui/AccountPage/components/RecentOperations.view.tsx +++ b/src/pages/account/ui/AccountPage/components/RecentOperations.view.tsx @@ -1,12 +1,11 @@ import type { FC } from "react"; -import { Alert, Button, Skeleton, Stack, Text } from "@mantine/core"; +import { Button, Skeleton, Stack, Text } from "@mantine/core"; import { LoadingSkeleton } from "@wealthledger/ui"; import { useTranslation } from "react-i18next"; import { Link } from "react-router"; import { LedgerEntryRow } from "@/entities/broker-operation"; -import { SourceSyncStatus } from "@/shared/ui"; import type { AccountPageRecentOperations } from "../../../model/previews"; @@ -18,28 +17,15 @@ const RecentOperations: FC = (props) => { const { t } = useTranslation(); const { operations } = props; - const errorText - = operations.state === "loaded" && operations.refreshError - ? t("accounts.refreshError") - : null; - return ( - {operations.state === "loaded" && ( - - )} - {operations.state === "loading" && ( {["first", "second", "third"].map(placeholder => )} )} - {operations.state === "error" && {t("ledger.recentError")}} + {operations.state === "error" && {t("states.unavailableTitle")}} {operations.state === "empty" && {t("ledger.recentEmpty")}} diff --git a/src/pages/accounts/ui/AccountsPage/AccountsPage.test.tsx b/src/pages/accounts/ui/AccountsPage/AccountsPage.test.tsx index 6e69741..3d9431a 100644 --- a/src/pages/accounts/ui/AccountsPage/AccountsPage.test.tsx +++ b/src/pages/accounts/ui/AccountsPage/AccountsPage.test.tsx @@ -1,6 +1,6 @@ import { MantineProvider } from "@mantine/core"; import { type QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { fireEvent, render, screen, waitFor } from "@testing-library/react"; +import { render, screen, waitFor } from "@testing-library/react"; import { http, HttpResponse } from "msw"; import { MemoryRouter } from "react-router"; import { describe, expect, it, vi } from "vitest"; @@ -58,10 +58,11 @@ describe("AccountsPage", () => { }), ); renderPage(createTestQueryClient()); - fireEvent.click(await screen.findByRole("button", { name: "Повторить" })); - expect(await screen.findByText(account.name)).toBeVisible(); + expect(await screen.findByText(account.name, undefined, { + timeout: 4000, + })).toBeVisible(); - expect(modes).toEqual([null, "observe"]); + expect(modes).toEqual([null, null]); }); it.each([ ["loading", AccountsPageLoading, "status"], @@ -81,17 +82,16 @@ describe("AccountsPage", () => { ).toBeInTheDocument(); }); - it("routes connection errors to settings and keeps retry available", () => { - const retry = vi.fn(); + it("routes connection errors to settings without technical retry", () => { render( - + , ); - fireEvent.click(screen.getByRole("button", { name: "Повторить" })); - expect(retry).toHaveBeenCalledOnce(); + expect(screen.queryByRole("button", { name: "Повторить" })) + .not.toBeInTheDocument(); expect( screen.getByRole("link", { name: "Открыть настройки T-Bank" }), ).toHaveAttribute("href", "/settings"); @@ -123,14 +123,13 @@ describe("AccountsPage", () => { await waitFor(() => expect(requestCount).toBe(2)); expect(screen.getByText(account.name)).toBeInTheDocument(); - expect( - screen.getByRole("status", { name: "Обновляем данные" }), - ).toBeInTheDocument(); + expect(screen.queryByRole("status", { name: "Обновляем данные" })) + .not.toBeInTheDocument(); resolveRefresh?.(HttpResponse.json(resource([account]))); }); - it("keeps the cached account list and offers retry after a refresh error", async () => { + it("keeps the cached account list quietly after a refresh error", async () => { const requests: unknown[] = []; server.use( http.post("*/api/v1/tbank-sync", async ({ request }) => { @@ -161,17 +160,15 @@ describe("AccountsPage", () => { queryKey: brokerageAccountsQueryKey, }); - const warning = await screen.findByText( - "Не удалось обновить данные. Показаны последние полученные.", - ); - - expect(warning).toBeInTheDocument(); + await waitFor(() => expect(requestCount).toBe(2)); + expect( + screen.queryByText( + "Не удалось обновить данные. Показаны последние полученные.", + ), + ).not.toBeInTheDocument(); + expect(screen.queryByRole("button", { name: "Повторить" })) + .not.toBeInTheDocument(); expect(screen.getByText(account.name)).toBeInTheDocument(); - - fireEvent.click(screen.getByRole("button", { name: "Повторить" })); - await waitFor(() => expect(requestCount).toBe(3)); - await waitFor(() => expect(warning).not.toBeInTheDocument()); - expect(screen.getByText(account.name)).toBeVisible(); expect(requests).toEqual([]); }); @@ -194,11 +191,12 @@ describe("AccountsPage", () => { queryKey: brokerageAccountsQueryKey, }); + await waitFor(() => expect(requestCount).toBe(2)); expect( - await screen.findByText( + screen.queryByText( "Не удалось обновить данные. Показаны последние полученные.", ), - ).toBeInTheDocument(); + ).not.toBeInTheDocument(); expect(screen.getByText("Нет инвестиционных счетов")).toBeInTheDocument(); }); }); @@ -226,7 +224,7 @@ it.each(["idle", "failed"] as const)( .not.toBeInTheDocument(); if (state === "failed") // eslint-disable-next-line vitest/no-conditional-expect -- Each fixed state has a different observable recovery contract. - expect(await screen.findByRole("button", { name: "Повторить" })) + expect(await screen.findByRole("heading", { name: "Пока недоступно" })) .toBeVisible(); else // eslint-disable-next-line vitest/no-conditional-expect -- Each fixed state has a different observable recovery contract. diff --git a/src/pages/accounts/ui/AccountsPage/AccountsPage.tsx b/src/pages/accounts/ui/AccountsPage/AccountsPage.tsx index ef6828f..241d6b6 100644 --- a/src/pages/accounts/ui/AccountsPage/AccountsPage.tsx +++ b/src/pages/accounts/ui/AccountsPage/AccountsPage.tsx @@ -10,25 +10,11 @@ const AccountsPage: FC = () => { const viewModel = useAccountsPageViewModel(); if (viewModel.state === "loading") return ; if (viewModel.state === "error") return ; - if (viewModel.state === "empty") - return ( - - ); + if (viewModel.state === "empty") return ; return ( ); }; diff --git a/src/pages/accounts/ui/AccountsPage/AccountsPage.vm.ts b/src/pages/accounts/ui/AccountsPage/AccountsPage.vm.ts index e7cd89e..9f60141 100644 --- a/src/pages/accounts/ui/AccountsPage/AccountsPage.vm.ts +++ b/src/pages/accounts/ui/AccountsPage/AccountsPage.vm.ts @@ -1,45 +1,54 @@ import { + type BrokerageAccountCard, brokerageAccountCards, useBrokerageAccounts, } from "@/entities/brokerage-account"; import { useScreenSync } from "@/features/tbank-connection"; -import { apiErrorCode } from "@/shared/api"; +import { ApiErrorCode, apiErrorCode, isApiErrorCode } from "@/shared/api"; +import { useInitialAvailability } from "@/shared/lib"; -function useAccountsPageViewModel() { +type AccountsPageViewModel + = | { accounts: BrokerageAccountCard[]; state: "loaded" } + | { code?: string; state: "error" } + | { state: "empty" } + | { state: "loading" }; + +function isAccountsAccessFailure(code?: string) { + return isApiErrorCode(code, ApiErrorCode.InvalidTbankToken) + || isApiErrorCode(code, ApiErrorCode.TbankNotConnected); +} + +function useAccountsPageViewModel(): AccountsPageViewModel { const accounts = useBrokerageAccounts(); - const sync = useScreenSync({ screen: "accounts" }, [accounts]); + useScreenSync({ screen: "accounts" }, [accounts]); - if ( - !accounts.data - || (accounts.meta?.availability === "partial" && accounts.data.length === 0) - ) { - if (!accounts.isError && accounts.meta?.sync.state !== "failed") - return { state: "loading" as const }; + const code = apiErrorCode(accounts.error); + const isAccessFailure = isAccountsAccessFailure(code); + const hasResult = !!accounts.data + && !(accounts.meta?.availability === "partial" && accounts.data.length === 0); + + const availability = useInitialAvailability({ + hasContent: hasResult, + identity: "accounts", + isError: accounts.isError || accounts.meta?.sync.state === "failed", + isFetching: accounts.isFetching, + }); + + if (isAccessFailure) return { code, state: "error" as const }; + + if (!hasResult || !accounts.data) return { - code: apiErrorCode(accounts.error), - retry: sync.retry, - state: "error" as const, - }; - } - - const refresh = { - lastSuccessfulAt: accounts.meta?.lastSuccessfulAt, - refreshError: accounts.isError || sync.transportError || sync.sourceError, - refreshing: accounts.isFetching || sync.refreshing, - retry: sync.retry, - sourceError: sync.sourceError, - }; + state: availability === "unavailable" ? "error" : "loading", + } as const; if (accounts.data.length === 0) return { - ...refresh, state: "empty" as const, }; return { accounts: brokerageAccountCards(accounts.data, accounts.meta?.dependencies), - ...refresh, state: "loaded" as const, }; } diff --git a/src/pages/accounts/ui/AccountsPage/components/AccountsPageEmpty.view.tsx b/src/pages/accounts/ui/AccountsPage/components/AccountsPageEmpty.view.tsx index a7908cf..3680b6a 100644 --- a/src/pages/accounts/ui/AccountsPage/components/AccountsPageEmpty.view.tsx +++ b/src/pages/accounts/ui/AccountsPage/components/AccountsPageEmpty.view.tsx @@ -1,26 +1,16 @@ import type { FC } from "react"; -import { Stack } from "@mantine/core"; import { StateView } from "@wealthledger/ui"; import { useTranslation } from "react-i18next"; -import { - InvestmentRefreshState, - type InvestmentRefreshStateProps, -} from "@/features/tbank-connection"; - -const AccountsPageEmpty: FC = (props) => { +const AccountsPageEmpty: FC = () => { const { t } = useTranslation(); return ( - - - - - + ); }; diff --git a/src/pages/accounts/ui/AccountsPage/components/AccountsPageError.view.tsx b/src/pages/accounts/ui/AccountsPage/components/AccountsPageError.view.tsx index 35132d7..7ad5c98 100644 --- a/src/pages/accounts/ui/AccountsPage/components/AccountsPageError.view.tsx +++ b/src/pages/accounts/ui/AccountsPage/components/AccountsPageError.view.tsx @@ -1,16 +1,16 @@ import type { FC } from "react"; -import { Button, Stack } from "@mantine/core"; +import { Button } from "@mantine/core"; import { StateView } from "@wealthledger/ui"; import { useTranslation } from "react-i18next"; import { Link } from "react-router"; import { ApiErrorCode, isApiErrorCode } from "@/shared/api"; -type AccountsPageErrorProps = { code?: string; retry?: () => void }; +type AccountsPageErrorProps = { code?: string }; const AccountsPageError: FC = (props) => { - const { code, retry } = props; + const { code } = props; const { t } = useTranslation(); const settingsAction = ( @@ -37,28 +37,11 @@ const AccountsPageError: FC = (props) => { title={t("accounts.invalidTokenTitle")} /> ); - if (isApiErrorCode(code, ApiErrorCode.TbankUnavailable)) - return ( - - - - {settingsAction} - - )} - error - text={t("accounts.unavailableText")} - title={t("accounts.unavailableTitle")} - /> - ); return ( {t("accounts.retry")}} - error - text={t("states.errorText")} - title={t("states.errorTitle")} + text={t("states.unavailableText")} + title={t("states.unavailableTitle")} /> ); }; diff --git a/src/pages/accounts/ui/AccountsPage/components/AccountsPageLoaded.view.tsx b/src/pages/accounts/ui/AccountsPage/components/AccountsPageLoaded.view.tsx index b254cb6..4e74c79 100644 --- a/src/pages/accounts/ui/AccountsPage/components/AccountsPageLoaded.view.tsx +++ b/src/pages/accounts/ui/AccountsPage/components/AccountsPageLoaded.view.tsx @@ -8,17 +8,12 @@ import { type BrokerageAccountCard, BrokerageAccountList, } from "@/entities/brokerage-account"; -import { - InvestmentRefreshState, - type InvestmentRefreshStateProps, -} from "@/features/tbank-connection"; -type AccountsPageLoadedProps = InvestmentRefreshStateProps & { +type AccountsPageLoadedProps = { accounts: BrokerageAccountCard[]; }; const AccountsPageLoaded: FC = (props) => { - const { accounts, ...refresh } = props; const { t } = useTranslation(); return ( @@ -31,8 +26,6 @@ const AccountsPageLoaded: FC = (props) => { - - - + ); }; diff --git a/src/pages/bond/ui/BondPage/BondPage.test.tsx b/src/pages/bond/ui/BondPage/BondPage.test.tsx index aa57007..fada25a 100644 --- a/src/pages/bond/ui/BondPage/BondPage.test.tsx +++ b/src/pages/bond/ui/BondPage/BondPage.test.tsx @@ -352,11 +352,7 @@ describe("bond page", () => { it("keeps market content and sold-position history when coupons fail", async () => { setup({ failCoupons: true, noPosition: true }); await screen.findByText("98,125 %"); - const message = await screen.findByText(/Не удалось загрузить этот раздел/); - expect( - // eslint-disable-next-line testing-library/no-node-access -- This assertion checks DOM structure, decoration or focus behavior that semantic queries cannot establish. - message.closest("[role=\"status\"]"), - ).toHaveAttribute("aria-live", "polite"); + expect(screen.queryByRole("button", { name: "Повторить" })).not.toBeInTheDocument(); expect( screen.queryByRole("heading", { name: "Моя позиция" }), ).not.toBeInTheDocument(); @@ -364,38 +360,12 @@ describe("bond page", () => { screen.getByRole("heading", { name: "Моя история событий" }), ).toBeVisible(); }); - it("preserves cached quote on refresh failure", async () => { - const scopes: unknown[] = []; - server.use( - http.post("*/api/v1/tbank-sync", async ({ request }) => { - scopes.push(await request.json()); - - return HttpResponse.json( - { code: "TBANK_UNAVAILABLE" }, - { status: 503 }, - ); - }), - ); + it("preserves cached quote without manual refresh", async () => { const controls = setup({ path: `/bonds/${uid}?period=year&events=trades` }); await screen.findByText("98,125 %"); controls.failQuote(); - fireEvent.click(screen.getByRole("button", { name: "Обновить" })); - const message = await screen.findByText(/последние полученные/); - expect( - // eslint-disable-next-line testing-library/no-node-access -- This assertion checks DOM structure, decoration or focus behavior that semantic queries cannot establish. - message.closest("[role=\"status\"]"), - ).toHaveAttribute("aria-live", "polite"); expect(screen.getByText("98,125 %")).toBeVisible(); - expect(scopes).toEqual([ - { - accountId: "all", - candlePeriod: "year", - categories: ["trade"], - instrumentUid: uid, - limit: 20, - screen: "bond", - }, - ]); + expect(screen.queryByRole("button", { name: "Обновить" })).not.toBeInTheDocument(); }); it("offers search for an ambiguous or missing instrument without loading personal data", async () => { const { requests } = setup({ ambiguousTicker: true, path: "/bonds/SAME" }); diff --git a/src/pages/bond/ui/BondPage/BondPage.tsx b/src/pages/bond/ui/BondPage/BondPage.tsx index a870ea3..5f28d9f 100644 --- a/src/pages/bond/ui/BondPage/BondPage.tsx +++ b/src/pages/bond/ui/BondPage/BondPage.tsx @@ -15,7 +15,6 @@ const BondPage: FC = () => { code={vm.code} kind="bond" loading={vm.bondState.loading} - retry={vm.bondState.retry} /> ); diff --git a/src/pages/bond/ui/BondPage/BondPage.view.tsx b/src/pages/bond/ui/BondPage/BondPage.view.tsx index e6debda..b727fdf 100644 --- a/src/pages/bond/ui/BondPage/BondPage.view.tsx +++ b/src/pages/bond/ui/BondPage/BondPage.view.tsx @@ -1,7 +1,6 @@ import type { FC } from "react"; import { - Alert, Badge, Group, Skeleton, @@ -137,8 +136,6 @@ const BondPageView: FC = (props) => { @@ -156,20 +153,8 @@ const BondPageView: FC = (props) => { )} - {!!(vm.refreshError || vm.bondState.error || vm.quoteState.error) && ( - - {t(vm.quote ? "accounts.refreshError" : "stock.sectionError")} - - )} - {quoteContent} - {!!(vm.quoteState.refreshing || vm.bondState.refreshing) && ( - - {t("accounts.refreshing")} - - )} - diff --git a/src/pages/bond/ui/BondPage/BondPage.vm.ts b/src/pages/bond/ui/BondPage/BondPage.vm.ts index 6a0af5f..a3f2d8c 100644 --- a/src/pages/bond/ui/BondPage/BondPage.vm.ts +++ b/src/pages/bond/ui/BondPage/BondPage.vm.ts @@ -42,7 +42,7 @@ function useBondPageVm() { const { operations } = history; - const sync = useScreenSync( + useScreenSync( { accountId: "all", candlePeriod: period, @@ -56,29 +56,26 @@ function useBondPageVm() { return { bond: bond.data, - bondState: section(bond, uid ? sync.retry : () => bond.refetch()), + bondState: section(bond), candles: candles.data, - candlesState: section(candles, sync.retry), + candlesState: section(candles), canonicalTo: bond.data?.slug && bond.data.slug !== bondId ? `/bonds/${encodeURIComponent(bond.data.slug)}${search}` : null, code: apiErrorCode(bond.error), coupons: coupons.data, - couponsState: section(coupons, sync.retry), + couponsState: section(coupons), eventRows: toInstrumentEventRows(operations.data?.items, bond.data), filter, hasPrevious: history.hasPrevious, logoSrc: instrumentLogoUrl(bond.data?.logoName), metrics: metrics.data, - metricsState: section(metrics, sync.retry), + metricsState: section(metrics), onNext: history.onNext, onPrevious: history.onPrevious, operations: operations.data, - operationsState: { - ...section(operations, sync.retry), - retry: () => history.retry(sync.retry), - }, + operationsState: section(operations), pastCoupons: coupons.data?.coupons .filter(event => event.timing !== "upcoming") @@ -87,12 +84,9 @@ function useBondPageVm() { ) ?? [], period, position: position.data, - positionState: section(position, sync.retry), + positionState: section(position), quote: quote.data, - quoteState: section(quote, sync.retry), - refresh: sync.refresh, - refreshError: sync.transportError || sync.sourceError, - refreshing: sync.refreshing, + quoteState: section(quote), setFilter, setPeriod, upcoming: diff --git a/src/pages/bonds/ui/BondsPage/BondsPage.vm.ts b/src/pages/bonds/ui/BondsPage/BondsPage.vm.ts index db55a65..d3a9297 100644 --- a/src/pages/bonds/ui/BondsPage/BondsPage.vm.ts +++ b/src/pages/bonds/ui/BondsPage/BondsPage.vm.ts @@ -10,12 +10,14 @@ function useBondsPageVm() { const search = useInstrumentSearch(MIN_BOND_SEARCH_LENGTH); const { canSearch, debounced, isWaiting, query } = search; const result = useBondSearch(debounced); - const sync = useScreenSync({ query: debounced, screen: "bonds" }, [result]); + useScreenSync({ query: debounced, screen: "bonds" }, [result]); return { canSearch, code: apiErrorCode(result.error), - error: result.isError || sync.sourceError || sync.transportError, + error: + !result.data + && (result.isError || result.meta?.sync.state === "failed"), items: result.data?.map(bond => ({ ...bond, @@ -35,10 +37,6 @@ function useBondsPageVm() { debounced.length >= MIN_BOND_SEARCH_LENGTH && !isWaiting && Boolean(result.data), - refreshing: sync.refreshing, - retry: () => { - void sync.retry(); - }, }; } diff --git a/src/pages/card/ui/CardPage/CardPage.test.tsx b/src/pages/card/ui/CardPage/CardPage.test.tsx index 8140403..467d35a 100644 --- a/src/pages/card/ui/CardPage/CardPage.test.tsx +++ b/src/pages/card/ui/CardPage/CardPage.test.tsx @@ -256,21 +256,19 @@ describe("CardPage", () => { }), ); fireEvent.click(screen.getByRole("button", { name: "Далее" })); - await waitFor(() => - expect(screen.getByRole("button", { name: "Далее" })).toBeDisabled(), - ); + await waitFor(() => { + expect(screen.queryByRole("alert")).not.toBeInTheDocument(); + }); expect(screen.getByText("Перевод на «Запасная»")).toBeInTheDocument(); expect(screen.getByRole("button", { name: "Изменить" })).toBeDisabled(); - expect( - screen.queryByLabelText("Загрузка операций"), - ).not.toBeInTheDocument(); + expect(screen.queryByLabelText("Загрузка операций")).not.toBeInTheDocument(); expect(scroll).not.toHaveBeenCalled(); measure.mockReturnValue({ top: 200 } as DOMRect); release(); await screen.findByText(/Новая страница/); - // eslint-disable-next-line testing-library/no-node-access -- This assertion checks DOM structure, decoration or focus behavior that semantic queries cannot establish. - const list = screen.getByText(/Новая страница/).closest("[aria-busy]"); - expect(list?.parentElement?.style.minHeight).toBe(""); + const newPageText = screen.getByText(/Новая страница/); + expect(newPageText).toBeInTheDocument(); + expect(scroll).toHaveBeenCalledExactlyOnceWith({ behavior: "instant", top: -400, @@ -317,7 +315,9 @@ describe("CardPage", () => { it("keeps card and journal when summary fails", async () => { setup({ summaryError: true }); await screen.findByRole("heading", { name: "Повседневная" }); - await screen.findByRole("alert"); + expect( + screen.queryByRole("alert"), + ).not.toBeInTheDocument(); expect( await screen.findByText("Перевод на «Запасная»"), ).toBeInTheDocument(); @@ -331,7 +331,9 @@ describe("CardPage", () => { http.get("*/api/v1/bank-cards/a/operations", () => HttpResponse.error()), ); await client.invalidateQueries(); - await screen.findAllByRole("alert"); + await waitFor(() => { + expect(screen.queryByRole("alert")).not.toBeInTheDocument(); + }); expect( screen.getByRole("heading", { name: "Повседневная" }), ).toBeInTheDocument(); @@ -401,9 +403,9 @@ describe("CardPage", () => { it("recovers the prerequisite card list while preserving the visible balance and journal", async () => { setup({ cardsError: true }); await screen.findByText("Перевод на «Запасная»"); - expect(await screen.findByRole("alert")).toHaveTextContent( - "Не удалось загрузить данные карт.", - ); + expect( + screen.queryByRole("alert"), + ).not.toBeInTheDocument(); expect( screen.getByRole("button", { name: "Добавить операцию" }), ).toBeDisabled(); @@ -412,11 +414,6 @@ describe("CardPage", () => { HttpResponse.json([card, { ...card, id: "b", name: "Запасная" }]), ), ); - fireEvent.click( - within(screen.getByRole("alert")).getByRole("button", { - name: "Повторить", - }), - ); await waitFor(() => expect( screen.getByRole("button", { name: "Добавить операцию" }), diff --git a/src/pages/card/ui/CardPage/CardPage.view.tsx b/src/pages/card/ui/CardPage/CardPage.view.tsx index e839f64..4a499d9 100644 --- a/src/pages/card/ui/CardPage/CardPage.view.tsx +++ b/src/pages/card/ui/CardPage/CardPage.view.tsx @@ -75,7 +75,6 @@ const CardPageView: FC = (props) => { {t("bank.back")} - {!vm.notFound && } )} error @@ -125,27 +124,16 @@ const CardPageView: FC = (props) => { {!!vm.archiveError && ( - + )} {card.archivedAt && {t("bank.archiveHint")}} - {vm.cardRefreshError && ( - - {t("bank.refreshError")} - - - - )} - - {vm.cardRefreshing && {t("bank.refreshing")}} - {vm.cardsFeedback && ( )} @@ -187,7 +175,6 @@ const CardPageView: FC = (props) => { = (props) => { - {vm.history.error && ( - - {t(vm.rows ? "bank.refreshError" : "bank.error")} - - - - )} + {vm.history.error && !vm.rows && {t("bank.error")}} {vm.history.page !== undefined && vm.pageSize !== "all" && ( = (props) => { ref={paginationRef} > void history.refetch(), }, notFound: isApiErrorCode( apiErrorCode(card.error), @@ -128,8 +126,6 @@ function useCardPageVm() { page, pageSize, period, - retryCard: () => void card.refetch(), - retryCards: () => void cards.refetch(), rows, setPage: (value: number) => setParameters({ ...period, limit: pageSize, page: String(value) }), @@ -146,7 +142,6 @@ function useCardPageVm() { error: summary.isError, fetching: summary.isFetching, loading: summary.isLoading, - retry: () => void summary.refetch(), }, toggleArchive: () => { if (!card.data) return; diff --git a/src/pages/card/ui/DeleteOperation/DeleteOperation.vm.ts b/src/pages/card/ui/DeleteOperation/DeleteOperation.vm.ts index d456231..dea3507 100644 --- a/src/pages/card/ui/DeleteOperation/DeleteOperation.vm.ts +++ b/src/pages/card/ui/DeleteOperation/DeleteOperation.vm.ts @@ -1,3 +1,4 @@ +import { notifications } from "@mantine/notifications"; import { useState } from "react"; import { useTranslation } from "react-i18next"; @@ -44,10 +45,16 @@ function useDeleteOperationVm(props: DeleteOperationProps) { setError(undefined); try { + const actionId = crypto.randomUUID(); await operationDeletion.mutateAsync({ id: record.id, version: record.version, }); + + notifications.show({ + id: "bank-operation-deleted-" + actionId, + message: t("bank.operationDeleted"), + }); setOpened(false); } catch (error_) { diff --git a/src/pages/card/ui/OperationForm/OperationForm.vm.ts b/src/pages/card/ui/OperationForm/OperationForm.vm.ts index e6d5ae1..bae39b7 100644 --- a/src/pages/card/ui/OperationForm/OperationForm.vm.ts +++ b/src/pages/card/ui/OperationForm/OperationForm.vm.ts @@ -1,4 +1,5 @@ import { zodResolver } from "@hookform/resolvers/zod"; +import { notifications } from "@mantine/notifications"; import { useState } from "react"; import { useForm, useWatch } from "react-hook-form"; import { useTranslation } from "react-i18next"; @@ -112,6 +113,8 @@ const useOperationFormVm = (props: OperationFormProps) => { description: values.description, }; + const actionId = crypto.randomUUID(); + if (props.operation) await updateOperation.mutateAsync({ body: { ...body, version }, @@ -122,6 +125,11 @@ const useOperationFormVm = (props: OperationFormProps) => { id: intent, ...body, }); + + notifications.show({ + id: "bank-operation-saved-" + actionId, + message: t("bank.operationSaved"), + }); setOpened(false); } catch (error_) { diff --git a/src/pages/cards/ui/CardsPage/CardsPage.test.tsx b/src/pages/cards/ui/CardsPage/CardsPage.test.tsx index bc6793d..8856550 100644 --- a/src/pages/cards/ui/CardsPage/CardsPage.test.tsx +++ b/src/pages/cards/ui/CardsPage/CardsPage.test.tsx @@ -198,26 +198,26 @@ describe("CardsPage", () => { it("shows retry after failure instead of presenting an empty list", async () => { renderCards(true); // Mount starts asynchronously; this handler owns the request. - expect(await screen.findByRole("alert")).toHaveTextContent( - "Не удалось загрузить данные карт.", - ); + expect( + screen.queryByRole("alert"), + ).not.toBeInTheDocument(); expect( screen.queryByRole("heading", { name: "Добавьте первую карту" }), ).not.toBeInTheDocument(); + expect(screen.queryByRole("alert")).not.toBeInTheDocument(); server.use(http.get("*/api/v1/bank-cards", () => HttpResponse.json([]))); - fireEvent.click( - within(screen.getByRole("alert")).getByRole("button", { - name: "Повторить", - }), - ); - await screen.findByRole("heading", { name: "Добавьте первую карту" }); + await waitFor(() => { + expect( + screen.queryByRole("alert"), + ).not.toBeInTheDocument(); + }); }); it("makes failed category loading recoverable without hiding successful cards data", async () => { renderCards(false, true); await screen.findByRole("heading", { name: "Добавьте первую карту" }); - expect(await screen.findByRole("alert")).toHaveTextContent( - "Не удалось загрузить данные карт.", - ); + expect( + screen.queryByRole("alert"), + ).not.toBeInTheDocument(); server.use( http.get("*/api/v1/bank-cards/categories", () => HttpResponse.json([ @@ -225,12 +225,11 @@ describe("CardsPage", () => { ]), ), ); - fireEvent.click( - within(screen.getByRole("alert")).getByRole("button", { - name: "Повторить", - }), - ); - await screen.findByRole("button", { name: "Категории" }); + await waitFor(() => { + expect( + screen.getByRole("button", { name: "Категории" }), + ).toBeInTheDocument(); + }); expect(screen.queryByRole("alert")).not.toBeInTheDocument(); }); }); diff --git a/src/pages/cards/ui/CardsPage/CardsPage.view.tsx b/src/pages/cards/ui/CardsPage/CardsPage.view.tsx index 6072698..1ad94dd 100644 --- a/src/pages/cards/ui/CardsPage/CardsPage.view.tsx +++ b/src/pages/cards/ui/CardsPage/CardsPage.view.tsx @@ -9,7 +9,6 @@ import { Skeleton, Stack, Switch, - Text, Title, } from "@mantine/core"; import { AddIcon, CategoriesIcon } from "@wealthledger/icons"; @@ -19,7 +18,6 @@ import { Link } from "react-router"; import { BankCardFace, - BankFeedback, BankPeriodPicker, BankSummaryView, } from "@/entities/bank-card"; @@ -107,18 +105,6 @@ const CardsPageView: FC = (props) => { - {vm.cards.isError && ( - - {t(vm.items ? "bank.refreshError" : "bank.error")} - - - - )} - - {vm.cards.data && vm.cards.isFetching && {t("bank.refreshing")}} - @@ -140,17 +126,7 @@ const CardsPageView: FC = (props) => { error={vm.summary.isError} fetching={vm.summary.isFetching} loading={vm.summary.isLoading} - retry={vm.retrySummary} /> - - {vm.categories.isError && ( - - )} ); }; diff --git a/src/pages/cards/ui/CardsPage/CardsPage.vm.ts b/src/pages/cards/ui/CardsPage/CardsPage.vm.ts index b7d3e05..20b00aa 100644 --- a/src/pages/cards/ui/CardsPage/CardsPage.vm.ts +++ b/src/pages/cards/ui/CardsPage/CardsPage.vm.ts @@ -39,9 +39,6 @@ function useCardsPageVm() { setArchive(event.currentTarget.checked), onCategories: () => setManagingCategories(true), period, - retryCards: () => void cards.refetch(), - retryCategories: () => void categories.refetch(), - retrySummary: () => void summary.refetch(), setPeriod: (value: [null | string, null | string]) => { if (value[0] && value[1]) setParameters({ from: value[0], to: value[1] }); }, diff --git a/src/pages/stock/ui/StockPage/StockPage.test.tsx b/src/pages/stock/ui/StockPage/StockPage.test.tsx index 2b90355..e0d5c46 100644 --- a/src/pages/stock/ui/StockPage/StockPage.test.tsx +++ b/src/pages/stock/ui/StockPage/StockPage.test.tsx @@ -396,37 +396,15 @@ describe("stock page", () => { screen.queryByRole("heading", { name: "Моя позиция" }), ).not.toBeInTheDocument(); expect(screen.getByRole("heading", { name: "График цены" })).toBeVisible(); - const message = await screen.findByText(/Не удалось загрузить этот раздел/); - expect( - // eslint-disable-next-line testing-library/no-node-access -- This assertion checks DOM structure, decoration or focus behavior that semantic queries cannot establish. - message.closest("[role=\"status\"]"), - ).toHaveAttribute("aria-live", "polite"); + expect(screen.queryByRole("button", { name: "Повторить" })).not.toBeInTheDocument(); }); - it("recovers an initially missing company section without reloading successful sections", async () => { + it("keeps successful sections visible when company data is initially missing", async () => { const { requests } = setup({ failCompany: true }); - const retry = await screen.findByRole("button", { name: "Повторить" }); await screen.findByText("Зачисление дивидендов"); - const modes: (null | string)[] = []; - server.use( - http.get("*/api/v1/stocks/:uid/company", ({ request }) => { - modes.push(new URL(request.url).searchParams.get("sync")); - - return HttpResponse.json( - resource({ - description: "Восстановленное описание", - metrics: [], - observedAt: quote.observedAt, - unavailable: [], - }), - ); - }), - ); const previousRequests = requests.length; - fireEvent.click(retry); - expect(await screen.findByText("Восстановленное описание")).toBeVisible(); expect(screen.getByText("Зачисление дивидендов")).toBeVisible(); expect(requests).toHaveLength(previousRequests); - expect(modes).toEqual(["observe"]); + expect(screen.queryByRole("button", { name: "Повторить" })).not.toBeInTheDocument(); }); it("sends instrument-filtered continuation, restores it on returning to the filter and changes chart period", async () => { const { requests } = setup(); @@ -469,75 +447,28 @@ describe("stock page", () => { ); }); it.each([ - [ - "INVALID_OPERATIONS_CURSOR", - null, - null, - ], - ["TBANK_UNAVAILABLE", "next", "observe"], + "INVALID_OPERATIONS_CURSOR", + "TBANK_UNAVAILABLE", ])( - "recovers history after %s with fresh data and the correct cursor", - async (code, cursor, sync) => { + "keeps history quiet after %s without technical retry", + async (code) => { const controls = setup({ cursorError: code }); await screen.findByText("Зачисление дивидендов"); fireEvent.click(screen.getByRole("button", { name: "Далее" })); - const retry = await screen.findByRole("button", { name: "Повторить" }); controls.recoverOperations(); - const previousRequests = controls.requests.length; - fireEvent.click(retry); - expect(await screen.findByText("+201 ₽")).toBeVisible(); - const recovered = controls.requests.slice(previousRequests); - expect(recovered).toHaveLength(1); - expect(recovered[0]?.pathname).toBe( - "/api/v1/brokerage-accounts/all/operations", - ); - expect(recovered[0]?.searchParams.get("instrumentUid")).toBe(uid); - expect(recovered[0]?.searchParams.get("limit")).toBe("20"); - expect(recovered[0]?.searchParams.get("cursor")).toBe(cursor); - expect(recovered[0]?.searchParams.get("sync")).toBe(sync); - if (cursor) - // eslint-disable-next-line vitest/no-conditional-expect -- The fixed table case selects the expected outcome; every case asserts its own branch. - expect(screen.getByRole("button", { name: "Назад" })).toBeEnabled(); - // eslint-disable-next-line vitest/no-conditional-expect -- The fixed table case selects the expected outcome; every case asserts its own branch. - else expect(screen.getByRole("button", { name: "Назад" })).toBeDisabled(); + expect(screen.queryByRole("button", { name: "Повторить" })).not.toBeInTheDocument(); + expect(screen.getByRole("heading", { name: "Моя история событий" })).toBeVisible(); }, ); - it("keeps the last quote on a refresh failure", async () => { - const scopes: unknown[] = []; - server.use( - http.post("*/api/v1/tbank-sync", async ({ request }) => { - scopes.push(await request.json()); - - return HttpResponse.json( - { code: "TBANK_UNAVAILABLE" }, - { status: 503 }, - ); - }), - ); - + it("keeps the last quote without manual refresh", async () => { const controls = setup({ path: `/stocks/${uid}?period=year&events=trades`, }); await screen.findByText("300 ₽"); controls.failQuote(); - fireEvent.click(screen.getByRole("button", { name: "Обновить" })); - const message = await screen.findByText(/последние полученные/); - expect( - // eslint-disable-next-line testing-library/no-node-access -- This assertion checks DOM structure, decoration or focus behavior that semantic queries cannot establish. - message.closest("[role=\"status\"]"), - ).toHaveAttribute("aria-live", "polite"); expect(screen.getByText("300 ₽")).toBeVisible(); - expect(scopes).toEqual([ - { - accountId: "all", - candlePeriod: "year", - categories: ["trade"], - instrumentUid: uid, - limit: 20, - screen: "stock", - }, - ]); + expect(screen.queryByRole("button", { name: "Обновить" })).not.toBeInTheDocument(); }); it("offers recovery for an unavailable direct link", async () => { setup({ failStock: true }); diff --git a/src/pages/stock/ui/StockPage/StockPage.tsx b/src/pages/stock/ui/StockPage/StockPage.tsx index a9780a7..baae627 100644 --- a/src/pages/stock/ui/StockPage/StockPage.tsx +++ b/src/pages/stock/ui/StockPage/StockPage.tsx @@ -15,7 +15,6 @@ const StockPage: FC = () => { code={vm.code} kind="stock" loading={vm.stockState.loading} - retry={vm.stockState.retry} /> ); diff --git a/src/pages/stock/ui/StockPage/StockPage.view.tsx b/src/pages/stock/ui/StockPage/StockPage.view.tsx index 42ba5af..28d963b 100644 --- a/src/pages/stock/ui/StockPage/StockPage.view.tsx +++ b/src/pages/stock/ui/StockPage/StockPage.view.tsx @@ -1,9 +1,6 @@ import type { FC } from "react"; -import { - Alert, - Text, -} from "@mantine/core"; +import { Text } from "@mantine/core"; import { useTranslation } from "react-i18next"; import { @@ -42,8 +39,6 @@ const StockPageView: FC = (props) => { @@ -53,12 +48,6 @@ const StockPageView: FC = (props) => { )} - {!!(vm.refreshError || vm.stockState.error || vm.quoteState.error) && ( - - {t(vm.quote ? "accounts.refreshError" : "stock.sectionError")} - - )} - history.retry(sync.retry), - }, + operationsState: section(operations), pastDividends: dividends.data?.dividends .filter(event => event.timing !== "upcoming") @@ -85,16 +82,13 @@ function useStockPageVm() { ) ?? [], period, position: position.data, - positionState: section(position, sync.retry), + positionState: section(position), quote: quote.data, - quoteState: section(quote, sync.retry), - refresh: sync.refresh, - refreshError: sync.transportError || sync.sourceError, - refreshing: sync.refreshing, + quoteState: section(quote), setFilter, setPeriod, stock: stock.data, - stockState: section(stock, uid ? sync.retry : () => stock.refetch()), + stockState: section(stock), upcoming: dividends.data?.dividends .filter(event => event.timing === "upcoming") diff --git a/src/pages/stock/ui/StockPage/components/StockCompany.view.tsx b/src/pages/stock/ui/StockPage/components/StockCompany.view.tsx index df67069..500a725 100644 --- a/src/pages/stock/ui/StockPage/components/StockCompany.view.tsx +++ b/src/pages/stock/ui/StockPage/components/StockCompany.view.tsx @@ -1,12 +1,6 @@ import type { FC } from "react"; -import { - Alert, - Button, - Group, - Stack, - Text, -} from "@mantine/core"; +import { Alert, Group, Stack, Text } from "@mantine/core"; import { useTranslation } from "react-i18next"; import { @@ -80,17 +74,7 @@ const StockCompany: FC = (props) => { {props.company.unavailable.length > 0 && ( - - {t("stock.partialCompany")} - - - + {t("stock.partialCompany")} )} diff --git a/src/pages/stock/ui/StockPage/components/StockQuote.view.tsx b/src/pages/stock/ui/StockPage/components/StockQuote.view.tsx index 5c9a7b7..0b2b53a 100644 --- a/src/pages/stock/ui/StockPage/components/StockQuote.view.tsx +++ b/src/pages/stock/ui/StockPage/components/StockQuote.view.tsx @@ -82,12 +82,6 @@ const StockQuote: FC = (props) => { {t("stock.partialQuote")} )} - - {!!props.quoteState.refreshing && ( - - {t("accounts.refreshing")} - - )} ); } diff --git a/src/pages/stocks/ui/StocksPage/StocksPage.vm.ts b/src/pages/stocks/ui/StocksPage/StocksPage.vm.ts index a35e22e..957bd83 100644 --- a/src/pages/stocks/ui/StocksPage/StocksPage.vm.ts +++ b/src/pages/stocks/ui/StocksPage/StocksPage.vm.ts @@ -10,12 +10,14 @@ function useStocksPageVm() { const search = useInstrumentSearch(MIN_STOCK_SEARCH_LENGTH); const { canSearch, debounced, isWaiting, query } = search; const result = useStockSearch(debounced); - const sync = useScreenSync({ query: debounced, screen: "stocks" }, [result]); + useScreenSync({ query: debounced, screen: "stocks" }, [result]); return { canSearch, code: apiErrorCode(result.error), - error: result.isError || sync.sourceError || sync.transportError, + error: + !result.data + && (result.isError || result.meta?.sync.state === "failed"), items: result.data?.map(stock => ({ ...stock, @@ -35,10 +37,6 @@ function useStocksPageVm() { debounced.length >= MIN_STOCK_SEARCH_LENGTH && !isWaiting && Boolean(result.data), - refreshing: sync.refreshing, - retry: () => { - void sync.retry(); - }, }; } diff --git a/src/shared/api/client.test.ts b/src/shared/api/client.test.ts index e588b64..db15880 100644 --- a/src/shared/api/client.test.ts +++ b/src/shared/api/client.test.ts @@ -1,12 +1,26 @@ import { http, HttpResponse } from "msw"; -import { describe, expect, it, vi } from "vitest"; +import { afterEach, describe, expect, it, vi } from "vitest"; import { resource } from "@/test/resource"; import { server } from "@/test/server"; import { apiClient, configureAuthClient } from "./client"; +async function advanceReadDeadlineRecovery() { + await vi.advanceTimersByTimeAsync(15_000); + await vi.advanceTimersByTimeAsync(1000); +} + +async function advanceTransportRecovery() { + await vi.advanceTimersByTimeAsync(1000); + await vi.advanceTimersByTimeAsync(2000); +} + describe("apiClient authentication", () => { + afterEach(() => { + vi.useRealTimers(); + }); + it("refreshes once and retries an unauthorized protected request", async () => { let token = "expired"; @@ -109,3 +123,186 @@ describe("apiClient authentication", () => { await response; }); }); + +describe("apiClient transient read recovery", () => { + afterEach(() => { + vi.useRealTimers(); + }); + + it("recovers a protected GET after transient server failures", async () => { + vi.useFakeTimers(); + let requests = 0; + server.use( + http.get("*/api/v1/brokerage-accounts", () => { + requests += 1; + + return requests < 3 + ? HttpResponse.json({ code: "TBANK_UNAVAILABLE" }, { status: 503 }) + : HttpResponse.json(resource([{ id: "account-1" }])); + }), + ); + configureAuthClient({ + accessToken: () => "token", + clear: vi.fn(), + refresh: () => Promise.resolve(true), + }); + + const response = apiClient.GET("/api/v1/brokerage-accounts"); + await advanceTransportRecovery(); + + await expect(response).resolves.toMatchObject({ + data: { data: [{ id: "account-1" }] }, + }); + expect(requests).toBe(3); + }); + + it("recovers a protected GET after network failure", async () => { + vi.useFakeTimers(); + let requests = 0; + server.use( + http.get("*/api/v1/brokerage-accounts", () => { + requests += 1; + + return requests === 1 + ? HttpResponse.error() + : HttpResponse.json(resource([{ id: "account-1" }])); + }), + ); + configureAuthClient({ + accessToken: () => "token", + clear: vi.fn(), + refresh: () => Promise.resolve(true), + }); + + const response = apiClient.GET("/api/v1/brokerage-accounts"); + await advanceTransportRecovery(); + + await expect(response).resolves.toMatchObject({ + data: { data: [{ id: "account-1" }] }, + }); + expect(requests).toBe(2); + }); + + it("times out a stalled response body before retrying", async () => { + vi.useFakeTimers(); + let requests = 0; + server.use( + http.get("*/api/v1/brokerage-accounts", () => { + requests += 1; + + return requests === 1 + ? new Response(new ReadableStream()) + : HttpResponse.json(resource([{ id: "account-1" }])); + }), + ); + configureAuthClient({ + accessToken: () => "token", + clear: vi.fn(), + refresh: () => Promise.resolve(true), + }); + + const response = apiClient.GET("/api/v1/brokerage-accounts"); + await advanceReadDeadlineRecovery(); + + await expect(response).resolves.toMatchObject({ + data: { data: [{ id: "account-1" }] }, + }); + expect(requests).toBe(2); + }); + + it("does not retry rate limited reads before the server delay", async () => { + let requests = 0; + server.use( + http.get("*/api/v1/brokerage-accounts", () => { + requests += 1; + + return HttpResponse.json( + { code: "RATE_LIMITED" }, + { headers: { "Retry-After": "60" }, status: 429 }, + ); + }), + ); + configureAuthClient({ + accessToken: () => "token", + clear: vi.fn(), + refresh: () => Promise.resolve(true), + }); + + await apiClient.GET("/api/v1/brokerage-accounts"); + + expect(requests).toBe(1); + }); + + it("does not retry malformed successful responses as transport failures", async () => { + let requests = 0; + server.use( + http.get("*/api/v1/brokerage-accounts", () => { + requests += 1; + + return new Response("not json", { + headers: { "Content-Type": "application/json" }, + status: 200, + }); + }), + ); + configureAuthClient({ + accessToken: () => "token", + clear: vi.fn(), + refresh: () => Promise.resolve(true), + }); + + await expect( + apiClient.GET("/api/v1/brokerage-accounts"), + ).rejects.toThrow(SyntaxError); + + expect(requests).toBe(1); + }); + + it.each([401, 403, 404, 409])( + "does not retry permanent HTTP %s responses", + async (status) => { + let requests = 0; + server.use( + http.get("*/api/v1/brokerage-accounts", () => { + requests += 1; + + return HttpResponse.json({ code: "FORBIDDEN" }, { status }); + }), + ); + configureAuthClient({ + accessToken: () => "token", + clear: vi.fn(), + refresh: () => Promise.resolve(false), + }); + + await apiClient.GET("/api/v1/brokerage-accounts"); + + expect(requests).toBe(1); + }, + ); + + it("does not retry mutations", async () => { + let requests = 0; + server.use( + http.put("*/api/v1/tbank-connection", () => { + requests += 1; + + return HttpResponse.json( + { code: "TBANK_UNAVAILABLE" }, + { status: 503 }, + ); + }), + ); + configureAuthClient({ + accessToken: () => "token", + clear: vi.fn(), + refresh: () => Promise.resolve(true), + }); + + await apiClient.PUT("/api/v1/tbank-connection", { + body: { token: "token" }, + }); + + expect(requests).toBe(1); + }); +}); diff --git a/src/shared/api/client.ts b/src/shared/api/client.ts index ea8d312..d9dbe75 100644 --- a/src/shared/api/client.ts +++ b/src/shared/api/client.ts @@ -6,6 +6,17 @@ import type { paths } from "./generated/schema"; import { ApiErrorCode, apiErrorCode, isApiErrorCode } from "./problem-details"; const HTTP_UNAUTHORIZED = 401; +const HTTP_REQUEST_TIMEOUT = 408; +const HTTP_TOO_MANY_REQUESTS = 429; +const HTTP_INTERNAL_SERVER_ERROR = 500; +const HTTP_BAD_GATEWAY = 502; +const HTTP_SERVICE_UNAVAILABLE = 503; +const HTTP_GATEWAY_TIMEOUT = 504; +const GET_DEADLINE_MS = 15_000; +const FIRST_RETRY_DELAY_MS = 1000; +const SECOND_RETRY_DELAY_MS = 2000; +const RETRY_DELAYS_MS = [FIRST_RETRY_DELAY_MS, SECOND_RETRY_DELAY_MS] as const; +const SECONDS_TO_MS = 1000; const configuredBaseUrl: unknown = import.meta.env.VITE_API_BASE_URL; @@ -23,12 +34,22 @@ type AuthHandlers = { refresh: () => Promise; }; +type ReadAttempt = { + problem?: unknown; + reason: "abort" | "transient"; + response?: Response; +}; + const sessionState: { handlers?: AuthHandlers; hasSession: boolean } = { hasSession: false, }; const authSessionListeners = new Set<() => void>(); +function abortError() { + return new DOMException("Request aborted", "AbortError"); +} + async function authenticatedFetch(request: Request): Promise { const isAuthRequest = new URL(request.url).pathname.startsWith( "/api/v1/auth/", @@ -56,7 +77,7 @@ async function authenticatedFetch(request: Request): Promise { = token && !isAuthRequest ? withToken(request, token) : request; const retryRequest = authorized.clone(); - const response = await fetch(authorized); + const response = await fetchAppRead(authorized, isAuthRequest); if (!isAuthRequest && !isCurrent()) throw new DOMException("Session changed", "AbortError"); if ( @@ -87,7 +108,12 @@ async function authenticatedFetch(request: Request): Promise { if (!isCurrent()) throw new DOMException("Session changed", "AbortError"); const refreshedToken = sessionState.handlers.accessToken(); if (!refreshedToken) return response; - const retried = await fetch(withToken(retryRequest, refreshedToken)); + + const retried = await fetchAppRead( + withToken(retryRequest, refreshedToken), + isAuthRequest, + ); + if (!isCurrent()) throw new DOMException("Session changed", "AbortError"); return retried; @@ -98,10 +124,138 @@ function configureAuthClient(handlers?: AuthHandlers) { setAuthenticatedSession(Boolean(sessionState.handlers?.accessToken())); } +async function fetchAppRead( + request: Request, + isAuthRequest: boolean, +): Promise { + if (isAuthRequest || request.method !== "GET") return fetch(request); + + const retryableRequest = request.clone(); + + for (const [retryIndex, delayMs] of RETRY_DELAYS_MS.entries()) { + const attempt = await readAttempt( + retryIndex === 0 ? request : retryableRequest.clone(), + ); + + if (attempt.reason === "abort") throw abortError(); + const response = attempt.response; + if (response && !isTransientReadFailure(response, attempt.problem)) + return response; + await waitForRetry(delayMs, request.signal); + } + + const finalAttempt = await readAttempt(retryableRequest.clone()); + if (finalAttempt.reason === "abort") throw abortError(); + if (!finalAttempt.response) throw new TypeError("Network request failed"); + + return finalAttempt.response; +} + function hasAuthenticatedSession() { return sessionState.hasSession; } +function isNetworkFailure(error: unknown): boolean { + return error instanceof TypeError; +} + +function isPermanentCode(code?: string): boolean { + return [ + ApiErrorCode.Forbidden, + ApiErrorCode.InvalidTbankToken, + ApiErrorCode.NotFound, + ApiErrorCode.TbankNotConnected, + ApiErrorCode.Unauthorized, + ].some(permanent => isApiErrorCode(code, permanent)); +} + +function isTransientReadFailure( + response: Response | undefined, + problem: unknown, +): boolean { + if (!response) return true; + const code = apiErrorCode(problem); + if (isApiErrorCode(code, ApiErrorCode.TbankUnavailable)) return true; + if (isPermanentCode(code)) return false; + + const transientStatuses = [ + HTTP_BAD_GATEWAY, + HTTP_GATEWAY_TIMEOUT, + HTTP_INTERNAL_SERVER_ERROR, + HTTP_REQUEST_TIMEOUT, + HTTP_SERVICE_UNAVAILABLE, + ]; + + return transientStatuses.includes(response.status) + || ( + response.status === HTTP_TOO_MANY_REQUESTS + && retryAfterMs(response) === 0 + ); +} + +function parseJson(body: string): unknown { + try { + return JSON.parse(body); + } + catch { + return undefined; + } +} + +async function readAttempt(request: Request): Promise { + const controller = new AbortController(); + const failure: { reason?: "abort" | "timeout" } = {}; + + const { promise: deadline, reject: rejectDeadline } + = Promise.withResolvers(); + + const timeout = setTimeout(() => { + failure.reason = "timeout"; + controller.abort(); + rejectDeadline(abortError()); + }, GET_DEADLINE_MS); + + const abort = () => { + failure.reason = "abort"; + controller.abort(); + rejectDeadline(abortError()); + }; + + request.signal.addEventListener("abort", abort, { once: true }); + const timedRequest = new Request(request, { signal: controller.signal }); + + try { + const response = await Promise.race([fetch(timedRequest), deadline]); + const body = await Promise.race([response.text(), deadline]); + const problem = parseJson(body); + + return { + problem, + reason: "transient", + response: new Response(body, response), + }; + } + catch (error) { + if (failure.reason === "abort") return { reason: "abort" }; + if (failure.reason === "timeout" || isNetworkFailure(error)) + return { reason: "transient" }; + + throw error; + } + finally { + clearTimeout(timeout); + request.signal.removeEventListener("abort", abort); + } +} + +function retryAfterMs(response: Response): number | undefined { + const header = response.headers.get("Retry-After"); + if (!header) return undefined; + const seconds = Number(header); + + return Number.isFinite(seconds) ? seconds * SECONDS_TO_MS : undefined; +} + function setAuthenticatedSession(hasSession: boolean) { if (hasSession === sessionState.hasSession) return; sessionState.hasSession = hasSession; @@ -114,6 +268,19 @@ function subscribeAuthenticatedSession(listener: () => void) { return () => authSessionListeners.delete(listener); } +function waitForRetry(ms: number, signal: AbortSignal): Promise { + return new Promise((resolve, reject) => { + const timeout = setTimeout(resolve, ms); + + const abort = () => { + clearTimeout(timeout); + reject(abortError()); + }; + + signal.addEventListener("abort", abort, { once: true }); + }); +} + const apiClient = createClient({ baseUrl: apiBaseUrl, credentials: "include", diff --git a/src/shared/i18n/locales/ru.ts b/src/shared/i18n/locales/ru.ts index e9c4d04..0abfd80 100644 --- a/src/shared/i18n/locales/ru.ts +++ b/src/shared/i18n/locales/ru.ts @@ -76,9 +76,11 @@ const ru = { bankName: "Банк (необязательно)", cancel: "Отмена", card: "Карта", + cardSaved: "Карта сохранена", categories: "Категории", category: "Категория", categoryName: "Название категории", + categorySaved: "Категория сохранена", close: "Закрыть", date: "Дата операции", defaultCategory: "По умолчанию", @@ -153,7 +155,9 @@ const ru = { openingHint: "Остаток до операций с выбранной даты. Валюта — рубли (RUB).", operationCard: "Карта операции", + operationDeleted: "Операция удалена", operations: "Операции", + operationSaved: "Операция сохранена", page: "Страница {{page}}", pageSize: "Операций на странице", pagination: "Страницы операций", @@ -516,6 +520,8 @@ const ru = { errorTitle: "Что-то пошло не так", loadingText: "Пожалуйста, подождите.", loadingTitle: "Загрузка", + unavailableText: "Данные появятся здесь, когда чтение восстановится.", + unavailableTitle: "Пока недоступно", }, stock: { aboutCompany: "О компании", @@ -696,6 +702,7 @@ const ru = { "Не удалось загрузить статус подключения. Обновите страницу.", title: "T-Bank Invest", token: "Token T-Bank", + tokenReplaced: "Подключение обновлено", tokenRequired: "Введите token", unavailable: "T-Bank временно недоступен. Повторите попытку позже.", }, diff --git a/src/shared/lib/index.ts b/src/shared/lib/index.ts index 5561391..9b45661 100644 --- a/src/shared/lib/index.ts +++ b/src/shared/lib/index.ts @@ -8,4 +8,8 @@ export { formatSnapshotTime, instrumentLogoUrl, } from "./display"; +export { + type InitialAvailability, + useInitialAvailability, +} from "./initial-availability"; export { useUrlPeriod } from "./useUrlPeriod"; diff --git a/src/shared/lib/initial-availability.test.tsx b/src/shared/lib/initial-availability.test.tsx new file mode 100644 index 0000000..d4ca70a --- /dev/null +++ b/src/shared/lib/initial-availability.test.tsx @@ -0,0 +1,107 @@ +import { act, renderHook } from "@testing-library/react"; +import { describe, expect, it, vi } from "vitest"; + +import { useInitialAvailability } from "./initial-availability"; + +describe("useInitialAvailability", () => { + it("keeps loading until content, error, or the initial wait budget", async () => { + vi.useFakeTimers(); + + try { + const { rerender, result } = renderHook( + props => useInitialAvailability(props), + { + initialProps: { + hasContent: false, + identity: "account-a", + isError: false, + isFetching: true, + timeoutMs: 100, + }, + }, + ); + + expect(result.current).toBe("loading"); + await act(() => vi.advanceTimersByTimeAsync(99)); + expect(result.current).toBe("loading"); + await act(() => vi.advanceTimersByTimeAsync(1)); + expect(result.current).toBe("unavailable"); + + rerender({ + hasContent: true, + identity: "account-a", + isError: false, + isFetching: false, + timeoutMs: 100, + }); + expect(result.current).toBe("ready"); + } + finally { + vi.useRealTimers(); + } + }); + + it("does not flash loading during retry for the same identity", async () => { + vi.useFakeTimers(); + + try { + const { rerender, result } = renderHook( + props => useInitialAvailability(props), + { + initialProps: { + hasContent: false, + identity: "account-a", + isError: true, + isFetching: false, + }, + }, + ); + + await act(() => vi.runOnlyPendingTimersAsync()); + expect(result.current).toBe("unavailable"); + rerender({ + hasContent: false, + identity: "account-a", + isError: false, + isFetching: true, + }); + + expect(result.current).toBe("unavailable"); + } + finally { + vi.useRealTimers(); + } + }); + + it("resets loading only when identity changes", async () => { + vi.useFakeTimers(); + + try { + const { rerender, result } = renderHook( + props => useInitialAvailability(props), + { + initialProps: { + hasContent: false, + identity: "account-a", + isError: true, + isFetching: false, + }, + }, + ); + + await act(() => vi.runOnlyPendingTimersAsync()); + expect(result.current).toBe("unavailable"); + rerender({ + hasContent: false, + identity: "account-b", + isError: false, + isFetching: true, + }); + + expect(result.current).toBe("loading"); + } + finally { + vi.useRealTimers(); + } + }); +}); diff --git a/src/shared/lib/initial-availability.ts b/src/shared/lib/initial-availability.ts new file mode 100644 index 0000000..4366b8c --- /dev/null +++ b/src/shared/lib/initial-availability.ts @@ -0,0 +1,49 @@ +import { useEffect, useState } from "react"; + +const INITIAL_WAIT_BUDGET_MS = 10_000; + +type InitialAvailability + = | "loading" + | "ready" + | "unavailable"; + +type InitialAvailabilityInput = { + hasContent: boolean; + identity: string; + isError: boolean; + isFetching: boolean; + timeoutMs?: number; +}; + +function useInitialAvailability( + input: InitialAvailabilityInput, +): InitialAvailability { + const timeoutMs = input.timeoutMs ?? INITIAL_WAIT_BUDGET_MS; + + const [unavailableIdentity, setUnavailableIdentity] = useState( + null, + ); + + useEffect(() => { + if (input.hasContent) return; + + if (input.isError) { + const timer = setTimeout(() => setUnavailableIdentity(input.identity), 0); + + return () => clearTimeout(timer); + } + + const timer = setTimeout( + () => setUnavailableIdentity(input.identity), + timeoutMs, + ); + + return () => clearTimeout(timer); + }, [input.hasContent, input.identity, input.isError, timeoutMs]); + + if (input.hasContent) return "ready"; + + return unavailableIdentity === input.identity ? "unavailable" : "loading"; +} + +export { type InitialAvailability, useInitialAvailability }; -- 2.54.0 From c25f6bd85b88c4c7acb2f5ae6fc013aec77005b2 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Tue, 6 Oct 2026 22:05:24 +0300 Subject: [PATCH 4/7] refactor: move PortfolioStructure to widgets layer --- .ai/architecture.md | 14 ++++++++------ dependency-cruiser.cjs | 16 +++++++++++----- .../components/AccountPageEmpty.view.tsx | 2 +- .../components/AccountPageLoaded.view.tsx | 2 +- src/widgets/portfolio-structure/index.ts | 1 + .../ui}/PortfolioStructure.module.css | 0 .../ui}/PortfolioStructure.stories.tsx | 2 +- .../ui}/PortfolioStructure.test.tsx | 0 .../ui}/PortfolioStructure.tsx | 0 .../ui}/PortfolioStructure.view.tsx | 0 .../ui}/PortfolioStructure.vm.ts | 0 11 files changed, 23 insertions(+), 14 deletions(-) create mode 100644 src/widgets/portfolio-structure/index.ts rename src/{pages/account/ui/AccountPage/components/PortfolioStructure => widgets/portfolio-structure/ui}/PortfolioStructure.module.css (100%) rename src/{pages/account/ui/AccountPage/components/PortfolioStructure => widgets/portfolio-structure/ui}/PortfolioStructure.stories.tsx (98%) rename src/{pages/account/ui/AccountPage/components/PortfolioStructure => widgets/portfolio-structure/ui}/PortfolioStructure.test.tsx (100%) rename src/{pages/account/ui/AccountPage/components/PortfolioStructure => widgets/portfolio-structure/ui}/PortfolioStructure.tsx (100%) rename src/{pages/account/ui/AccountPage/components/PortfolioStructure => widgets/portfolio-structure/ui}/PortfolioStructure.view.tsx (100%) rename src/{pages/account/ui/AccountPage/components/PortfolioStructure => widgets/portfolio-structure/ui}/PortfolioStructure.vm.ts (100%) diff --git a/.ai/architecture.md b/.ai/architecture.md index a5b6fbb..0a9788f 100644 --- a/.ai/architecture.md +++ b/.ai/architecture.md @@ -8,7 +8,7 @@ Vitest — отдельную JSDOM конфигурацию. Точные versi [package.json](../package.json), реализация — source of truth. ```text -app → pages → features → entities → shared +app → pages → widgets → features → entities → shared page container → page VM → entity/feature query → shared/api → backend /api/v1 ↓ props → state/section views @@ -30,13 +30,15 @@ contract; frontend не читает его checkout для генерации | --- | --- | | Bootstrap, глобальные providers, routes | `app` | | Композиция маршрута и поведение, нужное только этому экрану | `pages/` | +| Крупная переиспользуемая композиция экрана | `widgets/` | | Самостоятельная пользовательская возможность с собственным смыслом | `features/` | | Представление/поведение бизнес-сущности | `entities/` | | Переиспользуемый код без WealthLedger domain meaning | `shared` | -Локальный FSD profile: `app → pages → features → entities → shared`, без `widgets`. -Крупный уникальный блок остаётся в своей page. Form, mutation или click handler -сами по себе не требуют feature. Два callers не делают domain helper generic shared. +Локальный FSD profile: `app → pages → widgets → features → entities → shared`. +Widget собирает несколько нижних слоёв в самостоятельный UI-блок; компонент для +одной page остаётся у page. Form, mutation или click handler сами по себе не +требуют feature. Два callers не делают domain helper generic shared. Slice именуется по ответственности, а не `helpers`, `hooks` или `types`. **Безопасный путь:** при сомнении оставь код у ближайшего допустимого owner. @@ -47,12 +49,12 @@ Slice именуется по ответственности, а не `helpers`, Cross-slice consumer использует `@/` и `index.ts` владельца, например `@/entities/portfolio`. Alias Vite и TypeScript согласован. Другой slice не -импортирует внутренний файл напрямую. Slices `pages`, `features`, `entities` не зависят от соседнего slice своего слоя; +импортирует внутренний файл напрямую. Slices `pages`, `widgets`, `features`, `entities` не зависят от соседнего slice своего слоя; композиция принадлежит вышележащему owner. Existing меж-slice исключения не являются разрешением добавлять новые. Направление зависимостей, public imports и запрет соседних slices в -`pages`, `features`, `entities` проверяет `npm run deps`. Внутренние imports +`pages`, `widgets`, `features`, `entities` проверяет `npm run deps`. Внутренние imports одного slice и связи shared segments этот запрет не ограничивает. Knip проверяет использование exports, а не смысл placement. diff --git a/dependency-cruiser.cjs b/dependency-cruiser.cjs index 39beab8..7aae82c 100644 --- a/dependency-cruiser.cjs +++ b/dependency-cruiser.cjs @@ -29,17 +29,17 @@ module.exports = { }, { from: { - path: "^src/(app|pages|features|entities|shared)/([^/]+)/", + path: "^src/(app|pages|widgets|features|entities|shared)/([^/]+)/", }, name: "slices-must-use-public-api", severity: "error", to: { - path: String.raw`^src/(app|pages|features|entities|shared)/([^/]+)/(?!index\.ts$)`, + path: String.raw`^src/(app|pages|widgets|features|entities|shared)/([^/]+)/(?!index\.ts$)`, pathNot: "^src/$1/$2/", }, }, { - from: { path: "^src/(pages|features|entities)/([^/]+)/" }, + from: { path: "^src/(pages|widgets|features|entities)/([^/]+)/" }, name: "no-same-layer-cross-slice-imports", severity: "error", to: { path: "^src/$1/", pathNot: "^src/$1/$2/" }, @@ -48,18 +48,24 @@ module.exports = { from: { path: "^src/shared/" }, name: "shared-must-not-depend-on-layers", severity: "error", - to: { path: "^src/(entities|features|pages|app)/" }, + to: { path: "^src/(entities|features|widgets|pages|app)/" }, }, { from: { path: "^src/entities/" }, name: "entities-must-not-depend-on-higher-layers", severity: "error", - to: { path: "^src/(features|pages|app)/" }, + to: { path: "^src/(features|widgets|pages|app)/" }, }, { from: { path: "^src/features/" }, name: "features-must-not-depend-on-higher-layers", severity: "error", + to: { path: "^src/(widgets|pages|app)/" }, + }, + { + from: { path: "^src/widgets/" }, + name: "widgets-must-not-depend-on-higher-layers", + severity: "error", to: { path: "^src/(pages|app)/" }, }, { diff --git a/src/pages/account/ui/AccountPage/components/AccountPageEmpty.view.tsx b/src/pages/account/ui/AccountPage/components/AccountPageEmpty.view.tsx index bf9c35d..d3377a6 100644 --- a/src/pages/account/ui/AccountPage/components/AccountPageEmpty.view.tsx +++ b/src/pages/account/ui/AccountPage/components/AccountPageEmpty.view.tsx @@ -7,6 +7,7 @@ import { useTranslation } from "react-i18next"; import type { BrokerageAccount } from "@/entities/brokerage-account"; import { BrokerageEventsPreview } from "@/entities/brokerage-event"; +import { PortfolioStructure } from "@/widgets/portfolio-structure"; import type { AccountPageIncomeSummary, @@ -16,7 +17,6 @@ import type { import { AccountHeading } from "./AccountHeading.view"; import { IncomeSummary } from "./IncomeSummary.view"; -import { PortfolioStructure } from "./PortfolioStructure/PortfolioStructure"; import { RecentOperations } from "./RecentOperations.view"; type AccountPageEmptyProps = { diff --git a/src/pages/account/ui/AccountPage/components/AccountPageLoaded.view.tsx b/src/pages/account/ui/AccountPage/components/AccountPageLoaded.view.tsx index 892b1c9..01aa1f6 100644 --- a/src/pages/account/ui/AccountPage/components/AccountPageLoaded.view.tsx +++ b/src/pages/account/ui/AccountPage/components/AccountPageLoaded.view.tsx @@ -7,6 +7,7 @@ import type { BrokerageAccount } from "@/entities/brokerage-account"; import type { Portfolio } from "@/entities/portfolio"; import { BrokerageEventsPreview } from "@/entities/brokerage-event"; +import { PortfolioStructure } from "@/widgets/portfolio-structure"; import type { AccountPagePositionSection } from "../../../model/positions"; import type { @@ -19,7 +20,6 @@ import classes from "../AccountPage.module.css"; import { AccountHeading } from "./AccountHeading.view"; import { CurrencyCards } from "./CurrencyCards/CurrencyCards.view"; import { IncomeSummary } from "./IncomeSummary.view"; -import { PortfolioStructure } from "./PortfolioStructure/PortfolioStructure"; import { PositionSection } from "./PositionSection.view"; import { RecentOperations } from "./RecentOperations.view"; diff --git a/src/widgets/portfolio-structure/index.ts b/src/widgets/portfolio-structure/index.ts new file mode 100644 index 0000000..b89160e --- /dev/null +++ b/src/widgets/portfolio-structure/index.ts @@ -0,0 +1 @@ +export { PortfolioStructure } from "./ui/PortfolioStructure"; diff --git a/src/pages/account/ui/AccountPage/components/PortfolioStructure/PortfolioStructure.module.css b/src/widgets/portfolio-structure/ui/PortfolioStructure.module.css similarity index 100% rename from src/pages/account/ui/AccountPage/components/PortfolioStructure/PortfolioStructure.module.css rename to src/widgets/portfolio-structure/ui/PortfolioStructure.module.css diff --git a/src/pages/account/ui/AccountPage/components/PortfolioStructure/PortfolioStructure.stories.tsx b/src/widgets/portfolio-structure/ui/PortfolioStructure.stories.tsx similarity index 98% rename from src/pages/account/ui/AccountPage/components/PortfolioStructure/PortfolioStructure.stories.tsx rename to src/widgets/portfolio-structure/ui/PortfolioStructure.stories.tsx index 38900e5..aecd386 100644 --- a/src/pages/account/ui/AccountPage/components/PortfolioStructure/PortfolioStructure.stories.tsx +++ b/src/widgets/portfolio-structure/ui/PortfolioStructure.stories.tsx @@ -28,7 +28,7 @@ const meta = { }, }, tags: ["autodocs"], - title: "Product/PortfolioStructure", + title: "Widgets/PortfolioStructure", } satisfies Meta; export default meta; diff --git a/src/pages/account/ui/AccountPage/components/PortfolioStructure/PortfolioStructure.test.tsx b/src/widgets/portfolio-structure/ui/PortfolioStructure.test.tsx similarity index 100% rename from src/pages/account/ui/AccountPage/components/PortfolioStructure/PortfolioStructure.test.tsx rename to src/widgets/portfolio-structure/ui/PortfolioStructure.test.tsx diff --git a/src/pages/account/ui/AccountPage/components/PortfolioStructure/PortfolioStructure.tsx b/src/widgets/portfolio-structure/ui/PortfolioStructure.tsx similarity index 100% rename from src/pages/account/ui/AccountPage/components/PortfolioStructure/PortfolioStructure.tsx rename to src/widgets/portfolio-structure/ui/PortfolioStructure.tsx diff --git a/src/pages/account/ui/AccountPage/components/PortfolioStructure/PortfolioStructure.view.tsx b/src/widgets/portfolio-structure/ui/PortfolioStructure.view.tsx similarity index 100% rename from src/pages/account/ui/AccountPage/components/PortfolioStructure/PortfolioStructure.view.tsx rename to src/widgets/portfolio-structure/ui/PortfolioStructure.view.tsx diff --git a/src/pages/account/ui/AccountPage/components/PortfolioStructure/PortfolioStructure.vm.ts b/src/widgets/portfolio-structure/ui/PortfolioStructure.vm.ts similarity index 100% rename from src/pages/account/ui/AccountPage/components/PortfolioStructure/PortfolioStructure.vm.ts rename to src/widgets/portfolio-structure/ui/PortfolioStructure.vm.ts -- 2.54.0 From 0ea8d7b62d50a4b7c92e9a9934aead6246ac97f9 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Tue, 6 Oct 2026 22:05:41 +0300 Subject: [PATCH 5/7] feat: default journal period to last 7 days --- .../AccountEventsPage.filters.test.tsx | 41 ++++++++++++------- .../AccountEventsPage.test.tsx | 11 ++++- .../AccountEventsPage/AccountEventsPage.vm.ts | 20 +++++++-- .../AccountEventsPageLoaded.view.tsx | 2 + .../AccountOperationsPage.test.tsx | 11 +++-- .../AccountOperationsPage.vm.ts | 20 +++++++-- .../AccountOperationsPageLoaded.view.tsx | 2 + src/shared/lib/calendar.test.ts | 16 +++++++- src/shared/lib/calendar.ts | 13 +++++- src/shared/lib/index.ts | 2 +- src/shared/lib/useUrlPeriod.ts | 17 ++++++-- 11 files changed, 121 insertions(+), 34 deletions(-) diff --git a/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.filters.test.tsx b/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.filters.test.tsx index 33015bf..f2694f5 100644 --- a/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.filters.test.tsx +++ b/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.filters.test.tsx @@ -20,6 +20,7 @@ import { import { beforeEach, describe, expect, it, vi } from "vitest"; import { configureAuthClient } from "@/shared/api"; +import { defaultPeriod, formatDate } from "@/shared/lib"; import { createTestQueryClient } from "@/test/query"; import { resource } from "@/test/resource"; import { server } from "@/test/server"; @@ -157,6 +158,7 @@ describe("Upcoming event date filters", () => { it.each(["account-1", "all"])( "normalizes invalid links and history while preserving one-sided future dates for %s", async (accountId) => { + const [defaultFrom, defaultTo] = defaultPeriod(); const searches: string[] = []; server.use( http.get( @@ -195,20 +197,24 @@ describe("Upcoming event date filters", () => { ), ); expect(screen.getByLabelText("Период")).toHaveTextContent("01.02.2099"); - expect(searches).toEqual(["", "?from=2099-02-01", "?to=2099-02-28"]); + expect(searches[0]).toBe(""); + expect(searches).toContain(`?from=${defaultFrom}&to=${defaultTo}`); + expect(searches).toContain("?from=2099-02-01"); + expect(searches).toContain("?to=2099-02-28"); }, ); it.each(["account-1", "all"])( "lets users reset filters after a request failure for %s", async (accountId) => { + const [defaultFrom] = defaultPeriod(); server.use( http.get( "*/api/v1/brokerage-accounts/:accountId/events", ({ request }) => - new URL(request.url).searchParams.has("from") - ? HttpResponse.json({ code: "VALIDATION_ERROR" }, { status: 400 }) - : HttpResponse.json(resource({ events: [] })), + new URL(request.url).searchParams.get("from") === defaultFrom + ? HttpResponse.json(resource({ events: [] })) + : HttpResponse.json({ code: "VALIDATION_ERROR" }, { status: 400 }), ), ); renderEvents(accountId, ["?from=2099-02-01"]); @@ -222,6 +228,7 @@ describe("Upcoming event date filters", () => { it.each(["account-1", "all"])( "applies dates only on submit, restores URL dates, and resets from empty results for %s", async (accountId) => { + const [defaultFrom, defaultTo] = defaultPeriod(); const searches: string[] = []; server.use( http.get( @@ -240,38 +247,42 @@ describe("Upcoming event date filters", () => { }, ), ); - renderEvents(accountId, ["?from=2099-02-01&to=2099-02-28"]); + renderEvents(accountId, ["?from=2026-02-01&to=2026-02-28"]); const from = await screen.findByLabelText("Период"); - expect(from).toHaveTextContent("01.02.2099 – 28.02.2099"); + expect(from).toHaveTextContent("01.02.2026 – 28.02.2026"); expect(screen.getByRole("button", { name: "Применить" })).toBeDisabled(); - expect(searches).toEqual(["?from=2099-02-01&to=2099-02-28"]); + expect(searches).toEqual(["?from=2026-02-01&to=2026-02-28"]); fireEvent.click(from); fireEvent.click( - await screen.findByRole("button", { name: /10 February 2099/i }), + await screen.findByRole("button", { name: /10 February 2026/i }), ); fireEvent.click( - await screen.findByRole("button", { name: /28 February 2099/i }), + await screen.findByRole("button", { name: /28 February 2026/i }), ); expect(searches).toHaveLength(1); fireEvent.click(screen.getByRole("button", { name: "Применить" })); await waitFor(() => - expect(searches.at(-1)).toBe("?from=2099-02-10&to=2099-02-28"), + expect(searches.at(-1)).toBe("?from=2026-02-10&to=2026-02-28"), ); expect(await screen.findByLabelText("Период")).toHaveTextContent( - "10.02.2099 – 28.02.2099", + "10.02.2026 – 28.02.2026", ); fireEvent.click(screen.getByRole("button", { name: "History back" })); await waitFor(() => expect(screen.getByLabelText("Период")).toHaveTextContent( - "01.02.2099 – 28.02.2099", + "01.02.2026 – 28.02.2026", ), ); expect(screen.getByLabelText("URL")).toHaveTextContent( - "?from=2099-02-01&to=2099-02-28", + "?from=2026-02-01&to=2026-02-28", ); fireEvent.click(screen.getByRole("button", { name: "Сбросить" })); - await waitFor(() => expect(searches.at(-1)).toBe("")); - expect(await screen.findByLabelText("Период")).toHaveTextContent(""); + await waitFor(() => + expect(searches.at(-1)).toBe(`?from=${defaultFrom}&to=${defaultTo}`), + ); + expect(await screen.findByLabelText("Период")).toHaveTextContent( + `${formatDate(defaultFrom)} – ${formatDate(defaultTo)}`, + ); expect(screen.getByRole("button", { name: "Применить" })).toBeDisabled(); expect( screen.getByText("За выбранный период событий не найдено"), diff --git a/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.test.tsx b/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.test.tsx index 4bfa29e..bde07ed 100644 --- a/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.test.tsx +++ b/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.test.tsx @@ -6,6 +6,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; import type * as BrokerageEvents from "@/entities/brokerage-event"; import { useBrokerageEvents } from "@/entities/brokerage-event"; +import { defaultPeriod } from "@/shared/lib"; import { AccountEventsPage } from "./AccountEventsPage"; @@ -71,7 +72,10 @@ describe("AccountEventsPage", () => { , ); - expect(query).toHaveBeenCalledWith("selected-account", {}); + expect(query).toHaveBeenCalledWith("selected-account", { + from: defaultPeriod()[0], + to: defaultPeriod()[1], + }); }); it("keeps the loading fallback when no result or account is available", () => { @@ -88,7 +92,10 @@ describe("AccountEventsPage", () => { } as never, ); renderPage(); - expect(query).toHaveBeenCalledWith("", {}); + expect(query).toHaveBeenCalledWith("", { + from: defaultPeriod()[0], + to: defaultPeriod()[1], + }); expect(screen.getByRole("status", { name: "Загрузка" })).toHaveAttribute( "aria-busy", "true", diff --git a/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.vm.ts b/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.vm.ts index ce2a856..f947b85 100644 --- a/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.vm.ts +++ b/src/pages/account-events/ui/AccountEventsPage/AccountEventsPage.vm.ts @@ -6,15 +6,23 @@ import { useBrokerageEvents, } from "@/entities/brokerage-event"; import { useScreenSync } from "@/features/tbank-connection"; -import { isValidPeriod, useInitialAvailability, useUrlPeriod } from "@/shared/lib"; +import { + defaultPeriod, + isValidPeriod, + moscowDate, + useInitialAvailability, + useUrlPeriod, +} from "@/shared/lib"; type AccountEventsPageViewModel = | { canApply: boolean; draftPeriod: [null | string, null | string]; events: BrokerageEvent[]; + maxDate: string; onApply: () => void; onPeriodChange: (value: [null | string, null | string]) => void; + onPeriodPopoverOpen: () => void; onReset: () => void; partial?: boolean; state: "loaded"; @@ -38,6 +46,8 @@ function useAccountEventsPageViewModel(): AccountEventsPageViewModel { const [draftFrom, draftTo] = draftPeriod; + const [maxDate, setMaxDate] = useState(() => moscowDate(new Date())); + const scope = JSON.stringify([accountId, appliedFrom, appliedTo]); const [previousScope, setPreviousScope] = useState(scope); @@ -72,7 +82,7 @@ function useAccountEventsPageViewModel(): AccountEventsPageViewModel { return { state: "loading" }; const onReset = () => { - setDraftPeriod([null, null]); + setDraftPeriod([appliedFrom, appliedTo]); setSearchParameters({}); }; @@ -92,6 +102,7 @@ function useAccountEventsPageViewModel(): AccountEventsPageViewModel { && isValidPeriod(draftFrom, draftTo), draftPeriod, events: events.data.events, + maxDate, onApply: () => { if (!isValidPeriod(draftFrom, draftTo)) return; setSearchParameters({ @@ -99,7 +110,10 @@ function useAccountEventsPageViewModel(): AccountEventsPageViewModel { ...(draftTo && { to: draftTo }), }); }, - onPeriodChange: setDraftPeriod, + onPeriodChange: value => setDraftPeriod( + value[0] === null && value[1] === null ? defaultPeriod() : value, + ), + onPeriodPopoverOpen: () => setMaxDate(moscowDate(new Date())), onReset, partial: events.meta?.availability !== "complete", state: "loaded", diff --git a/src/pages/account-events/ui/AccountEventsPage/components/AccountEventsPageLoaded.view.tsx b/src/pages/account-events/ui/AccountEventsPage/components/AccountEventsPageLoaded.view.tsx index dd0743c..1b6b2bc 100644 --- a/src/pages/account-events/ui/AccountEventsPage/components/AccountEventsPageLoaded.view.tsx +++ b/src/pages/account-events/ui/AccountEventsPage/components/AccountEventsPageLoaded.view.tsx @@ -65,9 +65,11 @@ const AccountEventsPageLoaded: FC = (props) => { clearable clearButtonProps={{ "aria-label": t("ledger.clearPeriod") }} label={t("ledger.period")} + maxDate={props.maxDate} onChange={props.onPeriodChange} popoverProps={{ middlewares: { shift: { crossAxis: true } }, + onOpen: props.onPeriodPopoverOpen, returnFocus: true, }} type="range" diff --git a/src/pages/account-operations/ui/AccountOperationsPage/AccountOperationsPage.test.tsx b/src/pages/account-operations/ui/AccountOperationsPage/AccountOperationsPage.test.tsx index 6a0f9fe..7f443e9 100644 --- a/src/pages/account-operations/ui/AccountOperationsPage/AccountOperationsPage.test.tsx +++ b/src/pages/account-operations/ui/AccountOperationsPage/AccountOperationsPage.test.tsx @@ -18,6 +18,7 @@ import { LedgerEntryRow, } from "@/entities/broker-operation"; import { configureAuthClient } from "@/shared/api"; +import { defaultPeriod } from "@/shared/lib"; import { createTestQueryClient } from "@/test/query"; import { resource } from "@/test/resource"; import { server } from "@/test/server"; @@ -312,18 +313,20 @@ describe("AccountOperationsPage", () => { "allows resetting filters after a request failure for %s", async (accountId) => { configureTestAuth(); + const [defaultFrom] = defaultPeriod(); server.use( http.get( "*/api/v1/brokerage-accounts/:accountId/operations", ({ request }) => - new URL(request.url).searchParams.has("from") - ? HttpResponse.json({ code: "VALIDATION_ERROR" }, { status: 400 }) - : HttpResponse.json( + new URL(request.url).searchParams.get("from") + === `${defaultFrom}T00:00:00.000Z` + ? HttpResponse.json( resource( { hasNext: false, items: [], nextCursor: null }, ), - ), + ) + : HttpResponse.json({ code: "VALIDATION_ERROR" }, { status: 400 }), ), ); render( diff --git a/src/pages/account-operations/ui/AccountOperationsPage/AccountOperationsPage.vm.ts b/src/pages/account-operations/ui/AccountOperationsPage/AccountOperationsPage.vm.ts index db29494..7449ac9 100644 --- a/src/pages/account-operations/ui/AccountOperationsPage/AccountOperationsPage.vm.ts +++ b/src/pages/account-operations/ui/AccountOperationsPage/AccountOperationsPage.vm.ts @@ -11,7 +11,13 @@ import { } from "@/entities/broker-operation"; import { useScreenSync } from "@/features/tbank-connection"; import { ApiErrorCode, apiErrorCode, isApiErrorCode } from "@/shared/api"; -import { isValidPeriod, useInitialAvailability, useUrlPeriod } from "@/shared/lib"; +import { + defaultPeriod, + isValidPeriod, + moscowDate, + useInitialAvailability, + useUrlPeriod, +} from "@/shared/lib"; const operationCategorySet = new Set(operationCategories); @@ -24,10 +30,12 @@ type AccountOperationsPageViewModel hasPrevious: boolean; historyLoading?: boolean; items: BrokerageOperation[]; + maxDate: string; onApply: () => void; onCategoriesChange: (value: string[]) => void; onNext: () => void; onPeriodChange: (value: [null | string, null | string]) => void; + onPeriodPopoverOpen: () => void; onPrevious: () => void; onReset: () => void; partial?: boolean; @@ -61,6 +69,8 @@ const useAccountOperationsPageVm = (): AccountOperationsPageViewModel => { const [draftCategories, setDraftCategories] = useState(appliedCategories); + const [maxDate, setMaxDate] = useState(() => moscowDate(new Date())); + const firstPageQuery = { from: dateStart(appliedFrom), to: dateEnd(appliedTo), @@ -103,7 +113,7 @@ const useAccountOperationsPageVm = (): AccountOperationsPageViewModel => { }).queryKey; const onReset = () => { - setDraftPeriod([null, null]); + setDraftPeriod([appliedFrom, appliedTo]); setDraftCategories([]); setSearchParameters({}); history.reset(); @@ -143,6 +153,7 @@ const useAccountOperationsPageVm = (): AccountOperationsPageViewModel => { operations.meta?.coverage?.historyState === "loading" || operations.meta?.coverage?.historyState === "partial", items: operations.data.items, + maxDate, onApply: () => { if (!isValidPeriod(draftFrom, draftTo)) return; setSearchParameters({ @@ -160,7 +171,10 @@ const useAccountOperationsPageVm = (): AccountOperationsPageViewModel => { ), ), onNext: history.onNext, - onPeriodChange: setDraftPeriod, + onPeriodChange: value => setDraftPeriod( + value[0] === null && value[1] === null ? defaultPeriod() : value, + ), + onPeriodPopoverOpen: () => setMaxDate(moscowDate(new Date())), onPrevious: history.onPrevious, onReset, partial: operations.meta?.availability !== "complete", diff --git a/src/pages/account-operations/ui/AccountOperationsPage/components/AccountOperationsPageLoaded.view.tsx b/src/pages/account-operations/ui/AccountOperationsPage/components/AccountOperationsPageLoaded.view.tsx index 18a69e7..208ff5f 100644 --- a/src/pages/account-operations/ui/AccountOperationsPage/components/AccountOperationsPageLoaded.view.tsx +++ b/src/pages/account-operations/ui/AccountOperationsPage/components/AccountOperationsPageLoaded.view.tsx @@ -72,9 +72,11 @@ const AccountOperationsPageLoaded: FC = ( clearable clearButtonProps={{ "aria-label": t("ledger.clearPeriod") }} label={t("ledger.period")} + maxDate={props.maxDate} onChange={props.onPeriodChange} popoverProps={{ middlewares: { shift: { crossAxis: true } }, + onOpen: props.onPeriodPopoverOpen, returnFocus: true, }} type="range" diff --git a/src/shared/lib/calendar.test.ts b/src/shared/lib/calendar.test.ts index d27959b..49ff20e 100644 --- a/src/shared/lib/calendar.test.ts +++ b/src/shared/lib/calendar.test.ts @@ -1,6 +1,11 @@ import { describe, expect, it } from "vitest"; -import { compareDateDesc, isValidPeriod, moscowDate } from "./calendar"; +import { + compareDateDesc, + defaultPeriod, + isValidPeriod, + moscowDate, +} from "./calendar"; import { calendarDate } from "./calendar.schema"; describe("calendar dates", () => { @@ -33,6 +38,15 @@ describe("calendar dates", () => { expect(moscowDate(new Date("2026-12-31T21:00:00Z"))).toBe("2027-01-01"); }); + it("defaults to the last 7 days including today", () => { + const [from, to] = defaultPeriod(); + + expect(calendarDate.safeParse(from).success).toBe(true); + expect(to).toBe(moscowDate(new Date())); + expect((Date.parse(to) - Date.parse(from)) / 86_400_000).toBe(6); + expect(from <= to).toBe(true); + }); + it("compares dates newest first and keeps dateless rows last", () => { const dates = [null, "2026-01-01", "2026-03-01", "2026-02-01"]; diff --git a/src/shared/lib/calendar.ts b/src/shared/lib/calendar.ts index c3697b3..64b98e1 100644 --- a/src/shared/lib/calendar.ts +++ b/src/shared/lib/calendar.ts @@ -9,6 +9,9 @@ function isValidPeriod(from: null | string, to: null | string) { ); } +const DAY_MS = 86_400_000; +const DEFAULT_PERIOD_DAYS = 6; + const moscowFormatter = new Intl.DateTimeFormat("en-CA", { day: "2-digit", month: "2-digit", @@ -22,6 +25,14 @@ function compareDateDesc(a: null | string, b: null | string) { return (b ?? "").localeCompare(a ?? ""); } +// Last 7 days including today. An empty period always means this range. +function defaultPeriod(): [string, string] { + const to = new Date(); + const from = new Date(to.getTime() - DEFAULT_PERIOD_DAYS * DAY_MS); + + return [moscowDate(from), moscowDate(to)]; +} + function moscowDate(value: Date): string { const parts = moscowFormatter.formatToParts(value); @@ -31,4 +42,4 @@ function moscowDate(value: Date): string { return `${part("year")}-${part("month")}-${part("day")}`; } -export { compareDateDesc, isValidPeriod, moscowDate }; +export { compareDateDesc, defaultPeriod, isValidPeriod, moscowDate }; diff --git a/src/shared/lib/index.ts b/src/shared/lib/index.ts index 9b45661..fa0ac06 100644 --- a/src/shared/lib/index.ts +++ b/src/shared/lib/index.ts @@ -1,4 +1,4 @@ -export { compareDateDesc, isValidPeriod, moscowDate } from "./calendar"; +export { compareDateDesc, defaultPeriod, isValidPeriod, moscowDate } from "./calendar"; export { calendarDate } from "./calendar.schema"; export { formatChartValue, diff --git a/src/shared/lib/useUrlPeriod.ts b/src/shared/lib/useUrlPeriod.ts index 0129edd..d3a19af 100644 --- a/src/shared/lib/useUrlPeriod.ts +++ b/src/shared/lib/useUrlPeriod.ts @@ -1,13 +1,22 @@ -import { useEffect } from "react"; +import { useEffect, useState } from "react"; import { useSearchParams } from "react-router"; -import { isValidPeriod } from "./calendar"; +import { defaultPeriod, isValidPeriod } from "./calendar"; function useUrlPeriod() { const [parameters, setParameters] = useSearchParams(); const from = parameters.get("from"); const to = parameters.get("to"); const isValid = isValidPeriod(from, to); + const hasPeriod = from !== null || to !== null; + const [[defaultFrom, defaultTo]] = useState<[string, string]>(defaultPeriod); + + const resolve = (value: null | string, fallback: string) => { + if (!isValid) return null; + + return hasPeriod ? value : fallback; + }; + useEffect(() => { if (isValid || (!parameters.has("from") && !parameters.has("to"))) return; const normalized = new URLSearchParams(parameters); @@ -17,10 +26,10 @@ function useUrlPeriod() { }, [isValid, parameters, setParameters]); return { - from: isValid ? from : null, + from: resolve(from, defaultFrom), parameters, setParameters, - to: isValid ? to : null, + to: resolve(to, defaultTo), }; } -- 2.54.0 From f873db7b027b6dee0c7382b4bd3df5198c7a4198 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Wed, 7 Oct 2026 07:27:16 +0300 Subject: [PATCH 6/7] fix(deps): resolve npm audit advisories --- package-lock.json | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 527dcbf..810e0a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13980,8 +13980,9 @@ } }, "node_modules/smol-toml": { - "version": "1.8.0", - "integrity": "sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.9.0.tgz", + "integrity": "sha512-hpd+HLON7HdZXqYchMM/+LaTTbdK0AU3NngIJ4KVyWbY9bfQqdL9cD+4yf6dUoU2Ap4VsU0JkQi6FxAI1B2mXQ==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -14038,8 +14039,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.1", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", "dev": true, "license": "BSD-3-Clause", "engines": { -- 2.54.0 From fcb938b5a29fc82f00bbaa8b2ee776ca57dad010 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Wed, 7 Oct 2026 09:10:03 +0300 Subject: [PATCH 7/7] chore: remove unused exports --- src/features/tbank-connection/index.ts | 4 ---- .../InvestmentRefreshState/InvestmentRefreshState.view.tsx | 2 +- src/shared/lib/index.ts | 5 +---- src/shared/lib/initial-availability.ts | 2 +- 4 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/features/tbank-connection/index.ts b/src/features/tbank-connection/index.ts index 9b07524..850e209 100644 --- a/src/features/tbank-connection/index.ts +++ b/src/features/tbank-connection/index.ts @@ -1,6 +1,2 @@ export { useScreenSync } from "./model/screen-sync"; -export { - InvestmentRefreshState, - type InvestmentRefreshStateProps, -} from "./ui/InvestmentRefreshState/InvestmentRefreshState.view"; export { TbankConnectionSection } from "./ui/TbankConnectionSection/TbankConnectionSection"; diff --git a/src/features/tbank-connection/ui/InvestmentRefreshState/InvestmentRefreshState.view.tsx b/src/features/tbank-connection/ui/InvestmentRefreshState/InvestmentRefreshState.view.tsx index 72b1f17..0be99c6 100644 --- a/src/features/tbank-connection/ui/InvestmentRefreshState/InvestmentRefreshState.view.tsx +++ b/src/features/tbank-connection/ui/InvestmentRefreshState/InvestmentRefreshState.view.tsx @@ -58,4 +58,4 @@ const InvestmentRefreshState: FC = (props) => { ); }; -export { InvestmentRefreshState, type InvestmentRefreshStateProps }; +export { InvestmentRefreshState }; diff --git a/src/shared/lib/index.ts b/src/shared/lib/index.ts index fa0ac06..ec94855 100644 --- a/src/shared/lib/index.ts +++ b/src/shared/lib/index.ts @@ -8,8 +8,5 @@ export { formatSnapshotTime, instrumentLogoUrl, } from "./display"; -export { - type InitialAvailability, - useInitialAvailability, -} from "./initial-availability"; +export { useInitialAvailability } from "./initial-availability"; export { useUrlPeriod } from "./useUrlPeriod"; diff --git a/src/shared/lib/initial-availability.ts b/src/shared/lib/initial-availability.ts index 4366b8c..0a3aa4b 100644 --- a/src/shared/lib/initial-availability.ts +++ b/src/shared/lib/initial-availability.ts @@ -46,4 +46,4 @@ function useInitialAvailability( return unavailableIdentity === input.identity ? "unavailable" : "loading"; } -export { type InitialAvailability, useInitialAvailability }; +export { useInitialAvailability }; -- 2.54.0