Skip to content

Add support for React router v8#11289

Open
smeng9 wants to merge 13 commits into
marmelab:nextfrom
smeng9:master
Open

Add support for React router v8#11289
smeng9 wants to merge 13 commits into
marmelab:nextfrom
smeng9:master

Conversation

@smeng9

@smeng9 smeng9 commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

Problem

react-router v8 is out

Solution

Follow #10440

Add support for React router v8

Find a way to avoid dependency resolution issue after dropping react-router-dom

How To Test

Build RA packages locally, then link with apps in /examples folder

Additional Checks

  • The PR targets master for a bugfix or a documentation fix, or next for a feature
    next branch seems is disappeared, I assume master branch can be used for new features.
  • The PR includes unit tests (if not possible, describe why)
    Needs to be end-2-end tested with /examples folder.
  • The PR includes one or several stories (if not possible, describe why)
    Stories using the routers are updated.
  • The documentation is up to date

Also, please make sure to read the contributing guidelines.

@fzaninotto

Copy link
Copy Markdown
Member

Thanks for your PR, but U'm not fan of the extra compatibility layer & the partial reimplementation. I'd prefer if you created an entirely new adapter for react-router v8 (in a new package). We'd probably need to move the current routing adapter to a package, too.

Shaoyu Meng and others added 9 commits June 23, 2026 07:13
React Router v8 merged react-router-dom into react-router and requires
React 19. Rather than adding a compatibility layer and partial
reimplementation inside ra-core (per review feedback on marmelab#11289), v8
support ships as a standalone, opt-in adapter package mirroring
ra-router-tanstack.

The adapter is a thin pass-through over react-router v8's native API:
the obsolete v6/v7 `future` flags are dropped (now defaults in v8) and
imports come from `react-router` instead of `react-router-dom`. ra-core
keeps its built-in react-router v6/v7 adapter as the default, so existing
apps are unaffected.

The package is ESM-only because react-router v8 is ESM-only.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
After merging the ra-router-react-router-v8 package, the in-core
react-router adapter no longer needs the compatibility shims:

- reactRouterProvider imports everything from `react-router`, with only
  `Link` and `createHashRouter` from `react-router-dom`
- Form.stories uses `HashRouter` from `react-router-dom` directly
- Remove CompatHashRouter, CompatLink and their tests
- Restore `react-router-dom` to the dependencies of ra-core,
  ra-ui-materialui and react-admin, and narrow the react-router range
  back to ^6.28.1 || ^7.1.1 (v8 is supported via the separate package)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
No code in ra-ui-materialui imports react-router-dom; all routing
imports come from react-router. ra-core declares its own
react-router-dom peer for its router adapter.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Individual zshy builds had rewritten the exports field to the flat
pre-normalization form. Restore the nested import/require form that
update-package-exports produces and that matches upstream.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…-exports

update-package-exports forces dual import/require exports on every
package; the ESM-only v8 adapter must keep its ESM-only exports (it has
no .cjs build). Also keep minor README/story/doc wording.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
zshy's ESM build pass already uses Bundler resolution and cjs is
disabled, so these compilerOptions are not needed for the build.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@smeng9

smeng9 commented Jun 23, 2026

Copy link
Copy Markdown
Contributor Author

Hi @fzaninotto

The ra-router-react-router-v8 is pulled out to a separate package

@fzaninotto fzaninotto left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks. Several remarks:

  • This is a new feature, so it must be PRed against nextand not master
  • As RR v7 is still loaded by default by ra-core, users of RRv8 will end up with 2 versions of RR, leading to probable context conflicts. You also need to extract the default RRv7 adapter to a package in the monorepo
  • The new RRv8 adapter needs unit tests in addition to user stories
  • you also need to test the basename feature (check the tests of the tanstack router adapter)

</li>
))}
</ul>
<button onClick={() => navigate('/posts/create')}>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why not use test-ui's CreateButton?

const { id } = useParams<{ id: string }>();
return (
<ShowBase resource="posts" id={id}>
<PostShowView onEdit={() => navigate(`/posts/${id}`)} />

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do you need a specific onEdit? It should work without it.

);
};

const PostShowView = ({ onEdit }: { onEdit: () => void }) => {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use test-ui's SimpleShowLayout

};

const PostEdit = () => {
const { id } = useParams<{ id: string }>();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should not be nevessary, EditBase already reads the route params

<ListBase
resource="comments"
render={({ data }) => (
<ul>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use simpleList from test-ui

* BasicStandalone: react-admin runs on its own hash router created by the
* react-router v8 provider (no surrounding router).
*/
export const BasicStandalone = () => (

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

by convention, the most basic story is called Basic in ra

dataProvider={dataProvider}
layout={Layout}
>
<Resource name="posts" list={PostList} show={PostShow} />

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to test the Link component, I suggest you use custom routes and no resource

layout={Layout}
>
<CustomRoutes>
<Route path="/" element={<RedirectToPosts />} />

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is already the default behavior of react-admin (redirecting to the first resourc elist if no dashboard when accessing /)

dataProvider={dataProvider}
layout={Layout}
>
<Resource name="posts" list={PostList} show={PostShow} />

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same: use a customRoute to test this hook

* UseBlockerTest: blocks navigation while a form is dirty.
*/
const BlockerForm = () => {
const [dirty, setDirty] = React.useState(false);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest you use useWarnWhenUnsavedChanges instead of reimplementing it.

@smeng9

smeng9 commented Jun 24, 2026

Copy link
Copy Markdown
Contributor Author

Hi @fzaninotto

Can you restore the next branch, then I can target this merge request against the correct branch? This branch is probably accidentally deleted in your repo.

I have already noted this in the additional checks.

@fzaninotto

Copy link
Copy Markdown
Member

Sure, the next branch is now up again.

@smeng9 smeng9 changed the base branch from master to next June 24, 2026 19:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants