diff --git a/e2e/solid-router/basepath-file-based/package.json b/e2e/solid-router/basepath-file-based/package.json index 4e6b06172a8..ad493629bef 100644 --- a/e2e/solid-router/basepath-file-based/package.json +++ b/e2e/solid-router/basepath-file-based/package.json @@ -1,5 +1,5 @@ { - "name": "tanstack-solid-router-e2e-react-basepath-file-based", + "name": "tanstack-router-e2e-solid-basepath-file-based", "private": true, "type": "module", "scripts": { diff --git a/e2e/solid-router/generator-cli-only/package.json b/e2e/solid-router/generator-cli-only/package.json index 8e0082d3d74..7831af375d1 100644 --- a/e2e/solid-router/generator-cli-only/package.json +++ b/e2e/solid-router/generator-cli-only/package.json @@ -1,5 +1,5 @@ { - "name": "tanstack-solid-router-e2e-react-generator-cli-only", + "name": "tanstack-router-e2e-solid-generator-cli-only", "private": true, "type": "module", "scripts": { diff --git a/e2e/solid-router/js-only-file-based/.gitignore b/e2e/solid-router/js-only-file-based/.gitignore new file mode 100644 index 00000000000..218ef7614ba --- /dev/null +++ b/e2e/solid-router/js-only-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/ \ No newline at end of file diff --git a/e2e/solid-router/js-only-file-based/index.html b/e2e/solid-router/js-only-file-based/index.html new file mode 100644 index 00000000000..5f9851cdc92 --- /dev/null +++ b/e2e/solid-router/js-only-file-based/index.html @@ -0,0 +1,12 @@ + + + + + + Vite App + + +
+ + + diff --git a/e2e/solid-router/js-only-file-based/package.json b/e2e/solid-router/js-only-file-based/package.json new file mode 100644 index 00000000000..5ed71f23805 --- /dev/null +++ b/e2e/solid-router/js-only-file-based/package.json @@ -0,0 +1,29 @@ +{ + "name": "tanstack-router-e2e-solid-js-only-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": { + "@tailwindcss/postcss": "^4.1.15", + "@tanstack/solid-router": "workspace:^", + "@tanstack/solid-router-devtools": "workspace:^", + "postcss": "^8.5.1", + "solid-js": "^1.9.9", + "redaxios": "^0.5.1", + "tailwindcss": "^4.1.15" + }, + "devDependencies": { + "@playwright/test": "^1.50.1", + "@tanstack/router-e2e-utils": "workspace:^", + "@tanstack/router-plugin": "workspace:^", + "vite-plugin-solid": "^2.11.10", + "vite": "^7.1.7" + } +} diff --git a/e2e/solid-router/js-only-file-based/playwright.config.ts b/e2e/solid-router/js-only-file-based/playwright.config.ts new file mode 100644 index 00000000000..9e24e14fefa --- /dev/null +++ b/e2e/solid-router/js-only-file-based/playwright.config.ts @@ -0,0 +1,42 @@ +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_EXTERNAL_PORT=${EXTERNAL_PORT} VITE_SERVER_PORT=${PORT} pnpm build && 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/js-only-file-based/postcss.config.mjs b/e2e/solid-router/js-only-file-based/postcss.config.mjs new file mode 100644 index 00000000000..a7f73a2d1d7 --- /dev/null +++ b/e2e/solid-router/js-only-file-based/postcss.config.mjs @@ -0,0 +1,5 @@ +export default { + plugins: { + '@tailwindcss/postcss': {}, + }, +} diff --git a/e2e/solid-router/js-only-file-based/src/main.jsx b/e2e/solid-router/js-only-file-based/src/main.jsx new file mode 100644 index 00000000000..0e691e3e3cb --- /dev/null +++ b/e2e/solid-router/js-only-file-based/src/main.jsx @@ -0,0 +1,18 @@ +import { RouterProvider, createRouter } from '@tanstack/solid-router' +import { routeTree } from './routeTree.gen' +import { render } from 'solid-js/web' +import './styles.css' + +// Set up a Router instance +const router = createRouter({ + routeTree, + defaultPreload: 'intent', + defaultStaleTime: 5000, + scrollRestoration: true, +}) + +const rootElement = document.getElementById('app') + +if (!rootElement.innerHTML) { + render(() => , rootElement) +} diff --git a/e2e/solid-router/js-only-file-based/src/posts.js b/e2e/solid-router/js-only-file-based/src/posts.js new file mode 100644 index 00000000000..979e5e381c5 --- /dev/null +++ b/e2e/solid-router/js-only-file-based/src/posts.js @@ -0,0 +1,27 @@ +import axios from 'redaxios' + +export class NotFoundError extends Error {} + +let queryURL = 'https://jsonplaceholder.typicode.com' + +if (import.meta.env.VITE_NODE_ENV === 'test') { + queryURL = `http://localhost:${import.meta.env.VITE_EXTERNAL_PORT}` +} + +export const fetchPosts = async () => { + console.info('Fetching posts...') + return axios.get(`${queryURL}/posts`).then((r) => r.data.slice(0, 10)) +} + +export const fetchPost = async (postId) => { + console.info(`Fetching post with id ${postId}...`) + const post = await axios + .get(`${queryURL}/posts/${postId}`) + .then((r) => r.data) + + if (!post) { + throw new NotFoundError(`Post with id "${postId}" not found!`) + } + + return post +} diff --git a/e2e/solid-router/js-only-file-based/src/routeTree.gen.js b/e2e/solid-router/js-only-file-based/src/routeTree.gen.js new file mode 100644 index 00000000000..f2d42e5a6c9 --- /dev/null +++ b/e2e/solid-router/js-only-file-based/src/routeTree.gen.js @@ -0,0 +1,95 @@ +/* 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 PathlessLayoutRouteImport } from './routes/_pathlessLayout' +import { Route as PostsRouteRouteImport } from './routes/posts.route' +import { Route as IndexRouteImport } from './routes/index' +import { Route as PostsIndexRouteImport } from './routes/posts.index' +import { Route as PostsPostIdRouteImport } from './routes/posts.$postId' +import { Route as PathlessLayoutNestedLayoutRouteImport } from './routes/_pathlessLayout/_nested-layout' +import { Route as PathlessLayoutNestedLayoutRouteBRouteImport } from './routes/_pathlessLayout/_nested-layout/route-b' +import { Route as PathlessLayoutNestedLayoutRouteARouteImport } from './routes/_pathlessLayout/_nested-layout/route-a' + +const PathlessLayoutRoute = PathlessLayoutRouteImport.update({ + id: '/_pathlessLayout', + getParentRoute: () => rootRouteImport, +}) +const PostsRouteRoute = PostsRouteRouteImport.update({ + id: '/posts', + path: '/posts', + getParentRoute: () => rootRouteImport, +}) +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +}) +const PostsIndexRoute = PostsIndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => PostsRouteRoute, +}) +const PostsPostIdRoute = PostsPostIdRouteImport.update({ + id: '/$postId', + path: '/$postId', + getParentRoute: () => PostsRouteRoute, +}) +const PathlessLayoutNestedLayoutRoute = + PathlessLayoutNestedLayoutRouteImport.update({ + id: '/_nested-layout', + getParentRoute: () => PathlessLayoutRoute, + }) +const PathlessLayoutNestedLayoutRouteBRoute = + PathlessLayoutNestedLayoutRouteBRouteImport.update({ + id: '/route-b', + path: '/route-b', + getParentRoute: () => PathlessLayoutNestedLayoutRoute, + }) +const PathlessLayoutNestedLayoutRouteARoute = + PathlessLayoutNestedLayoutRouteARouteImport.update({ + id: '/route-a', + path: '/route-a', + getParentRoute: () => PathlessLayoutNestedLayoutRoute, + }) + +const PostsRouteRouteChildren = { + PostsPostIdRoute: PostsPostIdRoute, + PostsIndexRoute: PostsIndexRoute, +} + +const PostsRouteRouteWithChildren = PostsRouteRoute._addFileChildren( + PostsRouteRouteChildren, +) + +const PathlessLayoutNestedLayoutRouteChildren = { + PathlessLayoutNestedLayoutRouteARoute: PathlessLayoutNestedLayoutRouteARoute, + PathlessLayoutNestedLayoutRouteBRoute: PathlessLayoutNestedLayoutRouteBRoute, +} + +const PathlessLayoutNestedLayoutRouteWithChildren = + PathlessLayoutNestedLayoutRoute._addFileChildren( + PathlessLayoutNestedLayoutRouteChildren, + ) + +const PathlessLayoutRouteChildren = { + PathlessLayoutNestedLayoutRoute: PathlessLayoutNestedLayoutRouteWithChildren, +} + +const PathlessLayoutRouteWithChildren = PathlessLayoutRoute._addFileChildren( + PathlessLayoutRouteChildren, +) + +const rootRouteChildren = { + IndexRoute: IndexRoute, + PostsRouteRoute: PostsRouteRouteWithChildren, + PathlessLayoutRoute: PathlessLayoutRouteWithChildren, +} +export const routeTree = rootRouteImport._addFileChildren(rootRouteChildren) diff --git a/e2e/solid-router/js-only-file-based/src/routes/__root.jsx b/e2e/solid-router/js-only-file-based/src/routes/__root.jsx new file mode 100644 index 00000000000..67bc9248fab --- /dev/null +++ b/e2e/solid-router/js-only-file-based/src/routes/__root.jsx @@ -0,0 +1,61 @@ +import { Link, Outlet, createRootRoute } from '@tanstack/solid-router' +import { TanStackRouterDevtools } from '@tanstack/solid-router-devtools' + +export const Route = createRootRoute({ + component: RootComponent, + notFoundComponent: () => { + return ( +
+

This is the notFoundComponent configured on root route

+ Start Over +
+ ) + }, +}) + +function RootComponent() { + return ( + <> +
+ + Home + {' '} + + Posts + {' '} + + Pathless Layout + {' '} + + This Route Does Not Exist + +
+
+ + {/* Start rendering router matches */} + + + ) +} diff --git a/e2e/solid-router/js-only-file-based/src/routes/_pathlessLayout.jsx b/e2e/solid-router/js-only-file-based/src/routes/_pathlessLayout.jsx new file mode 100644 index 00000000000..7cdec28d8d9 --- /dev/null +++ b/e2e/solid-router/js-only-file-based/src/routes/_pathlessLayout.jsx @@ -0,0 +1,17 @@ +import { createFileRoute } from '@tanstack/solid-router' +import { Outlet } from '@tanstack/solid-router' + +export const Route = createFileRoute('/_pathlessLayout')({ + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a pathless layout
+
+ +
+
+ ) +} diff --git a/e2e/solid-router/js-only-file-based/src/routes/_pathlessLayout/_nested-layout.jsx b/e2e/solid-router/js-only-file-based/src/routes/_pathlessLayout/_nested-layout.jsx new file mode 100644 index 00000000000..bea54d9af4a --- /dev/null +++ b/e2e/solid-router/js-only-file-based/src/routes/_pathlessLayout/_nested-layout.jsx @@ -0,0 +1,35 @@ +import { createFileRoute } from '@tanstack/solid-router' +import { Link, Outlet } from '@tanstack/solid-router' + +export const Route = createFileRoute('/_pathlessLayout/_nested-layout')({ + component: LayoutComponent, +}) + +function LayoutComponent() { + return ( +
+
I'm a nested pathless layout
+
+ + Go to route A + + + Go to route B + +
+
+ +
+
+ ) +} diff --git a/e2e/solid-router/js-only-file-based/src/routes/_pathlessLayout/_nested-layout/route-a.jsx b/e2e/solid-router/js-only-file-based/src/routes/_pathlessLayout/_nested-layout/route-a.jsx new file mode 100644 index 00000000000..16b0aea0c55 --- /dev/null +++ b/e2e/solid-router/js-only-file-based/src/routes/_pathlessLayout/_nested-layout/route-a.jsx @@ -0,0 +1,10 @@ +import { createFileRoute } from '@tanstack/solid-router' +export const Route = createFileRoute('/_pathlessLayout/_nested-layout/route-a')( + { + component: LayoutAComponent, + }, +) + +function LayoutAComponent() { + return
I'm layout A!
+} diff --git a/e2e/solid-router/js-only-file-based/src/routes/_pathlessLayout/_nested-layout/route-b.jsx b/e2e/solid-router/js-only-file-based/src/routes/_pathlessLayout/_nested-layout/route-b.jsx new file mode 100644 index 00000000000..4e592567bbe --- /dev/null +++ b/e2e/solid-router/js-only-file-based/src/routes/_pathlessLayout/_nested-layout/route-b.jsx @@ -0,0 +1,10 @@ +import { createFileRoute } from '@tanstack/solid-router' +export const Route = createFileRoute('/_pathlessLayout/_nested-layout/route-b')( + { + component: LayoutBComponent, + }, +) + +function LayoutBComponent() { + return
I'm layout B!
+} diff --git a/e2e/solid-router/js-only-file-based/src/routes/index.jsx b/e2e/solid-router/js-only-file-based/src/routes/index.jsx new file mode 100644 index 00000000000..bdfb4c76768 --- /dev/null +++ b/e2e/solid-router/js-only-file-based/src/routes/index.jsx @@ -0,0 +1,13 @@ +import { createFileRoute } from '@tanstack/solid-router' + +export const Route = createFileRoute('/')({ + component: Home, +}) + +function Home() { + return ( +
+

Welcome Home!

+
+ ) +} diff --git a/e2e/solid-router/js-only-file-based/src/routes/posts.$postId.jsx b/e2e/solid-router/js-only-file-based/src/routes/posts.$postId.jsx new file mode 100644 index 00000000000..26bcb3bb7ef --- /dev/null +++ b/e2e/solid-router/js-only-file-based/src/routes/posts.$postId.jsx @@ -0,0 +1,28 @@ +import { createFileRoute } from '@tanstack/solid-router' + +import { ErrorComponent } from '@tanstack/solid-router' +import { fetchPost } from '../posts' + +export const Route = createFileRoute('/posts/$postId')({ + loader: async ({ params: { postId } }) => fetchPost(postId), + errorComponent: PostErrorComponent, + notFoundComponent: () => { + return

Post not found

+ }, + component: PostComponent, +}) + +export function PostErrorComponent({ error }) { + return +} + +function PostComponent() { + const post = Route.useLoaderData() + + return ( +
+

{post().title}

+
{post().body}
+
+ ) +} diff --git a/e2e/solid-router/js-only-file-based/src/routes/posts.index.jsx b/e2e/solid-router/js-only-file-based/src/routes/posts.index.jsx new file mode 100644 index 00000000000..33d0386c195 --- /dev/null +++ b/e2e/solid-router/js-only-file-based/src/routes/posts.index.jsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/solid-router' + +export const Route = createFileRoute('/posts/')({ + component: PostsIndexComponent, +}) + +function PostsIndexComponent() { + return
Select a post.
+} diff --git a/e2e/solid-router/js-only-file-based/src/routes/posts.route.jsx b/e2e/solid-router/js-only-file-based/src/routes/posts.route.jsx new file mode 100644 index 00000000000..db486f38352 --- /dev/null +++ b/e2e/solid-router/js-only-file-based/src/routes/posts.route.jsx @@ -0,0 +1,40 @@ +import { createFileRoute } from '@tanstack/solid-router' + +import { Link, Outlet } from '@tanstack/solid-router' +import { fetchPosts } from '../posts' + +export const Route = createFileRoute('/posts')({ + loader: fetchPosts, + component: PostsLayoutComponent, +}) + +function PostsLayoutComponent() { + const posts = Route.useLoaderData() + + return ( +
+
    + {[...posts(), { id: 'i-do-not-exist', title: 'Non-existent Post' }].map( + (post) => { + return ( +
  • + +
    {post.title.substring(0, 20)}
    + +
  • + ) + }, + )} +
+
+ +
+ ) +} diff --git a/e2e/solid-router/js-only-file-based/src/styles.css b/e2e/solid-router/js-only-file-based/src/styles.css new file mode 100644 index 00000000000..37a1064738a --- /dev/null +++ b/e2e/solid-router/js-only-file-based/src/styles.css @@ -0,0 +1,21 @@ +@import 'tailwindcss'; + +@layer base { + *, + ::after, + ::before, + ::backdrop, + ::file-selector-button { + border-color: var(--color-gray-200, currentcolor); + } +} + +html { + color-scheme: light dark; +} +* { + @apply border-gray-200 dark:border-gray-800; +} +body { + @apply bg-gray-50 text-gray-950 dark:bg-gray-900 dark:text-gray-200; +} diff --git a/e2e/solid-router/js-only-file-based/tests/app.spec.ts b/e2e/solid-router/js-only-file-based/tests/app.spec.ts new file mode 100644 index 00000000000..5a83a314f20 --- /dev/null +++ b/e2e/solid-router/js-only-file-based/tests/app.spec.ts @@ -0,0 +1,35 @@ +import { expect, test } from '@playwright/test' + +test.beforeEach(async ({ page }) => { + await page.goto('/') +}) + +test('Navigating to a post page', async ({ page }) => { + await page.getByRole('link', { name: 'Posts', exact: true }).click() + await page.getByRole('link', { name: 'sunt aut facere repe' }).click() + await expect(page.getByRole('heading')).toContainText('sunt aut facere') +}) + +test('Navigating nested pathless layouts', async ({ page }) => { + await page.getByRole('link', { name: 'Pathless Layout', exact: true }).click() + + await expect(page.locator('#app')).toContainText("I'm a pathless layout") + await expect(page.locator('#app')).toContainText( + "I'm a nested pathless layout", + ) + + await page.getByRole('link', { name: 'Go to route A' }).click() + await expect(page.locator('#app')).toContainText("I'm layout A!") + + await page.getByRole('link', { name: 'Go to route B' }).click() + await expect(page.locator('#app')).toContainText("I'm layout B!") +}) + +test('Navigating to a not-found route', async ({ page }) => { + await page.getByRole('link', { name: 'This Route Does Not Exist' }).click() + await expect(page.getByRole('paragraph')).toContainText( + 'This is the notFoundComponent configured on root route', + ) + await page.getByRole('link', { name: 'Start Over' }).click() + await expect(page.getByRole('heading')).toContainText('Welcome Home!') +}) diff --git a/e2e/solid-router/js-only-file-based/tests/setup/global.setup.ts b/e2e/solid-router/js-only-file-based/tests/setup/global.setup.ts new file mode 100644 index 00000000000..3593d10ab90 --- /dev/null +++ b/e2e/solid-router/js-only-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/js-only-file-based/tests/setup/global.teardown.ts b/e2e/solid-router/js-only-file-based/tests/setup/global.teardown.ts new file mode 100644 index 00000000000..62fd79911cc --- /dev/null +++ b/e2e/solid-router/js-only-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/js-only-file-based/tsconfig.json b/e2e/solid-router/js-only-file-based/tsconfig.json new file mode 100644 index 00000000000..e011e786b59 --- /dev/null +++ b/e2e/solid-router/js-only-file-based/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "preserve", + "jsxImportSource": "solid-js", + "target": "ESNext", + "moduleResolution": "Bundler", + "module": "ESNext", + "resolveJsonModule": true, + "allowJs": true, + "skipLibCheck": true + }, + "exclude": ["node_modules", "dist"] +} diff --git a/e2e/solid-router/js-only-file-based/vite.config.js b/e2e/solid-router/js-only-file-based/vite.config.js new file mode 100644 index 00000000000..9cc3d84430a --- /dev/null +++ b/e2e/solid-router/js-only-file-based/vite.config.js @@ -0,0 +1,14 @@ +import { defineConfig } from 'vite' +import solid from 'vite-plugin-solid' +import { tanstackRouter } from '@tanstack/router-plugin/vite' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + tanstackRouter({ + target: 'solid', + disableTypes: true, + }), + solid(), + ], +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f4830afb555..8d4ade58009 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2445,6 +2445,46 @@ importers: 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/js-only-file-based: + dependencies: + '@tailwindcss/postcss': + specifier: ^4.1.15 + version: 4.1.15 + '@tanstack/solid-router': + specifier: workspace:^ + version: link:../../../packages/solid-router + '@tanstack/solid-router-devtools': + specifier: workspace:^ + version: link:../../../packages/solid-router-devtools + postcss: + specifier: ^8.5.1 + version: 8.5.6 + redaxios: + specifier: ^0.5.1 + version: 0.5.1 + solid-js: + specifier: 1.9.9 + version: 1.9.9 + tailwindcss: + specifier: ^4.1.15 + version: 4.1.15 + devDependencies: + '@playwright/test': + specifier: ^1.52.0 + version: 1.52.0 + '@tanstack/router-e2e-utils': + specifier: workspace:^ + version: link:../../e2e-utils + '@tanstack/router-plugin': + specifier: workspace:* + version: link:../../../packages/router-plugin + 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/rspack-basic-file-based: dependencies: '@tanstack/solid-router':