UNPKG

48.4 kBMarkdownView Raw
1# `react-router`
2
3## 7.0.2
4
5### Patch Changes
6
7- temporarily only use one build in export map so packages can have a peer dependency on react router ([#12437](https://github.com/remix-run/react-router/pull/12437))
8- Generate wide `matches` and `params` types for current route and child routes ([#12397](https://github.com/remix-run/react-router/pull/12397))
9
10 At runtime, `matches` includes child route matches and `params` include child route path parameters.
11 But previously, we only generated types for parent routes in `matches`; for `params`, we only considered the parent routes and the current route.
12 To align our generated types more closely to the runtime behavior, we now generate more permissive, wider types when accessing child route information.
13
14## 7.0.1
15
16## 7.0.0
17
18### Major Changes
19
20- Remove the original `defer` implementation in favor of using raw promises via single fetch and `turbo-stream`. This removes these exports from React Router: ([#11744](https://github.com/remix-run/react-router/pull/11744))
21
22 - `defer`
23 - `AbortedDeferredError`
24 - `type TypedDeferredData`
25 - `UNSAFE_DeferredData`
26 - `UNSAFE_DEFERRED_SYMBOL`,
27
28- - Collapse `@remix-run/router` into `react-router` ([#11505](https://github.com/remix-run/react-router/pull/11505))
29 - Collapse `react-router-dom` into `react-router`
30 - Collapse `@remix-run/server-runtime` into `react-router`
31 - Collapse `@remix-run/testing` into `react-router`
32
33- Remove single\_fetch future flag. ([#11522](https://github.com/remix-run/react-router/pull/11522))
34
35- Drop support for Node 16, React Router SSR now requires Node 18 or higher ([#11391](https://github.com/remix-run/react-router/pull/11391))
36
37- Remove `future.v7_startTransition` flag ([#11696](https://github.com/remix-run/react-router/pull/11696))
38
39- - Expose the underlying router promises from the following APIs for compsition in React 19 APIs: ([#11521](https://github.com/remix-run/react-router/pull/11521))
40 - `useNavigate()`
41 - `useSubmit`
42 - `useFetcher().load`
43 - `useFetcher().submit`
44 - `useRevalidator.revalidate`
45
46- Remove `future.v7_normalizeFormMethod` future flag ([#11697](https://github.com/remix-run/react-router/pull/11697))
47
48- For Remix consumers migrating to React Router, the `crypto` global from the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) is now required when using cookie and session APIs. This means that the following APIs are provided from `react-router` rather than platform-specific packages: ([#11837](https://github.com/remix-run/react-router/pull/11837))
49
50 - `createCookie`
51 - `createCookieSessionStorage`
52 - `createMemorySessionStorage`
53 - `createSessionStorage`
54
55 For consumers running older versions of Node, the `installGlobals` function from `@remix-run/node` has been updated to define `globalThis.crypto`, using [Node's `require('node:crypto').webcrypto` implementation.](https://nodejs.org/api/webcrypto.html)
56
57 Since platform-specific packages no longer need to implement this API, the following low-level APIs have been removed:
58
59 - `createCookieFactory`
60 - `createSessionStorageFactory`
61 - `createCookieSessionStorageFactory`
62 - `createMemorySessionStorageFactory`
63
64- Imports/Exports cleanup ([#11840](https://github.com/remix-run/react-router/pull/11840))
65
66 - Removed the following exports that were previously public API from `@remix-run/router`
67 - types
68 - `AgnosticDataIndexRouteObject`
69 - `AgnosticDataNonIndexRouteObject`
70 - `AgnosticDataRouteMatch`
71 - `AgnosticDataRouteObject`
72 - `AgnosticIndexRouteObject`
73 - `AgnosticNonIndexRouteObject`
74 - `AgnosticRouteMatch`
75 - `AgnosticRouteObject`
76 - `TrackedPromise`
77 - `unstable_AgnosticPatchRoutesOnMissFunction`
78 - `Action` -> exported as `NavigationType` via `react-router`
79 - `Router` exported as `DataRouter` to differentiate from RR's `<Router>`
80 - API
81 - `getToPathname` (`@private`)
82 - `joinPaths` (`@private`)
83 - `normalizePathname` (`@private`)
84 - `resolveTo` (`@private`)
85 - `stripBasename` (`@private`)
86 - `createBrowserHistory` -> in favor of `createBrowserRouter`
87 - `createHashHistory` -> in favor of `createHashRouter`
88 - `createMemoryHistory` -> in favor of `createMemoryRouter`
89 - `createRouter`
90 - `createStaticHandler` -> in favor of wrapper `createStaticHandler` in RR Dom
91 - `getStaticContextFromError`
92 - Removed the following exports that were previously public API from `react-router`
93 - `Hash`
94 - `Pathname`
95 - `Search`
96
97- update minimum node version to 18 ([#11690](https://github.com/remix-run/react-router/pull/11690))
98
99- Remove `future.v7_prependBasename` from the ionternalized `@remix-run/router` package ([#11726](https://github.com/remix-run/react-router/pull/11726))
100
101- Migrate Remix type generics to React Router ([#12180](https://github.com/remix-run/react-router/pull/12180))
102
103 - These generics are provided for Remix v2 migration purposes
104 - These generics and the APIs they exist on should be considered informally deprecated in favor of the new `Route.*` types
105 - Anyone migrating from React Router v6 should probably not leverage these new generics and should migrate straight to the `Route.*` types
106 - For React Router v6 users, these generics are new and should not impact your app, with one exception
107 - `useFetcher` previously had an optional generic (used primarily by Remix v2) that expected the data type
108 - This has been updated in v7 to expect the type of the function that generates the data (i.e., `typeof loader`/`typeof action`)
109 - Therefore, you should update your usages:
110 - `useFetcher<LoaderData>()`
111 - `useFetcher<typeof loader>()`
112
113- Remove `future.v7_throwAbortReason` from internalized `@remix-run/router` package ([#11728](https://github.com/remix-run/react-router/pull/11728))
114
115- Add `exports` field to all packages ([#11675](https://github.com/remix-run/react-router/pull/11675))
116
117- node package no longer re-exports from react-router ([#11702](https://github.com/remix-run/react-router/pull/11702))
118
119- renamed RemixContext to FrameworkContext ([#11705](https://github.com/remix-run/react-router/pull/11705))
120
121- updates the minimum React version to 18 ([#11689](https://github.com/remix-run/react-router/pull/11689))
122
123- PrefetchPageDescriptor replaced by PageLinkDescriptor ([#11960](https://github.com/remix-run/react-router/pull/11960))
124
125- - Consolidate types previously duplicated across `@remix-run/router`, `@remix-run/server-runtime`, and `@remix-run/react` now that they all live in `react-router` ([#12177](https://github.com/remix-run/react-router/pull/12177))
126 - Examples: `LoaderFunction`, `LoaderFunctionArgs`, `ActionFunction`, `ActionFunctionArgs`, `DataFunctionArgs`, `RouteManifest`, `LinksFunction`, `Route`, `EntryRoute`
127 - The `RouteManifest` type used by the "remix" code is now slightly stricter because it is using the former `@remix-run/router` `RouteManifest`
128 - `Record<string, Route> -> Record<string, Route | undefined>`
129 - Removed `AppData` type in favor of inlining `unknown` in the few locations it was used
130 - Removed `ServerRuntimeMeta*` types in favor of the `Meta*` types they were duplicated from
131
132- - Remove the `future.v7_partialHydration` flag ([#11725](https://github.com/remix-run/react-router/pull/11725))
133 - This also removes the `<RouterProvider fallbackElement>` prop
134 - To migrate, move the `fallbackElement` to a `hydrateFallbackElement`/`HydrateFallback` on your root route
135 - Also worth nothing there is a related breaking changer with this future flag:
136 - Without `future.v7_partialHydration` (when using `fallbackElement`), `state.navigation` was populated during the initial load
137 - With `future.v7_partialHydration`, `state.navigation` remains in an `"idle"` state during the initial load
138
139- Remove `v7_relativeSplatPath` future flag ([#11695](https://github.com/remix-run/react-router/pull/11695))
140
141- Drop support for Node 18, update minimum Node vestion to 20 ([#12171](https://github.com/remix-run/react-router/pull/12171))
142
143 - Remove `installGlobals()` as this should no longer be necessary
144
145- Remove remaining future flags ([#11820](https://github.com/remix-run/react-router/pull/11820))
146
147 - React Router `v7_skipActionErrorRevalidation`
148 - Remix `v3_fetcherPersist`, `v3_relativeSplatPath`, `v3_throwAbortReason`
149
150- rename createRemixStub to createRoutesStub ([#11692](https://github.com/remix-run/react-router/pull/11692))
151
152- Remove `@remix-run/router` deprecated `detectErrorBoundary` option in favor of `mapRouteProperties` ([#11751](https://github.com/remix-run/react-router/pull/11751))
153
154- Add `react-router/dom` subpath export to properly enable `react-dom` as an optional `peerDependency` ([#11851](https://github.com/remix-run/react-router/pull/11851))
155
156 - This ensures that we don't blindly `import ReactDOM from "react-dom"` in `<RouterProvider>` in order to access `ReactDOM.flushSync()`, since that would break `createMemoryRouter` use cases in non-DOM environments
157 - DOM environments should import from `react-router/dom` to get the proper component that makes `ReactDOM.flushSync()` available:
158 - If you are using the Vite plugin, use this in your `entry.client.tsx`:
159 - `import { HydratedRouter } from 'react-router/dom'`
160 - If you are not using the Vite plugin and are manually calling `createBrowserRouter`/`createHashRouter`:
161 - `import { RouterProvider } from "react-router/dom"`
162
163- Remove `future.v7_fetcherPersist` flag ([#11731](https://github.com/remix-run/react-router/pull/11731))
164
165- Update `cookie` dependency to `^1.0.1` - please see the [release notes](https://github.com/jshttp/cookie/releases) for any breaking changes ([#12172](https://github.com/remix-run/react-router/pull/12172))
166
167### Minor Changes
168
169- - Add support for `prerender` config in the React Router vite plugin, to support existing SSG use-cases ([#11539](https://github.com/remix-run/react-router/pull/11539))
170 - You can use the `prerender` config to pre-render your `.html` and `.data` files at build time and then serve them statically at runtime (either from a running server or a CDN)
171 - `prerender` can either be an array of string paths, or a function (sync or async) that returns an array of strings so that you can dynamically generate the paths by talking to your CMS, etc.
172
173 ```ts
174 // react-router.config.ts
175 import type { Config } from "@react-router/dev/config";
176
177 export default {
178 async prerender() {
179 let slugs = await fakeGetSlugsFromCms();
180 // Prerender these paths into `.html` files at build time, and `.data`
181 // files if they have loaders
182 return ["/", "/about", ...slugs.map((slug) => `/product/${slug}`)];
183 },
184 } satisfies Config;
185
186 async function fakeGetSlugsFromCms() {
187 await new Promise((r) => setTimeout(r, 1000));
188 return ["shirt", "hat"];
189 }
190 ```
191
192- Params, loader data, and action data as props for route component exports ([#11961](https://github.com/remix-run/react-router/pull/11961))
193
194 ```tsx
195 export default function Component({ params, loaderData, actionData }) {}
196
197 export function HydrateFallback({ params }) {}
198 export function ErrorBoundary({ params, loaderData, actionData }) {}
199 ```
200
201- Remove duplicate `RouterProvider` impliementations ([#11679](https://github.com/remix-run/react-router/pull/11679))
202
203- ### Typesafety improvements ([#12019](https://github.com/remix-run/react-router/pull/12019))
204
205 React Router now generates types for each of your route modules.
206 You can access those types by importing them from `./+types.<route filename without extension>`.
207 For example:
208
209 ```ts
210 // app/routes/product.tsx
211 import type * as Route from "./+types.product";
212
213 export function loader({ params }: Route.LoaderArgs) {}
214
215 export default function Component({ loaderData }: Route.ComponentProps) {}
216 ```
217
218 This initial implementation targets type inference for:
219
220 - `Params` : Path parameters from your routing config in `routes.ts` including file-based routing
221 - `LoaderData` : Loader data from `loader` and/or `clientLoader` within your route module
222 - `ActionData` : Action data from `action` and/or `clientAction` within your route module
223
224 In the future, we plan to add types for the rest of the route module exports: `meta`, `links`, `headers`, `shouldRevalidate`, etc.
225 We also plan to generate types for typesafe `Link`s:
226
227 ```tsx
228 <Link to="/products/:id" params={{ id: 1 }} />
229 // ^^^^^^^^^^^^^ ^^^^^^^^^
230 // typesafe `to` and `params` based on the available routes in your app
231 ```
232
233 Check out our docs for more:
234
235 - [_Explanations > Type Safety_](https://reactrouter.com/dev/guides/explanation/type-safety)
236 - [_How-To > Setting up type safety_](https://reactrouter.com/dev/guides/how-to/setting-up-type-safety)
237
238- Stabilize `unstable_dataStrategy` ([#11969](https://github.com/remix-run/react-router/pull/11969))
239
240- Stabilize `unstable_patchRoutesOnNavigation` ([#11970](https://github.com/remix-run/react-router/pull/11970))
241
242### Patch Changes
243
244- No changes ([`506329c4e`](https://github.com/remix-run/react-router/commit/506329c4e2e7aba9837cbfa44df6103b49423745))
245
246- chore: re-enable development warnings through a `development` exports condition. ([#12269](https://github.com/remix-run/react-router/pull/12269))
247
248- Remove unstable upload handler. ([#12015](https://github.com/remix-run/react-router/pull/12015))
249
250- Remove unneeded dependency on @web3-storage/multipart-parser ([#12274](https://github.com/remix-run/react-router/pull/12274))
251
252- Fix redirects returned from loaders/actions using `data()` ([#12021](https://github.com/remix-run/react-router/pull/12021))
253
254- fix(react-router): (v7) fix static prerender of non-ascii characters ([#12161](https://github.com/remix-run/react-router/pull/12161))
255
256- Replace `substr` with `substring` ([#12080](https://github.com/remix-run/react-router/pull/12080))
257
258- Remove the deprecated `json` utility ([#12146](https://github.com/remix-run/react-router/pull/12146))
259
260 - You can use [`Response.json`](https://developer.mozilla.org/en-US/docs/Web/API/Response/json_static) if you still need to construct JSON responses in your app
261
262- Remove unneeded dependency on source-map ([#12275](https://github.com/remix-run/react-router/pull/12275))
263
264## 6.28.0
265
266### Minor Changes
267
268- - Log deprecation warnings for v7 flags ([#11750](https://github.com/remix-run/react-router/pull/11750))
269 - Add deprecation warnings to `json`/`defer` in favor of returning raw objects
270 - These methods will be removed in React Router v7
271
272### Patch Changes
273
274- Update JSDoc URLs for new website structure (add /v6/ segment) ([#12141](https://github.com/remix-run/react-router/pull/12141))
275- Updated dependencies:
276 - `@remix-run/router@1.21.0`
277
278## 6.27.0
279
280### Minor Changes
281
282- Stabilize `unstable_patchRoutesOnNavigation` ([#11973](https://github.com/remix-run/react-router/pull/11973))
283 - Add new `PatchRoutesOnNavigationFunctionArgs` type for convenience ([#11967](https://github.com/remix-run/react-router/pull/11967))
284- Stabilize `unstable_dataStrategy` ([#11974](https://github.com/remix-run/react-router/pull/11974))
285- Stabilize the `unstable_flushSync` option for navigations and fetchers ([#11989](https://github.com/remix-run/react-router/pull/11989))
286- Stabilize the `unstable_viewTransition` option for navigations and the corresponding `unstable_useViewTransitionState` hook ([#11989](https://github.com/remix-run/react-router/pull/11989))
287
288### Patch Changes
289
290- Fix bug when submitting to the current contextual route (parent route with an index child) when an `?index` param already exists from a prior submission ([#12003](https://github.com/remix-run/react-router/pull/12003))
291
292- Fix `useFormAction` bug - when removing `?index` param it would not keep other non-Remix `index` params ([#12003](https://github.com/remix-run/react-router/pull/12003))
293
294- Fix types for `RouteObject` within `PatchRoutesOnNavigationFunction`'s `patch` method so it doesn't expect agnostic route objects passed to `patch` ([#11967](https://github.com/remix-run/react-router/pull/11967))
295
296- Updated dependencies:
297 - `@remix-run/router@1.20.0`
298
299## 6.26.2
300
301### Patch Changes
302
303- Updated dependencies:
304 - `@remix-run/router@1.19.2`
305
306## 6.26.1
307
308### Patch Changes
309
310- Rename `unstable_patchRoutesOnMiss` to `unstable_patchRoutesOnNavigation` to match new behavior ([#11888](https://github.com/remix-run/react-router/pull/11888))
311- Updated dependencies:
312 - `@remix-run/router@1.19.1`
313
314## 6.26.0
315
316### Minor Changes
317
318- Add a new `replace(url, init?)` alternative to `redirect(url, init?)` that performs a `history.replaceState` instead of a `history.pushState` on client-side navigation redirects ([#11811](https://github.com/remix-run/react-router/pull/11811))
319
320### Patch Changes
321
322- Fix initial hydration behavior when using `future.v7_partialHydration` along with `unstable_patchRoutesOnMiss` ([#11838](https://github.com/remix-run/react-router/pull/11838))
323 - During initial hydration, `router.state.matches` will now include any partial matches so that we can render ancestor `HydrateFallback` components
324- Updated dependencies:
325 - `@remix-run/router@1.19.0`
326
327## 6.25.1
328
329No significant changes to this package were made in this release. [See the repo `CHANGELOG.md`](https://github.com/remix-run/react-router/blob/main/CHANGELOG.md) for an overview of all changes in v6.25.1.
330
331## 6.25.0
332
333### Minor Changes
334
335- Stabilize `future.unstable_skipActionErrorRevalidation` as `future.v7_skipActionErrorRevalidation` ([#11769](https://github.com/remix-run/react-router/pull/11769))
336 - When this flag is enabled, actions will not automatically trigger a revalidation if they return/throw a `Response` with a `4xx`/`5xx` status code
337 - You may still opt-into revalidation via `shouldRevalidate`
338 - This also changes `shouldRevalidate`'s `unstable_actionStatus` parameter to `actionStatus`
339
340### Patch Changes
341
342- Fix regression and properly decode paths inside `useMatch` so matches/params reflect decoded params ([#11789](https://github.com/remix-run/react-router/pull/11789))
343- Updated dependencies:
344 - `@remix-run/router@1.18.0`
345
346## 6.24.1
347
348### Patch Changes
349
350- When using `future.v7_relativeSplatPath`, properly resolve relative paths in splat routes that are children of pathless routes ([#11633](https://github.com/remix-run/react-router/pull/11633))
351- Updated dependencies:
352 - `@remix-run/router@1.17.1`
353
354## 6.24.0
355
356### Minor Changes
357
358- Add support for Lazy Route Discovery (a.k.a. Fog of War) ([#11626](https://github.com/remix-run/react-router/pull/11626))
359 - RFC: <https://github.com/remix-run/react-router/discussions/11113>
360 - `unstable_patchRoutesOnMiss` docs: <https://reactrouter.com/v6/routers/create-browser-router>
361
362### Patch Changes
363
364- Updated dependencies:
365 - `@remix-run/router@1.17.0`
366
367## 6.23.1
368
369### Patch Changes
370
371- allow undefined to be resolved with `<Await>` ([#11513](https://github.com/remix-run/react-router/pull/11513))
372- Updated dependencies:
373 - `@remix-run/router@1.16.1`
374
375## 6.23.0
376
377### Minor Changes
378
379- Add a new `unstable_dataStrategy` configuration option ([#11098](https://github.com/remix-run/react-router/pull/11098))
380 - This option allows Data Router applications to take control over the approach for executing route loaders and actions
381 - The default implementation is today's behavior, to fetch all loaders in parallel, but this option allows users to implement more advanced data flows including Remix single-fetch, middleware/context APIs, automatic loader caching, and more
382
383### Patch Changes
384
385- Updated dependencies:
386 - `@remix-run/router@1.16.0`
387
388## 6.22.3
389
390### Patch Changes
391
392- Updated dependencies:
393 - `@remix-run/router@1.15.3`
394
395## 6.22.2
396
397### Patch Changes
398
399- Updated dependencies:
400 - `@remix-run/router@1.15.2`
401
402## 6.22.1
403
404### Patch Changes
405
406- Fix encoding/decoding issues with pre-encoded dynamic parameter values ([#11199](https://github.com/remix-run/react-router/pull/11199))
407- Updated dependencies:
408 - `@remix-run/router@1.15.1`
409
410## 6.22.0
411
412### Patch Changes
413
414- Updated dependencies:
415 - `@remix-run/router@1.15.0`
416
417## 6.21.3
418
419### Patch Changes
420
421- Remove leftover `unstable_` prefix from `Blocker`/`BlockerFunction` types ([#11187](https://github.com/remix-run/react-router/pull/11187))
422
423## 6.21.2
424
425### Patch Changes
426
427- Updated dependencies:
428 - `@remix-run/router@1.14.2`
429
430## 6.21.1
431
432### Patch Changes
433
434- Fix bug with `route.lazy` not working correctly on initial SPA load when `v7_partialHydration` is specified ([#11121](https://github.com/remix-run/react-router/pull/11121))
435- Updated dependencies:
436 - `@remix-run/router@1.14.1`
437
438## 6.21.0
439
440### Minor Changes
441
442- Add a new `future.v7_relativeSplatPath` flag to implement a breaking bug fix to relative routing when inside a splat route. ([#11087](https://github.com/remix-run/react-router/pull/11087))
443
444 This fix was originally added in [#10983](https://github.com/remix-run/react-router/issues/10983) and was later reverted in [#11078](https://github.com/remix-run/react-router/pull/11078) because it was determined that a large number of existing applications were relying on the buggy behavior (see [#11052](https://github.com/remix-run/react-router/issues/11052))
445
446 **The Bug**
447 The buggy behavior is that without this flag, the default behavior when resolving relative paths is to _ignore_ any splat (`*`) portion of the current route path.
448
449 **The Background**
450 This decision was originally made thinking that it would make the concept of nested different sections of your apps in `<Routes>` easier if relative routing would _replace_ the current splat:
451
452 ```jsx
453 <BrowserRouter>
454 <Routes>
455 <Route path="/" element={<Home />} />
456 <Route path="dashboard/*" element={<Dashboard />} />
457 </Routes>
458 </BrowserRouter>
459 ```
460
461 Any paths like `/dashboard`, `/dashboard/team`, `/dashboard/projects` will match the `Dashboard` route. The dashboard component itself can then render nested `<Routes>`:
462
463 ```jsx
464 function Dashboard() {
465 return (
466 <div>
467 <h2>Dashboard</h2>
468 <nav>
469 <Link to="/">Dashboard Home</Link>
470 <Link to="team">Team</Link>
471 <Link to="projects">Projects</Link>
472 </nav>
473
474 <Routes>
475 <Route path="/" element={<DashboardHome />} />
476 <Route path="team" element={<DashboardTeam />} />
477 <Route path="projects" element={<DashboardProjects />} />
478 </Routes>
479 </div>
480 );
481 }
482 ```
483
484 Now, all links and route paths are relative to the router above them. This makes code splitting and compartmentalizing your app really easy. You could render the `Dashboard` as its own independent app, or embed it into your large app without making any changes to it.
485
486 **The Problem**
487
488 The problem is that this concept of ignoring part of a path breaks a lot of other assumptions in React Router - namely that `"."` always means the current location pathname for that route. When we ignore the splat portion, we start getting invalid paths when using `"."`:
489
490 ```jsx
491 // If we are on URL /dashboard/team, and we want to link to /dashboard/team:
492 function DashboardTeam() {
493 // ❌ This is broken and results in <a href="/dashboard">
494 return <Link to=".">A broken link to the Current URL</Link>;
495
496 // ✅ This is fixed but super unintuitive since we're already at /dashboard/team!
497 return <Link to="./team">A broken link to the Current URL</Link>;
498 }
499 ```
500
501 We've also introduced an issue that we can no longer move our `DashboardTeam` component around our route hierarchy easily - since it behaves differently if we're underneath a non-splat route, such as `/dashboard/:widget`. Now, our `"."` links will, properly point to ourself _inclusive of the dynamic param value_ so behavior will break from it's corresponding usage in a `/dashboard/*` route.
502
503 Even worse, consider a nested splat route configuration:
504
505 ```jsx
506 <BrowserRouter>
507 <Routes>
508 <Route path="dashboard">
509 <Route path="*" element={<Dashboard />} />
510 </Route>
511 </Routes>
512 </BrowserRouter>
513 ```
514
515 Now, a `<Link to=".">` and a `<Link to="..">` inside the `Dashboard` component go to the same place! That is definitely not correct!
516
517 Another common issue arose in Data Routers (and Remix) where any `<Form>` should post to it's own route `action` if you the user doesn't specify a form action:
518
519 ```jsx
520 let router = createBrowserRouter({
521 path: "/dashboard",
522 children: [
523 {
524 path: "*",
525 action: dashboardAction,
526 Component() {
527 // ❌ This form is broken! It throws a 405 error when it submits because
528 // it tries to submit to /dashboard (without the splat value) and the parent
529 // `/dashboard` route doesn't have an action
530 return <Form method="post">...</Form>;
531 },
532 },
533 ],
534 });
535 ```
536
537 This is just a compounded issue from the above because the default location for a `Form` to submit to is itself (`"."`) - and if we ignore the splat portion, that now resolves to the parent route.
538
539 **The Solution**
540 If you are leveraging this behavior, it's recommended to enable the future flag, move your splat to it's own route, and leverage `../` for any links to "sibling" pages:
541
542 ```jsx
543 <BrowserRouter>
544 <Routes>
545 <Route path="dashboard">
546 <Route index path="*" element={<Dashboard />} />
547 </Route>
548 </Routes>
549 </BrowserRouter>
550
551 function Dashboard() {
552 return (
553 <div>
554 <h2>Dashboard</h2>
555 <nav>
556 <Link to="..">Dashboard Home</Link>
557 <Link to="../team">Team</Link>
558 <Link to="../projects">Projects</Link>
559 </nav>
560
561 <Routes>
562 <Route path="/" element={<DashboardHome />} />
563 <Route path="team" element={<DashboardTeam />} />
564 <Route path="projects" element={<DashboardProjects />} />
565 </Router>
566 </div>
567 );
568 }
569 ```
570
571 This way, `.` means "the full current pathname for my route" in all cases (including static, dynamic, and splat routes) and `..` always means "my parents pathname".
572
573### Patch Changes
574
575- Properly handle falsy error values in ErrorBoundary's ([#11071](https://github.com/remix-run/react-router/pull/11071))
576- Updated dependencies:
577 - `@remix-run/router@1.14.0`
578
579## 6.20.1
580
581### Patch Changes
582
583- Revert the `useResolvedPath` fix for splat routes due to a large number of applications that were relying on the buggy behavior (see <https://github.com/remix-run/react-router/issues/11052#issuecomment-1836589329>). We plan to re-introduce this fix behind a future flag in the next minor version. ([#11078](https://github.com/remix-run/react-router/pull/11078))
584- Updated dependencies:
585 - `@remix-run/router@1.13.1`
586
587## 6.20.0
588
589### Minor Changes
590
591- Export the `PathParam` type from the public API ([#10719](https://github.com/remix-run/react-router/pull/10719))
592
593### Patch Changes
594
595- Fix bug with `resolveTo` in splat routes ([#11045](https://github.com/remix-run/react-router/pull/11045))
596 - This is a follow up to [#10983](https://github.com/remix-run/react-router/pull/10983) to handle the few other code paths using `getPathContributingMatches`
597 - This removes the `UNSAFE_getPathContributingMatches` export from `@remix-run/router` since we no longer need this in the `react-router`/`react-router-dom` layers
598- Updated dependencies:
599 - `@remix-run/router@1.13.0`
600
601## 6.19.0
602
603### Minor Changes
604
605- Add `unstable_flushSync` option to `useNavigate`/`useSumbit`/`fetcher.load`/`fetcher.submit` to opt-out of `React.startTransition` and into `ReactDOM.flushSync` for state updates ([#11005](https://github.com/remix-run/react-router/pull/11005))
606- Remove the `unstable_` prefix from the [`useBlocker`](https://reactrouter.com/v6/hooks/use-blocker) hook as it's been in use for enough time that we are confident in the API. We do not plan to remove the prefix from `unstable_usePrompt` due to differences in how browsers handle `window.confirm` that prevent React Router from guaranteeing consistent/correct behavior. ([#10991](https://github.com/remix-run/react-router/pull/10991))
607
608### Patch Changes
609
610- Fix `useActionData` so it returns proper contextual action data and not _any_ action data in the tree ([#11023](https://github.com/remix-run/react-router/pull/11023))
611
612- Fix bug in `useResolvedPath` that would cause `useResolvedPath(".")` in a splat route to lose the splat portion of the URL path. ([#10983](https://github.com/remix-run/react-router/pull/10983))
613
614 - ⚠️ This fixes a quite long-standing bug specifically for `"."` paths inside a splat route which incorrectly dropped the splat portion of the URL. If you are relative routing via `"."` inside a splat route in your application you should double check that your logic is not relying on this buggy behavior and update accordingly.
615
616- Updated dependencies:
617 - `@remix-run/router@1.12.0`
618
619## 6.18.0
620
621### Patch Changes
622
623- Fix the `future` prop on `BrowserRouter`, `HashRouter` and `MemoryRouter` so that it accepts a `Partial<FutureConfig>` instead of requiring all flags to be included. ([#10962](https://github.com/remix-run/react-router/pull/10962))
624- Updated dependencies:
625 - `@remix-run/router@1.11.0`
626
627## 6.17.0
628
629### Patch Changes
630
631- Fix `RouterProvider` `future` prop type to be a `Partial<FutureConfig>` so that not all flags must be specified ([#10900](https://github.com/remix-run/react-router/pull/10900))
632- Updated dependencies:
633 - `@remix-run/router@1.10.0`
634
635## 6.16.0
636
637### Minor Changes
638
639- In order to move towards stricter TypeScript support in the future, we're aiming to replace current usages of `any` with `unknown` on exposed typings for user-provided data. To do this in Remix v2 without introducing breaking changes in React Router v6, we have added generics to a number of shared types. These continue to default to `any` in React Router and are overridden with `unknown` in Remix. In React Router v7 we plan to move these to `unknown` as a breaking change. ([#10843](https://github.com/remix-run/react-router/pull/10843))
640 - `Location` now accepts a generic for the `location.state` value
641 - `ActionFunctionArgs`/`ActionFunction`/`LoaderFunctionArgs`/`LoaderFunction` now accept a generic for the `context` parameter (only used in SSR usages via `createStaticHandler`)
642 - The return type of `useMatches` (now exported as `UIMatch`) accepts generics for `match.data` and `match.handle` - both of which were already set to `unknown`
643- Move the `@private` class export `ErrorResponse` to an `UNSAFE_ErrorResponseImpl` export since it is an implementation detail and there should be no construction of `ErrorResponse` instances in userland. This frees us up to export a `type ErrorResponse` which correlates to an instance of the class via `InstanceType`. Userland code should only ever be using `ErrorResponse` as a type and should be type-narrowing via `isRouteErrorResponse`. ([#10811](https://github.com/remix-run/react-router/pull/10811))
644- Export `ShouldRevalidateFunctionArgs` interface ([#10797](https://github.com/remix-run/react-router/pull/10797))
645- Removed private/internal APIs only required for the Remix v1 backwards compatibility layer and no longer needed in Remix v2 (`_isFetchActionRedirect`, `_hasFetcherDoneAnything`) ([#10715](https://github.com/remix-run/react-router/pull/10715))
646
647### Patch Changes
648
649- Updated dependencies:
650 - `@remix-run/router@1.9.0`
651
652## 6.15.0
653
654### Minor Changes
655
656- Add's a new `redirectDocument()` function which allows users to specify that a redirect from a `loader`/`action` should trigger a document reload (via `window.location`) instead of attempting to navigate to the redirected location via React Router ([#10705](https://github.com/remix-run/react-router/pull/10705))
657
658### Patch Changes
659
660- Ensure `useRevalidator` is referentially stable across re-renders if revalidations are not actively occurring ([#10707](https://github.com/remix-run/react-router/pull/10707))
661- Updated dependencies:
662 - `@remix-run/router@1.8.0`
663
664## 6.14.2
665
666### Patch Changes
667
668- Updated dependencies:
669 - `@remix-run/router@1.7.2`
670
671## 6.14.1
672
673### Patch Changes
674
675- Fix loop in `unstable_useBlocker` when used with an unstable blocker function ([#10652](https://github.com/remix-run/react-router/pull/10652))
676- Fix issues with reused blockers on subsequent navigations ([#10656](https://github.com/remix-run/react-router/pull/10656))
677- Updated dependencies:
678 - `@remix-run/router@1.7.1`
679
680## 6.14.0
681
682### Patch Changes
683
684- Strip `basename` from locations provided to `unstable_useBlocker` functions to match `useLocation` ([#10573](https://github.com/remix-run/react-router/pull/10573))
685- Fix `generatePath` when passed a numeric `0` value parameter ([#10612](https://github.com/remix-run/react-router/pull/10612))
686- Fix `unstable_useBlocker` key issues in `StrictMode` ([#10573](https://github.com/remix-run/react-router/pull/10573))
687- Fix `tsc --skipLibCheck:false` issues on React 17 ([#10622](https://github.com/remix-run/react-router/pull/10622))
688- Upgrade `typescript` to 5.1 ([#10581](https://github.com/remix-run/react-router/pull/10581))
689- Updated dependencies:
690 - `@remix-run/router@1.7.0`
691
692## 6.13.0
693
694### Minor Changes
695
696- Move [`React.startTransition`](https://react.dev/reference/react/startTransition) usage behind a [future flag](https://reactrouter.com/v6/guides/api-development-strategy) to avoid issues with existing incompatible `Suspense` usages. We recommend folks adopting this flag to be better compatible with React concurrent mode, but if you run into issues you can continue without the use of `startTransition` until v7. Issues usually boils down to creating net-new promises during the render cycle, so if you run into issues you should either lift your promise creation out of the render cycle or put it behind a `useMemo`. ([#10596](https://github.com/remix-run/react-router/pull/10596))
697
698 Existing behavior will no longer include `React.startTransition`:
699
700 ```jsx
701 <BrowserRouter>
702 <Routes>{/*...*/}</Routes>
703 </BrowserRouter>
704
705 <RouterProvider router={router} />
706 ```
707
708 If you wish to enable `React.startTransition`, pass the future flag to your component:
709
710 ```jsx
711 <BrowserRouter future={{ v7_startTransition: true }}>
712 <Routes>{/*...*/}</Routes>
713 </BrowserRouter>
714
715 <RouterProvider router={router} future={{ v7_startTransition: true }}/>
716 ```
717
718### Patch Changes
719
720- Work around webpack/terser `React.startTransition` minification bug in production mode ([#10588](https://github.com/remix-run/react-router/pull/10588))
721
722## 6.12.1
723
724> \[!WARNING]
725> Please use version `6.13.0` or later instead of `6.12.1`. This version suffers from a `webpack`/`terser` minification issue resulting in invalid minified code in your resulting production bundles which can cause issues in your application. See [#10579](https://github.com/remix-run/react-router/issues/10579) for more details.
726
727### Patch Changes
728
729- Adjust feature detection of `React.startTransition` to fix webpack + react 17 compilation error ([#10569](https://github.com/remix-run/react-router/pull/10569))
730
731## 6.12.0
732
733### Minor Changes
734
735- Wrap internal router state updates with `React.startTransition` if it exists ([#10438](https://github.com/remix-run/react-router/pull/10438))
736
737### Patch Changes
738
739- Updated dependencies:
740 - `@remix-run/router@1.6.3`
741
742## 6.11.2
743
744### Patch Changes
745
746- Fix `basename` duplication in descendant `<Routes>` inside a `<RouterProvider>` ([#10492](https://github.com/remix-run/react-router/pull/10492))
747- Updated dependencies:
748 - `@remix-run/router@1.6.2`
749
750## 6.11.1
751
752### Patch Changes
753
754- Fix usage of `Component` API within descendant `<Routes>` ([#10434](https://github.com/remix-run/react-router/pull/10434))
755- Fix bug when calling `useNavigate` from `<Routes>` inside a `<RouterProvider>` ([#10432](https://github.com/remix-run/react-router/pull/10432))
756- Fix usage of `<Navigate>` in strict mode when using a data router ([#10435](https://github.com/remix-run/react-router/pull/10435))
757- Updated dependencies:
758 - `@remix-run/router@1.6.1`
759
760## 6.11.0
761
762### Patch Changes
763
764- Log loader/action errors to the console in dev for easier stack trace evaluation ([#10286](https://github.com/remix-run/react-router/pull/10286))
765- Fix bug preventing rendering of descendant `<Routes>` when `RouterProvider` errors existed ([#10374](https://github.com/remix-run/react-router/pull/10374))
766- Fix inadvertent re-renders when using `Component` instead of `element` on a route definition ([#10287](https://github.com/remix-run/react-router/pull/10287))
767- Fix detection of `useNavigate` in the render cycle by setting the `activeRef` in a layout effect, allowing the `navigate` function to be passed to child components and called in a `useEffect` there. ([#10394](https://github.com/remix-run/react-router/pull/10394))
768- Switched from `useSyncExternalStore` to `useState` for internal `@remix-run/router` router state syncing in `<RouterProvider>`. We found some [subtle bugs](https://codesandbox.io/s/use-sync-external-store-loop-9g7b81) where router state updates got propagated _before_ other normal `useState` updates, which could lead to footguns in `useEffect` calls. ([#10377](https://github.com/remix-run/react-router/pull/10377), [#10409](https://github.com/remix-run/react-router/pull/10409))
769- Allow `useRevalidator()` to resolve a loader-driven error boundary scenario ([#10369](https://github.com/remix-run/react-router/pull/10369))
770- Avoid unnecessary unsubscribe/resubscribes on router state changes ([#10409](https://github.com/remix-run/react-router/pull/10409))
771- When using a `RouterProvider`, `useNavigate`/`useSubmit`/`fetcher.submit` are now stable across location changes, since we can handle relative routing via the `@remix-run/router` instance and get rid of our dependence on `useLocation()`. When using `BrowserRouter`, these hooks remain unstable across location changes because they still rely on `useLocation()`. ([#10336](https://github.com/remix-run/react-router/pull/10336))
772- Updated dependencies:
773 - `@remix-run/router@1.6.0`
774
775## 6.10.0
776
777### Minor Changes
778
779- Added support for [**Future Flags**](https://reactrouter.com/v6/guides/api-development-strategy) in React Router. The first flag being introduced is `future.v7_normalizeFormMethod` which will normalize the exposed `useNavigation()/useFetcher()` `formMethod` fields as uppercase HTTP methods to align with the `fetch()` behavior. ([#10207](https://github.com/remix-run/react-router/pull/10207))
780
781 - When `future.v7_normalizeFormMethod === false` (default v6 behavior),
782 - `useNavigation().formMethod` is lowercase
783 - `useFetcher().formMethod` is lowercase
784 - When `future.v7_normalizeFormMethod === true`:
785 - `useNavigation().formMethod` is uppercase
786 - `useFetcher().formMethod` is uppercase
787
788### Patch Changes
789
790- Fix route ID generation when using Fragments in `createRoutesFromElements` ([#10193](https://github.com/remix-run/react-router/pull/10193))
791- Updated dependencies:
792 - `@remix-run/router@1.5.0`
793
794## 6.9.0
795
796### Minor Changes
797
798- React Router now supports an alternative way to define your route `element` and `errorElement` fields as React Components instead of React Elements. You can instead pass a React Component to the new `Component` and `ErrorBoundary` fields if you choose. There is no functional difference between the two, so use whichever approach you prefer 😀. You shouldn't be defining both, but if you do `Component`/`ErrorBoundary` will "win". ([#10045](https://github.com/remix-run/react-router/pull/10045))
799
800 **Example JSON Syntax**
801
802 ```jsx
803 // Both of these work the same:
804 const elementRoutes = [{
805 path: '/',
806 element: <Home />,
807 errorElement: <HomeError />,
808 }]
809
810 const componentRoutes = [{
811 path: '/',
812 Component: Home,
813 ErrorBoundary: HomeError,
814 }]
815
816 function Home() { ... }
817 function HomeError() { ... }
818 ```
819
820 **Example JSX Syntax**
821
822 ```jsx
823 // Both of these work the same:
824 const elementRoutes = createRoutesFromElements(
825 <Route path='/' element={<Home />} errorElement={<HomeError /> } />
826 );
827
828 const componentRoutes = createRoutesFromElements(
829 <Route path='/' Component={Home} ErrorBoundary={HomeError} />
830 );
831
832 function Home() { ... }
833 function HomeError() { ... }
834 ```
835
836- **Introducing Lazy Route Modules!** ([#10045](https://github.com/remix-run/react-router/pull/10045))
837
838 In order to keep your application bundles small and support code-splitting of your routes, we've introduced a new `lazy()` route property. This is an async function that resolves the non-route-matching portions of your route definition (`loader`, `action`, `element`/`Component`, `errorElement`/`ErrorBoundary`, `shouldRevalidate`, `handle`).
839
840 Lazy routes are resolved on initial load and during the `loading` or `submitting` phase of a navigation or fetcher call. You cannot lazily define route-matching properties (`path`, `index`, `children`) since we only execute your lazy route functions after we've matched known routes.
841
842 Your `lazy` functions will typically return the result of a dynamic import.
843
844 ```jsx
845 // In this example, we assume most folks land on the homepage so we include that
846 // in our critical-path bundle, but then we lazily load modules for /a and /b so
847 // they don't load until the user navigates to those routes
848 let routes = createRoutesFromElements(
849 <Route path="/" element={<Layout />}>
850 <Route index element={<Home />} />
851 <Route path="a" lazy={() => import("./a")} />
852 <Route path="b" lazy={() => import("./b")} />
853 </Route>
854 );
855 ```
856
857 Then in your lazy route modules, export the properties you want defined for the route:
858
859 ```jsx
860 export async function loader({ request }) {
861 let data = await fetchData(request);
862 return json(data);
863 }
864
865 // Export a `Component` directly instead of needing to create a React Element from it
866 export function Component() {
867 let data = useLoaderData();
868
869 return (
870 <>
871 <h1>You made it!</h1>
872 <p>{data}</p>
873 </>
874 );
875 }
876
877 // Export an `ErrorBoundary` directly instead of needing to create a React Element from it
878 export function ErrorBoundary() {
879 let error = useRouteError();
880 return isRouteErrorResponse(error) ? (
881 <h1>
882 {error.status} {error.statusText}
883 </h1>
884 ) : (
885 <h1>{error.message || error}</h1>
886 );
887 }
888 ```
889
890 An example of this in action can be found in the [`examples/lazy-loading-router-provider`](https://github.com/remix-run/react-router/tree/main/examples/lazy-loading-router-provider) directory of the repository.
891
892 🙌 Huge thanks to @rossipedia for the [Initial Proposal](https://github.com/remix-run/react-router/discussions/9826) and [POC Implementation](https://github.com/remix-run/react-router/pull/9830).
893
894- Updated dependencies:
895 - `@remix-run/router@1.4.0`
896
897### Patch Changes
898
899- Fix `generatePath` incorrectly applying parameters in some cases ([#10078](https://github.com/remix-run/react-router/pull/10078))
900- Improve memoization for context providers to avoid unnecessary re-renders ([#9983](https://github.com/remix-run/react-router/pull/9983))
901
902## 6.8.2
903
904### Patch Changes
905
906- Updated dependencies:
907 - `@remix-run/router@1.3.3`
908
909## 6.8.1
910
911### Patch Changes
912
913- Remove inaccurate console warning for POP navigations and update active blocker logic ([#10030](https://github.com/remix-run/react-router/pull/10030))
914- Updated dependencies:
915 - `@remix-run/router@1.3.2`
916
917## 6.8.0
918
919### Patch Changes
920
921- Updated dependencies:
922 - `@remix-run/router@1.3.1`
923
924## 6.7.0
925
926### Minor Changes
927
928- Add `unstable_useBlocker` hook for blocking navigations within the app's location origin ([#9709](https://github.com/remix-run/react-router/pull/9709))
929
930### Patch Changes
931
932- Fix `generatePath` when optional params are present ([#9764](https://github.com/remix-run/react-router/pull/9764))
933- Update `<Await>` to accept `ReactNode` as children function return result ([#9896](https://github.com/remix-run/react-router/pull/9896))
934- Updated dependencies:
935 - `@remix-run/router@1.3.0`
936
937## 6.6.2
938
939### Patch Changes
940
941- Ensure `useId` consistency during SSR ([#9805](https://github.com/remix-run/react-router/pull/9805))
942
943## 6.6.1
944
945### Patch Changes
946
947- Updated dependencies:
948 - `@remix-run/router@1.2.1`
949
950## 6.6.0
951
952### Patch Changes
953
954- Prevent `useLoaderData` usage in `errorElement` ([#9735](https://github.com/remix-run/react-router/pull/9735))
955- Updated dependencies:
956 - `@remix-run/router@1.2.0`
957
958## 6.5.0
959
960This release introduces support for [Optional Route Segments](https://github.com/remix-run/react-router/issues/9546). Now, adding a `?` to the end of any path segment will make that entire segment optional. This works for both static segments and dynamic parameters.
961
962**Optional Params Examples**
963
964- `<Route path=":lang?/about>` will match:
965 - `/:lang/about`
966 - `/about`
967- `<Route path="/multistep/:widget1?/widget2?/widget3?">` will match:
968 - `/multistep`
969 - `/multistep/:widget1`
970 - `/multistep/:widget1/:widget2`
971 - `/multistep/:widget1/:widget2/:widget3`
972
973**Optional Static Segment Example**
974
975- `<Route path="/home?">` will match:
976 - `/`
977 - `/home`
978- `<Route path="/fr?/about">` will match:
979 - `/about`
980 - `/fr/about`
981
982### Minor Changes
983
984- Allows optional routes and optional static segments ([#9650](https://github.com/remix-run/react-router/pull/9650))
985
986### Patch Changes
987
988- Stop incorrectly matching on partial named parameters, i.e. `<Route path="prefix-:param">`, to align with how splat parameters work. If you were previously relying on this behavior then it's recommended to extract the static portion of the path at the `useParams` call site: ([#9506](https://github.com/remix-run/react-router/pull/9506))
989
990```jsx
991// Old behavior at URL /prefix-123
992<Route path="prefix-:id" element={<Comp /> }>
993
994function Comp() {
995 let params = useParams(); // { id: '123' }
996 let id = params.id; // "123"
997 ...
998}
999
1000// New behavior at URL /prefix-123
1001<Route path=":id" element={<Comp /> }>
1002
1003function Comp() {
1004 let params = useParams(); // { id: 'prefix-123' }
1005 let id = params.id.replace(/^prefix-/, ''); // "123"
1006 ...
1007}
1008```
1009
1010- Updated dependencies:
1011 - `@remix-run/router@1.1.0`
1012
1013## 6.4.5
1014
1015### Patch Changes
1016
1017- Updated dependencies:
1018 - `@remix-run/router@1.0.5`
1019
1020## 6.4.4
1021
1022### Patch Changes
1023
1024- Updated dependencies:
1025 - `@remix-run/router@1.0.4`
1026
1027## 6.4.3
1028
1029### Patch Changes
1030
1031- `useRoutes` should be able to return `null` when passing `locationArg` ([#9485](https://github.com/remix-run/react-router/pull/9485))
1032- fix `initialEntries` type in `createMemoryRouter` ([#9498](https://github.com/remix-run/react-router/pull/9498))
1033- Updated dependencies:
1034 - `@remix-run/router@1.0.3`
1035
1036## 6.4.2
1037
1038### Patch Changes
1039
1040- Fix `IndexRouteObject` and `NonIndexRouteObject` types to make `hasErrorElement` optional ([#9394](https://github.com/remix-run/react-router/pull/9394))
1041- Enhance console error messages for invalid usage of data router hooks ([#9311](https://github.com/remix-run/react-router/pull/9311))
1042- If an index route has children, it will result in a runtime error. We have strengthened our `RouteObject`/`RouteProps` types to surface the error in TypeScript. ([#9366](https://github.com/remix-run/react-router/pull/9366))
1043- Updated dependencies:
1044 - `@remix-run/router@1.0.2`
1045
1046## 6.4.1
1047
1048### Patch Changes
1049
1050- Preserve state from `initialEntries` ([#9288](https://github.com/remix-run/react-router/pull/9288))
1051- Updated dependencies:
1052 - `@remix-run/router@1.0.1`
1053
1054## 6.4.0
1055
1056Whoa this is a big one! `6.4.0` brings all the data loading and mutation APIs over from Remix. Here's a quick high level overview, but it's recommended you go check out the [docs](https://reactrouter.com), especially the [feature overview](https://reactrouter.com/en/6.4.0/start/overview) and the [tutorial](https://reactrouter.com/en/6.4.0/start/tutorial).
1057
1058**New APIs**
1059
1060- Create your router with `createMemoryRouter`
1061- Render your router with `<RouterProvider>`
1062- Load data with a Route `loader` and mutate with a Route `action`
1063- Handle errors with Route `errorElement`
1064- Defer non-critical data with `defer` and `Await`
1065
1066**Bug Fixes**
1067
1068- Path resolution is now trailing slash agnostic (#8861)
1069- `useLocation` returns the scoped location inside a `<Routes location>` component (#9094)
1070
1071**Updated Dependencies**
1072
1073- `@remix-run/router@1.0.0`