react-router
Advanced tools
440
CHANGELOG.md
# `react-router` | ||
## 7.2.0 | ||
### Minor Changes | ||
- New type-safe `href` utility that guarantees links point to actual paths in your app ([#13012](https://github.com/remix-run/react-router/pull/13012)) | ||
```tsx | ||
import { href } from "react-router"; | ||
export default function Component() { | ||
const link = href("/blog/:slug", { slug: "my-first-post" }); | ||
return ( | ||
<main> | ||
<Link to={href("/products/:id", { id: "asdf" })} /> | ||
<NavLink to={href("/:lang?/about", { lang: "en" })} /> | ||
</main> | ||
); | ||
} | ||
``` | ||
### Patch Changes | ||
- Fix typegen for repeated params ([#13012](https://github.com/remix-run/react-router/pull/13012)) | ||
In React Router, path parameters are keyed by their name. | ||
So for a path pattern like `/a/:id/b/:id?/c/:id`, the last `:id` will set the value for `id` in `useParams` and the `params` prop. | ||
For example, `/a/1/b/2/c/3` will result in the value `{ id: 3 }` at runtime. | ||
Previously, generated types for params incorrectly modeled repeated params with an array. | ||
So `/a/1/b/2/c/3` generated a type like `{ id: [1,2,3] }`. | ||
To be consistent with runtime behavior, the generated types now correctly model the "last one wins" semantics of path parameters. | ||
So `/a/1/b/2/c/3` now generates a type like `{ id: 3 }`. | ||
- Don't apply Single Fetch revalidation de-optimization when in SPA mode since there is no server HTTP request ([#12948](https://github.com/remix-run/react-router/pull/12948)) | ||
- Properly handle revalidations to across a prerender/SPA boundary ([#13021](https://github.com/remix-run/react-router/pull/13021)) | ||
- In "hybrid" applications where some routes are pre-rendered and some are served from a SPA fallback, we need to avoid making `.data` requests if the path wasn't pre-rendered because the request will 404 | ||
- We don't know all the pre-rendered paths client-side, however: | ||
- All `loader` data in `ssr:false` mode is static because it's generated at build time | ||
- A route must use a `clientLoader` to do anything dynamic | ||
- Therefore, if a route only has a `loader` and not a `clientLoader`, we disable revalidation by default because there is no new data to retrieve | ||
- We short circuit and skip single fetch `.data` request logic if there are no server loaders with `shouldLoad=true` in our single fetch `dataStrategy` | ||
- This ensures that the route doesn't cause a `.data` request that would 404 after a submission | ||
- Error at build time in `ssr:false` + `prerender` apps for the edge case scenario of: ([#13021](https://github.com/remix-run/react-router/pull/13021)) | ||
- A parent route has only a `loader` (does not have a `clientLoader`) | ||
- The parent route is pre-rendered | ||
- The parent route has children routes which are not prerendered | ||
- This means that when the child paths are loaded via the SPA fallback, the parent won't have any `loaderData` because there is no server on which to run the `loader` | ||
- This can be resolved by either adding a parent `clientLoader` or pre-rendering the child paths | ||
- If you add a `clientLoader`, calling the `serverLoader()` on non-prerendered paths will throw a 404 | ||
- Add unstable support for splitting route modules in framework mode via `future.unstable_splitRouteModules` ([#11871](https://github.com/remix-run/react-router/pull/11871)) | ||
- Add `unstable_SerializesTo` brand type for library authors to register types serializable by React Router's streaming format (`turbo-stream`) ([`ab5b05b02`](https://github.com/remix-run/react-router/commit/ab5b05b02f99f062edb3c536c392197c88eb6c77)) | ||
- Align dev server behavior with static file server behavior when `ssr:false` is set ([#12948](https://github.com/remix-run/react-router/pull/12948)) | ||
- When no `prerender` config exists, only SSR down to the root `HydrateFallback` (SPA Mode) | ||
- When a `prerender` config exists but the current path is not prerendered, only SSR down to the root `HydrateFallback` (SPA Fallback) | ||
- Return a 404 on `.data` requests to non-pre-rendered paths | ||
- Improve prefetch performance of CSS side effects in framework mode ([#12889](https://github.com/remix-run/react-router/pull/12889)) | ||
- Disable Lazy Route Discovery for all `ssr:false` apps and not just "SPA Mode" because there is no runtime server to serve the search-param-configured `__manifest` requests ([#12894](https://github.com/remix-run/react-router/pull/12894)) | ||
- We previously only disabled this for "SPA Mode" which is `ssr:false` and no `prerender` config but we realized it should apply to all `ssr:false` apps, including those prerendering multiple pages | ||
- In those `prerender` scenarios we would prerender the `/__manifest` file assuming the static file server would serve it but that makes some unneccesary assumptions about the static file server behaviors | ||
- Properly handle interrupted manifest requests in lazy route discovery ([#12915](https://github.com/remix-run/react-router/pull/12915)) | ||
## 7.1.5 | ||
### Patch Changes | ||
- Fix regression introduced in `7.1.4` via [#12800](https://github.com/remix-run/react-router/pull/12800) that caused issues navigating to hash routes inside splat routes for applications using Lazy Route Discovery (`patchRoutesOnNavigation`) ([#12927](https://github.com/remix-run/react-router/pull/12927)) | ||
## 7.1.4 | ||
### Patch Changes | ||
- Internal reorg to clean up some duplicated route module types ([#12799](https://github.com/remix-run/react-router/pull/12799)) | ||
- Properly handle status codes that cannot have a body in single fetch responses (204, etc.) ([#12760](https://github.com/remix-run/react-router/pull/12760)) | ||
- Stop erroring on resource routes that return raw strings/objects and instead serialize them as `text/plain` or `application/json` responses ([#12848](https://github.com/remix-run/react-router/pull/12848)) | ||
- This only applies when accessed as a resource route without the `.data` extension | ||
- When accessed from a Single Fetch `.data` request, they will still be encoded via `turbo-stream` | ||
- Optimize Lazy Route Discovery path discovery to favor a single `querySelectorAll` call at the `body` level instead of many calls at the sub-tree level ([#12731](https://github.com/remix-run/react-router/pull/12731)) | ||
- Properly bubble headers as `errorHeaders` when throwing a `data()` result ([#12846](https://github.com/remix-run/react-router/pull/12846)) | ||
- Avoid duplication of `Set-Cookie` headers could be duplicated if also returned from `headers` | ||
- Optimize route matching by skipping redundant `matchRoutes` calls when possible ([#12800](https://github.com/remix-run/react-router/pull/12800)) | ||
## 7.1.3 | ||
_No changes_ | ||
## 7.1.2 | ||
### Patch Changes | ||
- Fix issue with fetcher data cleanup in the data layer on fetcher unmount ([#12681](https://github.com/remix-run/react-router/pull/12681)) | ||
- Do not rely on `symbol` for filtering out `redirect` responses from loader data ([#12694](https://github.com/remix-run/react-router/pull/12694)) | ||
Previously, some projects were getting type checking errors like: | ||
```ts | ||
error TS4058: Return type of exported function has or is using name 'redirectSymbol' from external module "node_modules/..." but cannot be named. | ||
``` | ||
Now that `symbol`s are not used for the `redirect` response type, these errors should no longer be present. | ||
## 7.1.1 | ||
_No changes_ | ||
## 7.1.0 | ||
### Patch Changes | ||
- Throw unwrapped single fetch redirect to align with pre-single fetch behavior ([#12506](https://github.com/remix-run/react-router/pull/12506)) | ||
- Ignore redirects when inferring loader data types ([#12527](https://github.com/remix-run/react-router/pull/12527)) | ||
- Remove `<Link prefetch>` warning which suffers from false positives in a lazy route discovery world ([#12485](https://github.com/remix-run/react-router/pull/12485)) | ||
## 7.0.2 | ||
### Patch Changes | ||
- 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)) | ||
- Generate wide `matches` and `params` types for current route and child routes ([#12397](https://github.com/remix-run/react-router/pull/12397)) | ||
At runtime, `matches` includes child route matches and `params` include child route path parameters. | ||
But previously, we only generated types for parent routes in `matches`; for `params`, we only considered the parent routes and the current route. | ||
To align our generated types more closely to the runtime behavior, we now generate more permissive, wider types when accessing child route information. | ||
## 7.0.1 | ||
_No changes_ | ||
## 7.0.0 | ||
### Major Changes | ||
- 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)) | ||
- `defer` | ||
- `AbortedDeferredError` | ||
- `type TypedDeferredData` | ||
- `UNSAFE_DeferredData` | ||
- `UNSAFE_DEFERRED_SYMBOL`, | ||
- - Collapse `@remix-run/router` into `react-router` ([#11505](https://github.com/remix-run/react-router/pull/11505)) | ||
- Collapse `react-router-dom` into `react-router` | ||
- Collapse `@remix-run/server-runtime` into `react-router` | ||
- Collapse `@remix-run/testing` into `react-router` | ||
- Remove single_fetch future flag. ([#11522](https://github.com/remix-run/react-router/pull/11522)) | ||
- Drop support for Node 16, React Router SSR now requires Node 18 or higher ([#11391](https://github.com/remix-run/react-router/pull/11391)) | ||
- Remove `future.v7_startTransition` flag ([#11696](https://github.com/remix-run/react-router/pull/11696)) | ||
- - 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)) | ||
- `useNavigate()` | ||
- `useSubmit` | ||
- `useFetcher().load` | ||
- `useFetcher().submit` | ||
- `useRevalidator.revalidate` | ||
- Remove `future.v7_normalizeFormMethod` future flag ([#11697](https://github.com/remix-run/react-router/pull/11697)) | ||
- 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)) | ||
- `createCookie` | ||
- `createCookieSessionStorage` | ||
- `createMemorySessionStorage` | ||
- `createSessionStorage` | ||
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) | ||
Since platform-specific packages no longer need to implement this API, the following low-level APIs have been removed: | ||
- `createCookieFactory` | ||
- `createSessionStorageFactory` | ||
- `createCookieSessionStorageFactory` | ||
- `createMemorySessionStorageFactory` | ||
- Imports/Exports cleanup ([#11840](https://github.com/remix-run/react-router/pull/11840)) | ||
- Removed the following exports that were previously public API from `@remix-run/router` | ||
- types | ||
- `AgnosticDataIndexRouteObject` | ||
- `AgnosticDataNonIndexRouteObject` | ||
- `AgnosticDataRouteMatch` | ||
- `AgnosticDataRouteObject` | ||
- `AgnosticIndexRouteObject` | ||
- `AgnosticNonIndexRouteObject` | ||
- `AgnosticRouteMatch` | ||
- `AgnosticRouteObject` | ||
- `TrackedPromise` | ||
- `unstable_AgnosticPatchRoutesOnMissFunction` | ||
- `Action` -> exported as `NavigationType` via `react-router` | ||
- `Router` exported as `DataRouter` to differentiate from RR's `<Router>` | ||
- API | ||
- `getToPathname` (`@private`) | ||
- `joinPaths` (`@private`) | ||
- `normalizePathname` (`@private`) | ||
- `resolveTo` (`@private`) | ||
- `stripBasename` (`@private`) | ||
- `createBrowserHistory` -> in favor of `createBrowserRouter` | ||
- `createHashHistory` -> in favor of `createHashRouter` | ||
- `createMemoryHistory` -> in favor of `createMemoryRouter` | ||
- `createRouter` | ||
- `createStaticHandler` -> in favor of wrapper `createStaticHandler` in RR Dom | ||
- `getStaticContextFromError` | ||
- Removed the following exports that were previously public API from `react-router` | ||
- `Hash` | ||
- `Pathname` | ||
- `Search` | ||
- update minimum node version to 18 ([#11690](https://github.com/remix-run/react-router/pull/11690)) | ||
- Remove `future.v7_prependBasename` from the ionternalized `@remix-run/router` package ([#11726](https://github.com/remix-run/react-router/pull/11726)) | ||
- Migrate Remix type generics to React Router ([#12180](https://github.com/remix-run/react-router/pull/12180)) | ||
- These generics are provided for Remix v2 migration purposes | ||
- These generics and the APIs they exist on should be considered informally deprecated in favor of the new `Route.*` types | ||
- Anyone migrating from React Router v6 should probably not leverage these new generics and should migrate straight to the `Route.*` types | ||
- For React Router v6 users, these generics are new and should not impact your app, with one exception | ||
- `useFetcher` previously had an optional generic (used primarily by Remix v2) that expected the data type | ||
- This has been updated in v7 to expect the type of the function that generates the data (i.e., `typeof loader`/`typeof action`) | ||
- Therefore, you should update your usages: | ||
- ❌ `useFetcher<LoaderData>()` | ||
- ✅ `useFetcher<typeof loader>()` | ||
- Remove `future.v7_throwAbortReason` from internalized `@remix-run/router` package ([#11728](https://github.com/remix-run/react-router/pull/11728)) | ||
- Add `exports` field to all packages ([#11675](https://github.com/remix-run/react-router/pull/11675)) | ||
- node package no longer re-exports from react-router ([#11702](https://github.com/remix-run/react-router/pull/11702)) | ||
- renamed RemixContext to FrameworkContext ([#11705](https://github.com/remix-run/react-router/pull/11705)) | ||
- updates the minimum React version to 18 ([#11689](https://github.com/remix-run/react-router/pull/11689)) | ||
- PrefetchPageDescriptor replaced by PageLinkDescriptor ([#11960](https://github.com/remix-run/react-router/pull/11960)) | ||
- - 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)) | ||
- Examples: `LoaderFunction`, `LoaderFunctionArgs`, `ActionFunction`, `ActionFunctionArgs`, `DataFunctionArgs`, `RouteManifest`, `LinksFunction`, `Route`, `EntryRoute` | ||
- The `RouteManifest` type used by the "remix" code is now slightly stricter because it is using the former `@remix-run/router` `RouteManifest` | ||
- `Record<string, Route> -> Record<string, Route | undefined>` | ||
- Removed `AppData` type in favor of inlining `unknown` in the few locations it was used | ||
- Removed `ServerRuntimeMeta*` types in favor of the `Meta*` types they were duplicated from | ||
- - Remove the `future.v7_partialHydration` flag ([#11725](https://github.com/remix-run/react-router/pull/11725)) | ||
- This also removes the `<RouterProvider fallbackElement>` prop | ||
- To migrate, move the `fallbackElement` to a `hydrateFallbackElement`/`HydrateFallback` on your root route | ||
- Also worth nothing there is a related breaking changer with this future flag: | ||
- Without `future.v7_partialHydration` (when using `fallbackElement`), `state.navigation` was populated during the initial load | ||
- With `future.v7_partialHydration`, `state.navigation` remains in an `"idle"` state during the initial load | ||
- Remove `v7_relativeSplatPath` future flag ([#11695](https://github.com/remix-run/react-router/pull/11695)) | ||
- Drop support for Node 18, update minimum Node vestion to 20 ([#12171](https://github.com/remix-run/react-router/pull/12171)) | ||
- Remove `installGlobals()` as this should no longer be necessary | ||
- Remove remaining future flags ([#11820](https://github.com/remix-run/react-router/pull/11820)) | ||
- React Router `v7_skipActionErrorRevalidation` | ||
- Remix `v3_fetcherPersist`, `v3_relativeSplatPath`, `v3_throwAbortReason` | ||
- rename createRemixStub to createRoutesStub ([#11692](https://github.com/remix-run/react-router/pull/11692)) | ||
- Remove `@remix-run/router` deprecated `detectErrorBoundary` option in favor of `mapRouteProperties` ([#11751](https://github.com/remix-run/react-router/pull/11751)) | ||
- 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)) | ||
- 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 | ||
- DOM environments should import from `react-router/dom` to get the proper component that makes `ReactDOM.flushSync()` available: | ||
- If you are using the Vite plugin, use this in your `entry.client.tsx`: | ||
- `import { HydratedRouter } from 'react-router/dom'` | ||
- If you are not using the Vite plugin and are manually calling `createBrowserRouter`/`createHashRouter`: | ||
- `import { RouterProvider } from "react-router/dom"` | ||
- Remove `future.v7_fetcherPersist` flag ([#11731](https://github.com/remix-run/react-router/pull/11731)) | ||
- 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)) | ||
### Minor Changes | ||
- - 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)) | ||
- 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) | ||
- `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. | ||
```ts | ||
// react-router.config.ts | ||
import type { Config } from "@react-router/dev/config"; | ||
export default { | ||
async prerender() { | ||
let slugs = await fakeGetSlugsFromCms(); | ||
// Prerender these paths into `.html` files at build time, and `.data` | ||
// files if they have loaders | ||
return ["/", "/about", ...slugs.map((slug) => `/product/${slug}`)]; | ||
}, | ||
} satisfies Config; | ||
async function fakeGetSlugsFromCms() { | ||
await new Promise((r) => setTimeout(r, 1000)); | ||
return ["shirt", "hat"]; | ||
} | ||
``` | ||
- Params, loader data, and action data as props for route component exports ([#11961](https://github.com/remix-run/react-router/pull/11961)) | ||
```tsx | ||
export default function Component({ params, loaderData, actionData }) {} | ||
export function HydrateFallback({ params }) {} | ||
export function ErrorBoundary({ params, loaderData, actionData }) {} | ||
``` | ||
- Remove duplicate `RouterProvider` impliementations ([#11679](https://github.com/remix-run/react-router/pull/11679)) | ||
- ### Typesafety improvements ([#12019](https://github.com/remix-run/react-router/pull/12019)) | ||
React Router now generates types for each of your route modules. | ||
You can access those types by importing them from `./+types.<route filename without extension>`. | ||
For example: | ||
```ts | ||
// app/routes/product.tsx | ||
import type * as Route from "./+types.product"; | ||
export function loader({ params }: Route.LoaderArgs) {} | ||
export default function Component({ loaderData }: Route.ComponentProps) {} | ||
``` | ||
This initial implementation targets type inference for: | ||
- `Params` : Path parameters from your routing config in `routes.ts` including file-based routing | ||
- `LoaderData` : Loader data from `loader` and/or `clientLoader` within your route module | ||
- `ActionData` : Action data from `action` and/or `clientAction` within your route module | ||
In the future, we plan to add types for the rest of the route module exports: `meta`, `links`, `headers`, `shouldRevalidate`, etc. | ||
We also plan to generate types for typesafe `Link`s: | ||
```tsx | ||
<Link to="/products/:id" params={{ id: 1 }} /> | ||
// ^^^^^^^^^^^^^ ^^^^^^^^^ | ||
// typesafe `to` and `params` based on the available routes in your app | ||
``` | ||
Check out our docs for more: | ||
- [_Explanations > Type Safety_](https://reactrouter.com/dev/guides/explanation/type-safety) | ||
- [_How-To > Setting up type safety_](https://reactrouter.com/dev/guides/how-to/setting-up-type-safety) | ||
- Stabilize `unstable_dataStrategy` ([#11969](https://github.com/remix-run/react-router/pull/11969)) | ||
- Stabilize `unstable_patchRoutesOnNavigation` ([#11970](https://github.com/remix-run/react-router/pull/11970)) | ||
### Patch Changes | ||
- No changes ([`506329c4e`](https://github.com/remix-run/react-router/commit/506329c4e2e7aba9837cbfa44df6103b49423745)) | ||
- chore: re-enable development warnings through a `development` exports condition. ([#12269](https://github.com/remix-run/react-router/pull/12269)) | ||
- Remove unstable upload handler. ([#12015](https://github.com/remix-run/react-router/pull/12015)) | ||
- Remove unneeded dependency on @web3-storage/multipart-parser ([#12274](https://github.com/remix-run/react-router/pull/12274)) | ||
- Fix redirects returned from loaders/actions using `data()` ([#12021](https://github.com/remix-run/react-router/pull/12021)) | ||
- fix(react-router): (v7) fix static prerender of non-ascii characters ([#12161](https://github.com/remix-run/react-router/pull/12161)) | ||
- Replace `substr` with `substring` ([#12080](https://github.com/remix-run/react-router/pull/12080)) | ||
- Remove the deprecated `json` utility ([#12146](https://github.com/remix-run/react-router/pull/12146)) | ||
- 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 | ||
- Remove unneeded dependency on source-map ([#12275](https://github.com/remix-run/react-router/pull/12275)) | ||
## 6.28.0 | ||
### Minor Changes | ||
- - Log deprecation warnings for v7 flags ([#11750](https://github.com/remix-run/react-router/pull/11750)) | ||
- Add deprecation warnings to `json`/`defer` in favor of returning raw objects | ||
- These methods will be removed in React Router v7 | ||
### Patch Changes | ||
- Update JSDoc URLs for new website structure (add /v6/ segment) ([#12141](https://github.com/remix-run/react-router/pull/12141)) | ||
- Updated dependencies: | ||
- `@remix-run/router@1.21.0` | ||
## 6.27.0 | ||
### Minor Changes | ||
- Stabilize `unstable_patchRoutesOnNavigation` ([#11973](https://github.com/remix-run/react-router/pull/11973)) | ||
- Add new `PatchRoutesOnNavigationFunctionArgs` type for convenience ([#11967](https://github.com/remix-run/react-router/pull/11967)) | ||
- Stabilize `unstable_dataStrategy` ([#11974](https://github.com/remix-run/react-router/pull/11974)) | ||
- Stabilize the `unstable_flushSync` option for navigations and fetchers ([#11989](https://github.com/remix-run/react-router/pull/11989)) | ||
- Stabilize the `unstable_viewTransition` option for navigations and the corresponding `unstable_useViewTransitionState` hook ([#11989](https://github.com/remix-run/react-router/pull/11989)) | ||
### Patch Changes | ||
- 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)) | ||
- 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)) | ||
- 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)) | ||
- Updated dependencies: | ||
- `@remix-run/router@1.20.0` | ||
## 6.26.2 | ||
### Patch Changes | ||
- Updated dependencies: | ||
- `@remix-run/router@1.19.2` | ||
## 6.26.1 | ||
@@ -57,3 +487,3 @@ | ||
- RFC: <https://github.com/remix-run/react-router/discussions/11113> | ||
- `unstable_patchRoutesOnMiss` docs: <https://reactrouter.com/en/main/routers/create-browser-router> | ||
- `unstable_patchRoutesOnMiss` docs: <https://reactrouter.com/v6/routers/create-browser-router> | ||
@@ -304,3 +734,3 @@ ### Patch Changes | ||
- 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)) | ||
- Remove the `unstable_` prefix from the [`useBlocker`](https://reactrouter.com/en/main/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)) | ||
- 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)) | ||
@@ -395,3 +825,3 @@ ### Patch Changes | ||
- Move [`React.startTransition`](https://react.dev/reference/react/startTransition) usage behind a [future flag](https://reactrouter.com/en/main/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)) | ||
- 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)) | ||
@@ -479,3 +909,3 @@ Existing behavior will no longer include `React.startTransition`: | ||
- Added support for [**Future Flags**](https://reactrouter.com/en/main/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)) | ||
- 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)) | ||
@@ -757,3 +1187,3 @@ - When `future.v7_normalizeFormMethod === false` (default v6 behavior), | ||
Whoa 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/start/overview) and the [tutorial](https://reactrouter.com/start/tutorial). | ||
Whoa 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). | ||
@@ -760,0 +1190,0 @@ **New APIs** |
{ | ||
"name": "react-router", | ||
"version": "0.0.0-nightly-2aeb07881-20241103", | ||
"version": "0.0.0-nightly-2c5d54de7-20250226", | ||
"description": "Declarative routing for React", | ||
@@ -21,38 +21,42 @@ "keywords": [ | ||
"sideEffects": false, | ||
"types": "./dist/index.d.ts", | ||
"main": "./dist/index.js", | ||
"unpkg": "./dist/umd/react-router.production.min.js", | ||
"module": "./dist/index.mjs", | ||
"types": "./dist/development/index.d.ts", | ||
"main": "./dist/development/index.js", | ||
"module": "./dist/development/index.mjs", | ||
"exports": { | ||
".": { | ||
"node": { | ||
"types": "./dist/index.d.ts", | ||
"module-sync": "./dist/index.mjs", | ||
"default": "./dist/index.js" | ||
"types": "./dist/development/index.d.ts", | ||
"module-sync": "./dist/development/index.mjs", | ||
"default": "./dist/development/index.js" | ||
}, | ||
"import": { | ||
"types": "./dist/index.d.mts", | ||
"default": "./dist/index.mjs" | ||
"types": "./dist/development/index.d.mts", | ||
"default": "./dist/development/index.mjs" | ||
}, | ||
"default": { | ||
"types": "./dist/index.d.ts", | ||
"default": "./dist/index.js" | ||
"types": "./dist/development/index.d.ts", | ||
"default": "./dist/development/index.js" | ||
} | ||
}, | ||
"./types": { | ||
"types": "./dist/lib/types.d.ts" | ||
"./route-module": { | ||
"import": { | ||
"types": "./dist/development/lib/types/route-module.d.mts" | ||
}, | ||
"default": { | ||
"types": "./dist/development/lib/types/route-module.d.ts" | ||
} | ||
}, | ||
"./dom": { | ||
"node": { | ||
"types": "./dist/dom-export.d.ts", | ||
"module-sync": "./dist/dom-export.mjs", | ||
"default": "./dist/dom-export.js" | ||
"types": "./dist/development/dom-export.d.ts", | ||
"module-sync": "./dist/development/dom-export.mjs", | ||
"default": "./dist/development/dom-export.js" | ||
}, | ||
"import": { | ||
"types": "./dist/dom-export.d.mts", | ||
"default": "./dist/dom-export.mjs" | ||
"types": "./dist/development/dom-export.d.mts", | ||
"default": "./dist/development/dom-export.mjs" | ||
}, | ||
"default": { | ||
"types": "./dist/dom-export.d.ts", | ||
"default": "./dist/dom-export.js" | ||
"types": "./dist/development/dom-export.d.ts", | ||
"default": "./dist/development/dom-export.js" | ||
} | ||
@@ -78,6 +82,4 @@ }, | ||
"@types/cookie": "^0.6.0", | ||
"@web3-storage/multipart-parser": "^1.0.0", | ||
"cookie": "^1.0.1", | ||
"set-cookie-parser": "^2.6.0", | ||
"source-map": "^0.7.3", | ||
"turbo-stream": "2.4.0" | ||
@@ -113,4 +115,5 @@ }, | ||
"scripts": { | ||
"build": "wireit" | ||
"build": "wireit", | ||
"typecheck": "tsc" | ||
} | ||
} |
@@ -1,3 +0,7 @@ | ||
# React Router | ||
`react-router` is the primary package in the React Router project. | ||
The `react-router` package is the heart of [React Router](https://github.com/remix-run/react-router) and provides all the core functionality. | ||
## Installation | ||
```sh | ||
npm i react-router | ||
``` |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
2378608
108.61%6
-25%42
100%60088
106.54%8
100%8
100%13
85.71%