Skip to content

Commit adf8a33

Browse files
fix(react-router): navigate if redirect is thrown in component
1 parent 5c8c38a commit adf8a33

File tree

12 files changed

+327
-3
lines changed

12 files changed

+327
-3
lines changed

e2e/react-router/basic-file-based/src/routeTree.gen.ts

+79-1
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,13 @@ import { Route as groupLazyinsideImport } from './routes/(group)/lazyinside'
2929
import { Route as groupInsideImport } from './routes/(group)/inside'
3030
import { Route as groupLayoutImport } from './routes/(group)/_layout'
3131
import { Route as anotherGroupOnlyrouteinsideImport } from './routes/(another-group)/onlyrouteinside'
32+
import { Route as RedirectComponentIndexImport } from './routes/redirect/component/index'
3233
import { Route as RedirectTargetIndexImport } from './routes/redirect/$target/index'
3334
import { Route as RedirectPreloadThirdImport } from './routes/redirect/preload/third'
3435
import { Route as RedirectPreloadSecondImport } from './routes/redirect/preload/second'
3536
import { Route as RedirectPreloadFirstImport } from './routes/redirect/preload/first'
37+
import { Route as RedirectComponentSecondImport } from './routes/redirect/component/second'
38+
import { Route as RedirectComponentFirstImport } from './routes/redirect/component/first'
3639
import { Route as RedirectTargetViaLoaderImport } from './routes/redirect/$target/via-loader'
3740
import { Route as RedirectTargetViaBeforeLoadImport } from './routes/redirect/$target/via-beforeLoad'
3841
import { Route as PostsPostIdEditImport } from './routes/posts_.$postId.edit'
@@ -148,6 +151,12 @@ const anotherGroupOnlyrouteinsideRoute =
148151
getParentRoute: () => rootRoute,
149152
} as any)
150153

