diff --git a/packages/react/src/reactrouter-compat-utils/utils.ts b/packages/react/src/reactrouter-compat-utils/utils.ts index b243ad4bf421..d0ca8ab36e33 100644 --- a/packages/react/src/reactrouter-compat-utils/utils.ts +++ b/packages/react/src/reactrouter-compat-utils/utils.ts @@ -369,7 +369,7 @@ export function resolveRouteNameAndSource( if (enableAsyncRouteHandlers && lazyRouteManifest && lazyRouteManifest.length > 0) { const manifestMatch = matchRouteManifest(location.pathname, lazyRouteManifest, basename); if (manifestMatch) { - return [(stripBasename ? '' : basename) + manifestMatch, 'route']; + return [(stripBasename ? '' : trimSlash(basename)) + manifestMatch, 'route']; } } diff --git a/packages/react/test/reactrouter-compat-utils/utils.test.ts b/packages/react/test/reactrouter-compat-utils/utils.test.ts index a5cca4030fac..905562ba8cff 100644 --- a/packages/react/test/reactrouter-compat-utils/utils.test.ts +++ b/packages/react/test/reactrouter-compat-utils/utils.test.ts @@ -673,6 +673,21 @@ describe('reactrouter-compat-utils/utils', () => { }); describe('resolveRouteNameAndSource', () => { + it.each([ + { basename: '/app/', pathname: '/app/users/42', expected: '/app/users/:id' }, + { basename: '/', pathname: '/users/42', expected: '/users/:id' }, + ])('avoids double slashes in manifest route names with basename $basename', ({ basename, pathname, expected }) => { + const config = makeConfig({ + enableAsyncRouteHandlers: true, + lazyRouteManifest: ['/users/:id'], + basename, + }); + + const result = resolveRouteNameAndSource({ pathname }, [], [], [], config); + + expect(result).toEqual([expected, 'route']); + }); + it('should use descendant route when location is inside one', () => { const location: Location = { pathname: '/users/123/profile' }; const routes: RouteObject[] = [{ path: '/users', element: null }];