Skip to content

Commit

Permalink
feat: allow throwing external redirects
Browse files Browse the repository at this point in the history
  • Loading branch information
schiller-manuel committed Sep 27, 2024
1 parent a42deba commit 6ff9169
Show file tree
Hide file tree
Showing 37 changed files with 850 additions and 83 deletions.
1 change: 1 addition & 0 deletions e2e/react-router/basic-file-based/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
"@types/react": "^18.2.47",
"@types/react-dom": "^18.2.18",
"@vitejs/plugin-react": "^4.3.1",
"combinate": "^1.1.11",
"vite": "^5.4.5"
}
}
149 changes: 147 additions & 2 deletions e2e/react-router/basic-file-based/src/routeTree.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,14 @@ import { Route as rootRoute } from './routes/__root'
import { Route as PostsImport } from './routes/posts'
import { Route as LayoutImport } from './routes/_layout'
import { Route as IndexImport } from './routes/index'
import { Route as RedirectIndexImport } from './routes/redirect/index'
import { Route as PostsIndexImport } from './routes/posts.index'
import { Route as RedirectTargetImport } from './routes/redirect/$target'
import { Route as PostsPostIdImport } from './routes/posts.$postId'
import { Route as LayoutLayout2Import } from './routes/_layout/_layout-2'
import { Route as RedirectTargetIndexImport } from './routes/redirect/$target/index'
import { Route as RedirectTargetViaLoaderImport } from './routes/redirect/$target/via-loader'
import { Route as RedirectTargetViaBeforeLoadImport } from './routes/redirect/$target/via-beforeLoad'
import { Route as LayoutLayout2LayoutBImport } from './routes/_layout/_layout-2/layout-b'
import { Route as LayoutLayout2LayoutAImport } from './routes/_layout/_layout-2/layout-a'

Expand All @@ -37,11 +42,21 @@ const IndexRoute = IndexImport.update({
getParentRoute: () => rootRoute,
} as any)

const RedirectIndexRoute = RedirectIndexImport.update({
path: '/redirect/',
getParentRoute: () => rootRoute,
} as any)

const PostsIndexRoute = PostsIndexImport.update({
path: '/',
getParentRoute: () => PostsRoute,
} as any)

const RedirectTargetRoute = RedirectTargetImport.update({
path: '/redirect/$target',
getParentRoute: () => rootRoute,
} as any)