154+
const RedirectComponentIndexRoute = RedirectComponentIndexImport.update({
155+
id: '/redirect/component/',
156+
path: '/redirect/component/',
157+
getParentRoute: () => rootRoute,
158+
} as any)
159+
151160
const RedirectTargetIndexRoute = RedirectTargetIndexImport.update({
152161
id: '/',
153162
path: '/',
@@ -172,6 +181,18 @@ const RedirectPreloadFirstRoute = RedirectPreloadFirstImport.update({
172181
getParentRoute: () => rootRoute,
173182
} as any)
174183

184+
const RedirectComponentSecondRoute = RedirectComponentSecondImport.update({
185+
id: '/redirect/component/second',
186+
path: '/redirect/component/second',
187+
getParentRoute: () => rootRoute,
188+
} as any)
189+
190+
const RedirectComponentFirstRoute = RedirectComponentFirstImport.update({
191+
id: '/redirect/component/first',
192+
path: '/redirect/component/first',
193+
getParentRoute: () => rootRoute,
194+
} as any)
195+
175196
const RedirectTargetViaLoaderRoute = RedirectTargetViaLoaderImport.update({
176197
id: '/via-loader',
177198
path: '/via-loader',
@@ -387,6 +408,20 @@ declare module '@tanstack/react-router' {
387408
preLoaderRoute: typeof RedirectTargetViaLoaderImport
388409
parentRoute: typeof RedirectTargetImport
389410
}
411+
'/redirect/component/first': {
412+
id: '/redirect/component/first'
413+
path: '/redirect/component/first'
414+
fullPath: '/redirect/component/first'
415+
preLoaderRoute: typeof RedirectComponentFirstImport
416+
parentRoute: typeof rootRoute
417+
}
418+
'/redirect/component/second': {
419+
id: '/redirect/component/second'
420+
path: '/redirect/component/second'
421+
fullPath: '/redirect/component/second'
422+
preLoaderRoute: typeof RedirectComponentSecondImport
423+
parentRoute: typeof rootRoute
424+
}
390425
'/redirect/preload/first': {
391426
id: '/redirect/preload/first'
392427
path: '/redirect/preload/first'
@@ -415,6 +450,13 @@ declare module '@tanstack/react-router' {
415450
preLoaderRoute: typeof RedirectTargetIndexImport
416451
parentRoute: typeof RedirectTargetImport
417452
}
453+
'/redirect/component/': {
454+
id: '/redirect/component/'
455+
path: '/redirect/component'
456+
fullPath: '/redirect/component'
457+
preLoaderRoute: typeof RedirectComponentIndexImport
458+
parentRoute: typeof rootRoute
459+
}
418460
}
419461
}
420462

@@ -523,10 +565,13 @@ export interface FileRoutesByFullPath {
523565
'/posts/$postId/edit': typeof PostsPostIdEditRoute
524566
'/redirect/$target/via-beforeLoad': typeof RedirectTargetViaBeforeLoadRoute
525567
'/redirect/$target/via-loader': typeof RedirectTargetViaLoaderRoute
568+
'/redirect/component/first': typeof RedirectComponentFirstRoute
569+
'/redirect/component/second': typeof RedirectComponentSecondRoute
526570
'/redirect/preload/first': typeof RedirectPreloadFirstRoute
527571
'/redirect/preload/second': typeof RedirectPreloadSecondRoute
528572
'/redirect/preload/third': typeof RedirectPreloadThirdRoute
529573
'/redirect/$target/': typeof RedirectTargetIndexRoute
574+
'/redirect/component': typeof RedirectComponentIndexRoute
530575
}
531576

532577
export interface FileRoutesByTo {
@@ -549,10 +594,13 @@ export interface FileRoutesByTo {
549594
'/posts/$postId/edit': typeof PostsPostIdEditRoute
550595
'/redirect/$target/via-beforeLoad': typeof RedirectTargetViaBeforeLoadRoute
551596
'/redirect/$target/via-loader': typeof RedirectTargetViaLoaderRoute
597+
'/redirect/component/first': typeof RedirectComponentFirstRoute
598+
'/redirect/component/second': typeof RedirectComponentSecondRoute
552599
'/redirect/preload/first': typeof RedirectPreloadFirstRoute
553600
'/redirect/preload/second': typeof RedirectPreloadSecondRoute
554601
'/redirect/preload/third': typeof RedirectPreloadThirdRoute
555602
'/redirect/$target': typeof RedirectTargetIndexRoute
603+
'/redirect/component': typeof RedirectComponentIndexRoute
556604
}
557605

558606
export interface FileRoutesById {
@@ -581,10 +629,13 @@ export interface FileRoutesById {
581629
'/posts_/$postId/edit': typeof PostsPostIdEditRoute
582630
'/redirect/$target/via-beforeLoad': typeof RedirectTargetViaBeforeLoadRoute
583631
'/redirect/$target/via-loader': typeof RedirectTargetViaLoaderRoute
632+
'/redirect/component/first': typeof RedirectComponentFirstRoute
633+
'/redirect/component/second': typeof RedirectComponentSecondRoute
584634
'/redirect/preload/first': typeof RedirectPreloadFirstRoute
585635
'/redirect/preload/second': typeof RedirectPreloadSecondRoute
586636
'/redirect/preload/third': typeof RedirectPreloadThirdRoute
587637
'/redirect/$target/': typeof RedirectTargetIndexRoute
638+
'/redirect/component/': typeof RedirectComponentIndexRoute
588639
}
589640

590641
export interface FileRouteTypes {
@@ -611,10 +662,13 @@ export interface FileRouteTypes {
611662
| '/posts/$postId/edit'
612663
| '/redirect/$target/via-beforeLoad'
613664
| '/redirect/$target/via-loader'
665+
| '/redirect/component/first'
666+
| '/redirect/component/second'
614667
| '/redirect/preload/first'
615668
| '/redirect/preload/second'
616669
| '/redirect/preload/third'
617670
| '/redirect/$target/'
671+
| '/redirect/component'
618672
fileRoutesByTo: FileRoutesByTo
619673
to:
620674
| '/'
@@ -636,10 +690,13 @@ export interface FileRouteTypes {
636690
| '/posts/$postId/edit'
637691
| '/redirect/$target/via-beforeLoad'
638692
| '/redirect/$target/via-loader'
693+
| '/redirect/component/first'
694+
| '/redirect/component/second'
639695
| '/redirect/preload/first'
640696
| '/redirect/preload/second'
641697
| '/redirect/preload/third'
642698
| '/redirect/$target'
699+
| '/redirect/component'
643700
id:
644701
| '__root__'
645702
| '/'
@@ -666,10 +723,13 @@ export interface FileRouteTypes {
666723
| '/posts_/$postId/edit'
667724
| '/redirect/$target/via-beforeLoad'
668725
| '/redirect/$target/via-loader'
726+
| '/redirect/component/first'
727+
| '/redirect/component/second'
669728
| '/redirect/preload/first'
670729
| '/redirect/preload/second'
671730
| '/redirect/preload/third'
672731
| '/redirect/$target/'
732+
| '/redirect/component/'
673733
fileRoutesById: FileRoutesById
674734
}
675735

@@ -686,9 +746,12 @@ export interface RootRouteChildren {
686746
StructuralSharingEnabledRoute: typeof StructuralSharingEnabledRoute
687747
RedirectIndexRoute: typeof RedirectIndexRoute
688748
PostsPostIdEditRoute: typeof PostsPostIdEditRoute
749+
RedirectComponentFirstRoute: typeof RedirectComponentFirstRoute
750+
RedirectComponentSecondRoute: typeof RedirectComponentSecondRoute
689751
RedirectPreloadFirstRoute: typeof RedirectPreloadFirstRoute
690752
RedirectPreloadSecondRoute: typeof RedirectPreloadSecondRoute
691753
RedirectPreloadThirdRoute: typeof RedirectPreloadThirdRoute
754+
RedirectComponentIndexRoute: typeof RedirectComponentIndexRoute
692755
}
693756

694757
const rootRouteChildren: RootRouteChildren = {
@@ -704,9 +767,12 @@ const rootRouteChildren: RootRouteChildren = {
704767
StructuralSharingEnabledRoute: StructuralSharingEnabledRoute,
705768
RedirectIndexRoute: RedirectIndexRoute,
706769
PostsPostIdEditRoute: PostsPostIdEditRoute,
770+
RedirectComponentFirstRoute: RedirectComponentFirstRoute,
771+
RedirectComponentSecondRoute: RedirectComponentSecondRoute,
707772
RedirectPreloadFirstRoute: RedirectPreloadFirstRoute,
708773
RedirectPreloadSecondRoute: RedirectPreloadSecondRoute,
709774
RedirectPreloadThirdRoute: RedirectPreloadThirdRoute,
775+
RedirectComponentIndexRoute: RedirectComponentIndexRoute,
710776
}
711777

712778
export const routeTree = rootRoute
@@ -731,9 +797,12 @@ export const routeTree = rootRoute
731797
"/structural-sharing/$enabled",
732798
"/redirect/",
733799
"/posts_/$postId/edit",
800+
"/redirect/component/first",
801+
"/redirect/component/second",
734802
"/redirect/preload/first",
735803
"/redirect/preload/second",
736-
"/redirect/preload/third"
804+
"/redirect/preload/third",
805+
"/redirect/component/"
737806
]
738807
},
739808
"/": {
@@ -845,6 +914,12 @@ export const routeTree = rootRoute
845914
"filePath": "redirect/$target/via-loader.tsx",
846915
"parent": "/redirect/$target"
847916
},
917+
"/redirect/component/first": {
918+
"filePath": "redirect/component/first.tsx"
919+
},
920+
"/redirect/component/second": {
921+
"filePath": "redirect/component/second.tsx"
922+
},
848923
"/redirect/preload/first": {
849924
"filePath": "redirect/preload/first.tsx"
850925
},
@@ -857,6 +932,9 @@ export const routeTree = rootRoute
857932
"/redirect/$target/": {
858933
"filePath": "redirect/$target/index.tsx",
859934
"parent": "/redirect/$target"
935+
},
936+
"/redirect/component/": {
937+
"filePath": "redirect/component/index.tsx"
860938
}
861939
}
862940
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { createFileRoute, redirect } from '@tanstack/react-router'
2+
import React from 'react'
3+
4+
export const Route = createFileRoute('/redirect/component/first')({
5+
component: RouteComponent,
6+
})
7+
8+
function useThrowRedirect() {
9+
throw redirect({ to: '/redirect/component/second' })
10+
}
11+
12+
function RouteComponent() {
13+
useThrowRedirect()
14+
return (
15+
<div data-testid="first">
16+
<h1>Redirecting...</h1>
17+
</div>
18+
)
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { Link, createFileRoute } from '@tanstack/react-router'
2+
3+
export const Route = createFileRoute('/redirect/component/')({
4+
component: RouteComponent,
5+
})
6+
7+
function RouteComponent() {
8+
return (
9+
<div data-testid="first">
10+
<Link
11+
from={Route.fullPath}
12+
to="./first"
13+
activeProps={{
14+
className: 'font-bold',
15+
}}
16+
preload="intent"
17+
data-testid={'link'}
18+
>
19+
go to second
20+
</Link>
21+
</div>
22+
)
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { createFileRoute } from '@tanstack/react-router'
2+
3+
export const Route = createFileRoute('/redirect/component/second')({
4+
component: RouteComponent,
5+
})
6+
7+
function RouteComponent() {
8+
return <div data-testid="second">Hello "/redirect/component/second"!</div>
9+
}

e2e/react-router/basic-file-based/tests/redirect.spec.ts

+16
Original file line numberDiff line numberDiff line change
@@ -123,4 +123,20 @@ test.describe('redirects', () => {
123123
await page.waitForURL('/redirect/preload/third')
124124
await expect(page.getByTestId(`third`)).toBeInViewport()
125125
})
126+
127+
test.describe('throw redirect in route component', () => {
128+
test('initial load', async ({ page }) => {
129+
await page.goto(`/redirect/component/first`)
130+
await page.waitForURL('/redirect/component/second')
131+
await expect(page.getByTestId('second')).toBeInViewport()
132+
})
133+
test('when navigating', async ({ page }) => {
134+
await page.goto(`/redirect/component/`)
135+
const link = page.getByTestId(`link`)
136+
await link.focus()
137+
await link.click()
138+
await page.waitForURL('/redirect/component/second')
139+
await expect(page.getByTestId('second')).toBeInViewport()
140+
})
141+
})
126142
})

0 commit comments

Comments
 (0)