diff --git a/integration/helpers/cloudflare-dev-proxy-template/package.json b/integration/helpers/cloudflare-dev-proxy-template/package.json index 063012112a..f756886cbc 100644 --- a/integration/helpers/cloudflare-dev-proxy-template/package.json +++ b/integration/helpers/cloudflare-dev-proxy-template/package.json @@ -23,8 +23,8 @@ "@react-router/dev": "workspace:*", "@react-router/fs-routes": "workspace:*", "@react-router/remix-routes-option-adapter": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "^19.1.11", + "@types/react-dom": "^19.1.8", "typescript": "^5.1.6", "vite": "^6.1.0", "wrangler": "^4.23.0" diff --git a/integration/helpers/rsc-parcel-framework/app/index.ts b/integration/helpers/rsc-parcel-framework/app/index.ts index 44391bff05..fa2c5b0d29 100644 --- a/integration/helpers/rsc-parcel-framework/app/index.ts +++ b/integration/helpers/rsc-parcel-framework/app/index.ts @@ -1,5 +1,4 @@ import * as React from "react"; -// @ts-expect-error - no types import { renderToReadableStream } from "react-dom/server.edge" assert { env: "react-client" }; import { unstable_routeRSCServerRequest, diff --git a/integration/helpers/rsc-parcel-framework/package.json b/integration/helpers/rsc-parcel-framework/package.json index a17de0ed03..4c64443ec2 100644 --- a/integration/helpers/rsc-parcel-framework/package.json +++ b/integration/helpers/rsc-parcel-framework/package.json @@ -26,8 +26,8 @@ "@types/express": "^5.0.0", "@types/node": "^22.13.1", "@types/parcel-env": "0.0.8", - "@types/react-dom": "^19.0.3", - "@types/react": "^19.0.8", + "@types/react": "^19.1.11", + "@types/react-dom": "^19.1.8", "parcel": "2.15.0", "parcel-config-react-router-experimental": "1.0.25", "typescript": "^5.1.6" diff --git a/integration/helpers/rsc-parcel/package.json b/integration/helpers/rsc-parcel/package.json index 0b5c2eecac..530816eaf0 100644 --- a/integration/helpers/rsc-parcel/package.json +++ b/integration/helpers/rsc-parcel/package.json @@ -24,8 +24,8 @@ "@types/express": "^5.0.0", "@types/node": "^22.13.1", "@types/parcel-env": "0.0.8", - "@types/react-dom": "^19.0.3", - "@types/react": "^19.0.8", + "@types/react": "^19.1.11", + "@types/react-dom": "^19.1.8", "browserify-zlib": "^0.2.0", "buffer": "^5.5.0||^6.0.0", "events": "^3.1.0", diff --git a/integration/helpers/rsc-parcel/src/browser.tsx b/integration/helpers/rsc-parcel/src/browser.tsx index d0c02387d1..30e5453467 100644 --- a/integration/helpers/rsc-parcel/src/browser.tsx +++ b/integration/helpers/rsc-parcel/src/browser.tsx @@ -28,7 +28,6 @@ setServerCallback( // Get and decode the initial server payload createFromReadableStream(getRSCStream()).then((payload: RSCPayload) => { - // @ts-expect-error - on 18 types, requires 19. startTransition(async () => { const formState = payload.type === "render" ? await payload.formState : undefined; diff --git a/integration/helpers/rsc-parcel/src/prerender.tsx b/integration/helpers/rsc-parcel/src/prerender.tsx index a56e426254..4de1a82ae5 100644 --- a/integration/helpers/rsc-parcel/src/prerender.tsx +++ b/integration/helpers/rsc-parcel/src/prerender.tsx @@ -1,4 +1,3 @@ -// @ts-expect-error - no types for this yet import { renderToReadableStream as renderHTMLToReadableStream } from "react-dom/server.edge"; import { unstable_routeRSCServerRequest as routeRSCServerRequest, @@ -29,6 +28,7 @@ export async function prerender( , { bootstrapScriptContent, + // @ts-expect-error - no types for this yet formState, }, ); diff --git a/integration/helpers/rsc-vite-framework/package.json b/integration/helpers/rsc-vite-framework/package.json index e9a983b046..749e07ee6d 100644 --- a/integration/helpers/rsc-vite-framework/package.json +++ b/integration/helpers/rsc-vite-framework/package.json @@ -16,8 +16,8 @@ "@react-router/fs-routes": "workspace:*", "@types/express": "^5.0.0", "@types/node": "^22.13.1", - "@types/react": "^19.1.8", - "@types/react-dom": "^19.1.6", + "@types/react": "^19.1.11", + "@types/react-dom": "^19.1.8", "@vanilla-extract/css": "^1.17.4", "@vanilla-extract/vite-plugin": "^5.1.1", "@vitejs/plugin-react": "^4.5.2", diff --git a/integration/helpers/rsc-vite/package.json b/integration/helpers/rsc-vite/package.json index 36fa88cc8b..a62e5f3ceb 100644 --- a/integration/helpers/rsc-vite/package.json +++ b/integration/helpers/rsc-vite/package.json @@ -10,12 +10,12 @@ "typecheck": "tsc" }, "devDependencies": { - "@vitejs/plugin-rsc": "0.4.24", "@types/express": "^5.0.0", "@types/node": "^22.13.1", - "@types/react": "^19.1.8", - "@types/react-dom": "^19.1.6", + "@types/react": "^19.1.11", + "@types/react-dom": "^19.1.8", "@vitejs/plugin-react": "^4.5.2", + "@vitejs/plugin-rsc": "0.4.24", "typescript": "^5.1.6", "vite": "^6.2.0" }, diff --git a/integration/helpers/rsc-vite/src/entry.ssr.tsx b/integration/helpers/rsc-vite/src/entry.ssr.tsx index 9301988a6d..ead347e933 100644 --- a/integration/helpers/rsc-vite/src/entry.ssr.tsx +++ b/integration/helpers/rsc-vite/src/entry.ssr.tsx @@ -1,5 +1,4 @@ import { createFromReadableStream } from "@vitejs/plugin-rsc/ssr"; -// @ts-expect-error import * as ReactDomServer from "react-dom/server.edge"; import { unstable_RSCStaticRouter as RSCStaticRouter, diff --git a/integration/helpers/vite-5-template/package.json b/integration/helpers/vite-5-template/package.json index 859249cab7..e29fad5e4f 100644 --- a/integration/helpers/vite-5-template/package.json +++ b/integration/helpers/vite-5-template/package.json @@ -27,8 +27,8 @@ "@react-router/dev": "workspace:*", "@react-router/fs-routes": "workspace:*", "@react-router/remix-routes-option-adapter": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "^19.1.11", + "@types/react-dom": "^19.1.8", "eslint": "^8.38.0", "typescript": "^5.1.6", "vite": "^5.1.0", diff --git a/integration/helpers/vite-6-template/package.json b/integration/helpers/vite-6-template/package.json index 14cb1cb07f..3f2cd1502f 100644 --- a/integration/helpers/vite-6-template/package.json +++ b/integration/helpers/vite-6-template/package.json @@ -27,8 +27,8 @@ "@react-router/dev": "workspace:*", "@react-router/fs-routes": "workspace:*", "@react-router/remix-routes-option-adapter": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "^19.1.11", + "@types/react-dom": "^19.1.8", "eslint": "^8.38.0", "typescript": "^5.1.6", "vite": "^6.1.0", diff --git a/integration/helpers/vite-7-beta-template/package.json b/integration/helpers/vite-7-beta-template/package.json index f0b9b5ce3f..e3aa6dde92 100644 --- a/integration/helpers/vite-7-beta-template/package.json +++ b/integration/helpers/vite-7-beta-template/package.json @@ -27,8 +27,8 @@ "@react-router/dev": "workspace:*", "@react-router/fs-routes": "workspace:*", "@react-router/remix-routes-option-adapter": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "^19.1.11", + "@types/react-dom": "^19.1.8", "eslint": "^8.38.0", "typescript": "^5.1.6", "vite": "7.0.0-beta.0", diff --git a/integration/helpers/vite-plugin-cloudflare-template/package.json b/integration/helpers/vite-plugin-cloudflare-template/package.json index 7d9afd57d2..9cc779e75f 100644 --- a/integration/helpers/vite-plugin-cloudflare-template/package.json +++ b/integration/helpers/vite-plugin-cloudflare-template/package.json @@ -23,8 +23,8 @@ "@react-router/dev": "workspace:*", "@react-router/fs-routes": "workspace:*", "@types/node": "^20.0.0", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "^19.1.11", + "@types/react-dom": "^19.1.8", "eslint": "^8.38.0", "typescript": "^5.1.6", "vite": "^6.1.0", diff --git a/integration/helpers/vite-rolldown-template/package.json b/integration/helpers/vite-rolldown-template/package.json index d02d6f0012..3d467c70cd 100644 --- a/integration/helpers/vite-rolldown-template/package.json +++ b/integration/helpers/vite-rolldown-template/package.json @@ -27,8 +27,8 @@ "@react-router/dev": "workspace:*", "@react-router/fs-routes": "workspace:*", "@react-router/remix-routes-option-adapter": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "^19.1.11", + "@types/react-dom": "^19.1.8", "cross-env": "^7.0.3", "eslint": "^8.38.0", "typescript": "^5.1.6", diff --git a/package.json b/package.json index e3d3ab95af..5b4884ccff 100644 --- a/package.json +++ b/package.json @@ -42,9 +42,6 @@ }, "packageManager": "pnpm@9.10.0", "resolutions": { - "@types/react": "^18.2.18", - "@types/react-dom": "^18.2.7", - "@types/react-test-renderer": "^18.3.1", "jsdom": "22.1.0" }, "dependencies": { @@ -59,9 +56,9 @@ "@remix-run/changelog-github": "^0.0.5", "@types/jest": "^29.5.4", "@types/jsdom": "^21.1.1", - "@types/react": "^19.0.12", - "@types/react-dom": "^19.0.4", - "@types/react-test-renderer": "^19.0.0", + "@types/react": "^19.1.11", + "@types/react-dom": "^19.1.8", + "@types/react-test-renderer": "^19.1.0", "@typescript-eslint/eslint-plugin": "^7.5.0", "@typescript-eslint/parser": "^7.5.0", "babel-jest": "^29.7.0", diff --git a/packages/react-router/lib/components.tsx b/packages/react-router/lib/components.tsx index 397ce2cb9e..d76365e018 100644 --- a/packages/react-router/lib/components.tsx +++ b/packages/react-router/lib/components.tsx @@ -270,7 +270,7 @@ export interface RouterProviderProps { * - If you are rendering in a non-DOM environment, you can import * `RouterProvider` from `react-router` and ignore this prop */ - flushSync?: (fn: () => unknown) => undefined; + flushSync?: (fn: () => R) => R; /** * An error handler function that will be called for any loader/action/render * errors that are encountered in your application. This is useful for @@ -654,7 +654,7 @@ export function MemoryRouter({ initialEntries, initialIndex, }: MemoryRouterProps): React.ReactElement { - let historyRef = React.useRef(); + let historyRef = React.useRef(undefined); if (historyRef.current == null) { historyRef.current = createMemoryHistory({ initialEntries, @@ -1541,8 +1541,8 @@ export function createRoutesFromChildren( ): RouteObject[] { let routes: RouteObject[] = []; - React.Children.forEach(children, (element, index) => { - if (!React.isValidElement(element)) { + React.Children.forEach(children, (element, index) => { + if (!React.isValidElement(element)) { // Ignore non-elements. This allows people to more easily inline // conditionals in their route config. return; diff --git a/packages/react-router/lib/dom/lib.tsx b/packages/react-router/lib/dom/lib.tsx index c3171516f6..a13d166edb 100644 --- a/packages/react-router/lib/dom/lib.tsx +++ b/packages/react-router/lib/dom/lib.tsx @@ -904,7 +904,7 @@ export function BrowserRouter({ children, window, }: BrowserRouterProps) { - let historyRef = React.useRef(); + let historyRef = React.useRef(undefined); if (historyRef.current == null) { historyRef.current = createBrowserHistory({ window, v5Compat: true }); } @@ -969,7 +969,7 @@ export interface HashRouterProps { * for client-side routing. */ export function HashRouter({ basename, children, window }: HashRouterProps) { - let historyRef = React.useRef(); + let historyRef = React.useRef(undefined); if (historyRef.current == null) { historyRef.current = createHashHistory({ window, v5Compat: true }); } diff --git a/packages/react-router/lib/dom/ssr/components.tsx b/packages/react-router/lib/dom/ssr/components.tsx index 85271fecf8..6fc8ae6f83 100644 --- a/packages/react-router/lib/dom/ssr/components.tsx +++ b/packages/react-router/lib/dom/ssr/components.tsx @@ -104,7 +104,7 @@ interface PrefetchHandlers { export function usePrefetchBehavior( prefetch: PrefetchBehavior, theirElementProps: PrefetchHandlers, -): [boolean, React.RefObject, PrefetchHandlers] { +): [boolean, React.RefObject, PrefetchHandlers] { let frameworkContext = React.useContext(FrameworkContext); let [maybePrefetch, setMaybePrefetch] = React.useState(false); let [shouldPrefetch, setShouldPrefetch] = React.useState(false); diff --git a/packages/react-router/lib/dom/ssr/routes-test-stub.tsx b/packages/react-router/lib/dom/ssr/routes-test-stub.tsx index a41dd8612c..485fcd0a20 100644 --- a/packages/react-router/lib/dom/ssr/routes-test-stub.tsx +++ b/packages/react-router/lib/dom/ssr/routes-test-stub.tsx @@ -125,8 +125,9 @@ export function createRoutesStub( hydrationData, future, }: RoutesTestStubProps) { - let routerRef = React.useRef>(); - let frameworkContextRef = React.useRef(); + let routerRef = + React.useRef>(undefined); + let frameworkContextRef = React.useRef(undefined); if (routerRef.current == null) { frameworkContextRef.current = { diff --git a/packages/react-router/lib/router/router.ts b/packages/react-router/lib/router/router.ts index 14f6fbad53..1424b642b9 100644 --- a/packages/react-router/lib/router/router.ts +++ b/packages/react-router/lib/router/router.ts @@ -3557,7 +3557,7 @@ export function createStaticHandler( skipLoaderErrorBubbling, skipRevalidation, dataStrategy, - generateMiddlewareResponse: generateMiddlewareResponse, + generateMiddlewareResponse, }: Parameters[1] = {}, ): Promise { let url = new URL(request.url); @@ -3831,7 +3831,7 @@ export function createStaticHandler( routeId, requestContext, dataStrategy, - generateMiddlewareResponse: generateMiddlewareResponse, + generateMiddlewareResponse, }: Parameters[1] = {}, ): Promise { let url = new URL(request.url); diff --git a/packages/react-router/lib/rsc/browser.tsx b/packages/react-router/lib/rsc/browser.tsx index 1d15916633..52bd1f9844 100644 --- a/packages/react-router/lib/rsc/browser.tsx +++ b/packages/react-router/lib/rsc/browser.tsx @@ -154,7 +154,7 @@ export function createCallServer({ if (payload.rerender) { React.startTransition( - // @ts-expect-error - We have old react types that don't know this can be async + // async () => { const rerender = await payload.rerender; if (!rerender) return; diff --git a/playground/framework-express/package.json b/playground/framework-express/package.json index c0288d54a4..3ea7d03c6e 100644 --- a/playground/framework-express/package.json +++ b/playground/framework-express/package.json @@ -26,8 +26,8 @@ "@types/compression": "^1.7.5", "@types/express": "^4.17.20", "@types/morgan": "^1.9.9", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "^19.1.11", + "@types/react-dom": "^19.1.8", "cross-env": "^7.0.3", "typescript": "^5.1.6", "vite": "^6.1.0", diff --git a/playground/framework-rolldown-vite/package.json b/playground/framework-rolldown-vite/package.json index 32d5acafd8..c0ef81c373 100644 --- a/playground/framework-rolldown-vite/package.json +++ b/playground/framework-rolldown-vite/package.json @@ -21,8 +21,8 @@ }, "devDependencies": { "@react-router/dev": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "^19.1.11", + "@types/react-dom": "^19.1.8", "typescript": "^5.1.6", "vite": "npm:rolldown-vite@6.3.0-beta.3", "vite-tsconfig-paths": "^4.2.1" diff --git a/playground/framework-spa/package.json b/playground/framework-spa/package.json index fc3661c9f2..aa77b0f62e 100644 --- a/playground/framework-spa/package.json +++ b/playground/framework-spa/package.json @@ -19,8 +19,8 @@ }, "devDependencies": { "@react-router/dev": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "^19.1.11", + "@types/react-dom": "^19.1.8", "typescript": "^5.1.6", "vite": "^6.1.0", "vite-tsconfig-paths": "^4.2.1" diff --git a/playground/framework-vite-5/package.json b/playground/framework-vite-5/package.json index b63e03428d..fce4e6b1f5 100644 --- a/playground/framework-vite-5/package.json +++ b/playground/framework-vite-5/package.json @@ -20,8 +20,8 @@ }, "devDependencies": { "@react-router/dev": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "^19.1.11", + "@types/react-dom": "^19.1.8", "typescript": "^5.1.6", "vite": "^5.1.0", "vite-tsconfig-paths": "^4.2.1" diff --git a/playground/framework-vite-7-beta/package.json b/playground/framework-vite-7-beta/package.json index 4a72eb7f94..2cfd57ec1b 100644 --- a/playground/framework-vite-7-beta/package.json +++ b/playground/framework-vite-7-beta/package.json @@ -20,8 +20,8 @@ }, "devDependencies": { "@react-router/dev": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "^19.1.11", + "@types/react-dom": "^19.1.8", "typescript": "^5.1.6", "vite": "7.0.0-beta.0", "vite-tsconfig-paths": "^4.2.1" diff --git a/playground/framework/package.json b/playground/framework/package.json index c24feaa33e..6d8d181579 100644 --- a/playground/framework/package.json +++ b/playground/framework/package.json @@ -20,8 +20,8 @@ }, "devDependencies": { "@react-router/dev": "workspace:*", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "^19.1.11", + "@types/react-dom": "^19.1.8", "typescript": "^5.1.6", "vite": "^6.1.0", "vite-tsconfig-paths": "^4.2.1" diff --git a/playground/middleware/package.json b/playground/middleware/package.json index 1a4777c858..e2baf44648 100644 --- a/playground/middleware/package.json +++ b/playground/middleware/package.json @@ -30,8 +30,8 @@ "@types/express-serve-static-core": "^5.0.6", "@types/morgan": "^1.9.9", "@types/node": "^20.0.0", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", + "@types/react": "^19.1.11", + "@types/react-dom": "^19.1.8", "tsx": "^4.19.3", "typescript": "^5.1.6", "vite": "^6.0.0", diff --git a/playground/rsc-parcel-framework/app/routes/_index/route.tsx b/playground/rsc-parcel-framework/app/routes/_index/route.tsx index 1cb58e8142..dbfd258bb8 100644 --- a/playground/rsc-parcel-framework/app/routes/_index/route.tsx +++ b/playground/rsc-parcel-framework/app/routes/_index/route.tsx @@ -12,7 +12,6 @@ export function ServerComponent({ loaderData }: Route.ComponentProps) {

