Skip to content

Conversation

@renovate
Copy link
Contributor

@renovate renovate bot commented Sep 24, 2025

This PR contains the following updates:

Package Change Age Confidence
@react-router/dev (source) 7.9.1 -> 7.9.5 age confidence
@react-router/serve (source) 7.9.1 -> 7.9.5 age confidence
react-router (source) 7.9.1 -> 7.9.5 age confidence

Release Notes

remix-run/react-router (@​react-router/dev)

v7.9.5

Compare Source

Patch Changes
  • Introduce a prerender.unstable_concurrency option, to support running the prerendering concurrently, potentially speeding up the build. (#​14380)
  • Move RSCHydratedRouter and utils to /dom export. (#​14457)
  • Ensure route navigation doesn't remove CSS link elements used by dynamic imports (#​14463)
  • Typegen: only register route module types for routes within the app directory (#​14439)
  • Updated dependencies:

v7.9.4

Compare Source

Patch Changes
  • Update valibot dependency to ^1.1.0 (#​14379)

  • New (unstable) useRoute hook for accessing data from specific routes (#​14407)

    For example, let's say you have an admin route somewhere in your app and you want any child routes of admin to all have access to the loaderData and actionData from admin.

    // app/routes/admin.tsx
    import { Outlet } from "react-router";
    
    export const loader = () => ({ message: "Hello, loader!" });
    
    export const action = () => ({ count: 1 });
    
    export default function Component() {
      return (
        <div>
          {/* ... */}
          <Outlet />
          {/* ... */}
        </div>
      );
    }

    You might even want to create a reusable widget that all of the routes nested under admin could use:

    import { unstable_useRoute as useRoute } from "react-router";
    
    export function AdminWidget() {
      // How to get `message` and `count` from `admin` route?
    }

    In framework mode, useRoute knows all your app's routes and gives you TS errors when invalid route IDs are passed in:

    export function AdminWidget() {
      const admin = useRoute("routes/dmin");
      //                      ^^^^^^^^^^^
    }

    useRoute returns undefined if the route is not part of the current page:

    export function AdminWidget() {
      const admin = useRoute("routes/admin");
      if (!admin) {
        throw new Error(`AdminWidget used outside of "routes/admin"`);
      }
    }

    Note: the root route is the exception since it is guaranteed to be part of the current page.
    As a result, useRoute never returns undefined for root.

    loaderData and actionData are marked as optional since they could be accessed before the action is triggered or after the loader threw an error:

    export function AdminWidget() {
      const admin = useRoute("routes/admin");
      if (!admin) {
        throw new Error(`AdminWidget used outside of "routes/admin"`);
      }
      const { loaderData, actionData } = admin;
      console.log(loaderData);
      //          ^? { message: string } | undefined
      console.log(actionData);
      //          ^? { count: number } | undefined
    }

    If instead of a specific route, you wanted access to the current route's loaderData and actionData, you can call useRoute without arguments:

    export function AdminWidget() {
      const currentRoute = useRoute();
      currentRoute.loaderData;
      currentRoute.actionData;
    }

    This usage is equivalent to calling useLoaderData and useActionData, but consolidates all route data access into one hook: useRoute.

    Note: when calling useRoute() (without a route ID), TS has no way to know which route is the current route.
    As a result, loaderData and actionData are typed as unknown.
    If you want more type-safety, you can either narrow the type yourself with something like zod or you can refactor your app to pass down typed props to your AdminWidget:

    export function AdminWidget({
      message,
      count,
    }: {
      message: string;
      count: number;
    }) {
      /* ... */
    }
  • Updated dependencies:

v7.9.3

Compare Source

Patch Changes

v7.9.2

Compare Source

Patch Changes
  • Fix preset future flags being ignored during config resolution (#​14369)

    Fixes a bug where future flags defined by presets were completely ignored. The config resolution was incorrectly reading from reactRouterUserConfig.future instead of the merged userAndPresetConfigs.future, causing all preset-defined future flags to be lost.

    This fix ensures presets can properly enable experimental features as intended by the preset system design.

  • Add unstable support for RSC Framework Mode (#​14336)

  • Switch internal vite plugin Response logic to use @remix-run/node-fetch-server (#​13927)

  • Updated dependencies:

remix-run/react-router (@​react-router/serve)

v7.9.5

Compare Source

Patch Changes

v7.9.4

Compare Source

Patch Changes

v7.9.3

Compare Source

Patch Changes

v7.9.2

Compare Source

Patch Changes
remix-run/react-router (react-router)

v7.9.5

Compare Source

Patch Changes
  • Move RSCHydratedRouter and utils to /dom export. (#​14457)

  • useRoute: return type-safe handle (#​14462)

    For example:

    // app/routes/admin.tsx
    const handle = { hello: "world" };
    // app/routes/some-other-route.tsx
    export default function Component() {
      const admin = useRoute("routes/admin");
      if (!admin) throw new Error("Not nested within 'routes/admin'");
      console.log(admin.handle);
      //                ^? { hello: string }
    }
  • Ensure action handlers run for routes with middleware even if no loader is present (#​14443)

  • Add unstable_instrumentations API to allow users to add observablity to their apps by instrumenting route loaders, actions, middlewares, lazy, as well as server-side request handlers and client side navigations/fetches (#​14412)

    • Framework Mode:
      • entry.server.tsx: export const unstable_instrumentations = [...]
      • entry.client.tsx: <HydratedRouter unstable_instrumentations={[...]} />
    • Data Mode
      • createBrowserRouter(routes, { unstable_instrumentations: [...] })

    This also adds a new unstable_pattern parameter to loaders/actions/middleware which contains the un-interpolated route pattern (i.e., /blog/:slug) which is useful for aggregating performance metrics by route

v7.9.4

Compare Source

Patch Changes
  • handle external redirects in from server actions (#​14400)

  • New (unstable) useRoute hook for accessing data from specific routes (#​14407)

    For example, let's say you have an admin route somewhere in your app and you want any child routes of admin to all have access to the loaderData and actionData from admin.

    // app/routes/admin.tsx
    import { Outlet } from "react-router";
    
    export const loader = () => ({ message: "Hello, loader!" });
    
    export const action = () => ({ count: 1 });
    
    export default function Component() {
      return (
        <div>
          {/* ... */}
          <Outlet />
          {/* ... */}
        </div>
      );
    }

    You might even want to create a reusable widget that all of the routes nested under admin could use:

    import { unstable_useRoute as useRoute } from "react-router";
    
    export function AdminWidget() {
      // How to get `message` and `count` from `admin` route?
    }

    In framework mode, useRoute knows all your app's routes and gives you TS errors when invalid route IDs are passed in:

    export function AdminWidget() {
      const admin = useRoute("routes/dmin");
      //                      ^^^^^^^^^^^
    }

    useRoute returns undefined if the route is not part of the current page:

    export function AdminWidget() {
      const admin = useRoute("routes/admin");
      if (!admin) {
        throw new Error(`AdminWidget used outside of "routes/admin"`);
      }
    }

    Note: the root route is the exception since it is guaranteed to be part of the current page.
    As a result, useRoute never returns undefined for root.

    loaderData and actionData are marked as optional since they could be accessed before the action is triggered or after the loader threw an error:

    export function AdminWidget() {
      const admin = useRoute("routes/admin");
      if (!admin) {
        throw new Error(`AdminWidget used outside of "routes/admin"`);
      }
      const { loaderData, actionData } = admin;
      console.log(loaderData);
      //          ^? { message: string } | undefined
      console.log(actionData);
      //          ^? { count: number } | undefined
    }

    If instead of a specific route, you wanted access to the current route's loaderData and actionData, you can call useRoute without arguments:

    export function AdminWidget() {
      const currentRoute = useRoute();
      currentRoute.loaderData;
      currentRoute.actionData;
    }

    This usage is equivalent to calling useLoaderData and useActionData, but consolidates all route data access into one hook: useRoute.

    Note: when calling useRoute() (without a route ID), TS has no way to know which route is the current route.
    As a result, loaderData and actionData are typed as unknown.
    If you want more type-safety, you can either narrow the type yourself with something like zod or you can refactor your app to pass down typed props to your AdminWidget:

    export function AdminWidget({
      message,
      count,
    }: {
      message: string;
      count: number;
    }) {
      /* ... */
    }

v7.9.3

Compare Source

Patch Changes
  • Do not try to use turbo-stream to decode CDN errors that never reached the server (#​14385)

    • We used to do this but lost this check with the adoption of single fetch
  • Fix Data Mode regression causing a 404 during initial load in when middleware exists without any loader functions (#​14393)

v7.9.2

Compare Source

Patch Changes
    • Update client-side router to run client middleware on initial load even if no loaders exist (#​14348)
    • Update createRoutesStub to run route middleware
      • You will need to set the <RoutesStub future={{ v8_middleware: true }} /> flag to enable the proper context type
  • Update Lazy Route Discovery manifest requests to use a singular comma-separated paths query param instead of repeated p query params (#​14321)

    • This is because Cloudflare has a hard limit of 100 URL search param key/value pairs when used as a key for caching purposes
    • If more that 100 paths were included, the cache key would be incomplete and could produce false-positive cache hits
  • [UNSTABLE] Add fetcher.unstable_reset() API (#​14206)

  • Made useOutlet element reference have stable identity in-between route chages (#​13382)

  • feat: enable full transition support for the rsc router (#​14362)

  • In RSC Data Mode, handle SSR'd client errors and re-try in the browser (#​14342)

  • Support middleware prop on <Route> for usage with a data router via createRoutesFromElements (#​14357)

  • Handle encoded question mark and hash characters in ancestor splat routes (#​14249)

  • Fail gracefully on manifest version mismatch logic if sessionStorage access is blocked (#​14335)


Configuration

📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about these updates again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate renovate bot force-pushed the renovate/react-router-monorepo branch from a103245 to efb5c11 Compare September 26, 2025 22:00
@renovate renovate bot changed the title Update react-router monorepo to v7.9.2 Update react-router monorepo to v7.9.3 Sep 26, 2025
@renovate renovate bot force-pushed the renovate/react-router-monorepo branch from efb5c11 to 0781256 Compare October 8, 2025 18:13
@renovate renovate bot changed the title Update react-router monorepo to v7.9.3 Update react-router monorepo to v7.9.4 Oct 8, 2025
@renovate renovate bot force-pushed the renovate/react-router-monorepo branch from 0781256 to ed91542 Compare October 29, 2025 22:51
@renovate renovate bot changed the title Update react-router monorepo to v7.9.4 Update react-router monorepo to v7.9.5 Oct 29, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant