Skip to content

Commit daa188a

Browse files
committed
Update release notes
1 parent 06e639f commit daa188a

File tree

1 file changed

+35
-29
lines changed

1 file changed

+35
-29
lines changed

CHANGELOG.md

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ Date: 2025-08-07
366366

367367
#### Consistently named `loaderData` values
368368

369-
Ever noticed the discrepancies in loader data values handed to you by the framework? Like, we call it `loaderData` in your component props, but then `match.data` in your matches? Yeah, us too (as well as some astute React Router users who raised this in a proposal) 😕. We've added new `loaderData` fields alongside existing `data` fields in a few lingering spots to align with the `loaderData` naming used in the new `Route.*` APIs.
369+
Ever noticed the discrepancies in loader data values handed to you by the framework? Like, we call it `loaderData` in your component props, but then `match.data` in your matches? Yeah, us too - as well as some keen-eyed React Router users who raised this in a proposal. We've added new `loaderData` fields alongside existing `data` fields in a few lingering spots to align with the `loaderData` naming used in the new `Route.*` APIs.
370370

371371
#### Improvements/fixes to the middleware APIs (unstable)
372372

@@ -414,20 +414,26 @@ The biggest set of changes in `7.8.0` are to the `unstable_middleware` API's as
414414

415415
⚠️ _[Unstable features](https://reactrouter.com/community/api-development-strategy#unstable-flags) are not recommended for production use_
416416

417-
- `react-router` - **RSC**: Fix Data Mode issue where routes that return `false` from `shouldRevalidate` would be replaced by an `<Outlet />` ([#14071](https://github.com/remix-run/react-router/pull/14071))
418-
- `react-router` - **Middleware**: Change the `unstable_getContext` signature on `RouterProvider`, `HydratedRouter`, and `unstable_RSCHydratedRouter` so that it returns an `unstable_RouterContextProvider` instance instead of a `Map` used to construct the instance internally ([#14097](https://github.com/remix-run/react-router/pull/14097))
417+
**RSC**
418+
419+
- `react-router` - Fix Data Mode issue where routes that return `false` from `shouldRevalidate` would be replaced by an `<Outlet />` ([#14071](https://github.com/remix-run/react-router/pull/14071))
420+
- `react-router` - Proxy server action side-effect redirects from actions for document and `callServer` requests ([#14131](https://github.com/remix-run/react-router/pull/14131))
421+
422+
**Middleware**
423+
424+
- `react-router` - Change the `unstable_getContext` signature on `RouterProvider`, `HydratedRouter`, and `unstable_RSCHydratedRouter` so that it returns an `unstable_RouterContextProvider` instance instead of a `Map` used to construct the instance internally ([#14097](https://github.com/remix-run/react-router/pull/14097))
419425
- See the [docs](https://reactrouter.com/api/data-routers/createBrowserRouter#optsunstable_getcontext) for more information
420426
- ⚠️ This is a breaking change if you have adopted the `unstable_getContext` prop
421-
- `react-router` - **Middleware**: Run client middleware on client navigations even if no loaders exist ([#14106](https://github.com/remix-run/react-router/pull/14106))
422-
- `react-router` - **Middleware**: Convert internal middleware implementations to use the new `unstable_generateMiddlewareResponse` API ([#14103](https://github.com/remix-run/react-router/pull/14103))
423-
- `react-router` - **Middleware**: Ensure resource route errors go through `handleError` w/middleware enabled ([#14078](https://github.com/remix-run/react-router/pull/14078))
424-
- `react-router` - **Middleware**: Propagate returned `Response` from server middleware if `next` wasn't called ([#14093](https://github.com/remix-run/react-router/pull/14093))
425-
- `react-router` - **Middleware**: Allow server middlewares to return `data()` values which will be converted into a `Response` ([#14093](https://github.com/remix-run/react-router/pull/14093), [#14128](https://github.com/remix-run/react-router/pull/14128))
426-
- `react-router` - **Middleware**: Update middleware error handling so that the `next` function never throws and instead handles any middleware errors at the proper `ErrorBoundary` and returns the `Response` up through the ancestor `next` function ([#14118](https://github.com/remix-run/react-router/pull/14118))
427+
- `react-router` - Run client middleware on client navigations even if no loaders exist ([#14106](https://github.com/remix-run/react-router/pull/14106))
428+
- `react-router` - Convert internal middleware implementations to use the new `unstable_generateMiddlewareResponse` API ([#14103](https://github.com/remix-run/react-router/pull/14103))
429+
- `react-router` - Ensure resource route errors go through `handleError` w/middleware enabled ([#14078](https://github.com/remix-run/react-router/pull/14078))
430+
- `react-router` - Propagate returned `Response` from server middleware if `next` wasn't called ([#14093](https://github.com/remix-run/react-router/pull/14093))
431+
- `react-router` - Allow server middlewares to return `data()` values which will be converted into a `Response` ([#14093](https://github.com/remix-run/react-router/pull/14093), [#14128](https://github.com/remix-run/react-router/pull/14128))
432+
- `react-router` - Update middleware error handling so that the `next` function never throws and instead handles any middleware errors at the proper `ErrorBoundary` and returns the `Response` up through the ancestor `next` function ([#14118](https://github.com/remix-run/react-router/pull/14118))
427433
- See the [error handling docs](https://reactrouter.com/how-to/middleware#next-and-error-handling) for more information
428434
- ⚠️ This changes existing functionality so if you are currently wrapping `next` calls in `try`/`catch` you should be able to remove those
429-
- `react-router` - **Middleware**: When middleware is enabled, make the `context` parameter read-only (`Readonly<unstable_RouterContextProvider>`) so that TypeScript will not allow you to write arbitrary fields to it in loaders, actions, or middleware. ([#14097](https://github.com/remix-run/react-router/pull/14097))
430-
- `react-router` - **Middleware**: Rename and alter the signature/functionality of the `unstable_respond` API in `staticHandler.query`/`staticHandler.queryRoute` ([#14103](https://github.com/remix-run/react-router/pull/14103))
435+
- `react-router` - When middleware is enabled, make the `context` parameter read-only (`Readonly<unstable_RouterContextProvider>`) so that TypeScript will not allow you to write arbitrary fields to it in loaders, actions, or middleware. ([#14097](https://github.com/remix-run/react-router/pull/14097))
436+
- `react-router` - Rename and alter the signature/functionality of the `unstable_respond` API in `staticHandler.query`/`staticHandler.queryRoute` ([#14103](https://github.com/remix-run/react-router/pull/14103))
431437
- This only impacts users using `createStaticHandler()` for manual data loading during non-Framework Mode SSR
432438
- The API has been renamed to `unstable_generateMiddlewareResponse` for clarity
433439
- The main functional change is that instead of running the loaders/actions before calling `unstable_respond` and handing you the result, we now pass a `query`/`queryRoute` function as a parameter and you execute the loaders/actions inside your callback, giving you full access to pre-processing and error handling
@@ -436,26 +442,26 @@ The biggest set of changes in `7.8.0` are to the `unstable_middleware` API's as
436442
- This allows for more advanced usages such as running logic before/after calling `query` and direct error handling of errors thrown from query
437443
- ⚠️ This is a breaking change if you've adopted the `staticHandler` `unstable_respond` API
438444

439-
```tsx
440-
let response = await staticHandler.query(request, {
441-
requestContext: new unstable_RouterContextProvider(),
442-
async unstable_generateMiddlewareResponse(query) {
443-
try {
444-
// At this point we've run middleware top-down so we need to call the
445-
// handlers and generate the Response to bubble back up the middleware
446-
let result = await query(request);
447-
if (isResponse(result)) {
448-
return result; // Redirects, etc.
445+
```tsx
446+
let response = await staticHandler.query(request, {
447+
requestContext: new unstable_RouterContextProvider(),
448+
async unstable_generateMiddlewareResponse(query) {
449+
try {
450+
// At this point we've run middleware top-down so we need to call the
451+
// handlers and generate the Response to bubble back up the middleware
452+
let result = await query(request);
453+
if (isResponse(result)) {
454+
return result; // Redirects, etc.
455+
}
456+
return await generateHtmlResponse(result);
457+
} catch (error: unknown) {
458+
return generateErrorResponse(error);
449459
}
450-
return await generateHtmlResponse(result);
451-
} catch (error: unknown) {
452-
return generateErrorResponse(error);
453-
}
454-
},
455-
});
456-
```
460+
},
461+
});
462+
```
457463

458-
- `@react-router/{architect,cloudflare,express,node}` - **Middleware**: Change the `getLoadContext` signature (`type GetLoadContextFunction`) when `future.unstable_middleware` is enabled so that it returns an `unstable_RouterContextProvider` instance instead of a `Map` used to construct the instance internally ([#14097](https://github.com/remix-run/react-router/pull/14097))
464+
- `@react-router/{architect,cloudflare,express,node}` - Change the `getLoadContext` signature (`type GetLoadContextFunction`) when `future.unstable_middleware` is enabled so that it returns an `unstable_RouterContextProvider` instance instead of a `Map` used to construct the instance internally ([#14097](https://github.com/remix-run/react-router/pull/14097))
459465
- This also removes the `type unstable_InitialContext` export
460466
- See the [middleware `getLoadContext` docs](https://reactrouter.com/how-to/middleware#changes-to-getloadcontextapploadcontext) for more information
461467
- ⚠️ This is a breaking change if you have adopted middleware and are using a custom server with a `getLoadContext` function

0 commit comments

Comments
 (0)