Home

This is the home page.

loaderData: {loaderData}

- {/* @ts-expect-error React types for the repo are set to v18 */}
diff --git a/playground/rsc-parcel-framework/app/routes/optimistic/form.tsx b/playground/rsc-parcel-framework/app/routes/optimistic/form.tsx index b2816110e5..8b0b859955 100644 --- a/playground/rsc-parcel-framework/app/routes/optimistic/form.tsx +++ b/playground/rsc-parcel-framework/app/routes/optimistic/form.tsx @@ -1,7 +1,6 @@ "use client"; import { - // @ts-expect-error React types for the repo are set to v18 useOptimistic, } from "react"; import { useHydrated } from "remix-utils/use-hydrated"; @@ -17,13 +16,11 @@ export function ToggleLikedForm({ const [optimisticLiked, setOptimisticLiked] = useOptimistic(liked); const toggleLikedActionOptimistic = async () => { - // @ts-expect-error React types for the repo are set to v18 setOptimisticLiked((liked) => !liked); await toggleLikedAction(); }; return ( - // @ts-expect-error React types for the repo are set to v18
diff --git a/playground/rsc-vite-framework/app/routes/optimistic/form.tsx b/playground/rsc-vite-framework/app/routes/optimistic/form.tsx index b2816110e5..8b0b859955 100644 --- a/playground/rsc-vite-framework/app/routes/optimistic/form.tsx +++ b/playground/rsc-vite-framework/app/routes/optimistic/form.tsx @@ -1,7 +1,6 @@ "use client"; import { - // @ts-expect-error React types for the repo are set to v18 useOptimistic, } from "react"; import { useHydrated } from "remix-utils/use-hydrated"; @@ -17,13 +16,11 @@ export function ToggleLikedForm({ const [optimisticLiked, setOptimisticLiked] = useOptimistic(liked); const toggleLikedActionOptimistic = async () => { - // @ts-expect-error React types for the repo are set to v18 setOptimisticLiked((liked) => !liked); await toggleLikedAction(); }; return ( - // @ts-expect-error React types for the repo are set to v18