const PostsPostIdRoute = PostsPostIdImport.update({
path: '/$postId',
getParentRoute: () => PostsRoute,
Expand All @@ -52,6 +67,22 @@ const LayoutLayout2Route = LayoutLayout2Import.update({
getParentRoute: () => LayoutRoute,
} as any)

const RedirectTargetIndexRoute = RedirectTargetIndexImport.update({
path: '/',
getParentRoute: () => RedirectTargetRoute,
} as any)

const RedirectTargetViaLoaderRoute = RedirectTargetViaLoaderImport.update({
path: '/via-loader',
getParentRoute: () => RedirectTargetRoute,
} as any)

const RedirectTargetViaBeforeLoadRoute =
RedirectTargetViaBeforeLoadImport.update({
path: '/via-beforeLoad',
getParentRoute: () => RedirectTargetRoute,
} as any)

const LayoutLayout2LayoutBRoute = LayoutLayout2LayoutBImport.update({
path: '/layout-b',
getParentRoute: () => LayoutLayout2Route,
Expand Down Expand Up @@ -101,13 +132,27 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof PostsPostIdImport
parentRoute: typeof PostsImport
}
'/redirect/$target': {
id: '/redirect/$target'
path: '/redirect/$target'
fullPath: '/redirect/$target'
preLoaderRoute: typeof RedirectTargetImport
parentRoute: typeof rootRoute
}
'/posts/': {
id: '/posts/'
path: '/'
fullPath: '/posts/'
preLoaderRoute: typeof PostsIndexImport
parentRoute: typeof PostsImport
}
'/redirect/': {
id: '/redirect/'
path: '/redirect'
fullPath: '/redirect'
preLoaderRoute: typeof RedirectIndexImport
parentRoute: typeof rootRoute
}
'/_layout/_layout-2/layout-a': {
id: '/_layout/_layout-2/layout-a'
path: '/layout-a'
Expand All @@ -122,6 +167,27 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof LayoutLayout2LayoutBImport
parentRoute: typeof LayoutLayout2Import
}
'/redirect/$target/via-beforeLoad': {
id: '/redirect/$target/via-beforeLoad'
path: '/via-beforeLoad'
fullPath: '/redirect/$target/via-beforeLoad'
preLoaderRoute: typeof RedirectTargetViaBeforeLoadImport
parentRoute: typeof RedirectTargetImport
}
'/redirect/$target/via-loader': {
id: '/redirect/$target/via-loader'
path: '/via-loader'
fullPath: '/redirect/$target/via-loader'
preLoaderRoute: typeof RedirectTargetViaLoaderImport
parentRoute: typeof RedirectTargetImport
}
'/redirect/$target/': {
id: '/redirect/$target/'
path: '/'
fullPath: '/redirect/$target/'
preLoaderRoute: typeof RedirectTargetIndexImport
parentRoute: typeof RedirectTargetImport
}
}
}

Expand Down Expand Up @@ -164,23 +230,48 @@ const PostsRouteChildren: PostsRouteChildren = {

const PostsRouteWithChildren = PostsRoute._addFileChildren(PostsRouteChildren)

interface RedirectTargetRouteChildren {
RedirectTargetViaBeforeLoadRoute: typeof RedirectTargetViaBeforeLoadRoute
RedirectTargetViaLoaderRoute: typeof RedirectTargetViaLoaderRoute
RedirectTargetIndexRoute: typeof RedirectTargetIndexRoute
}

const RedirectTargetRouteChildren: RedirectTargetRouteChildren = {
RedirectTargetViaBeforeLoadRoute: RedirectTargetViaBeforeLoadRoute,
RedirectTargetViaLoaderRoute: RedirectTargetViaLoaderRoute,
RedirectTargetIndexRoute: RedirectTargetIndexRoute,
}

const RedirectTargetRouteWithChildren = RedirectTargetRoute._addFileChildren(
RedirectTargetRouteChildren,
)

export interface FileRoutesByFullPath {
'/': typeof IndexRoute
'': typeof LayoutLayout2RouteWithChildren
'/posts': typeof PostsRouteWithChildren
'/posts/$postId': typeof PostsPostIdRoute
'/redirect/$target': typeof RedirectTargetRouteWithChildren
'/posts/': typeof PostsIndexRoute
'/redirect': typeof RedirectIndexRoute
'/layout-a': typeof LayoutLayout2LayoutARoute
'/layout-b': typeof LayoutLayout2LayoutBRoute
'/redirect/$target/via-beforeLoad': typeof RedirectTargetViaBeforeLoadRoute
'/redirect/$target/via-loader': typeof RedirectTargetViaLoaderRoute
'/redirect/$target/': typeof RedirectTargetIndexRoute
}

export interface FileRoutesByTo {
'/': typeof IndexRoute
'': typeof LayoutLayout2RouteWithChildren
'/posts/$postId': typeof PostsPostIdRoute
'/posts': typeof PostsIndexRoute
'/redirect': typeof RedirectIndexRoute
'/layout-a': typeof LayoutLayout2LayoutARoute
'/layout-b': typeof LayoutLayout2LayoutBRoute
'/redirect/$target/via-beforeLoad': typeof RedirectTargetViaBeforeLoadRoute
'/redirect/$target/via-loader': typeof RedirectTargetViaLoaderRoute
'/redirect/$target': typeof RedirectTargetIndexRoute
}

export interface FileRoutesById {
Expand All @@ -190,9 +281,14 @@ export interface FileRoutesById {
'/posts': typeof PostsRouteWithChildren
'/_layout/_layout-2': typeof LayoutLayout2RouteWithChildren
'/posts/$postId': typeof PostsPostIdRoute
'/redirect/$target': typeof RedirectTargetRouteWithChildren
'/posts/': typeof PostsIndexRoute
'/redirect/': typeof RedirectIndexRoute
'/_layout/_layout-2/layout-a': typeof LayoutLayout2LayoutARoute
'/_layout/_layout-2/layout-b': typeof LayoutLayout2LayoutBRoute
'/redirect/$target/via-beforeLoad': typeof RedirectTargetViaBeforeLoadRoute
'/redirect/$target/via-loader': typeof RedirectTargetViaLoaderRoute
'/redirect/$target/': typeof RedirectTargetIndexRoute
}

export interface FileRouteTypes {
Expand All @@ -202,34 +298,58 @@ export interface FileRouteTypes {
| ''
| '/posts'
| '/posts/$postId'
| '/redirect/$target'
| '/posts/'
| '/redirect'
| '/layout-a'
| '/layout-b'
| '/redirect/$target/via-beforeLoad'
| '/redirect/$target/via-loader'
| '/redirect/$target/'
fileRoutesByTo: FileRoutesByTo
to: '/' | '' | '/posts/$postId' | '/posts' | '/layout-a' | '/layout-b'
to:
| '/'
| ''
| '/posts/$postId'
| '/posts'
| '/redirect'
| '/layout-a'
| '/layout-b'
| '/redirect/$target/via-beforeLoad'
| '/redirect/$target/via-loader'
| '/redirect/$target'
id:
| '__root__'
| '/'
| '/_layout'
| '/posts'
| '/_layout/_layout-2'
| '/posts/$postId'
| '/redirect/$target'
| '/posts/'
| '/redirect/'
| '/_layout/_layout-2/layout-a'
| '/_layout/_layout-2/layout-b'
| '/redirect/$target/via-beforeLoad'
| '/redirect/$target/via-loader'
| '/redirect/$target/'
fileRoutesById: FileRoutesById
}

export interface RootRouteChildren {
IndexRoute: typeof IndexRoute
LayoutRoute: typeof LayoutRouteWithChildren
PostsRoute: typeof PostsRouteWithChildren
RedirectTargetRoute: typeof RedirectTargetRouteWithChildren
RedirectIndexRoute: typeof RedirectIndexRoute
}

const rootRouteChildren: RootRouteChildren = {
IndexRoute: IndexRoute,
LayoutRoute: LayoutRouteWithChildren,
PostsRoute: PostsRouteWithChildren,
RedirectTargetRoute: RedirectTargetRouteWithChildren,
RedirectIndexRoute: RedirectIndexRoute,
}

export const routeTree = rootRoute
Expand All @@ -246,7 +366,9 @@ export const routeTree = rootRoute
"children": [
"/",
"/_layout",
"/posts"
"/posts",
"/redirect/$target",
"/redirect/"
]
},
"/": {
Expand Down Expand Up @@ -277,17 +399,40 @@ export const routeTree = rootRoute
"filePath": "posts.$postId.tsx",
"parent": "/posts"
},
"/redirect/$target": {
"filePath": "redirect/$target.tsx",
"children": [
"/redirect/$target/via-beforeLoad",
"/redirect/$target/via-loader",
"/redirect/$target/"
]
},
"/posts/": {
"filePath": "posts.index.tsx",
"parent": "/posts"
},
"/redirect/": {
"filePath": "redirect/index.tsx"
},
"/_layout/_layout-2/layout-a": {
"filePath": "_layout/_layout-2/layout-a.tsx",
"parent": "/_layout/_layout-2"
},
"/_layout/_layout-2/layout-b": {
"filePath": "_layout/_layout-2/layout-b.tsx",
"parent": "/_layout/_layout-2"
},
"/redirect/$target/via-beforeLoad": {
"filePath": "redirect/$target/via-beforeLoad.tsx",
"parent": "/redirect/$target"
},
"/redirect/$target/via-loader": {
"filePath": "redirect/$target/via-loader.tsx",
"parent": "/redirect/$target"
},
"/redirect/$target/": {
"filePath": "redirect/$target/index.tsx",
"parent": "/redirect/$target"
}
}
}
Expand Down
8 changes: 8 additions & 0 deletions e2e/react-router/basic-file-based/src/routes/__root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,14 @@ function RootComponent() {
>
Layout
</Link>{' '}
<Link
to="/redirect"
activeProps={{
className: 'font-bold',
}}
>
redirect
</Link>{' '}
<Link
// @ts-expect-error
to="/this-route-does-not-exist"
Expand Down
11 changes: 11 additions & 0 deletions e2e/react-router/basic-file-based/src/routes/redirect/$target.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { createFileRoute } from '@tanstack/react-router'
import { z } from 'zod'

export const Route = createFileRoute('/redirect/$target')({
params: {
parse: z.object({
target: z.union([z.literal('internal'), z.literal('external')]),
}).parse,
stringify: (params) => ({ target: params.target }),
},
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { Link, createFileRoute } from '@tanstack/react-router'

export const Route = createFileRoute('/redirect/$target/')({
component: () => (
<div>
<Link
from={Route.fullPath}
to="./via-beforeLoad"
activeProps={{
className: 'font-bold',
}}
>
via-beforeLoad
</Link>{' '}
<Link
from={Route.fullPath}
to="./via-loader"
activeProps={{
className: 'font-bold',
}}
>
via-loader
</Link>{' '}
</div>
),
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { createFileRoute, redirect } from '@tanstack/react-router'

export const Route = createFileRoute('/redirect/$target/via-beforeLoad')({
beforeLoad: ({ params: { target } }) => {
if (target === 'internal') {
throw redirect({ to: '/posts' })
}
throw redirect({
href: 'http://example.com',
})
},
component: () => <div>{Route.fullPath}</div>,
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { createFileRoute, redirect } from '@tanstack/react-router'

export const Route = createFileRoute('/redirect/$target/via-loader')({
loader: ({ params: { target } }) => {
if (target === 'internal') {
throw redirect({ to: '/posts' })
}
throw redirect({
href: 'http://example.com',
})
},
component: () => <div>{Route.fullPath}</div>,
})
Loading

0 comments on commit 6ff9169

Please sign in to comment.