Update react-router monorepo to v6.14.2 #1716

Closed
opened 2026-04-05 16:34:09 +02:00 by MrUnknownDE · 0 comments
Owner

Originally created by @renovate[bot] on 8/5/2023

Mend Renovate

This PR contains the following updates:

Package Change Age Adoption Passing Confidence
react-router 6.4.5 -> 6.14.2 age adoption passing confidence
react-router 6.5.0 -> 6.14.2 age adoption passing confidence
react-router-dom 6.4.5 -> 6.14.2 age adoption passing confidence
react-router-dom 6.5.0 -> 6.14.2 age adoption passing confidence

Release Notes

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

v6.14.2

Compare Source

Patch Changes
  • Updated dependencies:
    • @remix-run/router@1.7.2

v6.14.1

Compare Source

Patch Changes
  • Fix loop in unstable_useBlocker when used with an unstable blocker function (#​10652)
  • Fix issues with reused blockers on subsequent navigations (#​10656)
  • Updated dependencies:
    • @remix-run/router@1.7.1

v6.14.0

Compare Source

Patch Changes
  • Strip basename from locations provided to unstable_useBlocker functions to match useLocation (#​10573)
  • Fix generatePath when passed a numeric 0 value parameter (#​10612)
  • Fix unstable_useBlocker key issues in StrictMode (#​10573)
  • Fix tsc --skipLibCheck:false issues on React 17 (#​10622)
  • Upgrade typescript to 5.1 (#​10581)
  • Updated dependencies:
    • @remix-run/router@1.7.0

v6.13.0

Compare Source

Minor Changes
  • Move React.startTransition usage behind a future flag 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)

    Existing behavior will no longer include React.startTransition:

    <BrowserRouter>
      <Routes>{/*...*/}</Routes>
    </BrowserRouter>
    
    <RouterProvider router={router} />
    

    If you wish to enable React.startTransition, pass the future flag to your component:

    <BrowserRouter future={{ v7_startTransition: true }}>
      <Routes>{/*...*/}</Routes>
    </BrowserRouter>
    
    <RouterProvider router={router} future={{ v7_startTransition: true }}/>
    
Patch Changes
  • Work around webpack/terser React.startTransition minification bug in production mode (#​10588)

v6.12.1

Compare Source

Warning


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 for more details.

Patch Changes
  • Adjust feature detection of React.startTransition to fix webpack + react 17 compilation error (#​10569)

v6.12.0

Compare Source

Minor Changes
  • Wrap internal router state updates with React.startTransition if it exists (#​10438)
Patch Changes
  • Updated dependencies:
    • @remix-run/router@1.6.3

v6.11.2

Compare Source

Patch Changes
  • Fix basename duplication in descendant <Routes> inside a <RouterProvider> (#​10492)
  • Updated dependencies:
    • @remix-run/router@1.6.2

v6.11.1

Compare Source

Patch Changes
  • Fix usage of Component API within descendant <Routes> (#​10434)
  • Fix bug when calling useNavigate from <Routes> inside a <RouterProvider> (#​10432)
  • Fix usage of <Navigate> in strict mode when using a data router (#​10435)
  • Updated dependencies:
    • @remix-run/router@1.6.1

v6.11.0

Compare Source

Patch Changes
  • Log loader/action errors to the console in dev for easier stack trace evaluation (#​10286)
  • Fix bug preventing rendering of descendant <Routes> when RouterProvider errors existed (#​10374)
  • Fix inadvertent re-renders when using Component instead of element on a route definition (#​10287)
  • 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)
  • Switched from useSyncExternalStore to useState for internal @remix-run/router router state syncing in <RouterProvider>. We found some subtle bugs where router state updates got propagated before other normal useState updates, which could lead to footguns in useEffect calls. (#​10377, #​10409)
  • Allow useRevalidator() to resolve a loader-driven error boundary scenario (#​10369)
  • Avoid unnecessary unsubscribe/resubscribes on router state changes (#​10409)
  • 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)
  • Updated dependencies:
    • @remix-run/router@1.6.0

v6.10.0

Compare Source

Minor Changes
  • Added support for Future Flags 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)

    • When future.v7_normalizeFormMethod === false (default v6 behavior),
      • useNavigation().formMethod is lowercase
      • useFetcher().formMethod is lowercase
    • When future.v7_normalizeFormMethod === true:
      • useNavigation().formMethod is uppercase
      • useFetcher().formMethod is uppercase
Patch Changes
  • Fix route ID generation when using Fragments in createRoutesFromElements (#​10193)
  • Updated dependencies:
    • @remix-run/router@1.5.0

v6.9.0

Compare Source

Minor Changes
  • 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)

    Example JSON Syntax

    // Both of these work the same:
    const elementRoutes = [{
      path: '/',
      element: <Home />,
      errorElement: <HomeError />,
    }]
    
    const componentRoutes = [{
      path: '/',
      Component: Home,
      ErrorBoundary: HomeError,
    }]
    
    function Home() { ... }
    function HomeError() { ... }
    

    Example JSX Syntax

    // Both of these work the same:
    const elementRoutes = createRoutesFromElements(
      <Route path='/' element={<Home />} errorElement={<HomeError /> } />
    );
    
    const componentRoutes = createRoutesFromElements(
      <Route path='/' Component={Home} ErrorBoundary={HomeError} />
    );
    
    function Home() { ... }
    function HomeError() { ... }
    
  • Introducing Lazy Route Modules! (#​10045)

    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).

    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.

    Your lazy functions will typically return the result of a dynamic import.

    // In this example, we assume most folks land on the homepage so we include that
    // in our critical-path bundle, but then we lazily load modules for /a and /b so
    // they don't load until the user navigates to those routes
    let routes = createRoutesFromElements(
      <Route path="/" element={<Layout />}>
        <Route index element={<Home />} />
        <Route path="a" lazy={() => import("./a")} />
        <Route path="b" lazy={() => import("./b")} />
      </Route>
    );
    

    Then in your lazy route modules, export the properties you want defined for the route:

    export async function loader({ request }) {
      let data = await fetchData(request);
      return json(data);
    }
    
    // Export a `Component` directly instead of needing to create a React Element from it
    export function Component() {
      let data = useLoaderData();
    
      return (
        <>
          <h1>You made it!</h1>
          <p>{data}</p>
        </>
      );
    }
    
    // Export an `ErrorBoundary` directly instead of needing to create a React Element from it
    export function ErrorBoundary() {
      let error = useRouteError();
      return isRouteErrorResponse(error) ? (
        <h1>
          {error.status} {error.statusText}
        </h1>
      ) : (
        <h1>{error.message || error}</h1>
      );
    }
    

    An example of this in action can be found in the examples/lazy-loading-router-provider directory of the repository.

    🙌 Huge thanks to @​rossipedia for the Initial Proposal and POC Implementation.

  • Updated dependencies:

    • @remix-run/router@1.4.0
Patch Changes
  • Fix generatePath incorrectly applying parameters in some cases (#​10078)
  • Improve memoization for context providers to avoid unnecessary re-renders (#​9983)

v6.8.2

Compare Source

Patch Changes
  • Updated dependencies:
    • @remix-run/router@1.3.3

v6.8.1

Compare Source

Patch Changes
  • Remove inaccurate console warning for POP navigations and update active blocker logic (#​10030)
  • Updated dependencies:
    • @remix-run/router@1.3.2

v6.8.0

Compare Source

Patch Changes
  • Updated dependencies:
    • @remix-run/router@1.3.1

v6.7.0

Compare Source

Minor Changes
  • Add unstable_useBlocker hook for blocking navigations within the app's location origin (#​9709)
Patch Changes
  • Fix generatePath when optional params are present (#​9764)
  • Update <Await> to accept ReactNode as children function return result (#​9896)
  • Updated dependencies:
    • @remix-run/router@1.3.0

v6.6.2

Compare Source

Patch Changes
  • Ensure useId consistency during SSR (#​9805)

v6.6.1

Compare Source

Patch Changes
  • Updated dependencies:
    • @remix-run/router@1.2.1

v6.6.0

Compare Source

Patch Changes
  • Prevent useLoaderData usage in errorElement (#​9735)
  • Updated dependencies:
    • @remix-run/router@1.2.0

v6.5.0

Compare Source

This release introduces support for Optional Route Segments. 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.

Optional Params Examples

  • <Route path=":lang?/about> will match:
    • /:lang/about
    • /about
  • <Route path="/multistep/:widget1?/widget2?/widget3?"> will match:
    • /multistep
    • /multistep/:widget1
    • /multistep/:widget1/:widget2
    • /multistep/:widget1/:widget2/:widget3

Optional Static Segment Example

  • <Route path="/home?"> will match:
    • /
    • /home
  • <Route path="/fr?/about"> will match:
    • /about
    • /fr/about
Minor Changes
  • Allows optional routes and optional static segments (#​9650)
Patch Changes
  • 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)
// Old behavior at URL /prefix-123
<Route path="prefix-:id" element={<Comp /> }>

function Comp() {
  let params = useParams(); // { id: '123' }
  let id = params.id; // "123"
  ...
}

// New behavior at URL /prefix-123
<Route path=":id" element={<Comp /> }>

function Comp() {
  let params = useParams(); // { id: 'prefix-123' }
  let id = params.id.replace(/^prefix-/, ''); // "123"
  ...
}
  • Updated dependencies:
    • @remix-run/router@1.1.0
remix-run/react-router (react-router-dom)

v6.14.2

Compare Source

Patch Changes
  • Properly decode element id when emulating hash scrolling via <ScrollRestoration> (#​10682)
  • Add missing <Form state> prop to populate history.state on submission navigations (#​10630)
  • Support proper hydration of Error subclasses such as ReferenceError/TypeError (#​10633)
  • Updated dependencies:
    • @remix-run/router@1.7.2
    • react-router@6.14.2

v6.14.1

Compare Source

Patch Changes
  • Updated dependencies:
    • react-router@6.14.1
    • @remix-run/router@1.7.1

v6.14.0

Compare Source

Minor Changes
  • Add support for application/json and text/plain encodings for useSubmit/fetcher.submit. To reflect these additional types, useNavigation/useFetcher now also contain navigation.json/navigation.text and fetcher.json/fetcher.text which include the json/text submission if applicable (#​10413)

    // The default behavior will still serialize as FormData
    function Component() {
      let navigation = useNavigation();
      let submit = useSubmit();
      submit({ key: "value" }, { method: "post" });
      // navigation.formEncType => "application/x-www-form-urlencoded"
      // navigation.formData    => FormData instance
    }
    
    async function action({ request }) {
      // request.headers.get("Content-Type") => "application/x-www-form-urlencoded"
      // await request.formData()            => FormData instance
    }
    
    // Opt-into JSON encoding with `encType: "application/json"`
    function Component() {
      let navigation = useNavigation();
      let submit = useSubmit();
      submit({ key: "value" }, { method: "post", encType: "application/json" });
      // navigation.formEncType => "application/json"
      // navigation.json        => { key: "value" }
    }
    
    async function action({ request }) {
      // request.headers.get("Content-Type") => "application/json"
      // await request.json()                => { key: "value" }
    }
    
    // Opt-into text encoding with `encType: "text/plain"`
    function Component() {
      let navigation = useNavigation();
      let submit = useSubmit();
      submit("Text submission", { method: "post", encType: "text/plain" });
      // navigation.formEncType => "text/plain"
      // navigation.text        => "Text submission"
    }
    
    async function action({ request }) {
      // request.headers.get("Content-Type") => "text/plain"
      // await request.text()                => "Text submission"
    }
    
Patch Changes
  • When submitting a form from a submitter element, prefer the built-in new FormData(form, submitter) instead of the previous manual approach in modern browsers (those that support the new submitter parameter) (#​9865, #​10627)
    • For browsers that don't support it, we continue to just append the submit button's entry to the end, and we also add rudimentary support for type="image" buttons
    • If developers want full spec-compliant support for legacy browsers, they can use the formdata-submitter-polyfill
  • Call window.history.pushState/replaceState before updating React Router state (instead of after) so that window.location matches useLocation during synchronous React 17 rendering (#​10448)
    • ⚠️ However, generally apps should not be relying on window.location and should always reference useLocation when possible, as window.location will not be in sync 100% of the time (due to popstate events, concurrent mode, etc.)
  • Fix tsc --skipLibCheck:false issues on React 17 (#​10622)
  • Upgrade typescript to 5.1 (#​10581)
  • Updated dependencies:
    • react-router@6.14.0
    • @remix-run/router@1.7.0

v6.13.0

Compare Source

Minor Changes
  • Move React.startTransition usage behind a future flag 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)

    Existing behavior will no longer include React.startTransition:

    <BrowserRouter>
      <Routes>{/*...*/}</Routes>
    </BrowserRouter>
    
    <RouterProvider router={router} />
    

    If you wish to enable React.startTransition, pass the future flag to your component:

    <BrowserRouter future={{ v7_startTransition: true }}>
      <Routes>{/*...*/}</Routes>
    </BrowserRouter>
    
    <RouterProvider router={router} future={{ v7_startTransition: true }}/>
    
Patch Changes
  • Work around webpack/terser React.startTransition minification bug in production mode (#​10588)
  • Updated dependencies:
    • react-router@6.13.0

v6.12.1

Compare Source

Warning


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 for more details.

Patch Changes
  • Adjust feature detection of React.startTransition to fix webpack + react 17 compilation error (#​10569)
  • Updated dependencies:
    • react-router@6.12.1

v6.12.0

Compare Source

Minor Changes
  • Wrap internal router state updates with React.startTransition if it exists (#​10438)
Patch Changes
  • Re-throw DOMException (DataCloneError) when attempting to perform a PUSH navigation with non-serializable state. (#​10427)
  • Updated dependencies:
    • @remix-run/router@1.6.3
    • react-router@6.12.0

v6.11.2

Compare Source

Patch Changes
  • Export SetURLSearchParams type (#​10444)
  • Updated dependencies:
    • react-router@6.11.2
    • @remix-run/router@1.6.2

v6.11.1

Compare Source

Patch Changes
  • Updated dependencies:
    • react-router@6.11.1
    • @remix-run/router@1.6.1

v6.11.0

Compare Source

Minor Changes
  • Enable basename support in useFetcher (#​10336)
    • If you were previously working around this issue by manually prepending the basename then you will need to remove the manually prepended basename from your fetcher calls (fetcher.load('/basename/route') -> fetcher.load('/route'))
Patch Changes
  • Fix inadvertent re-renders when using Component instead of element on a route definition (#​10287)
  • Fail gracefully on <Link to="//"> and other invalid URL values (#​10367)
  • Switched from useSyncExternalStore to useState for internal @remix-run/router router state syncing in <RouterProvider>. We found some subtle bugs where router state updates got propagated before other normal useState updates, which could lead to footguns in useEffect calls. (#​10377, #​10409)
  • Add static prop to StaticRouterProvider's internal Router component (#​10401)
  • 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)
  • Updated dependencies:
    • react-router@6.11.0
    • @remix-run/router@1.6.0

v6.10.0

Compare Source

Minor Changes
  • Added support for Future Flags 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)

    • When future.v7_normalizeFormMethod === false (default v6 behavior),
      • useNavigation().formMethod is lowercase
      • useFetcher().formMethod is lowercase
    • When future.v7_normalizeFormMethod === true:
      • useNavigation().formMethod is uppercase
      • useFetcher().formMethod is uppercase
Patch Changes
  • Fix createStaticHandler to also check for ErrorBoundary on routes in addition to errorElement (#​10190)
  • Updated dependencies:
    • @remix-run/router@1.5.0
    • react-router@6.10.0

v6.9.0

Compare Source

Minor Changes
  • 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)

    Example JSON Syntax

    // Both of these work the same:
    const elementRoutes = [{
      path: '/',
      element: <Home />,
      errorElement: <HomeError />,
    }]
    
    const componentRoutes = [{
      path: '/',
      Component: Home,
      ErrorBoundary: HomeError,
    }]
    
    function Home() { ... }
    function HomeError() { ... }
    

    Example JSX Syntax

    // Both of these work the same:
    const elementRoutes = createRoutesFromElements(
      <Route path='/' element={<Home />} errorElement={<HomeError /> } />
    );
    
    const componentRoutes = createRoutesFromElements(
      <Route path='/' Component={Home} ErrorBoundary={HomeError} />
    );
    
    function Home() { ... }
    function HomeError() { ... }
    
  • Introducing Lazy Route Modules! (#​10045)

    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).

    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.

    Your lazy functions will typically return the result of a dynamic import.

    // In this example, we assume most folks land on the homepage so we include that
    // in our critical-path bundle, but then we lazily load modules for /a and /b so
    // they don't load until the user navigates to those routes
    let routes = createRoutesFromElements(
      <Route path="/" element={<Layout />}>
        <Route index element={<Home />} />
        <Route path="a" lazy={() => import("./a")} />
        <Route path="b" lazy={() => import("./b")} />
      </Route>
    );
    

    Then in your lazy route modules, export the properties you want defined for the route:

    export async function loader({ request }) {
      let data = await fetchData(request);
      return json(data);
    }
    
    // Export a `Component` directly instead of needing to create a React Element from it
    export function Component() {
      let data = useLoaderData();
    
      return (
        <>
          <h1>You made it!</h1>
          <p>{data}</p>
        </>
      );
    }
    
    // Export an `ErrorBoundary` directly instead of needing to create a React Element from it
    export function ErrorBoundary() {
      let error = useRouteError();
      return isRouteErrorResponse(error) ? (
        <h1>
          {error.status} {error.statusText}
        </h1>
      ) : (
        <h1>{error.message || error}</h1>
      );
    }
    

    An example of this in action can be found in the examples/lazy-loading-router-provider directory of the repository.

    🙌 Huge thanks to @​rossipedia for the Initial Proposal and POC Implementation.

  • Updated dependencies:

    • react-router@6.9.0
    • @remix-run/router@1.4.0

v6.8.2

Compare Source

Patch Changes
  • Treat same-origin absolute URLs in <Link to> as external if they are outside of the router basename (#​10135)
  • Fix useBlocker to return IDLE_BLOCKER during SSR (#​10046)
  • Fix SSR of absolute <Link to> urls (#​10112)
  • Properly escape HTML characters in StaticRouterProvider serialized hydration data (#​10068)
  • Updated dependencies:
    • @remix-run/router@1.3.3
    • react-router@6.8.2

v6.8.1

Compare Source

Patch Changes
  • Improved absolute url detection in Link component (now also supports mailto: urls) (#​9994)
  • Fix partial object (search or hash only) pathnames losing current path value (#​10029)
  • Updated dependencies:
    • react-router@6.8.1
    • @remix-run/router@1.3.2

v6.8.0

Compare Source

Minor Changes
  • Support absolute URLs in <Link to>. If the URL is for the current origin, it will still do a client-side navigation. If the URL is for a different origin then it will do a fresh document request for the new origin. (#​9900)

    <Link to="https://neworigin.com/some/path">    {/* Document request */}
    <Link to="//neworigin.com/some/path">          {/* Document request */}
    <Link to="https://www.currentorigin.com/path"> {/* Client-side navigation */}
    
Patch Changes
  • Fix bug with search params removal via useSearchParams (#​9969)
  • Respect preventScrollReset on <fetcher.Form> (#​9963)
  • Fix navigation for hash routers on manual URL changes (#​9980)
  • Use pagehide instead of beforeunload for <ScrollRestoration>. This has better cross-browser support, specifically on Mobile Safari. (#​9945)
  • Updated dependencies:
    • @remix-run/router@1.3.1
    • react-router@6.8.0

v6.7.0

Compare Source

Minor Changes
  • Add unstable_useBlocker hook for blocking navigations within the app's location origin (#​9709)
  • Add unstable_usePrompt hook for blocking navigations within the app's location origin (#​9932)
  • Add preventScrollReset prop to <Form> (#​9886)
Patch Changes
  • Added pass-through event listener options argument to useBeforeUnload (#​9709)
  • Streamline jsdom bug workaround in tests (#​9824)
  • Updated dependencies:
    • @remix-run/router@1.3.0
    • react-router@6.7.0

v6.6.2

Compare Source

Patch Changes
  • Ensure useId consistency during SSR (#​9805)
  • Updated dependencies:
    • react-router@6.6.2

v6.6.1

Compare Source

Patch Changes
  • Updated dependencies:
    • @remix-run/router@1.2.1
    • react-router@6.6.1

v6.6.0

Compare Source

Minor Changes
  • Add useBeforeUnload() hook (#​9664)
  • Remove unstable_ prefix from createStaticHandler/createStaticRouter/StaticRouterProvider (#​9738)
Patch Changes
  • Proper hydration of Error objects from StaticRouterProvider (#​9664)
  • Support uppercase <Form method> and useSubmit method values (#​9664)
  • Skip initial scroll restoration for SSR apps with hydrationData (#​9664)
  • Fix <button formmethod> form submission overriddes (#​9664)
  • Updated dependencies:
    • @remix-run/router@1.2.0
    • react-router@6.6.0

v6.5.0

Compare Source

Patch Changes
  • Updated dependencies:
    • react-router@6.5.0
    • @remix-run/router@1.1.0

Configuration

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

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

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

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


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

This PR has been generated by Mend Renovate. View repository job log here.

*Originally created by @renovate[bot] on 8/5/2023* [![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [react-router](https://togithub.com/remix-run/react-router) | [`6.4.5` -> `6.14.2`](https://renovatebot.com/diffs/npm/react-router/6.4.5/6.14.2) | [![age](https://developer.mend.io/api/mc/badges/age/npm/react-router/6.14.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/react-router/6.14.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/react-router/6.4.5/6.14.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/react-router/6.4.5/6.14.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [react-router](https://togithub.com/remix-run/react-router) | [`6.5.0` -> `6.14.2`](https://renovatebot.com/diffs/npm/react-router/6.5.0/6.14.2) | [![age](https://developer.mend.io/api/mc/badges/age/npm/react-router/6.14.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/react-router/6.14.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/react-router/6.5.0/6.14.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/react-router/6.5.0/6.14.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [react-router-dom](https://togithub.com/remix-run/react-router) | [`6.4.5` -> `6.14.2`](https://renovatebot.com/diffs/npm/react-router-dom/6.4.5/6.14.2) | [![age](https://developer.mend.io/api/mc/badges/age/npm/react-router-dom/6.14.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/react-router-dom/6.14.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/react-router-dom/6.4.5/6.14.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/react-router-dom/6.4.5/6.14.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [react-router-dom](https://togithub.com/remix-run/react-router) | [`6.5.0` -> `6.14.2`](https://renovatebot.com/diffs/npm/react-router-dom/6.5.0/6.14.2) | [![age](https://developer.mend.io/api/mc/badges/age/npm/react-router-dom/6.14.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/react-router-dom/6.14.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/react-router-dom/6.5.0/6.14.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/react-router-dom/6.5.0/6.14.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>remix-run/react-router (react-router)</summary> ### [`v6.14.2`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router/CHANGELOG.md#6142) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router@6.14.1...react-router@6.14.2) ##### Patch Changes - Updated dependencies: - `@remix-run/router@1.7.2` ### [`v6.14.1`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router/CHANGELOG.md#6141) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router@6.14.0...react-router@6.14.1) ##### Patch Changes - Fix loop in `unstable_useBlocker` when used with an unstable blocker function ([#&#8203;10652](https://togithub.com/remix-run/react-router/pull/10652)) - Fix issues with reused blockers on subsequent navigations ([#&#8203;10656](https://togithub.com/remix-run/react-router/pull/10656)) - Updated dependencies: - `@remix-run/router@1.7.1` ### [`v6.14.0`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router/CHANGELOG.md#6140) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router@6.13.0...react-router@6.14.0) ##### Patch Changes - Strip `basename` from locations provided to `unstable_useBlocker` functions to match `useLocation` ([#&#8203;10573](https://togithub.com/remix-run/react-router/pull/10573)) - Fix `generatePath` when passed a numeric `0` value parameter ([#&#8203;10612](https://togithub.com/remix-run/react-router/pull/10612)) - Fix `unstable_useBlocker` key issues in `StrictMode` ([#&#8203;10573](https://togithub.com/remix-run/react-router/pull/10573)) - Fix `tsc --skipLibCheck:false` issues on React 17 ([#&#8203;10622](https://togithub.com/remix-run/react-router/pull/10622)) - Upgrade `typescript` to 5.1 ([#&#8203;10581](https://togithub.com/remix-run/react-router/pull/10581)) - Updated dependencies: - `@remix-run/router@1.7.0` ### [`v6.13.0`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router/CHANGELOG.md#6130) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router@6.12.1...react-router@6.13.0) ##### Minor 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`. ([#&#8203;10596](https://togithub.com/remix-run/react-router/pull/10596)) Existing behavior will no longer include `React.startTransition`: ```jsx <BrowserRouter> <Routes>{/*...*/}</Routes> </BrowserRouter> <RouterProvider router={router} /> ``` If you wish to enable `React.startTransition`, pass the future flag to your component: ```jsx <BrowserRouter future={{ v7_startTransition: true }}> <Routes>{/*...*/}</Routes> </BrowserRouter> <RouterProvider router={router} future={{ v7_startTransition: true }}/> ``` ##### Patch Changes - Work around webpack/terser `React.startTransition` minification bug in production mode ([#&#8203;10588](https://togithub.com/remix-run/react-router/pull/10588)) ### [`v6.12.1`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router/CHANGELOG.md#6121) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router@6.12.0...react-router@6.12.1) > **Warning** > 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 [#&#8203;10579](https://togithub.com/remix-run/react-router/issues/10579) for more details. ##### Patch Changes - Adjust feature detection of `React.startTransition` to fix webpack + react 17 compilation error ([#&#8203;10569](https://togithub.com/remix-run/react-router/pull/10569)) ### [`v6.12.0`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router/CHANGELOG.md#6120) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router@6.11.2...react-router@6.12.0) ##### Minor Changes - Wrap internal router state updates with `React.startTransition` if it exists ([#&#8203;10438](https://togithub.com/remix-run/react-router/pull/10438)) ##### Patch Changes - Updated dependencies: - `@remix-run/router@1.6.3` ### [`v6.11.2`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router/CHANGELOG.md#6112) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router@6.11.1...react-router@6.11.2) ##### Patch Changes - Fix `basename` duplication in descendant `<Routes>` inside a `<RouterProvider>` ([#&#8203;10492](https://togithub.com/remix-run/react-router/pull/10492)) - Updated dependencies: - `@remix-run/router@1.6.2` ### [`v6.11.1`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router/CHANGELOG.md#6111) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router@6.11.0...react-router@6.11.1) ##### Patch Changes - Fix usage of `Component` API within descendant `<Routes>` ([#&#8203;10434](https://togithub.com/remix-run/react-router/pull/10434)) - Fix bug when calling `useNavigate` from `<Routes>` inside a `<RouterProvider>` ([#&#8203;10432](https://togithub.com/remix-run/react-router/pull/10432)) - Fix usage of `<Navigate>` in strict mode when using a data router ([#&#8203;10435](https://togithub.com/remix-run/react-router/pull/10435)) - Updated dependencies: - `@remix-run/router@1.6.1` ### [`v6.11.0`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router/CHANGELOG.md#6110) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router@6.10.0...react-router@6.11.0) ##### Patch Changes - Log loader/action errors to the console in dev for easier stack trace evaluation ([#&#8203;10286](https://togithub.com/remix-run/react-router/pull/10286)) - Fix bug preventing rendering of descendant `<Routes>` when `RouterProvider` errors existed ([#&#8203;10374](https://togithub.com/remix-run/react-router/pull/10374)) - Fix inadvertent re-renders when using `Component` instead of `element` on a route definition ([#&#8203;10287](https://togithub.com/remix-run/react-router/pull/10287)) - 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. ([#&#8203;10394](https://togithub.com/remix-run/react-router/pull/10394)) - 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. ([#&#8203;10377](https://togithub.com/remix-run/react-router/pull/10377), [#&#8203;10409](https://togithub.com/remix-run/react-router/pull/10409)) - Allow `useRevalidator()` to resolve a loader-driven error boundary scenario ([#&#8203;10369](https://togithub.com/remix-run/react-router/pull/10369)) - Avoid unnecessary unsubscribe/resubscribes on router state changes ([#&#8203;10409](https://togithub.com/remix-run/react-router/pull/10409)) - 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()`. ([#&#8203;10336](https://togithub.com/remix-run/react-router/pull/10336)) - Updated dependencies: - `@remix-run/router@1.6.0` ### [`v6.10.0`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router/CHANGELOG.md#6100) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router@6.9.0...react-router@6.10.0) ##### Minor Changes - 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. ([#&#8203;10207](https://togithub.com/remix-run/react-router/pull/10207)) - When `future.v7_normalizeFormMethod === false` (default v6 behavior), - `useNavigation().formMethod` is lowercase - `useFetcher().formMethod` is lowercase - When `future.v7_normalizeFormMethod === true`: - `useNavigation().formMethod` is uppercase - `useFetcher().formMethod` is uppercase ##### Patch Changes - Fix route ID generation when using Fragments in `createRoutesFromElements` ([#&#8203;10193](https://togithub.com/remix-run/react-router/pull/10193)) - Updated dependencies: - `@remix-run/router@1.5.0` ### [`v6.9.0`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router/CHANGELOG.md#690) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router@6.8.2...react-router@6.9.0) ##### Minor Changes - 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". ([#&#8203;10045](https://togithub.com/remix-run/react-router/pull/10045)) **Example JSON Syntax** ```jsx // Both of these work the same: const elementRoutes = [{ path: '/', element: <Home />, errorElement: <HomeError />, }] const componentRoutes = [{ path: '/', Component: Home, ErrorBoundary: HomeError, }] function Home() { ... } function HomeError() { ... } ``` **Example JSX Syntax** ```jsx // Both of these work the same: const elementRoutes = createRoutesFromElements( <Route path='/' element={<Home />} errorElement={<HomeError /> } /> ); const componentRoutes = createRoutesFromElements( <Route path='/' Component={Home} ErrorBoundary={HomeError} /> ); function Home() { ... } function HomeError() { ... } ``` - **Introducing Lazy Route Modules!** ([#&#8203;10045](https://togithub.com/remix-run/react-router/pull/10045)) 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`). 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. Your `lazy` functions will typically return the result of a dynamic import. ```jsx // In this example, we assume most folks land on the homepage so we include that // in our critical-path bundle, but then we lazily load modules for /a and /b so // they don't load until the user navigates to those routes let routes = createRoutesFromElements( <Route path="/" element={<Layout />}> <Route index element={<Home />} /> <Route path="a" lazy={() => import("./a")} /> <Route path="b" lazy={() => import("./b")} /> </Route> ); ``` Then in your lazy route modules, export the properties you want defined for the route: ```jsx export async function loader({ request }) { let data = await fetchData(request); return json(data); } // Export a `Component` directly instead of needing to create a React Element from it export function Component() { let data = useLoaderData(); return ( <> <h1>You made it!</h1> <p>{data}</p> </> ); } // Export an `ErrorBoundary` directly instead of needing to create a React Element from it export function ErrorBoundary() { let error = useRouteError(); return isRouteErrorResponse(error) ? ( <h1> {error.status} {error.statusText} </h1> ) : ( <h1>{error.message || error}</h1> ); } ``` An example of this in action can be found in the [`examples/lazy-loading-router-provider`](https://togithub.com/remix-run/react-router/tree/main/examples/lazy-loading-router-provider) directory of the repository. 🙌 Huge thanks to [@&#8203;rossipedia](https://togithub.com/rossipedia) for the [Initial Proposal](https://togithub.com/remix-run/react-router/discussions/9826) and [POC Implementation](https://togithub.com/remix-run/react-router/pull/9830). - Updated dependencies: - `@remix-run/router@1.4.0` ##### Patch Changes - Fix `generatePath` incorrectly applying parameters in some cases ([#&#8203;10078](https://togithub.com/remix-run/react-router/pull/10078)) - Improve memoization for context providers to avoid unnecessary re-renders ([#&#8203;9983](https://togithub.com/remix-run/react-router/pull/9983)) ### [`v6.8.2`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router/CHANGELOG.md#682) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router@6.8.1...react-router@6.8.2) ##### Patch Changes - Updated dependencies: - `@remix-run/router@1.3.3` ### [`v6.8.1`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router/CHANGELOG.md#681) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router@6.8.0...react-router@6.8.1) ##### Patch Changes - Remove inaccurate console warning for POP navigations and update active blocker logic ([#&#8203;10030](https://togithub.com/remix-run/react-router/pull/10030)) - Updated dependencies: - `@remix-run/router@1.3.2` ### [`v6.8.0`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router/CHANGELOG.md#680) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router@6.7.0...react-router@6.8.0) ##### Patch Changes - Updated dependencies: - `@remix-run/router@1.3.1` ### [`v6.7.0`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router/CHANGELOG.md#670) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router@6.6.2...react-router@6.7.0) ##### Minor Changes - Add `unstable_useBlocker` hook for blocking navigations within the app's location origin ([#&#8203;9709](https://togithub.com/remix-run/react-router/pull/9709)) ##### Patch Changes - Fix `generatePath` when optional params are present ([#&#8203;9764](https://togithub.com/remix-run/react-router/pull/9764)) - Update `<Await>` to accept `ReactNode` as children function return result ([#&#8203;9896](https://togithub.com/remix-run/react-router/pull/9896)) - Updated dependencies: - `@remix-run/router@1.3.0` ### [`v6.6.2`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router/CHANGELOG.md#662) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router@6.6.1...react-router@6.6.2) ##### Patch Changes - Ensure `useId` consistency during SSR ([#&#8203;9805](https://togithub.com/remix-run/react-router/pull/9805)) ### [`v6.6.1`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router/CHANGELOG.md#661) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router@6.6.0...react-router@6.6.1) ##### Patch Changes - Updated dependencies: - `@remix-run/router@1.2.1` ### [`v6.6.0`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router/CHANGELOG.md#660) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router@6.5.0...react-router@6.6.0) ##### Patch Changes - Prevent `useLoaderData` usage in `errorElement` ([#&#8203;9735](https://togithub.com/remix-run/react-router/pull/9735)) - Updated dependencies: - `@remix-run/router@1.2.0` ### [`v6.5.0`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router/CHANGELOG.md#650) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router@6.4.5...react-router@6.5.0) This release introduces support for [Optional Route Segments](https://togithub.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. **Optional Params Examples** - `<Route path=":lang?/about>` will match: - `/:lang/about` - `/about` - `<Route path="/multistep/:widget1?/widget2?/widget3?">` will match: - `/multistep` - `/multistep/:widget1` - `/multistep/:widget1/:widget2` - `/multistep/:widget1/:widget2/:widget3` **Optional Static Segment Example** - `<Route path="/home?">` will match: - `/` - `/home` - `<Route path="/fr?/about">` will match: - `/about` - `/fr/about` ##### Minor Changes - Allows optional routes and optional static segments ([#&#8203;9650](https://togithub.com/remix-run/react-router/pull/9650)) ##### Patch Changes - 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: ([#&#8203;9506](https://togithub.com/remix-run/react-router/pull/9506)) ```jsx // Old behavior at URL /prefix-123 <Route path="prefix-:id" element={<Comp /> }> function Comp() { let params = useParams(); // { id: '123' } let id = params.id; // "123" ... } // New behavior at URL /prefix-123 <Route path=":id" element={<Comp /> }> function Comp() { let params = useParams(); // { id: 'prefix-123' } let id = params.id.replace(/^prefix-/, ''); // "123" ... } ``` - Updated dependencies: - `@remix-run/router@1.1.0` </details> <details> <summary>remix-run/react-router (react-router-dom)</summary> ### [`v6.14.2`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#6142) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router-dom@6.14.1...react-router-dom@6.14.2) ##### Patch Changes - Properly decode element id when emulating hash scrolling via `<ScrollRestoration>` ([#&#8203;10682](https://togithub.com/remix-run/react-router/pull/10682)) - Add missing `<Form state>` prop to populate `history.state` on submission navigations ([#&#8203;10630](https://togithub.com/remix-run/react-router/pull/10630)) - Support proper hydration of `Error` subclasses such as `ReferenceError`/`TypeError` ([#&#8203;10633](https://togithub.com/remix-run/react-router/pull/10633)) - Updated dependencies: - `@remix-run/router@1.7.2` - `react-router@6.14.2` ### [`v6.14.1`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#6141) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router-dom@6.14.0...react-router-dom@6.14.1) ##### Patch Changes - Updated dependencies: - `react-router@6.14.1` - `@remix-run/router@1.7.1` ### [`v6.14.0`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#6140) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router-dom@6.13.0...react-router-dom@6.14.0) ##### Minor Changes - Add support for `application/json` and `text/plain` encodings for `useSubmit`/`fetcher.submit`. To reflect these additional types, `useNavigation`/`useFetcher` now also contain `navigation.json`/`navigation.text` and `fetcher.json`/`fetcher.text` which include the json/text submission if applicable ([#&#8203;10413](https://togithub.com/remix-run/react-router/pull/10413)) ```jsx // The default behavior will still serialize as FormData function Component() { let navigation = useNavigation(); let submit = useSubmit(); submit({ key: "value" }, { method: "post" }); // navigation.formEncType => "application/x-www-form-urlencoded" // navigation.formData => FormData instance } async function action({ request }) { // request.headers.get("Content-Type") => "application/x-www-form-urlencoded" // await request.formData() => FormData instance } ``` ```js // Opt-into JSON encoding with `encType: "application/json"` function Component() { let navigation = useNavigation(); let submit = useSubmit(); submit({ key: "value" }, { method: "post", encType: "application/json" }); // navigation.formEncType => "application/json" // navigation.json => { key: "value" } } async function action({ request }) { // request.headers.get("Content-Type") => "application/json" // await request.json() => { key: "value" } } ``` ```js // Opt-into text encoding with `encType: "text/plain"` function Component() { let navigation = useNavigation(); let submit = useSubmit(); submit("Text submission", { method: "post", encType: "text/plain" }); // navigation.formEncType => "text/plain" // navigation.text => "Text submission" } async function action({ request }) { // request.headers.get("Content-Type") => "text/plain" // await request.text() => "Text submission" } ``` ##### Patch Changes - When submitting a form from a `submitter` element, prefer the built-in `new FormData(form, submitter)` instead of the previous manual approach in modern browsers (those that support the new `submitter` parameter) ([#&#8203;9865](https://togithub.com/remix-run/react-router/pull/9865), [#&#8203;10627](https://togithub.com/remix-run/react-router/pull/10627)) - For browsers that don't support it, we continue to just append the submit button's entry to the end, and we also add rudimentary support for `type="image"` buttons - If developers want full spec-compliant support for legacy browsers, they can use the `formdata-submitter-polyfill` - Call `window.history.pushState/replaceState` before updating React Router state (instead of after) so that `window.location` matches `useLocation` during synchronous React 17 rendering ([#&#8203;10448](https://togithub.com/remix-run/react-router/pull/10448)) - ⚠️ However, generally apps should not be relying on `window.location` and should always reference `useLocation` when possible, as `window.location` will not be in sync 100% of the time (due to `popstate` events, concurrent mode, etc.) - Fix `tsc --skipLibCheck:false` issues on React 17 ([#&#8203;10622](https://togithub.com/remix-run/react-router/pull/10622)) - Upgrade `typescript` to 5.1 ([#&#8203;10581](https://togithub.com/remix-run/react-router/pull/10581)) - Updated dependencies: - `react-router@6.14.0` - `@remix-run/router@1.7.0` ### [`v6.13.0`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#6130) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router-dom@6.12.1...react-router-dom@6.13.0) ##### Minor 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`. ([#&#8203;10596](https://togithub.com/remix-run/react-router/pull/10596)) Existing behavior will no longer include `React.startTransition`: ```jsx <BrowserRouter> <Routes>{/*...*/}</Routes> </BrowserRouter> <RouterProvider router={router} /> ``` If you wish to enable `React.startTransition`, pass the future flag to your component: ```jsx <BrowserRouter future={{ v7_startTransition: true }}> <Routes>{/*...*/}</Routes> </BrowserRouter> <RouterProvider router={router} future={{ v7_startTransition: true }}/> ``` ##### Patch Changes - Work around webpack/terser `React.startTransition` minification bug in production mode ([#&#8203;10588](https://togithub.com/remix-run/react-router/pull/10588)) - Updated dependencies: - `react-router@6.13.0` ### [`v6.12.1`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#6121) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router-dom@6.12.0...react-router-dom@6.12.1) > **Warning** > 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 [#&#8203;10579](https://togithub.com/remix-run/react-router/issues/10579) for more details. ##### Patch Changes - Adjust feature detection of `React.startTransition` to fix webpack + react 17 compilation error ([#&#8203;10569](https://togithub.com/remix-run/react-router/pull/10569)) - Updated dependencies: - `react-router@6.12.1` ### [`v6.12.0`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#6120) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router-dom@6.11.2...react-router-dom@6.12.0) ##### Minor Changes - Wrap internal router state updates with `React.startTransition` if it exists ([#&#8203;10438](https://togithub.com/remix-run/react-router/pull/10438)) ##### Patch Changes - Re-throw `DOMException` (`DataCloneError`) when attempting to perform a `PUSH` navigation with non-serializable state. ([#&#8203;10427](https://togithub.com/remix-run/react-router/pull/10427)) - Updated dependencies: - `@remix-run/router@1.6.3` - `react-router@6.12.0` ### [`v6.11.2`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#6112) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router-dom@6.11.1...react-router-dom@6.11.2) ##### Patch Changes - Export `SetURLSearchParams` type ([#&#8203;10444](https://togithub.com/remix-run/react-router/pull/10444)) - Updated dependencies: - `react-router@6.11.2` - `@remix-run/router@1.6.2` ### [`v6.11.1`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#6111) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router-dom@6.11.0...react-router-dom@6.11.1) ##### Patch Changes - Updated dependencies: - `react-router@6.11.1` - `@remix-run/router@1.6.1` ### [`v6.11.0`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#6110) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router-dom@6.10.0...react-router-dom@6.11.0) ##### Minor Changes - Enable `basename` support in `useFetcher` ([#&#8203;10336](https://togithub.com/remix-run/react-router/pull/10336)) - If you were previously working around this issue by manually prepending the `basename` then you will need to remove the manually prepended `basename` from your `fetcher` calls (`fetcher.load('/basename/route') -> fetcher.load('/route')`) ##### Patch Changes - Fix inadvertent re-renders when using `Component` instead of `element` on a route definition ([#&#8203;10287](https://togithub.com/remix-run/react-router/pull/10287)) - Fail gracefully on `<Link to="//">` and other invalid URL values ([#&#8203;10367](https://togithub.com/remix-run/react-router/pull/10367)) - 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. ([#&#8203;10377](https://togithub.com/remix-run/react-router/pull/10377), [#&#8203;10409](https://togithub.com/remix-run/react-router/pull/10409)) - Add static prop to `StaticRouterProvider`'s internal `Router` component ([#&#8203;10401](https://togithub.com/remix-run/react-router/pull/10401)) - 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()`. ([#&#8203;10336](https://togithub.com/remix-run/react-router/pull/10336)) - Updated dependencies: - `react-router@6.11.0` - `@remix-run/router@1.6.0` ### [`v6.10.0`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#6100) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router-dom@6.9.0...react-router-dom@6.10.0) ##### Minor Changes - 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. ([#&#8203;10207](https://togithub.com/remix-run/react-router/pull/10207)) - When `future.v7_normalizeFormMethod === false` (default v6 behavior), - `useNavigation().formMethod` is lowercase - `useFetcher().formMethod` is lowercase - When `future.v7_normalizeFormMethod === true`: - `useNavigation().formMethod` is uppercase - `useFetcher().formMethod` is uppercase ##### Patch Changes - Fix `createStaticHandler` to also check for `ErrorBoundary` on routes in addition to `errorElement` ([#&#8203;10190](https://togithub.com/remix-run/react-router/pull/10190)) - Updated dependencies: - `@remix-run/router@1.5.0` - `react-router@6.10.0` ### [`v6.9.0`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#690) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router-dom@6.8.2...react-router-dom@6.9.0) ##### Minor Changes - 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". ([#&#8203;10045](https://togithub.com/remix-run/react-router/pull/10045)) **Example JSON Syntax** ```jsx // Both of these work the same: const elementRoutes = [{ path: '/', element: <Home />, errorElement: <HomeError />, }] const componentRoutes = [{ path: '/', Component: Home, ErrorBoundary: HomeError, }] function Home() { ... } function HomeError() { ... } ``` **Example JSX Syntax** ```jsx // Both of these work the same: const elementRoutes = createRoutesFromElements( <Route path='/' element={<Home />} errorElement={<HomeError /> } /> ); const componentRoutes = createRoutesFromElements( <Route path='/' Component={Home} ErrorBoundary={HomeError} /> ); function Home() { ... } function HomeError() { ... } ``` - **Introducing Lazy Route Modules!** ([#&#8203;10045](https://togithub.com/remix-run/react-router/pull/10045)) 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`). 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. Your `lazy` functions will typically return the result of a dynamic import. ```jsx // In this example, we assume most folks land on the homepage so we include that // in our critical-path bundle, but then we lazily load modules for /a and /b so // they don't load until the user navigates to those routes let routes = createRoutesFromElements( <Route path="/" element={<Layout />}> <Route index element={<Home />} /> <Route path="a" lazy={() => import("./a")} /> <Route path="b" lazy={() => import("./b")} /> </Route> ); ``` Then in your lazy route modules, export the properties you want defined for the route: ```jsx export async function loader({ request }) { let data = await fetchData(request); return json(data); } // Export a `Component` directly instead of needing to create a React Element from it export function Component() { let data = useLoaderData(); return ( <> <h1>You made it!</h1> <p>{data}</p> </> ); } // Export an `ErrorBoundary` directly instead of needing to create a React Element from it export function ErrorBoundary() { let error = useRouteError(); return isRouteErrorResponse(error) ? ( <h1> {error.status} {error.statusText} </h1> ) : ( <h1>{error.message || error}</h1> ); } ``` An example of this in action can be found in the [`examples/lazy-loading-router-provider`](https://togithub.com/remix-run/react-router/tree/main/examples/lazy-loading-router-provider) directory of the repository. 🙌 Huge thanks to [@&#8203;rossipedia](https://togithub.com/rossipedia) for the [Initial Proposal](https://togithub.com/remix-run/react-router/discussions/9826) and [POC Implementation](https://togithub.com/remix-run/react-router/pull/9830). - Updated dependencies: - `react-router@6.9.0` - `@remix-run/router@1.4.0` ### [`v6.8.2`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#682) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router-dom@6.8.1...react-router-dom@6.8.2) ##### Patch Changes - Treat same-origin absolute URLs in `<Link to>` as external if they are outside of the router `basename` ([#&#8203;10135](https://togithub.com/remix-run/react-router/pull/10135)) - Fix `useBlocker` to return `IDLE_BLOCKER` during SSR ([#&#8203;10046](https://togithub.com/remix-run/react-router/pull/10046)) - Fix SSR of absolute `<Link to>` urls ([#&#8203;10112](https://togithub.com/remix-run/react-router/pull/10112)) - Properly escape HTML characters in `StaticRouterProvider` serialized hydration data ([#&#8203;10068](https://togithub.com/remix-run/react-router/pull/10068)) - Updated dependencies: - `@remix-run/router@1.3.3` - `react-router@6.8.2` ### [`v6.8.1`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#681) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router-dom@6.8.0...react-router-dom@6.8.1) ##### Patch Changes - Improved absolute url detection in `Link` component (now also supports `mailto:` urls) ([#&#8203;9994](https://togithub.com/remix-run/react-router/pull/9994)) - Fix partial object (search or hash only) pathnames losing current path value ([#&#8203;10029](https://togithub.com/remix-run/react-router/pull/10029)) - Updated dependencies: - `react-router@6.8.1` - `@remix-run/router@1.3.2` ### [`v6.8.0`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#680) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router-dom@6.7.0...react-router-dom@6.8.0) ##### Minor Changes - Support absolute URLs in `<Link to>`. If the URL is for the current origin, it will still do a client-side navigation. If the URL is for a different origin then it will do a fresh document request for the new origin. ([#&#8203;9900](https://togithub.com/remix-run/react-router/pull/9900)) ```tsx <Link to="https://neworigin.com/some/path"> {/* Document request */} <Link to="//neworigin.com/some/path"> {/* Document request */} <Link to="https://www.currentorigin.com/path"> {/* Client-side navigation */} ``` ##### Patch Changes - Fix bug with search params removal via `useSearchParams` ([#&#8203;9969](https://togithub.com/remix-run/react-router/pull/9969)) - Respect `preventScrollReset` on `<fetcher.Form>` ([#&#8203;9963](https://togithub.com/remix-run/react-router/pull/9963)) - Fix navigation for hash routers on manual URL changes ([#&#8203;9980](https://togithub.com/remix-run/react-router/pull/9980)) - Use `pagehide` instead of `beforeunload` for `<ScrollRestoration>`. This has better cross-browser support, specifically on Mobile Safari. ([#&#8203;9945](https://togithub.com/remix-run/react-router/pull/9945)) - Updated dependencies: - `@remix-run/router@1.3.1` - `react-router@6.8.0` ### [`v6.7.0`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#670) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router-dom@6.6.2...react-router-dom@6.7.0) ##### Minor Changes - Add `unstable_useBlocker` hook for blocking navigations within the app's location origin ([#&#8203;9709](https://togithub.com/remix-run/react-router/pull/9709)) - Add `unstable_usePrompt` hook for blocking navigations within the app's location origin ([#&#8203;9932](https://togithub.com/remix-run/react-router/pull/9932)) - Add `preventScrollReset` prop to `<Form>` ([#&#8203;9886](https://togithub.com/remix-run/react-router/pull/9886)) ##### Patch Changes - Added pass-through event listener options argument to `useBeforeUnload` ([#&#8203;9709](https://togithub.com/remix-run/react-router/pull/9709)) - Streamline jsdom bug workaround in tests ([#&#8203;9824](https://togithub.com/remix-run/react-router/pull/9824)) - Updated dependencies: - `@remix-run/router@1.3.0` - `react-router@6.7.0` ### [`v6.6.2`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#662) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router-dom@6.6.1...react-router-dom@6.6.2) ##### Patch Changes - Ensure `useId` consistency during SSR ([#&#8203;9805](https://togithub.com/remix-run/react-router/pull/9805)) - Updated dependencies: - `react-router@6.6.2` ### [`v6.6.1`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#661) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router-dom@6.6.0...react-router-dom@6.6.1) ##### Patch Changes - Updated dependencies: - `@remix-run/router@1.2.1` - `react-router@6.6.1` ### [`v6.6.0`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#660) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router-dom@6.5.0...react-router-dom@6.6.0) ##### Minor Changes - Add `useBeforeUnload()` hook ([#&#8203;9664](https://togithub.com/remix-run/react-router/pull/9664)) - Remove `unstable_` prefix from `createStaticHandler`/`createStaticRouter`/`StaticRouterProvider` ([#&#8203;9738](https://togithub.com/remix-run/react-router/pull/9738)) ##### Patch Changes - Proper hydration of `Error` objects from `StaticRouterProvider` ([#&#8203;9664](https://togithub.com/remix-run/react-router/pull/9664)) - Support uppercase `<Form method>` and `useSubmit` method values ([#&#8203;9664](https://togithub.com/remix-run/react-router/pull/9664)) - Skip initial scroll restoration for SSR apps with `hydrationData` ([#&#8203;9664](https://togithub.com/remix-run/react-router/pull/9664)) - Fix `<button formmethod>` form submission overriddes ([#&#8203;9664](https://togithub.com/remix-run/react-router/pull/9664)) - Updated dependencies: - `@remix-run/router@1.2.0` - `react-router@6.6.0` ### [`v6.5.0`](https://togithub.com/remix-run/react-router/blob/HEAD/packages/react-router-dom/CHANGELOG.md#650) [Compare Source](https://togithub.com/remix-run/react-router/compare/react-router-dom@6.4.5...react-router-dom@6.5.0) ##### Patch Changes - Updated dependencies: - `react-router@6.5.0` - `@remix-run/router@1.1.0` </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/OneUptime/oneuptime). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNi4yNy4xIiwidXBkYXRlZEluVmVyIjoiMzYuMjcuMSIsInRhcmdldEJyYW5jaCI6Im1hc3RlciJ9-->
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github/oneuptime#1716