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 24254a6227a..f644e0306a1 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,8 @@ import { Route as NonNestedPrefixRouteRouteImport } from './routes/non-nested/pr import { Route as NonNestedPathRouteRouteImport } from './routes/non-nested/path/route' import { Route as NonNestedNamedRouteRouteImport } from './routes/non-nested/named/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' import { Route as RelativeUseNavigateRelativeUseNavigateBRouteImport } from './routes/relative/useNavigate/relative-useNavigate-b' import { Route as RelativeUseNavigateRelativeUseNavigateARouteImport } from './routes/relative/useNavigate/relative-useNavigate-a' import { Route as RelativeLinkRelativeLinkBRouteImport } from './routes/relative/link/relative-link-b' @@ -53,6 +55,11 @@ import { Route as RedirectTargetViaLoaderRouteImport } from './routes/redirect/$ import { Route as RedirectTargetViaBeforeLoadRouteImport } from './routes/redirect/$target/via-beforeLoad' import { Route as PostsPostIdEditRouteImport } from './routes/posts_.$postId.edit' import { Route as ParamsSingleValueRouteImport } from './routes/params.single.$value' +import { Route as ParamsPsWildcardChar123Char125suffixRouteImport } from './routes/params-ps/wildcard/{$}suffix' +import { Route as ParamsPsWildcardPrefixChar123Char125RouteImport } from './routes/params-ps/wildcard/prefix{$}' +import { Route as ParamsPsWildcardSplatRouteImport } from './routes/params-ps/wildcard/$' +import { Route as ParamsPsNamedChar123fooChar125suffixRouteImport } from './routes/params-ps/named/{$foo}suffix' +import { Route as ParamsPsNamedPrefixChar123fooChar125RouteImport } from './routes/params-ps/named/prefix{$foo}' import { Route as LayoutLayout2LayoutBRouteImport } from './routes/_layout/_layout-2/layout-b' import { Route as LayoutLayout2LayoutARouteImport } from './routes/_layout/_layout-2/layout-a' import { Route as groupSubfolderInsideRouteImport } from './routes/(group)/subfolder/inside' @@ -74,14 +81,14 @@ import { Route as NonNestedPrefixPrefixChar123bazChar125IndexRouteImport } from 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 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' -import { Route as NonNestedPrefixPrefixChar123bazChar125BarRouteImport } from './routes/non-nested/prefix/prefix{$baz}_.bar' +import { Route as NonNestedSuffixChar123bazChar125suffixBarRouteImport } from './routes/non-nested/suffix/{$baz}suffix_.bar' import { Route as NonNestedPrefixPrefixChar123bazChar125FooRouteImport } from './routes/non-nested/prefix/prefix{$baz}.foo' -import { Route as NonNestedPathBazBarRouteImport } from './routes/non-nested/path/baz_.bar' +import { Route as NonNestedPrefixPrefixChar123bazChar125BarRouteImport } from './routes/non-nested/prefix/prefix{$baz}_.bar' import { Route as NonNestedPathBazFooRouteImport } from './routes/non-nested/path/baz.foo' -import { Route as NonNestedNamedBazBarRouteImport } from './routes/non-nested/named/$baz_.bar' +import { Route as NonNestedPathBazBarRouteImport } from './routes/non-nested/path/baz_.bar' import { Route as NonNestedNamedBazFooRouteImport } from './routes/non-nested/named/$baz.foo' +import { Route as NonNestedNamedBazBarRouteImport } from './routes/non-nested/named/$baz_.bar' import { Route as ParamsPsNamedFooBarRouteRouteImport } from './routes/params-ps/named/$foo/$bar.route' import { Route as RelativeUseNavigatePathPathIndexRouteImport } from './routes/relative/useNavigate/path/$path/index' import { Route as RelativeUseNavigateNestedDeepIndexRouteImport } from './routes/relative/useNavigate/nested/deep/index' @@ -256,6 +263,16 @@ const RedirectTargetIndexRoute = RedirectTargetIndexRouteImport.update({ path: '/', getParentRoute: () => RedirectTargetRoute, } as any) +const ParamsPsWildcardIndexRoute = ParamsPsWildcardIndexRouteImport.update({ + id: '/params-ps/wildcard/', + path: '/params-ps/wildcard/', + getParentRoute: () => rootRouteImport, +} as any) +const ParamsPsNamedIndexRoute = ParamsPsNamedIndexRouteImport.update({ + id: '/params-ps/named/', + path: '/params-ps/named/', + getParentRoute: () => rootRouteImport, +} as any) const RelativeUseNavigateRelativeUseNavigateBRoute = RelativeUseNavigateRelativeUseNavigateBRouteImport.update({ id: '/relative-useNavigate-b', @@ -307,7 +324,7 @@ const RedirectTargetViaBeforeLoadRoute = getParentRoute: () => RedirectTargetRoute, } as any) const PostsPostIdEditRoute = PostsPostIdEditRouteImport.update({ - id: '/posts_/$postId/edit', + id: '/posts/$postId/edit', path: '/posts/$postId/edit', getParentRoute: () => rootRouteImport, } as any) @@ -316,6 +333,35 @@ const ParamsSingleValueRoute = ParamsSingleValueRouteImport.update({ path: '/params/single/$value', getParentRoute: () => rootRouteImport, } as any) +const ParamsPsWildcardChar123Char125suffixRoute = + ParamsPsWildcardChar123Char125suffixRouteImport.update({ + id: '/params-ps/wildcard/{$}suffix', + path: '/params-ps/wildcard/{$}suffix', + getParentRoute: () => rootRouteImport, + } as any) +const ParamsPsWildcardPrefixChar123Char125Route = + ParamsPsWildcardPrefixChar123Char125RouteImport.update({ + id: '/params-ps/wildcard/prefix{$}', + path: '/params-ps/wildcard/prefix{$}', + getParentRoute: () => rootRouteImport, + } as any) +const ParamsPsWildcardSplatRoute = ParamsPsWildcardSplatRouteImport.update({ + id: '/params-ps/wildcard/$', + path: '/params-ps/wildcard/$', + getParentRoute: () => rootRouteImport, +} as any) +const ParamsPsNamedChar123fooChar125suffixRoute = + ParamsPsNamedChar123fooChar125suffixRouteImport.update({ + id: '/params-ps/named/{$foo}suffix', + path: '/params-ps/named/{$foo}suffix', + getParentRoute: () => rootRouteImport, + } as any) +const ParamsPsNamedPrefixChar123fooChar125Route = + ParamsPsNamedPrefixChar123fooChar125RouteImport.update({ + id: '/params-ps/named/prefix{$foo}', + path: '/params-ps/named/prefix{$foo}', + getParentRoute: () => rootRouteImport, + } as any) const LayoutLayout2LayoutBRoute = LayoutLayout2LayoutBRouteImport.update({ id: '/layout-b', path: '/layout-b', @@ -338,7 +384,7 @@ const groupLayoutInsidelayoutRoute = groupLayoutInsidelayoutRouteImport.update({ } as any) const ParamsPsNonNestedFooRouteRoute = ParamsPsNonNestedFooRouteRouteImport.update({ - id: '/$foo_', + id: '/$foo', path: '/$foo', getParentRoute: () => ParamsPsNonNestedRouteRoute, } as any) @@ -430,23 +476,17 @@ const ParamsPsNonNestedFooBarRoute = ParamsPsNonNestedFooBarRouteImport.update({ path: '/$bar', getParentRoute: () => ParamsPsNonNestedFooRouteRoute, } as any) -const NonNestedSuffixChar123bazChar125suffixBarRoute = - NonNestedSuffixChar123bazChar125suffixBarRouteImport.update({ - id: '/{$baz}suffix_/bar', - path: '/{$baz}suffix/bar', - getParentRoute: () => NonNestedSuffixRouteRoute, - } as any) const NonNestedSuffixChar123bazChar125suffixFooRoute = NonNestedSuffixChar123bazChar125suffixFooRouteImport.update({ id: '/foo', path: '/foo', getParentRoute: () => NonNestedSuffixChar123bazChar125suffixRouteRoute, } as any) -const NonNestedPrefixPrefixChar123bazChar125BarRoute = - NonNestedPrefixPrefixChar123bazChar125BarRouteImport.update({ - id: '/prefix{$baz}_/bar', - path: '/prefix{$baz}/bar', - getParentRoute: () => NonNestedPrefixRouteRoute, +const NonNestedSuffixChar123bazChar125suffixBarRoute = + NonNestedSuffixChar123bazChar125suffixBarRouteImport.update({ + id: '/{$baz}suffix/bar', + path: '/{$baz}suffix/bar', + getParentRoute: () => NonNestedSuffixRouteRoute, } as any) const NonNestedPrefixPrefixChar123bazChar125FooRoute = NonNestedPrefixPrefixChar123bazChar125FooRouteImport.update({ @@ -454,26 +494,32 @@ const NonNestedPrefixPrefixChar123bazChar125FooRoute = path: '/foo', getParentRoute: () => NonNestedPrefixPrefixChar123bazChar125RouteRoute, } as any) -const NonNestedPathBazBarRoute = NonNestedPathBazBarRouteImport.update({ - id: '/baz_/bar', - path: '/baz/bar', - getParentRoute: () => NonNestedPathRouteRoute, -} as any) +const NonNestedPrefixPrefixChar123bazChar125BarRoute = + NonNestedPrefixPrefixChar123bazChar125BarRouteImport.update({ + id: '/prefix{$baz}/bar', + path: '/prefix{$baz}/bar', + getParentRoute: () => NonNestedPrefixRouteRoute, + } as any) const NonNestedPathBazFooRoute = NonNestedPathBazFooRouteImport.update({ id: '/foo', path: '/foo', getParentRoute: () => NonNestedPathBazRouteRoute, } as any) -const NonNestedNamedBazBarRoute = NonNestedNamedBazBarRouteImport.update({ - id: '/$baz_/bar', - path: '/$baz/bar', - getParentRoute: () => NonNestedNamedRouteRoute, +const NonNestedPathBazBarRoute = NonNestedPathBazBarRouteImport.update({ + id: '/baz/bar', + path: '/baz/bar', + getParentRoute: () => NonNestedPathRouteRoute, } as any) const NonNestedNamedBazFooRoute = NonNestedNamedBazFooRouteImport.update({ id: '/foo', path: '/foo', getParentRoute: () => NonNestedNamedBazRouteRoute, } as any) +const NonNestedNamedBazBarRoute = NonNestedNamedBazBarRouteImport.update({ + id: '/$baz/bar', + path: '/$baz/bar', + getParentRoute: () => NonNestedNamedRouteRoute, +} as any) const ParamsPsNamedFooBarRouteRoute = ParamsPsNamedFooBarRouteRouteImport.update({ id: '/$bar', @@ -550,6 +596,11 @@ export interface FileRoutesByFullPath { '/subfolder/inside': typeof groupSubfolderInsideRoute '/layout-a': typeof LayoutLayout2LayoutARoute '/layout-b': typeof LayoutLayout2LayoutBRoute + '/params-ps/named/prefix{$foo}': typeof ParamsPsNamedPrefixChar123fooChar125Route + '/params-ps/named/{$foo}suffix': typeof ParamsPsNamedChar123fooChar125suffixRoute + '/params-ps/wildcard/$': typeof ParamsPsWildcardSplatRoute + '/params-ps/wildcard/prefix{$}': typeof ParamsPsWildcardPrefixChar123Char125Route + '/params-ps/wildcard/{$}suffix': typeof ParamsPsWildcardChar123Char125suffixRoute '/params/single/$value': typeof ParamsSingleValueRoute '/posts/$postId/edit': typeof PostsPostIdEditRoute '/redirect/$target/via-beforeLoad': typeof RedirectTargetViaBeforeLoadRoute @@ -561,16 +612,18 @@ export interface FileRoutesByFullPath { '/relative/link/relative-link-b': typeof RelativeLinkRelativeLinkBRoute '/relative/useNavigate/relative-useNavigate-a': typeof RelativeUseNavigateRelativeUseNavigateARoute '/relative/useNavigate/relative-useNavigate-b': typeof RelativeUseNavigateRelativeUseNavigateBRoute + '/params-ps/named': typeof ParamsPsNamedIndexRoute + '/params-ps/wildcard': typeof ParamsPsWildcardIndexRoute '/redirect/$target/': typeof RedirectTargetIndexRoute '/params-ps/named/$foo/$bar': typeof ParamsPsNamedFooBarRouteRouteWithChildren - '/non-nested/named/$baz/foo': typeof NonNestedNamedBazFooRoute '/non-nested/named/$baz/bar': typeof NonNestedNamedBazBarRoute - '/non-nested/path/baz/foo': typeof NonNestedPathBazFooRoute + '/non-nested/named/$baz/foo': typeof NonNestedNamedBazFooRoute '/non-nested/path/baz/bar': typeof NonNestedPathBazBarRoute - '/non-nested/prefix/prefix{$baz}/foo': typeof NonNestedPrefixPrefixChar123bazChar125FooRoute + '/non-nested/path/baz/foo': typeof NonNestedPathBazFooRoute '/non-nested/prefix/prefix{$baz}/bar': typeof NonNestedPrefixPrefixChar123bazChar125BarRoute - '/non-nested/suffix/{$baz}suffix/foo': typeof NonNestedSuffixChar123bazChar125suffixFooRoute + '/non-nested/prefix/prefix{$baz}/foo': typeof NonNestedPrefixPrefixChar123bazChar125FooRoute '/non-nested/suffix/{$baz}suffix/bar': typeof NonNestedSuffixChar123bazChar125suffixBarRoute + '/non-nested/suffix/{$baz}suffix/foo': typeof NonNestedSuffixChar123bazChar125suffixFooRoute '/params-ps/non-nested/$foo/$bar': typeof ParamsPsNonNestedFooBarRoute '/non-nested/named/$baz/': typeof NonNestedNamedBazIndexRoute '/non-nested/path/baz/': typeof NonNestedPathBazIndexRoute @@ -621,6 +674,11 @@ export interface FileRoutesByTo { '/subfolder/inside': typeof groupSubfolderInsideRoute '/layout-a': typeof LayoutLayout2LayoutARoute '/layout-b': typeof LayoutLayout2LayoutBRoute + '/params-ps/named/prefix{$foo}': typeof ParamsPsNamedPrefixChar123fooChar125Route + '/params-ps/named/{$foo}suffix': typeof ParamsPsNamedChar123fooChar125suffixRoute + '/params-ps/wildcard/$': typeof ParamsPsWildcardSplatRoute + '/params-ps/wildcard/prefix{$}': typeof ParamsPsWildcardPrefixChar123Char125Route + '/params-ps/wildcard/{$}suffix': typeof ParamsPsWildcardChar123Char125suffixRoute '/params/single/$value': typeof ParamsSingleValueRoute '/posts/$postId/edit': typeof PostsPostIdEditRoute '/redirect/$target/via-beforeLoad': typeof RedirectTargetViaBeforeLoadRoute @@ -632,16 +690,18 @@ export interface FileRoutesByTo { '/relative/link/relative-link-b': typeof RelativeLinkRelativeLinkBRoute '/relative/useNavigate/relative-useNavigate-a': typeof RelativeUseNavigateRelativeUseNavigateARoute '/relative/useNavigate/relative-useNavigate-b': typeof RelativeUseNavigateRelativeUseNavigateBRoute + '/params-ps/named': typeof ParamsPsNamedIndexRoute + '/params-ps/wildcard': typeof ParamsPsWildcardIndexRoute '/redirect/$target': typeof RedirectTargetIndexRoute '/params-ps/named/$foo/$bar': typeof ParamsPsNamedFooBarRouteRouteWithChildren - '/non-nested/named/$baz/foo': typeof NonNestedNamedBazFooRoute '/non-nested/named/$baz/bar': typeof NonNestedNamedBazBarRoute - '/non-nested/path/baz/foo': typeof NonNestedPathBazFooRoute + '/non-nested/named/$baz/foo': typeof NonNestedNamedBazFooRoute '/non-nested/path/baz/bar': typeof NonNestedPathBazBarRoute - '/non-nested/prefix/prefix{$baz}/foo': typeof NonNestedPrefixPrefixChar123bazChar125FooRoute + '/non-nested/path/baz/foo': typeof NonNestedPathBazFooRoute '/non-nested/prefix/prefix{$baz}/bar': typeof NonNestedPrefixPrefixChar123bazChar125BarRoute - '/non-nested/suffix/{$baz}suffix/foo': typeof NonNestedSuffixChar123bazChar125suffixFooRoute + '/non-nested/prefix/prefix{$baz}/foo': typeof NonNestedPrefixPrefixChar123bazChar125FooRoute '/non-nested/suffix/{$baz}suffix/bar': typeof NonNestedSuffixChar123bazChar125suffixBarRoute + '/non-nested/suffix/{$baz}suffix/foo': typeof NonNestedSuffixChar123bazChar125suffixFooRoute '/params-ps/non-nested/$foo/$bar': typeof ParamsPsNonNestedFooBarRoute '/non-nested/named/$baz': typeof NonNestedNamedBazIndexRoute '/non-nested/path/baz': typeof NonNestedPathBazIndexRoute @@ -698,13 +758,18 @@ export interface FileRoutesById { '/non-nested/prefix/prefix{$baz}': typeof NonNestedPrefixPrefixChar123bazChar125RouteRouteWithChildren '/non-nested/suffix/{$baz}suffix': typeof NonNestedSuffixChar123bazChar125suffixRouteRouteWithChildren '/params-ps/named/$foo': typeof ParamsPsNamedFooRouteRouteWithChildren - '/params-ps/non-nested/$foo_': typeof ParamsPsNonNestedFooRouteRouteWithChildren + '/params-ps/non-nested/$foo': typeof ParamsPsNonNestedFooRouteRouteWithChildren '/(group)/_layout/insidelayout': typeof groupLayoutInsidelayoutRoute '/(group)/subfolder/inside': typeof groupSubfolderInsideRoute '/_layout/_layout-2/layout-a': typeof LayoutLayout2LayoutARoute '/_layout/_layout-2/layout-b': typeof LayoutLayout2LayoutBRoute + '/params-ps/named/prefix{$foo}': typeof ParamsPsNamedPrefixChar123fooChar125Route + '/params-ps/named/{$foo}suffix': typeof ParamsPsNamedChar123fooChar125suffixRoute + '/params-ps/wildcard/$': typeof ParamsPsWildcardSplatRoute + '/params-ps/wildcard/prefix{$}': typeof ParamsPsWildcardPrefixChar123Char125Route + '/params-ps/wildcard/{$}suffix': typeof ParamsPsWildcardChar123Char125suffixRoute '/params/single/$value': typeof ParamsSingleValueRoute - '/posts_/$postId/edit': typeof PostsPostIdEditRoute + '/posts/$postId/edit': typeof PostsPostIdEditRoute '/redirect/$target/via-beforeLoad': typeof RedirectTargetViaBeforeLoadRoute '/redirect/$target/via-loader': typeof RedirectTargetViaLoaderRoute '/redirect/preload/first': typeof RedirectPreloadFirstRoute @@ -714,17 +779,19 @@ export interface FileRoutesById { '/relative/link/relative-link-b': typeof RelativeLinkRelativeLinkBRoute '/relative/useNavigate/relative-useNavigate-a': typeof RelativeUseNavigateRelativeUseNavigateARoute '/relative/useNavigate/relative-useNavigate-b': typeof RelativeUseNavigateRelativeUseNavigateBRoute + '/params-ps/named/': typeof ParamsPsNamedIndexRoute + '/params-ps/wildcard/': typeof ParamsPsWildcardIndexRoute '/redirect/$target/': typeof RedirectTargetIndexRoute '/params-ps/named/$foo/$bar': typeof ParamsPsNamedFooBarRouteRouteWithChildren + '/non-nested/named/$baz/bar': typeof NonNestedNamedBazBarRoute '/non-nested/named/$baz/foo': typeof NonNestedNamedBazFooRoute - '/non-nested/named/$baz_/bar': typeof NonNestedNamedBazBarRoute + '/non-nested/path/baz/bar': typeof NonNestedPathBazBarRoute '/non-nested/path/baz/foo': typeof NonNestedPathBazFooRoute - '/non-nested/path/baz_/bar': typeof NonNestedPathBazBarRoute + '/non-nested/prefix/prefix{$baz}/bar': typeof NonNestedPrefixPrefixChar123bazChar125BarRoute '/non-nested/prefix/prefix{$baz}/foo': typeof NonNestedPrefixPrefixChar123bazChar125FooRoute - '/non-nested/prefix/prefix{$baz}_/bar': typeof NonNestedPrefixPrefixChar123bazChar125BarRoute + '/non-nested/suffix/{$baz}suffix/bar': typeof NonNestedSuffixChar123bazChar125suffixBarRoute '/non-nested/suffix/{$baz}suffix/foo': typeof NonNestedSuffixChar123bazChar125suffixFooRoute - '/non-nested/suffix/{$baz}suffix_/bar': typeof NonNestedSuffixChar123bazChar125suffixBarRoute - '/params-ps/non-nested/$foo_/$bar': typeof ParamsPsNonNestedFooBarRoute + '/params-ps/non-nested/$foo/$bar': typeof ParamsPsNonNestedFooBarRoute '/non-nested/named/$baz/': typeof NonNestedNamedBazIndexRoute '/non-nested/path/baz/': typeof NonNestedPathBazIndexRoute '/non-nested/prefix/prefix{$baz}/': typeof NonNestedPrefixPrefixChar123bazChar125IndexRoute @@ -783,6 +850,11 @@ export interface FileRouteTypes { | '/subfolder/inside' | '/layout-a' | '/layout-b' + | '/params-ps/named/prefix{$foo}' + | '/params-ps/named/{$foo}suffix' + | '/params-ps/wildcard/$' + | '/params-ps/wildcard/prefix{$}' + | '/params-ps/wildcard/{$}suffix' | '/params/single/$value' | '/posts/$postId/edit' | '/redirect/$target/via-beforeLoad' @@ -794,16 +866,18 @@ export interface FileRouteTypes { | '/relative/link/relative-link-b' | '/relative/useNavigate/relative-useNavigate-a' | '/relative/useNavigate/relative-useNavigate-b' + | '/params-ps/named' + | '/params-ps/wildcard' | '/redirect/$target/' | '/params-ps/named/$foo/$bar' - | '/non-nested/named/$baz/foo' | '/non-nested/named/$baz/bar' - | '/non-nested/path/baz/foo' + | '/non-nested/named/$baz/foo' | '/non-nested/path/baz/bar' - | '/non-nested/prefix/prefix{$baz}/foo' + | '/non-nested/path/baz/foo' | '/non-nested/prefix/prefix{$baz}/bar' - | '/non-nested/suffix/{$baz}suffix/foo' + | '/non-nested/prefix/prefix{$baz}/foo' | '/non-nested/suffix/{$baz}suffix/bar' + | '/non-nested/suffix/{$baz}suffix/foo' | '/params-ps/non-nested/$foo/$bar' | '/non-nested/named/$baz/' | '/non-nested/path/baz/' @@ -854,6 +928,11 @@ export interface FileRouteTypes { | '/subfolder/inside' | '/layout-a' | '/layout-b' + | '/params-ps/named/prefix{$foo}' + | '/params-ps/named/{$foo}suffix' + | '/params-ps/wildcard/$' + | '/params-ps/wildcard/prefix{$}' + | '/params-ps/wildcard/{$}suffix' | '/params/single/$value' | '/posts/$postId/edit' | '/redirect/$target/via-beforeLoad' @@ -865,16 +944,18 @@ export interface FileRouteTypes { | '/relative/link/relative-link-b' | '/relative/useNavigate/relative-useNavigate-a' | '/relative/useNavigate/relative-useNavigate-b' + | '/params-ps/named' + | '/params-ps/wildcard' | '/redirect/$target' | '/params-ps/named/$foo/$bar' - | '/non-nested/named/$baz/foo' | '/non-nested/named/$baz/bar' - | '/non-nested/path/baz/foo' + | '/non-nested/named/$baz/foo' | '/non-nested/path/baz/bar' - | '/non-nested/prefix/prefix{$baz}/foo' + | '/non-nested/path/baz/foo' | '/non-nested/prefix/prefix{$baz}/bar' - | '/non-nested/suffix/{$baz}suffix/foo' + | '/non-nested/prefix/prefix{$baz}/foo' | '/non-nested/suffix/{$baz}suffix/bar' + | '/non-nested/suffix/{$baz}suffix/foo' | '/params-ps/non-nested/$foo/$bar' | '/non-nested/named/$baz' | '/non-nested/path/baz' @@ -930,13 +1011,18 @@ export interface FileRouteTypes { | '/non-nested/prefix/prefix{$baz}' | '/non-nested/suffix/{$baz}suffix' | '/params-ps/named/$foo' - | '/params-ps/non-nested/$foo_' + | '/params-ps/non-nested/$foo' | '/(group)/_layout/insidelayout' | '/(group)/subfolder/inside' | '/_layout/_layout-2/layout-a' | '/_layout/_layout-2/layout-b' + | '/params-ps/named/prefix{$foo}' + | '/params-ps/named/{$foo}suffix' + | '/params-ps/wildcard/$' + | '/params-ps/wildcard/prefix{$}' + | '/params-ps/wildcard/{$}suffix' | '/params/single/$value' - | '/posts_/$postId/edit' + | '/posts/$postId/edit' | '/redirect/$target/via-beforeLoad' | '/redirect/$target/via-loader' | '/redirect/preload/first' @@ -946,17 +1032,19 @@ export interface FileRouteTypes { | '/relative/link/relative-link-b' | '/relative/useNavigate/relative-useNavigate-a' | '/relative/useNavigate/relative-useNavigate-b' + | '/params-ps/named/' + | '/params-ps/wildcard/' | '/redirect/$target/' | '/params-ps/named/$foo/$bar' + | '/non-nested/named/$baz/bar' | '/non-nested/named/$baz/foo' - | '/non-nested/named/$baz_/bar' + | '/non-nested/path/baz/bar' | '/non-nested/path/baz/foo' - | '/non-nested/path/baz_/bar' + | '/non-nested/prefix/prefix{$baz}/bar' | '/non-nested/prefix/prefix{$baz}/foo' - | '/non-nested/prefix/prefix{$baz}_/bar' + | '/non-nested/suffix/{$baz}suffix/bar' | '/non-nested/suffix/{$baz}suffix/foo' - | '/non-nested/suffix/{$baz}suffix_/bar' - | '/params-ps/non-nested/$foo_/$bar' + | '/params-ps/non-nested/$foo/$bar' | '/non-nested/named/$baz/' | '/non-nested/path/baz/' | '/non-nested/prefix/prefix{$baz}/' @@ -1000,11 +1088,18 @@ export interface RootRouteChildren { RelativeIndexRoute: typeof RelativeIndexRoute ParamsPsNamedFooRouteRoute: typeof ParamsPsNamedFooRouteRouteWithChildren groupSubfolderInsideRoute: typeof groupSubfolderInsideRoute + ParamsPsNamedPrefixChar123fooChar125Route: typeof ParamsPsNamedPrefixChar123fooChar125Route + ParamsPsNamedChar123fooChar125suffixRoute: typeof ParamsPsNamedChar123fooChar125suffixRoute + ParamsPsWildcardSplatRoute: typeof ParamsPsWildcardSplatRoute + ParamsPsWildcardPrefixChar123Char125Route: typeof ParamsPsWildcardPrefixChar123Char125Route + ParamsPsWildcardChar123Char125suffixRoute: typeof ParamsPsWildcardChar123Char125suffixRoute ParamsSingleValueRoute: typeof ParamsSingleValueRoute PostsPostIdEditRoute: typeof PostsPostIdEditRoute RedirectPreloadFirstRoute: typeof RedirectPreloadFirstRoute RedirectPreloadSecondRoute: typeof RedirectPreloadSecondRoute RedirectPreloadThirdRoute: typeof RedirectPreloadThirdRoute + ParamsPsNamedIndexRoute: typeof ParamsPsNamedIndexRoute + ParamsPsWildcardIndexRoute: typeof ParamsPsWildcardIndexRoute } declare module '@tanstack/solid-router' { @@ -1240,6 +1335,20 @@ declare module '@tanstack/solid-router' { preLoaderRoute: typeof RedirectTargetIndexRouteImport parentRoute: typeof RedirectTargetRoute } + '/params-ps/wildcard/': { + id: '/params-ps/wildcard/' + path: '/params-ps/wildcard' + fullPath: '/params-ps/wildcard' + preLoaderRoute: typeof ParamsPsWildcardIndexRouteImport + parentRoute: typeof rootRouteImport + } + '/params-ps/named/': { + id: '/params-ps/named/' + path: '/params-ps/named' + fullPath: '/params-ps/named' + preLoaderRoute: typeof ParamsPsNamedIndexRouteImport + parentRoute: typeof rootRouteImport + } '/relative/useNavigate/relative-useNavigate-b': { id: '/relative/useNavigate/relative-useNavigate-b' path: '/relative-useNavigate-b' @@ -1303,8 +1412,8 @@ declare module '@tanstack/solid-router' { preLoaderRoute: typeof RedirectTargetViaBeforeLoadRouteImport parentRoute: typeof RedirectTargetRoute } - '/posts_/$postId/edit': { - id: '/posts_/$postId/edit' + '/posts/$postId/edit': { + id: '/posts/$postId/edit' path: '/posts/$postId/edit' fullPath: '/posts/$postId/edit' preLoaderRoute: typeof PostsPostIdEditRouteImport @@ -1317,6 +1426,41 @@ declare module '@tanstack/solid-router' { preLoaderRoute: typeof ParamsSingleValueRouteImport parentRoute: typeof rootRouteImport } + '/params-ps/wildcard/{$}suffix': { + id: '/params-ps/wildcard/{$}suffix' + path: '/params-ps/wildcard/{$}suffix' + fullPath: '/params-ps/wildcard/{$}suffix' + preLoaderRoute: typeof ParamsPsWildcardChar123Char125suffixRouteImport + parentRoute: typeof rootRouteImport + } + '/params-ps/wildcard/prefix{$}': { + id: '/params-ps/wildcard/prefix{$}' + path: '/params-ps/wildcard/prefix{$}' + fullPath: '/params-ps/wildcard/prefix{$}' + preLoaderRoute: typeof ParamsPsWildcardPrefixChar123Char125RouteImport + parentRoute: typeof rootRouteImport + } + '/params-ps/wildcard/$': { + id: '/params-ps/wildcard/$' + path: '/params-ps/wildcard/$' + fullPath: '/params-ps/wildcard/$' + preLoaderRoute: typeof ParamsPsWildcardSplatRouteImport + parentRoute: typeof rootRouteImport + } + '/params-ps/named/{$foo}suffix': { + id: '/params-ps/named/{$foo}suffix' + path: '/params-ps/named/{$foo}suffix' + fullPath: '/params-ps/named/{$foo}suffix' + preLoaderRoute: typeof ParamsPsNamedChar123fooChar125suffixRouteImport + parentRoute: typeof rootRouteImport + } + '/params-ps/named/prefix{$foo}': { + id: '/params-ps/named/prefix{$foo}' + path: '/params-ps/named/prefix{$foo}' + fullPath: '/params-ps/named/prefix{$foo}' + preLoaderRoute: typeof ParamsPsNamedPrefixChar123fooChar125RouteImport + parentRoute: typeof rootRouteImport + } '/_layout/_layout-2/layout-b': { id: '/_layout/_layout-2/layout-b' path: '/layout-b' @@ -1345,8 +1489,8 @@ declare module '@tanstack/solid-router' { preLoaderRoute: typeof groupLayoutInsidelayoutRouteImport parentRoute: typeof groupLayoutRoute } - '/params-ps/non-nested/$foo_': { - id: '/params-ps/non-nested/$foo_' + '/params-ps/non-nested/$foo': { + id: '/params-ps/non-nested/$foo' path: '/$foo' fullPath: '/params-ps/non-nested/$foo' preLoaderRoute: typeof ParamsPsNonNestedFooRouteRouteImport @@ -1457,20 +1601,13 @@ declare module '@tanstack/solid-router' { preLoaderRoute: typeof NonNestedNamedBazIndexRouteImport parentRoute: typeof NonNestedNamedBazRouteRoute } - '/params-ps/non-nested/$foo_/$bar': { - id: '/params-ps/non-nested/$foo_/$bar' + '/params-ps/non-nested/$foo/$bar': { + id: '/params-ps/non-nested/$foo/$bar' path: '/$bar' fullPath: '/params-ps/non-nested/$foo/$bar' preLoaderRoute: typeof ParamsPsNonNestedFooBarRouteImport parentRoute: typeof ParamsPsNonNestedFooRouteRoute } - '/non-nested/suffix/{$baz}suffix_/bar': { - id: '/non-nested/suffix/{$baz}suffix_/bar' - path: '/{$baz}suffix/bar' - fullPath: '/non-nested/suffix/{$baz}suffix/bar' - preLoaderRoute: typeof NonNestedSuffixChar123bazChar125suffixBarRouteImport - parentRoute: typeof NonNestedSuffixRouteRoute - } '/non-nested/suffix/{$baz}suffix/foo': { id: '/non-nested/suffix/{$baz}suffix/foo' path: '/foo' @@ -1478,12 +1615,12 @@ declare module '@tanstack/solid-router' { preLoaderRoute: typeof NonNestedSuffixChar123bazChar125suffixFooRouteImport parentRoute: typeof NonNestedSuffixChar123bazChar125suffixRouteRoute } - '/non-nested/prefix/prefix{$baz}_/bar': { - id: '/non-nested/prefix/prefix{$baz}_/bar' - path: '/prefix{$baz}/bar' - fullPath: '/non-nested/prefix/prefix{$baz}/bar' - preLoaderRoute: typeof NonNestedPrefixPrefixChar123bazChar125BarRouteImport - parentRoute: typeof NonNestedPrefixRouteRoute + '/non-nested/suffix/{$baz}suffix/bar': { + id: '/non-nested/suffix/{$baz}suffix/bar' + path: '/{$baz}suffix/bar' + fullPath: '/non-nested/suffix/{$baz}suffix/bar' + preLoaderRoute: typeof NonNestedSuffixChar123bazChar125suffixBarRouteImport + parentRoute: typeof NonNestedSuffixRouteRoute } '/non-nested/prefix/prefix{$baz}/foo': { id: '/non-nested/prefix/prefix{$baz}/foo' @@ -1492,12 +1629,12 @@ declare module '@tanstack/solid-router' { preLoaderRoute: typeof NonNestedPrefixPrefixChar123bazChar125FooRouteImport parentRoute: typeof NonNestedPrefixPrefixChar123bazChar125RouteRoute } - '/non-nested/path/baz_/bar': { - id: '/non-nested/path/baz_/bar' - path: '/baz/bar' - fullPath: '/non-nested/path/baz/bar' - preLoaderRoute: typeof NonNestedPathBazBarRouteImport - parentRoute: typeof NonNestedPathRouteRoute + '/non-nested/prefix/prefix{$baz}/bar': { + id: '/non-nested/prefix/prefix{$baz}/bar' + path: '/prefix{$baz}/bar' + fullPath: '/non-nested/prefix/prefix{$baz}/bar' + preLoaderRoute: typeof NonNestedPrefixPrefixChar123bazChar125BarRouteImport + parentRoute: typeof NonNestedPrefixRouteRoute } '/non-nested/path/baz/foo': { id: '/non-nested/path/baz/foo' @@ -1506,12 +1643,12 @@ declare module '@tanstack/solid-router' { preLoaderRoute: typeof NonNestedPathBazFooRouteImport parentRoute: typeof NonNestedPathBazRouteRoute } - '/non-nested/named/$baz_/bar': { - id: '/non-nested/named/$baz_/bar' - path: '/$baz/bar' - fullPath: '/non-nested/named/$baz/bar' - preLoaderRoute: typeof NonNestedNamedBazBarRouteImport - parentRoute: typeof NonNestedNamedRouteRoute + '/non-nested/path/baz/bar': { + id: '/non-nested/path/baz/bar' + path: '/baz/bar' + fullPath: '/non-nested/path/baz/bar' + preLoaderRoute: typeof NonNestedPathBazBarRouteImport + parentRoute: typeof NonNestedPathRouteRoute } '/non-nested/named/$baz/foo': { id: '/non-nested/named/$baz/foo' @@ -1520,6 +1657,13 @@ declare module '@tanstack/solid-router' { preLoaderRoute: typeof NonNestedNamedBazFooRouteImport parentRoute: typeof NonNestedNamedBazRouteRoute } + '/non-nested/named/$baz/bar': { + id: '/non-nested/named/$baz/bar' + path: '/$baz/bar' + fullPath: '/non-nested/named/$baz/bar' + preLoaderRoute: typeof NonNestedNamedBazBarRouteImport + parentRoute: typeof NonNestedNamedRouteRoute + } '/params-ps/named/$foo/$bar': { id: '/params-ps/named/$foo/$bar' path: '/$bar' @@ -1920,11 +2064,22 @@ const rootRouteChildren: RootRouteChildren = { RelativeIndexRoute: RelativeIndexRoute, ParamsPsNamedFooRouteRoute: ParamsPsNamedFooRouteRouteWithChildren, groupSubfolderInsideRoute: groupSubfolderInsideRoute, + ParamsPsNamedPrefixChar123fooChar125Route: + ParamsPsNamedPrefixChar123fooChar125Route, + ParamsPsNamedChar123fooChar125suffixRoute: + ParamsPsNamedChar123fooChar125suffixRoute, + ParamsPsWildcardSplatRoute: ParamsPsWildcardSplatRoute, + ParamsPsWildcardPrefixChar123Char125Route: + ParamsPsWildcardPrefixChar123Char125Route, + ParamsPsWildcardChar123Char125suffixRoute: + ParamsPsWildcardChar123Char125suffixRoute, ParamsSingleValueRoute: ParamsSingleValueRoute, PostsPostIdEditRoute: PostsPostIdEditRoute, RedirectPreloadFirstRoute: RedirectPreloadFirstRoute, RedirectPreloadSecondRoute: RedirectPreloadSecondRoute, RedirectPreloadThirdRoute: RedirectPreloadThirdRoute, + ParamsPsNamedIndexRoute: ParamsPsNamedIndexRoute, + ParamsPsWildcardIndexRoute: ParamsPsWildcardIndexRoute, } export const routeTree = rootRouteImport ._addFileChildren(rootRouteChildren) diff --git a/e2e/solid-router/basic-file-based/src/routes/non-nested/named/$baz_.bar.tsx b/e2e/solid-router/basic-file-based/src/routes/non-nested/named/$baz_.bar.tsx index 1f2170a771d..62f9c14c360 100644 --- a/e2e/solid-router/basic-file-based/src/routes/non-nested/named/$baz_.bar.tsx +++ b/e2e/solid-router/basic-file-based/src/routes/non-nested/named/$baz_.bar.tsx @@ -1,6 +1,6 @@ import { createFileRoute } from '@tanstack/solid-router' -export const Route = createFileRoute('/non-nested/named/$baz_/bar')({ +export const Route = createFileRoute('/non-nested/named/$baz/bar')({ component: RouteComponent, }) diff --git a/e2e/solid-router/basic-file-based/src/routes/non-nested/path/baz_.bar.tsx b/e2e/solid-router/basic-file-based/src/routes/non-nested/path/baz_.bar.tsx index 462c0ee4e14..2fe5ccb12b4 100644 --- a/e2e/solid-router/basic-file-based/src/routes/non-nested/path/baz_.bar.tsx +++ b/e2e/solid-router/basic-file-based/src/routes/non-nested/path/baz_.bar.tsx @@ -1,6 +1,6 @@ import { createFileRoute } from '@tanstack/solid-router' -export const Route = createFileRoute('/non-nested/path/baz_/bar')({ +export const Route = createFileRoute('/non-nested/path/baz/bar')({ component: RouteComponent, }) diff --git a/e2e/solid-router/basic-file-based/src/routes/non-nested/prefix/prefix{$baz}_.bar.tsx b/e2e/solid-router/basic-file-based/src/routes/non-nested/prefix/prefix{$baz}_.bar.tsx index c1a3928b011..0377b04ffa1 100644 --- a/e2e/solid-router/basic-file-based/src/routes/non-nested/prefix/prefix{$baz}_.bar.tsx +++ b/e2e/solid-router/basic-file-based/src/routes/non-nested/prefix/prefix{$baz}_.bar.tsx @@ -1,6 +1,6 @@ import { createFileRoute } from '@tanstack/solid-router' -export const Route = createFileRoute('/non-nested/prefix/prefix{$baz}_/bar')({ +export const Route = createFileRoute('/non-nested/prefix/prefix{$baz}/bar')({ component: RouteComponent, }) diff --git a/e2e/solid-router/basic-file-based/src/routes/non-nested/suffix/{$baz}suffix_.bar.tsx b/e2e/solid-router/basic-file-based/src/routes/non-nested/suffix/{$baz}suffix_.bar.tsx index 26403727c65..ef3eea2d5d9 100644 --- a/e2e/solid-router/basic-file-based/src/routes/non-nested/suffix/{$baz}suffix_.bar.tsx +++ b/e2e/solid-router/basic-file-based/src/routes/non-nested/suffix/{$baz}suffix_.bar.tsx @@ -1,6 +1,6 @@ import { createFileRoute } from '@tanstack/solid-router' -export const Route = createFileRoute('/non-nested/suffix/{$baz}suffix_/bar')({ +export const Route = createFileRoute('/non-nested/suffix/{$baz}suffix/bar')({ component: RouteComponent, }) diff --git a/e2e/solid-router/basic-file-based/src/routes/params-ps/index.tsx b/e2e/solid-router/basic-file-based/src/routes/params-ps/index.tsx index 14a840c3a3c..c6cfe435aa8 100644 --- a/e2e/solid-router/basic-file-based/src/routes/params-ps/index.tsx +++ b/e2e/solid-router/basic-file-based/src/routes/params-ps/index.tsx @@ -18,6 +18,55 @@ function RouteComponent() { /params-ps/named/$foo +
  • + + /params-ps/named/{'prefix{$foo}'} + +
  • +
  • + + /params-ps/named/{'{$foo}suffix'} + +
  • + +
    +

    Wildcard path params

    +

    Non-nested path params

    diff --git a/e2e/solid-router/basic-file-based/src/routes/params-ps/named/index.tsx b/e2e/solid-router/basic-file-based/src/routes/params-ps/named/index.tsx new file mode 100644 index 00000000000..2e2f3ef9177 --- /dev/null +++ b/e2e/solid-router/basic-file-based/src/routes/params-ps/named/index.tsx @@ -0,0 +1,7 @@ +import { createFileRoute, redirect } from '@tanstack/solid-router' + +export const Route = createFileRoute('/params-ps/named/')({ + beforeLoad: () => { + throw redirect({ to: '/params-ps' }) + }, +}) diff --git a/e2e/solid-router/basic-file-based/src/routes/params-ps/named/prefix{$foo}.tsx b/e2e/solid-router/basic-file-based/src/routes/params-ps/named/prefix{$foo}.tsx new file mode 100644 index 00000000000..8e312b2e929 --- /dev/null +++ b/e2e/solid-router/basic-file-based/src/routes/params-ps/named/prefix{$foo}.tsx @@ -0,0 +1,14 @@ +import { createFileRoute } from '@tanstack/solid-router' +export const Route = createFileRoute('/params-ps/named/prefix{$foo}')({ + component: RouteComponent, +}) + +function RouteComponent() { + const p = Route.useParams() + return ( +
    +

    ParamsNamedFooPrefix

    +
    {JSON.stringify(p())}
    +
    + ) +} diff --git a/e2e/solid-router/basic-file-based/src/routes/params-ps/named/{$foo}suffix.tsx b/e2e/solid-router/basic-file-based/src/routes/params-ps/named/{$foo}suffix.tsx new file mode 100644 index 00000000000..b6f9c804d42 --- /dev/null +++ b/e2e/solid-router/basic-file-based/src/routes/params-ps/named/{$foo}suffix.tsx @@ -0,0 +1,14 @@ +import { createFileRoute } from '@tanstack/solid-router' +export const Route = createFileRoute('/params-ps/named/{$foo}suffix')({ + component: RouteComponent, +}) + +function RouteComponent() { + const p = Route.useParams() + return ( +
    +

    ParamsNamedFooSuffix

    +
    {JSON.stringify(p())}
    +
    + ) +} diff --git a/e2e/solid-router/basic-file-based/src/routes/params-ps/non-nested/$foo_/$bar.tsx b/e2e/solid-router/basic-file-based/src/routes/params-ps/non-nested/$foo_/$bar.tsx index 221716f9836..09259c9e077 100644 --- a/e2e/solid-router/basic-file-based/src/routes/params-ps/non-nested/$foo_/$bar.tsx +++ b/e2e/solid-router/basic-file-based/src/routes/params-ps/non-nested/$foo_/$bar.tsx @@ -1,7 +1,7 @@ import { createFileRoute, useParams } from '@tanstack/solid-router' import { useExperimentalNonNestedRoutes } from '../../../../../tests/utils/useExperimentalNonNestedRoutes' -export const Route = createFileRoute('/params-ps/non-nested/$foo_/$bar')({ +export const Route = createFileRoute('/params-ps/non-nested/$foo/$bar')({ component: RouteComponent, }) diff --git a/e2e/solid-router/basic-file-based/src/routes/params-ps/non-nested/$foo_/route.tsx b/e2e/solid-router/basic-file-based/src/routes/params-ps/non-nested/$foo_/route.tsx index b0611e8627a..a6349718a99 100644 --- a/e2e/solid-router/basic-file-based/src/routes/params-ps/non-nested/$foo_/route.tsx +++ b/e2e/solid-router/basic-file-based/src/routes/params-ps/non-nested/$foo_/route.tsx @@ -1,3 +1,3 @@ import { createFileRoute } from '@tanstack/solid-router' -export const Route = createFileRoute('/params-ps/non-nested/$foo_')() +export const Route = createFileRoute('/params-ps/non-nested/$foo')() diff --git a/e2e/solid-router/basic-file-based/src/routes/params-ps/wildcard/$.tsx b/e2e/solid-router/basic-file-based/src/routes/params-ps/wildcard/$.tsx new file mode 100644 index 00000000000..ce0e048db8a --- /dev/null +++ b/e2e/solid-router/basic-file-based/src/routes/params-ps/wildcard/$.tsx @@ -0,0 +1,14 @@ +import { createFileRoute } from '@tanstack/solid-router' +export const Route = createFileRoute('/params-ps/wildcard/$')({ + component: RouteComponent, +}) + +function RouteComponent() { + const p = Route.useParams() + return ( +
    +

    ParamsWildcardSplat

    +
    {JSON.stringify(p())}
    +
    + ) +} diff --git a/e2e/solid-router/basic-file-based/src/routes/params-ps/wildcard/index.tsx b/e2e/solid-router/basic-file-based/src/routes/params-ps/wildcard/index.tsx new file mode 100644 index 00000000000..2acc75d10c6 --- /dev/null +++ b/e2e/solid-router/basic-file-based/src/routes/params-ps/wildcard/index.tsx @@ -0,0 +1,8 @@ +import { createFileRoute } from '@tanstack/solid-router' +import { redirect } from '@tanstack/solid-router' + +export const Route = createFileRoute('/params-ps/wildcard/')({ + beforeLoad: () => { + throw redirect({ to: '/params-ps' }) + }, +}) diff --git a/e2e/solid-router/basic-file-based/src/routes/params-ps/wildcard/prefix{$}.tsx b/e2e/solid-router/basic-file-based/src/routes/params-ps/wildcard/prefix{$}.tsx new file mode 100644 index 00000000000..85774b6e510 --- /dev/null +++ b/e2e/solid-router/basic-file-based/src/routes/params-ps/wildcard/prefix{$}.tsx @@ -0,0 +1,14 @@ +import { createFileRoute } from '@tanstack/solid-router' +export const Route = createFileRoute('/params-ps/wildcard/prefix{$}')({ + component: RouteComponent, +}) + +function RouteComponent() { + const p = Route.useParams() + return ( +
    +

    ParamsWildcardSplatPrefix

    +
    {JSON.stringify(p())}
    +
    + ) +} diff --git a/e2e/solid-router/basic-file-based/src/routes/params-ps/wildcard/{$}suffix.tsx b/e2e/solid-router/basic-file-based/src/routes/params-ps/wildcard/{$}suffix.tsx new file mode 100644 index 00000000000..7facaef073a --- /dev/null +++ b/e2e/solid-router/basic-file-based/src/routes/params-ps/wildcard/{$}suffix.tsx @@ -0,0 +1,14 @@ +import { createFileRoute } from '@tanstack/solid-router' +export const Route = createFileRoute('/params-ps/wildcard/{$}suffix')({ + component: RouteComponent, +}) + +function RouteComponent() { + const p = Route.useParams() + return ( +
    +

    ParamsWildcardSplatSuffix

    +
    {JSON.stringify(p())}
    +
    + ) +} diff --git a/e2e/solid-router/basic-file-based/src/routes/posts_.$postId.edit.tsx b/e2e/solid-router/basic-file-based/src/routes/posts_.$postId.edit.tsx index 576d1245a5c..0204720344c 100644 --- a/e2e/solid-router/basic-file-based/src/routes/posts_.$postId.edit.tsx +++ b/e2e/solid-router/basic-file-based/src/routes/posts_.$postId.edit.tsx @@ -1,7 +1,7 @@ import { createFileRoute, getRouteApi, useParams } from '@tanstack/solid-router' import { useExperimentalNonNestedRoutes } from '../../tests/utils/useExperimentalNonNestedRoutes' -export const Route = createFileRoute('/posts_/$postId/edit')({ +export const Route = createFileRoute('/posts/$postId/edit')({ component: PostEditPage, }) diff --git a/e2e/solid-router/basic-file-based/tests/params.spec.ts b/e2e/solid-router/basic-file-based/tests/params.spec.ts index c6ee258a85d..83d0dc18d0f 100644 --- a/e2e/solid-router/basic-file-based/tests/params.spec.ts +++ b/e2e/solid-router/basic-file-based/tests/params.spec.ts @@ -193,3 +193,235 @@ test.describe('params operations + non-nested routes', () => { } }) }) + +test.describe('params operations + prefix/suffix', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/params-ps') + }) + + test.describe('named params', () => { + const NAMED_PARAMS_PAIRS = [ + // Test ID | Expected href + { + id: 'l-to-named-foo', + pathname: '/params-ps/named/foo', + params: { foo: 'foo' }, + destHeadingId: 'ParamsNamedFoo', + }, + { + id: 'l-to-named-prefixfoo', + pathname: '/params-ps/named/prefixfoo', + params: { foo: 'foo' }, + destHeadingId: 'ParamsNamedFooPrefix', + }, + { + id: 'l-to-named-foosuffix', + pathname: '/params-ps/named/foosuffix', + params: { foo: 'foo' }, + destHeadingId: 'ParamsNamedFooSuffix', + }, + ] satisfies Array<{ + id: string + pathname: string + params: Record + destHeadingId: string + }> + + test.describe('Link', () => { + NAMED_PARAMS_PAIRS.forEach(({ id, pathname }) => { + test(`interpolation for testid="${id}" has href="${pathname}"`, async ({ + page, + }) => { + const link = page.getByTestId(id) + await expect(link).toHaveAttribute('href', pathname) + }) + }) + + NAMED_PARAMS_PAIRS.forEach(({ id, pathname }) => { + test(`navigation for testid="${id}" succeeds to href="${pathname}"`, async ({ + page, + }) => { + const link = page.getByTestId(id) + await link.click() + await page.waitForLoadState('networkidle') + const pagePathname = new URL(page.url()).pathname + expect(pagePathname).toBe(pathname) + }) + }) + }) + + NAMED_PARAMS_PAIRS.forEach(({ pathname, params, destHeadingId }) => { + test(`on first-load to "${pathname}" has correct params`, async ({ + page, + }) => { + await page.goto(pathname) + await page.waitForLoadState('networkidle') + const pagePathname = new URL(page.url()).pathname + expect(pagePathname).toBe(pathname) + + const headingEl = page.getByRole('heading', { name: destHeadingId }) + await expect(headingEl).toBeVisible() + + const paramsEl = page.getByTestId('params-output') + const paramsText = await paramsEl.innerText() + const paramsObj = JSON.parse(paramsText) + expect(paramsObj).toEqual(params) + }) + }) + + test(`ensure use params doesn't cause excess renders and is stable across various usage options`, async ({ + page, + }) => { + await page.goto('/params-ps/named/foo') + await page.waitForLoadState('networkidle') + + const pagePathname = new URL(page.url()).pathname + expect(pagePathname).toBe('/params-ps/named/foo') + + const fooRenderCount = page.getByTestId('foo-render-count') + const fooIndexLink = page.getByTestId('params-foo-links-index') + const fooBar1Link = page.getByTestId('params-foo-links-bar1') + const fooBar2Link = page.getByTestId('params-foo-links-bar2') + const fooBarBazLink = page.getByTestId('params-foo-bar-links-baz') + const fooValue = page.getByTestId('params-output') + const fooBarValue = page.getByTestId('foo-bar-value') + const fooBazInBarValue = page.getByTestId('foo-baz-in-bar-value') + const fooBarRenderCount = page.getByTestId('foo-bar-render-count') + const fooBarBazValue = page.getByTestId('foo-bar-baz-value') + + await expect(fooRenderCount).toBeInViewport() + await expect(fooValue).toBeInViewport() + await expect(fooIndexLink).toBeInViewport() + await expect(fooBar1Link).toBeInViewport() + await expect(fooBar2Link).toBeInViewport() + await expect(fooRenderCount).toHaveText('1') + await expect(fooValue).toHaveText(JSON.stringify({ foo: 'foo' })) + + await fooBar1Link.click() + await page.waitForLoadState('networkidle') + await expect(fooValue).toBeInViewport() + await expect(fooRenderCount).toBeInViewport() + await expect(fooBarRenderCount).toBeInViewport() + await expect(fooBarValue).toBeInViewport() + await expect(fooBazInBarValue).toBeInViewport() + await expect(fooBarBazLink).toBeInViewport() + await expect(fooValue).toHaveText(JSON.stringify({ foo: 'foo' })) + await expect(fooRenderCount).toHaveText('1') + await expect(fooBarRenderCount).toHaveText('1') + await expect(fooBarValue).toHaveText('1') + await expect(fooBazInBarValue).toHaveText('no param') + + await fooBarBazLink.click() + await page.waitForLoadState('networkidle') + await expect(fooValue).toBeInViewport() + await expect(fooRenderCount).toBeInViewport() + await expect(fooBarRenderCount).toBeInViewport() + await expect(fooBarValue).toBeInViewport() + await expect(fooBazInBarValue).toBeInViewport() + await expect(fooValue).toHaveText(JSON.stringify({ foo: 'foo' })) + await expect(fooRenderCount).toHaveText('1') + await expect(fooBarRenderCount).toHaveText('1') + await expect(fooBarValue).toHaveText('1') + await expect(fooBazInBarValue).toHaveText('1_10') + await expect(fooBarBazValue).toHaveText('1_10') + + await fooBar2Link.click() + await page.waitForLoadState('networkidle') + await expect(fooValue).toBeInViewport() + await expect(fooRenderCount).toBeInViewport() + await expect(fooBarValue).toBeInViewport() + await expect(fooValue).toHaveText(JSON.stringify({ foo: 'foo' })) + await expect(fooRenderCount).toHaveText('1') + await expect(fooBarValue).toHaveText('2') + + await fooIndexLink.click() + await page.waitForLoadState('networkidle') + await expect(fooValue).toBeInViewport() + await expect(fooRenderCount).toBeInViewport() + await expect(fooBarValue).not.toBeInViewport() + await expect(fooValue).toHaveText(JSON.stringify({ foo: 'foo' })) + await expect(fooRenderCount).toHaveText('1') + }) + }) + + test.describe('wildcard param', () => { + const WILDCARD_PARAM_PAIRS = [ + // Test ID | Expected href + { + id: 'l-to-wildcard-foo', + pathname: '/params-ps/wildcard/foo', + params: { '*': 'foo', _splat: 'foo' }, + destHeadingId: 'ParamsWildcardSplat', + }, + { + id: 'l-to-wildcard-prefixfoo', + pathname: '/params-ps/wildcard/prefixfoo', + params: { '*': 'foo', _splat: 'foo' }, + destHeadingId: 'ParamsWildcardSplatPrefix', + }, + { + id: 'l-to-wildcard-foosuffix', + pathname: '/params-ps/wildcard/foosuffix', + params: { '*': 'foo', _splat: 'foo' }, + destHeadingId: 'ParamsWildcardSplatSuffix', + }, + ] satisfies Array<{ + id: string + pathname: string + params: Record + destHeadingId: string + }> + + test.describe('Link', () => { + WILDCARD_PARAM_PAIRS.forEach(({ id, pathname }) => { + test(`interpolation for testid="${id}" has href="${pathname}"`, async ({ + page, + }) => { + const link = page.getByTestId(id) + await expect(link).toHaveAttribute('href', pathname) + }) + }) + + WILDCARD_PARAM_PAIRS.forEach(({ id, pathname }) => { + test(`navigation for testid="${id}" succeeds to href="${pathname}"`, async ({ + page, + }) => { + const link = page.getByTestId(id) + await link.click() + await page.waitForLoadState('networkidle') + const pagePathname = new URL(page.url()).pathname + expect(pagePathname).toBe(pathname) + }) + }) + }) + + WILDCARD_PARAM_PAIRS.forEach(({ pathname, params, destHeadingId }) => { + test(`on first-load to "${pathname}" has correct params`, async ({ + page, + }) => { + await page.goto(pathname) + await page.waitForLoadState('networkidle') + const pagePathname = new URL(page.url()).pathname + expect(pagePathname).toBe(pathname) + + const headingEl = page.getByRole('heading', { name: destHeadingId }) + await expect(headingEl).toBeVisible() + + const paramsEl = page.getByTestId('params-output') + const paramsText = await paramsEl.innerText() + const paramsObj = JSON.parse(paramsText) + expect(paramsObj).toEqual(params) + }) + }) + }) +}) + +test.describe('Unicode route rendering', () => { + test('should render non-latin route correctly', async ({ page, baseURL }) => { + await page.goto('/대한민국') + + await expect(page.locator('body')).toContainText('Hello "/대한민국"!') + + expect(page.url()).toBe(`${baseURL}/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD`) + }) +})