Skip to content

Commit e5ce02e

Browse files
committed
feat: add strict false parameter handling and related routes
1 parent 7b095a9 commit e5ce02e

5 files changed

Lines changed: 169 additions & 0 deletions

File tree

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

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import { Route as anotherGroupOnlyrouteinsideRouteImport } from './routes/(anoth
4141
import { Route as RelativeUseNavigateRouteRouteImport } from './routes/relative/useNavigate/route'
4242
import { Route as RelativeLinkRouteRouteImport } from './routes/relative/link/route'
4343
import { Route as PathlessLayoutLayoutRouteRouteImport } from './routes/pathless-layout/_layout/route'
44+
import { Route as ParamsPsStrictFalseRouteRouteImport } from './routes/params-ps/strict-false/route'
4445
import { Route as ParamsPsNonNestedRouteRouteImport } from './routes/params-ps/non-nested/route'
4546
import { Route as NonNestedSuffixRouteRouteImport } from './routes/non-nested/suffix/route'
4647
import { Route as NonNestedPrefixRouteRouteImport } from './routes/non-nested/prefix/route'
@@ -78,6 +79,7 @@ import { Route as LayoutLayout2LayoutBRouteImport } from './routes/_layout/_layo
7879
import { Route as LayoutLayout2LayoutARouteImport } from './routes/_layout/_layout-2/layout-a'
7980
import { Route as groupSubfolderInsideRouteImport } from './routes/(group)/subfolder/inside'
8081
import { Route as groupLayoutInsidelayoutRouteImport } from './routes/(group)/_layout.insidelayout'
82+
import { Route as ParamsPsStrictFalseVersionRouteRouteImport } from './routes/params-ps/strict-false/$version.route'
8183
import { Route as ParamsPsNonNestedFooRouteRouteImport } from './routes/params-ps/non-nested/$foo_/route'
8284
import { Route as ParamsPsNamedFooRouteRouteImport } from './routes/params-ps/named/$foo/route'
8385
import { Route as NonNestedSuffixChar123bazChar125suffixRouteRouteImport } from './routes/non-nested/suffix/{$baz}suffix.route'
@@ -281,6 +283,12 @@ const PathlessLayoutLayoutRouteRoute =
281283
id: '/_layout',
282284
getParentRoute: () => PathlessLayoutRouteRoute,
283285
} as any)
286+
const ParamsPsStrictFalseRouteRoute =
287+
ParamsPsStrictFalseRouteRouteImport.update({
288+
id: '/params-ps/strict-false',
289+
path: '/params-ps/strict-false',
290+
getParentRoute: () => rootRouteImport,
291+
} as any)
284292
const ParamsPsNonNestedRouteRoute = ParamsPsNonNestedRouteRouteImport.update({
285293
id: '/params-ps/non-nested',
286294
path: '/params-ps/non-nested',
@@ -481,6 +489,12 @@ const groupLayoutInsidelayoutRoute = groupLayoutInsidelayoutRouteImport.update({
481489
path: '/insidelayout',
482490
getParentRoute: () => groupLayoutRoute,
483491
} as any)
492+
const ParamsPsStrictFalseVersionRouteRoute =
493+
ParamsPsStrictFalseVersionRouteRouteImport.update({
494+
id: '/$version',
495+
path: '/$version',
496+
getParentRoute: () => ParamsPsStrictFalseRouteRoute,
497+
} as any)
484498
const ParamsPsNonNestedFooRouteRoute =
485499
ParamsPsNonNestedFooRouteRouteImport.update({
486500
id: '/$foo_',
@@ -721,6 +735,7 @@ export interface FileRoutesByFullPath {
721735
'/non-nested/prefix': typeof NonNestedPrefixRouteRouteWithChildren
722736
'/non-nested/suffix': typeof NonNestedSuffixRouteRouteWithChildren
723737
'/params-ps/non-nested': typeof ParamsPsNonNestedRouteRouteWithChildren
738+
'/params-ps/strict-false': typeof ParamsPsStrictFalseRouteRouteWithChildren
724739
'/relative/link': typeof RelativeLinkRouteRouteWithChildren
725740
'/relative/useNavigate': typeof RelativeUseNavigateRouteRouteWithChildren
726741
'/onlyrouteinside': typeof anotherGroupOnlyrouteinsideRoute
@@ -742,6 +757,7 @@ export interface FileRoutesByFullPath {
742757
'/non-nested/suffix/{$baz}suffix': typeof NonNestedSuffixChar123bazChar125suffixRouteRouteWithChildren
743758
'/params-ps/named/$foo': typeof ParamsPsNamedFooRouteRouteWithChildren
744759
'/params-ps/non-nested/$foo': typeof ParamsPsNonNestedFooRouteRouteWithChildren
760+
'/params-ps/strict-false/$version': typeof ParamsPsStrictFalseVersionRouteRoute
745761
'/insidelayout': typeof groupLayoutInsidelayoutRoute
746762
'/subfolder/inside': typeof groupSubfolderInsideRoute
747763
'/layout-a': typeof LayoutLayout2LayoutARoute
@@ -825,6 +841,7 @@ export interface FileRoutesByTo {
825841
'/non-nested/prefix': typeof NonNestedPrefixRouteRouteWithChildren
826842
'/non-nested/suffix': typeof NonNestedSuffixRouteRouteWithChildren
827843
'/params-ps/non-nested': typeof ParamsPsNonNestedRouteRouteWithChildren
844+
'/params-ps/strict-false': typeof ParamsPsStrictFalseRouteRouteWithChildren
828845
'/relative/link': typeof RelativeLinkRouteRouteWithChildren
829846
'/relative/useNavigate': typeof RelativeUseNavigateRouteRouteWithChildren
830847
'/onlyrouteinside': typeof anotherGroupOnlyrouteinsideRoute
@@ -840,6 +857,7 @@ export interface FileRoutesByTo {
840857
'/search-params': typeof SearchParamsIndexRoute
841858
'/params-ps/named/$foo': typeof ParamsPsNamedFooRouteRouteWithChildren
842859
'/params-ps/non-nested/$foo': typeof ParamsPsNonNestedFooRouteRouteWithChildren
860+
'/params-ps/strict-false/$version': typeof ParamsPsStrictFalseVersionRouteRoute
843861
'/insidelayout': typeof groupLayoutInsidelayoutRoute
844862
'/subfolder/inside': typeof groupSubfolderInsideRoute
845863
'/layout-a': typeof LayoutLayout2LayoutARoute
@@ -924,6 +942,7 @@ export interface FileRoutesById {
924942
'/non-nested/prefix': typeof NonNestedPrefixRouteRouteWithChildren
925943
'/non-nested/suffix': typeof NonNestedSuffixRouteRouteWithChildren
926944
'/params-ps/non-nested': typeof ParamsPsNonNestedRouteRouteWithChildren
945+
'/params-ps/strict-false': typeof ParamsPsStrictFalseRouteRouteWithChildren
927946
'/pathless-layout/_layout': typeof PathlessLayoutLayoutRouteRouteWithChildren
928947
'/relative/link': typeof RelativeLinkRouteRouteWithChildren
929948
'/relative/useNavigate': typeof RelativeUseNavigateRouteRouteWithChildren
@@ -948,6 +967,7 @@ export interface FileRoutesById {
948967
'/non-nested/suffix/{$baz}suffix': typeof NonNestedSuffixChar123bazChar125suffixRouteRouteWithChildren
949968
'/params-ps/named/$foo': typeof ParamsPsNamedFooRouteRouteWithChildren
950969
'/params-ps/non-nested/$foo_': typeof ParamsPsNonNestedFooRouteRouteWithChildren
970+
'/params-ps/strict-false/$version': typeof ParamsPsStrictFalseVersionRouteRoute
951971
'/(group)/_layout/insidelayout': typeof groupLayoutInsidelayoutRoute
952972
'/(group)/subfolder/inside': typeof groupSubfolderInsideRoute
953973
'/_layout/_layout-2/layout-a': typeof LayoutLayout2LayoutARoute
@@ -1035,6 +1055,7 @@ export interface FileRouteTypes {
10351055
| '/non-nested/prefix'
10361056
| '/non-nested/suffix'
10371057
| '/params-ps/non-nested'
1058+
| '/params-ps/strict-false'
10381059
| '/relative/link'
10391060
| '/relative/useNavigate'
10401061
| '/onlyrouteinside'
@@ -1056,6 +1077,7 @@ export interface FileRouteTypes {
10561077
| '/non-nested/suffix/{$baz}suffix'
10571078
| '/params-ps/named/$foo'
10581079
| '/params-ps/non-nested/$foo'
1080+
| '/params-ps/strict-false/$version'
10591081
| '/insidelayout'
10601082
| '/subfolder/inside'
10611083
| '/layout-a'
@@ -1139,6 +1161,7 @@ export interface FileRouteTypes {
11391161
| '/non-nested/prefix'
11401162
| '/non-nested/suffix'
11411163
| '/params-ps/non-nested'
1164+
| '/params-ps/strict-false'
11421165
| '/relative/link'
11431166
| '/relative/useNavigate'
11441167
| '/onlyrouteinside'
@@ -1154,6 +1177,7 @@ export interface FileRouteTypes {
11541177
| '/search-params'
11551178
| '/params-ps/named/$foo'
11561179
| '/params-ps/non-nested/$foo'
1180+
| '/params-ps/strict-false/$version'
11571181
| '/insidelayout'
11581182
| '/subfolder/inside'
11591183
| '/layout-a'
@@ -1237,6 +1261,7 @@ export interface FileRouteTypes {
12371261
| '/non-nested/prefix'
12381262
| '/non-nested/suffix'
12391263
| '/params-ps/non-nested'
1264+
| '/params-ps/strict-false'
12401265
| '/pathless-layout/_layout'
12411266
| '/relative/link'
12421267
| '/relative/useNavigate'
@@ -1261,6 +1286,7 @@ export interface FileRouteTypes {
12611286
| '/non-nested/suffix/{$baz}suffix'
12621287
| '/params-ps/named/$foo'
12631288
| '/params-ps/non-nested/$foo_'
1289+
| '/params-ps/strict-false/$version'
12641290
| '/(group)/_layout/insidelayout'
12651291
| '/(group)/subfolder/inside'
12661292
| '/_layout/_layout-2/layout-a'
@@ -1343,6 +1369,7 @@ export interface RootRouteChildren {
13431369
PostsRoute: typeof PostsRouteWithChildren
13441370
RemountDepsRoute: typeof RemountDepsRoute
13451371
ParamsPsNonNestedRouteRoute: typeof ParamsPsNonNestedRouteRouteWithChildren
1372+
ParamsPsStrictFalseRouteRoute: typeof ParamsPsStrictFalseRouteRouteWithChildren
13461373
RelativeLinkRouteRoute: typeof RelativeLinkRouteRouteWithChildren
13471374
RelativeUseNavigateRouteRoute: typeof RelativeUseNavigateRouteRouteWithChildren
13481375
anotherGroupOnlyrouteinsideRoute: typeof anotherGroupOnlyrouteinsideRoute
@@ -1598,6 +1625,13 @@ declare module '@tanstack/react-router' {
15981625
preLoaderRoute: typeof PathlessLayoutLayoutRouteRouteImport
15991626
parentRoute: typeof PathlessLayoutRouteRoute
16001627
}
1628+
'/params-ps/strict-false': {
1629+
id: '/params-ps/strict-false'
1630+
path: '/params-ps/strict-false'
1631+
fullPath: '/params-ps/strict-false'
1632+
preLoaderRoute: typeof ParamsPsStrictFalseRouteRouteImport
1633+
parentRoute: typeof rootRouteImport
1634+
}
16011635
'/params-ps/non-nested': {
16021636
id: '/params-ps/non-nested'
16031637
path: '/params-ps/non-nested'
@@ -1857,6 +1891,13 @@ declare module '@tanstack/react-router' {
18571891
preLoaderRoute: typeof groupLayoutInsidelayoutRouteImport
18581892
parentRoute: typeof groupLayoutRoute
18591893
}
1894+
'/params-ps/strict-false/$version': {
1895+
id: '/params-ps/strict-false/$version'
1896+
path: '/$version'
1897+
fullPath: '/params-ps/strict-false/$version'
1898+
preLoaderRoute: typeof ParamsPsStrictFalseVersionRouteRouteImport
1899+
parentRoute: typeof ParamsPsStrictFalseRouteRoute
1900+
}
18601901
'/params-ps/non-nested/$foo_': {
18611902
id: '/params-ps/non-nested/$foo_'
18621903
path: '/$foo'
@@ -2472,6 +2513,20 @@ const ParamsPsNonNestedRouteRouteWithChildren =
24722513
ParamsPsNonNestedRouteRouteChildren,
24732514
)
24742515

2516+
interface ParamsPsStrictFalseRouteRouteChildren {
2517+
ParamsPsStrictFalseVersionRouteRoute: typeof ParamsPsStrictFalseVersionRouteRoute
2518+
}
2519+
2520+
const ParamsPsStrictFalseRouteRouteChildren: ParamsPsStrictFalseRouteRouteChildren =
2521+
{
2522+
ParamsPsStrictFalseVersionRouteRoute: ParamsPsStrictFalseVersionRouteRoute,
2523+
}
2524+
2525+
const ParamsPsStrictFalseRouteRouteWithChildren =
2526+
ParamsPsStrictFalseRouteRoute._addFileChildren(
2527+
ParamsPsStrictFalseRouteRouteChildren,
2528+
)
2529+
24752530
interface RelativeLinkRouteRouteChildren {
24762531
RelativeLinkRelativeLinkARoute: typeof RelativeLinkRelativeLinkARoute
24772532
RelativeLinkRelativeLinkBRoute: typeof RelativeLinkRelativeLinkBRoute
@@ -2599,6 +2654,7 @@ const rootRouteChildren: RootRouteChildren = {
25992654
PostsRoute: PostsRouteWithChildren,
26002655
RemountDepsRoute: RemountDepsRoute,
26012656
ParamsPsNonNestedRouteRoute: ParamsPsNonNestedRouteRouteWithChildren,
2657+
ParamsPsStrictFalseRouteRoute: ParamsPsStrictFalseRouteRouteWithChildren,
26022658
RelativeLinkRouteRoute: RelativeLinkRouteRouteWithChildren,
26032659
RelativeUseNavigateRouteRoute: RelativeUseNavigateRouteRouteWithChildren,
26042660
anotherGroupOnlyrouteinsideRoute: anotherGroupOnlyrouteinsideRoute,

e2e/react-router/basic-file-based/src/routes/params-ps/index.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,28 @@ function RouteComponent() {
122122
</Link>
123123
</li>
124124
</ul>
125+
<hr />
126+
<h3 className="pb-2">Parsed params with strict false</h3>
127+
<ul className="grid mb-2">
128+
<li>
129+
<Link
130+
data-testid="strict-false-version-1"
131+
to="/params-ps/strict-false/$version"
132+
params={{ version: 1 }}
133+
>
134+
/params-ps/strict-false/$version (1)
135+
</Link>
136+
</li>
137+
<li>
138+
<Link
139+
data-testid="strict-false-version-2"
140+
to="/params-ps/strict-false/$version"
141+
params={{ version: 2 }}
142+
>
143+
/params-ps/strict-false/$version (2)
144+
</Link>
145+
</li>
146+
</ul>
125147
</div>
126148
)
127149
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { createFileRoute, useParams } from '@tanstack/react-router'
2+
3+
export const Route = createFileRoute('/params-ps/strict-false/$version')({
4+
params: {
5+
parse: (params) => ({
6+
...params,
7+
version: parseInt(params.version),
8+
}),
9+
stringify: (params) => ({
10+
...params,
11+
version: `${params.version}`,
12+
}),
13+
},
14+
component: RouteComponent,
15+
})
16+
17+
function RouteComponent() {
18+
const { version } = useParams({ strict: false })
19+
20+
return <div data-testid="strict-false-child-version">{String(version)}</div>
21+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import {
2+
Link,
3+
Outlet,
4+
createFileRoute,
5+
useParams,
6+
} from '@tanstack/react-router'
7+
8+
export const Route = createFileRoute('/params-ps/strict-false')({
9+
component: RouteComponent,
10+
})
11+
12+
function RouteComponent() {
13+
const { version } = useParams({ strict: false })
14+
return (
15+
<div>
16+
<h3>ParamsStrictFalseParse</h3>
17+
<div>
18+
Type:{' '}
19+
<span data-testid="strict-false-version-type">{typeof version}</span>
20+
</div>
21+
<div>
22+
Value:{' '}
23+
<span data-testid="strict-false-version-value">{String(version)}</span>
24+
</div>
25+
<Link
26+
data-testid="strict-false-version-1"
27+
from={Route.fullPath}
28+
to="./$version"
29+
params={{ version: 1 }}
30+
>
31+
Version 1
32+
</Link>
33+
<Link
34+
data-testid="strict-false-version-2"
35+
from={Route.fullPath}
36+
to="./$version"
37+
params={{ version: 2 }}
38+
>
39+
Version 2
40+
</Link>
41+
<Outlet />
42+
</div>
43+
)
44+
}

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,3 +492,29 @@ test.describe('Unicode params', () => {
492492
})
493493
})
494494
})
495+
496+
test.describe('useParams strict false uses parsed child params', () => {
497+
test.beforeEach(async ({ page }) => {
498+
await page.goto('/params-ps')
499+
})
500+
501+
test('parent receives parsed values after child navigation', async ({
502+
page,
503+
}) => {
504+
await page.getByTestId('strict-false-version-1').click()
505+
await page.waitForURL('/params-ps/strict-false/1')
506+
507+
await expect(page.getByTestId('strict-false-version-type')).toHaveText(
508+
'number',
509+
)
510+
await expect(page.getByTestId('strict-false-version-value')).toHaveText('1')
511+
512+
await page.getByTestId('strict-false-version-2').click()
513+
await page.waitForURL('/params-ps/strict-false/2')
514+
515+
await expect(page.getByTestId('strict-false-version-type')).toHaveText(
516+
'number',
517+
)
518+
await expect(page.getByTestId('strict-false-version-value')).toHaveText('2')
519+
})
520+
})

0 commit comments

Comments
 (0)