diff --git a/e2e/react-router/basic-file-based/src/routeTree.gen.ts b/e2e/react-router/basic-file-based/src/routeTree.gen.ts
index a84b234638b..efa8b81d76c 100644
--- a/e2e/react-router/basic-file-based/src/routeTree.gen.ts
+++ b/e2e/react-router/basic-file-based/src/routeTree.gen.ts
@@ -42,6 +42,7 @@ import { Route as NonNestedSuffixRouteRouteImport } from './routes/non-nested/su
import { Route as NonNestedPrefixRouteRouteImport } from './routes/non-nested/prefix/route'
import { Route as NonNestedPathRouteRouteImport } from './routes/non-nested/path/route'
import { Route as NonNestedNamedRouteRouteImport } from './routes/non-nested/named/route'
+import { Route as NonNestedDeepRouteRouteImport } from './routes/non-nested/deep/route'
import { Route as RedirectTargetIndexRouteImport } from './routes/redirect/$target/index'
import { Route as ParamsPsWildcardIndexRouteImport } from './routes/params-ps/wildcard/index'
import { Route as ParamsPsNamedIndexRouteImport } from './routes/params-ps/named/index'
@@ -75,6 +76,7 @@ import { Route as NonNestedSuffixChar123bazChar125suffixRouteRouteImport } from
import { Route as NonNestedPrefixPrefixChar123bazChar125RouteRouteImport } from './routes/non-nested/prefix/prefix{$baz}.route'
import { Route as NonNestedPathBazRouteRouteImport } from './routes/non-nested/path/baz.route'
import { Route as NonNestedNamedBazRouteRouteImport } from './routes/non-nested/named/$baz.route'
+import { Route as NonNestedDeepBazRouteRouteImport } from './routes/non-nested/deep/$baz.route'
import { Route as RelativeUseNavigateWithSearchIndexRouteImport } from './routes/relative/useNavigate/with-search/index'
import { Route as RelativeUseNavigatePathIndexRouteImport } from './routes/relative/useNavigate/path/index'
import { Route as RelativeUseNavigateNestedIndexRouteImport } from './routes/relative/useNavigate/nested/index'
@@ -85,6 +87,7 @@ import { Route as NonNestedSuffixChar123bazChar125suffixIndexRouteImport } from
import { Route as NonNestedPrefixPrefixChar123bazChar125IndexRouteImport } from './routes/non-nested/prefix/prefix{$baz}.index'
import { Route as NonNestedPathBazIndexRouteImport } from './routes/non-nested/path/baz.index'
import { Route as NonNestedNamedBazIndexRouteImport } from './routes/non-nested/named/$baz.index'
+import { Route as NonNestedDeepBazIndexRouteImport } from './routes/non-nested/deep/$baz.index'
import { Route as ParamsPsNonNestedFooBarRouteImport } from './routes/params-ps/non-nested/$foo_/$bar'
import { Route as NonNestedSuffixChar123bazChar125suffixBarRouteImport } from './routes/non-nested/suffix/{$baz}suffix_.bar'
import { Route as NonNestedSuffixChar123bazChar125suffixFooRouteImport } from './routes/non-nested/suffix/{$baz}suffix.foo'
@@ -95,11 +98,17 @@ import { Route as NonNestedPathBazFooRouteImport } from './routes/non-nested/pat
import { Route as NonNestedNamedBazBarRouteImport } from './routes/non-nested/named/$baz_.bar'
import { Route as NonNestedNamedBazFooRouteImport } from './routes/non-nested/named/$baz.foo'
import { Route as ParamsPsNamedFooBarRouteRouteImport } from './routes/params-ps/named/$foo/$bar.route'
+import { Route as NonNestedDeepBazBarRouteRouteImport } from './routes/non-nested/deep/$baz_.bar.route'
import { Route as RelativeUseNavigatePathPathIndexRouteImport } from './routes/relative/useNavigate/path/$path/index'
import { Route as RelativeUseNavigateNestedDeepIndexRouteImport } from './routes/relative/useNavigate/nested/deep/index'
import { Route as RelativeLinkPathPathIndexRouteImport } from './routes/relative/link/path/$path/index'
import { Route as RelativeLinkNestedDeepIndexRouteImport } from './routes/relative/link/nested/deep/index'
+import { Route as NonNestedDeepBazBarIndexRouteImport } from './routes/non-nested/deep/$baz_.bar.index'
import { Route as ParamsPsNamedFooBarBazRouteImport } from './routes/params-ps/named/$foo/$bar.$baz'
+import { Route as NonNestedDeepBazBarQuxRouteImport } from './routes/non-nested/deep/$baz_.bar_.qux'
+import { Route as NonNestedDeepBazBarFooRouteRouteImport } from './routes/non-nested/deep/$baz_.bar.$foo.route'
+import { Route as NonNestedDeepBazBarFooIndexRouteImport } from './routes/non-nested/deep/$baz_.bar.$foo.index'
+import { Route as NonNestedDeepBazBarFooQuxRouteImport } from './routes/non-nested/deep/$baz_.bar.$foo_.qux'
const RemountDepsRoute = RemountDepsRouteImport.update({
id: '/remountDeps',
@@ -269,6 +278,11 @@ const NonNestedNamedRouteRoute = NonNestedNamedRouteRouteImport.update({
path: '/named',
getParentRoute: () => NonNestedRouteRoute,
} as any)
+const NonNestedDeepRouteRoute = NonNestedDeepRouteRouteImport.update({
+ id: '/deep',
+ path: '/deep',
+ getParentRoute: () => NonNestedRouteRoute,
+} as any)
const RedirectTargetIndexRoute = RedirectTargetIndexRouteImport.update({
id: '/',
path: '/',
@@ -450,6 +464,11 @@ const NonNestedNamedBazRouteRoute = NonNestedNamedBazRouteRouteImport.update({
path: '/$baz',
getParentRoute: () => NonNestedNamedRouteRoute,
} as any)
+const NonNestedDeepBazRouteRoute = NonNestedDeepBazRouteRouteImport.update({
+ id: '/$baz',
+ path: '/$baz',
+ getParentRoute: () => NonNestedDeepRouteRoute,
+} as any)
const RelativeUseNavigateWithSearchIndexRoute =
RelativeUseNavigateWithSearchIndexRouteImport.update({
id: '/with-search/',
@@ -506,6 +525,11 @@ const NonNestedNamedBazIndexRoute = NonNestedNamedBazIndexRouteImport.update({
path: '/',
getParentRoute: () => NonNestedNamedBazRouteRoute,
} as any)
+const NonNestedDeepBazIndexRoute = NonNestedDeepBazIndexRouteImport.update({
+ id: '/',
+ path: '/',
+ getParentRoute: () => NonNestedDeepBazRouteRoute,
+} as any)
const ParamsPsNonNestedFooBarRoute = ParamsPsNonNestedFooBarRouteImport.update({
id: '/$bar',
path: '/$bar',
@@ -561,6 +585,12 @@ const ParamsPsNamedFooBarRouteRoute =
path: '/$bar',
getParentRoute: () => ParamsPsNamedFooRouteRoute,
} as any)
+const NonNestedDeepBazBarRouteRoute =
+ NonNestedDeepBazBarRouteRouteImport.update({
+ id: '/$baz_/bar',
+ path: '/$baz/bar',
+ getParentRoute: () => NonNestedDeepRouteRoute,
+ } as any)
const RelativeUseNavigatePathPathIndexRoute =
RelativeUseNavigatePathPathIndexRouteImport.update({
id: '/path/$path/',
@@ -585,11 +615,40 @@ const RelativeLinkNestedDeepIndexRoute =
path: '/nested/deep/',
getParentRoute: () => RelativeLinkRouteRoute,
} as any)
+const NonNestedDeepBazBarIndexRoute =
+ NonNestedDeepBazBarIndexRouteImport.update({
+ id: '/',
+ path: '/',
+ getParentRoute: () => NonNestedDeepBazBarRouteRoute,
+ } as any)
const ParamsPsNamedFooBarBazRoute = ParamsPsNamedFooBarBazRouteImport.update({
id: '/$baz',
path: '/$baz',
getParentRoute: () => ParamsPsNamedFooBarRouteRoute,
} as any)
+const NonNestedDeepBazBarQuxRoute = NonNestedDeepBazBarQuxRouteImport.update({
+ id: '/$baz_/bar_/qux',
+ path: '/$baz/bar/qux',
+ getParentRoute: () => NonNestedDeepRouteRoute,
+} as any)
+const NonNestedDeepBazBarFooRouteRoute =
+ NonNestedDeepBazBarFooRouteRouteImport.update({
+ id: '/$foo',
+ path: '/$foo',
+ getParentRoute: () => NonNestedDeepBazBarRouteRoute,
+ } as any)
+const NonNestedDeepBazBarFooIndexRoute =
+ NonNestedDeepBazBarFooIndexRouteImport.update({
+ id: '/',
+ path: '/',
+ getParentRoute: () => NonNestedDeepBazBarFooRouteRoute,
+ } as any)
+const NonNestedDeepBazBarFooQuxRoute =
+ NonNestedDeepBazBarFooQuxRouteImport.update({
+ id: '/$foo_/qux',
+ path: '/$foo/qux',
+ getParentRoute: () => NonNestedDeepBazBarRouteRoute,
+ } as any)
export interface FileRoutesByFullPath {
'/': typeof IndexRoute
@@ -603,6 +662,7 @@ export interface FileRoutesByFullPath {
'/notRemountDeps': typeof NotRemountDepsRoute
'/posts': typeof PostsRouteWithChildren
'/remountDeps': typeof RemountDepsRoute
+ '/non-nested/deep': typeof NonNestedDeepRouteRouteWithChildren
'/non-nested/named': typeof NonNestedNamedRouteRouteWithChildren
'/non-nested/path': typeof NonNestedPathRouteRouteWithChildren
'/non-nested/prefix': typeof NonNestedPrefixRouteRouteWithChildren
@@ -622,6 +682,7 @@ export interface FileRoutesByFullPath {
'/redirect': typeof RedirectIndexRoute
'/relative': typeof RelativeIndexRoute
'/search-params/': typeof SearchParamsIndexRoute
+ '/non-nested/deep/$baz': typeof NonNestedDeepBazRouteRouteWithChildren
'/non-nested/named/$baz': typeof NonNestedNamedBazRouteRouteWithChildren
'/non-nested/path/baz': typeof NonNestedPathBazRouteRouteWithChildren
'/non-nested/prefix/prefix{$baz}': typeof NonNestedPrefixPrefixChar123bazChar125RouteRouteWithChildren
@@ -655,6 +716,7 @@ export interface FileRoutesByFullPath {
'/params-ps/named': typeof ParamsPsNamedIndexRoute
'/params-ps/wildcard': typeof ParamsPsWildcardIndexRoute
'/redirect/$target/': typeof RedirectTargetIndexRoute
+ '/non-nested/deep/$baz/bar': typeof NonNestedDeepBazBarRouteRouteWithChildren
'/params-ps/named/$foo/$bar': typeof ParamsPsNamedFooBarRouteRouteWithChildren
'/non-nested/named/$baz/foo': typeof NonNestedNamedBazFooRoute
'/non-nested/named/$baz/bar': typeof NonNestedNamedBazBarRoute
@@ -665,6 +727,7 @@ export interface FileRoutesByFullPath {
'/non-nested/suffix/{$baz}suffix/foo': typeof NonNestedSuffixChar123bazChar125suffixFooRoute
'/non-nested/suffix/{$baz}suffix/bar': typeof NonNestedSuffixChar123bazChar125suffixBarRoute
'/params-ps/non-nested/$foo/$bar': typeof ParamsPsNonNestedFooBarRoute
+ '/non-nested/deep/$baz/': typeof NonNestedDeepBazIndexRoute
'/non-nested/named/$baz/': typeof NonNestedNamedBazIndexRoute
'/non-nested/path/baz/': typeof NonNestedPathBazIndexRoute
'/non-nested/prefix/prefix{$baz}/': typeof NonNestedPrefixPrefixChar123bazChar125IndexRoute
@@ -675,11 +738,16 @@ export interface FileRoutesByFullPath {
'/relative/useNavigate/nested': typeof RelativeUseNavigateNestedIndexRoute
'/relative/useNavigate/path': typeof RelativeUseNavigatePathIndexRoute
'/relative/useNavigate/with-search': typeof RelativeUseNavigateWithSearchIndexRoute
+ '/non-nested/deep/$baz/bar/$foo': typeof NonNestedDeepBazBarFooRouteRouteWithChildren
+ '/non-nested/deep/$baz/bar/qux': typeof NonNestedDeepBazBarQuxRoute
'/params-ps/named/$foo/$bar/$baz': typeof ParamsPsNamedFooBarBazRoute
+ '/non-nested/deep/$baz/bar/': typeof NonNestedDeepBazBarIndexRoute
'/relative/link/nested/deep': typeof RelativeLinkNestedDeepIndexRoute
'/relative/link/path/$path': typeof RelativeLinkPathPathIndexRoute
'/relative/useNavigate/nested/deep': typeof RelativeUseNavigateNestedDeepIndexRoute
'/relative/useNavigate/path/$path': typeof RelativeUseNavigatePathPathIndexRoute
+ '/non-nested/deep/$baz/bar/$foo/qux': typeof NonNestedDeepBazBarFooQuxRoute
+ '/non-nested/deep/$baz/bar/$foo/': typeof NonNestedDeepBazBarFooIndexRoute
}
export interface FileRoutesByTo {
'/': typeof IndexRoute
@@ -691,6 +759,7 @@ export interface FileRoutesByTo {
'/editing-b': typeof EditingBRoute
'/notRemountDeps': typeof NotRemountDepsRoute
'/remountDeps': typeof RemountDepsRoute
+ '/non-nested/deep': typeof NonNestedDeepRouteRouteWithChildren
'/non-nested/named': typeof NonNestedNamedRouteRouteWithChildren
'/non-nested/path': typeof NonNestedPathRouteRouteWithChildren
'/non-nested/prefix': typeof NonNestedPrefixRouteRouteWithChildren
@@ -748,6 +817,7 @@ export interface FileRoutesByTo {
'/non-nested/suffix/{$baz}suffix/foo': typeof NonNestedSuffixChar123bazChar125suffixFooRoute
'/non-nested/suffix/{$baz}suffix/bar': typeof NonNestedSuffixChar123bazChar125suffixBarRoute
'/params-ps/non-nested/$foo/$bar': typeof ParamsPsNonNestedFooBarRoute
+ '/non-nested/deep/$baz': typeof NonNestedDeepBazIndexRoute
'/non-nested/named/$baz': typeof NonNestedNamedBazIndexRoute
'/non-nested/path/baz': typeof NonNestedPathBazIndexRoute
'/non-nested/prefix/prefix{$baz}': typeof NonNestedPrefixPrefixChar123bazChar125IndexRoute
@@ -758,11 +828,15 @@ export interface FileRoutesByTo {
'/relative/useNavigate/nested': typeof RelativeUseNavigateNestedIndexRoute
'/relative/useNavigate/path': typeof RelativeUseNavigatePathIndexRoute
'/relative/useNavigate/with-search': typeof RelativeUseNavigateWithSearchIndexRoute
+ '/non-nested/deep/$baz/bar/qux': typeof NonNestedDeepBazBarQuxRoute
'/params-ps/named/$foo/$bar/$baz': typeof ParamsPsNamedFooBarBazRoute
+ '/non-nested/deep/$baz/bar': typeof NonNestedDeepBazBarIndexRoute
'/relative/link/nested/deep': typeof RelativeLinkNestedDeepIndexRoute
'/relative/link/path/$path': typeof RelativeLinkPathPathIndexRoute
'/relative/useNavigate/nested/deep': typeof RelativeUseNavigateNestedDeepIndexRoute
'/relative/useNavigate/path/$path': typeof RelativeUseNavigatePathPathIndexRoute
+ '/non-nested/deep/$baz/bar/$foo/qux': typeof NonNestedDeepBazBarFooQuxRoute
+ '/non-nested/deep/$baz/bar/$foo': typeof NonNestedDeepBazBarFooIndexRoute
}
export interface FileRoutesById {
__root__: typeof rootRouteImport
@@ -778,6 +852,7 @@ export interface FileRoutesById {
'/notRemountDeps': typeof NotRemountDepsRoute
'/posts': typeof PostsRouteWithChildren
'/remountDeps': typeof RemountDepsRoute
+ '/non-nested/deep': typeof NonNestedDeepRouteRouteWithChildren
'/non-nested/named': typeof NonNestedNamedRouteRouteWithChildren
'/non-nested/path': typeof NonNestedPathRouteRouteWithChildren
'/non-nested/prefix': typeof NonNestedPrefixRouteRouteWithChildren
@@ -799,6 +874,7 @@ export interface FileRoutesById {
'/redirect/': typeof RedirectIndexRoute
'/relative/': typeof RelativeIndexRoute
'/search-params/': typeof SearchParamsIndexRoute
+ '/non-nested/deep/$baz': typeof NonNestedDeepBazRouteRouteWithChildren
'/non-nested/named/$baz': typeof NonNestedNamedBazRouteRouteWithChildren
'/non-nested/path/baz': typeof NonNestedPathBazRouteRouteWithChildren
'/non-nested/prefix/prefix{$baz}': typeof NonNestedPrefixPrefixChar123bazChar125RouteRouteWithChildren
@@ -832,6 +908,7 @@ export interface FileRoutesById {
'/params-ps/named/': typeof ParamsPsNamedIndexRoute
'/params-ps/wildcard/': typeof ParamsPsWildcardIndexRoute
'/redirect/$target/': typeof RedirectTargetIndexRoute
+ '/non-nested/deep/$baz_/bar': typeof NonNestedDeepBazBarRouteRouteWithChildren
'/params-ps/named/$foo/$bar': typeof ParamsPsNamedFooBarRouteRouteWithChildren
'/non-nested/named/$baz/foo': typeof NonNestedNamedBazFooRoute
'/non-nested/named/$baz_/bar': typeof NonNestedNamedBazBarRoute
@@ -842,6 +919,7 @@ export interface FileRoutesById {
'/non-nested/suffix/{$baz}suffix/foo': typeof NonNestedSuffixChar123bazChar125suffixFooRoute
'/non-nested/suffix/{$baz}suffix_/bar': typeof NonNestedSuffixChar123bazChar125suffixBarRoute
'/params-ps/non-nested/$foo_/$bar': typeof ParamsPsNonNestedFooBarRoute
+ '/non-nested/deep/$baz/': typeof NonNestedDeepBazIndexRoute
'/non-nested/named/$baz/': typeof NonNestedNamedBazIndexRoute
'/non-nested/path/baz/': typeof NonNestedPathBazIndexRoute
'/non-nested/prefix/prefix{$baz}/': typeof NonNestedPrefixPrefixChar123bazChar125IndexRoute
@@ -852,11 +930,16 @@ export interface FileRoutesById {
'/relative/useNavigate/nested/': typeof RelativeUseNavigateNestedIndexRoute
'/relative/useNavigate/path/': typeof RelativeUseNavigatePathIndexRoute
'/relative/useNavigate/with-search/': typeof RelativeUseNavigateWithSearchIndexRoute
+ '/non-nested/deep/$baz_/bar/$foo': typeof NonNestedDeepBazBarFooRouteRouteWithChildren
+ '/non-nested/deep/$baz_/bar_/qux': typeof NonNestedDeepBazBarQuxRoute
'/params-ps/named/$foo/$bar/$baz': typeof ParamsPsNamedFooBarBazRoute
+ '/non-nested/deep/$baz_/bar/': typeof NonNestedDeepBazBarIndexRoute
'/relative/link/nested/deep/': typeof RelativeLinkNestedDeepIndexRoute
'/relative/link/path/$path/': typeof RelativeLinkPathPathIndexRoute
'/relative/useNavigate/nested/deep/': typeof RelativeUseNavigateNestedDeepIndexRoute
'/relative/useNavigate/path/$path/': typeof RelativeUseNavigatePathPathIndexRoute
+ '/non-nested/deep/$baz_/bar/$foo_/qux': typeof NonNestedDeepBazBarFooQuxRoute
+ '/non-nested/deep/$baz_/bar/$foo/': typeof NonNestedDeepBazBarFooIndexRoute
}
export interface FileRouteTypes {
fileRoutesByFullPath: FileRoutesByFullPath
@@ -872,6 +955,7 @@ export interface FileRouteTypes {
| '/notRemountDeps'
| '/posts'
| '/remountDeps'
+ | '/non-nested/deep'
| '/non-nested/named'
| '/non-nested/path'
| '/non-nested/prefix'
@@ -891,6 +975,7 @@ export interface FileRouteTypes {
| '/redirect'
| '/relative'
| '/search-params/'
+ | '/non-nested/deep/$baz'
| '/non-nested/named/$baz'
| '/non-nested/path/baz'
| '/non-nested/prefix/prefix{$baz}'
@@ -924,6 +1009,7 @@ export interface FileRouteTypes {
| '/params-ps/named'
| '/params-ps/wildcard'
| '/redirect/$target/'
+ | '/non-nested/deep/$baz/bar'
| '/params-ps/named/$foo/$bar'
| '/non-nested/named/$baz/foo'
| '/non-nested/named/$baz/bar'
@@ -934,6 +1020,7 @@ export interface FileRouteTypes {
| '/non-nested/suffix/{$baz}suffix/foo'
| '/non-nested/suffix/{$baz}suffix/bar'
| '/params-ps/non-nested/$foo/$bar'
+ | '/non-nested/deep/$baz/'
| '/non-nested/named/$baz/'
| '/non-nested/path/baz/'
| '/non-nested/prefix/prefix{$baz}/'
@@ -944,11 +1031,16 @@ export interface FileRouteTypes {
| '/relative/useNavigate/nested'
| '/relative/useNavigate/path'
| '/relative/useNavigate/with-search'
+ | '/non-nested/deep/$baz/bar/$foo'
+ | '/non-nested/deep/$baz/bar/qux'
| '/params-ps/named/$foo/$bar/$baz'
+ | '/non-nested/deep/$baz/bar/'
| '/relative/link/nested/deep'
| '/relative/link/path/$path'
| '/relative/useNavigate/nested/deep'
| '/relative/useNavigate/path/$path'
+ | '/non-nested/deep/$baz/bar/$foo/qux'
+ | '/non-nested/deep/$baz/bar/$foo/'
fileRoutesByTo: FileRoutesByTo
to:
| '/'
@@ -960,6 +1052,7 @@ export interface FileRouteTypes {
| '/editing-b'
| '/notRemountDeps'
| '/remountDeps'
+ | '/non-nested/deep'
| '/non-nested/named'
| '/non-nested/path'
| '/non-nested/prefix'
@@ -1017,6 +1110,7 @@ export interface FileRouteTypes {
| '/non-nested/suffix/{$baz}suffix/foo'
| '/non-nested/suffix/{$baz}suffix/bar'
| '/params-ps/non-nested/$foo/$bar'
+ | '/non-nested/deep/$baz'
| '/non-nested/named/$baz'
| '/non-nested/path/baz'
| '/non-nested/prefix/prefix{$baz}'
@@ -1027,11 +1121,15 @@ export interface FileRouteTypes {
| '/relative/useNavigate/nested'
| '/relative/useNavigate/path'
| '/relative/useNavigate/with-search'
+ | '/non-nested/deep/$baz/bar/qux'
| '/params-ps/named/$foo/$bar/$baz'
+ | '/non-nested/deep/$baz/bar'
| '/relative/link/nested/deep'
| '/relative/link/path/$path'
| '/relative/useNavigate/nested/deep'
| '/relative/useNavigate/path/$path'
+ | '/non-nested/deep/$baz/bar/$foo/qux'
+ | '/non-nested/deep/$baz/bar/$foo'
id:
| '__root__'
| '/'
@@ -1046,6 +1144,7 @@ export interface FileRouteTypes {
| '/notRemountDeps'
| '/posts'
| '/remountDeps'
+ | '/non-nested/deep'
| '/non-nested/named'
| '/non-nested/path'
| '/non-nested/prefix'
@@ -1067,6 +1166,7 @@ export interface FileRouteTypes {
| '/redirect/'
| '/relative/'
| '/search-params/'
+ | '/non-nested/deep/$baz'
| '/non-nested/named/$baz'
| '/non-nested/path/baz'
| '/non-nested/prefix/prefix{$baz}'
@@ -1100,6 +1200,7 @@ export interface FileRouteTypes {
| '/params-ps/named/'
| '/params-ps/wildcard/'
| '/redirect/$target/'
+ | '/non-nested/deep/$baz_/bar'
| '/params-ps/named/$foo/$bar'
| '/non-nested/named/$baz/foo'
| '/non-nested/named/$baz_/bar'
@@ -1110,6 +1211,7 @@ export interface FileRouteTypes {
| '/non-nested/suffix/{$baz}suffix/foo'
| '/non-nested/suffix/{$baz}suffix_/bar'
| '/params-ps/non-nested/$foo_/$bar'
+ | '/non-nested/deep/$baz/'
| '/non-nested/named/$baz/'
| '/non-nested/path/baz/'
| '/non-nested/prefix/prefix{$baz}/'
@@ -1120,11 +1222,16 @@ export interface FileRouteTypes {
| '/relative/useNavigate/nested/'
| '/relative/useNavigate/path/'
| '/relative/useNavigate/with-search/'
+ | '/non-nested/deep/$baz_/bar/$foo'
+ | '/non-nested/deep/$baz_/bar_/qux'
| '/params-ps/named/$foo/$bar/$baz'
+ | '/non-nested/deep/$baz_/bar/'
| '/relative/link/nested/deep/'
| '/relative/link/path/$path/'
| '/relative/useNavigate/nested/deep/'
| '/relative/useNavigate/path/$path/'
+ | '/non-nested/deep/$baz_/bar/$foo_/qux'
+ | '/non-nested/deep/$baz_/bar/$foo/'
fileRoutesById: FileRoutesById
}
export interface RootRouteChildren {
@@ -1403,6 +1510,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof NonNestedNamedRouteRouteImport
parentRoute: typeof NonNestedRouteRoute
}
+ '/non-nested/deep': {
+ id: '/non-nested/deep'
+ path: '/deep'
+ fullPath: '/non-nested/deep'
+ preLoaderRoute: typeof NonNestedDeepRouteRouteImport
+ parentRoute: typeof NonNestedRouteRoute
+ }
'/redirect/$target/': {
id: '/redirect/$target/'
path: '/'
@@ -1634,6 +1748,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof NonNestedNamedBazRouteRouteImport
parentRoute: typeof NonNestedNamedRouteRoute
}
+ '/non-nested/deep/$baz': {
+ id: '/non-nested/deep/$baz'
+ path: '/$baz'
+ fullPath: '/non-nested/deep/$baz'
+ preLoaderRoute: typeof NonNestedDeepBazRouteRouteImport
+ parentRoute: typeof NonNestedDeepRouteRoute
+ }
'/relative/useNavigate/with-search/': {
id: '/relative/useNavigate/with-search/'
path: '/with-search'
@@ -1704,6 +1825,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof NonNestedNamedBazIndexRouteImport
parentRoute: typeof NonNestedNamedBazRouteRoute
}
+ '/non-nested/deep/$baz/': {
+ id: '/non-nested/deep/$baz/'
+ path: '/'
+ fullPath: '/non-nested/deep/$baz/'
+ preLoaderRoute: typeof NonNestedDeepBazIndexRouteImport
+ parentRoute: typeof NonNestedDeepBazRouteRoute
+ }
'/params-ps/non-nested/$foo_/$bar': {
id: '/params-ps/non-nested/$foo_/$bar'
path: '/$bar'
@@ -1774,6 +1902,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof ParamsPsNamedFooBarRouteRouteImport
parentRoute: typeof ParamsPsNamedFooRouteRoute
}
+ '/non-nested/deep/$baz_/bar': {
+ id: '/non-nested/deep/$baz_/bar'
+ path: '/$baz/bar'
+ fullPath: '/non-nested/deep/$baz/bar'
+ preLoaderRoute: typeof NonNestedDeepBazBarRouteRouteImport
+ parentRoute: typeof NonNestedDeepRouteRoute
+ }
'/relative/useNavigate/path/$path/': {
id: '/relative/useNavigate/path/$path/'
path: '/path/$path'
@@ -1802,6 +1937,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof RelativeLinkNestedDeepIndexRouteImport
parentRoute: typeof RelativeLinkRouteRoute
}
+ '/non-nested/deep/$baz_/bar/': {
+ id: '/non-nested/deep/$baz_/bar/'
+ path: '/'
+ fullPath: '/non-nested/deep/$baz/bar/'
+ preLoaderRoute: typeof NonNestedDeepBazBarIndexRouteImport
+ parentRoute: typeof NonNestedDeepBazBarRouteRoute
+ }
'/params-ps/named/$foo/$bar/$baz': {
id: '/params-ps/named/$foo/$bar/$baz'
path: '/$baz'
@@ -1809,9 +1951,98 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof ParamsPsNamedFooBarBazRouteImport
parentRoute: typeof ParamsPsNamedFooBarRouteRoute
}
+ '/non-nested/deep/$baz_/bar_/qux': {
+ id: '/non-nested/deep/$baz_/bar_/qux'
+ path: '/$baz/bar/qux'
+ fullPath: '/non-nested/deep/$baz/bar/qux'
+ preLoaderRoute: typeof NonNestedDeepBazBarQuxRouteImport
+ parentRoute: typeof NonNestedDeepRouteRoute
+ }
+ '/non-nested/deep/$baz_/bar/$foo': {
+ id: '/non-nested/deep/$baz_/bar/$foo'
+ path: '/$foo'
+ fullPath: '/non-nested/deep/$baz/bar/$foo'
+ preLoaderRoute: typeof NonNestedDeepBazBarFooRouteRouteImport
+ parentRoute: typeof NonNestedDeepBazBarRouteRoute
+ }
+ '/non-nested/deep/$baz_/bar/$foo/': {
+ id: '/non-nested/deep/$baz_/bar/$foo/'
+ path: '/'
+ fullPath: '/non-nested/deep/$baz/bar/$foo/'
+ preLoaderRoute: typeof NonNestedDeepBazBarFooIndexRouteImport
+ parentRoute: typeof NonNestedDeepBazBarFooRouteRoute
+ }
+ '/non-nested/deep/$baz_/bar/$foo_/qux': {
+ id: '/non-nested/deep/$baz_/bar/$foo_/qux'
+ path: '/$foo/qux'
+ fullPath: '/non-nested/deep/$baz/bar/$foo/qux'
+ preLoaderRoute: typeof NonNestedDeepBazBarFooQuxRouteImport
+ parentRoute: typeof NonNestedDeepBazBarRouteRoute
+ }
+ }
+}
+
+interface NonNestedDeepBazRouteRouteChildren {
+ NonNestedDeepBazIndexRoute: typeof NonNestedDeepBazIndexRoute
+}
+
+const NonNestedDeepBazRouteRouteChildren: NonNestedDeepBazRouteRouteChildren = {
+ NonNestedDeepBazIndexRoute: NonNestedDeepBazIndexRoute,
+}
+
+const NonNestedDeepBazRouteRouteWithChildren =
+ NonNestedDeepBazRouteRoute._addFileChildren(
+ NonNestedDeepBazRouteRouteChildren,
+ )
+
+interface NonNestedDeepBazBarFooRouteRouteChildren {
+ NonNestedDeepBazBarFooIndexRoute: typeof NonNestedDeepBazBarFooIndexRoute
+}
+
+const NonNestedDeepBazBarFooRouteRouteChildren: NonNestedDeepBazBarFooRouteRouteChildren =
+ {
+ NonNestedDeepBazBarFooIndexRoute: NonNestedDeepBazBarFooIndexRoute,
}
+
+const NonNestedDeepBazBarFooRouteRouteWithChildren =
+ NonNestedDeepBazBarFooRouteRoute._addFileChildren(
+ NonNestedDeepBazBarFooRouteRouteChildren,
+ )
+
+interface NonNestedDeepBazBarRouteRouteChildren {
+ NonNestedDeepBazBarFooRouteRoute: typeof NonNestedDeepBazBarFooRouteRouteWithChildren
+ NonNestedDeepBazBarIndexRoute: typeof NonNestedDeepBazBarIndexRoute
+ NonNestedDeepBazBarFooQuxRoute: typeof NonNestedDeepBazBarFooQuxRoute
}
+const NonNestedDeepBazBarRouteRouteChildren: NonNestedDeepBazBarRouteRouteChildren =
+ {
+ NonNestedDeepBazBarFooRouteRoute:
+ NonNestedDeepBazBarFooRouteRouteWithChildren,
+ NonNestedDeepBazBarIndexRoute: NonNestedDeepBazBarIndexRoute,
+ NonNestedDeepBazBarFooQuxRoute: NonNestedDeepBazBarFooQuxRoute,
+ }
+
+const NonNestedDeepBazBarRouteRouteWithChildren =
+ NonNestedDeepBazBarRouteRoute._addFileChildren(
+ NonNestedDeepBazBarRouteRouteChildren,
+ )
+
+interface NonNestedDeepRouteRouteChildren {
+ NonNestedDeepBazRouteRoute: typeof NonNestedDeepBazRouteRouteWithChildren
+ NonNestedDeepBazBarRouteRoute: typeof NonNestedDeepBazBarRouteRouteWithChildren
+ NonNestedDeepBazBarQuxRoute: typeof NonNestedDeepBazBarQuxRoute
+}
+
+const NonNestedDeepRouteRouteChildren: NonNestedDeepRouteRouteChildren = {
+ NonNestedDeepBazRouteRoute: NonNestedDeepBazRouteRouteWithChildren,
+ NonNestedDeepBazBarRouteRoute: NonNestedDeepBazBarRouteRouteWithChildren,
+ NonNestedDeepBazBarQuxRoute: NonNestedDeepBazBarQuxRoute,
+}
+
+const NonNestedDeepRouteRouteWithChildren =
+ NonNestedDeepRouteRoute._addFileChildren(NonNestedDeepRouteRouteChildren)
+
interface NonNestedNamedBazRouteRouteChildren {
NonNestedNamedBazFooRoute: typeof NonNestedNamedBazFooRoute
NonNestedNamedBazIndexRoute: typeof NonNestedNamedBazIndexRoute
@@ -1936,6 +2167,7 @@ const NonNestedSuffixRouteRouteWithChildren =
NonNestedSuffixRouteRoute._addFileChildren(NonNestedSuffixRouteRouteChildren)
interface NonNestedRouteRouteChildren {
+ NonNestedDeepRouteRoute: typeof NonNestedDeepRouteRouteWithChildren
NonNestedNamedRouteRoute: typeof NonNestedNamedRouteRouteWithChildren
NonNestedPathRouteRoute: typeof NonNestedPathRouteRouteWithChildren
NonNestedPrefixRouteRoute: typeof NonNestedPrefixRouteRouteWithChildren
@@ -1943,6 +2175,7 @@ interface NonNestedRouteRouteChildren {
}
const NonNestedRouteRouteChildren: NonNestedRouteRouteChildren = {
+ NonNestedDeepRouteRoute: NonNestedDeepRouteRouteWithChildren,
NonNestedNamedRouteRoute: NonNestedNamedRouteRouteWithChildren,
NonNestedPathRouteRoute: NonNestedPathRouteRouteWithChildren,
NonNestedPrefixRouteRoute: NonNestedPrefixRouteRouteWithChildren,
diff --git a/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz.index.tsx b/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz.index.tsx
new file mode 100644
index 00000000000..2c02a8f54a5
--- /dev/null
+++ b/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz.index.tsx
@@ -0,0 +1,19 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+export const Route = createFileRoute('/non-nested/deep/$baz/')({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ const params = Route.useParams()
+ return (
+
+
+ Hello deeply nested baz index
+
+
+ {JSON.stringify(params)}
+
+
+ )
+}
diff --git a/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz.route.tsx b/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz.route.tsx
new file mode 100644
index 00000000000..22955de3bbc
--- /dev/null
+++ b/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz.route.tsx
@@ -0,0 +1,16 @@
+import { Outlet, createFileRoute } from '@tanstack/react-router'
+
+export const Route = createFileRoute('/non-nested/deep/$baz')({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ return (
+
+
+ Hello non-nested named baz route layout
+
+
+
+ )
+}
diff --git a/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.$foo.index.tsx b/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.$foo.index.tsx
new file mode 100644
index 00000000000..cbfe5cb72f6
--- /dev/null
+++ b/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.$foo.index.tsx
@@ -0,0 +1,19 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+export const Route = createFileRoute('/non-nested/deep/$baz_/bar/$foo/')({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ const params = Route.useParams()
+ return (
+
+
+ Hello deeply nested baz/bar/foo index
+
+
+ {JSON.stringify(params)}
+
+
+ )
+}
diff --git a/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.$foo.route.tsx b/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.$foo.route.tsx
new file mode 100644
index 00000000000..0e87a46ec5a
--- /dev/null
+++ b/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.$foo.route.tsx
@@ -0,0 +1,16 @@
+import { Outlet, createFileRoute } from '@tanstack/react-router'
+
+export const Route = createFileRoute('/non-nested/deep/$baz_/bar/$foo')({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ return (
+
+
+ Hello deeply nested named baz/bar/foo route layout
+
+
+
+ )
+}
diff --git a/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.$foo_.qux.tsx b/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.$foo_.qux.tsx
new file mode 100644
index 00000000000..7668c77d3d1
--- /dev/null
+++ b/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.$foo_.qux.tsx
@@ -0,0 +1,19 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+export const Route = createFileRoute('/non-nested/deep/$baz_/bar/$foo_/qux')({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ const params = Route.useParams()
+ return (
+
+
+ Hello deeply nested baz/bar/foo/qux
+
+
+ {JSON.stringify(params)}
+
+
+ )
+}
diff --git a/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.index.tsx b/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.index.tsx
new file mode 100644
index 00000000000..723dc0a6e24
--- /dev/null
+++ b/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.index.tsx
@@ -0,0 +1,19 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+export const Route = createFileRoute('/non-nested/deep/$baz_/bar/')({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ const params = Route.useParams()
+ return (
+
+
+ Hello deeply nested baz/bar index
+
+
+ {JSON.stringify(params)}
+
+
+ )
+}
diff --git a/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.route.tsx b/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.route.tsx
new file mode 100644
index 00000000000..a9299e9f433
--- /dev/null
+++ b/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.route.tsx
@@ -0,0 +1,16 @@
+import { Outlet, createFileRoute } from '@tanstack/react-router'
+
+export const Route = createFileRoute('/non-nested/deep/$baz_/bar')({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ return (
+
+
+ Hello deeply nested baz/bar route layout
+
+
+
+ )
+}
diff --git a/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar_.qux.tsx b/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar_.qux.tsx
new file mode 100644
index 00000000000..7b38d5373ed
--- /dev/null
+++ b/e2e/react-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar_.qux.tsx
@@ -0,0 +1,19 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+export const Route = createFileRoute('/non-nested/deep/$baz_/bar_/qux')({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ const params = Route.useParams()
+ return (
+
+
+ Hello deeply nested baz/bar/qux
+
+
+ {JSON.stringify(params)}
+
+
+ )
+}
diff --git a/e2e/react-router/basic-file-based/src/routes/non-nested/deep/route.tsx b/e2e/react-router/basic-file-based/src/routes/non-nested/deep/route.tsx
new file mode 100644
index 00000000000..8db1457fef6
--- /dev/null
+++ b/e2e/react-router/basic-file-based/src/routes/non-nested/deep/route.tsx
@@ -0,0 +1,58 @@
+import { Link, Outlet, createFileRoute } from '@tanstack/react-router'
+
+export const Route = createFileRoute('/non-nested/deep')({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ return (
+
+
+ Hello non-nested deep layout
+
+
+
+ To Baz
+
+
+ To named baz/bar
+
+
+ To named baz/bar/foo
+
+
+ To named baz/bar/foo/qux
+
+
+ To named baz/bar/qux
+
+
+
+
+ )
+}
diff --git a/e2e/react-router/basic-file-based/tests/non-nested-paths.spec.ts b/e2e/react-router/basic-file-based/tests/non-nested-paths.spec.ts
index 9682eb84885..8c0e0e1a1ec 100644
--- a/e2e/react-router/basic-file-based/tests/non-nested-paths.spec.ts
+++ b/e2e/react-router/basic-file-based/tests/non-nested-paths.spec.ts
@@ -197,3 +197,170 @@ test.describe('Non-nested paths', () => {
},
)
})
+
+test.describe('Deeply nested non-nested paths', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/non-nested/deep')
+ await page.waitForURL('/non-nested/deep')
+ })
+
+ test('It should nest nested paths 1 level deep', async ({ page }) => {
+ const rootRouteHeading = page.getByTestId(
+ `non-nested-deep-root-route-heading`,
+ )
+
+ await expect(rootRouteHeading).toBeVisible()
+
+ const bazLink = page.getByTestId('to-deep-baz')
+ await bazLink.click()
+ await page.waitForURL('/non-nested/deep/baz')
+ const bazRouteHeading = page.getByTestId(
+ 'non-nested-deep-baz-route-heading',
+ )
+ const bazIndexHeading = page.getByTestId(
+ 'non-nested-deep-baz-index-heading',
+ )
+ const bazIndexParams = page.getByTestId('non-nested-deep-baz-index-param')
+
+ await expect(bazRouteHeading).toBeVisible()
+ await expect(bazIndexHeading).toBeVisible()
+ expect(await bazIndexParams.innerText()).toBe(
+ JSON.stringify({ baz: 'baz' }),
+ )
+ })
+
+ test('It should not nest non-nested paths 1 level deep', async ({ page }) => {
+ const rootRouteHeading = page.getByTestId(
+ `non-nested-deep-root-route-heading`,
+ )
+
+ await expect(rootRouteHeading).toBeVisible()
+ const bazBarLink = page.getByTestId('to-deep-baz-bar')
+
+ await bazBarLink.click()
+ await page.waitForURL('/non-nested/deep/baz-bar/bar')
+ const bazRouteHeading = page.getByTestId(
+ 'non-nested-deep-baz-route-heading',
+ )
+ const bazBarRouteHeading = page.getByTestId(
+ 'non-nested-deep-baz-bar-route-heading',
+ )
+ const bazBarIndexHeading = page.getByTestId(
+ 'non-nested-deep-baz-bar-index-heading',
+ )
+ const bazBarIndexParams = page.getByTestId(
+ 'non-nested-deep-baz-bar-index-param',
+ )
+
+ await expect(bazRouteHeading).not.toBeVisible()
+ await expect(bazBarRouteHeading).toBeVisible()
+ await expect(bazBarIndexHeading).toBeVisible()
+ expect(await bazBarIndexParams.innerText()).toBe(
+ JSON.stringify({ baz: 'baz-bar' }),
+ )
+ })
+
+ test('It should not nest non-nested paths 2 levels deep', async ({
+ page,
+ }) => {
+ const rootRouteHeading = page.getByTestId(
+ `non-nested-deep-root-route-heading`,
+ )
+
+ await expect(rootRouteHeading).toBeVisible()
+
+ const bazBarQuxLink = page.getByTestId('to-deep-baz-bar-qux')
+ await bazBarQuxLink.click()
+
+ await page.waitForURL('/non-nested/deep/baz-bar-qux/bar/qux')
+ const bazRouteHeading = page.getByTestId(
+ 'non-nested-deep-baz-route-heading',
+ )
+ const bazBarRouteHeading = page.getByTestId(
+ 'non-nested-deep-baz-bar-route-heading',
+ )
+ const bazBarQuxHeading = page.getByTestId(
+ 'non-nested-deep-baz-bar-qux-heading',
+ )
+ const bazBarQuxParams = page.getByTestId(
+ 'non-nested-deep-baz-bar-qux-param',
+ )
+
+ await expect(bazRouteHeading).not.toBeVisible()
+ await expect(bazBarRouteHeading).not.toBeVisible()
+ await expect(bazBarQuxHeading).toBeVisible()
+ await expect(bazBarQuxParams).toBeVisible()
+ expect(await bazBarQuxParams.innerText()).toBe(
+ JSON.stringify({ baz: 'baz-bar-qux' }),
+ )
+ })
+
+ test('It should nest and un-nest non-nested across paths multiple levels deep', async ({
+ page,
+ }) => {
+ const rootRouteHeading = page.getByTestId(
+ `non-nested-deep-root-route-heading`,
+ )
+
+ await expect(rootRouteHeading).toBeVisible()
+
+ const bazBarFooLink = page.getByTestId('to-deep-baz-bar-foo')
+ await bazBarFooLink.click()
+
+ await page.waitForURL('/non-nested/deep/baz-bar/bar/foo')
+
+ const bazRouteHeading = page.getByTestId(
+ 'non-nested-deep-baz-route-heading',
+ )
+ const bazBarRouteHeading = page.getByTestId(
+ 'non-nested-deep-baz-bar-route-heading',
+ )
+ const bazBarFooRouteHeading = page.getByTestId(
+ 'non-nested-deep-baz-bar-foo-route-heading',
+ )
+ const bazBarFooIndexHeading = page.getByTestId(
+ 'non-nested-deep-baz-bar-foo-index-heading',
+ )
+ const bazBarFooIndexParams = page.getByTestId(
+ 'non-nested-deep-baz-bar-foo-index-param',
+ )
+
+ await expect(bazRouteHeading).not.toBeVisible()
+ await expect(bazBarRouteHeading).toBeVisible()
+ await expect(bazBarFooRouteHeading).toBeVisible()
+ await expect(bazBarFooIndexHeading).toBeVisible()
+ await expect(bazBarFooIndexParams).toBeVisible()
+ expect(await bazBarFooIndexParams.innerText()).toBe(
+ JSON.stringify({ baz: 'baz-bar', foo: 'foo' }),
+ )
+
+ const bazBarFooQuxLink = page.getByTestId('to-deep-baz-bar-foo-qux')
+ await bazBarFooQuxLink.click()
+ await page.waitForURL('/non-nested/deep/baz-bar-qux/bar/foo/qux')
+
+ const bazBarFooQuxHeading = page.getByTestId(
+ 'non-nested-deep-baz-bar-foo-qux-heading',
+ )
+ const bazBarFooQuxParams = page.getByTestId(
+ 'non-nested-deep-baz-bar-foo-qux-param',
+ )
+
+ await expect(bazRouteHeading).not.toBeVisible()
+ await expect(bazBarRouteHeading).toBeVisible()
+ await expect(bazBarFooRouteHeading).not.toBeVisible()
+ await expect(bazBarFooQuxHeading).toBeVisible()
+ await expect(bazBarFooQuxParams).toBeVisible()
+
+ if (useExperimentalNonNestedRoutes) {
+ expect(await bazBarFooQuxParams.innerText()).toBe(
+ JSON.stringify({ baz: 'baz-bar-qux', foo: 'foo' }),
+ )
+ } else {
+ // this is a bug with named path params and non-nested paths
+ // that is resolved in the new experimental flag
+ expect(await bazBarFooQuxParams.innerText()).toBe(
+ JSON.stringify({ baz: 'baz-bar', foo: 'foo' }),
+ )
+ }
+ })
+})
diff --git a/e2e/solid-router/basic-file-based/src/routeTree.gen.ts b/e2e/solid-router/basic-file-based/src/routeTree.gen.ts
index bfa9054cffe..97e236578c3 100644
--- a/e2e/solid-router/basic-file-based/src/routeTree.gen.ts
+++ b/e2e/solid-router/basic-file-based/src/routeTree.gen.ts
@@ -42,6 +42,7 @@ import { Route as NonNestedSuffixRouteRouteImport } from './routes/non-nested/su
import { Route as NonNestedPrefixRouteRouteImport } from './routes/non-nested/prefix/route'
import { Route as NonNestedPathRouteRouteImport } from './routes/non-nested/path/route'
import { Route as NonNestedNamedRouteRouteImport } from './routes/non-nested/named/route'
+import { Route as NonNestedDeepRouteRouteImport } from './routes/non-nested/deep/route'
import { Route as RedirectTargetIndexRouteImport } from './routes/redirect/$target/index'
import { Route as ParamsPsWildcardIndexRouteImport } from './routes/params-ps/wildcard/index'
import { Route as ParamsPsNamedIndexRouteImport } from './routes/params-ps/named/index'
@@ -75,6 +76,7 @@ import { Route as NonNestedSuffixChar123bazChar125suffixRouteRouteImport } from
import { Route as NonNestedPrefixPrefixChar123bazChar125RouteRouteImport } from './routes/non-nested/prefix/prefix{$baz}.route'
import { Route as NonNestedPathBazRouteRouteImport } from './routes/non-nested/path/baz.route'
import { Route as NonNestedNamedBazRouteRouteImport } from './routes/non-nested/named/$baz.route'
+import { Route as NonNestedDeepBazRouteRouteImport } from './routes/non-nested/deep/$baz.route'
import { Route as RelativeUseNavigateWithSearchIndexRouteImport } from './routes/relative/useNavigate/with-search/index'
import { Route as RelativeUseNavigatePathIndexRouteImport } from './routes/relative/useNavigate/path/index'
import { Route as RelativeUseNavigateNestedIndexRouteImport } from './routes/relative/useNavigate/nested/index'
@@ -85,6 +87,7 @@ import { Route as NonNestedSuffixChar123bazChar125suffixIndexRouteImport } from
import { Route as NonNestedPrefixPrefixChar123bazChar125IndexRouteImport } from './routes/non-nested/prefix/prefix{$baz}.index'
import { Route as NonNestedPathBazIndexRouteImport } from './routes/non-nested/path/baz.index'
import { Route as NonNestedNamedBazIndexRouteImport } from './routes/non-nested/named/$baz.index'
+import { Route as NonNestedDeepBazIndexRouteImport } from './routes/non-nested/deep/$baz.index'
import { Route as ParamsPsNonNestedFooBarRouteImport } from './routes/params-ps/non-nested/$foo_/$bar'
import { Route as NonNestedSuffixChar123bazChar125suffixBarRouteImport } from './routes/non-nested/suffix/{$baz}suffix_.bar'
import { Route as NonNestedSuffixChar123bazChar125suffixFooRouteImport } from './routes/non-nested/suffix/{$baz}suffix.foo'
@@ -95,11 +98,17 @@ import { Route as NonNestedPathBazFooRouteImport } from './routes/non-nested/pat
import { Route as NonNestedNamedBazBarRouteImport } from './routes/non-nested/named/$baz_.bar'
import { Route as NonNestedNamedBazFooRouteImport } from './routes/non-nested/named/$baz.foo'
import { Route as ParamsPsNamedFooBarRouteRouteImport } from './routes/params-ps/named/$foo/$bar.route'
+import { Route as NonNestedDeepBazBarRouteRouteImport } from './routes/non-nested/deep/$baz_.bar.route'
import { Route as RelativeUseNavigatePathPathIndexRouteImport } from './routes/relative/useNavigate/path/$path/index'
import { Route as RelativeUseNavigateNestedDeepIndexRouteImport } from './routes/relative/useNavigate/nested/deep/index'
import { Route as RelativeLinkPathPathIndexRouteImport } from './routes/relative/link/path/$path/index'
import { Route as RelativeLinkNestedDeepIndexRouteImport } from './routes/relative/link/nested/deep/index'
+import { Route as NonNestedDeepBazBarIndexRouteImport } from './routes/non-nested/deep/$baz_.bar.index'
import { Route as ParamsPsNamedFooBarBazRouteImport } from './routes/params-ps/named/$foo/$bar.$baz'
+import { Route as NonNestedDeepBazBarQuxRouteImport } from './routes/non-nested/deep/$baz_.bar_.qux'
+import { Route as NonNestedDeepBazBarFooRouteRouteImport } from './routes/non-nested/deep/$baz_.bar.$foo.route'
+import { Route as NonNestedDeepBazBarFooIndexRouteImport } from './routes/non-nested/deep/$baz_.bar.$foo.index'
+import { Route as NonNestedDeepBazBarFooQuxRouteImport } from './routes/non-nested/deep/$baz_.bar.$foo_.qux'
const RemountDepsRoute = RemountDepsRouteImport.update({
id: '/remountDeps',
@@ -268,6 +277,11 @@ const NonNestedNamedRouteRoute = NonNestedNamedRouteRouteImport.update({
path: '/named',
getParentRoute: () => NonNestedRouteRoute,
} as any)
+const NonNestedDeepRouteRoute = NonNestedDeepRouteRouteImport.update({
+ id: '/deep',
+ path: '/deep',
+ getParentRoute: () => NonNestedRouteRoute,
+} as any)
const RedirectTargetIndexRoute = RedirectTargetIndexRouteImport.update({
id: '/',
path: '/',
@@ -449,6 +463,11 @@ const NonNestedNamedBazRouteRoute = NonNestedNamedBazRouteRouteImport.update({
path: '/$baz',
getParentRoute: () => NonNestedNamedRouteRoute,
} as any)
+const NonNestedDeepBazRouteRoute = NonNestedDeepBazRouteRouteImport.update({
+ id: '/$baz',
+ path: '/$baz',
+ getParentRoute: () => NonNestedDeepRouteRoute,
+} as any)
const RelativeUseNavigateWithSearchIndexRoute =
RelativeUseNavigateWithSearchIndexRouteImport.update({
id: '/with-search/',
@@ -505,6 +524,11 @@ const NonNestedNamedBazIndexRoute = NonNestedNamedBazIndexRouteImport.update({
path: '/',
getParentRoute: () => NonNestedNamedBazRouteRoute,
} as any)
+const NonNestedDeepBazIndexRoute = NonNestedDeepBazIndexRouteImport.update({
+ id: '/',
+ path: '/',
+ getParentRoute: () => NonNestedDeepBazRouteRoute,
+} as any)
const ParamsPsNonNestedFooBarRoute = ParamsPsNonNestedFooBarRouteImport.update({
id: '/$bar',
path: '/$bar',
@@ -560,6 +584,12 @@ const ParamsPsNamedFooBarRouteRoute =
path: '/$bar',
getParentRoute: () => ParamsPsNamedFooRouteRoute,
} as any)
+const NonNestedDeepBazBarRouteRoute =
+ NonNestedDeepBazBarRouteRouteImport.update({
+ id: '/$baz_/bar',
+ path: '/$baz/bar',
+ getParentRoute: () => NonNestedDeepRouteRoute,
+ } as any)
const RelativeUseNavigatePathPathIndexRoute =
RelativeUseNavigatePathPathIndexRouteImport.update({
id: '/path/$path/',
@@ -584,11 +614,40 @@ const RelativeLinkNestedDeepIndexRoute =
path: '/nested/deep/',
getParentRoute: () => RelativeLinkRouteRoute,
} as any)
+const NonNestedDeepBazBarIndexRoute =
+ NonNestedDeepBazBarIndexRouteImport.update({
+ id: '/',
+ path: '/',
+ getParentRoute: () => NonNestedDeepBazBarRouteRoute,
+ } as any)
const ParamsPsNamedFooBarBazRoute = ParamsPsNamedFooBarBazRouteImport.update({
id: '/$baz',
path: '/$baz',
getParentRoute: () => ParamsPsNamedFooBarRouteRoute,
} as any)
+const NonNestedDeepBazBarQuxRoute = NonNestedDeepBazBarQuxRouteImport.update({
+ id: '/$baz_/bar_/qux',
+ path: '/$baz/bar/qux',
+ getParentRoute: () => NonNestedDeepRouteRoute,
+} as any)
+const NonNestedDeepBazBarFooRouteRoute =
+ NonNestedDeepBazBarFooRouteRouteImport.update({
+ id: '/$foo',
+ path: '/$foo',
+ getParentRoute: () => NonNestedDeepBazBarRouteRoute,
+ } as any)
+const NonNestedDeepBazBarFooIndexRoute =
+ NonNestedDeepBazBarFooIndexRouteImport.update({
+ id: '/',
+ path: '/',
+ getParentRoute: () => NonNestedDeepBazBarFooRouteRoute,
+ } as any)
+const NonNestedDeepBazBarFooQuxRoute =
+ NonNestedDeepBazBarFooQuxRouteImport.update({
+ id: '/$foo_/qux',
+ path: '/$foo/qux',
+ getParentRoute: () => NonNestedDeepBazBarRouteRoute,
+ } as any)
export interface FileRoutesByFullPath {
'/': typeof IndexRoute
@@ -602,6 +661,7 @@ export interface FileRoutesByFullPath {
'/notRemountDeps': typeof NotRemountDepsRoute
'/posts': typeof PostsRouteWithChildren
'/remountDeps': typeof RemountDepsRoute
+ '/non-nested/deep': typeof NonNestedDeepRouteRouteWithChildren
'/non-nested/named': typeof NonNestedNamedRouteRouteWithChildren
'/non-nested/path': typeof NonNestedPathRouteRouteWithChildren
'/non-nested/prefix': typeof NonNestedPrefixRouteRouteWithChildren
@@ -621,6 +681,7 @@ export interface FileRoutesByFullPath {
'/relative': typeof RelativeIndexRoute
'/search-params/': typeof SearchParamsIndexRoute
'/transition': typeof TransitionIndexRoute
+ '/non-nested/deep/$baz': typeof NonNestedDeepBazRouteRouteWithChildren
'/non-nested/named/$baz': typeof NonNestedNamedBazRouteRouteWithChildren
'/non-nested/path/baz': typeof NonNestedPathBazRouteRouteWithChildren
'/non-nested/prefix/prefix{$baz}': typeof NonNestedPrefixPrefixChar123bazChar125RouteRouteWithChildren
@@ -654,6 +715,7 @@ export interface FileRoutesByFullPath {
'/params-ps/named': typeof ParamsPsNamedIndexRoute
'/params-ps/wildcard': typeof ParamsPsWildcardIndexRoute
'/redirect/$target/': typeof RedirectTargetIndexRoute
+ '/non-nested/deep/$baz/bar': typeof NonNestedDeepBazBarRouteRouteWithChildren
'/params-ps/named/$foo/$bar': typeof ParamsPsNamedFooBarRouteRouteWithChildren
'/non-nested/named/$baz/foo': typeof NonNestedNamedBazFooRoute
'/non-nested/named/$baz/bar': typeof NonNestedNamedBazBarRoute
@@ -664,6 +726,7 @@ export interface FileRoutesByFullPath {
'/non-nested/suffix/{$baz}suffix/foo': typeof NonNestedSuffixChar123bazChar125suffixFooRoute
'/non-nested/suffix/{$baz}suffix/bar': typeof NonNestedSuffixChar123bazChar125suffixBarRoute
'/params-ps/non-nested/$foo/$bar': typeof ParamsPsNonNestedFooBarRoute
+ '/non-nested/deep/$baz/': typeof NonNestedDeepBazIndexRoute
'/non-nested/named/$baz/': typeof NonNestedNamedBazIndexRoute
'/non-nested/path/baz/': typeof NonNestedPathBazIndexRoute
'/non-nested/prefix/prefix{$baz}/': typeof NonNestedPrefixPrefixChar123bazChar125IndexRoute
@@ -674,11 +737,16 @@ export interface FileRoutesByFullPath {
'/relative/useNavigate/nested': typeof RelativeUseNavigateNestedIndexRoute
'/relative/useNavigate/path': typeof RelativeUseNavigatePathIndexRoute
'/relative/useNavigate/with-search': typeof RelativeUseNavigateWithSearchIndexRoute
+ '/non-nested/deep/$baz/bar/$foo': typeof NonNestedDeepBazBarFooRouteRouteWithChildren
+ '/non-nested/deep/$baz/bar/qux': typeof NonNestedDeepBazBarQuxRoute
'/params-ps/named/$foo/$bar/$baz': typeof ParamsPsNamedFooBarBazRoute
+ '/non-nested/deep/$baz/bar/': typeof NonNestedDeepBazBarIndexRoute
'/relative/link/nested/deep': typeof RelativeLinkNestedDeepIndexRoute
'/relative/link/path/$path': typeof RelativeLinkPathPathIndexRoute
'/relative/useNavigate/nested/deep': typeof RelativeUseNavigateNestedDeepIndexRoute
'/relative/useNavigate/path/$path': typeof RelativeUseNavigatePathPathIndexRoute
+ '/non-nested/deep/$baz/bar/$foo/qux': typeof NonNestedDeepBazBarFooQuxRoute
+ '/non-nested/deep/$baz/bar/$foo/': typeof NonNestedDeepBazBarFooIndexRoute
}
export interface FileRoutesByTo {
'/': typeof IndexRoute
@@ -690,6 +758,7 @@ export interface FileRoutesByTo {
'/editing-b': typeof EditingBRoute
'/notRemountDeps': typeof NotRemountDepsRoute
'/remountDeps': typeof RemountDepsRoute
+ '/non-nested/deep': typeof NonNestedDeepRouteRouteWithChildren
'/non-nested/named': typeof NonNestedNamedRouteRouteWithChildren
'/non-nested/path': typeof NonNestedPathRouteRouteWithChildren
'/non-nested/prefix': typeof NonNestedPrefixRouteRouteWithChildren
@@ -747,6 +816,7 @@ export interface FileRoutesByTo {
'/non-nested/suffix/{$baz}suffix/foo': typeof NonNestedSuffixChar123bazChar125suffixFooRoute
'/non-nested/suffix/{$baz}suffix/bar': typeof NonNestedSuffixChar123bazChar125suffixBarRoute
'/params-ps/non-nested/$foo/$bar': typeof ParamsPsNonNestedFooBarRoute
+ '/non-nested/deep/$baz': typeof NonNestedDeepBazIndexRoute
'/non-nested/named/$baz': typeof NonNestedNamedBazIndexRoute
'/non-nested/path/baz': typeof NonNestedPathBazIndexRoute
'/non-nested/prefix/prefix{$baz}': typeof NonNestedPrefixPrefixChar123bazChar125IndexRoute
@@ -757,11 +827,15 @@ export interface FileRoutesByTo {
'/relative/useNavigate/nested': typeof RelativeUseNavigateNestedIndexRoute
'/relative/useNavigate/path': typeof RelativeUseNavigatePathIndexRoute
'/relative/useNavigate/with-search': typeof RelativeUseNavigateWithSearchIndexRoute
+ '/non-nested/deep/$baz/bar/qux': typeof NonNestedDeepBazBarQuxRoute
'/params-ps/named/$foo/$bar/$baz': typeof ParamsPsNamedFooBarBazRoute
+ '/non-nested/deep/$baz/bar': typeof NonNestedDeepBazBarIndexRoute
'/relative/link/nested/deep': typeof RelativeLinkNestedDeepIndexRoute
'/relative/link/path/$path': typeof RelativeLinkPathPathIndexRoute
'/relative/useNavigate/nested/deep': typeof RelativeUseNavigateNestedDeepIndexRoute
'/relative/useNavigate/path/$path': typeof RelativeUseNavigatePathPathIndexRoute
+ '/non-nested/deep/$baz/bar/$foo/qux': typeof NonNestedDeepBazBarFooQuxRoute
+ '/non-nested/deep/$baz/bar/$foo': typeof NonNestedDeepBazBarFooIndexRoute
}
export interface FileRoutesById {
__root__: typeof rootRouteImport
@@ -777,6 +851,7 @@ export interface FileRoutesById {
'/notRemountDeps': typeof NotRemountDepsRoute
'/posts': typeof PostsRouteWithChildren
'/remountDeps': typeof RemountDepsRoute
+ '/non-nested/deep': typeof NonNestedDeepRouteRouteWithChildren
'/non-nested/named': typeof NonNestedNamedRouteRouteWithChildren
'/non-nested/path': typeof NonNestedPathRouteRouteWithChildren
'/non-nested/prefix': typeof NonNestedPrefixRouteRouteWithChildren
@@ -798,6 +873,7 @@ export interface FileRoutesById {
'/relative/': typeof RelativeIndexRoute
'/search-params/': typeof SearchParamsIndexRoute
'/transition/': typeof TransitionIndexRoute
+ '/non-nested/deep/$baz': typeof NonNestedDeepBazRouteRouteWithChildren
'/non-nested/named/$baz': typeof NonNestedNamedBazRouteRouteWithChildren
'/non-nested/path/baz': typeof NonNestedPathBazRouteRouteWithChildren
'/non-nested/prefix/prefix{$baz}': typeof NonNestedPrefixPrefixChar123bazChar125RouteRouteWithChildren
@@ -831,6 +907,7 @@ export interface FileRoutesById {
'/params-ps/named/': typeof ParamsPsNamedIndexRoute
'/params-ps/wildcard/': typeof ParamsPsWildcardIndexRoute
'/redirect/$target/': typeof RedirectTargetIndexRoute
+ '/non-nested/deep/$baz_/bar': typeof NonNestedDeepBazBarRouteRouteWithChildren
'/params-ps/named/$foo/$bar': typeof ParamsPsNamedFooBarRouteRouteWithChildren
'/non-nested/named/$baz/foo': typeof NonNestedNamedBazFooRoute
'/non-nested/named/$baz_/bar': typeof NonNestedNamedBazBarRoute
@@ -841,6 +918,7 @@ export interface FileRoutesById {
'/non-nested/suffix/{$baz}suffix/foo': typeof NonNestedSuffixChar123bazChar125suffixFooRoute
'/non-nested/suffix/{$baz}suffix_/bar': typeof NonNestedSuffixChar123bazChar125suffixBarRoute
'/params-ps/non-nested/$foo_/$bar': typeof ParamsPsNonNestedFooBarRoute
+ '/non-nested/deep/$baz/': typeof NonNestedDeepBazIndexRoute
'/non-nested/named/$baz/': typeof NonNestedNamedBazIndexRoute
'/non-nested/path/baz/': typeof NonNestedPathBazIndexRoute
'/non-nested/prefix/prefix{$baz}/': typeof NonNestedPrefixPrefixChar123bazChar125IndexRoute
@@ -851,11 +929,16 @@ export interface FileRoutesById {
'/relative/useNavigate/nested/': typeof RelativeUseNavigateNestedIndexRoute
'/relative/useNavigate/path/': typeof RelativeUseNavigatePathIndexRoute
'/relative/useNavigate/with-search/': typeof RelativeUseNavigateWithSearchIndexRoute
+ '/non-nested/deep/$baz_/bar/$foo': typeof NonNestedDeepBazBarFooRouteRouteWithChildren
+ '/non-nested/deep/$baz_/bar_/qux': typeof NonNestedDeepBazBarQuxRoute
'/params-ps/named/$foo/$bar/$baz': typeof ParamsPsNamedFooBarBazRoute
+ '/non-nested/deep/$baz_/bar/': typeof NonNestedDeepBazBarIndexRoute
'/relative/link/nested/deep/': typeof RelativeLinkNestedDeepIndexRoute
'/relative/link/path/$path/': typeof RelativeLinkPathPathIndexRoute
'/relative/useNavigate/nested/deep/': typeof RelativeUseNavigateNestedDeepIndexRoute
'/relative/useNavigate/path/$path/': typeof RelativeUseNavigatePathPathIndexRoute
+ '/non-nested/deep/$baz_/bar/$foo_/qux': typeof NonNestedDeepBazBarFooQuxRoute
+ '/non-nested/deep/$baz_/bar/$foo/': typeof NonNestedDeepBazBarFooIndexRoute
}
export interface FileRouteTypes {
fileRoutesByFullPath: FileRoutesByFullPath
@@ -871,6 +954,7 @@ export interface FileRouteTypes {
| '/notRemountDeps'
| '/posts'
| '/remountDeps'
+ | '/non-nested/deep'
| '/non-nested/named'
| '/non-nested/path'
| '/non-nested/prefix'
@@ -890,6 +974,7 @@ export interface FileRouteTypes {
| '/relative'
| '/search-params/'
| '/transition'
+ | '/non-nested/deep/$baz'
| '/non-nested/named/$baz'
| '/non-nested/path/baz'
| '/non-nested/prefix/prefix{$baz}'
@@ -923,6 +1008,7 @@ export interface FileRouteTypes {
| '/params-ps/named'
| '/params-ps/wildcard'
| '/redirect/$target/'
+ | '/non-nested/deep/$baz/bar'
| '/params-ps/named/$foo/$bar'
| '/non-nested/named/$baz/foo'
| '/non-nested/named/$baz/bar'
@@ -933,6 +1019,7 @@ export interface FileRouteTypes {
| '/non-nested/suffix/{$baz}suffix/foo'
| '/non-nested/suffix/{$baz}suffix/bar'
| '/params-ps/non-nested/$foo/$bar'
+ | '/non-nested/deep/$baz/'
| '/non-nested/named/$baz/'
| '/non-nested/path/baz/'
| '/non-nested/prefix/prefix{$baz}/'
@@ -943,11 +1030,16 @@ export interface FileRouteTypes {
| '/relative/useNavigate/nested'
| '/relative/useNavigate/path'
| '/relative/useNavigate/with-search'
+ | '/non-nested/deep/$baz/bar/$foo'
+ | '/non-nested/deep/$baz/bar/qux'
| '/params-ps/named/$foo/$bar/$baz'
+ | '/non-nested/deep/$baz/bar/'
| '/relative/link/nested/deep'
| '/relative/link/path/$path'
| '/relative/useNavigate/nested/deep'
| '/relative/useNavigate/path/$path'
+ | '/non-nested/deep/$baz/bar/$foo/qux'
+ | '/non-nested/deep/$baz/bar/$foo/'
fileRoutesByTo: FileRoutesByTo
to:
| '/'
@@ -959,6 +1051,7 @@ export interface FileRouteTypes {
| '/editing-b'
| '/notRemountDeps'
| '/remountDeps'
+ | '/non-nested/deep'
| '/non-nested/named'
| '/non-nested/path'
| '/non-nested/prefix'
@@ -1016,6 +1109,7 @@ export interface FileRouteTypes {
| '/non-nested/suffix/{$baz}suffix/foo'
| '/non-nested/suffix/{$baz}suffix/bar'
| '/params-ps/non-nested/$foo/$bar'
+ | '/non-nested/deep/$baz'
| '/non-nested/named/$baz'
| '/non-nested/path/baz'
| '/non-nested/prefix/prefix{$baz}'
@@ -1026,11 +1120,15 @@ export interface FileRouteTypes {
| '/relative/useNavigate/nested'
| '/relative/useNavigate/path'
| '/relative/useNavigate/with-search'
+ | '/non-nested/deep/$baz/bar/qux'
| '/params-ps/named/$foo/$bar/$baz'
+ | '/non-nested/deep/$baz/bar'
| '/relative/link/nested/deep'
| '/relative/link/path/$path'
| '/relative/useNavigate/nested/deep'
| '/relative/useNavigate/path/$path'
+ | '/non-nested/deep/$baz/bar/$foo/qux'
+ | '/non-nested/deep/$baz/bar/$foo'
id:
| '__root__'
| '/'
@@ -1045,6 +1143,7 @@ export interface FileRouteTypes {
| '/notRemountDeps'
| '/posts'
| '/remountDeps'
+ | '/non-nested/deep'
| '/non-nested/named'
| '/non-nested/path'
| '/non-nested/prefix'
@@ -1066,6 +1165,7 @@ export interface FileRouteTypes {
| '/relative/'
| '/search-params/'
| '/transition/'
+ | '/non-nested/deep/$baz'
| '/non-nested/named/$baz'
| '/non-nested/path/baz'
| '/non-nested/prefix/prefix{$baz}'
@@ -1099,6 +1199,7 @@ export interface FileRouteTypes {
| '/params-ps/named/'
| '/params-ps/wildcard/'
| '/redirect/$target/'
+ | '/non-nested/deep/$baz_/bar'
| '/params-ps/named/$foo/$bar'
| '/non-nested/named/$baz/foo'
| '/non-nested/named/$baz_/bar'
@@ -1109,6 +1210,7 @@ export interface FileRouteTypes {
| '/non-nested/suffix/{$baz}suffix/foo'
| '/non-nested/suffix/{$baz}suffix_/bar'
| '/params-ps/non-nested/$foo_/$bar'
+ | '/non-nested/deep/$baz/'
| '/non-nested/named/$baz/'
| '/non-nested/path/baz/'
| '/non-nested/prefix/prefix{$baz}/'
@@ -1119,11 +1221,16 @@ export interface FileRouteTypes {
| '/relative/useNavigate/nested/'
| '/relative/useNavigate/path/'
| '/relative/useNavigate/with-search/'
+ | '/non-nested/deep/$baz_/bar/$foo'
+ | '/non-nested/deep/$baz_/bar_/qux'
| '/params-ps/named/$foo/$bar/$baz'
+ | '/non-nested/deep/$baz_/bar/'
| '/relative/link/nested/deep/'
| '/relative/link/path/$path/'
| '/relative/useNavigate/nested/deep/'
| '/relative/useNavigate/path/$path/'
+ | '/non-nested/deep/$baz_/bar/$foo_/qux'
+ | '/non-nested/deep/$baz_/bar/$foo/'
fileRoutesById: FileRoutesById
}
export interface RootRouteChildren {
@@ -1402,6 +1509,13 @@ declare module '@tanstack/solid-router' {
preLoaderRoute: typeof NonNestedNamedRouteRouteImport
parentRoute: typeof NonNestedRouteRoute
}
+ '/non-nested/deep': {
+ id: '/non-nested/deep'
+ path: '/deep'
+ fullPath: '/non-nested/deep'
+ preLoaderRoute: typeof NonNestedDeepRouteRouteImport
+ parentRoute: typeof NonNestedRouteRoute
+ }
'/redirect/$target/': {
id: '/redirect/$target/'
path: '/'
@@ -1633,6 +1747,13 @@ declare module '@tanstack/solid-router' {
preLoaderRoute: typeof NonNestedNamedBazRouteRouteImport
parentRoute: typeof NonNestedNamedRouteRoute
}
+ '/non-nested/deep/$baz': {
+ id: '/non-nested/deep/$baz'
+ path: '/$baz'
+ fullPath: '/non-nested/deep/$baz'
+ preLoaderRoute: typeof NonNestedDeepBazRouteRouteImport
+ parentRoute: typeof NonNestedDeepRouteRoute
+ }
'/relative/useNavigate/with-search/': {
id: '/relative/useNavigate/with-search/'
path: '/with-search'
@@ -1703,6 +1824,13 @@ declare module '@tanstack/solid-router' {
preLoaderRoute: typeof NonNestedNamedBazIndexRouteImport
parentRoute: typeof NonNestedNamedBazRouteRoute
}
+ '/non-nested/deep/$baz/': {
+ id: '/non-nested/deep/$baz/'
+ path: '/'
+ fullPath: '/non-nested/deep/$baz/'
+ preLoaderRoute: typeof NonNestedDeepBazIndexRouteImport
+ parentRoute: typeof NonNestedDeepBazRouteRoute
+ }
'/params-ps/non-nested/$foo_/$bar': {
id: '/params-ps/non-nested/$foo_/$bar'
path: '/$bar'
@@ -1773,6 +1901,13 @@ declare module '@tanstack/solid-router' {
preLoaderRoute: typeof ParamsPsNamedFooBarRouteRouteImport
parentRoute: typeof ParamsPsNamedFooRouteRoute
}
+ '/non-nested/deep/$baz_/bar': {
+ id: '/non-nested/deep/$baz_/bar'
+ path: '/$baz/bar'
+ fullPath: '/non-nested/deep/$baz/bar'
+ preLoaderRoute: typeof NonNestedDeepBazBarRouteRouteImport
+ parentRoute: typeof NonNestedDeepRouteRoute
+ }
'/relative/useNavigate/path/$path/': {
id: '/relative/useNavigate/path/$path/'
path: '/path/$path'
@@ -1801,6 +1936,13 @@ declare module '@tanstack/solid-router' {
preLoaderRoute: typeof RelativeLinkNestedDeepIndexRouteImport
parentRoute: typeof RelativeLinkRouteRoute
}
+ '/non-nested/deep/$baz_/bar/': {
+ id: '/non-nested/deep/$baz_/bar/'
+ path: '/'
+ fullPath: '/non-nested/deep/$baz/bar/'
+ preLoaderRoute: typeof NonNestedDeepBazBarIndexRouteImport
+ parentRoute: typeof NonNestedDeepBazBarRouteRoute
+ }
'/params-ps/named/$foo/$bar/$baz': {
id: '/params-ps/named/$foo/$bar/$baz'
path: '/$baz'
@@ -1808,9 +1950,98 @@ declare module '@tanstack/solid-router' {
preLoaderRoute: typeof ParamsPsNamedFooBarBazRouteImport
parentRoute: typeof ParamsPsNamedFooBarRouteRoute
}
+ '/non-nested/deep/$baz_/bar_/qux': {
+ id: '/non-nested/deep/$baz_/bar_/qux'
+ path: '/$baz/bar/qux'
+ fullPath: '/non-nested/deep/$baz/bar/qux'
+ preLoaderRoute: typeof NonNestedDeepBazBarQuxRouteImport
+ parentRoute: typeof NonNestedDeepRouteRoute
+ }
+ '/non-nested/deep/$baz_/bar/$foo': {
+ id: '/non-nested/deep/$baz_/bar/$foo'
+ path: '/$foo'
+ fullPath: '/non-nested/deep/$baz/bar/$foo'
+ preLoaderRoute: typeof NonNestedDeepBazBarFooRouteRouteImport
+ parentRoute: typeof NonNestedDeepBazBarRouteRoute
+ }
+ '/non-nested/deep/$baz_/bar/$foo/': {
+ id: '/non-nested/deep/$baz_/bar/$foo/'
+ path: '/'
+ fullPath: '/non-nested/deep/$baz/bar/$foo/'
+ preLoaderRoute: typeof NonNestedDeepBazBarFooIndexRouteImport
+ parentRoute: typeof NonNestedDeepBazBarFooRouteRoute
+ }
+ '/non-nested/deep/$baz_/bar/$foo_/qux': {
+ id: '/non-nested/deep/$baz_/bar/$foo_/qux'
+ path: '/$foo/qux'
+ fullPath: '/non-nested/deep/$baz/bar/$foo/qux'
+ preLoaderRoute: typeof NonNestedDeepBazBarFooQuxRouteImport
+ parentRoute: typeof NonNestedDeepBazBarRouteRoute
+ }
+ }
+}
+
+interface NonNestedDeepBazRouteRouteChildren {
+ NonNestedDeepBazIndexRoute: typeof NonNestedDeepBazIndexRoute
+}
+
+const NonNestedDeepBazRouteRouteChildren: NonNestedDeepBazRouteRouteChildren = {
+ NonNestedDeepBazIndexRoute: NonNestedDeepBazIndexRoute,
+}
+
+const NonNestedDeepBazRouteRouteWithChildren =
+ NonNestedDeepBazRouteRoute._addFileChildren(
+ NonNestedDeepBazRouteRouteChildren,
+ )
+
+interface NonNestedDeepBazBarFooRouteRouteChildren {
+ NonNestedDeepBazBarFooIndexRoute: typeof NonNestedDeepBazBarFooIndexRoute
+}
+
+const NonNestedDeepBazBarFooRouteRouteChildren: NonNestedDeepBazBarFooRouteRouteChildren =
+ {
+ NonNestedDeepBazBarFooIndexRoute: NonNestedDeepBazBarFooIndexRoute,
}
+
+const NonNestedDeepBazBarFooRouteRouteWithChildren =
+ NonNestedDeepBazBarFooRouteRoute._addFileChildren(
+ NonNestedDeepBazBarFooRouteRouteChildren,
+ )
+
+interface NonNestedDeepBazBarRouteRouteChildren {
+ NonNestedDeepBazBarFooRouteRoute: typeof NonNestedDeepBazBarFooRouteRouteWithChildren
+ NonNestedDeepBazBarIndexRoute: typeof NonNestedDeepBazBarIndexRoute
+ NonNestedDeepBazBarFooQuxRoute: typeof NonNestedDeepBazBarFooQuxRoute
}
+const NonNestedDeepBazBarRouteRouteChildren: NonNestedDeepBazBarRouteRouteChildren =
+ {
+ NonNestedDeepBazBarFooRouteRoute:
+ NonNestedDeepBazBarFooRouteRouteWithChildren,
+ NonNestedDeepBazBarIndexRoute: NonNestedDeepBazBarIndexRoute,
+ NonNestedDeepBazBarFooQuxRoute: NonNestedDeepBazBarFooQuxRoute,
+ }
+
+const NonNestedDeepBazBarRouteRouteWithChildren =
+ NonNestedDeepBazBarRouteRoute._addFileChildren(
+ NonNestedDeepBazBarRouteRouteChildren,
+ )
+
+interface NonNestedDeepRouteRouteChildren {
+ NonNestedDeepBazRouteRoute: typeof NonNestedDeepBazRouteRouteWithChildren
+ NonNestedDeepBazBarRouteRoute: typeof NonNestedDeepBazBarRouteRouteWithChildren
+ NonNestedDeepBazBarQuxRoute: typeof NonNestedDeepBazBarQuxRoute
+}
+
+const NonNestedDeepRouteRouteChildren: NonNestedDeepRouteRouteChildren = {
+ NonNestedDeepBazRouteRoute: NonNestedDeepBazRouteRouteWithChildren,
+ NonNestedDeepBazBarRouteRoute: NonNestedDeepBazBarRouteRouteWithChildren,
+ NonNestedDeepBazBarQuxRoute: NonNestedDeepBazBarQuxRoute,
+}
+
+const NonNestedDeepRouteRouteWithChildren =
+ NonNestedDeepRouteRoute._addFileChildren(NonNestedDeepRouteRouteChildren)
+
interface NonNestedNamedBazRouteRouteChildren {
NonNestedNamedBazFooRoute: typeof NonNestedNamedBazFooRoute
NonNestedNamedBazIndexRoute: typeof NonNestedNamedBazIndexRoute
@@ -1935,6 +2166,7 @@ const NonNestedSuffixRouteRouteWithChildren =
NonNestedSuffixRouteRoute._addFileChildren(NonNestedSuffixRouteRouteChildren)
interface NonNestedRouteRouteChildren {
+ NonNestedDeepRouteRoute: typeof NonNestedDeepRouteRouteWithChildren
NonNestedNamedRouteRoute: typeof NonNestedNamedRouteRouteWithChildren
NonNestedPathRouteRoute: typeof NonNestedPathRouteRouteWithChildren
NonNestedPrefixRouteRoute: typeof NonNestedPrefixRouteRouteWithChildren
@@ -1942,6 +2174,7 @@ interface NonNestedRouteRouteChildren {
}
const NonNestedRouteRouteChildren: NonNestedRouteRouteChildren = {
+ NonNestedDeepRouteRoute: NonNestedDeepRouteRouteWithChildren,
NonNestedNamedRouteRoute: NonNestedNamedRouteRouteWithChildren,
NonNestedPathRouteRoute: NonNestedPathRouteRouteWithChildren,
NonNestedPrefixRouteRoute: NonNestedPrefixRouteRouteWithChildren,
diff --git a/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz.index.tsx b/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz.index.tsx
new file mode 100644
index 00000000000..9f2a1a9d456
--- /dev/null
+++ b/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz.index.tsx
@@ -0,0 +1,19 @@
+import { createFileRoute } from '@tanstack/solid-router'
+
+export const Route = createFileRoute('/non-nested/deep/$baz/')({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ const params = Route.useParams()
+ return (
+
+
+ Hello deeply nested baz index
+
+
+ {JSON.stringify(params())}
+
+
+ )
+}
diff --git a/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz.route.tsx b/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz.route.tsx
new file mode 100644
index 00000000000..152a12147e1
--- /dev/null
+++ b/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz.route.tsx
@@ -0,0 +1,16 @@
+import { Outlet, createFileRoute } from '@tanstack/solid-router'
+
+export const Route = createFileRoute('/non-nested/deep/$baz')({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ return (
+
+
+ Hello non-nested named baz route layout
+
+
+
+ )
+}
diff --git a/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.$foo.index.tsx b/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.$foo.index.tsx
new file mode 100644
index 00000000000..cb5dda58bfc
--- /dev/null
+++ b/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.$foo.index.tsx
@@ -0,0 +1,19 @@
+import { createFileRoute } from '@tanstack/solid-router'
+
+export const Route = createFileRoute('/non-nested/deep/$baz_/bar/$foo/')({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ const params = Route.useParams()
+ return (
+
+
+ Hello deeply nested baz/bar/foo index
+
+
+ {JSON.stringify(params())}
+
+
+ )
+}
diff --git a/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.$foo.route.tsx b/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.$foo.route.tsx
new file mode 100644
index 00000000000..7822e408e7d
--- /dev/null
+++ b/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.$foo.route.tsx
@@ -0,0 +1,16 @@
+import { Outlet, createFileRoute } from '@tanstack/solid-router'
+
+export const Route = createFileRoute('/non-nested/deep/$baz_/bar/$foo')({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ return (
+
+
+ Hello deeply nested named baz/bar/foo route layout
+
+
+
+ )
+}
diff --git a/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.$foo_.qux.tsx b/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.$foo_.qux.tsx
new file mode 100644
index 00000000000..7ecdbd8c8e2
--- /dev/null
+++ b/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.$foo_.qux.tsx
@@ -0,0 +1,19 @@
+import { createFileRoute } from '@tanstack/solid-router'
+
+export const Route = createFileRoute('/non-nested/deep/$baz_/bar/$foo_/qux')({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ const params = Route.useParams()
+ return (
+
+
+ Hello deeply nested baz/bar/foo/qux
+
+
+ {JSON.stringify(params())}
+
+
+ )
+}
diff --git a/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.index.tsx b/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.index.tsx
new file mode 100644
index 00000000000..ee2483e3673
--- /dev/null
+++ b/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.index.tsx
@@ -0,0 +1,19 @@
+import { createFileRoute } from '@tanstack/solid-router'
+
+export const Route = createFileRoute('/non-nested/deep/$baz_/bar/')({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ const params = Route.useParams()
+ return (
+
+
+ Hello deeply nested baz/bar index
+
+
+ {JSON.stringify(params())}
+
+
+ )
+}
diff --git a/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.route.tsx b/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.route.tsx
new file mode 100644
index 00000000000..3c3dd5f386e
--- /dev/null
+++ b/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar.route.tsx
@@ -0,0 +1,16 @@
+import { Outlet, createFileRoute } from '@tanstack/solid-router'
+
+export const Route = createFileRoute('/non-nested/deep/$baz_/bar')({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ return (
+
+
+ Hello deeply nested baz/bar route layout
+
+
+
+ )
+}
diff --git a/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar_.qux.tsx b/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar_.qux.tsx
new file mode 100644
index 00000000000..d172a31e5ef
--- /dev/null
+++ b/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/$baz_.bar_.qux.tsx
@@ -0,0 +1,19 @@
+import { createFileRoute } from '@tanstack/solid-router'
+
+export const Route = createFileRoute('/non-nested/deep/$baz_/bar_/qux')({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ const params = Route.useParams()
+ return (
+
+
+ Hello deeply nested baz/bar/qux
+
+
+ {JSON.stringify(params())}
+
+
+ )
+}
diff --git a/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/route.tsx b/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/route.tsx
new file mode 100644
index 00000000000..164236388ce
--- /dev/null
+++ b/e2e/solid-router/basic-file-based/src/routes/non-nested/deep/route.tsx
@@ -0,0 +1,58 @@
+import { Link, Outlet, createFileRoute } from '@tanstack/solid-router'
+
+export const Route = createFileRoute('/non-nested/deep')({
+ component: RouteComponent,
+})
+
+function RouteComponent() {
+ return (
+
+
+ Hello non-nested deep layout
+
+
+
+ To Baz
+
+
+ To named baz/bar
+
+
+ To named baz/bar/foo
+
+
+ To named baz/bar/foo/qux
+
+
+ To named baz/bar/qux
+
+
+
+
+ )
+}
diff --git a/e2e/solid-router/basic-file-based/tests/non-nested-paths.spec.ts b/e2e/solid-router/basic-file-based/tests/non-nested-paths.spec.ts
index 9682eb84885..8c0e0e1a1ec 100644
--- a/e2e/solid-router/basic-file-based/tests/non-nested-paths.spec.ts
+++ b/e2e/solid-router/basic-file-based/tests/non-nested-paths.spec.ts
@@ -197,3 +197,170 @@ test.describe('Non-nested paths', () => {
},
)
})
+
+test.describe('Deeply nested non-nested paths', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto('/non-nested/deep')
+ await page.waitForURL('/non-nested/deep')
+ })
+
+ test('It should nest nested paths 1 level deep', async ({ page }) => {
+ const rootRouteHeading = page.getByTestId(
+ `non-nested-deep-root-route-heading`,
+ )
+
+ await expect(rootRouteHeading).toBeVisible()
+
+ const bazLink = page.getByTestId('to-deep-baz')
+ await bazLink.click()
+ await page.waitForURL('/non-nested/deep/baz')
+ const bazRouteHeading = page.getByTestId(
+ 'non-nested-deep-baz-route-heading',
+ )
+ const bazIndexHeading = page.getByTestId(
+ 'non-nested-deep-baz-index-heading',
+ )
+ const bazIndexParams = page.getByTestId('non-nested-deep-baz-index-param')
+
+ await expect(bazRouteHeading).toBeVisible()
+ await expect(bazIndexHeading).toBeVisible()
+ expect(await bazIndexParams.innerText()).toBe(
+ JSON.stringify({ baz: 'baz' }),
+ )
+ })
+
+ test('It should not nest non-nested paths 1 level deep', async ({ page }) => {
+ const rootRouteHeading = page.getByTestId(
+ `non-nested-deep-root-route-heading`,
+ )
+
+ await expect(rootRouteHeading).toBeVisible()
+ const bazBarLink = page.getByTestId('to-deep-baz-bar')
+
+ await bazBarLink.click()
+ await page.waitForURL('/non-nested/deep/baz-bar/bar')
+ const bazRouteHeading = page.getByTestId(
+ 'non-nested-deep-baz-route-heading',
+ )
+ const bazBarRouteHeading = page.getByTestId(
+ 'non-nested-deep-baz-bar-route-heading',
+ )
+ const bazBarIndexHeading = page.getByTestId(
+ 'non-nested-deep-baz-bar-index-heading',
+ )
+ const bazBarIndexParams = page.getByTestId(
+ 'non-nested-deep-baz-bar-index-param',
+ )
+
+ await expect(bazRouteHeading).not.toBeVisible()
+ await expect(bazBarRouteHeading).toBeVisible()
+ await expect(bazBarIndexHeading).toBeVisible()
+ expect(await bazBarIndexParams.innerText()).toBe(
+ JSON.stringify({ baz: 'baz-bar' }),
+ )
+ })
+
+ test('It should not nest non-nested paths 2 levels deep', async ({
+ page,
+ }) => {
+ const rootRouteHeading = page.getByTestId(
+ `non-nested-deep-root-route-heading`,
+ )
+
+ await expect(rootRouteHeading).toBeVisible()
+
+ const bazBarQuxLink = page.getByTestId('to-deep-baz-bar-qux')
+ await bazBarQuxLink.click()
+
+ await page.waitForURL('/non-nested/deep/baz-bar-qux/bar/qux')
+ const bazRouteHeading = page.getByTestId(
+ 'non-nested-deep-baz-route-heading',
+ )
+ const bazBarRouteHeading = page.getByTestId(
+ 'non-nested-deep-baz-bar-route-heading',
+ )
+ const bazBarQuxHeading = page.getByTestId(
+ 'non-nested-deep-baz-bar-qux-heading',
+ )
+ const bazBarQuxParams = page.getByTestId(
+ 'non-nested-deep-baz-bar-qux-param',
+ )
+
+ await expect(bazRouteHeading).not.toBeVisible()
+ await expect(bazBarRouteHeading).not.toBeVisible()
+ await expect(bazBarQuxHeading).toBeVisible()
+ await expect(bazBarQuxParams).toBeVisible()
+ expect(await bazBarQuxParams.innerText()).toBe(
+ JSON.stringify({ baz: 'baz-bar-qux' }),
+ )
+ })
+
+ test('It should nest and un-nest non-nested across paths multiple levels deep', async ({
+ page,
+ }) => {
+ const rootRouteHeading = page.getByTestId(
+ `non-nested-deep-root-route-heading`,
+ )
+
+ await expect(rootRouteHeading).toBeVisible()
+
+ const bazBarFooLink = page.getByTestId('to-deep-baz-bar-foo')
+ await bazBarFooLink.click()
+
+ await page.waitForURL('/non-nested/deep/baz-bar/bar/foo')
+
+ const bazRouteHeading = page.getByTestId(
+ 'non-nested-deep-baz-route-heading',
+ )
+ const bazBarRouteHeading = page.getByTestId(
+ 'non-nested-deep-baz-bar-route-heading',
+ )
+ const bazBarFooRouteHeading = page.getByTestId(
+ 'non-nested-deep-baz-bar-foo-route-heading',
+ )
+ const bazBarFooIndexHeading = page.getByTestId(
+ 'non-nested-deep-baz-bar-foo-index-heading',
+ )
+ const bazBarFooIndexParams = page.getByTestId(
+ 'non-nested-deep-baz-bar-foo-index-param',
+ )
+
+ await expect(bazRouteHeading).not.toBeVisible()
+ await expect(bazBarRouteHeading).toBeVisible()
+ await expect(bazBarFooRouteHeading).toBeVisible()
+ await expect(bazBarFooIndexHeading).toBeVisible()
+ await expect(bazBarFooIndexParams).toBeVisible()
+ expect(await bazBarFooIndexParams.innerText()).toBe(
+ JSON.stringify({ baz: 'baz-bar', foo: 'foo' }),
+ )
+
+ const bazBarFooQuxLink = page.getByTestId('to-deep-baz-bar-foo-qux')
+ await bazBarFooQuxLink.click()
+ await page.waitForURL('/non-nested/deep/baz-bar-qux/bar/foo/qux')
+
+ const bazBarFooQuxHeading = page.getByTestId(
+ 'non-nested-deep-baz-bar-foo-qux-heading',
+ )
+ const bazBarFooQuxParams = page.getByTestId(
+ 'non-nested-deep-baz-bar-foo-qux-param',
+ )
+
+ await expect(bazRouteHeading).not.toBeVisible()
+ await expect(bazBarRouteHeading).toBeVisible()
+ await expect(bazBarFooRouteHeading).not.toBeVisible()
+ await expect(bazBarFooQuxHeading).toBeVisible()
+ await expect(bazBarFooQuxParams).toBeVisible()
+
+ if (useExperimentalNonNestedRoutes) {
+ expect(await bazBarFooQuxParams.innerText()).toBe(
+ JSON.stringify({ baz: 'baz-bar-qux', foo: 'foo' }),
+ )
+ } else {
+ // this is a bug with named path params and non-nested paths
+ // that is resolved in the new experimental flag
+ expect(await bazBarFooQuxParams.innerText()).toBe(
+ JSON.stringify({ baz: 'baz-bar', foo: 'foo' }),
+ )
+ }
+ })
+})
diff --git a/packages/router-generator/src/filesystem/physical/getRouteNodes.ts b/packages/router-generator/src/filesystem/physical/getRouteNodes.ts
index 949c93302e1..892e0095347 100644
--- a/packages/router-generator/src/filesystem/physical/getRouteNodes.ts
+++ b/packages/router-generator/src/filesystem/physical/getRouteNodes.ts
@@ -134,14 +134,19 @@ export async function getRouteNodes(
const filePathNoExt = removeExt(filePath)
const {
routePath: initialRoutePath,
- originalRoutePath,
+ originalRoutePath: initialOriginalRoutePath,
isExperimentalNonNestedRoute,
} = determineInitialRoutePath(filePathNoExt, config)
let routePath = initialRoutePath
+ let originalRoutePath = initialOriginalRoutePath
if (routeFilePrefix) {
routePath = routePath.replaceAll(routeFilePrefix, '')
+ originalRoutePath = originalRoutePath.replaceAll(
+ routeFilePrefix,
+ '',
+ )
}
if (disallowedRouteGroupConfiguration.test(dirent.name)) {
@@ -156,6 +161,7 @@ export async function getRouteNodes(
if (routeType === 'lazy') {
routePath = routePath.replace(/\/lazy$/, '')
+ originalRoutePath = originalRoutePath.replace(/\/lazy$/, '')
}
// this check needs to happen after the lazy route has been cleaned up
@@ -186,13 +192,30 @@ export async function getRouteNodes(
'',
)
+ originalRoutePath = originalRoutePath.replace(
+ new RegExp(
+ `/(component|errorComponent|pendingComponent|loader|${config.routeToken}|lazy)$`,
+ ),
+ '',
+ )
+
if (routePath === config.indexToken) {
routePath = '/'
}
+ if (originalRoutePath === config.indexToken) {
+ originalRoutePath = '/'
+ }
+
routePath =
routePath.replace(new RegExp(`/${config.indexToken}$`), '/') || '/'
+ originalRoutePath =
+ originalRoutePath.replace(
+ new RegExp(`/${config.indexToken}$`),
+ '/',
+ ) || '/'
+
routeNodes.push({
filePath,
fullPath,
diff --git a/packages/router-generator/src/utils.ts b/packages/router-generator/src/utils.ts
index 455941ec463..5f497c85440 100644
--- a/packages/router-generator/src/utils.ts
+++ b/packages/router-generator/src/utils.ts
@@ -365,7 +365,7 @@ export function hasParentRoute(
routes: Array,
node: RouteNode,
routePathToCheck: string | undefined,
- originalRoutePathToCheck?: string,
+ originalRoutePathToCheck: string | undefined,
): RouteNode | null {
const getNonNestedSegments = (routePath: string) => {
const regex = /_(?=\/|$)/g
@@ -394,24 +394,24 @@ export function hasParentRoute(
? []
: [...sortedNodes]
- if (node._isExperimentalNonNestedRoute) {
- const nonNestedSegments = getNonNestedSegments(
- originalRoutePathToCheck ?? '',
- )
+ if (node._isExperimentalNonNestedRoute && originalRoutePathToCheck) {
+ const nonNestedSegments = getNonNestedSegments(originalRoutePathToCheck)
for (const route of sortedNodes) {
if (route.routePath === '/') continue
if (
- routePathToCheck.startsWith(`${route.routePath}/`) &&
route._isExperimentalNonNestedRoute &&
- route.routePath !== routePathToCheck
+ route.routePath !== routePathToCheck &&
+ originalRoutePathToCheck.startsWith(`${route.originalRoutePath}/`)
) {
return route
}
if (
- nonNestedSegments.find((seg) => seg === `${route.routePath}_`) ||
+ nonNestedSegments.find(
+ (seg) => seg === `${route.originalRoutePath}_`,
+ ) ||
!(
route._fsRouteType === 'pathless_layout' ||
route._fsRouteType === 'layout' ||
diff --git a/packages/router-generator/tests/generator/flat/routeTree.nonnested.snapshot.ts b/packages/router-generator/tests/generator/flat/routeTree.nonnested.snapshot.ts
index e908079785d..880dddeaf80 100644
--- a/packages/router-generator/tests/generator/flat/routeTree.nonnested.snapshot.ts
+++ b/packages/router-generator/tests/generator/flat/routeTree.nonnested.snapshot.ts
@@ -15,9 +15,13 @@ import { Route as IndexRouteImport } from './routes/index'
import { Route as PostsIndexRouteImport } from './routes/posts.index'
import { Route as BlogIndexRouteImport } from './routes/blog.index'
import { Route as BlogStatsRouteImport } from './routes/blog_.stats'
+import { Route as BlogBlogIdRouteRouteImport } from './routes/blog_.$blogId.route'
import { Route as PostsPostIdIndexRouteImport } from './routes/posts.$postId.index'
import { Route as BlogSlugIndexRouteImport } from './routes/blog.$slug.index'
import { Route as PostsPostIdDeepRouteImport } from './routes/posts.$postId.deep'
+import { Route as BlogBlogIdEditRouteImport } from './routes/blog_.$blogId_.edit'
+import { Route as BlogBlogIdSlugRouteRouteImport } from './routes/blog_.$blogId.$slug.route'
+import { Route as BlogBlogIdSlugBarRouteImport } from './routes/blog_.$blogId.$slug_.bar'
const PostsRouteRoute = PostsRouteRouteImport.update({
id: '/posts',
@@ -49,6 +53,11 @@ const BlogStatsRoute = BlogStatsRouteImport.update({
path: '/blog/stats',
getParentRoute: () => rootRouteImport,
} as any)
+const BlogBlogIdRouteRoute = BlogBlogIdRouteRouteImport.update({
+ id: '/blog/$blogId',
+ path: '/blog/$blogId',
+ getParentRoute: () => rootRouteImport,
+} as any)
const PostsPostIdIndexRoute = PostsPostIdIndexRouteImport.update({
id: '/$postId/',
path: '/$postId/',
@@ -64,38 +73,65 @@ const PostsPostIdDeepRoute = PostsPostIdDeepRouteImport.update({
path: '/$postId/deep',
getParentRoute: () => PostsRouteRoute,
} as any)
+const BlogBlogIdEditRoute = BlogBlogIdEditRouteImport.update({
+ id: '/blog/$blogId/edit',
+ path: '/blog/$blogId/edit',
+ getParentRoute: () => rootRouteImport,
+} as any)
+const BlogBlogIdSlugRouteRoute = BlogBlogIdSlugRouteRouteImport.update({
+ id: '/$slug',
+ path: '/$slug',
+ getParentRoute: () => BlogBlogIdRouteRoute,
+} as any)
+const BlogBlogIdSlugBarRoute = BlogBlogIdSlugBarRouteImport.update({
+ id: '/$slug/bar',
+ path: '/$slug/bar',
+ getParentRoute: () => BlogBlogIdRouteRoute,
+} as any)
export interface FileRoutesByFullPath {
'/': typeof IndexRoute
'/blog': typeof BlogRouteRouteWithChildren
'/posts': typeof PostsRouteRouteWithChildren
+ '/blog/$blogId': typeof BlogBlogIdRouteRouteWithChildren
'/blog/stats': typeof BlogStatsRoute
'/blog/': typeof BlogIndexRoute
'/posts/': typeof PostsIndexRoute
+ '/blog/$blogId/$slug': typeof BlogBlogIdSlugRouteRoute
+ '/blog/$blogId/edit': typeof BlogBlogIdEditRoute
'/posts/$postId/deep': typeof PostsPostIdDeepRoute
'/blog/$slug': typeof BlogSlugIndexRoute
'/posts/$postId': typeof PostsPostIdIndexRoute
+ '/blog/$blogId/$slug/bar': typeof BlogBlogIdSlugBarRoute
}
export interface FileRoutesByTo {
'/': typeof IndexRoute
+ '/blog/$blogId': typeof BlogBlogIdRouteRouteWithChildren
'/blog/stats': typeof BlogStatsRoute
'/blog': typeof BlogIndexRoute
'/posts': typeof PostsIndexRoute
+ '/blog/$blogId/$slug': typeof BlogBlogIdSlugRouteRoute
+ '/blog/$blogId/edit': typeof BlogBlogIdEditRoute
'/posts/$postId/deep': typeof PostsPostIdDeepRoute
'/blog/$slug': typeof BlogSlugIndexRoute
'/posts/$postId': typeof PostsPostIdIndexRoute
+ '/blog/$blogId/$slug/bar': typeof BlogBlogIdSlugBarRoute
}
export interface FileRoutesById {
__root__: typeof rootRouteImport
'/': typeof IndexRoute
'/blog': typeof BlogRouteRouteWithChildren
'/posts': typeof PostsRouteRouteWithChildren
+ '/blog/$blogId': typeof BlogBlogIdRouteRouteWithChildren
'/blog/stats': typeof BlogStatsRoute
'/blog/': typeof BlogIndexRoute
'/posts/': typeof PostsIndexRoute
+ '/blog/$blogId/$slug': typeof BlogBlogIdSlugRouteRoute
+ '/blog/$blogId/edit': typeof BlogBlogIdEditRoute
'/posts/$postId/deep': typeof PostsPostIdDeepRoute
'/blog/$slug/': typeof BlogSlugIndexRoute
'/posts/$postId/': typeof PostsPostIdIndexRoute
+ '/blog/$blogId/$slug/bar': typeof BlogBlogIdSlugBarRoute
}
export interface FileRouteTypes {
fileRoutesByFullPath: FileRoutesByFullPath
@@ -103,39 +139,53 @@ export interface FileRouteTypes {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
| '/blog/stats'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/edit'
| '/posts/$postId/deep'
| '/blog/$slug'
| '/posts/$postId'
+ | '/blog/$blogId/$slug/bar'
fileRoutesByTo: FileRoutesByTo
to:
| '/'
+ | '/blog/$blogId'
| '/blog/stats'
| '/blog'
| '/posts'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/edit'
| '/posts/$postId/deep'
| '/blog/$slug'
| '/posts/$postId'
+ | '/blog/$blogId/$slug/bar'
id:
| '__root__'
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
| '/blog/stats'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/edit'
| '/posts/$postId/deep'
| '/blog/$slug/'
| '/posts/$postId/'
+ | '/blog/$blogId/$slug/bar'
fileRoutesById: FileRoutesById
}
export interface RootRouteChildren {
IndexRoute: typeof IndexRoute
BlogRouteRoute: typeof BlogRouteRouteWithChildren
PostsRouteRoute: typeof PostsRouteRouteWithChildren
+ BlogBlogIdRouteRoute: typeof BlogBlogIdRouteRouteWithChildren
BlogStatsRoute: typeof BlogStatsRoute
+ BlogBlogIdEditRoute: typeof BlogBlogIdEditRoute
}
declare module '@tanstack/react-router' {
@@ -182,6 +232,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof BlogStatsRouteImport
parentRoute: typeof rootRouteImport
}
+ '/blog/$blogId': {
+ id: '/blog/$blogId'
+ path: '/blog/$blogId'
+ fullPath: '/blog/$blogId'
+ preLoaderRoute: typeof BlogBlogIdRouteRouteImport
+ parentRoute: typeof rootRouteImport
+ }
'/posts/$postId/': {
id: '/posts/$postId/'
path: '/$postId'
@@ -203,6 +260,27 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof PostsPostIdDeepRouteImport
parentRoute: typeof PostsRouteRoute
}
+ '/blog/$blogId/edit': {
+ id: '/blog/$blogId/edit'
+ path: '/blog/$blogId/edit'
+ fullPath: '/blog/$blogId/edit'
+ preLoaderRoute: typeof BlogBlogIdEditRouteImport
+ parentRoute: typeof rootRouteImport
+ }
+ '/blog/$blogId/$slug': {
+ id: '/blog/$blogId/$slug'
+ path: '/$slug'
+ fullPath: '/blog/$blogId/$slug'
+ preLoaderRoute: typeof BlogBlogIdSlugRouteRouteImport
+ parentRoute: typeof BlogBlogIdRouteRoute
+ }
+ '/blog/$blogId/$slug/bar': {
+ id: '/blog/$blogId/$slug/bar'
+ path: '/$slug/bar'
+ fullPath: '/blog/$blogId/$slug/bar'
+ preLoaderRoute: typeof BlogBlogIdSlugBarRouteImport
+ parentRoute: typeof BlogBlogIdRouteRoute
+ }
}
}
@@ -236,11 +314,27 @@ const PostsRouteRouteWithChildren = PostsRouteRoute._addFileChildren(
PostsRouteRouteChildren,
)
+interface BlogBlogIdRouteRouteChildren {
+ BlogBlogIdSlugRouteRoute: typeof BlogBlogIdSlugRouteRoute
+ BlogBlogIdSlugBarRoute: typeof BlogBlogIdSlugBarRoute
+}
+
+const BlogBlogIdRouteRouteChildren: BlogBlogIdRouteRouteChildren = {
+ BlogBlogIdSlugRouteRoute: BlogBlogIdSlugRouteRoute,
+ BlogBlogIdSlugBarRoute: BlogBlogIdSlugBarRoute,
+}
+
+const BlogBlogIdRouteRouteWithChildren = BlogBlogIdRouteRoute._addFileChildren(
+ BlogBlogIdRouteRouteChildren,
+)
+
const rootRouteChildren: RootRouteChildren = {
IndexRoute: IndexRoute,
BlogRouteRoute: BlogRouteRouteWithChildren,
PostsRouteRoute: PostsRouteRouteWithChildren,
+ BlogBlogIdRouteRoute: BlogBlogIdRouteRouteWithChildren,
BlogStatsRoute: BlogStatsRoute,
+ BlogBlogIdEditRoute: BlogBlogIdEditRoute,
}
export const routeTree = rootRouteImport
._addFileChildren(rootRouteChildren)
diff --git a/packages/router-generator/tests/generator/flat/routeTree.snapshot.ts b/packages/router-generator/tests/generator/flat/routeTree.snapshot.ts
index e0c0365aa56..abfa5604c96 100644
--- a/packages/router-generator/tests/generator/flat/routeTree.snapshot.ts
+++ b/packages/router-generator/tests/generator/flat/routeTree.snapshot.ts
@@ -15,9 +15,13 @@ import { Route as IndexRouteImport } from './routes/index'
import { Route as PostsIndexRouteImport } from './routes/posts.index'
import { Route as BlogIndexRouteImport } from './routes/blog.index'
import { Route as BlogStatsRouteImport } from './routes/blog_.stats'
+import { Route as BlogBlogIdRouteRouteImport } from './routes/blog_.$blogId.route'
import { Route as PostsPostIdIndexRouteImport } from './routes/posts.$postId.index'
import { Route as BlogSlugIndexRouteImport } from './routes/blog.$slug.index'
import { Route as PostsPostIdDeepRouteImport } from './routes/posts.$postId.deep'
+import { Route as BlogBlogIdEditRouteImport } from './routes/blog_.$blogId_.edit'
+import { Route as BlogBlogIdSlugRouteRouteImport } from './routes/blog_.$blogId.$slug.route'
+import { Route as BlogBlogIdSlugBarRouteImport } from './routes/blog_.$blogId.$slug_.bar'
const PostsRouteRoute = PostsRouteRouteImport.update({
id: '/posts',
@@ -49,6 +53,11 @@ const BlogStatsRoute = BlogStatsRouteImport.update({
path: '/blog/stats',
getParentRoute: () => rootRouteImport,
} as any)
+const BlogBlogIdRouteRoute = BlogBlogIdRouteRouteImport.update({
+ id: '/blog_/$blogId',
+ path: '/blog/$blogId',
+ getParentRoute: () => rootRouteImport,
+} as any)
const PostsPostIdIndexRoute = PostsPostIdIndexRouteImport.update({
id: '/$postId/',
path: '/$postId/',
@@ -64,38 +73,65 @@ const PostsPostIdDeepRoute = PostsPostIdDeepRouteImport.update({
path: '/$postId/deep',
getParentRoute: () => PostsRouteRoute,
} as any)
+const BlogBlogIdEditRoute = BlogBlogIdEditRouteImport.update({
+ id: '/blog_/$blogId_/edit',
+ path: '/blog/$blogId/edit',
+ getParentRoute: () => rootRouteImport,
+} as any)
+const BlogBlogIdSlugRouteRoute = BlogBlogIdSlugRouteRouteImport.update({
+ id: '/$slug',
+ path: '/$slug',
+ getParentRoute: () => BlogBlogIdRouteRoute,
+} as any)
+const BlogBlogIdSlugBarRoute = BlogBlogIdSlugBarRouteImport.update({
+ id: '/$slug_/bar',
+ path: '/$slug/bar',
+ getParentRoute: () => BlogBlogIdRouteRoute,
+} as any)
export interface FileRoutesByFullPath {
'/': typeof IndexRoute
'/blog': typeof BlogRouteRouteWithChildren
'/posts': typeof PostsRouteRouteWithChildren
+ '/blog/$blogId': typeof BlogBlogIdRouteRouteWithChildren
'/blog/stats': typeof BlogStatsRoute
'/blog/': typeof BlogIndexRoute
'/posts/': typeof PostsIndexRoute
+ '/blog/$blogId/$slug': typeof BlogBlogIdSlugRouteRoute
+ '/blog/$blogId/edit': typeof BlogBlogIdEditRoute
'/posts/$postId/deep': typeof PostsPostIdDeepRoute
'/blog/$slug': typeof BlogSlugIndexRoute
'/posts/$postId': typeof PostsPostIdIndexRoute
+ '/blog/$blogId/$slug/bar': typeof BlogBlogIdSlugBarRoute
}
export interface FileRoutesByTo {
'/': typeof IndexRoute
+ '/blog/$blogId': typeof BlogBlogIdRouteRouteWithChildren
'/blog/stats': typeof BlogStatsRoute
'/blog': typeof BlogIndexRoute
'/posts': typeof PostsIndexRoute
+ '/blog/$blogId/$slug': typeof BlogBlogIdSlugRouteRoute
+ '/blog/$blogId/edit': typeof BlogBlogIdEditRoute
'/posts/$postId/deep': typeof PostsPostIdDeepRoute
'/blog/$slug': typeof BlogSlugIndexRoute
'/posts/$postId': typeof PostsPostIdIndexRoute
+ '/blog/$blogId/$slug/bar': typeof BlogBlogIdSlugBarRoute
}
export interface FileRoutesById {
__root__: typeof rootRouteImport
'/': typeof IndexRoute
'/blog': typeof BlogRouteRouteWithChildren
'/posts': typeof PostsRouteRouteWithChildren
+ '/blog_/$blogId': typeof BlogBlogIdRouteRouteWithChildren
'/blog_/stats': typeof BlogStatsRoute
'/blog/': typeof BlogIndexRoute
'/posts/': typeof PostsIndexRoute
+ '/blog_/$blogId/$slug': typeof BlogBlogIdSlugRouteRoute
+ '/blog_/$blogId_/edit': typeof BlogBlogIdEditRoute
'/posts/$postId/deep': typeof PostsPostIdDeepRoute
'/blog/$slug/': typeof BlogSlugIndexRoute
'/posts/$postId/': typeof PostsPostIdIndexRoute
+ '/blog_/$blogId/$slug_/bar': typeof BlogBlogIdSlugBarRoute
}
export interface FileRouteTypes {
fileRoutesByFullPath: FileRoutesByFullPath
@@ -103,39 +139,53 @@ export interface FileRouteTypes {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
| '/blog/stats'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/edit'
| '/posts/$postId/deep'
| '/blog/$slug'
| '/posts/$postId'
+ | '/blog/$blogId/$slug/bar'
fileRoutesByTo: FileRoutesByTo
to:
| '/'
+ | '/blog/$blogId'
| '/blog/stats'
| '/blog'
| '/posts'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/edit'
| '/posts/$postId/deep'
| '/blog/$slug'
| '/posts/$postId'
+ | '/blog/$blogId/$slug/bar'
id:
| '__root__'
| '/'
| '/blog'
| '/posts'
+ | '/blog_/$blogId'
| '/blog_/stats'
| '/blog/'
| '/posts/'
+ | '/blog_/$blogId/$slug'
+ | '/blog_/$blogId_/edit'
| '/posts/$postId/deep'
| '/blog/$slug/'
| '/posts/$postId/'
+ | '/blog_/$blogId/$slug_/bar'
fileRoutesById: FileRoutesById
}
export interface RootRouteChildren {
IndexRoute: typeof IndexRoute
BlogRouteRoute: typeof BlogRouteRouteWithChildren
PostsRouteRoute: typeof PostsRouteRouteWithChildren
+ BlogBlogIdRouteRoute: typeof BlogBlogIdRouteRouteWithChildren
BlogStatsRoute: typeof BlogStatsRoute
+ BlogBlogIdEditRoute: typeof BlogBlogIdEditRoute
}
declare module '@tanstack/react-router' {
@@ -182,6 +232,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof BlogStatsRouteImport
parentRoute: typeof rootRouteImport
}
+ '/blog_/$blogId': {
+ id: '/blog_/$blogId'
+ path: '/blog/$blogId'
+ fullPath: '/blog/$blogId'
+ preLoaderRoute: typeof BlogBlogIdRouteRouteImport
+ parentRoute: typeof rootRouteImport
+ }
'/posts/$postId/': {
id: '/posts/$postId/'
path: '/$postId'
@@ -203,6 +260,27 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof PostsPostIdDeepRouteImport
parentRoute: typeof PostsRouteRoute
}
+ '/blog_/$blogId_/edit': {
+ id: '/blog_/$blogId_/edit'
+ path: '/blog/$blogId/edit'
+ fullPath: '/blog/$blogId/edit'
+ preLoaderRoute: typeof BlogBlogIdEditRouteImport
+ parentRoute: typeof rootRouteImport
+ }
+ '/blog_/$blogId/$slug': {
+ id: '/blog_/$blogId/$slug'
+ path: '/$slug'
+ fullPath: '/blog/$blogId/$slug'
+ preLoaderRoute: typeof BlogBlogIdSlugRouteRouteImport
+ parentRoute: typeof BlogBlogIdRouteRoute
+ }
+ '/blog_/$blogId/$slug_/bar': {
+ id: '/blog_/$blogId/$slug_/bar'
+ path: '/$slug/bar'
+ fullPath: '/blog/$blogId/$slug/bar'
+ preLoaderRoute: typeof BlogBlogIdSlugBarRouteImport
+ parentRoute: typeof BlogBlogIdRouteRoute
+ }
}
}
@@ -236,11 +314,27 @@ const PostsRouteRouteWithChildren = PostsRouteRoute._addFileChildren(
PostsRouteRouteChildren,
)
+interface BlogBlogIdRouteRouteChildren {
+ BlogBlogIdSlugRouteRoute: typeof BlogBlogIdSlugRouteRoute
+ BlogBlogIdSlugBarRoute: typeof BlogBlogIdSlugBarRoute
+}
+
+const BlogBlogIdRouteRouteChildren: BlogBlogIdRouteRouteChildren = {
+ BlogBlogIdSlugRouteRoute: BlogBlogIdSlugRouteRoute,
+ BlogBlogIdSlugBarRoute: BlogBlogIdSlugBarRoute,
+}
+
+const BlogBlogIdRouteRouteWithChildren = BlogBlogIdRouteRoute._addFileChildren(
+ BlogBlogIdRouteRouteChildren,
+)
+
const rootRouteChildren: RootRouteChildren = {
IndexRoute: IndexRoute,
BlogRouteRoute: BlogRouteRouteWithChildren,
PostsRouteRoute: PostsRouteRouteWithChildren,
+ BlogBlogIdRouteRoute: BlogBlogIdRouteRouteWithChildren,
BlogStatsRoute: BlogStatsRoute,
+ BlogBlogIdEditRoute: BlogBlogIdEditRoute,
}
export const routeTree = rootRouteImport
._addFileChildren(rootRouteChildren)
diff --git a/packages/router-generator/tests/generator/flat/routes/blog_.$blogId.$slug.route.tsx b/packages/router-generator/tests/generator/flat/routes/blog_.$blogId.$slug.route.tsx
new file mode 100644
index 00000000000..b8f5b794a45
--- /dev/null
+++ b/packages/router-generator/tests/generator/flat/routes/blog_.$blogId.$slug.route.tsx
@@ -0,0 +1,3 @@
+import { createFileRoute } from '@tanstack/react-router'
+// @ts-nocheck
+export const Route = createFileRoute('/blog_/$blogId/$slug')()
diff --git a/packages/router-generator/tests/generator/flat/routes/blog_.$blogId.$slug_.bar.tsx b/packages/router-generator/tests/generator/flat/routes/blog_.$blogId.$slug_.bar.tsx
new file mode 100644
index 00000000000..7006a4d7f60
--- /dev/null
+++ b/packages/router-generator/tests/generator/flat/routes/blog_.$blogId.$slug_.bar.tsx
@@ -0,0 +1,3 @@
+import { createFileRoute } from '@tanstack/react-router'
+// @ts-nocheck
+export const Route = createFileRoute('/blog_/$blogId/$slug_/bar')()
diff --git a/packages/router-generator/tests/generator/flat/routes/blog_.$blogId.route.tsx b/packages/router-generator/tests/generator/flat/routes/blog_.$blogId.route.tsx
new file mode 100644
index 00000000000..408ad5d3a0c
--- /dev/null
+++ b/packages/router-generator/tests/generator/flat/routes/blog_.$blogId.route.tsx
@@ -0,0 +1,3 @@
+import { createFileRoute } from '@tanstack/react-router'
+// @ts-nocheck
+export const Route = createFileRoute('/blog_/$blogId')()
diff --git a/packages/router-generator/tests/generator/flat/routes/blog_.$blogId_.edit.tsx b/packages/router-generator/tests/generator/flat/routes/blog_.$blogId_.edit.tsx
new file mode 100644
index 00000000000..922613bfca7
--- /dev/null
+++ b/packages/router-generator/tests/generator/flat/routes/blog_.$blogId_.edit.tsx
@@ -0,0 +1,3 @@
+import { createFileRoute } from '@tanstack/react-router'
+// @ts-nocheck
+export const Route = createFileRoute('/blog_/$blogId_/edit')()
diff --git a/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/routeTree.nonnested.snapshot.ts b/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/routeTree.nonnested.snapshot.ts
index fa3545870a9..6d0d5ac00ba 100644
--- a/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/routeTree.nonnested.snapshot.ts
+++ b/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/routeTree.nonnested.snapshot.ts
@@ -18,8 +18,12 @@ import { Route as PostsIndexRouteImport } from './routes/posts/index'
import { Route as BlogIndexRouteImport } from './routes/blog/index'
import { Route as BlogStatsRouteImport } from './routes/blog_/stats'
import { Route as BlogSlugRouteImport } from './routes/blog/$slug'
+import { Route as BlogBlogIdRouteRouteImport } from './routes/blog_/$blogId/route'
import { Route as PostsPostIdIndexRouteImport } from './routes/posts/$postId/index'
import { Route as PostsPostIdDeepRouteImport } from './routes/posts/$postId/deep'
+import { Route as BlogBlogIdEditRouteImport } from './routes/blog_/$blogId_/edit'
+import { Route as BlogBlogIdSlugRouteRouteImport } from './routes/blog_/$blogId/$slug/route'
+import { Route as BlogBlogIdSlugBarRouteImport } from './routes/blog_/$blogId/$slug_/bar'
const PostsRouteRoute = PostsRouteRouteImport.update({
id: '/posts',
@@ -56,6 +60,11 @@ const BlogSlugRoute = BlogSlugRouteImport.update({
path: '/$slug',
getParentRoute: () => BlogRouteRoute,
} as any)
+const BlogBlogIdRouteRoute = BlogBlogIdRouteRouteImport.update({
+ id: '/blog/$blogId',
+ path: '/blog/$blogId',
+ getParentRoute: () => rootRouteImport,
+} as any)
const PostsPostIdIndexRoute = PostsPostIdIndexRouteImport.update({
id: '/$postId/',
path: '/$postId/',
@@ -66,38 +75,65 @@ const PostsPostIdDeepRoute = PostsPostIdDeepRouteImport.update({
path: '/$postId/deep',
getParentRoute: () => PostsRouteRoute,
} as any)
+const BlogBlogIdEditRoute = BlogBlogIdEditRouteImport.update({
+ id: '/blog/$blogId/edit',
+ path: '/blog/$blogId/edit',
+ getParentRoute: () => rootRouteImport,
+} as any)
+const BlogBlogIdSlugRouteRoute = BlogBlogIdSlugRouteRouteImport.update({
+ id: '/$slug',
+ path: '/$slug',
+ getParentRoute: () => BlogBlogIdRouteRoute,
+} as any)
+const BlogBlogIdSlugBarRoute = BlogBlogIdSlugBarRouteImport.update({
+ id: '/$slug/bar',
+ path: '/$slug/bar',
+ getParentRoute: () => BlogBlogIdRouteRoute,
+} as any)
export interface FileRoutesByFullPath {
'/': typeof IndexRoute
'/blog': typeof BlogRouteRouteWithChildren
'/posts': typeof PostsRouteRouteWithChildren
+ '/blog/$blogId': typeof BlogBlogIdRouteRouteWithChildren
'/blog/$slug': typeof BlogSlugRoute
'/blog/stats': typeof BlogStatsRoute
'/blog/': typeof BlogIndexRoute
'/posts/': typeof PostsIndexRoute
+ '/blog/$blogId/$slug': typeof BlogBlogIdSlugRouteRoute
+ '/blog/$blogId/edit': typeof BlogBlogIdEditRoute
'/posts/$postId/deep': typeof PostsPostIdDeepRoute
'/posts/$postId': typeof PostsPostIdIndexRoute
+ '/blog/$blogId/$slug/bar': typeof BlogBlogIdSlugBarRoute
}
export interface FileRoutesByTo {
'/': typeof IndexRoute
+ '/blog/$blogId': typeof BlogBlogIdRouteRouteWithChildren
'/blog/$slug': typeof BlogSlugRoute
'/blog/stats': typeof BlogStatsRoute
'/blog': typeof BlogIndexRoute
'/posts': typeof PostsIndexRoute
+ '/blog/$blogId/$slug': typeof BlogBlogIdSlugRouteRoute
+ '/blog/$blogId/edit': typeof BlogBlogIdEditRoute
'/posts/$postId/deep': typeof PostsPostIdDeepRoute
'/posts/$postId': typeof PostsPostIdIndexRoute
+ '/blog/$blogId/$slug/bar': typeof BlogBlogIdSlugBarRoute
}
export interface FileRoutesById {
__root__: typeof rootRouteImport
'/': typeof IndexRoute
'/blog': typeof BlogRouteRouteWithChildren
'/posts': typeof PostsRouteRouteWithChildren
+ '/blog/$blogId': typeof BlogBlogIdRouteRouteWithChildren
'/blog/$slug': typeof BlogSlugRoute
'/blog/stats': typeof BlogStatsRoute
'/blog/': typeof BlogIndexRoute
'/posts/': typeof PostsIndexRoute
+ '/blog/$blogId/$slug': typeof BlogBlogIdSlugRouteRoute
+ '/blog/$blogId/edit': typeof BlogBlogIdEditRoute
'/posts/$postId/deep': typeof PostsPostIdDeepRoute
'/posts/$postId/': typeof PostsPostIdIndexRoute
+ '/blog/$blogId/$slug/bar': typeof BlogBlogIdSlugBarRoute
}
export interface FileRouteTypes {
fileRoutesByFullPath: FileRoutesByFullPath
@@ -105,39 +141,53 @@ export interface FileRouteTypes {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/edit'
| '/posts/$postId/deep'
| '/posts/$postId'
+ | '/blog/$blogId/$slug/bar'
fileRoutesByTo: FileRoutesByTo
to:
| '/'
+ | '/blog/$blogId'
| '/blog/$slug'
| '/blog/stats'
| '/blog'
| '/posts'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/edit'
| '/posts/$postId/deep'
| '/posts/$postId'
+ | '/blog/$blogId/$slug/bar'
id:
| '__root__'
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/edit'
| '/posts/$postId/deep'
| '/posts/$postId/'
+ | '/blog/$blogId/$slug/bar'
fileRoutesById: FileRoutesById
}
export interface RootRouteChildren {
IndexRoute: typeof IndexRoute
BlogRouteRoute: typeof BlogRouteRouteWithChildren
PostsRouteRoute: typeof PostsRouteRouteWithChildren
+ BlogBlogIdRouteRoute: typeof BlogBlogIdRouteRouteWithChildren
BlogStatsRoute: typeof BlogStatsRoute
+ BlogBlogIdEditRoute: typeof BlogBlogIdEditRoute
}
declare module '@tanstack/react-router' {
@@ -191,6 +241,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof BlogSlugRouteImport
parentRoute: typeof BlogRouteRoute
}
+ '/blog/$blogId': {
+ id: '/blog/$blogId'
+ path: '/blog/$blogId'
+ fullPath: '/blog/$blogId'
+ preLoaderRoute: typeof BlogBlogIdRouteRouteImport
+ parentRoute: typeof rootRouteImport
+ }
'/posts/$postId/': {
id: '/posts/$postId/'
path: '/$postId'
@@ -205,6 +262,27 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof PostsPostIdDeepRouteImport
parentRoute: typeof PostsRouteRoute
}
+ '/blog/$blogId/edit': {
+ id: '/blog/$blogId/edit'
+ path: '/blog/$blogId/edit'
+ fullPath: '/blog/$blogId/edit'
+ preLoaderRoute: typeof BlogBlogIdEditRouteImport
+ parentRoute: typeof rootRouteImport
+ }
+ '/blog/$blogId/$slug': {
+ id: '/blog/$blogId/$slug'
+ path: '/$slug'
+ fullPath: '/blog/$blogId/$slug'
+ preLoaderRoute: typeof BlogBlogIdSlugRouteRouteImport
+ parentRoute: typeof BlogBlogIdRouteRoute
+ }
+ '/blog/$blogId/$slug/bar': {
+ id: '/blog/$blogId/$slug/bar'
+ path: '/$slug/bar'
+ fullPath: '/blog/$blogId/$slug/bar'
+ preLoaderRoute: typeof BlogBlogIdSlugBarRouteImport
+ parentRoute: typeof BlogBlogIdRouteRoute
+ }
}
}
@@ -235,6 +313,15 @@ declare module './routes/posts/route' {
FileRoutesByPath['/posts']['fullPath']
>
}
+declare module './routes/blog_/$blogId/route' {
+ const createFileRoute: CreateFileRoute<
+ '/blog/$blogId',
+ FileRoutesByPath['/blog/$blogId']['parentRoute'],
+ FileRoutesByPath['/blog/$blogId']['id'],
+ FileRoutesByPath['/blog/$blogId']['path'],
+ FileRoutesByPath['/blog/$blogId']['fullPath']
+ >
+}
declare module './routes/blog/$slug' {
const createFileRoute: CreateFileRoute<
'/blog/$slug',
@@ -271,6 +358,24 @@ declare module './routes/posts/index' {
FileRoutesByPath['/posts/']['fullPath']
>
}
+declare module './routes/blog_/$blogId/$slug/route' {
+ const createFileRoute: CreateFileRoute<
+ '/blog/$blogId/$slug',
+ FileRoutesByPath['/blog/$blogId/$slug']['parentRoute'],
+ FileRoutesByPath['/blog/$blogId/$slug']['id'],
+ FileRoutesByPath['/blog/$blogId/$slug']['path'],
+ FileRoutesByPath['/blog/$blogId/$slug']['fullPath']
+ >
+}
+declare module './routes/blog_/$blogId_/edit' {
+ const createFileRoute: CreateFileRoute<
+ '/blog/$blogId/edit',
+ FileRoutesByPath['/blog/$blogId/edit']['parentRoute'],
+ FileRoutesByPath['/blog/$blogId/edit']['id'],
+ FileRoutesByPath['/blog/$blogId/edit']['path'],
+ FileRoutesByPath['/blog/$blogId/edit']['fullPath']
+ >
+}
declare module './routes/posts/$postId/deep' {
const createFileRoute: CreateFileRoute<
'/posts/$postId/deep',
@@ -289,6 +394,15 @@ declare module './routes/posts/$postId/index' {
FileRoutesByPath['/posts/$postId/']['fullPath']
>
}
+declare module './routes/blog_/$blogId/$slug_/bar' {
+ const createFileRoute: CreateFileRoute<
+ '/blog/$blogId/$slug/bar',
+ FileRoutesByPath['/blog/$blogId/$slug/bar']['parentRoute'],
+ FileRoutesByPath['/blog/$blogId/$slug/bar']['id'],
+ FileRoutesByPath['/blog/$blogId/$slug/bar']['path'],
+ FileRoutesByPath['/blog/$blogId/$slug/bar']['fullPath']
+ >
+}
interface BlogRouteRouteChildren {
BlogSlugRoute: typeof BlogSlugRoute
@@ -320,11 +434,27 @@ const PostsRouteRouteWithChildren = PostsRouteRoute._addFileChildren(
PostsRouteRouteChildren,
)
+interface BlogBlogIdRouteRouteChildren {
+ BlogBlogIdSlugRouteRoute: typeof BlogBlogIdSlugRouteRoute
+ BlogBlogIdSlugBarRoute: typeof BlogBlogIdSlugBarRoute
+}
+
+const BlogBlogIdRouteRouteChildren: BlogBlogIdRouteRouteChildren = {
+ BlogBlogIdSlugRouteRoute: BlogBlogIdSlugRouteRoute,
+ BlogBlogIdSlugBarRoute: BlogBlogIdSlugBarRoute,
+}
+
+const BlogBlogIdRouteRouteWithChildren = BlogBlogIdRouteRoute._addFileChildren(
+ BlogBlogIdRouteRouteChildren,
+)
+
const rootRouteChildren: RootRouteChildren = {
IndexRoute: IndexRoute,
BlogRouteRoute: BlogRouteRouteWithChildren,
PostsRouteRoute: PostsRouteRouteWithChildren,
+ BlogBlogIdRouteRoute: BlogBlogIdRouteRouteWithChildren,
BlogStatsRoute: BlogStatsRoute,
+ BlogBlogIdEditRoute: BlogBlogIdEditRoute,
}
export const routeTree = rootRouteImport
._addFileChildren(rootRouteChildren)
diff --git a/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/routeTree.snapshot.ts b/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/routeTree.snapshot.ts
index cfd2094de3d..b7094626b90 100644
--- a/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/routeTree.snapshot.ts
+++ b/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/routeTree.snapshot.ts
@@ -18,8 +18,12 @@ import { Route as PostsIndexRouteImport } from './routes/posts/index'
import { Route as BlogIndexRouteImport } from './routes/blog/index'
import { Route as BlogStatsRouteImport } from './routes/blog_/stats'
import { Route as BlogSlugRouteImport } from './routes/blog/$slug'
+import { Route as BlogBlogIdRouteRouteImport } from './routes/blog_/$blogId/route'
import { Route as PostsPostIdIndexRouteImport } from './routes/posts/$postId/index'
import { Route as PostsPostIdDeepRouteImport } from './routes/posts/$postId/deep'
+import { Route as BlogBlogIdEditRouteImport } from './routes/blog_/$blogId_/edit'
+import { Route as BlogBlogIdSlugRouteRouteImport } from './routes/blog_/$blogId/$slug/route'
+import { Route as BlogBlogIdSlugBarRouteImport } from './routes/blog_/$blogId/$slug_/bar'
const PostsRouteRoute = PostsRouteRouteImport.update({
id: '/posts',
@@ -56,6 +60,11 @@ const BlogSlugRoute = BlogSlugRouteImport.update({
path: '/$slug',
getParentRoute: () => BlogRouteRoute,
} as any)
+const BlogBlogIdRouteRoute = BlogBlogIdRouteRouteImport.update({
+ id: '/blog_/$blogId',
+ path: '/blog/$blogId',
+ getParentRoute: () => rootRouteImport,
+} as any)
const PostsPostIdIndexRoute = PostsPostIdIndexRouteImport.update({
id: '/$postId/',
path: '/$postId/',
@@ -66,38 +75,65 @@ const PostsPostIdDeepRoute = PostsPostIdDeepRouteImport.update({
path: '/$postId/deep',
getParentRoute: () => PostsRouteRoute,
} as any)
+const BlogBlogIdEditRoute = BlogBlogIdEditRouteImport.update({
+ id: '/blog_/$blogId_/edit',
+ path: '/blog/$blogId/edit',
+ getParentRoute: () => rootRouteImport,
+} as any)
+const BlogBlogIdSlugRouteRoute = BlogBlogIdSlugRouteRouteImport.update({
+ id: '/$slug',
+ path: '/$slug',
+ getParentRoute: () => BlogBlogIdRouteRoute,
+} as any)
+const BlogBlogIdSlugBarRoute = BlogBlogIdSlugBarRouteImport.update({
+ id: '/$slug_/bar',
+ path: '/$slug/bar',
+ getParentRoute: () => BlogBlogIdRouteRoute,
+} as any)
export interface FileRoutesByFullPath {
'/': typeof IndexRoute
'/blog': typeof BlogRouteRouteWithChildren
'/posts': typeof PostsRouteRouteWithChildren
+ '/blog/$blogId': typeof BlogBlogIdRouteRouteWithChildren
'/blog/$slug': typeof BlogSlugRoute
'/blog/stats': typeof BlogStatsRoute
'/blog/': typeof BlogIndexRoute
'/posts/': typeof PostsIndexRoute
+ '/blog/$blogId/$slug': typeof BlogBlogIdSlugRouteRoute
+ '/blog/$blogId/edit': typeof BlogBlogIdEditRoute
'/posts/$postId/deep': typeof PostsPostIdDeepRoute
'/posts/$postId': typeof PostsPostIdIndexRoute
+ '/blog/$blogId/$slug/bar': typeof BlogBlogIdSlugBarRoute
}
export interface FileRoutesByTo {
'/': typeof IndexRoute
+ '/blog/$blogId': typeof BlogBlogIdRouteRouteWithChildren
'/blog/$slug': typeof BlogSlugRoute
'/blog/stats': typeof BlogStatsRoute
'/blog': typeof BlogIndexRoute
'/posts': typeof PostsIndexRoute
+ '/blog/$blogId/$slug': typeof BlogBlogIdSlugRouteRoute
+ '/blog/$blogId/edit': typeof BlogBlogIdEditRoute
'/posts/$postId/deep': typeof PostsPostIdDeepRoute
'/posts/$postId': typeof PostsPostIdIndexRoute
+ '/blog/$blogId/$slug/bar': typeof BlogBlogIdSlugBarRoute
}
export interface FileRoutesById {
__root__: typeof rootRouteImport
'/': typeof IndexRoute
'/blog': typeof BlogRouteRouteWithChildren
'/posts': typeof PostsRouteRouteWithChildren
+ '/blog_/$blogId': typeof BlogBlogIdRouteRouteWithChildren
'/blog/$slug': typeof BlogSlugRoute
'/blog_/stats': typeof BlogStatsRoute
'/blog/': typeof BlogIndexRoute
'/posts/': typeof PostsIndexRoute
+ '/blog_/$blogId/$slug': typeof BlogBlogIdSlugRouteRoute
+ '/blog_/$blogId_/edit': typeof BlogBlogIdEditRoute
'/posts/$postId/deep': typeof PostsPostIdDeepRoute
'/posts/$postId/': typeof PostsPostIdIndexRoute
+ '/blog_/$blogId/$slug_/bar': typeof BlogBlogIdSlugBarRoute
}
export interface FileRouteTypes {
fileRoutesByFullPath: FileRoutesByFullPath
@@ -105,39 +141,53 @@ export interface FileRouteTypes {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/edit'
| '/posts/$postId/deep'
| '/posts/$postId'
+ | '/blog/$blogId/$slug/bar'
fileRoutesByTo: FileRoutesByTo
to:
| '/'
+ | '/blog/$blogId'
| '/blog/$slug'
| '/blog/stats'
| '/blog'
| '/posts'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/edit'
| '/posts/$postId/deep'
| '/posts/$postId'
+ | '/blog/$blogId/$slug/bar'
id:
| '__root__'
| '/'
| '/blog'
| '/posts'
+ | '/blog_/$blogId'
| '/blog/$slug'
| '/blog_/stats'
| '/blog/'
| '/posts/'
+ | '/blog_/$blogId/$slug'
+ | '/blog_/$blogId_/edit'
| '/posts/$postId/deep'
| '/posts/$postId/'
+ | '/blog_/$blogId/$slug_/bar'
fileRoutesById: FileRoutesById
}
export interface RootRouteChildren {
IndexRoute: typeof IndexRoute
BlogRouteRoute: typeof BlogRouteRouteWithChildren
PostsRouteRoute: typeof PostsRouteRouteWithChildren
+ BlogBlogIdRouteRoute: typeof BlogBlogIdRouteRouteWithChildren
BlogStatsRoute: typeof BlogStatsRoute
+ BlogBlogIdEditRoute: typeof BlogBlogIdEditRoute
}
declare module '@tanstack/react-router' {
@@ -191,6 +241,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof BlogSlugRouteImport
parentRoute: typeof BlogRouteRoute
}
+ '/blog_/$blogId': {
+ id: '/blog_/$blogId'
+ path: '/blog/$blogId'
+ fullPath: '/blog/$blogId'
+ preLoaderRoute: typeof BlogBlogIdRouteRouteImport
+ parentRoute: typeof rootRouteImport
+ }
'/posts/$postId/': {
id: '/posts/$postId/'
path: '/$postId'
@@ -205,6 +262,27 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof PostsPostIdDeepRouteImport
parentRoute: typeof PostsRouteRoute
}
+ '/blog_/$blogId_/edit': {
+ id: '/blog_/$blogId_/edit'
+ path: '/blog/$blogId/edit'
+ fullPath: '/blog/$blogId/edit'
+ preLoaderRoute: typeof BlogBlogIdEditRouteImport
+ parentRoute: typeof rootRouteImport
+ }
+ '/blog_/$blogId/$slug': {
+ id: '/blog_/$blogId/$slug'
+ path: '/$slug'
+ fullPath: '/blog/$blogId/$slug'
+ preLoaderRoute: typeof BlogBlogIdSlugRouteRouteImport
+ parentRoute: typeof BlogBlogIdRouteRoute
+ }
+ '/blog_/$blogId/$slug_/bar': {
+ id: '/blog_/$blogId/$slug_/bar'
+ path: '/$slug/bar'
+ fullPath: '/blog/$blogId/$slug/bar'
+ preLoaderRoute: typeof BlogBlogIdSlugBarRouteImport
+ parentRoute: typeof BlogBlogIdRouteRoute
+ }
}
}
@@ -235,6 +313,15 @@ declare module './routes/posts/route' {
FileRoutesByPath['/posts']['fullPath']
>
}
+declare module './routes/blog_/$blogId/route' {
+ const createFileRoute: CreateFileRoute<
+ '/blog_/$blogId',
+ FileRoutesByPath['/blog_/$blogId']['parentRoute'],
+ FileRoutesByPath['/blog_/$blogId']['id'],
+ FileRoutesByPath['/blog_/$blogId']['path'],
+ FileRoutesByPath['/blog_/$blogId']['fullPath']
+ >
+}
declare module './routes/blog/$slug' {
const createFileRoute: CreateFileRoute<
'/blog/$slug',
@@ -271,6 +358,24 @@ declare module './routes/posts/index' {
FileRoutesByPath['/posts/']['fullPath']
>
}
+declare module './routes/blog_/$blogId/$slug/route' {
+ const createFileRoute: CreateFileRoute<
+ '/blog_/$blogId/$slug',
+ FileRoutesByPath['/blog_/$blogId/$slug']['parentRoute'],
+ FileRoutesByPath['/blog_/$blogId/$slug']['id'],
+ FileRoutesByPath['/blog_/$blogId/$slug']['path'],
+ FileRoutesByPath['/blog_/$blogId/$slug']['fullPath']
+ >
+}
+declare module './routes/blog_/$blogId_/edit' {
+ const createFileRoute: CreateFileRoute<
+ '/blog_/$blogId_/edit',
+ FileRoutesByPath['/blog_/$blogId_/edit']['parentRoute'],
+ FileRoutesByPath['/blog_/$blogId_/edit']['id'],
+ FileRoutesByPath['/blog_/$blogId_/edit']['path'],
+ FileRoutesByPath['/blog_/$blogId_/edit']['fullPath']
+ >
+}
declare module './routes/posts/$postId/deep' {
const createFileRoute: CreateFileRoute<
'/posts/$postId/deep',
@@ -289,6 +394,15 @@ declare module './routes/posts/$postId/index' {
FileRoutesByPath['/posts/$postId/']['fullPath']
>
}
+declare module './routes/blog_/$blogId/$slug_/bar' {
+ const createFileRoute: CreateFileRoute<
+ '/blog_/$blogId/$slug_/bar',
+ FileRoutesByPath['/blog_/$blogId/$slug_/bar']['parentRoute'],
+ FileRoutesByPath['/blog_/$blogId/$slug_/bar']['id'],
+ FileRoutesByPath['/blog_/$blogId/$slug_/bar']['path'],
+ FileRoutesByPath['/blog_/$blogId/$slug_/bar']['fullPath']
+ >
+}
interface BlogRouteRouteChildren {
BlogSlugRoute: typeof BlogSlugRoute
@@ -320,11 +434,27 @@ const PostsRouteRouteWithChildren = PostsRouteRoute._addFileChildren(
PostsRouteRouteChildren,
)
+interface BlogBlogIdRouteRouteChildren {
+ BlogBlogIdSlugRouteRoute: typeof BlogBlogIdSlugRouteRoute
+ BlogBlogIdSlugBarRoute: typeof BlogBlogIdSlugBarRoute
+}
+
+const BlogBlogIdRouteRouteChildren: BlogBlogIdRouteRouteChildren = {
+ BlogBlogIdSlugRouteRoute: BlogBlogIdSlugRouteRoute,
+ BlogBlogIdSlugBarRoute: BlogBlogIdSlugBarRoute,
+}
+
+const BlogBlogIdRouteRouteWithChildren = BlogBlogIdRouteRoute._addFileChildren(
+ BlogBlogIdRouteRouteChildren,
+)
+
const rootRouteChildren: RootRouteChildren = {
IndexRoute: IndexRoute,
BlogRouteRoute: BlogRouteRouteWithChildren,
PostsRouteRoute: PostsRouteRouteWithChildren,
+ BlogBlogIdRouteRoute: BlogBlogIdRouteRouteWithChildren,
BlogStatsRoute: BlogStatsRoute,
+ BlogBlogIdEditRoute: BlogBlogIdEditRoute,
}
export const routeTree = rootRouteImport
._addFileChildren(rootRouteChildren)
diff --git a/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/routes/blog_/$blogId/$slug/route.tsx b/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/routes/blog_/$blogId/$slug/route.tsx
new file mode 100644
index 00000000000..3411fd0b37f
--- /dev/null
+++ b/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/routes/blog_/$blogId/$slug/route.tsx
@@ -0,0 +1,3 @@
+export const Route = createFileRoute({
+ component: () => Hello /blog_/$blogId/$slug/route!
,
+})
diff --git a/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/routes/blog_/$blogId/$slug_/bar.tsx b/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/routes/blog_/$blogId/$slug_/bar.tsx
new file mode 100644
index 00000000000..c39dd91dfeb
--- /dev/null
+++ b/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/routes/blog_/$blogId/$slug_/bar.tsx
@@ -0,0 +1,3 @@
+export const Route = createFileRoute({
+ component: () => Hello /blog_/$blogId/$slug_/bar!
,
+})
diff --git a/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/routes/blog_/$blogId/route.tsx b/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/routes/blog_/$blogId/route.tsx
new file mode 100644
index 00000000000..e1d6f6524fa
--- /dev/null
+++ b/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/routes/blog_/$blogId/route.tsx
@@ -0,0 +1,3 @@
+export const Route = createFileRoute({
+ component: () => Hello /blog_/$blogId/route!
,
+})
diff --git a/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/routes/blog_/$blogId_/edit.tsx b/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/routes/blog_/$blogId_/edit.tsx
new file mode 100644
index 00000000000..1337ddd18b0
--- /dev/null
+++ b/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/routes/blog_/$blogId_/edit.tsx
@@ -0,0 +1,3 @@
+export const Route = createFileRoute({
+ component: () => Hello /blog_/$blogId_/edit!
,
+})
diff --git a/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/tests.nonnested.test-d.ts b/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/tests.nonnested.test-d.ts
index 8a6b9948f97..4cf84c78ecf 100644
--- a/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/tests.nonnested.test-d.ts
+++ b/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/tests.nonnested.test-d.ts
@@ -43,6 +43,10 @@ test('when navigating to the root', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -57,6 +61,10 @@ test('when navigating to the root', () => {
| '/'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/'
+ | '/blog/$blogId/edit/'
+ | '/blog/$blogId/$slug/'
+ | '/blog/$blogId/$slug/bar/'
| '/blog/$slug/'
| '/blog/stats/'
| '/posts/$postId/deep/'
@@ -71,6 +79,10 @@ test('when navigating to the root', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -85,12 +97,20 @@ test('when navigating to the root', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
| '/posts/$postId'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/'
+ | '/blog/$blogId/edit/'
+ | '/blog/$blogId/$slug/'
+ | '/blog/$blogId/$slug/bar/'
| '/blog/$slug/'
| '/blog/stats/'
| '/posts/$postId/deep/'
@@ -105,6 +125,10 @@ test('when navigating to the root', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
@@ -149,6 +173,10 @@ test('when navigating a index route with search and params', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -166,6 +194,10 @@ test('when navigating a index route with search and params', () => {
| '/'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/'
+ | '/blog/$blogId/edit/'
+ | '/blog/$blogId/$slug/'
+ | '/blog/$blogId/$slug/bar/'
| '/blog/$slug/'
| '/blog/stats/'
| '/posts/$postId/deep/'
@@ -177,9 +209,12 @@ test('when navigating a index route with search and params', () => {
.toHaveProperty('to')
.toEqualTypeOf<
| '/'
- | '/posts/$postId'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -201,12 +236,20 @@ test('when navigating a index route with search and params', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
| '/posts/$postId'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/'
+ | '/blog/$blogId/edit/'
+ | '/blog/$blogId/$slug/'
+ | '/blog/$blogId/$slug/bar/'
| '/blog/$slug/'
| '/blog/stats/'
| '/posts/$postId/deep/'
@@ -221,6 +264,10 @@ test('when navigating a index route with search and params', () => {
| '/posts/$postId'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
@@ -327,6 +374,10 @@ test('when navigating from a index route with search and params', () => {
| '/posts/$postId'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
@@ -354,6 +405,10 @@ test('when using useNavigate', () => {
| '..'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -370,6 +425,10 @@ test('when using redirect', () => {
| '/posts/$postId'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -387,9 +446,12 @@ test('when using useSearch from a route with no search', () => {
| '/blog'
| '/blog/'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
- | '/blog/'
| '/posts/'
| '/posts/$postId/deep'
| '/posts/$postId/'
@@ -408,9 +470,12 @@ test('when using useSearch from a route with search', () => {
| '/blog'
| '/blog/'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
- | '/blog/'
| '/posts/'
| '/posts/$postId/deep'
| '/posts/$postId/'
@@ -431,9 +496,12 @@ test('when using useLoaderData from a route with loaderData', () => {
| '/blog'
| '/blog/'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
- | '/blog/'
| '/posts/'
| '/posts/$postId/deep'
| '/posts/$postId/'
@@ -454,9 +522,12 @@ test('when using useLoaderDeps from a route with loaderDeps', () => {
| '/blog'
| '/blog/'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
- | '/blog/'
| '/posts/'
| '/posts/$postId/deep'
| '/posts/$postId/'
@@ -477,9 +548,12 @@ test('when using useMatch from a route', () => {
| '/blog'
| '/blog/'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
- | '/blog/'
| '/posts/'
| '/posts/$postId/deep'
| '/posts/$postId/'
@@ -502,9 +576,12 @@ test('when using useParams from a route', () => {
| '/blog'
| '/blog/'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
- | '/blog/'
| '/posts/'
| '/posts/$postId/deep'
| '/posts/$postId/'
@@ -525,9 +602,12 @@ test('when using useRouteContext from a route', () => {
| '/blog'
| '/blog/'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
- | '/blog/'
| '/posts/'
| '/posts/$postId/deep'
| '/posts/$postId/'
diff --git a/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/tests.test-d.ts b/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/tests.test-d.ts
index a349a48c5e5..adfb3ae535e 100644
--- a/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/tests.test-d.ts
+++ b/packages/router-generator/tests/generator/nested-verboseFileRoutes-false/tests.test-d.ts
@@ -1,7 +1,6 @@
import {
- createRouter,
Link,
- MakeRouteMatch,
+ createRouter,
redirect,
useLoaderData,
useLoaderDeps,
@@ -11,8 +10,9 @@ import {
useRouteContext,
useSearch,
} from '@tanstack/react-router'
-import { test, expectTypeOf } from 'vitest'
+import { expectTypeOf, test } from 'vitest'
import { routeTree } from './routeTree.gen'
+import type { MakeRouteMatch } from '@tanstack/react-router'
const defaultRouter = createRouter({
routeTree,
@@ -43,6 +43,10 @@ test('when navigating to the root', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -57,6 +61,10 @@ test('when navigating to the root', () => {
| '/'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/'
+ | '/blog/$blogId/edit/'
+ | '/blog/$blogId/$slug/'
+ | '/blog/$blogId/$slug/bar/'
| '/blog/$slug/'
| '/blog/stats/'
| '/posts/$postId/deep/'
@@ -71,6 +79,10 @@ test('when navigating to the root', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -85,12 +97,20 @@ test('when navigating to the root', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
| '/posts/$postId'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/'
+ | '/blog/$blogId/edit/'
+ | '/blog/$blogId/$slug/'
+ | '/blog/$blogId/$slug/bar/'
| '/blog/$slug/'
| '/blog/stats/'
| '/posts/$postId/deep/'
@@ -105,6 +125,10 @@ test('when navigating to the root', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
@@ -149,6 +173,10 @@ test('when navigating a index route with search and params', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -166,6 +194,10 @@ test('when navigating a index route with search and params', () => {
| '/'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/'
+ | '/blog/$blogId/edit/'
+ | '/blog/$blogId/$slug/'
+ | '/blog/$blogId/$slug/bar/'
| '/blog/$slug/'
| '/blog/stats/'
| '/posts/$postId/deep/'
@@ -177,9 +209,12 @@ test('when navigating a index route with search and params', () => {
.toHaveProperty('to')
.toEqualTypeOf<
| '/'
- | '/posts/$postId'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -201,12 +236,20 @@ test('when navigating a index route with search and params', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
| '/posts/$postId'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/'
+ | '/blog/$blogId/edit/'
+ | '/blog/$blogId/$slug/'
+ | '/blog/$blogId/$slug/bar/'
| '/blog/$slug/'
| '/blog/stats/'
| '/posts/$postId/deep/'
@@ -221,6 +264,10 @@ test('when navigating a index route with search and params', () => {
| '/posts/$postId'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
@@ -327,6 +374,10 @@ test('when navigating from a index route with search and params', () => {
| '/posts/$postId'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
@@ -354,6 +405,10 @@ test('when using useNavigate', () => {
| '..'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -370,6 +425,10 @@ test('when using redirect', () => {
| '/posts/$postId'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -388,8 +447,11 @@ test('when using useSearch from a route with no search', () => {
| '/blog/'
| '/posts'
| '/blog/$slug'
+ | '/blog_/$blogId'
+ | '/blog_/$blogId_/edit'
+ | '/blog_/$blogId/$slug'
+ | '/blog_/$blogId/$slug_/bar'
| '/blog_/stats'
- | '/blog/'
| '/posts/'
| '/posts/$postId/deep'
| '/posts/$postId/'
@@ -409,8 +471,11 @@ test('when using useSearch from a route with search', () => {
| '/blog/'
| '/posts'
| '/blog/$slug'
+ | '/blog_/$blogId'
+ | '/blog_/$blogId_/edit'
+ | '/blog_/$blogId/$slug'
+ | '/blog_/$blogId/$slug_/bar'
| '/blog_/stats'
- | '/blog/'
| '/posts/'
| '/posts/$postId/deep'
| '/posts/$postId/'
@@ -431,9 +496,12 @@ test('when using useLoaderData from a route with loaderData', () => {
| '/blog'
| '/blog/'
| '/posts'
+ | '/blog_/$blogId'
+ | '/blog_/$blogId_/edit'
+ | '/blog_/$blogId/$slug'
+ | '/blog_/$blogId/$slug_/bar'
| '/blog/$slug'
| '/blog_/stats'
- | '/blog/'
| '/posts/'
| '/posts/$postId/deep'
| '/posts/$postId/'
@@ -455,8 +523,11 @@ test('when using useLoaderDeps from a route with loaderDeps', () => {
| '/blog/'
| '/posts'
| '/blog/$slug'
+ | '/blog_/$blogId'
+ | '/blog_/$blogId_/edit'
+ | '/blog_/$blogId/$slug'
+ | '/blog_/$blogId/$slug_/bar'
| '/blog_/stats'
- | '/blog/'
| '/posts/'
| '/posts/$postId/deep'
| '/posts/$postId/'
@@ -478,8 +549,11 @@ test('when using useMatch from a route', () => {
| '/blog/'
| '/posts'
| '/blog/$slug'
+ | '/blog_/$blogId'
+ | '/blog_/$blogId_/edit'
+ | '/blog_/$blogId/$slug'
+ | '/blog_/$blogId/$slug_/bar'
| '/blog_/stats'
- | '/blog/'
| '/posts/'
| '/posts/$postId/deep'
| '/posts/$postId/'
@@ -503,8 +577,11 @@ test('when using useParams from a route', () => {
| '/blog/'
| '/posts'
| '/blog/$slug'
+ | '/blog_/$blogId'
+ | '/blog_/$blogId_/edit'
+ | '/blog_/$blogId/$slug'
+ | '/blog_/$blogId/$slug_/bar'
| '/blog_/stats'
- | '/blog/'
| '/posts/'
| '/posts/$postId/deep'
| '/posts/$postId/'
@@ -526,8 +603,11 @@ test('when using useRouteContext from a route', () => {
| '/blog/'
| '/posts'
| '/blog/$slug'
+ | '/blog_/$blogId'
+ | '/blog_/$blogId_/edit'
+ | '/blog_/$blogId/$slug'
+ | '/blog_/$blogId/$slug_/bar'
| '/blog_/stats'
- | '/blog/'
| '/posts/'
| '/posts/$postId/deep'
| '/posts/$postId/'
diff --git a/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/routeTree.nonnested.snapshot.ts b/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/routeTree.nonnested.snapshot.ts
index a7f314ecc87..5760ba59b43 100644
--- a/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/routeTree.nonnested.snapshot.ts
+++ b/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/routeTree.nonnested.snapshot.ts
@@ -16,8 +16,12 @@ import { Route as PostsIndexRouteImport } from './routes/posts/index'
import { Route as BlogIndexRouteImport } from './routes/blog/index'
import { Route as BlogStatsRouteImport } from './routes/blog_/stats'
import { Route as BlogSlugRouteImport } from './routes/blog/$slug'
+import { Route as BlogBlogIdRouteRouteImport } from './routes/blog_/$blogId/route'
import { Route as PostsPostIdIndexRouteImport } from './routes/posts/$postId/index'
import { Route as PostsPostIdDeepRouteImport } from './routes/posts/$postId/deep'
+import { Route as BlogBlogIdEditRouteImport } from './routes/blog_/$blogId_/edit'
+import { Route as BlogBlogIdSlugRouteRouteImport } from './routes/blog_/$blogId/$slug/route'
+import { Route as BlogBlogIdSlugBarRouteImport } from './routes/blog_/$blogId/$slug_/bar'
const PostsRouteRoute = PostsRouteRouteImport.update({
id: '/posts',
@@ -54,6 +58,11 @@ const BlogSlugRoute = BlogSlugRouteImport.update({
path: '/$slug',
getParentRoute: () => BlogRouteRoute,
} as any)
+const BlogBlogIdRouteRoute = BlogBlogIdRouteRouteImport.update({
+ id: '/blog/$blogId',
+ path: '/blog/$blogId',
+ getParentRoute: () => rootRouteImport,
+} as any)
const PostsPostIdIndexRoute = PostsPostIdIndexRouteImport.update({
id: '/$postId/',
path: '/$postId/',
@@ -64,38 +73,65 @@ const PostsPostIdDeepRoute = PostsPostIdDeepRouteImport.update({
path: '/$postId/deep',
getParentRoute: () => PostsRouteRoute,
} as any)
+const BlogBlogIdEditRoute = BlogBlogIdEditRouteImport.update({
+ id: '/blog/$blogId/edit',
+ path: '/blog/$blogId/edit',
+ getParentRoute: () => rootRouteImport,
+} as any)
+const BlogBlogIdSlugRouteRoute = BlogBlogIdSlugRouteRouteImport.update({
+ id: '/$slug',
+ path: '/$slug',
+ getParentRoute: () => BlogBlogIdRouteRoute,
+} as any)
+const BlogBlogIdSlugBarRoute = BlogBlogIdSlugBarRouteImport.update({
+ id: '/$slug/bar',
+ path: '/$slug/bar',
+ getParentRoute: () => BlogBlogIdRouteRoute,
+} as any)
export interface FileRoutesByFullPath {
'/': typeof IndexRoute
'/blog': typeof BlogRouteRouteWithChildren
'/posts': typeof PostsRouteRouteWithChildren
+ '/blog/$blogId': typeof BlogBlogIdRouteRouteWithChildren
'/blog/$slug': typeof BlogSlugRoute
'/blog/stats': typeof BlogStatsRoute
'/blog/': typeof BlogIndexRoute
'/posts/': typeof PostsIndexRoute
+ '/blog/$blogId/$slug': typeof BlogBlogIdSlugRouteRoute
+ '/blog/$blogId/edit': typeof BlogBlogIdEditRoute
'/posts/$postId/deep': typeof PostsPostIdDeepRoute
'/posts/$postId': typeof PostsPostIdIndexRoute
+ '/blog/$blogId/$slug/bar': typeof BlogBlogIdSlugBarRoute
}
export interface FileRoutesByTo {
'/': typeof IndexRoute
+ '/blog/$blogId': typeof BlogBlogIdRouteRouteWithChildren
'/blog/$slug': typeof BlogSlugRoute
'/blog/stats': typeof BlogStatsRoute
'/blog': typeof BlogIndexRoute
'/posts': typeof PostsIndexRoute
+ '/blog/$blogId/$slug': typeof BlogBlogIdSlugRouteRoute
+ '/blog/$blogId/edit': typeof BlogBlogIdEditRoute
'/posts/$postId/deep': typeof PostsPostIdDeepRoute
'/posts/$postId': typeof PostsPostIdIndexRoute
+ '/blog/$blogId/$slug/bar': typeof BlogBlogIdSlugBarRoute
}
export interface FileRoutesById {
__root__: typeof rootRouteImport
'/': typeof IndexRoute
'/blog': typeof BlogRouteRouteWithChildren
'/posts': typeof PostsRouteRouteWithChildren
+ '/blog/$blogId': typeof BlogBlogIdRouteRouteWithChildren
'/blog/$slug': typeof BlogSlugRoute
'/blog/stats': typeof BlogStatsRoute
'/blog/': typeof BlogIndexRoute
'/posts/': typeof PostsIndexRoute
+ '/blog/$blogId/$slug': typeof BlogBlogIdSlugRouteRoute
+ '/blog/$blogId/edit': typeof BlogBlogIdEditRoute
'/posts/$postId/deep': typeof PostsPostIdDeepRoute
'/posts/$postId/': typeof PostsPostIdIndexRoute
+ '/blog/$blogId/$slug/bar': typeof BlogBlogIdSlugBarRoute
}
export interface FileRouteTypes {
fileRoutesByFullPath: FileRoutesByFullPath
@@ -103,39 +139,53 @@ export interface FileRouteTypes {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/edit'
| '/posts/$postId/deep'
| '/posts/$postId'
+ | '/blog/$blogId/$slug/bar'
fileRoutesByTo: FileRoutesByTo
to:
| '/'
+ | '/blog/$blogId'
| '/blog/$slug'
| '/blog/stats'
| '/blog'
| '/posts'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/edit'
| '/posts/$postId/deep'
| '/posts/$postId'
+ | '/blog/$blogId/$slug/bar'
id:
| '__root__'
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/edit'
| '/posts/$postId/deep'
| '/posts/$postId/'
+ | '/blog/$blogId/$slug/bar'
fileRoutesById: FileRoutesById
}
export interface RootRouteChildren {
IndexRoute: typeof IndexRoute
BlogRouteRoute: typeof BlogRouteRouteWithChildren
PostsRouteRoute: typeof PostsRouteRouteWithChildren
+ BlogBlogIdRouteRoute: typeof BlogBlogIdRouteRouteWithChildren
BlogStatsRoute: typeof BlogStatsRoute
+ BlogBlogIdEditRoute: typeof BlogBlogIdEditRoute
}
declare module '@tanstack/react-router' {
@@ -189,6 +239,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof BlogSlugRouteImport
parentRoute: typeof BlogRouteRoute
}
+ '/blog/$blogId': {
+ id: '/blog/$blogId'
+ path: '/blog/$blogId'
+ fullPath: '/blog/$blogId'
+ preLoaderRoute: typeof BlogBlogIdRouteRouteImport
+ parentRoute: typeof rootRouteImport
+ }
'/posts/$postId/': {
id: '/posts/$postId/'
path: '/$postId'
@@ -203,6 +260,27 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof PostsPostIdDeepRouteImport
parentRoute: typeof PostsRouteRoute
}
+ '/blog/$blogId/edit': {
+ id: '/blog/$blogId/edit'
+ path: '/blog/$blogId/edit'
+ fullPath: '/blog/$blogId/edit'
+ preLoaderRoute: typeof BlogBlogIdEditRouteImport
+ parentRoute: typeof rootRouteImport
+ }
+ '/blog/$blogId/$slug': {
+ id: '/blog/$blogId/$slug'
+ path: '/$slug'
+ fullPath: '/blog/$blogId/$slug'
+ preLoaderRoute: typeof BlogBlogIdSlugRouteRouteImport
+ parentRoute: typeof BlogBlogIdRouteRoute
+ }
+ '/blog/$blogId/$slug/bar': {
+ id: '/blog/$blogId/$slug/bar'
+ path: '/$slug/bar'
+ fullPath: '/blog/$blogId/$slug/bar'
+ preLoaderRoute: typeof BlogBlogIdSlugBarRouteImport
+ parentRoute: typeof BlogBlogIdRouteRoute
+ }
}
}
@@ -236,11 +314,27 @@ const PostsRouteRouteWithChildren = PostsRouteRoute._addFileChildren(
PostsRouteRouteChildren,
)
+interface BlogBlogIdRouteRouteChildren {
+ BlogBlogIdSlugRouteRoute: typeof BlogBlogIdSlugRouteRoute
+ BlogBlogIdSlugBarRoute: typeof BlogBlogIdSlugBarRoute
+}
+
+const BlogBlogIdRouteRouteChildren: BlogBlogIdRouteRouteChildren = {
+ BlogBlogIdSlugRouteRoute: BlogBlogIdSlugRouteRoute,
+ BlogBlogIdSlugBarRoute: BlogBlogIdSlugBarRoute,
+}
+
+const BlogBlogIdRouteRouteWithChildren = BlogBlogIdRouteRoute._addFileChildren(
+ BlogBlogIdRouteRouteChildren,
+)
+
const rootRouteChildren: RootRouteChildren = {
IndexRoute: IndexRoute,
BlogRouteRoute: BlogRouteRouteWithChildren,
PostsRouteRoute: PostsRouteRouteWithChildren,
+ BlogBlogIdRouteRoute: BlogBlogIdRouteRouteWithChildren,
BlogStatsRoute: BlogStatsRoute,
+ BlogBlogIdEditRoute: BlogBlogIdEditRoute,
}
export const routeTree = rootRouteImport
._addFileChildren(rootRouteChildren)
diff --git a/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/routeTree.snapshot.ts b/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/routeTree.snapshot.ts
index a1283ded235..3cb8036f7c3 100644
--- a/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/routeTree.snapshot.ts
+++ b/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/routeTree.snapshot.ts
@@ -16,8 +16,12 @@ import { Route as PostsIndexRouteImport } from './routes/posts/index'
import { Route as BlogIndexRouteImport } from './routes/blog/index'
import { Route as BlogStatsRouteImport } from './routes/blog_/stats'
import { Route as BlogSlugRouteImport } from './routes/blog/$slug'
+import { Route as BlogBlogIdRouteRouteImport } from './routes/blog_/$blogId/route'
import { Route as PostsPostIdIndexRouteImport } from './routes/posts/$postId/index'
import { Route as PostsPostIdDeepRouteImport } from './routes/posts/$postId/deep'
+import { Route as BlogBlogIdEditRouteImport } from './routes/blog_/$blogId_/edit'
+import { Route as BlogBlogIdSlugRouteRouteImport } from './routes/blog_/$blogId/$slug/route'
+import { Route as BlogBlogIdSlugBarRouteImport } from './routes/blog_/$blogId/$slug_/bar'
const PostsRouteRoute = PostsRouteRouteImport.update({
id: '/posts',
@@ -54,6 +58,11 @@ const BlogSlugRoute = BlogSlugRouteImport.update({
path: '/$slug',
getParentRoute: () => BlogRouteRoute,
} as any)
+const BlogBlogIdRouteRoute = BlogBlogIdRouteRouteImport.update({
+ id: '/blog_/$blogId',
+ path: '/blog/$blogId',
+ getParentRoute: () => rootRouteImport,
+} as any)
const PostsPostIdIndexRoute = PostsPostIdIndexRouteImport.update({
id: '/$postId/',
path: '/$postId/',
@@ -64,38 +73,65 @@ const PostsPostIdDeepRoute = PostsPostIdDeepRouteImport.update({
path: '/$postId/deep',
getParentRoute: () => PostsRouteRoute,
} as any)
+const BlogBlogIdEditRoute = BlogBlogIdEditRouteImport.update({
+ id: '/blog_/$blogId_/edit',
+ path: '/blog/$blogId/edit',
+ getParentRoute: () => rootRouteImport,
+} as any)
+const BlogBlogIdSlugRouteRoute = BlogBlogIdSlugRouteRouteImport.update({
+ id: '/$slug',
+ path: '/$slug',
+ getParentRoute: () => BlogBlogIdRouteRoute,
+} as any)
+const BlogBlogIdSlugBarRoute = BlogBlogIdSlugBarRouteImport.update({
+ id: '/$slug_/bar',
+ path: '/$slug/bar',
+ getParentRoute: () => BlogBlogIdRouteRoute,
+} as any)
export interface FileRoutesByFullPath {
'/': typeof IndexRoute
'/blog': typeof BlogRouteRouteWithChildren
'/posts': typeof PostsRouteRouteWithChildren
+ '/blog/$blogId': typeof BlogBlogIdRouteRouteWithChildren
'/blog/$slug': typeof BlogSlugRoute
'/blog/stats': typeof BlogStatsRoute
'/blog/': typeof BlogIndexRoute
'/posts/': typeof PostsIndexRoute
+ '/blog/$blogId/$slug': typeof BlogBlogIdSlugRouteRoute
+ '/blog/$blogId/edit': typeof BlogBlogIdEditRoute
'/posts/$postId/deep': typeof PostsPostIdDeepRoute
'/posts/$postId': typeof PostsPostIdIndexRoute
+ '/blog/$blogId/$slug/bar': typeof BlogBlogIdSlugBarRoute
}
export interface FileRoutesByTo {
'/': typeof IndexRoute
+ '/blog/$blogId': typeof BlogBlogIdRouteRouteWithChildren
'/blog/$slug': typeof BlogSlugRoute
'/blog/stats': typeof BlogStatsRoute
'/blog': typeof BlogIndexRoute
'/posts': typeof PostsIndexRoute
+ '/blog/$blogId/$slug': typeof BlogBlogIdSlugRouteRoute
+ '/blog/$blogId/edit': typeof BlogBlogIdEditRoute
'/posts/$postId/deep': typeof PostsPostIdDeepRoute
'/posts/$postId': typeof PostsPostIdIndexRoute
+ '/blog/$blogId/$slug/bar': typeof BlogBlogIdSlugBarRoute
}
export interface FileRoutesById {
__root__: typeof rootRouteImport
'/': typeof IndexRoute
'/blog': typeof BlogRouteRouteWithChildren
'/posts': typeof PostsRouteRouteWithChildren
+ '/blog_/$blogId': typeof BlogBlogIdRouteRouteWithChildren
'/blog/$slug': typeof BlogSlugRoute
'/blog_/stats': typeof BlogStatsRoute
'/blog/': typeof BlogIndexRoute
'/posts/': typeof PostsIndexRoute
+ '/blog_/$blogId/$slug': typeof BlogBlogIdSlugRouteRoute
+ '/blog_/$blogId_/edit': typeof BlogBlogIdEditRoute
'/posts/$postId/deep': typeof PostsPostIdDeepRoute
'/posts/$postId/': typeof PostsPostIdIndexRoute
+ '/blog_/$blogId/$slug_/bar': typeof BlogBlogIdSlugBarRoute
}
export interface FileRouteTypes {
fileRoutesByFullPath: FileRoutesByFullPath
@@ -103,39 +139,53 @@ export interface FileRouteTypes {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/edit'
| '/posts/$postId/deep'
| '/posts/$postId'
+ | '/blog/$blogId/$slug/bar'
fileRoutesByTo: FileRoutesByTo
to:
| '/'
+ | '/blog/$blogId'
| '/blog/$slug'
| '/blog/stats'
| '/blog'
| '/posts'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/edit'
| '/posts/$postId/deep'
| '/posts/$postId'
+ | '/blog/$blogId/$slug/bar'
id:
| '__root__'
| '/'
| '/blog'
| '/posts'
+ | '/blog_/$blogId'
| '/blog/$slug'
| '/blog_/stats'
| '/blog/'
| '/posts/'
+ | '/blog_/$blogId/$slug'
+ | '/blog_/$blogId_/edit'
| '/posts/$postId/deep'
| '/posts/$postId/'
+ | '/blog_/$blogId/$slug_/bar'
fileRoutesById: FileRoutesById
}
export interface RootRouteChildren {
IndexRoute: typeof IndexRoute
BlogRouteRoute: typeof BlogRouteRouteWithChildren
PostsRouteRoute: typeof PostsRouteRouteWithChildren
+ BlogBlogIdRouteRoute: typeof BlogBlogIdRouteRouteWithChildren
BlogStatsRoute: typeof BlogStatsRoute
+ BlogBlogIdEditRoute: typeof BlogBlogIdEditRoute
}
declare module '@tanstack/react-router' {
@@ -189,6 +239,13 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof BlogSlugRouteImport
parentRoute: typeof BlogRouteRoute
}
+ '/blog_/$blogId': {
+ id: '/blog_/$blogId'
+ path: '/blog/$blogId'
+ fullPath: '/blog/$blogId'
+ preLoaderRoute: typeof BlogBlogIdRouteRouteImport
+ parentRoute: typeof rootRouteImport
+ }
'/posts/$postId/': {
id: '/posts/$postId/'
path: '/$postId'
@@ -203,6 +260,27 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof PostsPostIdDeepRouteImport
parentRoute: typeof PostsRouteRoute
}
+ '/blog_/$blogId_/edit': {
+ id: '/blog_/$blogId_/edit'
+ path: '/blog/$blogId/edit'
+ fullPath: '/blog/$blogId/edit'
+ preLoaderRoute: typeof BlogBlogIdEditRouteImport
+ parentRoute: typeof rootRouteImport
+ }
+ '/blog_/$blogId/$slug': {
+ id: '/blog_/$blogId/$slug'
+ path: '/$slug'
+ fullPath: '/blog/$blogId/$slug'
+ preLoaderRoute: typeof BlogBlogIdSlugRouteRouteImport
+ parentRoute: typeof BlogBlogIdRouteRoute
+ }
+ '/blog_/$blogId/$slug_/bar': {
+ id: '/blog_/$blogId/$slug_/bar'
+ path: '/$slug/bar'
+ fullPath: '/blog/$blogId/$slug/bar'
+ preLoaderRoute: typeof BlogBlogIdSlugBarRouteImport
+ parentRoute: typeof BlogBlogIdRouteRoute
+ }
}
}
@@ -236,11 +314,27 @@ const PostsRouteRouteWithChildren = PostsRouteRoute._addFileChildren(
PostsRouteRouteChildren,
)
+interface BlogBlogIdRouteRouteChildren {
+ BlogBlogIdSlugRouteRoute: typeof BlogBlogIdSlugRouteRoute
+ BlogBlogIdSlugBarRoute: typeof BlogBlogIdSlugBarRoute
+}
+
+const BlogBlogIdRouteRouteChildren: BlogBlogIdRouteRouteChildren = {
+ BlogBlogIdSlugRouteRoute: BlogBlogIdSlugRouteRoute,
+ BlogBlogIdSlugBarRoute: BlogBlogIdSlugBarRoute,
+}
+
+const BlogBlogIdRouteRouteWithChildren = BlogBlogIdRouteRoute._addFileChildren(
+ BlogBlogIdRouteRouteChildren,
+)
+
const rootRouteChildren: RootRouteChildren = {
IndexRoute: IndexRoute,
BlogRouteRoute: BlogRouteRouteWithChildren,
PostsRouteRoute: PostsRouteRouteWithChildren,
+ BlogBlogIdRouteRoute: BlogBlogIdRouteRouteWithChildren,
BlogStatsRoute: BlogStatsRoute,
+ BlogBlogIdEditRoute: BlogBlogIdEditRoute,
}
export const routeTree = rootRouteImport
._addFileChildren(rootRouteChildren)
diff --git a/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/routes/blog_/$blogId/$slug/route.tsx b/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/routes/blog_/$blogId/$slug/route.tsx
new file mode 100644
index 00000000000..c8f91b6d9b3
--- /dev/null
+++ b/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/routes/blog_/$blogId/$slug/route.tsx
@@ -0,0 +1,5 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+export const Route = createFileRoute('/blog_/$blogId/$slug')({
+ component: () => Hello /blog_/$blogId/$slug/route!
,
+})
diff --git a/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/routes/blog_/$blogId/$slug_/bar.tsx b/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/routes/blog_/$blogId/$slug_/bar.tsx
new file mode 100644
index 00000000000..9d44dc5f21d
--- /dev/null
+++ b/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/routes/blog_/$blogId/$slug_/bar.tsx
@@ -0,0 +1,4 @@
+import { createFileRoute } from '@tanstack/react-router'
+export const Route = createFileRoute('/blog_/$blogId/$slug_/bar')({
+ component: () => Hello /blog_/$blogId/$slug_/bar!
,
+})
diff --git a/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/routes/blog_/$blogId/route.tsx b/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/routes/blog_/$blogId/route.tsx
new file mode 100644
index 00000000000..95a56a67fb5
--- /dev/null
+++ b/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/routes/blog_/$blogId/route.tsx
@@ -0,0 +1,5 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+export const Route = createFileRoute('/blog_/$blogId')({
+ component: () => Hello /blog_/$blogId/route!
,
+})
diff --git a/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/routes/blog_/$blogId_/edit.tsx b/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/routes/blog_/$blogId_/edit.tsx
new file mode 100644
index 00000000000..9968c7f1dd0
--- /dev/null
+++ b/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/routes/blog_/$blogId_/edit.tsx
@@ -0,0 +1,5 @@
+import { createFileRoute } from '@tanstack/react-router'
+
+export const Route = createFileRoute('/blog_/$blogId_/edit')({
+ component: () => Hello /blog_/$blogId_/edit!
,
+})
diff --git a/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/tests.nonnested.test-d.ts b/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/tests.nonnested.test-d.ts
index 8a6b9948f97..5ef92510c05 100644
--- a/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/tests.nonnested.test-d.ts
+++ b/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/tests.nonnested.test-d.ts
@@ -43,6 +43,10 @@ test('when navigating to the root', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -57,6 +61,10 @@ test('when navigating to the root', () => {
| '/'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/'
+ | '/blog/$blogId/edit/'
+ | '/blog/$blogId/$slug/'
+ | '/blog/$blogId/$slug/bar/'
| '/blog/$slug/'
| '/blog/stats/'
| '/posts/$postId/deep/'
@@ -71,6 +79,10 @@ test('when navigating to the root', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -85,12 +97,20 @@ test('when navigating to the root', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
| '/posts/$postId'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/'
+ | '/blog/$blogId/edit/'
+ | '/blog/$blogId/$slug/'
+ | '/blog/$blogId/$slug/bar/'
| '/blog/$slug/'
| '/blog/stats/'
| '/posts/$postId/deep/'
@@ -105,6 +125,10 @@ test('when navigating to the root', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
@@ -149,6 +173,10 @@ test('when navigating a index route with search and params', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -166,6 +194,10 @@ test('when navigating a index route with search and params', () => {
| '/'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/'
+ | '/blog/$blogId/edit/'
+ | '/blog/$blogId/$slug/'
+ | '/blog/$blogId/$slug/bar/'
| '/blog/$slug/'
| '/blog/stats/'
| '/posts/$postId/deep/'
@@ -177,9 +209,12 @@ test('when navigating a index route with search and params', () => {
.toHaveProperty('to')
.toEqualTypeOf<
| '/'
- | '/posts/$postId'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -201,12 +236,20 @@ test('when navigating a index route with search and params', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
| '/posts/$postId'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/'
+ | '/blog/$blogId/edit/'
+ | '/blog/$blogId/$slug/'
+ | '/blog/$blogId/$slug/bar/'
| '/blog/$slug/'
| '/blog/stats/'
| '/posts/$postId/deep/'
@@ -221,6 +264,10 @@ test('when navigating a index route with search and params', () => {
| '/posts/$postId'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
@@ -327,6 +374,10 @@ test('when navigating from a index route with search and params', () => {
| '/posts/$postId'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
@@ -354,6 +405,10 @@ test('when using useNavigate', () => {
| '..'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -370,6 +425,10 @@ test('when using redirect', () => {
| '/posts/$postId'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -385,8 +444,11 @@ test('when using useSearch from a route with no search', () => {
| '__root__'
| '/'
| '/blog'
- | '/blog/'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
@@ -406,8 +468,11 @@ test('when using useSearch from a route with search', () => {
| '__root__'
| '/'
| '/blog'
- | '/blog/'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
@@ -429,8 +494,11 @@ test('when using useLoaderData from a route with loaderData', () => {
| '__root__'
| '/'
| '/blog'
- | '/blog/'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
@@ -452,8 +520,11 @@ test('when using useLoaderDeps from a route with loaderDeps', () => {
| '__root__'
| '/'
| '/blog'
- | '/blog/'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
@@ -475,8 +546,11 @@ test('when using useMatch from a route', () => {
| '__root__'
| '/'
| '/blog'
- | '/blog/'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
@@ -500,8 +574,11 @@ test('when using useParams from a route', () => {
| '__root__'
| '/'
| '/blog'
- | '/blog/'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
@@ -523,8 +600,11 @@ test('when using useRouteContext from a route', () => {
| '__root__'
| '/'
| '/blog'
- | '/blog/'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
diff --git a/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/tests.test-d.ts b/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/tests.test-d.ts
index a349a48c5e5..2e991843d59 100644
--- a/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/tests.test-d.ts
+++ b/packages/router-generator/tests/generator/nested-verboseFileRoutes-true/tests.test-d.ts
@@ -1,7 +1,6 @@
import {
- createRouter,
Link,
- MakeRouteMatch,
+ createRouter,
redirect,
useLoaderData,
useLoaderDeps,
@@ -11,8 +10,9 @@ import {
useRouteContext,
useSearch,
} from '@tanstack/react-router'
-import { test, expectTypeOf } from 'vitest'
+import { expectTypeOf, test } from 'vitest'
import { routeTree } from './routeTree.gen'
+import type { MakeRouteMatch } from '@tanstack/react-router'
const defaultRouter = createRouter({
routeTree,
@@ -43,6 +43,10 @@ test('when navigating to the root', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -57,6 +61,10 @@ test('when navigating to the root', () => {
| '/'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/'
+ | '/blog/$blogId/edit/'
+ | '/blog/$blogId/$slug/'
+ | '/blog/$blogId/$slug/bar/'
| '/blog/$slug/'
| '/blog/stats/'
| '/posts/$postId/deep/'
@@ -71,6 +79,10 @@ test('when navigating to the root', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -85,12 +97,20 @@ test('when navigating to the root', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
| '/posts/$postId'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/'
+ | '/blog/$blogId/edit/'
+ | '/blog/$blogId/$slug/'
+ | '/blog/$blogId/$slug/bar/'
| '/blog/$slug/'
| '/blog/stats/'
| '/posts/$postId/deep/'
@@ -105,6 +125,10 @@ test('when navigating to the root', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
@@ -149,6 +173,10 @@ test('when navigating a index route with search and params', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -166,6 +194,10 @@ test('when navigating a index route with search and params', () => {
| '/'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/'
+ | '/blog/$blogId/edit/'
+ | '/blog/$blogId/$slug/'
+ | '/blog/$blogId/$slug/bar/'
| '/blog/$slug/'
| '/blog/stats/'
| '/posts/$postId/deep/'
@@ -177,9 +209,12 @@ test('when navigating a index route with search and params', () => {
.toHaveProperty('to')
.toEqualTypeOf<
| '/'
- | '/posts/$postId'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -201,12 +236,20 @@ test('when navigating a index route with search and params', () => {
| '/'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
| '/posts/$postId'
| '/blog/'
| '/posts/'
+ | '/blog/$blogId/'
+ | '/blog/$blogId/edit/'
+ | '/blog/$blogId/$slug/'
+ | '/blog/$blogId/$slug/bar/'
| '/blog/$slug/'
| '/blog/stats/'
| '/posts/$postId/deep/'
@@ -221,6 +264,10 @@ test('when navigating a index route with search and params', () => {
| '/posts/$postId'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
@@ -327,6 +374,10 @@ test('when navigating from a index route with search and params', () => {
| '/posts/$postId'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/blog/'
@@ -354,6 +405,10 @@ test('when using useNavigate', () => {
| '..'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -370,6 +425,10 @@ test('when using redirect', () => {
| '/posts/$postId'
| '/blog'
| '/posts'
+ | '/blog/$blogId'
+ | '/blog/$blogId/edit'
+ | '/blog/$blogId/$slug'
+ | '/blog/$blogId/$slug/bar'
| '/blog/$slug'
| '/blog/stats'
| '/posts/$postId/deep'
@@ -385,9 +444,12 @@ test('when using useSearch from a route with no search', () => {
| '__root__'
| '/'
| '/blog'
- | '/blog/'
| '/posts'
| '/blog/$slug'
+ | '/blog_/$blogId'
+ | '/blog_/$blogId_/edit'
+ | '/blog_/$blogId/$slug'
+ | '/blog_/$blogId/$slug_/bar'
| '/blog_/stats'
| '/blog/'
| '/posts/'
@@ -406,9 +468,12 @@ test('when using useSearch from a route with search', () => {
| '__root__'
| '/'
| '/blog'
- | '/blog/'
| '/posts'
| '/blog/$slug'
+ | '/blog_/$blogId'
+ | '/blog_/$blogId_/edit'
+ | '/blog_/$blogId/$slug'
+ | '/blog_/$blogId/$slug_/bar'
| '/blog_/stats'
| '/blog/'
| '/posts/'
@@ -429,9 +494,12 @@ test('when using useLoaderData from a route with loaderData', () => {
| '__root__'
| '/'
| '/blog'
- | '/blog/'
| '/posts'
| '/blog/$slug'
+ | '/blog_/$blogId'
+ | '/blog_/$blogId_/edit'
+ | '/blog_/$blogId/$slug'
+ | '/blog_/$blogId/$slug_/bar'
| '/blog_/stats'
| '/blog/'
| '/posts/'
@@ -452,9 +520,12 @@ test('when using useLoaderDeps from a route with loaderDeps', () => {
| '__root__'
| '/'
| '/blog'
- | '/blog/'
| '/posts'
| '/blog/$slug'
+ | '/blog_/$blogId'
+ | '/blog_/$blogId_/edit'
+ | '/blog_/$blogId/$slug'
+ | '/blog_/$blogId/$slug_/bar'
| '/blog_/stats'
| '/blog/'
| '/posts/'
@@ -475,9 +546,12 @@ test('when using useMatch from a route', () => {
| '__root__'
| '/'
| '/blog'
- | '/blog/'
| '/posts'
| '/blog/$slug'
+ | '/blog_/$blogId'
+ | '/blog_/$blogId_/edit'
+ | '/blog_/$blogId/$slug'
+ | '/blog_/$blogId/$slug_/bar'
| '/blog_/stats'
| '/blog/'
| '/posts/'
@@ -500,9 +574,12 @@ test('when using useParams from a route', () => {
| '__root__'
| '/'
| '/blog'
- | '/blog/'
| '/posts'
| '/blog/$slug'
+ | '/blog_/$blogId'
+ | '/blog_/$blogId_/edit'
+ | '/blog_/$blogId/$slug'
+ | '/blog_/$blogId/$slug_/bar'
| '/blog_/stats'
| '/blog/'
| '/posts/'
@@ -523,9 +600,12 @@ test('when using useRouteContext from a route', () => {
| '__root__'
| '/'
| '/blog'
- | '/blog/'
| '/posts'
| '/blog/$slug'
+ | '/blog_/$blogId'
+ | '/blog_/$blogId_/edit'
+ | '/blog_/$blogId/$slug'
+ | '/blog_/$blogId/$slug_/bar'
| '/blog_/stats'
| '/blog/'
| '/posts/'