diff --git a/.github/workflows/build-and-deploy_devresults-xdev.yml b/.github/workflows/build-and-deploy_devresults-xdev.yml
index 129042a6..55688c05 100644
--- a/.github/workflows/build-and-deploy_devresults-xdev.yml
+++ b/.github/workflows/build-and-deploy_devresults-xdev.yml
@@ -21,7 +21,7 @@ jobs:
- name: Set up Node.js version
uses: actions/setup-node@v4
with:
- node-version: "20.x"
+ node-version: "18.x"
- uses: pnpm/action-setup@v3
with:
diff --git a/.gitignore b/.gitignore
index 1901d45e..437e23de 100644
--- a/.gitignore
+++ b/.gitignore
@@ -51,5 +51,4 @@ test-results
typings
yarn-debug.log*
yarn-error.log*
-.copilotcontext
-.react-router/
\ No newline at end of file
+.copilotcontext
\ No newline at end of file
diff --git a/app/ErrorBoundary.tsx b/app/ErrorBoundary.tsx
index e8d51e7e..7a8fdb5f 100644
--- a/app/ErrorBoundary.tsx
+++ b/app/ErrorBoundary.tsx
@@ -1,4 +1,4 @@
-import { useRouteError } from "react-router"
+import { useRouteError } from "@remix-run/react"
import { ErrorScreen } from "ui/ErrorScreen"
export function ErrorBoundary() {
diff --git a/app/context/Auth/AuthContextProvider.tsx b/app/context/Auth/AuthContextProvider.tsx
index 6c112571..b56e019b 100644
--- a/app/context/Auth/AuthContextProvider.tsx
+++ b/app/context/Auth/AuthContextProvider.tsx
@@ -2,7 +2,7 @@ import type { Repo } from "@automerge/automerge-repo"
import { RepoContext } from "@automerge/automerge-repo-react-hooks"
import type * as Auth from "@localfirst/auth"
import { type AuthProvider } from "@localfirst/auth-provider-automerge-repo"
-import { useNavigate } from "react-router"
+import { useNavigate } from "@remix-run/react"
import { initializeAuthRepo } from "context/Auth/initializeAuthRepo"
import { useLocalState } from "hooks/useLocalState"
import { useSignOut } from "hooks/useSignOut"
@@ -42,7 +42,7 @@ export function AuthContextProvider({ children }: { children: React.ReactNode })
switch (scenario) {
case "FIRST_LOAD": {
// start the auth flow
- void navigate("/auth/begin")
+ navigate("/auth/begin")
break
}
@@ -66,7 +66,7 @@ export function AuthContextProvider({ children }: { children: React.ReactNode })
const signOutIfNotAMember = (team: Auth.Team) => {
if (user && team.memberWasRemoved(user.userId)) {
signOut()
- void navigate("/")
+ navigate("/")
}
}
diff --git a/app/entry.client.tsx b/app/entry.client.tsx
new file mode 100644
index 00000000..405f591a
--- /dev/null
+++ b/app/entry.client.tsx
@@ -0,0 +1,7 @@
+import { RemixBrowser } from "@remix-run/react"
+import { startTransition } from "react"
+import { hydrateRoot } from "react-dom/client"
+
+startTransition(() => {
+ hydrateRoot(document.querySelector("#app")!, )
+})
diff --git a/app/entry.server.tsx b/app/entry.server.tsx
new file mode 100644
index 00000000..9c45a851
--- /dev/null
+++ b/app/entry.server.tsx
@@ -0,0 +1,21 @@
+import fs from "node:fs"
+import path from "node:path"
+import type { EntryContext } from "@remix-run/node"
+import { RemixServer } from "@remix-run/react"
+import { renderToString } from "react-dom/server"
+
+export default function handleRequest(
+ request: Request,
+ responseStatusCode: number,
+ _responseHeaders: Headers,
+ remixContext: EntryContext,
+) {
+ const shellHtml = fs.readFileSync(path.join(process.cwd(), "app/index.html")).toString()
+ const appHtml = renderToString()
+ const html = shellHtml.replace("", appHtml)
+
+ return new Response(html, {
+ headers: { "Content-Type": "text/html" },
+ status: responseStatusCode,
+ })
+}
diff --git a/app/hooks/useNavigationHotkey.tsx b/app/hooks/useNavigationHotkey.tsx
index f9c80742..fde93f4a 100644
--- a/app/hooks/useNavigationHotkey.tsx
+++ b/app/hooks/useNavigationHotkey.tsx
@@ -1,10 +1,10 @@
-import { useNavigate } from "react-router"
+import { useNavigate } from "@remix-run/react"
import { useHotkeys } from "react-hotkeys-hook"
export function useNavigationHotkey(keys: string, path: string) {
const navigate = useNavigate()
useHotkeys(keys, e => {
e.preventDefault()
- void navigate(path, { relative: "path" })
+ navigate(path, { relative: "path" })
})
}
diff --git a/app/hooks/useRedirect.tsx b/app/hooks/useRedirect.tsx
index 3ee5f2ac..e65c8ae4 100644
--- a/app/hooks/useRedirect.tsx
+++ b/app/hooks/useRedirect.tsx
@@ -1,6 +1,6 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */ // state is any
-import { useLocation, useNavigate } from "react-router"
+import { useLocation, useNavigate } from "@remix-run/react"
import { useEffect } from "react"
export function useRedirect({ from, to, condition = true }: Params) {
@@ -10,11 +10,11 @@ export function useRedirect({ from, to, condition = true }: Params) {
if (!condition) return
if (typeof from === "string" && pathname === from) {
console.log(`redirecting from ${from} to ${to}`)
- void navigate(to, { state })
+ navigate(to, { state })
} else if (from instanceof RegExp && from.test(pathname)) {
const newTo = pathname.replace(from, to)
console.log(`redirecting from ${from} to ${newTo}`)
- void navigate(newTo, { state })
+ navigate(newTo, { state })
}
}, [pathname])
}
diff --git a/app/hooks/useSelectedWeek.tsx b/app/hooks/useSelectedWeek.tsx
index e92cc917..1c0aabc2 100644
--- a/app/hooks/useSelectedWeek.tsx
+++ b/app/hooks/useSelectedWeek.tsx
@@ -1,5 +1,5 @@
import { LocalDate } from "@js-joda/core"
-import { useParams } from "react-router"
+import { useParams } from "@remix-run/react"
import { getWeek } from "lib/getWeek"
export function useSelectedWeek() {
diff --git a/app/hooks/useSelectedYear.tsx b/app/hooks/useSelectedYear.tsx
index 3677a4ae..0074a1ed 100644
--- a/app/hooks/useSelectedYear.tsx
+++ b/app/hooks/useSelectedYear.tsx
@@ -1,4 +1,4 @@
-import { useParams } from "react-router"
+import { useParams } from "react-router-dom"
import { getCurrentYear } from "lib/getCurrentYear"
import { yearFromString } from "lib/yearFromString"
diff --git a/app/index.html b/app/index.html
new file mode 100644
index 00000000..3f32f93b
--- /dev/null
+++ b/app/index.html
@@ -0,0 +1,16 @@
+
+
+
+ XDev
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/root.tsx b/app/root.tsx
index f8fe07b7..fae68182 100644
--- a/app/root.tsx
+++ b/app/root.tsx
@@ -1,5 +1,5 @@
import "@ibm/plex/css/ibm-plex.css"
-import { Links, Meta, Outlet, Scripts, ScrollRestoration } from "react-router"
+import { Links, Outlet, Scripts, ScrollRestoration } from "@remix-run/react"
import { Loading } from "ui/Loading"
import "./index.css"
@@ -14,24 +14,11 @@ export default function App() {
export function Layout({ children }: { children: React.ReactNode }) {
return (
-
-
-
-
-
-
-
-
-
-
-
-
-
- {children}
-
-
-
-
+ <>
+ {children}
+
+
+ >
)
}
diff --git a/app/routes.ts b/app/routes.ts
deleted file mode 100644
index cfbfaec3..00000000
--- a/app/routes.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { remixRoutesOptionAdapter } from "@react-router/remix-routes-option-adapter"
-import { flatRoutes } from "remix-flat-routes"
-
-const routes = remixRoutesOptionAdapter(defineRoutes => {
- return flatRoutes("routes", defineRoutes, {
- ignoredRouteFiles: ["**/.*"], // Ignore dot files (like .DS_Store)
- // appDir: 'app',
- // routeDir: 'routes',
- // basePath: '/',
- // paramPrefixChar: '$',
- // nestedDirectoryChar: '+',
- // routeRegex: /((\${nestedDirectoryChar}[\/\\][^\/\\:?*]+)|[\/\\]((index|route|layout|page)|(_[^\/\\:?*]+)|([^\/\\:?*]+\.route)))\.(ts|tsx|js|jsx|md|mdx)$$/,
- })
-})
-
-export default routes
diff --git a/app/routes/_private+/_private.tsx b/app/routes/_private+/_private.tsx
index b2cd8a9b..fc6c4706 100644
--- a/app/routes/_private+/_private.tsx
+++ b/app/routes/_private+/_private.tsx
@@ -1,4 +1,4 @@
-import { Outlet } from "react-router"
+import { Outlet } from "@remix-run/react"
import { AuthContextProvider } from "context/Auth/AuthContextProvider"
import { DatabaseContextProvider } from "context/Database/DatabaseContextProvider"
import { useTeam } from "hooks/useTeam"
diff --git a/app/routes/_private+/devtools+/_devtools.tsx b/app/routes/_private+/devtools+/_devtools.tsx
index 34603f70..4ab17600 100644
--- a/app/routes/_private+/devtools+/_devtools.tsx
+++ b/app/routes/_private+/devtools+/_devtools.tsx
@@ -1,4 +1,4 @@
-import { Outlet } from "react-router"
+import { Outlet } from "react-router-dom"
import { PageLayout } from "ui/layouts/PageLayout"
import { SecondaryNav } from "ui/SecondaryNav"
diff --git a/app/routes/_private+/dones+/_dones.tsx b/app/routes/_private+/dones+/_dones.tsx
index bbd173be..6b79c96c 100644
--- a/app/routes/_private+/dones+/_dones.tsx
+++ b/app/routes/_private+/dones+/_dones.tsx
@@ -1,4 +1,4 @@
-import { Outlet } from "react-router"
+import { Outlet } from "@remix-run/react"
import { useRedirect } from "hooks/useRedirect"
import { getSunday } from "lib/getSunday"
diff --git a/app/routes/_private+/hours+/_hours.tsx b/app/routes/_private+/hours+/_hours.tsx
index a4b9843d..458160cd 100644
--- a/app/routes/_private+/hours+/_hours.tsx
+++ b/app/routes/_private+/hours+/_hours.tsx
@@ -1,4 +1,4 @@
-import { Outlet } from "react-router"
+import { Outlet } from "@remix-run/react"
import { useRedirect } from "hooks/useRedirect"
import { getCurrentYear } from "lib/getCurrentYear"
diff --git a/app/routes/_private+/myweek+/_myweek.tsx b/app/routes/_private+/myweek+/_myweek.tsx
index 7a36aa00..84b04848 100644
--- a/app/routes/_private+/myweek+/_myweek.tsx
+++ b/app/routes/_private+/myweek+/_myweek.tsx
@@ -1,4 +1,4 @@
-import { Outlet } from "react-router"
+import { Outlet } from "@remix-run/react"
import { useRedirect } from "hooks/useRedirect"
import { getSunday } from "lib/getSunday"
diff --git a/app/routes/_private+/settings+/_settings.tsx b/app/routes/_private+/settings+/_settings.tsx
index 5d480cbd..12f3e0a9 100644
--- a/app/routes/_private+/settings+/_settings.tsx
+++ b/app/routes/_private+/settings+/_settings.tsx
@@ -1,4 +1,4 @@
-import { Outlet } from "react-router"
+import { Outlet } from "react-router-dom"
import { SecondaryNav } from "ui/SecondaryNav"
import { PageLayout } from "ui/layouts/PageLayout"
diff --git a/app/routes/_private+/settings+/devices+/_devices.tsx b/app/routes/_private+/settings+/devices+/_devices.tsx
index 6fd87d0a..52f2e1f4 100644
--- a/app/routes/_private+/settings+/devices+/_devices.tsx
+++ b/app/routes/_private+/settings+/devices+/_devices.tsx
@@ -1,5 +1,5 @@
import { useTeam } from "hooks/useTeam"
-import { Outlet } from "react-router"
+import { Outlet } from "react-router-dom"
import { Devices } from "ui/Devices"
export default function DevicesPage() {
diff --git a/app/routes/_private+/settings+/devices+/invite.tsx b/app/routes/_private+/settings+/devices+/invite.tsx
index b1ba4dfe..a293bfdb 100644
--- a/app/routes/_private+/settings+/devices+/invite.tsx
+++ b/app/routes/_private+/settings+/devices+/invite.tsx
@@ -1,4 +1,4 @@
-import { useNavigate } from "react-router"
+import { useNavigate } from "@remix-run/react"
import { useDeviceInvitationGenerator } from "hooks/useDeviceInvitationGenerator"
import { useTeam } from "hooks/useTeam"
import { InviteDeviceDialog } from "ui/InviteDeviceDialog"
@@ -15,7 +15,7 @@ export default function DevicesInvitePage() {
return (
navigate("..")}
+ onClose={() => navigate("..")}
invitationCode={invitationCode}
/>
)
diff --git a/app/routes/_private+/team+/_team.tsx b/app/routes/_private+/team+/_team.tsx
index f51366ce..e9224c38 100644
--- a/app/routes/_private+/team+/_team.tsx
+++ b/app/routes/_private+/team+/_team.tsx
@@ -1,4 +1,4 @@
-import { Outlet } from "react-router"
+import { Outlet } from "react-router-dom"
import { SecondaryNav } from "ui/SecondaryNav"
import { PageLayout } from "ui/layouts/PageLayout"
diff --git a/app/routes/_private+/team+/members+/_members.tsx b/app/routes/_private+/team+/members+/_members.tsx
index 5ae13e27..ff207f7f 100644
--- a/app/routes/_private+/team+/members+/_members.tsx
+++ b/app/routes/_private+/team+/members+/_members.tsx
@@ -1,5 +1,5 @@
import { useTeam } from "hooks/useTeam"
-import { Outlet } from "react-router"
+import { Outlet } from "react-router-dom"
import { Members } from "ui/Members"
export default function MembersPage() {
diff --git a/app/routes/_private+/team+/members+/invite.tsx b/app/routes/_private+/team+/members+/invite.tsx
index f7721c70..252144ae 100644
--- a/app/routes/_private+/team+/members+/invite.tsx
+++ b/app/routes/_private+/team+/members+/invite.tsx
@@ -1,7 +1,7 @@
import { useDatabase } from "hooks/useDatabase"
import { useMemberInvitationGenerator } from "hooks/useMemberInvitationGenerator"
import { useTeam } from "hooks/useTeam"
-import { useLocation, useNavigate } from "react-router"
+import { useLocation, useNavigate } from "react-router-dom"
import { type ContactId } from "schema/Contact"
import { InviteMemberDialog } from "ui/InviteMemberDialog"
@@ -26,7 +26,7 @@ export default function MembersInvitePage() {
return (
navigate("..")}
+ onClose={() => navigate("..")}
contact={contact}
invitationCode={invitationCode}
/>
diff --git a/app/routes/_private+/team+/members+/remove.tsx b/app/routes/_private+/team+/members+/remove.tsx
index 52fb5bde..86761628 100644
--- a/app/routes/_private+/team+/members+/remove.tsx
+++ b/app/routes/_private+/team+/members+/remove.tsx
@@ -1,6 +1,6 @@
import { useDatabase } from "hooks/useDatabase"
import { useTeam } from "hooks/useTeam"
-import { useLocation, useNavigate } from "react-router"
+import { useLocation, useNavigate } from "react-router-dom"
import type { ContactId } from "schema/Contact"
import { RemoveMemberDialog } from "ui/RemoveMemberDialog"
@@ -21,7 +21,7 @@ export default function RemovePage() {
return (
navigate("..")}
+ onClose={() => navigate("..")}
contact={contact}
remove={() => {
team.remove(contact.id)
diff --git a/app/routes/_private+/team+/members+/revoke.tsx b/app/routes/_private+/team+/members+/revoke.tsx
index 50179f92..cf8aa13a 100644
--- a/app/routes/_private+/team+/members+/revoke.tsx
+++ b/app/routes/_private+/team+/members+/revoke.tsx
@@ -1,6 +1,6 @@
import { useInvitation } from "hooks/useInvitation"
import { useTeam } from "hooks/useTeam"
-import { useLocation, useNavigate } from "react-router"
+import { useLocation, useNavigate } from "react-router-dom"
import type { ContactId } from "schema/Contact"
import { RevokeInvitationDialog } from "ui/RevokeInvitationDialog"
@@ -23,7 +23,7 @@ export default function RevokeInvitationPage() {
return (
navigate("..")}
+ onClose={() => navigate("..")}
contact={contact}
invitation={invitation}
revoke={revoke}
diff --git a/app/routes/auth+/_auth.tsx b/app/routes/auth+/_auth.tsx
index 5ac20f5d..401b25e5 100644
--- a/app/routes/auth+/_auth.tsx
+++ b/app/routes/auth+/_auth.tsx
@@ -1,4 +1,4 @@
-import { Outlet } from "react-router"
+import { Outlet } from "react-router-dom"
import { CenteredLayout } from "ui/layouts/CenteredLayout"
export default function AuthLayout() {
diff --git a/app/routes/auth+/begin.tsx b/app/routes/auth+/begin.tsx
index bebc4f62..b50caedc 100644
--- a/app/routes/auth+/begin.tsx
+++ b/app/routes/auth+/begin.tsx
@@ -1,4 +1,4 @@
-import { useNavigate } from "react-router"
+import { useNavigate } from "@remix-run/react"
import { useLocalState } from "hooks/useLocalState"
import { UserNameForm } from "ui/UserNameForm"
@@ -11,7 +11,7 @@ export default function AuthBeginPage() {
userName={userName}
onSubmit={({ n: userName }) => {
update({ userName })
- void navigate("/auth/setup")
+ navigate("/auth/setup")
}}
/>
)
diff --git a/app/routes/auth+/setup+/_.create.tsx b/app/routes/auth+/setup+/_.create.tsx
index d2c39e94..daf83b21 100644
--- a/app/routes/auth+/setup+/_.create.tsx
+++ b/app/routes/auth+/setup+/_.create.tsx
@@ -4,7 +4,7 @@
import { createUser } from "@localfirst/auth"
import { getShareId } from "@localfirst/auth-provider-automerge-repo"
-import { useNavigate } from "react-router"
+import { useNavigate } from "@remix-run/react"
import { createDevice, type UserInfo } from "context/Auth/createDevice"
import { getInitialContacts } from "context/Auth/getInitialContacts"
import { initializeAuthRepo } from "context/Auth/initializeAuthRepo"
@@ -26,7 +26,7 @@ export default function AuthCreatePage() {
// hooks ↑
if (!userName) {
- void navigate("/auth/begin")
+ navigate("/auth/begin")
return null
}
@@ -68,7 +68,7 @@ export default function AuthCreatePage() {
update({ user, device, rootDocumentId, shareId })
// Navigate to the app
- void navigate("/")
+ navigate("/")
}}
/>
)
diff --git a/app/routes/auth+/setup+/_.join.($code).tsx b/app/routes/auth+/setup+/_.join.($code).tsx
index 4975abc2..5c8f7d6a 100644
--- a/app/routes/auth+/setup+/_.join.($code).tsx
+++ b/app/routes/auth+/setup+/_.join.($code).tsx
@@ -5,7 +5,7 @@ import { eventPromise } from "@herbcaudill/eventemitter42"
import * as Auth from "@localfirst/auth"
import { createUser } from "@localfirst/auth"
import { type AuthErrorType } from "@localfirst/auth-provider-automerge-repo"
-import { useNavigate, useParams } from "react-router"
+import { useNavigate, useParams } from "@remix-run/react"
import { createDevice, type UserInfo } from "context/Auth/createDevice"
import { getRootDocumentIdFromTeam } from "context/Auth/getRootDocumentIdFromTeam"
import { initializeAuthRepo } from "context/Auth/initializeAuthRepo"
@@ -95,7 +95,7 @@ export default function AuthJoinPage() {
// Save our user info etc. to local storage
update({ user, device, rootDocumentId, shareId })
- void navigate("/")
+ navigate("/")
}
return invitationCodeFromUrl ?
diff --git a/app/routes/auth+/setup+/_.link.($code).tsx b/app/routes/auth+/setup+/_.link.($code).tsx
index da8db54d..42905774 100644
--- a/app/routes/auth+/setup+/_.link.($code).tsx
+++ b/app/routes/auth+/setup+/_.link.($code).tsx
@@ -1,5 +1,5 @@
import { eventPromise } from "@herbcaudill/eventemitter42"
-import { useNavigate } from "react-router"
+import { useNavigate } from "@remix-run/react"
import { createDevice } from "context/Auth/createDevice"
import { getRootDocumentIdFromTeam } from "context/Auth/getRootDocumentIdFromTeam"
import { initializeAuthRepo } from "context/Auth/initializeAuthRepo"
@@ -30,7 +30,7 @@ export default function AuthLinkPage() {
const rootDocumentId = getRootDocumentIdFromTeam(team)
update({ user, device, rootDocumentId, shareId })
- void navigate("/")
+ navigate("/")
}}
/>
)
diff --git a/app/routes/auth+/setup+/_setup.tsx b/app/routes/auth+/setup+/_setup.tsx
index 6aeb69f9..0378aee6 100644
--- a/app/routes/auth+/setup+/_setup.tsx
+++ b/app/routes/auth+/setup+/_setup.tsx
@@ -1,11 +1,11 @@
-import { useNavigate } from "react-router"
+import { useNavigate } from "@remix-run/react"
import { useLocalState } from "hooks/useLocalState"
import { SetupOptions } from "ui/SetupOptions"
export default function AuthSetupPage() {
const { userName } = useLocalState()
const navigate = useNavigate()
- if (!userName) void navigate("/auth/begin")
+ if (!userName) navigate("/auth/begin")
return
}
diff --git a/app/ui/Devices.tsx b/app/ui/Devices.tsx
index edafce36..4d459776 100644
--- a/app/ui/Devices.tsx
+++ b/app/ui/Devices.tsx
@@ -1,5 +1,5 @@
import type { Device, DeviceWithSecrets, UnixTimestamp } from "@localfirst/auth"
-import { Link } from "react-router"
+import { Link } from "@remix-run/react"
import { Button } from "@ui/button"
import { cx } from "lib/cx"
import { getBrowserIcon, getDeviceIcon, getOsIcon } from "lib/getDeviceIcon"
diff --git a/app/ui/ErrorScreen.tsx b/app/ui/ErrorScreen.tsx
index b7b02f2b..bc3d33ad 100644
--- a/app/ui/ErrorScreen.tsx
+++ b/app/ui/ErrorScreen.tsx
@@ -1,5 +1,5 @@
import { Card, CardContent, CardHeader, CardTitle } from "@ui/card"
-import { type ErrorResponse } from "react-router"
+import { type ErrorResponse } from "react-router-dom"
import { CenteredLayout } from "./layouts/CenteredLayout"
const isRouteErrorResponse = (e: Error | ErrorResponse): e is ErrorResponse => {
diff --git a/app/ui/Members.tsx b/app/ui/Members.tsx
index b75862bb..67754679 100644
--- a/app/ui/Members.tsx
+++ b/app/ui/Members.tsx
@@ -1,4 +1,4 @@
-import { Link } from "react-router"
+import { Link } from "@remix-run/react"
import { Button } from "@ui/button"
import { by } from "lib/by"
import { cx } from "lib/cx"
diff --git a/app/ui/SecondaryNav.tsx b/app/ui/SecondaryNav.tsx
index a2a3b8ac..20c331dc 100644
--- a/app/ui/SecondaryNav.tsx
+++ b/app/ui/SecondaryNav.tsx
@@ -1,6 +1,6 @@
import { useRedirect } from "hooks/useRedirect"
import { cx } from "lib/cx"
-import { NavLink } from "react-router"
+import { NavLink } from "react-router-dom"
export function SecondaryNav({ heading, items = [], parent: parentPath }: Props) {
const [firstItem] = items
diff --git a/app/ui/SetupOptions.tsx b/app/ui/SetupOptions.tsx
index 2175ca42..96c13483 100644
--- a/app/ui/SetupOptions.tsx
+++ b/app/ui/SetupOptions.tsx
@@ -2,7 +2,7 @@ import { Card, CardContent, CardHeader } from "@ui/card"
import { Button } from "ui/shadcn/button"
import { cx } from "lib/cx"
import { Fragment } from "react/jsx-runtime"
-import { Link } from "react-router"
+import { Link } from "react-router-dom"
export const SetupOptions = () => {
const options = [
diff --git a/app/ui/Sidebar.tsx b/app/ui/Sidebar.tsx
index 1f1f2803..2bc7cdb2 100644
--- a/app/ui/Sidebar.tsx
+++ b/app/ui/Sidebar.tsx
@@ -1,4 +1,4 @@
-import { NavLink } from "react-router"
+import { NavLink } from "@remix-run/react"
import { cx } from "lib/cx"
import { type ExtendedContact } from "schema/Contact"
import { type NavItem } from "types/types"
diff --git a/app/ui/Signout.tsx b/app/ui/Signout.tsx
index a4cb8d60..b2fe3846 100644
--- a/app/ui/Signout.tsx
+++ b/app/ui/Signout.tsx
@@ -1,6 +1,6 @@
import { Button } from "@ui/button"
import { Card, CardContent, CardFooter, CardHeader, CardTitle } from "@ui/card"
-import { Link } from "react-router"
+import { Link } from "@remix-run/react"
export const Signout = ({ confirmed = false, onConfirm = () => {} }: Props) => {
const warning = (
diff --git a/app/ui/WeekNav.tsx b/app/ui/WeekNav.tsx
index 3cfe34ba..3d69d04a 100644
--- a/app/ui/WeekNav.tsx
+++ b/app/ui/WeekNav.tsx
@@ -1,4 +1,4 @@
-import { Link, useLocation, useParams } from "react-router"
+import { Link, useLocation, useParams } from "@remix-run/react"
import { useNavigationHotkey } from "hooks/useNavigationHotkey"
import { useSelectedWeek } from "hooks/useSelectedWeek"
import { formatDateRange } from "lib/formatDateRange"
diff --git a/app/ui/YearNav.tsx b/app/ui/YearNav.tsx
index 0901cb2d..bac4d67c 100644
--- a/app/ui/YearNav.tsx
+++ b/app/ui/YearNav.tsx
@@ -1,4 +1,4 @@
-import { Link, useLocation } from "react-router"
+import { Link, useLocation } from "@remix-run/react"
import { useNavigationHotkey } from "hooks/useNavigationHotkey"
import { useRedirect } from "hooks/useRedirect"
import { useSelectedYear } from "hooks/useSelectedYear"
diff --git a/package.json b/package.json
index 65d858a5..38c4c8e3 100644
--- a/package.json
+++ b/package.json
@@ -5,12 +5,12 @@
"type": "module",
"scripts": {
"benchmark": "vitest bench",
- "build": "react-router build",
+ "build": "remix vite:build",
"build:storybook": "storybook build",
"build:icons": "node ./scripts/generate-icon-types.js",
"dev": "run-p dev:open dev:syncserver",
"dev:open": "pnpm dev:start --open",
- "dev:start": "react-router dev --port 3000 --host",
+ "dev:start": "remix vite:dev --port 3000 --host",
"dev:syncserver": "cross-env DEBUG=localfirst* NODE_ENV=development node ./scripts/syncserver.js",
"icon-types": "node ./scripts/generate-icon-types.js",
"context": "node ./scripts/populate-context.js",
@@ -62,8 +62,8 @@
"@radix-ui/react-slot": "^1.0.2",
"@radix-ui/react-tabs": "^1.1.1",
"@radix-ui/react-tooltip": "^1.1.6",
- "@react-router/node": "^7.0.0",
- "@react-router/remix-routes-option-adapter": "^7.2.0",
+ "@remix-run/node": "^2.8.1",
+ "@remix-run/react": "^2.8.1",
"@storybook/manager-api": "^8.4.6",
"@svgr/core": "^8.1.0",
"@svgr/plugin-jsx": "^8.1.0",
@@ -74,14 +74,13 @@
"csv-parse": "^5.5.5",
"debug": "^4.3.4",
"effect": "^3.5.7",
- "isbot": "^5",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-hook-form": "^7.51.3",
"react-hotkeys-hook": "^4.5.0",
"react-json-view-lite": "^2.0.1",
"react-qr-code": "^2.0.12",
- "react-router": "^7.0.0",
+ "react-router-dom": "^6.22.3",
"react-textarea-autosize": "^8.5.3",
"remix-flat-routes": "^0.6.4",
"tailwind-merge": "^2.2.1",
@@ -100,7 +99,7 @@
},
"devDependencies": {
"@esbuild-plugins/node-globals-polyfill": "^0.2.3",
- "@react-router/dev": "^7.0.0",
+ "@remix-run/dev": "^2.8.1",
"@storybook/addon-essentials": "^8.4.6",
"@storybook/addon-interactions": "^8.4.6",
"@storybook/addon-links": "^8.4.6",
@@ -144,7 +143,7 @@
"xo": "^0.58.0"
},
"engines": {
- "node": ">=20"
+ "node": ">=18.0.0"
},
"pnpm": {
"overrides": {
diff --git a/playwright.config.ts b/playwright.config.ts
index 3d743c92..cdfee765 100644
--- a/playwright.config.ts
+++ b/playwright.config.ts
@@ -71,7 +71,7 @@ export default defineConfig({
[]
: [
{
- command: "pnpm react-router dev --port 3001",
+ command: "pnpm remix vite:dev --port 3001",
env: { VITE_SYNC_SERVER_PORT: "3031" },
url: "http://localhost:3001",
reuseExistingServer: false,
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index ddf8fcdb..c95294dd 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -106,12 +106,12 @@ importers:
'@radix-ui/react-tooltip':
specifier: ^1.1.6
version: 1.1.6(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- '@react-router/node':
- specifier: ^7.0.0
- version: 7.2.0(react-router@7.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(typescript@5.6.3)
- '@react-router/remix-routes-option-adapter':
- specifier: ^7.2.0
- version: 7.2.0(@react-router/dev@7.2.0(@types/node@20.11.27)(react-router@7.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(terser@5.36.0)(typescript@5.6.3)(vite@5.1.4(@types/node@20.11.27)(terser@5.36.0)))(typescript@5.6.3)
+ '@remix-run/node':
+ specifier: ^2.8.1
+ version: 2.8.1(typescript@5.6.3)
+ '@remix-run/react':
+ specifier: ^2.8.1
+ version: 2.8.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.6.3)
'@storybook/manager-api':
specifier: ^8.4.6
version: 8.4.6(storybook@8.4.6(prettier@3.2.5))
@@ -142,9 +142,6 @@ importers:
effect:
specifier: ^3.5.7
version: 3.5.7
- isbot:
- specifier: ^5
- version: 5.1.23
react:
specifier: ^18.2.0
version: 18.2.0
@@ -163,9 +160,9 @@ importers:
react-qr-code:
specifier: ^2.0.12
version: 2.0.12(react@18.2.0)
- react-router:
- specifier: ^7.0.0
- version: 7.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ react-router-dom:
+ specifier: ^6.22.3
+ version: 6.22.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react-textarea-autosize:
specifier: ^8.5.3
version: 8.5.3(@types/react@18.2.66)(react@18.2.0)
@@ -215,9 +212,9 @@ importers:
'@esbuild-plugins/node-globals-polyfill':
specifier: ^0.2.3
version: 0.2.3(esbuild@0.20.1)
- '@react-router/dev':
- specifier: ^7.0.0
- version: 7.2.0(@types/node@20.11.27)(react-router@7.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(terser@5.36.0)(typescript@5.6.3)(vite@5.1.4(@types/node@20.11.27)(terser@5.36.0))
+ '@remix-run/dev':
+ specifier: ^2.8.1
+ version: 2.8.1(@types/node@20.11.27)(terser@5.36.0)(ts-node@10.9.2(@types/node@20.11.27)(typescript@5.6.3))(typescript@5.6.3)(vite@5.1.4(@types/node@20.11.27)(terser@5.36.0))
'@storybook/addon-essentials':
specifier: ^8.4.6
version: 8.4.6(@types/react@18.2.66)(storybook@8.4.6(prettier@3.2.5))
@@ -430,6 +427,10 @@ packages:
resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-annotate-as-pure@7.22.5':
+ resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-annotate-as-pure@7.25.9':
resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==}
engines: {node: '>=6.9.0'}
@@ -446,6 +447,12 @@ packages:
resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-create-class-features-plugin@7.24.0':
+ resolution: {integrity: sha512-QAH+vfvts51BCsNZ2PhY6HAggnlS6omLLFTsIpeqZk/MmJ6cW7tgz5yRv0fMJThcr6FmbMrENh1RgrWPTYA76g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
'@babel/helper-create-class-features-plugin@7.25.9':
resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==}
engines: {node: '>=6.9.0'}
@@ -475,6 +482,10 @@ packages:
resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-member-expression-to-functions@7.23.0':
+ resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-member-expression-to-functions@7.25.9':
resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==}
engines: {node: '>=6.9.0'}
@@ -499,6 +510,10 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0
+ '@babel/helper-optimise-call-expression@7.22.5':
+ resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-optimise-call-expression@7.25.9':
resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==}
engines: {node: '>=6.9.0'}
@@ -517,6 +532,12 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0
+ '@babel/helper-replace-supers@7.22.20':
+ resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
'@babel/helper-replace-supers@7.25.9':
resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==}
engines: {node: '>=6.9.0'}
@@ -531,6 +552,10 @@ packages:
resolution: {integrity: sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-skip-transparent-expression-wrappers@7.22.5':
+ resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-skip-transparent-expression-wrappers@7.25.9':
resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==}
engines: {node: '>=6.9.0'}
@@ -799,6 +824,12 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
+ '@babel/plugin-transform-modules-commonjs@7.23.3':
+ resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
'@babel/plugin-transform-modules-commonjs@7.25.9':
resolution: {integrity: sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==}
engines: {node: '>=6.9.0'}
@@ -1391,9 +1422,6 @@ packages:
'@types/react': '>=16'
react: '>=16'
- '@mjackson/node-fetch-server@0.2.0':
- resolution: {integrity: sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng==}
-
'@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2':
resolution: {integrity: sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==}
cpu: [arm64]
@@ -2042,44 +2070,6 @@ packages:
peerDependencies:
react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
- '@react-router/dev@7.2.0':
- resolution: {integrity: sha512-GzSNGeWuhx6sMsnidCQAlCAephibUMC61xIAdsc6hBXWCJe/T9wUrvtnh2Xbcpr7BRZJtJN4UhI472ZURA6m9w==}
- engines: {node: '>=20.0.0'}
- hasBin: true
- peerDependencies:
- '@react-router/serve': ^7.2.0
- react-router: ^7.2.0
- typescript: ^5.1.0
- vite: ^5.1.0 || ^6.0.0
- wrangler: ^3.28.2
- peerDependenciesMeta:
- '@react-router/serve':
- optional: true
- typescript:
- optional: true
- wrangler:
- optional: true
-
- '@react-router/node@7.2.0':
- resolution: {integrity: sha512-CqBHLwvvV4BB8htmaSwT+SOwX9B4RVOIiEdTlaIp12sNVCGSYDIEGbv3T4Wxeq8p5ynNfhNcdBeXtZ6ZPWVozA==}
- engines: {node: '>=20.0.0'}
- peerDependencies:
- react-router: 7.2.0
- typescript: ^5.1.0
- peerDependenciesMeta:
- typescript:
- optional: true
-
- '@react-router/remix-routes-option-adapter@7.2.0':
- resolution: {integrity: sha512-y5LH81y4JMP392FUVdjH+JbT/Q/vzKVA5t/HBb/JIUFjh/KN5bKt4zIoWY7sbr95A61RSIBr4ZDLH/VZrxL35A==}
- engines: {node: '>=20.0.0'}
- peerDependencies:
- '@react-router/dev': ^7.2.0
- typescript: ^5.1.0
- peerDependenciesMeta:
- typescript:
- optional: true
-
'@react-stately/utils@3.9.1':
resolution: {integrity: sha512-yzw75GE0iUWiyps02BOAPTrybcsMIxEJlzXqtvllAb01O9uX5n0i3X+u2eCpj2UoDF4zS08Ps0jPgWxg8xEYtA==}
peerDependencies:
@@ -2118,6 +2108,17 @@ packages:
typescript:
optional: true
+ '@remix-run/react@2.8.1':
+ resolution: {integrity: sha512-HTPm1U8+xz2jPaVjZnssrckfmFMA8sUZUdaWnoF5lmLWdReqcQv+XlBhIrQQ3jO9L8iYYdnzaSZZcRFYSdpTYg==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ typescript: ^5.1.0
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
'@remix-run/router@1.15.3':
resolution: {integrity: sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==}
engines: {node: '>=14.0.0'}
@@ -3151,9 +3152,6 @@ packages:
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
engines: {node: '>= 0.4'}
- babel-dead-code-elimination@1.0.9:
- resolution: {integrity: sha512-JLIhax/xullfInZjtu13UJjaLHDeTzt3vOeomaSUdO/nAMEL/pWC/laKrSvWylXMnVWyL5bpmG9njqBZlUQOdg==}
-
babel-plugin-polyfill-corejs2@0.4.11:
resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==}
peerDependencies:
@@ -3335,10 +3333,6 @@ packages:
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
- chokidar@4.0.3:
- resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
- engines: {node: '>= 14.16.0'}
-
chownr@1.1.4:
resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
@@ -3454,10 +3448,6 @@ packages:
resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
engines: {node: '>= 0.6'}
- cookie@1.0.2:
- resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==}
- engines: {node: '>=18'}
-
core-js-compat@3.36.1:
resolution: {integrity: sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==}
@@ -3568,26 +3558,9 @@ packages:
supports-color:
optional: true
- debug@4.4.0:
- resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
- engines: {node: '>=6.0'}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
-
decode-named-character-reference@1.0.2:
resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
- dedent@1.5.3:
- resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==}
- peerDependencies:
- babel-plugin-macros: ^3.1.0
- peerDependenciesMeta:
- babel-plugin-macros:
- optional: true
-
deep-eql@4.1.3:
resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==}
engines: {node: '>=6'}
@@ -3775,6 +3748,9 @@ packages:
resolution: {integrity: sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==}
engines: {node: '>= 0.4'}
+ es-module-lexer@1.4.1:
+ resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==}
+
es-module-lexer@1.5.4:
resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==}
@@ -4767,10 +4743,6 @@ packages:
isarray@2.0.5:
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
- isbot@5.1.23:
- resolution: {integrity: sha512-ie3ehy2iXdkuzaZx32SoKb9b8l9Cm8cqQ1lJjQXnq8GRTrk/Jx7IUDcB4mhlw6H3gWaMqGYoWeV0lPv1P/20Ig==}
- engines: {node: '>=18'}
-
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
@@ -6023,16 +5995,6 @@ packages:
peerDependencies:
react: '>=16.8'
- react-router@7.2.0:
- resolution: {integrity: sha512-fXyqzPgCPZbqhrk7k3hPcCpYIlQ2ugIXDboHUzhJISFVy2DEPsmHgN588MyGmkIOv3jDgNfUE3kJi83L28s/LQ==}
- engines: {node: '>=20.0.0'}
- peerDependencies:
- react: '>=18'
- react-dom: '>=18'
- peerDependenciesMeta:
- react-dom:
- optional: true
-
react-style-singleton@2.2.1:
resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
engines: {node: '>=10'}
@@ -6094,10 +6056,6 @@ packages:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
- readdirp@4.1.2:
- resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
- engines: {node: '>= 14.18.0'}
-
recast@0.23.6:
resolution: {integrity: sha512-9FHoNjX1yjuesMwuthAmPKabxYQdOgihFYmT5ebXfYGBcnqXZf3WOVz+5foEZ8Y83P4ZY6yQD5GMmtV+pgCCAQ==}
engines: {node: '>= 4'}
@@ -6773,9 +6731,6 @@ packages:
tslib@2.6.2:
resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
- turbo-stream@2.4.0:
- resolution: {integrity: sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==}
-
type-check@0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
@@ -6856,10 +6811,6 @@ packages:
undici-types@6.19.8:
resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
- undici@6.21.1:
- resolution: {integrity: sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==}
- engines: {node: '>=18.17'}
-
unicode-canonical-property-names-ecmascript@2.0.1:
resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==}
engines: {node: '>=4'}
@@ -7069,14 +7020,6 @@ packages:
v8-compile-cache-lib@3.0.1:
resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
- valibot@0.41.0:
- resolution: {integrity: sha512-igDBb8CTYr8YTQlOKgaN9nSS0Be7z+WRuaeYqGf3Cjz3aKmSnqEmYnkfVjzIuumGqfHpa3fLIvMEAfhrpqN8ng==}
- peerDependencies:
- typescript: '>=5'
- peerDependenciesMeta:
- typescript:
- optional: true
-
validate-npm-package-license@3.0.4:
resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
@@ -7100,14 +7043,14 @@ packages:
vfile@5.3.7:
resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==}
- vite-node@1.5.0:
- resolution: {integrity: sha512-tV8h6gMj6vPzVCa7l+VGq9lwoJjW8Y79vst8QZZGiuRAfijU+EEWuc0kFpmndQrWhMMhet1jdSF+40KSZUqIIw==}
+ vite-node@1.3.1:
+ resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
- vite-node@3.0.0-beta.2:
- resolution: {integrity: sha512-ofTf6cfRdL30Wbl9n/BX81EyIR5s4PReLmSurrxQ+koLaWUNOEo8E0lCM53OJkb8vpa2URM2nSrxZsIFyvY1rg==}
- engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ vite-node@1.5.0:
+ resolution: {integrity: sha512-tV8h6gMj6vPzVCa7l+VGq9lwoJjW8Y79vst8QZZGiuRAfijU+EEWuc0kFpmndQrWhMMhet1jdSF+40KSZUqIIw==}
+ engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
vite-plugin-pwa@0.19.3:
@@ -7577,6 +7520,10 @@ snapshots:
'@jridgewell/trace-mapping': 0.3.25
jsesc: 3.0.2
+ '@babel/helper-annotate-as-pure@7.22.5':
+ dependencies:
+ '@babel/types': 7.24.0
+
'@babel/helper-annotate-as-pure@7.25.9':
dependencies:
'@babel/types': 7.26.0
@@ -7604,6 +7551,19 @@ snapshots:
lru-cache: 5.1.1
semver: 6.3.1
+ '@babel/helper-create-class-features-plugin@7.24.0(@babel/core@7.24.0)':
+ dependencies:
+ '@babel/core': 7.24.0
+ '@babel/helper-annotate-as-pure': 7.22.5
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-function-name': 7.23.0
+ '@babel/helper-member-expression-to-functions': 7.23.0
+ '@babel/helper-optimise-call-expression': 7.22.5
+ '@babel/helper-replace-supers': 7.22.20(@babel/core@7.24.0)
+ '@babel/helper-skip-transparent-expression-wrappers': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ semver: 6.3.1
+
'@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.24.5)':
dependencies:
'@babel/core': 7.24.5
@@ -7629,7 +7589,7 @@ snapshots:
'@babel/core': 7.24.5
'@babel/helper-compilation-targets': 7.25.9
'@babel/helper-plugin-utils': 7.25.9
- debug: 4.4.0
+ debug: 4.3.7
lodash.debounce: 4.0.8
resolve: 1.22.8
transitivePeerDependencies:
@@ -7646,6 +7606,10 @@ snapshots:
dependencies:
'@babel/types': 7.24.0
+ '@babel/helper-member-expression-to-functions@7.23.0':
+ dependencies:
+ '@babel/types': 7.24.0
+
'@babel/helper-member-expression-to-functions@7.25.9':
dependencies:
'@babel/traverse': 7.25.9
@@ -7682,6 +7646,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@babel/helper-optimise-call-expression@7.22.5':
+ dependencies:
+ '@babel/types': 7.24.0
+
'@babel/helper-optimise-call-expression@7.25.9':
dependencies:
'@babel/types': 7.26.0
@@ -7699,6 +7667,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@babel/helper-replace-supers@7.22.20(@babel/core@7.24.0)':
+ dependencies:
+ '@babel/core': 7.24.0
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-member-expression-to-functions': 7.23.0
+ '@babel/helper-optimise-call-expression': 7.22.5
+
'@babel/helper-replace-supers@7.25.9(@babel/core@7.24.5)':
dependencies:
'@babel/core': 7.24.5
@@ -7719,6 +7694,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@babel/helper-skip-transparent-expression-wrappers@7.22.5':
+ dependencies:
+ '@babel/types': 7.24.0
+
'@babel/helper-skip-transparent-expression-wrappers@7.25.9':
dependencies:
'@babel/traverse': 7.25.9
@@ -7816,10 +7795,10 @@ snapshots:
dependencies:
'@babel/core': 7.24.5
- '@babel/plugin-syntax-decorators@7.24.0(@babel/core@7.24.5)':
+ '@babel/plugin-syntax-decorators@7.24.0(@babel/core@7.24.0)':
dependencies:
- '@babel/core': 7.24.5
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/core': 7.24.0
+ '@babel/helper-plugin-utils': 7.24.0
'@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.24.5)':
dependencies:
@@ -7831,15 +7810,15 @@ snapshots:
'@babel/core': 7.24.5
'@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.5)':
+ '@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.0)':
dependencies:
- '@babel/core': 7.24.5
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/core': 7.24.0
+ '@babel/helper-plugin-utils': 7.24.0
- '@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.24.5)':
+ '@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.24.0)':
dependencies:
- '@babel/core': 7.24.5
- '@babel/helper-plugin-utils': 7.25.9
+ '@babel/core': 7.24.0
+ '@babel/helper-plugin-utils': 7.24.0
'@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.5)':
dependencies:
@@ -7999,6 +7978,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.24.0)':
+ dependencies:
+ '@babel/core': 7.24.0
+ '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.0)
+ '@babel/helper-plugin-utils': 7.24.0
+ '@babel/helper-simple-access': 7.22.5
+
'@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.24.5)':
dependencies:
'@babel/core': 7.24.5
@@ -8157,15 +8143,13 @@ snapshots:
'@babel/core': 7.24.5
'@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-transform-typescript@7.23.6(@babel/core@7.24.5)':
+ '@babel/plugin-transform-typescript@7.23.6(@babel/core@7.24.0)':
dependencies:
- '@babel/core': 7.24.5
- '@babel/helper-annotate-as-pure': 7.25.9
- '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.24.5)
- '@babel/helper-plugin-utils': 7.25.9
- '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.24.5)
- transitivePeerDependencies:
- - supports-color
+ '@babel/core': 7.24.0
+ '@babel/helper-annotate-as-pure': 7.22.5
+ '@babel/helper-create-class-features-plugin': 7.24.0(@babel/core@7.24.0)
+ '@babel/helper-plugin-utils': 7.24.0
+ '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.24.0)
'@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.24.5)':
dependencies:
@@ -8272,16 +8256,14 @@ snapshots:
'@babel/types': 7.26.0
esutils: 2.0.3
- '@babel/preset-typescript@7.23.3(@babel/core@7.24.5)':
+ '@babel/preset-typescript@7.23.3(@babel/core@7.24.0)':
dependencies:
- '@babel/core': 7.24.5
- '@babel/helper-plugin-utils': 7.25.9
- '@babel/helper-validator-option': 7.25.9
- '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.5)
- '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.24.5)
- '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.24.5)
- transitivePeerDependencies:
- - supports-color
+ '@babel/core': 7.24.0
+ '@babel/helper-plugin-utils': 7.24.0
+ '@babel/helper-validator-option': 7.23.5
+ '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0)
+ '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.24.0)
+ '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.24.0)
'@babel/runtime@7.24.0':
dependencies:
@@ -8732,8 +8714,6 @@ snapshots:
'@types/react': 18.2.66
react: 18.2.0
- '@mjackson/node-fetch-server@0.2.0': {}
-
'@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2':
optional: true
@@ -8768,7 +8748,7 @@ snapshots:
'@npmcli/fs@3.1.0':
dependencies:
- semver: 7.6.3
+ semver: 7.6.0
'@npmcli/git@4.1.0':
dependencies:
@@ -8778,7 +8758,7 @@ snapshots:
proc-log: 3.0.0
promise-inflight: 1.0.1
promise-retry: 2.0.1
- semver: 7.6.3
+ semver: 7.6.0
which: 3.0.1
transitivePeerDependencies:
- bluebird
@@ -8791,7 +8771,7 @@ snapshots:
json-parse-even-better-errors: 3.0.1
normalize-package-data: 5.0.0
proc-log: 3.0.0
- semver: 7.6.3
+ semver: 7.6.0
transitivePeerDependencies:
- bluebird
@@ -9338,69 +9318,6 @@ snapshots:
clsx: 2.1.0
react: 18.2.0
- '@react-router/dev@7.2.0(@types/node@20.11.27)(react-router@7.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(terser@5.36.0)(typescript@5.6.3)(vite@5.1.4(@types/node@20.11.27)(terser@5.36.0))':
- dependencies:
- '@babel/core': 7.24.5
- '@babel/generator': 7.26.2
- '@babel/parser': 7.26.2
- '@babel/plugin-syntax-decorators': 7.24.0(@babel/core@7.24.5)
- '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.5)
- '@babel/preset-typescript': 7.23.3(@babel/core@7.24.5)
- '@babel/traverse': 7.25.9
- '@babel/types': 7.26.0
- '@npmcli/package-json': 4.0.1
- '@react-router/node': 7.2.0(react-router@7.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(typescript@5.6.3)
- arg: 5.0.2
- babel-dead-code-elimination: 1.0.9
- chokidar: 4.0.3
- dedent: 1.5.3
- es-module-lexer: 1.5.4
- exit-hook: 2.2.1
- fs-extra: 10.1.0
- gunzip-maybe: 1.4.2
- jsesc: 3.0.2
- lodash: 4.17.21
- pathe: 1.1.2
- picocolors: 1.1.1
- picomatch: 2.3.1
- prettier: 2.8.8
- react-refresh: 0.14.0
- react-router: 7.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- semver: 7.6.3
- set-cookie-parser: 2.6.0
- valibot: 0.41.0(typescript@5.6.3)
- vite: 5.1.4(@types/node@20.11.27)(terser@5.36.0)
- vite-node: 3.0.0-beta.2(@types/node@20.11.27)(terser@5.36.0)
- optionalDependencies:
- typescript: 5.6.3
- transitivePeerDependencies:
- - '@types/node'
- - babel-plugin-macros
- - bluebird
- - less
- - lightningcss
- - sass
- - stylus
- - sugarss
- - supports-color
- - terser
-
- '@react-router/node@7.2.0(react-router@7.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(typescript@5.6.3)':
- dependencies:
- '@mjackson/node-fetch-server': 0.2.0
- react-router: 7.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
- source-map-support: 0.5.21
- stream-slice: 0.1.2
- undici: 6.21.1
- optionalDependencies:
- typescript: 5.6.3
-
- '@react-router/remix-routes-option-adapter@7.2.0(@react-router/dev@7.2.0(@types/node@20.11.27)(react-router@7.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(terser@5.36.0)(typescript@5.6.3)(vite@5.1.4(@types/node@20.11.27)(terser@5.36.0)))(typescript@5.6.3)':
- dependencies:
- '@react-router/dev': 7.2.0(@types/node@20.11.27)(react-router@7.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(terser@5.36.0)(typescript@5.6.3)(vite@5.1.4(@types/node@20.11.27)(terser@5.36.0))
- optionalDependencies:
- typescript: 5.6.3
-
'@react-stately/utils@3.9.1(react@18.2.0)':
dependencies:
'@swc/helpers': 0.5.9
@@ -9412,14 +9329,14 @@ snapshots:
'@remix-run/dev@2.8.1(@types/node@20.11.27)(terser@5.36.0)(ts-node@10.9.2(@types/node@20.11.27)(typescript@5.6.3))(typescript@5.6.3)(vite@5.1.4(@types/node@20.11.27)(terser@5.36.0))':
dependencies:
- '@babel/core': 7.24.5
- '@babel/generator': 7.26.2
- '@babel/parser': 7.26.2
- '@babel/plugin-syntax-decorators': 7.24.0(@babel/core@7.24.5)
- '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.5)
- '@babel/preset-typescript': 7.23.3(@babel/core@7.24.5)
- '@babel/traverse': 7.25.9
- '@babel/types': 7.26.0
+ '@babel/core': 7.24.0
+ '@babel/generator': 7.23.6
+ '@babel/parser': 7.24.0
+ '@babel/plugin-syntax-decorators': 7.24.0(@babel/core@7.24.0)
+ '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.24.0)
+ '@babel/preset-typescript': 7.23.3(@babel/core@7.24.0)
+ '@babel/traverse': 7.24.0
+ '@babel/types': 7.24.0
'@mdx-js/mdx': 2.3.0
'@npmcli/package-json': 4.0.1
'@remix-run/node': 2.8.1(typescript@5.6.3)
@@ -9433,7 +9350,7 @@ snapshots:
chokidar: 3.6.0
cross-spawn: 7.0.3
dotenv: 16.4.5
- es-module-lexer: 1.5.4
+ es-module-lexer: 1.4.1
esbuild: 0.20.1
esbuild-plugins-node-modules-polyfill: 1.6.3(esbuild@0.20.1)
execa: 5.1.1
@@ -9446,9 +9363,9 @@ snapshots:
json5: 2.2.3
lodash: 4.17.21
lodash.debounce: 4.0.8
- minimatch: 9.0.4
+ minimatch: 9.0.3
ora: 5.4.1
- picocolors: 1.1.1
+ picocolors: 1.0.0
picomatch: 2.3.1
pidtree: 0.6.0
postcss: 8.4.35
@@ -9460,7 +9377,7 @@ snapshots:
react-refresh: 0.14.0
remark-frontmatter: 4.0.1
remark-mdx-frontmatter: 1.1.1
- semver: 7.6.3
+ semver: 7.6.0
set-cookie-parser: 2.6.0
tar-fs: 2.1.1
tsconfig-paths: 4.2.0
@@ -9495,6 +9412,17 @@ snapshots:
optionalDependencies:
typescript: 5.6.3
+ '@remix-run/react@2.8.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.6.3)':
+ dependencies:
+ '@remix-run/router': 1.15.3
+ '@remix-run/server-runtime': 2.8.1(typescript@5.6.3)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-router: 6.22.3(react@18.2.0)
+ react-router-dom: 6.22.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
+ optionalDependencies:
+ typescript: 5.6.3
+
'@remix-run/router@1.15.3': {}
'@remix-run/router@1.15.3-pre.0': {}
@@ -10053,7 +9981,7 @@ snapshots:
'@types/acorn@4.0.6':
dependencies:
- '@types/estree': 1.0.6
+ '@types/estree': 1.0.5
'@types/aria-query@5.0.4': {}
@@ -10103,7 +10031,7 @@ snapshots:
'@types/estree-jsx@1.0.5':
dependencies:
- '@types/estree': 1.0.6
+ '@types/estree': 1.0.5
'@types/estree@0.0.39': {}
@@ -10306,7 +10234,7 @@ snapshots:
'@vanilla-extract/babel-plugin-debug-ids@1.0.5':
dependencies:
- '@babel/core': 7.24.5
+ '@babel/core': 7.24.0
transitivePeerDependencies:
- supports-color
@@ -10326,8 +10254,8 @@ snapshots:
'@vanilla-extract/integration@6.5.0(@types/node@20.11.27)(terser@5.36.0)':
dependencies:
- '@babel/core': 7.24.5
- '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.24.5)
+ '@babel/core': 7.24.0
+ '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.24.0)
'@vanilla-extract/babel-plugin-debug-ids': 1.0.5
'@vanilla-extract/css': 1.14.1
esbuild: 0.20.1
@@ -10338,7 +10266,7 @@ snapshots:
mlly: 1.6.1
outdent: 0.8.0
vite: 5.1.4(@types/node@20.11.27)(terser@5.36.0)
- vite-node: 1.5.0(@types/node@20.11.27)(terser@5.36.0)
+ vite-node: 1.3.1(@types/node@20.11.27)(terser@5.36.0)
transitivePeerDependencies:
- '@types/node'
- less
@@ -10525,10 +10453,6 @@ snapshots:
dependencies:
acorn: 8.11.3
- acorn-jsx@5.3.2(acorn@8.14.0):
- dependencies:
- acorn: 8.14.0
-
acorn-walk@8.3.2: {}
acorn@8.11.3: {}
@@ -10721,15 +10645,6 @@ snapshots:
dependencies:
possible-typed-array-names: 1.0.0
- babel-dead-code-elimination@1.0.9:
- dependencies:
- '@babel/core': 7.24.5
- '@babel/parser': 7.26.2
- '@babel/traverse': 7.25.9
- '@babel/types': 7.26.0
- transitivePeerDependencies:
- - supports-color
-
babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.5):
dependencies:
'@babel/compat-data': 7.26.2
@@ -10965,10 +10880,6 @@ snapshots:
optionalDependencies:
fsevents: 2.3.3
- chokidar@4.0.3:
- dependencies:
- readdirp: 4.1.2
-
chownr@1.1.4: {}
chownr@2.0.0: {}
@@ -11049,8 +10960,6 @@ snapshots:
cookie@0.6.0: {}
- cookie@1.0.2: {}
-
core-js-compat@3.36.1:
dependencies:
browserslist: 4.23.0
@@ -11143,16 +11052,10 @@ snapshots:
dependencies:
ms: 2.1.3
- debug@4.4.0:
- dependencies:
- ms: 2.1.3
-
decode-named-character-reference@1.0.2:
dependencies:
character-entities: 2.0.2
- dedent@1.5.3: {}
-
deep-eql@4.1.3:
dependencies:
type-detect: 4.0.8
@@ -11406,6 +11309,8 @@ snapshots:
iterator.prototype: 1.1.2
safe-array-concat: 1.1.2
+ es-module-lexer@1.4.1: {}
+
es-module-lexer@1.5.4: {}
es-object-atoms@1.0.0:
@@ -11811,7 +11716,7 @@ snapshots:
estree-util-attach-comments@2.1.1:
dependencies:
- '@types/estree': 1.0.6
+ '@types/estree': 1.0.5
estree-util-build-jsx@2.2.2:
dependencies:
@@ -11852,7 +11757,7 @@ snapshots:
eval@0.1.8:
dependencies:
- '@types/node': 20.17.6
+ '@types/node': 20.11.27
require-like: 0.1.2
event-target-shim@5.0.1: {}
@@ -12220,7 +12125,7 @@ snapshots:
hast-util-to-estree@2.3.3:
dependencies:
- '@types/estree': 1.0.6
+ '@types/estree': 1.0.5
'@types/estree-jsx': 1.0.5
'@types/hast': 2.3.10
'@types/unist': 2.0.10
@@ -12448,7 +12353,7 @@ snapshots:
is-reference@3.0.2:
dependencies:
- '@types/estree': 1.0.6
+ '@types/estree': 1.0.5
is-regex@1.1.4:
dependencies:
@@ -12520,8 +12425,6 @@ snapshots:
isarray@2.0.5: {}
- isbot@5.1.23: {}
-
isexe@2.0.0: {}
isomorphic-ws@5.0.0(ws@8.16.0):
@@ -12862,7 +12765,7 @@ snapshots:
media-query-parser@2.0.2:
dependencies:
- '@babel/runtime': 7.26.0
+ '@babel/runtime': 7.24.4
media-typer@0.3.0: {}
@@ -12914,7 +12817,7 @@ snapshots:
micromark-extension-mdx-expression@1.0.8:
dependencies:
- '@types/estree': 1.0.6
+ '@types/estree': 1.0.5
micromark-factory-mdx-expression: 1.0.9
micromark-factory-space: 1.1.0
micromark-util-character: 1.2.0
@@ -12926,7 +12829,7 @@ snapshots:
micromark-extension-mdx-jsx@1.0.5:
dependencies:
'@types/acorn': 4.0.6
- '@types/estree': 1.0.6
+ '@types/estree': 1.0.5
estree-util-is-identifier-name: 2.1.0
micromark-factory-mdx-expression: 1.0.9
micromark-factory-space: 1.1.0
@@ -12942,7 +12845,7 @@ snapshots:
micromark-extension-mdxjs-esm@1.0.5:
dependencies:
- '@types/estree': 1.0.6
+ '@types/estree': 1.0.5
micromark-core-commonmark: 1.1.0
micromark-util-character: 1.2.0
micromark-util-events-to-acorn: 1.2.3
@@ -12954,8 +12857,8 @@ snapshots:
micromark-extension-mdxjs@1.0.1:
dependencies:
- acorn: 8.14.0
- acorn-jsx: 5.3.2(acorn@8.14.0)
+ acorn: 8.11.3
+ acorn-jsx: 5.3.2(acorn@8.11.3)
micromark-extension-mdx-expression: 1.0.8
micromark-extension-mdx-jsx: 1.0.5
micromark-extension-mdx-md: 1.0.1
@@ -12978,7 +12881,7 @@ snapshots:
micromark-factory-mdx-expression@1.0.9:
dependencies:
- '@types/estree': 1.0.6
+ '@types/estree': 1.0.5
micromark-util-character: 1.2.0
micromark-util-events-to-acorn: 1.2.3
micromark-util-symbol: 1.1.0
@@ -13042,7 +12945,7 @@ snapshots:
micromark-util-events-to-acorn@1.2.3:
dependencies:
'@types/acorn': 4.0.6
- '@types/estree': 1.0.6
+ '@types/estree': 1.0.5
'@types/unist': 2.0.10
estree-util-visit: 1.2.1
micromark-util-symbol: 1.1.0
@@ -13080,7 +12983,7 @@ snapshots:
micromark@3.2.0:
dependencies:
'@types/debug': 4.1.12
- debug: 4.4.0
+ debug: 4.3.7
decode-named-character-reference: 1.0.2
micromark-core-commonmark: 1.1.0
micromark-factory-space: 1.1.0
@@ -13252,7 +13155,7 @@ snapshots:
dependencies:
hosted-git-info: 6.1.1
is-core-module: 2.13.1
- semver: 7.6.3
+ semver: 7.6.0
validate-npm-package-license: 3.0.4
normalize-path@3.0.0: {}
@@ -13261,7 +13164,7 @@ snapshots:
npm-install-checks@6.3.0:
dependencies:
- semver: 7.6.3
+ semver: 7.6.0
npm-normalize-package-bin@3.0.1: {}
@@ -13269,7 +13172,7 @@ snapshots:
dependencies:
hosted-git-info: 6.1.1
proc-log: 3.0.0
- semver: 7.6.3
+ semver: 7.6.0
validate-npm-package-name: 5.0.0
npm-pick-manifest@8.0.2:
@@ -13277,7 +13180,7 @@ snapshots:
npm-install-checks: 6.3.0
npm-normalize-package-bin: 3.0.1
npm-package-arg: 10.1.0
- semver: 7.6.3
+ semver: 7.6.0
npm-run-all@4.1.5:
dependencies:
@@ -13509,7 +13412,7 @@ snapshots:
periscopic@3.1.0:
dependencies:
- '@types/estree': 1.0.6
+ '@types/estree': 1.0.5
estree-walker: 3.0.3
is-reference: 3.0.2
@@ -13847,16 +13750,6 @@ snapshots:
'@remix-run/router': 1.15.3
react: 18.2.0
- react-router@7.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
- dependencies:
- '@types/cookie': 0.6.0
- cookie: 1.0.2
- react: 18.2.0
- set-cookie-parser: 2.6.0
- turbo-stream: 2.4.0
- optionalDependencies:
- react-dom: 18.2.0(react@18.2.0)
-
react-style-singleton@2.2.1(@types/react@18.2.66)(react@18.2.0):
dependencies:
get-nonce: 1.0.1
@@ -13934,8 +13827,6 @@ snapshots:
dependencies:
picomatch: 2.3.1
- readdirp@4.1.2: {}
-
recast@0.23.6:
dependencies:
ast-types: 0.16.1
@@ -14719,8 +14610,6 @@ snapshots:
tslib@2.6.2: {}
- turbo-stream@2.4.0: {}
-
type-check@0.4.0:
dependencies:
prelude-ls: 1.2.1
@@ -14804,8 +14693,6 @@ snapshots:
undici-types@6.19.8: {}
- undici@6.21.1: {}
-
unicode-canonical-property-names-ecmascript@2.0.1: {}
unicode-match-property-ecmascript@2.0.0:
@@ -15018,10 +14905,6 @@ snapshots:
v8-compile-cache-lib@3.0.1: {}
- valibot@0.41.0(typescript@5.6.3):
- optionalDependencies:
- typescript: 5.6.3
-
validate-npm-package-license@3.0.4:
dependencies:
spdx-correct: 3.2.0
@@ -15054,7 +14937,7 @@ snapshots:
unist-util-stringify-position: 3.0.3
vfile-message: 3.1.4
- vite-node@1.5.0(@types/node@20.11.27)(terser@5.36.0):
+ vite-node@1.3.1(@types/node@20.11.27)(terser@5.36.0):
dependencies:
cac: 6.7.14
debug: 4.3.4
@@ -15071,12 +14954,12 @@ snapshots:
- supports-color
- terser
- vite-node@3.0.0-beta.2(@types/node@20.11.27)(terser@5.36.0):
+ vite-node@1.5.0(@types/node@20.11.27)(terser@5.36.0):
dependencies:
cac: 6.7.14
- debug: 4.4.0
- es-module-lexer: 1.5.4
+ debug: 4.3.4
pathe: 1.1.2
+ picocolors: 1.0.0
vite: 5.1.4(@types/node@20.11.27)(terser@5.36.0)
transitivePeerDependencies:
- '@types/node'
diff --git a/react-router.config.ts b/react-router.config.ts
deleted file mode 100644
index c945f66b..00000000
--- a/react-router.config.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import type { Config } from "@react-router/dev/config"
-
-export default {
- // Config options...
- // SPA mode to get our redirects working (also because we eventually want a SPA)
- ssr: false,
-} satisfies Config
diff --git a/tsconfig.json b/tsconfig.json
index 5aa610d4..1e304b25 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -11,8 +11,7 @@
"skipLibCheck": true,
"strict": true,
"target": "ESNext",
- "types": ["@react-router/node", "vite/client"],
- "rootDirs": [".", "./.react-router/types"]
+ "types": ["vite/client"]
},
"include": ["*.ts", "test/**/*.ts"]
}
diff --git a/vite.config.ts b/vite.config.ts
index ff11c81f..fa4cf336 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,5 +1,6 @@
import { NodeGlobalsPolyfillPlugin as nodeGlobalsPolyfillPlugin } from "@esbuild-plugins/node-globals-polyfill"
-import { reactRouter } from "@react-router/dev/vite"
+import { vitePlugin as remix, type VitePluginConfig } from "@remix-run/dev"
+import { flatRoutes } from "remix-flat-routes"
import { type Options as AutoImportOptions } from "unplugin-auto-import/types"
import autoImport from "unplugin-auto-import/vite"
import iconsResolver from "unplugin-icons/resolver"
@@ -10,6 +11,19 @@ import wasm from "vite-plugin-wasm"
import tsconfigPaths from "vite-tsconfig-paths"
import { defineConfig } from "vitest/config"
+const remixOptions: VitePluginConfig = {
+ // SPA mode https://remix.run/docs/en/main/future/spa-mode
+ ssr: false,
+
+ // see https://github.com/kiliman/remix-flat-routes
+ ignoredRouteFiles: ["**/*"],
+ routes: async defineRoutes =>
+ flatRoutes("routes", defineRoutes, {
+ // allow colocating route modules with their components
+ ignoredRouteFiles: ["**/lib/*", "**/hooks/*", "**/context/*", "**/ui/*"],
+ }),
+}
+
const pwaOptions: Partial = {
includeAssets: ["favicon.ico"],
srcDir: "app",
@@ -52,7 +66,7 @@ const isStorybook = process.argv[1].includes("storybook")
export default defineConfig({
plugins: [
- !isStorybook && reactRouter(),
+ !isStorybook && remix(remixOptions),
tsconfigPaths(),
wasm() as Plugin,
vitePWA(pwaOptions),