diff --git a/e2e/solid-router/basepath-file-based/.gitignore b/e2e/solid-router/basepath-file-based/.gitignore new file mode 100644 index 00000000000..4d2da67b504 --- /dev/null +++ b/e2e/solid-router/basepath-file-based/.gitignore @@ -0,0 +1,11 @@ +node_modules +.DS_Store +dist +dist-hash +dist-ssr +*.local + +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/e2e/solid-router/basepath-file-based/index.html b/e2e/solid-router/basepath-file-based/index.html new file mode 100644 index 00000000000..21e30f16951 --- /dev/null +++ b/e2e/solid-router/basepath-file-based/index.html @@ -0,0 +1,11 @@ + + + + + + + +
+ + + diff --git a/e2e/solid-router/basepath-file-based/package.json b/e2e/solid-router/basepath-file-based/package.json new file mode 100644 index 00000000000..4e6b06172a8 --- /dev/null +++ b/e2e/solid-router/basepath-file-based/package.json @@ -0,0 +1,25 @@ +{ + "name": "tanstack-solid-router-e2e-react-basepath-file-based", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port 3000", + "dev:e2e": "vite", + "build": "vite build && tsc --noEmit", + "serve": "vite preview", + "start": "vite", + "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" + }, + "dependencies": { + "@tanstack/solid-router": "workspace:^", + "@tanstack/solid-router-devtools": "workspace:^", + "@tanstack/router-plugin": "workspace:^", + "solid-js": "^1.9.9" + }, + "devDependencies": { + "@playwright/test": "^1.50.1", + "@tanstack/router-e2e-utils": "workspace:^", + "vite-plugin-solid": "^2.11.10", + "vite": "^7.1.7" + } +} diff --git a/e2e/solid-router/basepath-file-based/playwright.config.ts b/e2e/solid-router/basepath-file-based/playwright.config.ts new file mode 100644 index 00000000000..4dc2271f01e --- /dev/null +++ b/e2e/solid-router/basepath-file-based/playwright.config.ts @@ -0,0 +1,41 @@ +import { defineConfig, devices } from '@playwright/test' +import { + getDummyServerPort, + getTestServerPort, +} from '@tanstack/router-e2e-utils' +import packageJson from './package.json' with { type: 'json' } + +const PORT = await getTestServerPort(packageJson.name) +const EXTERNAL_PORT = await getDummyServerPort(packageJson.name) +const baseURL = `http://localhost:${PORT}` +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './tests', + workers: 1, + + reporter: [['line']], + + globalSetup: './tests/setup/global.setup.ts', + globalTeardown: './tests/setup/global.teardown.ts', + + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL, + }, + + webServer: { + command: `VITE_NODE_ENV="test" VITE_SERVER_PORT=${PORT} VITE_EXTERNAL_PORT=${EXTERNAL_PORT} pnpm build && VITE_SERVER_PORT=${PORT} pnpm serve --port ${PORT}`, + url: baseURL, + reuseExistingServer: !process.env.CI, + stdout: 'pipe', + }, + + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], +}) diff --git a/e2e/solid-router/basepath-file-based/src/main.tsx b/e2e/solid-router/basepath-file-based/src/main.tsx new file mode 100644 index 00000000000..23304bb7320 --- /dev/null +++ b/e2e/solid-router/basepath-file-based/src/main.tsx @@ -0,0 +1,25 @@ +import { RouterProvider, createRouter } from '@tanstack/solid-router' +import { render } from 'solid-js/web' +import { routeTree } from './routeTree.gen' + +// Set up a Router instance +const router = createRouter({ + routeTree, + defaultPreload: 'intent', + defaultStaleTime: 5000, + scrollRestoration: true, + basepath: '/app', +}) + +// Register things for typesafety +declare module '@tanstack/solid-router' { + interface Register { + router: typeof router + } +} + +const rootElement = document.getElementById('app')! + +if (!rootElement.innerHTML) { + render(() => , rootElement) +} diff --git a/e2e/solid-router/basepath-file-based/src/routeTree.gen.ts b/e2e/solid-router/basepath-file-based/src/routeTree.gen.ts new file mode 100644 index 00000000000..333a815c38c --- /dev/null +++ b/e2e/solid-router/basepath-file-based/src/routeTree.gen.ts @@ -0,0 +1,77 @@ +/* eslint-disable */ + +// @ts-nocheck + +// noinspection JSUnusedGlobalSymbols + +// This file was automatically generated by TanStack Router. +// You should NOT make any changes in this file as it will be overwritten. +// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified. + +import { Route as rootRouteImport } from './routes/__root' +import { Route as AboutRouteImport } from './routes/about' +import { Route as IndexRouteImport } from './routes/index' + +const AboutRoute = AboutRouteImport.update({ + id: '/about', + path: '/about', + getParentRoute: () => rootRouteImport, +} as any) +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +} as any) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute + '/about': typeof AboutRoute +} +export interface FileRoutesByTo { + '/': typeof IndexRoute + '/about': typeof AboutRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/': typeof IndexRoute + '/about': typeof AboutRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' | '/about' + fileRoutesByTo: FileRoutesByTo + to: '/' | '/about' + id: '__root__' | '/' | '/about' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute + AboutRoute: typeof AboutRoute +} + +declare module '@tanstack/solid-router' { + interface FileRoutesByPath { + '/about': { + id: '/about' + path: '/about' + fullPath: '/about' + preLoaderRoute: typeof AboutRouteImport + parentRoute: typeof rootRouteImport + } + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + } +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, + AboutRoute: AboutRoute, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() diff --git a/e2e/solid-router/basepath-file-based/src/routes/__root.tsx b/e2e/solid-router/basepath-file-based/src/routes/__root.tsx new file mode 100644 index 00000000000..ec0a00b1a97 --- /dev/null +++ b/e2e/solid-router/basepath-file-based/src/routes/__root.tsx @@ -0,0 +1,3 @@ +import { createRootRoute } from '@tanstack/solid-router' + +export const Route = createRootRoute() diff --git a/e2e/solid-router/basepath-file-based/src/routes/about.tsx b/e2e/solid-router/basepath-file-based/src/routes/about.tsx new file mode 100644 index 00000000000..30eead09d9f --- /dev/null +++ b/e2e/solid-router/basepath-file-based/src/routes/about.tsx @@ -0,0 +1,20 @@ +import { createFileRoute } from '@tanstack/solid-router' + +export const Route = createFileRoute('/about')({ + component: RouteComponent, +}) + +function RouteComponent() { + const navigate = Route.useNavigate() + + return ( +
+ +
+ ) +} diff --git a/e2e/solid-router/basepath-file-based/src/routes/index.tsx b/e2e/solid-router/basepath-file-based/src/routes/index.tsx new file mode 100644 index 00000000000..a43e4e7313b --- /dev/null +++ b/e2e/solid-router/basepath-file-based/src/routes/index.tsx @@ -0,0 +1,25 @@ +import { createFileRoute } from '@tanstack/solid-router' + +export const Route = createFileRoute('/')({ + component: App, +}) + +function App() { + const navigate = Route.useNavigate() + + return ( +
+ +
+ ) +} diff --git a/e2e/solid-router/basepath-file-based/tests/reload-document.test.ts b/e2e/solid-router/basepath-file-based/tests/reload-document.test.ts new file mode 100644 index 00000000000..3e60f3bedcb --- /dev/null +++ b/e2e/solid-router/basepath-file-based/tests/reload-document.test.ts @@ -0,0 +1,18 @@ +import { expect, test } from '@playwright/test' + +test('navigate() respects basepath for when reloadDocument=true', async ({ + page, +}) => { + await page.goto(`/app/`) + await expect(page.getByTestId(`home-component`)).toBeInViewport() + + const aboutBtn = page.getByTestId(`to-about-btn`) + await aboutBtn.click() + await page.waitForURL('/app/about') + await expect(page.getByTestId(`about-component`)).toBeInViewport() + + const homeBtn = page.getByTestId(`to-home-btn`) + await homeBtn.click() + await page.waitForURL('/app/') + await expect(page.getByTestId(`home-component`)).toBeInViewport() +}) diff --git a/e2e/solid-router/basepath-file-based/tests/setup/global.setup.ts b/e2e/solid-router/basepath-file-based/tests/setup/global.setup.ts new file mode 100644 index 00000000000..3593d10ab90 --- /dev/null +++ b/e2e/solid-router/basepath-file-based/tests/setup/global.setup.ts @@ -0,0 +1,6 @@ +import { e2eStartDummyServer } from '@tanstack/router-e2e-utils' +import packageJson from '../../package.json' with { type: 'json' } + +export default async function setup() { + await e2eStartDummyServer(packageJson.name) +} diff --git a/e2e/solid-router/basepath-file-based/tests/setup/global.teardown.ts b/e2e/solid-router/basepath-file-based/tests/setup/global.teardown.ts new file mode 100644 index 00000000000..62fd79911cc --- /dev/null +++ b/e2e/solid-router/basepath-file-based/tests/setup/global.teardown.ts @@ -0,0 +1,6 @@ +import { e2eStopDummyServer } from '@tanstack/router-e2e-utils' +import packageJson from '../../package.json' with { type: 'json' } + +export default async function teardown() { + await e2eStopDummyServer(packageJson.name) +} diff --git a/e2e/solid-router/basepath-file-based/tsconfig.json b/e2e/solid-router/basepath-file-based/tsconfig.json new file mode 100644 index 00000000000..9ca79abe0a9 --- /dev/null +++ b/e2e/solid-router/basepath-file-based/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "preserve", + "jsxImportSource": "solid-js", + "target": "ESNext", + "moduleResolution": "Bundler", + "module": "ESNext", + "skipLibCheck": true, + "resolveJsonModule": true, + "allowJs": true, + "types": ["vite/client"] + }, + "exclude": ["node_modules", "dist"] +} diff --git a/e2e/solid-router/basepath-file-based/vite.config.js b/e2e/solid-router/basepath-file-based/vite.config.js new file mode 100644 index 00000000000..29470dc9e4a --- /dev/null +++ b/e2e/solid-router/basepath-file-based/vite.config.js @@ -0,0 +1,9 @@ +import { defineConfig } from 'vite' +import solid from 'vite-plugin-solid' +import { tanstackRouter } from '@tanstack/router-plugin/vite' + +// https://vitejs.dev/config/ +export default defineConfig({ + base: '/app/', + plugins: [tanstackRouter({ target: 'solid' }), solid()], +}) 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..a57c9910191 100644 --- a/e2e/solid-router/basic-file-based/src/routeTree.gen.ts +++ b/e2e/solid-router/basic-file-based/src/routeTree.gen.ts @@ -74,14 +74,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' @@ -307,7 +307,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) @@ -338,7 +338,7 @@ const groupLayoutInsidelayoutRoute = groupLayoutInsidelayoutRouteImport.update({ } as any) const ParamsPsNonNestedFooRouteRoute = ParamsPsNonNestedFooRouteRouteImport.update({ - id: '/$foo_', + id: '/$foo', path: '/$foo', getParentRoute: () => ParamsPsNonNestedRouteRoute, } as any) @@ -430,23 +430,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 +448,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', @@ -563,14 +563,14 @@ export interface FileRoutesByFullPath { '/relative/useNavigate/relative-useNavigate-b': typeof RelativeUseNavigateRelativeUseNavigateBRoute '/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 @@ -634,14 +634,14 @@ export interface FileRoutesByTo { '/relative/useNavigate/relative-useNavigate-b': typeof RelativeUseNavigateRelativeUseNavigateBRoute '/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 +698,13 @@ 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/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 @@ -716,15 +716,15 @@ export interface FileRoutesById { '/relative/useNavigate/relative-useNavigate-b': typeof RelativeUseNavigateRelativeUseNavigateBRoute '/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 @@ -796,14 +796,14 @@ export interface FileRouteTypes { | '/relative/useNavigate/relative-useNavigate-b' | '/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/' @@ -867,14 +867,14 @@ export interface FileRouteTypes { | '/relative/useNavigate/relative-useNavigate-b' | '/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 +930,13 @@ 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/single/$value' - | '/posts_/$postId/edit' + | '/posts/$postId/edit' | '/redirect/$target/via-beforeLoad' | '/redirect/$target/via-loader' | '/redirect/preload/first' @@ -948,15 +948,15 @@ export interface FileRouteTypes { | '/relative/useNavigate/relative-useNavigate-b' | '/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}/' @@ -1303,8 +1303,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 @@ -1345,8 +1345,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 +1457,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 +1471,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 +1485,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 +1499,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 +1513,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' 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/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/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/pnpm-lock.yaml b/pnpm-lock.yaml index 7f9ea6636bf..f0069c634f1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1990,6 +1990,34 @@ importers: specifier: ^5.1.4 version: 5.1.4(typescript@5.8.2)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + e2e/solid-router/basepath-file-based: + dependencies: + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + '@tanstack/solid-router': + specifier: workspace:^ + version: link:../../../packages/solid-router + '@tanstack/solid-router-devtools': + specifier: workspace:^ + version: link:../../../packages/solid-router-devtools + solid-js: + specifier: 1.9.9 + version: 1.9.9 + devDependencies: + '@playwright/test': + specifier: ^1.52.0 + version: 1.52.0 + '@tanstack/router-e2e-utils': + specifier: workspace:^ + version: link:../../e2e-utils + vite: + specifier: ^7.1.7 + version: 7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1) + vite-plugin-solid: + specifier: ^2.11.10 + version: 2.11.10(@testing-library/jest-dom@6.6.3)(solid-js@1.9.9)(vite@7.1.7(@types/node@22.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.8.1)) + e2e/solid-router/basic: dependencies: '@tailwindcss/postcss': @@ -2403,7 +2431,7 @@ importers: version: 1.0.3(@rsbuild/core@1.2.4) '@rsbuild/plugin-solid': specifier: ^1.0.4 - version: 1.0.4(@babel/core@7.27.4)(@rsbuild/core@1.2.4)(solid-js@1.9.9) + version: 1.0.4(@babel/core@7.28.4)(@rsbuild/core@1.2.4)(solid-js@1.9.9) '@tailwindcss/postcss': specifier: ^4.1.15 version: 4.1.15 @@ -2449,7 +2477,7 @@ importers: version: 1.0.3(@rsbuild/core@1.2.4) '@rsbuild/plugin-solid': specifier: ^1.0.4 - version: 1.0.4(@babel/core@7.28.4)(@rsbuild/core@1.2.4)(solid-js@1.9.9) + version: 1.0.4(@babel/core@7.27.4)(@rsbuild/core@1.2.4)(solid-js@1.9.9) '@tailwindcss/postcss': specifier: ^4.1.15 version: 4.1.15