From c147df00bb2f1f6de20e0bb4ef8d8ca1c7fc581d Mon Sep 17 00:00:00 2001 From: David Crespo Date: Sun, 29 Dec 2024 16:02:51 -0500 Subject: [PATCH] React Router 7 (#2628) * bump package version * convert all the imports, everything works but the scroll restore test * make scroll restore test pass * upgrade vite and vitest * use 7.1.1 stable * fix package-lock.json --- app/components/ErrorBoundary.tsx | 2 +- app/components/ErrorPage.tsx | 2 +- app/components/QueryParamTabs.tsx | 2 +- app/components/RouteTabs.tsx | 2 +- app/components/Sidebar.tsx | 2 +- app/components/TopBar.tsx | 2 +- app/components/form/FullPageForm.tsx | 2 +- app/components/form/SideModalForm.tsx | 2 +- app/forms/disk-create.tsx | 2 +- app/forms/firewall-rules-create.tsx | 2 +- app/forms/firewall-rules-edit.tsx | 2 +- app/forms/floating-ip-create.tsx | 2 +- app/forms/floating-ip-edit.tsx | 2 +- app/forms/idp/create.tsx | 2 +- app/forms/idp/edit.tsx | 2 +- app/forms/image-edit.tsx | 2 +- app/forms/image-from-snapshot.tsx | 2 +- app/forms/image-upload.tsx | 2 +- app/forms/instance-create.tsx | 2 +- app/forms/ip-pool-create.tsx | 2 +- app/forms/ip-pool-edit.tsx | 2 +- app/forms/ip-pool-range-add.tsx | 2 +- app/forms/project-create.tsx | 2 +- app/forms/project-edit.tsx | 2 +- app/forms/silo-create.tsx | 2 +- app/forms/snapshot-create.tsx | 2 +- app/forms/ssh-key-create.tsx | 2 +- app/forms/ssh-key-edit.tsx | 2 +- app/forms/subnet-create.tsx | 2 +- app/forms/subnet-edit.tsx | 2 +- app/forms/vpc-create.tsx | 2 +- app/forms/vpc-edit.tsx | 2 +- app/forms/vpc-router-create.tsx | 2 +- app/forms/vpc-router-edit.tsx | 6 +- app/forms/vpc-router-route-create.tsx | 2 +- app/forms/vpc-router-route-edit.tsx | 2 +- app/hooks/use-crumbs.ts | 2 +- app/hooks/use-is-active-path.ts | 4 +- app/hooks/use-params.ts | 2 +- app/hooks/use-quick-actions.tsx | 2 +- app/hooks/use-scroll-restoration.ts | 2 +- app/layouts/AuthLayout.tsx | 2 +- app/layouts/AuthenticatedLayout.tsx | 2 +- app/layouts/LoginLayout.tsx | 2 +- app/layouts/ProjectLayout.tsx | 2 +- app/layouts/RootLayout.tsx | 2 +- app/layouts/SettingsLayout.tsx | 2 +- app/layouts/SiloLayout.tsx | 2 +- app/layouts/SystemLayout.tsx | 2 +- app/layouts/helpers.tsx | 2 +- app/main.tsx | 22 +- app/pages/DeviceAuthVerifyPage.tsx | 2 +- app/pages/LoginPage.tsx | 2 +- app/pages/LoginPageSaml.tsx | 2 +- app/pages/ProjectsPage.tsx | 2 +- app/pages/lookups.ts | 2 +- .../project/access/ProjectAccessPage.tsx | 2 +- app/pages/project/disks/DisksPage.tsx | 2 +- .../project/floating-ips/FloatingIpsPage.tsx | 2 +- app/pages/project/images/ImagesPage.tsx | 2 +- app/pages/project/instances/InstancesPage.tsx | 2 +- app/pages/project/instances/actions.tsx | 2 +- .../instances/instance/InstancePage.tsx | 2 +- .../instances/instance/SerialConsolePage.tsx | 2 +- .../instances/instance/tabs/ConnectTab.tsx | 2 +- .../instances/instance/tabs/MetricsTab.tsx | 2 +- .../instances/instance/tabs/NetworkingTab.tsx | 2 +- .../instances/instance/tabs/StorageTab.tsx | 2 +- app/pages/project/snapshots/SnapshotsPage.tsx | 2 +- app/pages/project/vpcs/RouterPage.tsx | 2 +- app/pages/project/vpcs/VpcPage/VpcPage.tsx | 2 +- .../vpcs/VpcPage/tabs/VpcFirewallRulesTab.tsx | 2 +- .../vpcs/VpcPage/tabs/VpcGatewaysTab.tsx | 2 +- .../vpcs/VpcPage/tabs/VpcRoutersTab.tsx | 2 +- .../vpcs/VpcPage/tabs/VpcSubnetsTab.tsx | 2 +- app/pages/project/vpcs/VpcsPage.tsx | 2 +- .../project/vpcs/internet-gateway-edit.tsx | 2 +- app/pages/settings/SSHKeysPage.tsx | 2 +- app/pages/system/SiloImagesPage.tsx | 2 +- .../inventory/sled/SledInstancesTab.tsx | 2 +- app/pages/system/inventory/sled/SledPage.tsx | 2 +- app/pages/system/networking/IpPoolPage.tsx | 2 +- app/pages/system/networking/IpPoolsPage.tsx | 2 +- app/pages/system/silos/SiloIdpsTab.tsx | 2 +- app/pages/system/silos/SiloPage.tsx | 2 +- app/pages/system/silos/SilosPage.tsx | 2 +- app/routes.tsx | 2 +- app/table/cells/LinkCell.tsx | 2 +- app/ui/lib/CreateButton.tsx | 2 +- app/ui/lib/DropdownMenu.tsx | 2 +- app/ui/lib/EmptyMessage.tsx | 2 +- app/ui/lib/Message.tsx | 2 +- app/ui/lib/Toast.tsx | 2 +- app/util/path-builder.spec.ts | 2 +- package-lock.json | 948 +++++------------- package.json | 6 +- test/e2e/scroll-restore.e2e.ts | 13 +- 97 files changed, 376 insertions(+), 805 deletions(-) diff --git a/app/components/ErrorBoundary.tsx b/app/components/ErrorBoundary.tsx index 181ceb5f3..32baf81de 100644 --- a/app/components/ErrorBoundary.tsx +++ b/app/components/ErrorBoundary.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { ErrorBoundary as BaseErrorBoundary } from 'react-error-boundary' -import { useRouteError } from 'react-router-dom' +import { useRouteError } from 'react-router' import { type ApiError } from '~/api/errors' diff --git a/app/components/ErrorPage.tsx b/app/components/ErrorPage.tsx index 85ad7bb06..3e6b6522c 100644 --- a/app/components/ErrorPage.tsx +++ b/app/components/ErrorPage.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import type { ReactNode } from 'react' -import { Link } from 'react-router-dom' +import { Link } from 'react-router' import { Error12Icon, PrevArrow12Icon } from '@oxide/design-system/icons/react' diff --git a/app/components/QueryParamTabs.tsx b/app/components/QueryParamTabs.tsx index bfcb84ab5..0b3500b10 100644 --- a/app/components/QueryParamTabs.tsx +++ b/app/components/QueryParamTabs.tsx @@ -5,7 +5,7 @@ * * Copyright Oxide Computer Company */ -import { useSearchParams } from 'react-router-dom' +import { useSearchParams } from 'react-router' import { Tabs, type TabsRootProps } from '~/ui/lib/Tabs' diff --git a/app/components/RouteTabs.tsx b/app/components/RouteTabs.tsx index 0ded89654..a35272539 100644 --- a/app/components/RouteTabs.tsx +++ b/app/components/RouteTabs.tsx @@ -7,7 +7,7 @@ */ import cn from 'classnames' import type { ReactNode } from 'react' -import { Link, Outlet } from 'react-router-dom' +import { Link, Outlet } from 'react-router' import { useIsActivePath } from '~/hooks/use-is-active-path' import { KEYS } from '~/ui/util/keys' diff --git a/app/components/Sidebar.tsx b/app/components/Sidebar.tsx index 4b6f2db87..0206faee6 100644 --- a/app/components/Sidebar.tsx +++ b/app/components/Sidebar.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import cn from 'classnames' -import { NavLink, useLocation } from 'react-router-dom' +import { NavLink, useLocation } from 'react-router' import { Action16Icon, Document16Icon } from '@oxide/design-system/icons/react' diff --git a/app/components/TopBar.tsx b/app/components/TopBar.tsx index 0c3c745ad..a0115ab38 100644 --- a/app/components/TopBar.tsx +++ b/app/components/TopBar.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import cn from 'classnames' -import { Link } from 'react-router-dom' +import { Link } from 'react-router' import { navToLogin, useApiMutation } from '@oxide/api' import { diff --git a/app/components/form/FullPageForm.tsx b/app/components/form/FullPageForm.tsx index fe422f543..2be6f31b0 100644 --- a/app/components/form/FullPageForm.tsx +++ b/app/components/form/FullPageForm.tsx @@ -7,7 +7,7 @@ */ import { cloneElement, useEffect, type ReactNode } from 'react' import type { FieldValues, UseFormReturn } from 'react-hook-form' -import { useBlocker, type Blocker } from 'react-router-dom' +import { useBlocker, type Blocker } from 'react-router' import type { ApiError } from '@oxide/api' diff --git a/app/components/form/SideModalForm.tsx b/app/components/form/SideModalForm.tsx index 4aadd4115..4cc2a8778 100644 --- a/app/components/form/SideModalForm.tsx +++ b/app/components/form/SideModalForm.tsx @@ -8,7 +8,7 @@ import { useEffect, useId, useState, type ReactNode } from 'react' import type { FieldValues, UseFormReturn } from 'react-hook-form' -import { NavigationType, useNavigationType } from 'react-router-dom' +import { NavigationType, useNavigationType } from 'react-router' import type { ApiError } from '@oxide/api' diff --git a/app/forms/disk-create.tsx b/app/forms/disk-create.tsx index 37d1d47fa..680115e26 100644 --- a/app/forms/disk-create.tsx +++ b/app/forms/disk-create.tsx @@ -8,7 +8,7 @@ import { filesize } from 'filesize' import { useMemo } from 'react' import { useController, useForm, type Control } from 'react-hook-form' -import { useNavigate, type NavigateFunction } from 'react-router-dom' +import { useNavigate, type NavigateFunction } from 'react-router' import { useApiMutation, diff --git a/app/forms/firewall-rules-create.tsx b/app/forms/firewall-rules-create.tsx index 01f14317b..df1b74642 100644 --- a/app/forms/firewall-rules-create.tsx +++ b/app/forms/firewall-rules-create.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useForm } from 'react-hook-form' -import { useNavigate, useParams, type LoaderFunctionArgs } from 'react-router-dom' +import { useNavigate, useParams, type LoaderFunctionArgs } from 'react-router' import { apiQueryClient, diff --git a/app/forms/firewall-rules-edit.tsx b/app/forms/firewall-rules-edit.tsx index b9bd16fa9..89d4310a2 100644 --- a/app/forms/firewall-rules-edit.tsx +++ b/app/forms/firewall-rules-edit.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useForm } from 'react-hook-form' -import { useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { useNavigate, type LoaderFunctionArgs } from 'react-router' import { apiQueryClient, diff --git a/app/forms/floating-ip-create.tsx b/app/forms/floating-ip-create.tsx index cab5b694e..6ba7d385f 100644 --- a/app/forms/floating-ip-create.tsx +++ b/app/forms/floating-ip-create.tsx @@ -8,7 +8,7 @@ import * as Accordion from '@radix-ui/react-accordion' import { useState } from 'react' import { useForm } from 'react-hook-form' -import { useNavigate } from 'react-router-dom' +import { useNavigate } from 'react-router' import { useApiMutation, diff --git a/app/forms/floating-ip-edit.tsx b/app/forms/floating-ip-edit.tsx index 17469321e..347cbc793 100644 --- a/app/forms/floating-ip-edit.tsx +++ b/app/forms/floating-ip-edit.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useForm } from 'react-hook-form' -import { useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { useNavigate, type LoaderFunctionArgs } from 'react-router' import { apiq, queryClient, useApiMutation, usePrefetchedApiQuery } from '@oxide/api' diff --git a/app/forms/idp/create.tsx b/app/forms/idp/create.tsx index 63ce323b2..806ff8cad 100644 --- a/app/forms/idp/create.tsx +++ b/app/forms/idp/create.tsx @@ -7,7 +7,7 @@ */ import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' -import { useNavigate } from 'react-router-dom' +import { useNavigate } from 'react-router' import { useApiMutation, useApiQueryClient } from '@oxide/api' diff --git a/app/forms/idp/edit.tsx b/app/forms/idp/edit.tsx index 34dc2f322..1b7700c13 100644 --- a/app/forms/idp/edit.tsx +++ b/app/forms/idp/edit.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useForm } from 'react-hook-form' -import { useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { useNavigate, type LoaderFunctionArgs } from 'react-router' import { apiQueryClient, usePrefetchedApiQuery } from '@oxide/api' import { Access16Icon } from '@oxide/design-system/icons/react' diff --git a/app/forms/image-edit.tsx b/app/forms/image-edit.tsx index 594cc2939..721460246 100644 --- a/app/forms/image-edit.tsx +++ b/app/forms/image-edit.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useForm } from 'react-hook-form' -import { useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { useNavigate, type LoaderFunctionArgs } from 'react-router' import { apiQueryClient, usePrefetchedApiQuery, type Image } from '@oxide/api' import { Images16Icon } from '@oxide/design-system/icons/react' diff --git a/app/forms/image-from-snapshot.tsx b/app/forms/image-from-snapshot.tsx index b6e7e2a55..9be8aa0e5 100644 --- a/app/forms/image-from-snapshot.tsx +++ b/app/forms/image-from-snapshot.tsx @@ -7,7 +7,7 @@ */ import { filesize } from 'filesize' import { useForm } from 'react-hook-form' -import { useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { useNavigate, type LoaderFunctionArgs } from 'react-router' import { apiq, diff --git a/app/forms/image-upload.tsx b/app/forms/image-upload.tsx index cd3ae824c..0b85ba336 100644 --- a/app/forms/image-upload.tsx +++ b/app/forms/image-upload.tsx @@ -12,7 +12,7 @@ import pMap from 'p-map' import pRetry from 'p-retry' import { useRef, useState } from 'react' import { useForm } from 'react-hook-form' -import { useNavigate } from 'react-router-dom' +import { useNavigate } from 'react-router' import { useApiMutation, diff --git a/app/forms/instance-create.tsx b/app/forms/instance-create.tsx index 0b50ea38d..108cf57c2 100644 --- a/app/forms/instance-create.tsx +++ b/app/forms/instance-create.tsx @@ -8,7 +8,7 @@ import * as Accordion from '@radix-ui/react-accordion' import { useEffect, useMemo, useState } from 'react' import { useController, useForm, useWatch, type Control } from 'react-hook-form' -import { useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { useNavigate, type LoaderFunctionArgs } from 'react-router' import type { SetRequired } from 'type-fest' import { diff --git a/app/forms/ip-pool-create.tsx b/app/forms/ip-pool-create.tsx index 8afa803e9..65fafaeca 100644 --- a/app/forms/ip-pool-create.tsx +++ b/app/forms/ip-pool-create.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useForm } from 'react-hook-form' -import { useNavigate } from 'react-router-dom' +import { useNavigate } from 'react-router' import { useApiMutation, useApiQueryClient, type IpPoolCreate } from '@oxide/api' diff --git a/app/forms/ip-pool-edit.tsx b/app/forms/ip-pool-edit.tsx index e91710199..3c92cd8c0 100644 --- a/app/forms/ip-pool-edit.tsx +++ b/app/forms/ip-pool-edit.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useForm } from 'react-hook-form' -import { useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { useNavigate, type LoaderFunctionArgs } from 'react-router' import { apiQueryClient, diff --git a/app/forms/ip-pool-range-add.tsx b/app/forms/ip-pool-range-add.tsx index 318365626..2039cfaf2 100644 --- a/app/forms/ip-pool-range-add.tsx +++ b/app/forms/ip-pool-range-add.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useForm, type FieldErrors } from 'react-hook-form' -import { useNavigate } from 'react-router-dom' +import { useNavigate } from 'react-router' import { useApiMutation, useApiQueryClient, type IpRange } from '@oxide/api' diff --git a/app/forms/project-create.tsx b/app/forms/project-create.tsx index 6616c641d..f7688b3f7 100644 --- a/app/forms/project-create.tsx +++ b/app/forms/project-create.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useForm } from 'react-hook-form' -import { useNavigate } from 'react-router-dom' +import { useNavigate } from 'react-router' import { useApiMutation, useApiQueryClient, type ProjectCreate } from '@oxide/api' diff --git a/app/forms/project-edit.tsx b/app/forms/project-edit.tsx index 45f05da9b..a6ffd87b0 100644 --- a/app/forms/project-edit.tsx +++ b/app/forms/project-edit.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useForm } from 'react-hook-form' -import { useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { useNavigate, type LoaderFunctionArgs } from 'react-router' import { apiq, queryClient, useApiMutation, usePrefetchedQuery } from '@oxide/api' diff --git a/app/forms/silo-create.tsx b/app/forms/silo-create.tsx index ea6b82651..474e64006 100644 --- a/app/forms/silo-create.tsx +++ b/app/forms/silo-create.tsx @@ -7,7 +7,7 @@ */ import { useEffect } from 'react' import { useForm } from 'react-hook-form' -import { useNavigate } from 'react-router-dom' +import { useNavigate } from 'react-router' import { useApiMutation, useApiQueryClient, type SiloCreate } from '@oxide/api' diff --git a/app/forms/snapshot-create.tsx b/app/forms/snapshot-create.tsx index a88680070..7b1580854 100644 --- a/app/forms/snapshot-create.tsx +++ b/app/forms/snapshot-create.tsx @@ -7,7 +7,7 @@ */ import { useMemo } from 'react' import { useForm } from 'react-hook-form' -import { useNavigate } from 'react-router-dom' +import { useNavigate } from 'react-router' import { diskCan, diff --git a/app/forms/ssh-key-create.tsx b/app/forms/ssh-key-create.tsx index d3c0f68c9..0d328b681 100644 --- a/app/forms/ssh-key-create.tsx +++ b/app/forms/ssh-key-create.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useForm } from 'react-hook-form' -import { useNavigate } from 'react-router-dom' +import { useNavigate } from 'react-router' import { useApiMutation, useApiQueryClient, type SshKeyCreate } from '@oxide/api' diff --git a/app/forms/ssh-key-edit.tsx b/app/forms/ssh-key-edit.tsx index 161b7bd49..15bed8b74 100644 --- a/app/forms/ssh-key-edit.tsx +++ b/app/forms/ssh-key-edit.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useForm } from 'react-hook-form' -import { useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { useNavigate, type LoaderFunctionArgs } from 'react-router' import { apiQueryClient, usePrefetchedApiQuery } from '@oxide/api' import { Key16Icon } from '@oxide/design-system/icons/react' diff --git a/app/forms/subnet-create.tsx b/app/forms/subnet-create.tsx index e2bbb2666..8728a2572 100644 --- a/app/forms/subnet-create.tsx +++ b/app/forms/subnet-create.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useForm } from 'react-hook-form' -import { useNavigate } from 'react-router-dom' +import { useNavigate } from 'react-router' import { useApiMutation, useApiQueryClient, type VpcSubnetCreate } from '@oxide/api' diff --git a/app/forms/subnet-edit.tsx b/app/forms/subnet-edit.tsx index 204767b38..897c4c230 100644 --- a/app/forms/subnet-edit.tsx +++ b/app/forms/subnet-edit.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useForm } from 'react-hook-form' -import { useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { useNavigate, type LoaderFunctionArgs } from 'react-router' import { apiq, diff --git a/app/forms/vpc-create.tsx b/app/forms/vpc-create.tsx index 43f8fa15a..eda29adf6 100644 --- a/app/forms/vpc-create.tsx +++ b/app/forms/vpc-create.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useForm } from 'react-hook-form' -import { useNavigate } from 'react-router-dom' +import { useNavigate } from 'react-router' import { useApiMutation, useApiQueryClient, type VpcCreate } from '@oxide/api' diff --git a/app/forms/vpc-edit.tsx b/app/forms/vpc-edit.tsx index 473eedc64..248feec0b 100644 --- a/app/forms/vpc-edit.tsx +++ b/app/forms/vpc-edit.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useForm } from 'react-hook-form' -import { useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { useNavigate, type LoaderFunctionArgs } from 'react-router' import { apiq, queryClient, useApiMutation, usePrefetchedQuery } from '@oxide/api' diff --git a/app/forms/vpc-router-create.tsx b/app/forms/vpc-router-create.tsx index 743685312..ca14deb8f 100644 --- a/app/forms/vpc-router-create.tsx +++ b/app/forms/vpc-router-create.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useForm } from 'react-hook-form' -import { useNavigate } from 'react-router-dom' +import { useNavigate } from 'react-router' import { useApiMutation, useApiQueryClient, type VpcRouterCreate } from '@oxide/api' diff --git a/app/forms/vpc-router-edit.tsx b/app/forms/vpc-router-edit.tsx index fb808b590..3d96605e0 100644 --- a/app/forms/vpc-router-edit.tsx +++ b/app/forms/vpc-router-edit.tsx @@ -6,11 +6,7 @@ * Copyright Oxide Computer Company */ import { useForm } from 'react-hook-form' -import { - useNavigate, - type LoaderFunctionArgs, - type NavigateFunction, -} from 'react-router-dom' +import { useNavigate, type LoaderFunctionArgs, type NavigateFunction } from 'react-router' import { apiq, diff --git a/app/forms/vpc-router-route-create.tsx b/app/forms/vpc-router-route-create.tsx index 3f89dc8f7..99c08bb75 100644 --- a/app/forms/vpc-router-route-create.tsx +++ b/app/forms/vpc-router-route-create.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useForm } from 'react-hook-form' -import { useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { useNavigate, type LoaderFunctionArgs } from 'react-router' import { apiQueryClient, useApiMutation, useApiQueryClient } from '@oxide/api' diff --git a/app/forms/vpc-router-route-edit.tsx b/app/forms/vpc-router-route-edit.tsx index 78a94f066..e28211d3f 100644 --- a/app/forms/vpc-router-route-edit.tsx +++ b/app/forms/vpc-router-route-edit.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useForm } from 'react-hook-form' -import { useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { useNavigate, type LoaderFunctionArgs } from 'react-router' import * as R from 'remeda' import { diff --git a/app/hooks/use-crumbs.ts b/app/hooks/use-crumbs.ts index 519a61456..c8ecd6bc1 100644 --- a/app/hooks/use-crumbs.ts +++ b/app/hooks/use-crumbs.ts @@ -5,7 +5,7 @@ * * Copyright Oxide Computer Company */ -import { useMatches, type Params, type UIMatch } from 'react-router-dom' +import { useMatches, type Params, type UIMatch } from 'react-router' import { invariant } from '~/util/invariant' diff --git a/app/hooks/use-is-active-path.ts b/app/hooks/use-is-active-path.ts index 6a9401063..712b8493e 100644 --- a/app/hooks/use-is-active-path.ts +++ b/app/hooks/use-is-active-path.ts @@ -5,7 +5,7 @@ * * Copyright Oxide Computer Company */ -import { useLocation, useResolvedPath } from 'react-router-dom' +import { useLocation, useResolvedPath } from 'react-router' interface ActivePathOptions { to: string @@ -16,7 +16,7 @@ interface ActivePathOptions { * * This implementation is based on logic from React Router's NavLink component. * - * @see https://github.com/remix-run/react-router/blob/67f16e73603765158c63a27afb70d3a4b3e823d3/packages/react-router-dom/index.tsx#L448-L467 + * @see https://github.com/remix-run/react-router/blob/67f16e73603765158c63a27afb70d3a4b3e823d3/packages/react-router/index.tsx#L448-L467 * * @param to The path to check * @param options.end Ensure this path isn't matched as "active" when its descendant paths are matched. diff --git a/app/hooks/use-params.ts b/app/hooks/use-params.ts index e9bea342c..a218615e5 100644 --- a/app/hooks/use-params.ts +++ b/app/hooks/use-params.ts @@ -7,7 +7,7 @@ */ import { hashKey } from '@tanstack/react-query' import { useMemo } from 'react' -import { useParams, type Params } from 'react-router-dom' +import { useParams, type Params } from 'react-router' import { invariant } from '~/util/invariant' diff --git a/app/hooks/use-quick-actions.tsx b/app/hooks/use-quick-actions.tsx index c249acacf..303c4ec8b 100644 --- a/app/hooks/use-quick-actions.tsx +++ b/app/hooks/use-quick-actions.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useEffect, useMemo } from 'react' -import { useLocation, useNavigate } from 'react-router-dom' +import { useLocation, useNavigate } from 'react-router' import { create } from 'zustand' import { useCurrentUser } from '~/layouts/AuthenticatedLayout' diff --git a/app/hooks/use-scroll-restoration.ts b/app/hooks/use-scroll-restoration.ts index 8dbd8a584..66ede8645 100644 --- a/app/hooks/use-scroll-restoration.ts +++ b/app/hooks/use-scroll-restoration.ts @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useEffect } from 'react' -import { useLocation, useNavigation } from 'react-router-dom' +import { useLocation, useNavigation } from 'react-router' function getScrollPosition(key: string) { const pos = window.sessionStorage.getItem(key) diff --git a/app/layouts/AuthLayout.tsx b/app/layouts/AuthLayout.tsx index 0ea87d43d..7a4f73b13 100644 --- a/app/layouts/AuthLayout.tsx +++ b/app/layouts/AuthLayout.tsx @@ -5,7 +5,7 @@ * * Copyright Oxide Computer Company */ -import { Outlet } from 'react-router-dom' +import { Outlet } from 'react-router' import { OxideLogo } from '~/components/OxideLogo' diff --git a/app/layouts/AuthenticatedLayout.tsx b/app/layouts/AuthenticatedLayout.tsx index b4cbc1668..aec1399da 100644 --- a/app/layouts/AuthenticatedLayout.tsx +++ b/app/layouts/AuthenticatedLayout.tsx @@ -5,7 +5,7 @@ * * Copyright Oxide Computer Company */ -import { Outlet } from 'react-router-dom' +import { Outlet } from 'react-router' import { apiQueryClient, useApiQueryErrorsAllowed, usePrefetchedApiQuery } from '@oxide/api' diff --git a/app/layouts/LoginLayout.tsx b/app/layouts/LoginLayout.tsx index 0d30e8625..a530dfcac 100644 --- a/app/layouts/LoginLayout.tsx +++ b/app/layouts/LoginLayout.tsx @@ -5,7 +5,7 @@ * * Copyright Oxide Computer Company */ -import { Outlet } from 'react-router-dom' +import { Outlet } from 'react-router' import heroRackImg from '~/assets/oxide-hero-rack.webp' import { OxideLogo } from '~/components/OxideLogo' diff --git a/app/layouts/ProjectLayout.tsx b/app/layouts/ProjectLayout.tsx index 979ee2854..4e365a861 100644 --- a/app/layouts/ProjectLayout.tsx +++ b/app/layouts/ProjectLayout.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useMemo, type ReactElement } from 'react' -import { useLocation, useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { useLocation, useNavigate, type LoaderFunctionArgs } from 'react-router' import { apiq, queryClient, usePrefetchedQuery } from '@oxide/api' import { diff --git a/app/layouts/RootLayout.tsx b/app/layouts/RootLayout.tsx index a7029149b..d71348e0f 100644 --- a/app/layouts/RootLayout.tsx +++ b/app/layouts/RootLayout.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useEffect, useRef } from 'react' -import { Outlet, useNavigation } from 'react-router-dom' +import { Outlet, useNavigation } from 'react-router' import { MswBanner } from '~/components/MswBanner' import { ToastStack } from '~/components/ToastStack' diff --git a/app/layouts/SettingsLayout.tsx b/app/layouts/SettingsLayout.tsx index 9b860c9bc..d860ca26b 100644 --- a/app/layouts/SettingsLayout.tsx +++ b/app/layouts/SettingsLayout.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useMemo } from 'react' -import { useLocation, useNavigate } from 'react-router-dom' +import { useLocation, useNavigate } from 'react-router' import { Folder16Icon, Key16Icon, Profile16Icon } from '@oxide/design-system/icons/react' diff --git a/app/layouts/SiloLayout.tsx b/app/layouts/SiloLayout.tsx index 9f9f3b550..0a89115ea 100644 --- a/app/layouts/SiloLayout.tsx +++ b/app/layouts/SiloLayout.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useMemo } from 'react' -import { useLocation, useNavigate } from 'react-router-dom' +import { useLocation, useNavigate } from 'react-router' import { Access16Icon, diff --git a/app/layouts/SystemLayout.tsx b/app/layouts/SystemLayout.tsx index e58cb5cab..65f61164f 100644 --- a/app/layouts/SystemLayout.tsx +++ b/app/layouts/SystemLayout.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useMemo } from 'react' -import { useLocation, useNavigate } from 'react-router-dom' +import { useLocation, useNavigate } from 'react-router' import { apiQueryClient } from '@oxide/api' import { diff --git a/app/layouts/helpers.tsx b/app/layouts/helpers.tsx index d4769685d..ae08a2e69 100644 --- a/app/layouts/helpers.tsx +++ b/app/layouts/helpers.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useRef } from 'react' -import { Outlet } from 'react-router-dom' +import { Outlet } from 'react-router' import { PageActionsTarget } from '~/components/PageActions' import { Pagination } from '~/components/Pagination' diff --git a/app/main.tsx b/app/main.tsx index 2a822ca65..1db612059 100644 --- a/app/main.tsx +++ b/app/main.tsx @@ -9,7 +9,8 @@ import { QueryClientProvider } from '@tanstack/react-query' // import { ReactQueryDevtools } from '@tanstack/react-query-devtools' import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' -import { createBrowserRouter, RouterProvider } from 'react-router-dom' +import { createBrowserRouter } from 'react-router' +import { RouterProvider } from 'react-router/dom' import { queryClient } from '@oxide/api' @@ -40,16 +41,7 @@ function render() { // matching. I asked about this on Discord and they said it's intentional. // This means RR is best thought of as an external store that runs // independently of the React render lifecycle. - const router = createBrowserRouter(routes, { - // https://reactrouter.com/en/6.24.0/upgrading/future - future: { - v7_fetcherPersist: true, - v7_normalizeFormMethod: true, - v7_partialHydration: true, - v7_relativeSplatPath: true, - v7_skipActionErrorRevalidation: true, - }, - }) + const router = createBrowserRouter(routes) root.render( @@ -58,13 +50,7 @@ function render() { - + {/* */} diff --git a/app/pages/DeviceAuthVerifyPage.tsx b/app/pages/DeviceAuthVerifyPage.tsx index 7ed82b97e..6638deb2f 100644 --- a/app/pages/DeviceAuthVerifyPage.tsx +++ b/app/pages/DeviceAuthVerifyPage.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useState } from 'react' -import { useNavigate } from 'react-router-dom' +import { useNavigate } from 'react-router' import { useApiMutation } from '@oxide/api' import { Warning12Icon } from '@oxide/design-system/icons/react' diff --git a/app/pages/LoginPage.tsx b/app/pages/LoginPage.tsx index 535e24590..3c0859137 100644 --- a/app/pages/LoginPage.tsx +++ b/app/pages/LoginPage.tsx @@ -7,7 +7,7 @@ */ import { useEffect } from 'react' import { useForm } from 'react-hook-form' -import { useNavigate, useSearchParams } from 'react-router-dom' +import { useNavigate, useSearchParams } from 'react-router' import { useApiMutation, type UsernamePasswordCredentials } from '@oxide/api' diff --git a/app/pages/LoginPageSaml.tsx b/app/pages/LoginPageSaml.tsx index d3c0a3bb3..622878846 100644 --- a/app/pages/LoginPageSaml.tsx +++ b/app/pages/LoginPageSaml.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import cn from 'classnames' -import { useSearchParams } from 'react-router-dom' +import { useSearchParams } from 'react-router' import { useIdpSelector } from '~/hooks/use-params' import { buttonStyle } from '~/ui/lib/Button' diff --git a/app/pages/ProjectsPage.tsx b/app/pages/ProjectsPage.tsx index 3357a1574..9359e471f 100644 --- a/app/pages/ProjectsPage.tsx +++ b/app/pages/ProjectsPage.tsx @@ -7,7 +7,7 @@ */ import { createColumnHelper } from '@tanstack/react-table' import { useCallback, useMemo } from 'react' -import { Outlet, useNavigate } from 'react-router-dom' +import { Outlet, useNavigate } from 'react-router' import { apiq, getListQFn, queryClient, useApiMutation, type Project } from '@oxide/api' import { Folder16Icon, Folder24Icon } from '@oxide/design-system/icons/react' diff --git a/app/pages/lookups.ts b/app/pages/lookups.ts index 9fa98cd2e..dc042a586 100644 --- a/app/pages/lookups.ts +++ b/app/pages/lookups.ts @@ -5,7 +5,7 @@ * * Copyright Oxide Computer Company */ -import { redirect, type LoaderFunctionArgs } from 'react-router-dom' +import { redirect, type LoaderFunctionArgs } from 'react-router' import { apiq, queryClient } from '@oxide/api' diff --git a/app/pages/project/access/ProjectAccessPage.tsx b/app/pages/project/access/ProjectAccessPage.tsx index e68d5497b..0468d0ebf 100644 --- a/app/pages/project/access/ProjectAccessPage.tsx +++ b/app/pages/project/access/ProjectAccessPage.tsx @@ -8,7 +8,7 @@ import { createColumnHelper, getCoreRowModel, useReactTable } from '@tanstack/react-table' import { useMemo, useState } from 'react' -import type { LoaderFunctionArgs } from 'react-router-dom' +import type { LoaderFunctionArgs } from 'react-router' import * as R from 'remeda' import { diff --git a/app/pages/project/disks/DisksPage.tsx b/app/pages/project/disks/DisksPage.tsx index c1e480e7b..7b51b3611 100644 --- a/app/pages/project/disks/DisksPage.tsx +++ b/app/pages/project/disks/DisksPage.tsx @@ -7,7 +7,7 @@ */ import { createColumnHelper } from '@tanstack/react-table' import { useCallback } from 'react' -import { Outlet, type LoaderFunctionArgs } from 'react-router-dom' +import { Outlet, type LoaderFunctionArgs } from 'react-router' import { apiq, diff --git a/app/pages/project/floating-ips/FloatingIpsPage.tsx b/app/pages/project/floating-ips/FloatingIpsPage.tsx index 39053df5e..02c14ff2e 100644 --- a/app/pages/project/floating-ips/FloatingIpsPage.tsx +++ b/app/pages/project/floating-ips/FloatingIpsPage.tsx @@ -8,7 +8,7 @@ import { createColumnHelper } from '@tanstack/react-table' import { useCallback, useState } from 'react' import { useForm } from 'react-hook-form' -import { Outlet, useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { Outlet, useNavigate, type LoaderFunctionArgs } from 'react-router' import { apiq, diff --git a/app/pages/project/images/ImagesPage.tsx b/app/pages/project/images/ImagesPage.tsx index 0f461f328..fb450c96e 100644 --- a/app/pages/project/images/ImagesPage.tsx +++ b/app/pages/project/images/ImagesPage.tsx @@ -7,7 +7,7 @@ */ import { createColumnHelper } from '@tanstack/react-table' import { useCallback, useMemo, useState } from 'react' -import { Outlet, type LoaderFunctionArgs } from 'react-router-dom' +import { Outlet, type LoaderFunctionArgs } from 'react-router' import { getListQFn, queryClient, useApiMutation, type Image } from '@oxide/api' import { Images16Icon, Images24Icon } from '@oxide/design-system/icons/react' diff --git a/app/pages/project/instances/InstancesPage.tsx b/app/pages/project/instances/InstancesPage.tsx index ddab3938e..c527b507a 100644 --- a/app/pages/project/instances/InstancesPage.tsx +++ b/app/pages/project/instances/InstancesPage.tsx @@ -9,7 +9,7 @@ import { type UseQueryOptions } from '@tanstack/react-query' import { createColumnHelper } from '@tanstack/react-table' import { filesize } from 'filesize' import { useMemo, useRef, useState } from 'react' -import { useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { useNavigate, type LoaderFunctionArgs } from 'react-router' import { apiQueryClient, diff --git a/app/pages/project/instances/actions.tsx b/app/pages/project/instances/actions.tsx index 488ea5251..748a46eb3 100644 --- a/app/pages/project/instances/actions.tsx +++ b/app/pages/project/instances/actions.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useCallback } from 'react' -import { useNavigate } from 'react-router-dom' +import { useNavigate } from 'react-router' import { instanceCan, useApiMutation, type Instance } from '@oxide/api' diff --git a/app/pages/project/instances/instance/InstancePage.tsx b/app/pages/project/instances/instance/InstancePage.tsx index b73ae7e79..22acc7c97 100644 --- a/app/pages/project/instances/instance/InstancePage.tsx +++ b/app/pages/project/instances/instance/InstancePage.tsx @@ -8,7 +8,7 @@ import { filesize } from 'filesize' import { useId, useMemo, useState } from 'react' import { useForm } from 'react-hook-form' -import { Link, useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { Link, useNavigate, type LoaderFunctionArgs } from 'react-router' import { apiQueryClient, diff --git a/app/pages/project/instances/instance/SerialConsolePage.tsx b/app/pages/project/instances/instance/SerialConsolePage.tsx index 08940ef6a..323f87d78 100644 --- a/app/pages/project/instances/instance/SerialConsolePage.tsx +++ b/app/pages/project/instances/instance/SerialConsolePage.tsx @@ -7,7 +7,7 @@ */ import cn from 'classnames' import { lazy, Suspense, useEffect, useRef, useState } from 'react' -import { Link, type LoaderFunctionArgs } from 'react-router-dom' +import { Link, type LoaderFunctionArgs } from 'react-router' import { api, diff --git a/app/pages/project/instances/instance/tabs/ConnectTab.tsx b/app/pages/project/instances/instance/tabs/ConnectTab.tsx index b57d92418..aca98be65 100644 --- a/app/pages/project/instances/instance/tabs/ConnectTab.tsx +++ b/app/pages/project/instances/instance/tabs/ConnectTab.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ -import { Link, type LoaderFunctionArgs } from 'react-router-dom' +import { Link, type LoaderFunctionArgs } from 'react-router' import { apiQueryClient, usePrefetchedApiQuery } from '~/api' import { EquivalentCliCommand } from '~/components/EquivalentCliCommand' diff --git a/app/pages/project/instances/instance/tabs/MetricsTab.tsx b/app/pages/project/instances/instance/tabs/MetricsTab.tsx index 35120a1d3..0e2304fda 100644 --- a/app/pages/project/instances/instance/tabs/MetricsTab.tsx +++ b/app/pages/project/instances/instance/tabs/MetricsTab.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import React, { Suspense, useMemo, useState } from 'react' -import type { LoaderFunctionArgs } from 'react-router-dom' +import type { LoaderFunctionArgs } from 'react-router' import { apiQueryClient, diff --git a/app/pages/project/instances/instance/tabs/NetworkingTab.tsx b/app/pages/project/instances/instance/tabs/NetworkingTab.tsx index c6fc3796e..43e99b472 100644 --- a/app/pages/project/instances/instance/tabs/NetworkingTab.tsx +++ b/app/pages/project/instances/instance/tabs/NetworkingTab.tsx @@ -7,7 +7,7 @@ */ import { createColumnHelper, getCoreRowModel, useReactTable } from '@tanstack/react-table' import { useCallback, useMemo, useState } from 'react' -import { type LoaderFunctionArgs } from 'react-router-dom' +import { type LoaderFunctionArgs } from 'react-router' import { apiQueryClient, diff --git a/app/pages/project/instances/instance/tabs/StorageTab.tsx b/app/pages/project/instances/instance/tabs/StorageTab.tsx index 3b6ccee25..b53c16708 100644 --- a/app/pages/project/instances/instance/tabs/StorageTab.tsx +++ b/app/pages/project/instances/instance/tabs/StorageTab.tsx @@ -7,7 +7,7 @@ */ import { createColumnHelper, getCoreRowModel, useReactTable } from '@tanstack/react-table' import { useCallback, useMemo, useState } from 'react' -import type { LoaderFunctionArgs } from 'react-router-dom' +import type { LoaderFunctionArgs } from 'react-router' import * as R from 'remeda' import { diff --git a/app/pages/project/snapshots/SnapshotsPage.tsx b/app/pages/project/snapshots/SnapshotsPage.tsx index 6fec0a23f..f72f21ff3 100644 --- a/app/pages/project/snapshots/SnapshotsPage.tsx +++ b/app/pages/project/snapshots/SnapshotsPage.tsx @@ -7,7 +7,7 @@ */ import { createColumnHelper } from '@tanstack/react-table' import { useCallback } from 'react' -import { Outlet, useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { Outlet, useNavigate, type LoaderFunctionArgs } from 'react-router' import { apiQueryClient, diff --git a/app/pages/project/vpcs/RouterPage.tsx b/app/pages/project/vpcs/RouterPage.tsx index 86fa6c42d..e07708f34 100644 --- a/app/pages/project/vpcs/RouterPage.tsx +++ b/app/pages/project/vpcs/RouterPage.tsx @@ -8,7 +8,7 @@ import { createColumnHelper } from '@tanstack/react-table' import { useCallback, useMemo } from 'react' -import { Outlet, useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { Outlet, useNavigate, type LoaderFunctionArgs } from 'react-router' import { Networking16Icon, Networking24Icon } from '@oxide/design-system/icons/react' diff --git a/app/pages/project/vpcs/VpcPage/VpcPage.tsx b/app/pages/project/vpcs/VpcPage/VpcPage.tsx index 82901be60..b2d4c29e7 100644 --- a/app/pages/project/vpcs/VpcPage/VpcPage.tsx +++ b/app/pages/project/vpcs/VpcPage/VpcPage.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { useMemo } from 'react' -import { useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { useNavigate, type LoaderFunctionArgs } from 'react-router' import { apiq, queryClient, useApiMutation, usePrefetchedQuery } from '@oxide/api' import { Networking24Icon } from '@oxide/design-system/icons/react' diff --git a/app/pages/project/vpcs/VpcPage/tabs/VpcFirewallRulesTab.tsx b/app/pages/project/vpcs/VpcPage/tabs/VpcFirewallRulesTab.tsx index b4cbe0d2e..7528344d4 100644 --- a/app/pages/project/vpcs/VpcPage/tabs/VpcFirewallRulesTab.tsx +++ b/app/pages/project/vpcs/VpcPage/tabs/VpcFirewallRulesTab.tsx @@ -7,7 +7,7 @@ */ import { createColumnHelper, getCoreRowModel, useReactTable } from '@tanstack/react-table' import { useMemo } from 'react' -import { Outlet, useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { Outlet, useNavigate, type LoaderFunctionArgs } from 'react-router' import * as R from 'remeda' import { diff --git a/app/pages/project/vpcs/VpcPage/tabs/VpcGatewaysTab.tsx b/app/pages/project/vpcs/VpcPage/tabs/VpcGatewaysTab.tsx index 0fd50179d..c99ffa9c0 100644 --- a/app/pages/project/vpcs/VpcPage/tabs/VpcGatewaysTab.tsx +++ b/app/pages/project/vpcs/VpcPage/tabs/VpcGatewaysTab.tsx @@ -9,7 +9,7 @@ import { useQuery } from '@tanstack/react-query' import { createColumnHelper } from '@tanstack/react-table' import { useMemo } from 'react' -import { Outlet, type LoaderFunctionArgs } from 'react-router-dom' +import { Outlet, type LoaderFunctionArgs } from 'react-router' import { apiq, getListQFn, queryClient, type InternetGateway } from '~/api' import { getVpcSelector, useVpcSelector } from '~/hooks/use-params' diff --git a/app/pages/project/vpcs/VpcPage/tabs/VpcRoutersTab.tsx b/app/pages/project/vpcs/VpcPage/tabs/VpcRoutersTab.tsx index a7486521e..62288118a 100644 --- a/app/pages/project/vpcs/VpcPage/tabs/VpcRoutersTab.tsx +++ b/app/pages/project/vpcs/VpcPage/tabs/VpcRoutersTab.tsx @@ -7,7 +7,7 @@ */ import { createColumnHelper } from '@tanstack/react-table' import { useCallback, useMemo } from 'react' -import { Outlet, useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { Outlet, useNavigate, type LoaderFunctionArgs } from 'react-router' import { apiQueryClient, diff --git a/app/pages/project/vpcs/VpcPage/tabs/VpcSubnetsTab.tsx b/app/pages/project/vpcs/VpcPage/tabs/VpcSubnetsTab.tsx index f3111bb60..b5ea96599 100644 --- a/app/pages/project/vpcs/VpcPage/tabs/VpcSubnetsTab.tsx +++ b/app/pages/project/vpcs/VpcPage/tabs/VpcSubnetsTab.tsx @@ -7,7 +7,7 @@ */ import { createColumnHelper } from '@tanstack/react-table' import { useCallback, useMemo } from 'react' -import { Outlet, useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { Outlet, useNavigate, type LoaderFunctionArgs } from 'react-router' import { getListQFn, diff --git a/app/pages/project/vpcs/VpcsPage.tsx b/app/pages/project/vpcs/VpcsPage.tsx index 6f23956f6..72406192f 100644 --- a/app/pages/project/vpcs/VpcsPage.tsx +++ b/app/pages/project/vpcs/VpcsPage.tsx @@ -8,7 +8,7 @@ import { useQuery } from '@tanstack/react-query' import { createColumnHelper } from '@tanstack/react-table' import { useCallback, useMemo } from 'react' -import { Outlet, useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { Outlet, useNavigate, type LoaderFunctionArgs } from 'react-router' import { apiq, getListQFn, queryClient, useApiMutation, type Vpc } from '@oxide/api' import { Networking16Icon, Networking24Icon } from '@oxide/design-system/icons/react' diff --git a/app/pages/project/vpcs/internet-gateway-edit.tsx b/app/pages/project/vpcs/internet-gateway-edit.tsx index 115133f5e..66a193f3e 100644 --- a/app/pages/project/vpcs/internet-gateway-edit.tsx +++ b/app/pages/project/vpcs/internet-gateway-edit.tsx @@ -8,7 +8,7 @@ import { useQuery } from '@tanstack/react-query' import { useForm } from 'react-hook-form' -import { Link, useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { Link, useNavigate, type LoaderFunctionArgs } from 'react-router' import { Gateway16Icon } from '@oxide/design-system/icons/react' diff --git a/app/pages/settings/SSHKeysPage.tsx b/app/pages/settings/SSHKeysPage.tsx index f52b5499c..b3a89545c 100644 --- a/app/pages/settings/SSHKeysPage.tsx +++ b/app/pages/settings/SSHKeysPage.tsx @@ -7,7 +7,7 @@ */ import { createColumnHelper } from '@tanstack/react-table' import { useCallback, useMemo } from 'react' -import { Link, Outlet, useNavigate } from 'react-router-dom' +import { Link, Outlet, useNavigate } from 'react-router' import { getListQFn, diff --git a/app/pages/system/SiloImagesPage.tsx b/app/pages/system/SiloImagesPage.tsx index beb0e7743..977131244 100644 --- a/app/pages/system/SiloImagesPage.tsx +++ b/app/pages/system/SiloImagesPage.tsx @@ -8,7 +8,7 @@ import { createColumnHelper } from '@tanstack/react-table' import { useCallback, useMemo, useState } from 'react' import { useForm, type FieldValues } from 'react-hook-form' -import { Outlet } from 'react-router-dom' +import { Outlet } from 'react-router' import { getListQFn, diff --git a/app/pages/system/inventory/sled/SledInstancesTab.tsx b/app/pages/system/inventory/sled/SledInstancesTab.tsx index 290cc86fe..59c80b724 100644 --- a/app/pages/system/inventory/sled/SledInstancesTab.tsx +++ b/app/pages/system/inventory/sled/SledInstancesTab.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { createColumnHelper } from '@tanstack/react-table' -import type { LoaderFunctionArgs } from 'react-router-dom' +import type { LoaderFunctionArgs } from 'react-router' import * as R from 'remeda' import { getListQFn, queryClient, type SledInstance } from '@oxide/api' diff --git a/app/pages/system/inventory/sled/SledPage.tsx b/app/pages/system/inventory/sled/SledPage.tsx index 80240e4fc..4119b67e3 100644 --- a/app/pages/system/inventory/sled/SledPage.tsx +++ b/app/pages/system/inventory/sled/SledPage.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import { filesize } from 'filesize' -import type { LoaderFunctionArgs } from 'react-router-dom' +import type { LoaderFunctionArgs } from 'react-router' import { apiQueryClient, usePrefetchedApiQuery } from '@oxide/api' import { Servers24Icon } from '@oxide/design-system/icons/react' diff --git a/app/pages/system/networking/IpPoolPage.tsx b/app/pages/system/networking/IpPoolPage.tsx index 2b01977ed..dd05e1855 100644 --- a/app/pages/system/networking/IpPoolPage.tsx +++ b/app/pages/system/networking/IpPoolPage.tsx @@ -9,7 +9,7 @@ import { createColumnHelper } from '@tanstack/react-table' import { useCallback, useMemo, useState } from 'react' import { useForm } from 'react-hook-form' -import { Outlet, useNavigate, type LoaderFunctionArgs } from 'react-router-dom' +import { Outlet, useNavigate, type LoaderFunctionArgs } from 'react-router' import { apiq, diff --git a/app/pages/system/networking/IpPoolsPage.tsx b/app/pages/system/networking/IpPoolsPage.tsx index a90c3bd26..f112eb3e4 100644 --- a/app/pages/system/networking/IpPoolsPage.tsx +++ b/app/pages/system/networking/IpPoolsPage.tsx @@ -8,7 +8,7 @@ import { createColumnHelper } from '@tanstack/react-table' import { useCallback, useMemo } from 'react' -import { Outlet, useNavigate } from 'react-router-dom' +import { Outlet, useNavigate } from 'react-router' import { apiQueryClient, diff --git a/app/pages/system/silos/SiloIdpsTab.tsx b/app/pages/system/silos/SiloIdpsTab.tsx index 2bd2e3bdc..d457c66d7 100644 --- a/app/pages/system/silos/SiloIdpsTab.tsx +++ b/app/pages/system/silos/SiloIdpsTab.tsx @@ -7,7 +7,7 @@ */ import { createColumnHelper } from '@tanstack/react-table' import { useMemo } from 'react' -import { Outlet } from 'react-router-dom' +import { Outlet } from 'react-router' import { Cloud24Icon } from '@oxide/design-system/icons/react' diff --git a/app/pages/system/silos/SiloPage.tsx b/app/pages/system/silos/SiloPage.tsx index b075dc3ef..2010a068e 100644 --- a/app/pages/system/silos/SiloPage.tsx +++ b/app/pages/system/silos/SiloPage.tsx @@ -5,7 +5,7 @@ * * Copyright Oxide Computer Company */ -import { type LoaderFunctionArgs } from 'react-router-dom' +import { type LoaderFunctionArgs } from 'react-router' import { apiQueryClient, queryClient, usePrefetchedApiQuery } from '@oxide/api' import { Cloud16Icon, Cloud24Icon, NextArrow12Icon } from '@oxide/design-system/icons/react' diff --git a/app/pages/system/silos/SilosPage.tsx b/app/pages/system/silos/SilosPage.tsx index 4cd655b26..62f2dbaa0 100644 --- a/app/pages/system/silos/SilosPage.tsx +++ b/app/pages/system/silos/SilosPage.tsx @@ -7,7 +7,7 @@ */ import { createColumnHelper } from '@tanstack/react-table' import { useCallback, useMemo } from 'react' -import { Outlet, useNavigate } from 'react-router-dom' +import { Outlet, useNavigate } from 'react-router' import { getListQFn, diff --git a/app/routes.tsx b/app/routes.tsx index 95915564b..780e603b5 100644 --- a/app/routes.tsx +++ b/app/routes.tsx @@ -5,7 +5,7 @@ * * Copyright Oxide Computer Company */ -import { createRoutesFromElements, Navigate, Route } from 'react-router-dom' +import { createRoutesFromElements, Navigate, Route } from 'react-router' import { RouterDataErrorBoundary } from './components/ErrorBoundary' import { NotFound } from './components/ErrorPage' diff --git a/app/table/cells/LinkCell.tsx b/app/table/cells/LinkCell.tsx index 5e2b74227..f28d8f751 100644 --- a/app/table/cells/LinkCell.tsx +++ b/app/table/cells/LinkCell.tsx @@ -6,7 +6,7 @@ * Copyright Oxide Computer Company */ import type { CellContext } from '@tanstack/react-table' -import { Link } from 'react-router-dom' +import { Link } from 'react-router' import { classed } from '~/util/classed' diff --git a/app/ui/lib/CreateButton.tsx b/app/ui/lib/CreateButton.tsx index 7f6e9431c..e8b9dd9b9 100644 --- a/app/ui/lib/CreateButton.tsx +++ b/app/ui/lib/CreateButton.tsx @@ -7,7 +7,7 @@ */ import cn from 'classnames' -import { Link, type LinkProps } from 'react-router-dom' +import { Link, type LinkProps } from 'react-router' import { AddRoundel12Icon } from '@oxide/design-system/icons/react' diff --git a/app/ui/lib/DropdownMenu.tsx b/app/ui/lib/DropdownMenu.tsx index d37d46afd..a6cf724d3 100644 --- a/app/ui/lib/DropdownMenu.tsx +++ b/app/ui/lib/DropdownMenu.tsx @@ -15,7 +15,7 @@ import { } from '@headlessui/react' import cn from 'classnames' import { forwardRef, type ForwardedRef, type ReactNode } from 'react' -import { Link } from 'react-router-dom' +import { Link } from 'react-router' export const Root = Menu diff --git a/app/ui/lib/EmptyMessage.tsx b/app/ui/lib/EmptyMessage.tsx index dcc7f6489..5673cc799 100644 --- a/app/ui/lib/EmptyMessage.tsx +++ b/app/ui/lib/EmptyMessage.tsx @@ -7,7 +7,7 @@ */ import cn from 'classnames' import type { ReactElement, ReactNode } from 'react' -import { Link } from 'react-router-dom' +import { Link } from 'react-router' import { classed } from '~/util/classed' diff --git a/app/ui/lib/Message.tsx b/app/ui/lib/Message.tsx index 493990a7a..d28641410 100644 --- a/app/ui/lib/Message.tsx +++ b/app/ui/lib/Message.tsx @@ -7,7 +7,7 @@ */ import cn from 'classnames' import type { ReactElement, ReactNode } from 'react' -import { Link, type To } from 'react-router-dom' +import { Link, type To } from 'react-router' import { Error12Icon, diff --git a/app/ui/lib/Toast.tsx b/app/ui/lib/Toast.tsx index 05d3cd8db..62ea00a43 100644 --- a/app/ui/lib/Toast.tsx +++ b/app/ui/lib/Toast.tsx @@ -8,7 +8,7 @@ import { announce } from '@react-aria/live-announcer' import cn from 'classnames' import { useEffect, type ReactElement, type ReactNode } from 'react' -import { Link, type To } from 'react-router-dom' +import { Link, type To } from 'react-router' import { Close12Icon, diff --git a/app/util/path-builder.spec.ts b/app/util/path-builder.spec.ts index 4464c4bd7..e81423bb4 100644 --- a/app/util/path-builder.spec.ts +++ b/app/util/path-builder.spec.ts @@ -5,7 +5,7 @@ * * Copyright Oxide Computer Company */ -import { matchRoutes } from 'react-router-dom' +import { matchRoutes } from 'react-router' import * as R from 'remeda' import { expect, test } from 'vitest' diff --git a/package-lock.json b/package-lock.json index 554c40f0f..f18423a09 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "react-is": "^18.3.1", "react-merge-refs": "^2.1.1", "react-remove-scroll": "2.5.5", - "react-router-dom": "^6.26.2", + "react-router": "^7.1.1", "react-stately": "^3.32.2", "recharts": "^2.12.7", "remeda": "^2.14.0", @@ -101,10 +101,10 @@ "tsx": "^4.19.1", "type-fest": "^4.26.1", "typescript": "~5.7.0", - "vite": "^6.0.2", + "vite": "^6.0.3", "vite-plugin-html": "^3.2.2", "vite-tsconfig-paths": "^5.1.3", - "vitest": "^3.0.0-beta.1" + "vitest": "^3.0.0-beta.2" }, "engines": { "node": ">=18" @@ -859,6 +859,23 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { "version": "0.23.1", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", @@ -4269,11 +4286,28 @@ } } }, + "node_modules/@remix-run/react/node_modules/react-router": { + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.27.0.tgz", + "integrity": "sha512-YA+HGZXz4jaAkVoYBE98VQl+nVzI+cVI2Oj/06F5ZM+0u3TgedN9Y9kmMRo2mnkSK2nCpNQn0DVob4HCsY/WLw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@remix-run/router": "1.20.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, "node_modules/@remix-run/router": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.20.0.tgz", "integrity": "sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg==", "license": "MIT", + "peer": true, "engines": { "node": ">=14.0.0" } @@ -5684,14 +5718,14 @@ } }, "node_modules/@vitest/expect": { - "version": "3.0.0-beta.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.0-beta.1.tgz", - "integrity": "sha512-L0pMLAFwU6nxmCzA/cHH47qahml2Tfd1nBhqElzcjHHLiwdpw6q1n01/1q/Oaq1zVjMbw5DGPFnP9wtYwc/F7w==", + "version": "3.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.0-beta.3.tgz", + "integrity": "sha512-KPxQ9FkPT5SBIBonCmDZe2XY6RKmSTl/ghzjAHip08GZXaZs/tp/iyE5ypFSTCoP3kdTc9TPdXpibHjdDmLMvw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.0.0-beta.1", - "@vitest/utils": "3.0.0-beta.1", + "@vitest/spy": "3.0.0-beta.3", + "@vitest/utils": "3.0.0-beta.3", "chai": "^5.1.2", "tinyrainbow": "^1.2.0" }, @@ -5699,10 +5733,37 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/mocker": { + "version": "3.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.0-beta.3.tgz", + "integrity": "sha512-biBESFwOzhB+3DZq5pnkGkiA0Xt7hvSU1m2jsY8pK/h6wS8kRYcFvN1o/38wkGZ6Ss+wjvTixqfCwrlqFz9Fnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.0.0-beta.3", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, "node_modules/@vitest/pretty-format": { - "version": "3.0.0-beta.1", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.0-beta.1.tgz", - "integrity": "sha512-uDPi6zXNyUBgXDUD+E3E8MzUGxWXffDENbBbek/Jn9pDQb6R5TVAq/pbs+rZ18iNvXAelzhyRjsNX4cbTreENA==", + "version": "3.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.0-beta.3.tgz", + "integrity": "sha512-d3+IaliPJLndUB/eQ4XP4OEHWhMDUJGhGc8XyLfi803Ad62nkTLC1bwFz80bNghEfKi+sz/oSkvQmW/3lQeCdA==", "dev": true, "license": "MIT", "dependencies": { @@ -5713,13 +5774,13 @@ } }, "node_modules/@vitest/runner": { - "version": "3.0.0-beta.1", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.0-beta.1.tgz", - "integrity": "sha512-gvKd+ETpA5UfGiWCFXnz9NL0FCcESnm5ou2SKjG1530MXNtaqUXwoxokUpIsAFv0I+GfxzzqpEOZX7eRbtn0DQ==", + "version": "3.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.0-beta.3.tgz", + "integrity": "sha512-9ibO4DPJAyyxQfGDOCpMY36M4XFOX4G4VNmDr25dzrEmJ8sMt8/8E6kdb5lV/m0holHJFgvpGZr8zhXkWQ4+cg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.0.0-beta.1", + "@vitest/utils": "3.0.0-beta.3", "pathe": "^1.1.2" }, "funding": { @@ -5734,14 +5795,14 @@ "license": "MIT" }, "node_modules/@vitest/snapshot": { - "version": "3.0.0-beta.1", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.0-beta.1.tgz", - "integrity": "sha512-ejTp3wZrEdj1kBGfrrY3stJNy25b4+qJvIkVKfzo7xgorsC+qI3r36RmqMQoAxUKwniNN6eDHMG01txUZsP71Q==", + "version": "3.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.0-beta.3.tgz", + "integrity": "sha512-jsWdfQWRcbI1WIpxi2X6jUAAjJY898iK4P/ZzxgkBPFrPK894HXkCm3xcF/sZHF9nHNa61ZIgfgddnH0blkiFQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.0.0-beta.1", - "magic-string": "^0.30.14", + "@vitest/pretty-format": "3.0.0-beta.3", + "magic-string": "^0.30.17", "pathe": "^1.1.2" }, "funding": { @@ -5756,9 +5817,9 @@ "license": "MIT" }, "node_modules/@vitest/spy": { - "version": "3.0.0-beta.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.0-beta.1.tgz", - "integrity": "sha512-QsOYySOzYMTCpCoQvCspUDz4YfmBahokzNlDYCUaLHVFZTtyeOukAwTv56hyUrOTStKvkuWeg4RIbr/PeNJuNw==", + "version": "3.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.0-beta.3.tgz", + "integrity": "sha512-IXvZL//Aq5UVIMFtvw1iYnk1iAjk9lGmQUw/fDqN7qMnb9SHfSRbhgxAph11n9nudgBlLiYPSY0nVfCpH/TQsA==", "dev": true, "license": "MIT", "dependencies": { @@ -5769,13 +5830,13 @@ } }, "node_modules/@vitest/utils": { - "version": "3.0.0-beta.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.0-beta.1.tgz", - "integrity": "sha512-pxoUqW7lk/3/7iRAI3MqFRMfPpzdEKLn2Yz57TgMMUhP2/Cj3Izm3dXQaH45LhqU6uezi71U/fOLhLgTqMZnpA==", + "version": "3.0.0-beta.3", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.0-beta.3.tgz", + "integrity": "sha512-InEoZvpkcUTmg0J08/Phm6MLkQwWpf3RCJoqVuXiHK7OkUYW/EDoT0qfzL4MGo1PWq+UqIlMw93eAkkTf3RMvQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.0.0-beta.1", + "@vitest/pretty-format": "3.0.0-beta.3", "loupe": "^3.1.2", "tinyrainbow": "^1.2.0" }, @@ -7174,9 +7235,9 @@ } }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "license": "MIT", "dependencies": { @@ -7656,9 +7717,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", "dev": true, "license": "MIT" }, @@ -10603,9 +10664,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.14", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.14.tgz", - "integrity": "sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "license": "MIT", "dependencies": { @@ -12593,18 +12654,27 @@ } }, "node_modules/react-router": { - "version": "6.27.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.27.0.tgz", - "integrity": "sha512-YA+HGZXz4jaAkVoYBE98VQl+nVzI+cVI2Oj/06F5ZM+0u3TgedN9Y9kmMRo2mnkSK2nCpNQn0DVob4HCsY/WLw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.1.1.tgz", + "integrity": "sha512-39sXJkftkKWRZ2oJtHhCxmoCrBCULr/HAH4IT5DHlgu/Q0FCPV0S4Lx+abjDTx/74xoZzNYDYbOZWlJjruyuDQ==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.20.0" + "@types/cookie": "^0.6.0", + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0", + "turbo-stream": "2.4.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.0.0" }, "peerDependencies": { - "react": ">=16.8" + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } } }, "node_modules/react-router-dom": { @@ -12612,6 +12682,7 @@ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.27.0.tgz", "integrity": "sha512-+bvtFWMC0DgAFrfKXKG9Fc+BcXWRUO1aJIihbB79xaeq0v5UzfvnM5houGUm1Y461WVRcgAQ+Clh5rdb1eCx4g==", "license": "MIT", + "peer": true, "dependencies": { "@remix-run/router": "1.20.0", "react-router": "6.27.0" @@ -12624,6 +12695,31 @@ "react-dom": ">=16.8" } }, + "node_modules/react-router-dom/node_modules/react-router": { + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.27.0.tgz", + "integrity": "sha512-YA+HGZXz4jaAkVoYBE98VQl+nVzI+cVI2Oj/06F5ZM+0u3TgedN9Y9kmMRo2mnkSK2nCpNQn0DVob4HCsY/WLw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@remix-run/router": "1.20.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router/node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/react-smooth": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.1.tgz", @@ -13285,8 +13381,7 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/set-function-length": { "version": "1.2.2", @@ -14318,8 +14413,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/type-check": { "version": "0.4.0", @@ -14778,13 +14872,13 @@ } }, "node_modules/vite": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.2.tgz", - "integrity": "sha512-XdQ+VsY2tJpBsKGs0wf3U/+azx8BBpYRHFAyKm5VeEZNOJZRB63q7Sc8Iup3k0TrN3KO6QgyzFf+opSbfY1y0g==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.6.tgz", + "integrity": "sha512-NSjmUuckPmDU18bHz7QZ+bTYhRR0iA72cs2QAxCqDpafJ0S6qetco0LB3WW2OxlMHS0JmAv+yZ/R3uPmMyGTjQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.24.0", + "esbuild": "^0.24.2", "postcss": "^8.4.49", "rollup": "^4.23.0" }, @@ -14850,14 +14944,14 @@ } }, "node_modules/vite-node": { - "version": "3.0.0-beta.1", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.0-beta.1.tgz", - "integrity": "sha512-KW8HZ0OVdN1t2Dre/Bgf51n620z6CAe8Fcsl1v9g9nVsYXpWYGx29U2vdk/tq98h9wpMCfJ/uHrYihlNIOdTVA==", + "version": "3.0.0-beta.3", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.0-beta.3.tgz", + "integrity": "sha512-NqZk0TnqpaNwWEdu73IGRJ2PDg9TXiY0dRx6LHV64CY80JP3OcHb+YvbW4Xu6h/E+vU6qPFlwRuKYWG8Tdg4Gw==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.7", + "debug": "^4.4.0", "es-module-lexer": "^1.5.4", "pathe": "^1.1.2", "vite": "^5.0.0 || ^6.0.0" @@ -14939,9 +15033,9 @@ } }, "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ "ppc64" ], @@ -14956,9 +15050,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", "cpu": [ "arm" ], @@ -14973,9 +15067,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", "cpu": [ "arm64" ], @@ -14990,9 +15084,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -15007,9 +15101,9 @@ } }, "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], @@ -15024,9 +15118,9 @@ } }, "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -15041,9 +15135,9 @@ } }, "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", "cpu": [ "arm64" ], @@ -15058,9 +15152,9 @@ } }, "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", "cpu": [ "x64" ], @@ -15075,9 +15169,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", "cpu": [ "arm" ], @@ -15092,9 +15186,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], @@ -15109,9 +15203,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", "cpu": [ "ia32" ], @@ -15126,9 +15220,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -15143,9 +15237,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", "cpu": [ "mips64el" ], @@ -15160,9 +15254,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", "cpu": [ "ppc64" ], @@ -15177,9 +15271,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", "cpu": [ "riscv64" ], @@ -15194,9 +15288,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", "cpu": [ "s390x" ], @@ -15211,9 +15305,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -15228,9 +15322,9 @@ } }, "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", "cpu": [ "x64" ], @@ -15245,9 +15339,9 @@ } }, "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", "cpu": [ "arm64" ], @@ -15262,9 +15356,9 @@ } }, "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", "cpu": [ "x64" ], @@ -15279,9 +15373,9 @@ } }, "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -15296,9 +15390,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -15313,9 +15407,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", "cpu": [ "ia32" ], @@ -15330,9 +15424,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "cpu": [ "x64" ], @@ -15347,9 +15441,9 @@ } }, "node_modules/vite/node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -15360,50 +15454,51 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/vitest": { - "version": "3.0.0-beta.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.0-beta.1.tgz", - "integrity": "sha512-wT+rJC1ilPoq32kNQnHLFxsOiFmUFs9oxh8ASZKzE8zFF0hWu2IpmKCYgOt8Q0kOOznsW31qeBAA9/SEpadqJQ==", + "version": "3.0.0-beta.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.0-beta.3.tgz", + "integrity": "sha512-e9miZwlVaMIAJ4MmCAxSeX4YWMyY4g+KRBjgSz0PL3UluSwHHUOWX/uUZwYmfPS4CvUr69RB1Dn6v61lgC+zCw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "3.0.0-beta.1", - "@vitest/mocker": "3.0.0-beta.1", - "@vitest/pretty-format": "^3.0.0-beta.1", - "@vitest/runner": "3.0.0-beta.1", - "@vitest/snapshot": "3.0.0-beta.1", - "@vitest/spy": "3.0.0-beta.1", - "@vitest/utils": "3.0.0-beta.1", + "@vitest/expect": "3.0.0-beta.3", + "@vitest/mocker": "3.0.0-beta.3", + "@vitest/pretty-format": "^3.0.0-beta.3", + "@vitest/runner": "3.0.0-beta.3", + "@vitest/snapshot": "3.0.0-beta.3", + "@vitest/spy": "3.0.0-beta.3", + "@vitest/utils": "3.0.0-beta.3", "chai": "^5.1.2", - "debug": "^4.3.7", + "debug": "^4.4.0", "expect-type": "^1.1.0", - "magic-string": "^0.30.14", + "magic-string": "^0.30.17", "pathe": "^1.1.2", "std-env": "^3.8.0", "tinybench": "^2.9.0", @@ -15411,7 +15506,7 @@ "tinypool": "^1.0.2", "tinyrainbow": "^1.2.0", "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.0.0-beta.1", + "vite-node": "3.0.0-beta.3", "why-is-node-running": "^2.3.0" }, "bin": { @@ -15426,8 +15521,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.0.0-beta.1", - "@vitest/ui": "3.0.0-beta.1", + "@vitest/browser": "3.0.0-beta.3", + "@vitest/ui": "3.0.0-beta.3", "happy-dom": "*", "jsdom": "*" }, @@ -15452,463 +15547,6 @@ } } }, - "node_modules/vitest/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitest/node_modules/@vitest/mocker": { - "version": "3.0.0-beta.1", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.0-beta.1.tgz", - "integrity": "sha512-8K5v/FauvirOT6b4SiPiZQXRblquTjlOCPRJuG03/SRxqUesItOp4kH7pNR6U9aZudvGqnjxukBJozTqXsZdJA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.0.0-beta.1", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.14" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, "node_modules/vitest/node_modules/pathe": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", @@ -15916,66 +15554,6 @@ "dev": true, "license": "MIT" }, - "node_modules/vitest/node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", diff --git a/package.json b/package.json index 01dc2fce4..d17b5d5cf 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "react-is": "^18.3.1", "react-merge-refs": "^2.1.1", "react-remove-scroll": "2.5.5", - "react-router-dom": "^6.26.2", + "react-router": "^7.1.1", "react-stately": "^3.32.2", "recharts": "^2.12.7", "remeda": "^2.14.0", @@ -123,10 +123,10 @@ "tsx": "^4.19.1", "type-fest": "^4.26.1", "typescript": "~5.7.0", - "vite": "^6.0.2", + "vite": "^6.0.3", "vite-plugin-html": "^3.2.2", "vite-tsconfig-paths": "^5.1.3", - "vitest": "^3.0.0-beta.1" + "vitest": "^3.0.0-beta.2" }, "browserslist": [ "defaults" diff --git a/test/e2e/scroll-restore.e2e.ts b/test/e2e/scroll-restore.e2e.ts index 483c0e9e8..28d922e67 100644 --- a/test/e2e/scroll-restore.e2e.ts +++ b/test/e2e/scroll-restore.e2e.ts @@ -7,7 +7,7 @@ */ import { expect, test } from '@playwright/test' -import { expectScrollTop, scrollTo } from './utils' +import { expectScrollTop, scrollTo, sleep } from './utils' test('scroll restore', async ({ page }) => { // open small window to make scrolling easier @@ -26,7 +26,11 @@ test('scroll restore', async ({ page }) => { await page.goBack() await expect(page).toHaveURL('/projects/mock-project/disks') await expectScrollTop(page, 143) + + // sleep required to get the scroll position to stick + await sleep(1000) await scrollTo(page, 190) + await sleep(1000) // go forward to snapshots, now scroll it await page.goForward() @@ -34,6 +38,12 @@ test('scroll restore', async ({ page }) => { await expectScrollTop(page, 0) await scrollTo(page, 30) + // Oddly, this is required here in order for the page to have time to + // catch the 30 scroll position. This became necessary with RR v7's use of + // startTransition. Extra oddly, with a value of 500 it passes rarely, but + // with 1000 it passes every time. + await sleep(1000) + // new nav to disks await page.getByRole('link', { name: 'Disks' }).click() await expectScrollTop(page, 0) @@ -53,6 +63,7 @@ test('scroll restore', async ({ page }) => { // back again to disks, newer scroll value is restored await page.goBack() await expect(page).toHaveURL('/projects/mock-project/disks') + await sleep(1000) await expectScrollTop(page, 190) // forward again to newest disks history entry, scroll remains 0