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