Update dependency react-router-dom to v7.18.1 #8

Open
renovate-bot wants to merge 1 commit from renovate/react-router-dom-7.x-lockfile into main
Collaborator

This PR contains the following updates:

Package Type Update Change
react-router-dom (source) dependencies minor 7.14.27.18.1

Release Notes

remix-run/react-router (react-router-dom)

v7.18.1

Compare Source

v7.18.0

Compare Source

Date: 2026-06-16

What's Changed
CSRF Check Logic Fix

We made a bug fix in our underlying CSRF checks in this release that may be a "breaking bug fix" for some users deployed behind a reverse proxy. The CSRF check now checks directly against the host in the request url provided, instead of looking directly at HTTP headers which is an adapter concern. If your adapter is not setting the expected host in the request URL, you may need to add the new internal host to your allowedActionOrigins config. This is most likely to occur in @react-router/serve apps or @react-router/express apps without the trust proxy setting enabled. We recommend testing this against application mutation requests as part of your upgrade.

Minor Changes
  • @react-router/architect - Add a useRequestContextDomainName option to createRequestHandler to derive request URL hosts from the API Gateway request context (#​15185)
    • This flag will become the default behavior in v8, so it is recommended to adopt to prepare for and to v8 better align with your deployment architecture and rely less on manual header parsing in the adapter
    • See the docs for more information
Patch Changes
  • react-router - Fix server handler prerender responses when using ssr: false and future.v8_trailingSlashAwareDataRequests: true (#​15173)
    • Avoids false positive "SPA Mode" detection when serving prerendered paths
  • react-router - Use the ServerRouter nonce for nonce-aware SSR components when they don't provide their own value so strict CSP pages can load them (#​15170)
  • react-router - Use turbo-stream to serialize and deserialize Framework Mode hydration errors (#​15175)
  • react-router - Optimize route matching by extending precomputed route branches to include matchers (#​15186)
  • react-router - Use the constructed request URL host instead of header checks when validating action request origins in the CSRF check (#​15185)
  • react-router - Remove the un-documented custom error serialization logic from Data Mode SSR built-in hydration flows (#​15175)
  • react-router - Validate protocols in RSC render redirects (#​15177)
  • react-router - Consolidate url normalization logic and better handle mixed slashes (#​15176)
  • @react-router/dev - Pass Vite server.watch config to child compiler in development mode. (#​15178)
  • @react-router/dev - Ignore external Vite server environments in Framework Mode build hooks (#​14883)
    • When future.v8_viteEnvironmentApi is enabled, React Router previously treated any non-client Vite environment as its own server build
    • This caused issues with integrations like Nitro, where plugins can register additional environments
    • Framework Mode build hooks now ignore external server environments and only process the app's own server build
  • @react-router/express - Adjust express adapter host computation (#​15185)
    • read port from x-forwarded-host based on trust proxy setting
    • handle invalid hostname characters

Full Changelog: v7.17.0...v7.18.0

v7.17.0

Compare Source

Date: 2026-06-04

Minor Changes
  • react-router - Ship a subset of the official documentation inside the react-router package (#​15121)
    • Markdown docs are now available in node_modules/react-router/docs, letting AI coding agents and the React Router agent skills read official docs locally
    • Excludes auto-generated API docs (api/), community/ content, and tutorials (tutorials/)
Patch Changes
  • @react-router/dev - Fix future flag warning URLs and only log each future flag warning one time (#​15138)
Unstable Changes

⚠️ Unstable features are not recommended for production use

  • @react-router/dev - Prevent RSC route module server exports from being scanned by the client dependency optimizer when future.unstable_optimizeDeps is enabled. (#​15005)

Full Changelog: v7.16.0...v7.17.0

v7.16.0

Compare Source

Date: 2026-05-28

Minor Changes
  • react-router - Stabilize future.unstable_trailingSlashAwareDataRequests as future.v8_trailingSlashAwareDataRequests (#​15098)

  • @react-router/dev - Stabilize future.unstable_trailingSlashAwareDataRequests as future.v8_trailingSlashAwareDataRequests (#​15098)

    • The unstable flag is no longer supported and will error during config resolution
  • @react-router/dev - Log future flag warnings for upcoming React Router v8 flags (#​15029)

    • v8_middleware, v8_splitRouteModules, v8_viteEnvironmentApi, v8_passThroughRequests, v8_trailingSlashAwareDataRequests
Patch Changes
  • react-router - Disable manifest path when lazy route dicovery is disabled (#​15068)

  • react-router - Fix browser URL creation to use the configured history window instead of the global window. (#​15066)

    • Pass the history/router window through to createBrowserURLImpl so custom window contexts keep the correct URL origin.
  • react-router - Fix useNavigation() return type to preserve discriminated union across navigation states (#​15095)

  • react-router - Widen MetaDescriptor script:ld+json type from LdJsonObject to LdJsonObject | LdJsonObject[] to permit multiple JSON-LD schemas in a single <script type="application/ld+json"> tag emitted by <Meta /> (#​15082)

  • react-router-dom - Remove stale/invalid unpkg field from package.json. This was removed from other packages with the release of v7 but missed in the react-router-dom re-export package (#​15075)

  • @react-router/express - Ignore writes after Express responses close (#​15107)

    • Avoid surfacing client disconnects as adapter errors when the response stream has already been destroyed or ended.
  • @react-router/node - Honor Node writable backpressure in writeReadableStreamToWritable and writeAsyncIterableToWritable (#​15071)

    • Await 'drain' when writable.write() returns false instead of letting chunks accumulate in the writable's internal buffer.
    • Reject (rather than hang) if the writable errors or closes mid-stream.
  • @react-router/serve - Normalize assetsBuildDirectory path separators in react-router-serve so Windows-built server artifacts can serve /assets/* correctly when run on Linux. (#​14982)

Full Changelog: v7.15.1...v7.16.0

v7.15.1

Compare Source

Date: 2026-05-14

What's New
useRouterState (unstable)

Following our Less is More design goal, this release includes a new unstable_useRouterState() hook (Framework + Data Mode) that consolidates access to active and pending router states (RFC, Roadmap Issue).

This should allow you to consolidate usages of a bunch of different hooks which will likely be marked deprecated later on in v8 and potentially removed in an eventual v9:

let { active, pending } = unstable_useRouterState();

// Active is always populated with the current location
active.location; // replaces `useLocation()`
active.searchParams; // replaces `useSearchParams()[0]`
active.params; // replaces `useParams()`
active.matches; // replaces `useMatches()`
active.type; // replaces `useNavigationType()`

// Pending is only populated during a navigation
pending.location; // replaces `useNavigation().location`
pending.searchParams; // equivalent to `new URLSearchParams(useNavigation().search)`
pending.params; // Not directly accessible today
pending.matches; // Not directly accessible today
pending.type; // Not directly accessible today
pending.state; // replaces `useNavigation().state`
pending.formMethod; // replaces useNavigation().formMethod
pending.formAction; // replaces useNavigation().formAction
pending.formEncType; // replaces useNavigation().formEncType
pending.formData; // replaces useNavigation().formData
pending.json; // replaces useNavigation().json
pending.text; // replaces useNavigation().text
Patch Changes
  • react-router - Memoize useFetchers to return a stable identity and only change if fetchers changed (#​15028)
  • react-router - Update router to operate on fetcher Maps in an immutable manner to avoid delayed React renders from potentially reading an updated but not yet committed Map. This could result in brief flickers in some fetcher-driven optimistic UI scenarios (#​15028)
  • react-router - Fix serverLoader() returning stale SSR data when a client navigation aborts pending hydration before the hydration clientLoader resolves (#​15022)
  • react-router - Fix RouterProvider onError callback not being called for synchronous initial loader errors in SPA mode (#​15039) (#​14942)
  • react-router - Internal refactor to consolidate mutation request detection through shared utility (#​15033)
  • @react-router/dev - Fix basename conflicting with app directory name when Vite base is set (#​15027)
    • When the Vite base config and React Router basename both match the app directory name (e.g. base: "/app/", basename: "/app/"), Vite would strip the base prefix from server-build virtual module import paths, causing "Failed to load url /root.tsx" errors
    • The fix uses /@&#8203;fs/ absolute paths for those imports to bypass Vite's base-stripping logic
Unstable Changes

⚠️ Unstable features are not recommended for production use

  • react-router - Add a new unstable_useRouterState() hook that consolidates access to active and pending router states (RFC: #​12358) (#​15017)
    • Data/Framework/RSC only — throws when used without a data router

Full Changelog: v7.15.0...v7.15.1

v7.15.0

Compare Source

Date: 2026-05-05

What's Changed
Stabilizations

We've stabilized a bunch of APIs in this release in preparation for a React Router v8 release hopefully in the next month or two. These flag/prop renames are breaking changes if you've already opted into the unstable APIs so please make sure you make the appropriate changes if so.

  • future.unstable_passThroughRequestsfuture.v8_passThroughRequests
  • future.unstable_subResourceIntegrity → top-level config.subResourceIntegrity
  • prerender.unstable_concurrencyprerender.concurrency
  • unstable_urlurl (loader, action, middleware, instrumentation args)
  • unstable_instrumentationsinstrumentations
    • Plus associated types (ServerInstrumentation, ClientInstrumentation, etc.)
  • unstable_patternpattern (loader, action, middleware, instrumentation args)
  • unstable_defaultShouldRevalidatedefaultShouldRevalidate
  • unstable_useTransitionsuseTransitions
  • unstable_maskmask (on <Link>, useLinkClickHandler, useNavigate, and Location)
Route matching optimizations

We've added a handful of route matching optimizations in this release for Framework and Data mode. The changes are mostly related to caching the internal flattened/ranked route branches and reducing additional calls to matchRoutes along the critical path. This should result in improved performance during both server-side request handling and client-side navigations.

Minor Changes
  • react-router - Stabilize unstable_defaultShouldRevalidate as defaultShouldRevalidate on <Link>, <Form>, useLinkClickHandler, useSubmit, fetcher.submit, and setSearchParams (14999)
    • ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
  • react-router - Stabilize the instrumentation APIs (14999)
    • unstable_instrumentations is now instrumentations
    • unstable_pattern is now pattern
    • The unstable_ServerInstrumentation, unstable_ClientInstrumentation, unstable_InstrumentRequestHandlerFunction, unstable_InstrumentRouterFunction, unstable_InstrumentRouteFunction, and unstable_InstrumentationHandlerResult types have had their unstable_ prefixes removed
    • ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
  • react-router - Stabilize unstable_mask as mask on <Link>, useLinkClickHandler, and useNavigate, and rename the corresponding Location.unstable_mask field to Location.mask (14999)
    • ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
  • react-router - Stabilize the unstable_normalizePath option on staticHandler.query and staticHandler.queryRoute as normalizePath (14999)
    • ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
  • react-router - Stabilize future.unstable_passThroughRequests as future.v8_passThroughRequests (14999)
    • ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
  • react-router - Remove unstable_subResourceIntegrity from the runtime FutureConfig type; the flag is now controlled by the top-level subResourceIntegrity option in react-router.config.ts (14999)
    • ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
  • react-router - Stabilize unstable_url as url on loader, action, and middleware function args (14999)
    • ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
  • react-router - Stabilize unstable_useTransitions as useTransitions on <BrowserRouter>, <HashRouter>, <HistoryRouter>, <MemoryRouter>, <Router>, <RouterProvider>, <HydratedRouter>, and useLinkClickHandler (14999)
    • ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
  • @react-router/dev - Stabilize future.unstable_passThroughRequests as future.v8_passThroughRequests (14999)
    • ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
  • @react-router/dev - Stabilize prerender.unstable_concurrency as prerender.concurrency (14999)
    • ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
  • @react-router/dev - Stabilize future.unstable_subResourceIntegrity as a top-level subResourceIntegrity config option in react-router.config.ts (14999)
    • ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
Patch Changes
  • react-router - Add nonce to <Scripts> <link rel="modulepreload"> elements (if provided) (af5d49b)
  • react-router - Fix a bug with unstable_defaultShouldRevalidate={false} where parent routes that did not export a shouldRevalidate function could be incorrectly included in the single fetch call for new child route data (#​15012)
  • react-router - Mark mask as an optional field in Location for easier mocking in unit tests (#​14999)
  • react-router - Improve server-side route matching performance by pre-computing flattened/cached route branches (#​14967)
    • Performance benchmarks showed roughly a 10-15% improvement in server-side request handling performance
  • react-router - Cache flattened/ranked route branches to optimize server-side route matching (#​14967)
  • react-router - Improve route matching performance in Framework/Data Mode (#​14971)
    • Avoiding unnecessary calls to matchRoutes in data router scenarios
      • This includes adding back the optimization that was removed in 7.6.0 (#​13562)
      • The issues that prompted the revert have been addressed by using the available router matches but always updating match.route to the latest route in the manifest
    • Leverage pre-computed pre-computing flattened/cached route branches during client side route matching
    • Performance benchmarks showed roughly a 15-30% improvement in server-side request handling performance

Full Changelog: v7.14.2...v7.15.0


Configuration

📅 Schedule: (UTC)

  • 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 this update again.


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

This PR has been generated by Mend Renovate.

This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [react-router-dom](https://github.com/remix-run/react-router) ([source](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom)) | dependencies | minor | [`7.14.2` → `7.18.1`](https://renovatebot.com/diffs/npm/react-router-dom/7.14.2/7.18.1) | --- ### Release Notes <details> <summary>remix-run/react-router (react-router-dom)</summary> ### [`v7.18.1`](https://github.com/remix-run/react-router/compare/react-router-dom@7.18.0...react-router-dom@7.18.1) [Compare Source](https://github.com/remix-run/react-router/compare/react-router-dom@7.18.0...react-router-dom@7.18.1) ### [`v7.18.0`](https://github.com/remix-run/react-router/blob/HEAD/CHANGELOG.md#v7180) [Compare Source](https://github.com/remix-run/react-router/compare/react-router-dom@7.17.0...react-router-dom@7.18.0) Date: 2026-06-16 ##### What's Changed ##### CSRF Check Logic Fix We made a bug fix in our underlying CSRF checks in this release that may be a "breaking bug fix" for some users deployed behind a reverse proxy. The CSRF check now checks directly against the `host` in the `request` url provided, instead of looking directly at HTTP headers which is an adapter concern. If your adapter is not setting the expected host in the request URL, you may need to add the new internal host to your `allowedActionOrigins` config. This is most likely to occur in `@react-router/serve` apps or `@react-router/express` apps without the `trust proxy` setting enabled. We recommend testing this against application mutation requests as part of your upgrade. ##### Minor Changes - `@react-router/architect` - Add a `useRequestContextDomainName` option to `createRequestHandler` to derive request URL hosts from the API Gateway request context ([#&#8203;15185](https://github.com/remix-run/react-router/pull/15185)) - This flag will become the default behavior in v8, so it is recommended to adopt to prepare for and to v8 better align with your deployment architecture and rely less on manual header parsing in the adapter - See the [docs](https://reactrouter.com/api/other-api/adapter#react-routerarchitect) for more information ##### Patch Changes - `react-router` - Fix server handler prerender responses when using `ssr: false` and `future.v8_trailingSlashAwareDataRequests: true` ([#&#8203;15173](https://github.com/remix-run/react-router/pull/15173)) - Avoids false positive "SPA Mode" detection when serving prerendered paths - `react-router` - Use the `ServerRouter` `nonce` for nonce-aware SSR components when they don't provide their own value so strict CSP pages can load them ([#&#8203;15170](https://github.com/remix-run/react-router/pull/15170)) - `react-router` - Use `turbo-stream` to serialize and deserialize Framework Mode hydration errors ([#&#8203;15175](https://github.com/remix-run/react-router/pull/15175)) - `react-router` - Optimize route matching by extending precomputed route branches to include matchers ([#&#8203;15186](https://github.com/remix-run/react-router/pull/15186)) - `react-router` - Use the constructed `request` URL `host` instead of header checks when validating action request origins in the CSRF check ([#&#8203;15185](https://github.com/remix-run/react-router/pull/15185)) - `react-router` - Remove the un-documented custom error serialization logic from Data Mode SSR built-in hydration flows ([#&#8203;15175](https://github.com/remix-run/react-router/pull/15175)) - `react-router` - Validate protocols in RSC render redirects ([#&#8203;15177](https://github.com/remix-run/react-router/pull/15177)) - `react-router` - Consolidate url normalization logic and better handle mixed slashes ([#&#8203;15176](https://github.com/remix-run/react-router/pull/15176)) - `@react-router/dev` - Pass Vite `server.watch` config to child compiler in development mode. ([#&#8203;15178](https://github.com/remix-run/react-router/pull/15178)) - `@react-router/dev` - Ignore external Vite server environments in Framework Mode build hooks ([#&#8203;14883](https://github.com/remix-run/react-router/pull/14883)) - When `future.v8_viteEnvironmentApi` is enabled, React Router previously treated any non-client Vite environment as its own server build - This caused issues with integrations like Nitro, where plugins can register additional environments - Framework Mode build hooks now ignore external server environments and only process the app's own server build - `@react-router/express` - Adjust express adapter host computation ([#&#8203;15185](https://github.com/remix-run/react-router/pull/15185)) - read port from `x-forwarded-host` based on `trust proxy` setting - handle invalid hostname characters **Full Changelog**: [`v7.17.0...v7.18.0`](https://github.com/remix-run/react-router/compare/react-router@7.17.0...react-router@7.18.0) ### [`v7.17.0`](https://github.com/remix-run/react-router/blob/HEAD/CHANGELOG.md#v7170) [Compare Source](https://github.com/remix-run/react-router/compare/react-router-dom@7.16.0...react-router-dom@7.17.0) Date: 2026-06-04 ##### Minor Changes - `react-router` - Ship a subset of the official documentation inside the `react-router` package ([#&#8203;15121](https://github.com/remix-run/react-router/pull/15121)) - Markdown docs are now available in `node_modules/react-router/docs`, letting AI coding agents and the React Router agent skills read official docs locally - Excludes auto-generated API docs (`api/`), `community/` content, and tutorials (`tutorials/`) ##### Patch Changes - `@react-router/dev` - Fix future flag warning URLs and only log each future flag warning one time ([#&#8203;15138](https://github.com/remix-run/react-router/pull/15138)) ##### Unstable Changes ⚠️ *[Unstable features](https://reactrouter.com/community/api-development-strategy#unstable-flags) are not recommended for production use* - `@react-router/dev` - Prevent RSC route module server exports from being scanned by the client dependency optimizer when `future.unstable_optimizeDeps` is enabled. ([#&#8203;15005](https://github.com/remix-run/react-router/pull/15005)) **Full Changelog**: [`v7.16.0...v7.17.0`](https://github.com/remix-run/react-router/compare/react-router@7.16.0...react-router@7.17.0) ### [`v7.16.0`](https://github.com/remix-run/react-router/blob/HEAD/CHANGELOG.md#v7160) [Compare Source](https://github.com/remix-run/react-router/compare/react-router-dom@7.15.1...react-router-dom@7.16.0) Date: 2026-05-28 ##### Minor Changes - `react-router` - Stabilize `future.unstable_trailingSlashAwareDataRequests` as `future.v8_trailingSlashAwareDataRequests` ([#&#8203;15098](https://github.com/remix-run/react-router/pull/15098)) - `@react-router/dev` - Stabilize `future.unstable_trailingSlashAwareDataRequests` as `future.v8_trailingSlashAwareDataRequests` ([#&#8203;15098](https://github.com/remix-run/react-router/pull/15098)) - The unstable flag is no longer supported and will error during config resolution - `@react-router/dev` - Log future flag warnings for upcoming React Router v8 flags ([#&#8203;15029](https://github.com/remix-run/react-router/pull/15029)) - `v8_middleware`, `v8_splitRouteModules`, `v8_viteEnvironmentApi`, `v8_passThroughRequests`, `v8_trailingSlashAwareDataRequests` ##### Patch Changes - `react-router` - Disable manifest path when lazy route dicovery is disabled ([#&#8203;15068](https://github.com/remix-run/react-router/pull/15068)) - `react-router` - Fix browser URL creation to use the configured history window instead of the global window. ([#&#8203;15066](https://github.com/remix-run/react-router/pull/15066)) - Pass the history/router window through to `createBrowserURLImpl` so custom window contexts keep the correct URL origin. - `react-router` - Fix `useNavigation()` return type to preserve discriminated union across navigation states ([#&#8203;15095](https://github.com/remix-run/react-router/pull/15095)) - `react-router` - Widen `MetaDescriptor` `script:ld+json` type from `LdJsonObject` to `LdJsonObject | LdJsonObject[]` to permit multiple JSON-LD schemas in a single `<script type="application/ld+json">` tag emitted by `<Meta />` ([#&#8203;15082](https://github.com/remix-run/react-router/pull/15082)) - `react-router-dom` - Remove stale/invalid `unpkg` field from `package.json`. This was removed from other packages with the release of v7 but missed in the `react-router-dom` re-export package ([#&#8203;15075](https://github.com/remix-run/react-router/pull/15075)) - `@react-router/express` - Ignore writes after Express responses close ([#&#8203;15107](https://github.com/remix-run/react-router/pull/15107)) - Avoid surfacing client disconnects as adapter errors when the response stream has already been destroyed or ended. - `@react-router/node` - Honor Node writable backpressure in `writeReadableStreamToWritable` and `writeAsyncIterableToWritable` ([#&#8203;15071](https://github.com/remix-run/react-router/pull/15071)) - Await `'drain'` when `writable.write()` returns `false` instead of letting chunks accumulate in the writable's internal buffer. - Reject (rather than hang) if the writable errors or closes mid-stream. - `@react-router/serve` - Normalize `assetsBuildDirectory` path separators in `react-router-serve` so Windows-built server artifacts can serve `/assets/*` correctly when run on Linux. ([#&#8203;14982](https://github.com/remix-run/react-router/pull/14982)) **Full Changelog**: [`v7.15.1...v7.16.0`](https://github.com/remix-run/react-router/compare/react-router@7.15.1...react-router@7.16.0) ### [`v7.15.1`](https://github.com/remix-run/react-router/blob/HEAD/CHANGELOG.md#v7151) [Compare Source](https://github.com/remix-run/react-router/compare/react-router-dom@7.15.0...react-router-dom@7.15.1) Date: 2026-05-14 ##### What's New ##### `useRouterState` (unstable) Following our [Less is More](https://github.com/remix-run/react-router/blob/main/GOVERNANCE.md#design-goals) design goal, this release includes a new `unstable_useRouterState()` hook (Framework + Data Mode) that consolidates access to active and pending router states ([RFC](https://github.com/remix-run/react-router/discussions/12358), [Roadmap Issue](https://github.com/remix-run/react-router/issues/13073)). This should allow you to consolidate usages of a bunch of different hooks which will likely be marked deprecated later on in v8 and potentially removed in an eventual v9: ```ts let { active, pending } = unstable_useRouterState(); // Active is always populated with the current location active.location; // replaces `useLocation()` active.searchParams; // replaces `useSearchParams()[0]` active.params; // replaces `useParams()` active.matches; // replaces `useMatches()` active.type; // replaces `useNavigationType()` // Pending is only populated during a navigation pending.location; // replaces `useNavigation().location` pending.searchParams; // equivalent to `new URLSearchParams(useNavigation().search)` pending.params; // Not directly accessible today pending.matches; // Not directly accessible today pending.type; // Not directly accessible today pending.state; // replaces `useNavigation().state` pending.formMethod; // replaces useNavigation().formMethod pending.formAction; // replaces useNavigation().formAction pending.formEncType; // replaces useNavigation().formEncType pending.formData; // replaces useNavigation().formData pending.json; // replaces useNavigation().json pending.text; // replaces useNavigation().text ``` ##### Patch Changes - `react-router` - Memoize `useFetchers` to return a stable identity and only change if fetchers changed ([#&#8203;15028](https://github.com/remix-run/react-router/pull/15028)) - `react-router` - Update router to operate on fetcher Maps in an immutable manner to avoid delayed React renders from potentially reading an updated but not yet committed Map. This could result in brief flickers in some fetcher-driven optimistic UI scenarios ([#&#8203;15028](https://github.com/remix-run/react-router/pull/15028)) - `react-router` - Fix `serverLoader()` returning stale SSR data when a client navigation aborts pending hydration before the hydration `clientLoader` resolves ([#&#8203;15022](https://github.com/remix-run/react-router/pull/15022)) - `react-router` - Fix `RouterProvider` `onError` callback not being called for synchronous initial loader errors in SPA mode ([#&#8203;15039](https://github.com/remix-run/react-router/pull/15039)) ([#&#8203;14942](https://github.com/remix-run/react-router/pull/14942)) - `react-router` - Internal refactor to consolidate mutation request detection through shared utility ([#&#8203;15033](https://github.com/remix-run/react-router/pull/15033)) - `@react-router/dev` - Fix `basename` conflicting with `app` directory name when Vite `base` is set ([#&#8203;15027](https://github.com/remix-run/react-router/pull/15027)) - When the Vite `base` config and React Router `basename` both match the app directory name (e.g. `base: "/app/"`, `basename: "/app/"`), Vite would strip the base prefix from server-build virtual module import paths, causing "Failed to load url /root.tsx" errors - The fix uses `/@&#8203;fs/` absolute paths for those imports to bypass Vite's base-stripping logic ##### Unstable Changes ⚠️ *[Unstable features](https://reactrouter.com/community/api-development-strategy#unstable-flags) are not recommended for production use* - `react-router` - Add a new `unstable_useRouterState()` hook that consolidates access to active and pending router states (RFC: [#&#8203;12358](https://github.com/remix-run/react-router/issues/12358)) ([#&#8203;15017](https://github.com/remix-run/react-router/pull/15017)) - Data/Framework/RSC only — throws when used without a data router **Full Changelog**: [`v7.15.0...v7.15.1`](https://github.com/remix-run/react-router/compare/react-router@7.15.0...react-router@7.15.1) ### [`v7.15.0`](https://github.com/remix-run/react-router/blob/HEAD/CHANGELOG.md#v7150) [Compare Source](https://github.com/remix-run/react-router/compare/react-router-dom@7.14.2...react-router-dom@7.15.0) Date: 2026-05-05 ##### What's Changed ##### Stabilizations We've stabilized a bunch of APIs in this release in preparation for a React Router v8 release hopefully in the next month or two. These flag/prop renames are breaking changes if you've already opted into the unstable APIs so please make sure you make the appropriate changes if so. - `future.unstable_passThroughRequests` → `future.v8_passThroughRequests` - `future.unstable_subResourceIntegrity` → top-level `config.subResourceIntegrity` - `prerender.unstable_concurrency` → `prerender.concurrency` - `unstable_url` → `url` (loader, action, middleware, instrumentation args) - `unstable_instrumentations` → `instrumentations` - Plus associated types (`ServerInstrumentation`, `ClientInstrumentation`, etc.) - `unstable_pattern` → `pattern` (loader, action, middleware, instrumentation args) - `unstable_defaultShouldRevalidate` → `defaultShouldRevalidate` - `unstable_useTransitions` → `useTransitions` - `unstable_mask` → `mask` (on `<Link>`, `useLinkClickHandler`, `useNavigate`, and `Location`) ##### Route matching optimizations We've added a handful of route matching optimizations in this release for Framework and Data mode. The changes are mostly related to caching the internal flattened/ranked route branches and reducing additional calls to `matchRoutes` along the critical path. This should result in improved performance during both server-side request handling and client-side navigations. ##### Minor Changes - `react-router` - Stabilize `unstable_defaultShouldRevalidate` as `defaultShouldRevalidate` on `<Link>`, `<Form>`, `useLinkClickHandler`, `useSubmit`, `fetcher.submit`, and `setSearchParams` ([14999](https://github.com/remix-run/react-router/pull/14999)) - ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly - `react-router` - Stabilize the instrumentation APIs ([14999](https://github.com/remix-run/react-router/pull/14999)) - `unstable_instrumentations` is now `instrumentations` - `unstable_pattern` is now `pattern` - The `unstable_ServerInstrumentation`, `unstable_ClientInstrumentation`, `unstable_InstrumentRequestHandlerFunction`, `unstable_InstrumentRouterFunction`, `unstable_InstrumentRouteFunction`, and `unstable_InstrumentationHandlerResult` types have had their `unstable_` prefixes removed - ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly - `react-router` - Stabilize `unstable_mask` as `mask` on `<Link>`, `useLinkClickHandler`, and `useNavigate`, and rename the corresponding `Location.unstable_mask` field to `Location.mask` ([14999](https://github.com/remix-run/react-router/pull/14999)) - ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly - `react-router` - Stabilize the `unstable_normalizePath` option on `staticHandler.query` and `staticHandler.queryRoute` as `normalizePath` ([14999](https://github.com/remix-run/react-router/pull/14999)) - ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly - `react-router` - Stabilize `future.unstable_passThroughRequests` as `future.v8_passThroughRequests` ([14999](https://github.com/remix-run/react-router/pull/14999)) - ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly - `react-router` - Remove `unstable_subResourceIntegrity` from the runtime `FutureConfig` type; the flag is now controlled by the top-level `subResourceIntegrity` option in `react-router.config.ts` ([14999](https://github.com/remix-run/react-router/pull/14999)) - ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly - `react-router` - Stabilize `unstable_url` as `url` on `loader`, `action`, and `middleware` function args ([14999](https://github.com/remix-run/react-router/pull/14999)) - ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly - `react-router` - Stabilize `unstable_useTransitions` as `useTransitions` on `<BrowserRouter>`, `<HashRouter>`, `<HistoryRouter>`, `<MemoryRouter>`, `<Router>`, `<RouterProvider>`, `<HydratedRouter>`, and `useLinkClickHandler` ([14999](https://github.com/remix-run/react-router/pull/14999)) - ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly - `@react-router/dev` - Stabilize `future.unstable_passThroughRequests` as `future.v8_passThroughRequests` ([14999](https://github.com/remix-run/react-router/pull/14999)) - ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly - `@react-router/dev` - Stabilize `prerender.unstable_concurrency` as `prerender.concurrency` ([14999](https://github.com/remix-run/react-router/pull/14999)) - ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly - `@react-router/dev` - Stabilize `future.unstable_subResourceIntegrity` as a top-level `subResourceIntegrity` config option in `react-router.config.ts` ([14999](https://github.com/remix-run/react-router/pull/14999)) - ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly ##### Patch Changes - `react-router` - Add `nonce` to `<Scripts>` `<link rel="modulepreload">` elements (if provided) ([af5d49b](https://github.com/remix-run/react-router/commit/af5d49b)) - `react-router` - Fix a bug with `unstable_defaultShouldRevalidate={false}` where parent routes that did not export a `shouldRevalidate` function could be incorrectly included in the single fetch call for new child route data ([#&#8203;15012](https://github.com/remix-run/react-router/pull/15012)) - `react-router` - Mark `mask` as an optional field in `Location` for easier mocking in unit tests ([#&#8203;14999](https://github.com/remix-run/react-router/pull/14999)) - `react-router` - Improve server-side route matching performance by pre-computing flattened/cached route branches ([#&#8203;14967](https://github.com/remix-run/react-router/pull/14967)) - Performance benchmarks showed roughly a 10-15% improvement in server-side request handling performance - `react-router` - Cache flattened/ranked route branches to optimize server-side route matching ([#&#8203;14967](https://github.com/remix-run/react-router/pull/14967)) - `react-router` - Improve route matching performance in Framework/Data Mode ([#&#8203;14971](https://github.com/remix-run/react-router/pull/14971)) - Avoiding unnecessary calls to `matchRoutes` in data router scenarios - This includes adding back the optimization that was removed in `7.6.0` ([#&#8203;13562](https://github.com/remix-run/react-router/pull/13562)) - The issues that prompted the revert have been addressed by using the available router `matches` but always updating `match.route` to the latest route in the `manifest` - Leverage pre-computed pre-computing flattened/cached route branches during client side route matching - Performance benchmarks showed roughly a 15-30% improvement in server-side request handling performance **Full Changelog**: [`v7.14.2...v7.15.0`](https://github.com/remix-run/react-router/compare/react-router@7.14.2...react-router@7.15.0) </details> --- ### Configuration 📅 **Schedule**: (UTC) - 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 this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNjMuMyIsInVwZGF0ZWRJblZlciI6IjQzLjI1MS4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
Update dependency react-router-dom to v7.15.0
All checks were successful
Web Deployment Container / determine-workflow (pull_request) Successful in 3s
Web Deployment Container / nonprod-deploy (dev) (pull_request) Has been skipped
Web Deployment Container / prod-deploy (dev) (pull_request) Has been skipped
6693c8d737
renovate-bot changed title from Update dependency react-router-dom to v7.15.0 to Update dependency react-router-dom to v7.15.1 2026-05-14 15:03:32 +00:00
renovate-bot force-pushed renovate/react-router-dom-7.x-lockfile from 6693c8d737
All checks were successful
Web Deployment Container / determine-workflow (pull_request) Successful in 3s
Web Deployment Container / nonprod-deploy (dev) (pull_request) Has been skipped
Web Deployment Container / prod-deploy (dev) (pull_request) Has been skipped
to 5b180b39f8
All checks were successful
Web Deployment Container / determine-workflow (pull_request) Successful in 2s
Web Deployment Container / nonprod-deploy (dev) (pull_request) Has been skipped
Web Deployment Container / prod-deploy (dev) (pull_request) Has been skipped
2026-05-14 15:03:33 +00:00
Compare
renovate-bot force-pushed renovate/react-router-dom-7.x-lockfile from 5b180b39f8
All checks were successful
Web Deployment Container / determine-workflow (pull_request) Successful in 2s
Web Deployment Container / nonprod-deploy (dev) (pull_request) Has been skipped
Web Deployment Container / prod-deploy (dev) (pull_request) Has been skipped
to d7f683db7f
All checks were successful
Web Deployment Container / determine-workflow (pull_request) Successful in 2s
Web Deployment Container / nonprod-deploy (dev) (pull_request) Has been skipped
Web Deployment Container / prod-deploy (dev) (pull_request) Has been skipped
2026-05-22 00:04:10 +00:00
Compare
renovate-bot changed title from Update dependency react-router-dom to v7.15.1 to Update dependency react-router-dom to v7.16.0 2026-05-28 19:03:52 +00:00
renovate-bot force-pushed renovate/react-router-dom-7.x-lockfile from d7f683db7f
All checks were successful
Web Deployment Container / determine-workflow (pull_request) Successful in 2s
Web Deployment Container / nonprod-deploy (dev) (pull_request) Has been skipped
Web Deployment Container / prod-deploy (dev) (pull_request) Has been skipped
to 28607fcb35
All checks were successful
Web Deployment Container / determine-workflow (pull_request) Successful in 2s
Web Deployment Container / nonprod-deploy (dev) (pull_request) Has been skipped
Web Deployment Container / prod-deploy (dev) (pull_request) Has been skipped
2026-05-28 19:03:54 +00:00
Compare
renovate-bot force-pushed renovate/react-router-dom-7.x-lockfile from 28607fcb35
All checks were successful
Web Deployment Container / determine-workflow (pull_request) Successful in 2s
Web Deployment Container / nonprod-deploy (dev) (pull_request) Has been skipped
Web Deployment Container / prod-deploy (dev) (pull_request) Has been skipped
to 21480b050b
All checks were successful
Web Deployment Container / determine-workflow (pull_request) Successful in 2s
Web Deployment Container / nonprod-deploy (dev) (pull_request) Has been skipped
Web Deployment Container / prod-deploy (dev) (pull_request) Has been skipped
2026-06-04 15:02:33 +00:00
Compare
renovate-bot changed title from Update dependency react-router-dom to v7.16.0 to Update dependency react-router-dom to v7.17.0 2026-06-04 15:02:33 +00:00
renovate-bot force-pushed renovate/react-router-dom-7.x-lockfile from 21480b050b
All checks were successful
Web Deployment Container / determine-workflow (pull_request) Successful in 2s
Web Deployment Container / nonprod-deploy (dev) (pull_request) Has been skipped
Web Deployment Container / prod-deploy (dev) (pull_request) Has been skipped
to 0d6266d9f7
All checks were successful
Web Deployment Container / determine-workflow (pull_request) Successful in 2s
Web Deployment Container / nonprod-deploy (dev) (pull_request) Has been skipped
Web Deployment Container / prod-deploy (dev) (pull_request) Has been skipped
2026-06-21 00:03:24 +00:00
Compare
renovate-bot changed title from Update dependency react-router-dom to v7.17.0 to Update dependency react-router-dom to v7.18.0 2026-06-21 00:03:34 +00:00
renovate-bot force-pushed renovate/react-router-dom-7.x-lockfile from 0d6266d9f7
All checks were successful
Web Deployment Container / determine-workflow (pull_request) Successful in 2s
Web Deployment Container / nonprod-deploy (dev) (pull_request) Has been skipped
Web Deployment Container / prod-deploy (dev) (pull_request) Has been skipped
to ab60fbac4a
All checks were successful
Web Deployment Container / determine-workflow (pull_request) Successful in 2s
Web Deployment Container / nonprod-deploy (dev) (pull_request) Has been skipped
Web Deployment Container / prod-deploy (dev) (pull_request) Has been skipped
2026-07-05 00:03:37 +00:00
Compare
renovate-bot changed title from Update dependency react-router-dom to v7.18.0 to Update dependency react-router-dom to v7.18.1 2026-07-05 00:03:46 +00:00
All checks were successful
Web Deployment Container / determine-workflow (pull_request) Successful in 2s
Web Deployment Container / nonprod-deploy (dev) (pull_request) Has been skipped
Web Deployment Container / prod-deploy (dev) (pull_request) Has been skipped
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin renovate/react-router-dom-7.x-lockfile:renovate/react-router-dom-7.x-lockfile
git switch renovate/react-router-dom-7.x-lockfile

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch main
git merge --no-ff renovate/react-router-dom-7.x-lockfile
git switch renovate/react-router-dom-7.x-lockfile
git rebase main
git switch main
git merge --ff-only renovate/react-router-dom-7.x-lockfile
git switch renovate/react-router-dom-7.x-lockfile
git rebase main
git switch main
git merge --no-ff renovate/react-router-dom-7.x-lockfile
git switch main
git merge --squash renovate/react-router-dom-7.x-lockfile
git switch main
git merge --ff-only renovate/react-router-dom-7.x-lockfile
git switch main
git merge renovate/react-router-dom-7.x-lockfile
git push origin main
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
RCSLabs/RCSLabsWeb!8
No description provided.