Skip to content

Commit d558b67

Browse files
authored
fix(solid-router-ssr-query): allow redirect inside server function ssr (#5668)
1 parent 56a3526 commit d558b67

File tree

19 files changed

+348
-150
lines changed

19 files changed

+348
-150
lines changed

e2e/react-start/server-functions/src/routeTree.gen.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@ import { Route as ConsistentRouteImport } from './routes/consistent'
2323
import { Route as AbortSignalRouteImport } from './routes/abort-signal'
2424
import { Route as IndexRouteImport } from './routes/index'
2525
import { Route as RedirectTestIndexRouteImport } from './routes/redirect-test/index'
26+
import { Route as RedirectTestSsrIndexRouteImport } from './routes/redirect-test-ssr/index'
2627
import { Route as PrimitivesIndexRouteImport } from './routes/primitives/index'
2728
import { Route as MiddlewareIndexRouteImport } from './routes/middleware/index'
2829
import { Route as FormdataRedirectIndexRouteImport } from './routes/formdata-redirect/index'
2930
import { Route as FactoryIndexRouteImport } from './routes/factory/index'
3031
import { Route as CookiesIndexRouteImport } from './routes/cookies/index'
3132
import { Route as RedirectTestTargetRouteImport } from './routes/redirect-test/target'
33+
import { Route as RedirectTestSsrTargetRouteImport } from './routes/redirect-test-ssr/target'
3234
import { Route as MiddlewareSendServerFnRouteImport } from './routes/middleware/send-serverFn'
3335
import { Route as MiddlewareRequestMiddlewareRouteImport } from './routes/middleware/request-middleware'
3436
import { Route as MiddlewareClientMiddlewareRouterRouteImport } from './routes/middleware/client-middleware-router'
@@ -105,6 +107,11 @@ const RedirectTestIndexRoute = RedirectTestIndexRouteImport.update({
105107
path: '/redirect-test/',
106108
getParentRoute: () => rootRouteImport,
107109
} as any)
110+
const RedirectTestSsrIndexRoute = RedirectTestSsrIndexRouteImport.update({
111+
id: '/redirect-test-ssr/',
112+
path: '/redirect-test-ssr/',
113+
getParentRoute: () => rootRouteImport,
114+
} as any)
108115
const PrimitivesIndexRoute = PrimitivesIndexRouteImport.update({
109116
id: '/primitives/',
110117
path: '/primitives/',
@@ -135,6 +142,11 @@ const RedirectTestTargetRoute = RedirectTestTargetRouteImport.update({
135142
path: '/redirect-test/target',
136143
getParentRoute: () => rootRouteImport,
137144
} as any)
145+
const RedirectTestSsrTargetRoute = RedirectTestSsrTargetRouteImport.update({
146+
id: '/redirect-test-ssr/target',
147+
path: '/redirect-test-ssr/target',
148+
getParentRoute: () => rootRouteImport,
149+
} as any)
138150
const MiddlewareSendServerFnRoute = MiddlewareSendServerFnRouteImport.update({
139151
id: '/middleware/send-serverFn',
140152
path: '/middleware/send-serverFn',
@@ -182,12 +194,14 @@ export interface FileRoutesByFullPath {
182194
'/middleware/client-middleware-router': typeof MiddlewareClientMiddlewareRouterRoute
183195
'/middleware/request-middleware': typeof MiddlewareRequestMiddlewareRoute
184196
'/middleware/send-serverFn': typeof MiddlewareSendServerFnRoute
197+
'/redirect-test-ssr/target': typeof RedirectTestSsrTargetRoute
185198
'/redirect-test/target': typeof RedirectTestTargetRoute
186199
'/cookies': typeof CookiesIndexRoute
187200
'/factory': typeof FactoryIndexRoute
188201
'/formdata-redirect': typeof FormdataRedirectIndexRoute
189202
'/middleware': typeof MiddlewareIndexRoute
190203
'/primitives': typeof PrimitivesIndexRoute
204+
'/redirect-test-ssr': typeof RedirectTestSsrIndexRoute
191205
'/redirect-test': typeof RedirectTestIndexRoute
192206
'/formdata-redirect/target/$name': typeof FormdataRedirectTargetNameRoute
193207
}
@@ -209,12 +223,14 @@ export interface FileRoutesByTo {
209223
'/middleware/client-middleware-router': typeof MiddlewareClientMiddlewareRouterRoute
210224
'/middleware/request-middleware': typeof MiddlewareRequestMiddlewareRoute
211225
'/middleware/send-serverFn': typeof MiddlewareSendServerFnRoute
226+
'/redirect-test-ssr/target': typeof RedirectTestSsrTargetRoute
212227
'/redirect-test/target': typeof RedirectTestTargetRoute
213228
'/cookies': typeof CookiesIndexRoute
214229
'/factory': typeof FactoryIndexRoute
215230
'/formdata-redirect': typeof FormdataRedirectIndexRoute
216231
'/middleware': typeof MiddlewareIndexRoute
217232
'/primitives': typeof PrimitivesIndexRoute
233+
'/redirect-test-ssr': typeof RedirectTestSsrIndexRoute
218234
'/redirect-test': typeof RedirectTestIndexRoute
219235
'/formdata-redirect/target/$name': typeof FormdataRedirectTargetNameRoute
220236
}
@@ -237,12 +253,14 @@ export interface FileRoutesById {
237253
'/middleware/client-middleware-router': typeof MiddlewareClientMiddlewareRouterRoute
238254
'/middleware/request-middleware': typeof MiddlewareRequestMiddlewareRoute
239255
'/middleware/send-serverFn': typeof MiddlewareSendServerFnRoute
256+
'/redirect-test-ssr/target': typeof RedirectTestSsrTargetRoute
240257
'/redirect-test/target': typeof RedirectTestTargetRoute
241258
'/cookies/': typeof CookiesIndexRoute
242259
'/factory/': typeof FactoryIndexRoute
243260
'/formdata-redirect/': typeof FormdataRedirectIndexRoute
244261
'/middleware/': typeof MiddlewareIndexRoute
245262
'/primitives/': typeof PrimitivesIndexRoute
263+
'/redirect-test-ssr/': typeof RedirectTestSsrIndexRoute
246264
'/redirect-test/': typeof RedirectTestIndexRoute
247265
'/formdata-redirect/target/$name': typeof FormdataRedirectTargetNameRoute
248266
}
@@ -266,12 +284,14 @@ export interface FileRouteTypes {
266284
| '/middleware/client-middleware-router'
267285
| '/middleware/request-middleware'
268286
| '/middleware/send-serverFn'
287+
| '/redirect-test-ssr/target'
269288
| '/redirect-test/target'
270289
| '/cookies'
271290
| '/factory'
272291
| '/formdata-redirect'
273292
| '/middleware'
274293
| '/primitives'
294+
| '/redirect-test-ssr'
275295
| '/redirect-test'
276296
| '/formdata-redirect/target/$name'
277297
fileRoutesByTo: FileRoutesByTo
@@ -293,12 +313,14 @@ export interface FileRouteTypes {
293313
| '/middleware/client-middleware-router'
294314
| '/middleware/request-middleware'
295315
| '/middleware/send-serverFn'
316+
| '/redirect-test-ssr/target'
296317
| '/redirect-test/target'
297318
| '/cookies'
298319
| '/factory'
299320
| '/formdata-redirect'
300321
| '/middleware'
301322
| '/primitives'
323+
| '/redirect-test-ssr'
302324
| '/redirect-test'
303325
| '/formdata-redirect/target/$name'
304326
id:
@@ -320,12 +342,14 @@ export interface FileRouteTypes {
320342
| '/middleware/client-middleware-router'
321343
| '/middleware/request-middleware'
322344
| '/middleware/send-serverFn'
345+
| '/redirect-test-ssr/target'
323346
| '/redirect-test/target'
324347
| '/cookies/'
325348
| '/factory/'
326349
| '/formdata-redirect/'
327350
| '/middleware/'
328351
| '/primitives/'
352+
| '/redirect-test-ssr/'
329353
| '/redirect-test/'
330354
| '/formdata-redirect/target/$name'
331355
fileRoutesById: FileRoutesById
@@ -348,12 +372,14 @@ export interface RootRouteChildren {
348372
MiddlewareClientMiddlewareRouterRoute: typeof MiddlewareClientMiddlewareRouterRoute
349373
MiddlewareRequestMiddlewareRoute: typeof MiddlewareRequestMiddlewareRoute
350374
MiddlewareSendServerFnRoute: typeof MiddlewareSendServerFnRoute
375+
RedirectTestSsrTargetRoute: typeof RedirectTestSsrTargetRoute
351376
RedirectTestTargetRoute: typeof RedirectTestTargetRoute
352377
CookiesIndexRoute: typeof CookiesIndexRoute
353378
FactoryIndexRoute: typeof FactoryIndexRoute
354379
FormdataRedirectIndexRoute: typeof FormdataRedirectIndexRoute
355380
MiddlewareIndexRoute: typeof MiddlewareIndexRoute
356381
PrimitivesIndexRoute: typeof PrimitivesIndexRoute
382+
RedirectTestSsrIndexRoute: typeof RedirectTestSsrIndexRoute
357383
RedirectTestIndexRoute: typeof RedirectTestIndexRoute
358384
FormdataRedirectTargetNameRoute: typeof FormdataRedirectTargetNameRoute
359385
}
@@ -458,6 +484,13 @@ declare module '@tanstack/react-router' {
458484
preLoaderRoute: typeof RedirectTestIndexRouteImport
459485
parentRoute: typeof rootRouteImport
460486
}
487+
'/redirect-test-ssr/': {
488+
id: '/redirect-test-ssr/'
489+
path: '/redirect-test-ssr'
490+
fullPath: '/redirect-test-ssr'
491+
preLoaderRoute: typeof RedirectTestSsrIndexRouteImport
492+
parentRoute: typeof rootRouteImport
493+
}
461494
'/primitives/': {
462495
id: '/primitives/'
463496
path: '/primitives'
@@ -500,6 +533,13 @@ declare module '@tanstack/react-router' {
500533
preLoaderRoute: typeof RedirectTestTargetRouteImport
501534
parentRoute: typeof rootRouteImport
502535
}
536+
'/redirect-test-ssr/target': {
537+
id: '/redirect-test-ssr/target'
538+
path: '/redirect-test-ssr/target'
539+
fullPath: '/redirect-test-ssr/target'
540+
preLoaderRoute: typeof RedirectTestSsrTargetRouteImport
541+
parentRoute: typeof rootRouteImport
542+
}
503543
'/middleware/send-serverFn': {
504544
id: '/middleware/send-serverFn'
505545
path: '/middleware/send-serverFn'
@@ -556,12 +596,14 @@ const rootRouteChildren: RootRouteChildren = {
556596
MiddlewareClientMiddlewareRouterRoute: MiddlewareClientMiddlewareRouterRoute,
557597
MiddlewareRequestMiddlewareRoute: MiddlewareRequestMiddlewareRoute,
558598
MiddlewareSendServerFnRoute: MiddlewareSendServerFnRoute,
599+
RedirectTestSsrTargetRoute: RedirectTestSsrTargetRoute,
559600
RedirectTestTargetRoute: RedirectTestTargetRoute,
560601
CookiesIndexRoute: CookiesIndexRoute,
561602
FactoryIndexRoute: FactoryIndexRoute,
562603
FormdataRedirectIndexRoute: FormdataRedirectIndexRoute,
563604
MiddlewareIndexRoute: MiddlewareIndexRoute,
564605
PrimitivesIndexRoute: PrimitivesIndexRoute,
606+
RedirectTestSsrIndexRoute: RedirectTestSsrIndexRoute,
565607
RedirectTestIndexRoute: RedirectTestIndexRoute,
566608
FormdataRedirectTargetNameRoute: FormdataRedirectTargetNameRoute,
567609
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { useQuery } from '@tanstack/react-query'
2+
import { createFileRoute, redirect } from '@tanstack/react-router'
3+
import { createServerFn, useServerFn } from '@tanstack/react-start'
4+
import { Suspense } from 'react'
5+
6+
const $redirectServerFn = createServerFn({ method: 'GET' }).handler(
7+
async () => {
8+
throw redirect({ to: '/redirect-test-ssr/target' })
9+
},
10+
)
11+
12+
export const Route = createFileRoute('/redirect-test-ssr/')({
13+
component: RouteComponent,
14+
ssr: true,
15+
})
16+
17+
function RouteComponent() {
18+
const redirectFn = useServerFn($redirectServerFn)
19+
const query = useQuery({
20+
queryKey: ['redirect-test-ssr'],
21+
queryFn: () => redirectFn(),
22+
})
23+
24+
return (
25+
<div>
26+
<h1 data-testid="redirect-source-ssr">Redirect Source SSR</h1>
27+
<Suspense>
28+
<div>{JSON.stringify(query.data)}</div>
29+
</Suspense>
30+
</div>
31+
)
32+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { createFileRoute } from '@tanstack/react-router'
2+
3+
export const Route = createFileRoute('/redirect-test-ssr/target')({
4+
component: RouteComponent,
5+
})
6+
7+
function RouteComponent() {
8+
return (
9+
<div>
10+
<h1 data-testid="redirect-target-ssr">Redirect Target SSR</h1>
11+
<p>Successfully redirected!</p>
12+
</div>
13+
)
14+
}

e2e/react-start/server-functions/tests/server-functions.spec.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,3 +477,15 @@ test('redirect in server function on direct navigation', async ({ page }) => {
477477
await expect(page.getByTestId('redirect-target')).toBeVisible()
478478
expect(page.url()).toContain('/redirect-test/target')
479479
})
480+
481+
test('redirect in server function called in query during SSR', async ({
482+
page,
483+
}) => {
484+
// Test direct navigation to a route with a server function that redirects
485+
// when called inside a query with ssr: true
486+
await page.goto('/redirect-test-ssr')
487+
488+
// Should redirect to target page
489+
await expect(page.getByTestId('redirect-target-ssr')).toBeVisible()
490+
expect(page.url()).toContain('/redirect-test-ssr/target')
491+
})

e2e/solid-router/basic-solid-query-file-based/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"dependencies": {
1414
"@tailwindcss/postcss": "^4.1.15",
1515
"@tanstack/router-plugin": "workspace:^",
16-
"@tanstack/solid-query": "^5.90.0",
16+
"@tanstack/solid-query": "^5.90.9",
1717
"@tanstack/solid-query-devtools": "^5.71.9",
1818
"@tanstack/solid-router": "workspace:^",
1919
"@tanstack/solid-router-devtools": "workspace:^",

e2e/solid-router/basic-solid-query/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
},
1313
"dependencies": {
1414
"@tailwindcss/postcss": "^4.1.15",
15-
"@tanstack/solid-query": "^5.90.0",
15+
"@tanstack/solid-query": "^5.90.9",
1616
"@tanstack/solid-query-devtools": "^5.71.9",
1717
"@tanstack/solid-router": "workspace:^",
1818
"@tanstack/solid-router-devtools": "workspace:^",

e2e/solid-start/basic-solid-query/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"test:e2e": "rm -rf port*.txt; playwright test --project=chromium"
1212
},
1313
"dependencies": {
14-
"@tanstack/solid-query": "^5.90.0",
14+
"@tanstack/solid-query": "^5.90.9",
1515
"@tanstack/solid-query-devtools": "^5.90.0",
1616
"@tanstack/solid-router": "workspace:^",
1717
"@tanstack/solid-router-devtools": "workspace:^",

e2e/solid-start/query-integration/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"test:e2e": "rm -rf port*.txt; playwright test --project=chromium"
1212
},
1313
"dependencies": {
14-
"@tanstack/solid-query": "^5.90.0",
14+
"@tanstack/solid-query": "^5.90.9",
1515
"@tanstack/solid-query-devtools": "^5.90.0",
1616
"@tanstack/solid-router": "workspace:^",
1717
"@tanstack/solid-router-devtools": "workspace:^",

e2e/solid-start/server-functions/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"test:e2e": "rm -rf port*.txt; playwright test --project=chromium"
1212
},
1313
"dependencies": {
14-
"@tanstack/solid-query": "^5.90.6",
14+
"@tanstack/solid-query": "^5.90.9",
1515
"@tanstack/solid-router": "workspace:^",
1616
"@tanstack/solid-router-devtools": "workspace:^",
1717
"@tanstack/solid-router-ssr-query": "workspace:^",

0 commit comments

Comments
 (0)