From bf79316ad15a7b296b6c4ae50cc0473110d37e4f Mon Sep 17 00:00:00 2001 From: Sheraff Date: Fri, 28 Aug 2026 00:01:35 +0200 Subject: [PATCH] test(react-start): reproduce React 18 hydration error --- e2e/react-start/issue-8180-loader/.gitignore | 5 + .../issue-8180-loader/.prettierignore | 1 + .../issue-8180-loader/package.json | 29 +++++ .../issue-8180-loader/playwright.config.ts | 25 ++++ .../issue-8180-loader/src/routeTree.gen.ts | 68 ++++++++++ .../issue-8180-loader/src/router.tsx | 6 + .../issue-8180-loader/src/routes/__root.tsx | 58 +++++++++ .../issue-8180-loader/src/routes/index.tsx | 5 + .../issue-8180-loader/tests/app.spec.ts | 29 +++++ .../issue-8180-loader/tsconfig.json | 18 +++ .../issue-8180-loader/vite.config.ts | 13 ++ e2e/react-start/issue-8180/.gitignore | 5 + e2e/react-start/issue-8180/.prettierignore | 1 + e2e/react-start/issue-8180/package.json | 29 +++++ .../issue-8180/playwright.config.ts | 25 ++++ .../issue-8180/src/routeTree.gen.ts | 68 ++++++++++ e2e/react-start/issue-8180/src/router.tsx | 6 + .../issue-8180/src/routes/__root.tsx | 58 +++++++++ .../issue-8180/src/routes/index.tsx | 5 + e2e/react-start/issue-8180/tests/app.spec.ts | 29 +++++ e2e/react-start/issue-8180/tsconfig.json | 18 +++ e2e/react-start/issue-8180/vite.config.ts | 13 ++ pnpm-lock.yaml | 123 ++++++++++++++++++ pnpm-workspace.yaml | 5 + 24 files changed, 642 insertions(+) create mode 100644 e2e/react-start/issue-8180-loader/.gitignore create mode 100644 e2e/react-start/issue-8180-loader/.prettierignore create mode 100644 e2e/react-start/issue-8180-loader/package.json create mode 100644 e2e/react-start/issue-8180-loader/playwright.config.ts create mode 100644 e2e/react-start/issue-8180-loader/src/routeTree.gen.ts create mode 100644 e2e/react-start/issue-8180-loader/src/router.tsx create mode 100644 e2e/react-start/issue-8180-loader/src/routes/__root.tsx create mode 100644 e2e/react-start/issue-8180-loader/src/routes/index.tsx create mode 100644 e2e/react-start/issue-8180-loader/tests/app.spec.ts create mode 100644 e2e/react-start/issue-8180-loader/tsconfig.json create mode 100644 e2e/react-start/issue-8180-loader/vite.config.ts create mode 100644 e2e/react-start/issue-8180/.gitignore create mode 100644 e2e/react-start/issue-8180/.prettierignore create mode 100644 e2e/react-start/issue-8180/package.json create mode 100644 e2e/react-start/issue-8180/playwright.config.ts create mode 100644 e2e/react-start/issue-8180/src/routeTree.gen.ts create mode 100644 e2e/react-start/issue-8180/src/router.tsx create mode 100644 e2e/react-start/issue-8180/src/routes/__root.tsx create mode 100644 e2e/react-start/issue-8180/src/routes/index.tsx create mode 100644 e2e/react-start/issue-8180/tests/app.spec.ts create mode 100644 e2e/react-start/issue-8180/tsconfig.json create mode 100644 e2e/react-start/issue-8180/vite.config.ts diff --git a/e2e/react-start/issue-8180-loader/.gitignore b/e2e/react-start/issue-8180-loader/.gitignore new file mode 100644 index 00000000000..229709a89de --- /dev/null +++ b/e2e/react-start/issue-8180-loader/.gitignore @@ -0,0 +1,5 @@ +node_modules +dist +test-results +playwright-report +port*.txt diff --git a/e2e/react-start/issue-8180-loader/.prettierignore b/e2e/react-start/issue-8180-loader/.prettierignore new file mode 100644 index 00000000000..083bdb7c4c6 --- /dev/null +++ b/e2e/react-start/issue-8180-loader/.prettierignore @@ -0,0 +1 @@ +src/routeTree.gen.ts diff --git a/e2e/react-start/issue-8180-loader/package.json b/e2e/react-start/issue-8180-loader/package.json new file mode 100644 index 00000000000..250e4087a1a --- /dev/null +++ b/e2e/react-start/issue-8180-loader/package.json @@ -0,0 +1,29 @@ +{ + "name": "tanstack-react-start-e2e-issue-8180-loader", + "private": true, + "sideEffects": false, + "type": "module", + "scripts": { + "build": "vite build && tsc --noEmit", + "start": "pnpx srvx --prod -s ../client dist/server/server.js", + "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" + }, + "dependencies": { + "@tanstack/react-router": "workspace:*", + "@tanstack/react-start": "workspace:*", + "react": "18.3.1", + "react-dom": "18.3.1" + }, + "devDependencies": { + "@playwright/test": "^1.61.0", + "@tanstack/router-e2e-utils": "workspace:*", + "@types/node": "^22.10.2", + "@types/react": "^19.0.8", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^6.0.1", + "srvx": "^0.11.9", + "@typescript/native": "npm:typescript@^7.0.2", + "typescript": "npm:@typescript/typescript6@^6.0.2", + "vite": "^8.0.14" + } +} diff --git a/e2e/react-start/issue-8180-loader/playwright.config.ts b/e2e/react-start/issue-8180-loader/playwright.config.ts new file mode 100644 index 00000000000..d275f440ba1 --- /dev/null +++ b/e2e/react-start/issue-8180-loader/playwright.config.ts @@ -0,0 +1,25 @@ +import { defineConfig, devices } from '@playwright/test' +import { getTestServerPort } from '@tanstack/router-e2e-utils' +import packageJson from './package.json' with { type: 'json' } + +const PORT = await getTestServerPort(packageJson.name) +const baseURL = `http://localhost:${PORT}` + +export default defineConfig({ + testDir: './tests', + workers: 1, + reporter: [['line']], + use: { baseURL }, + webServer: { + command: `VITE_SERVER_PORT=${PORT} pnpm build && NODE_ENV=production PORT=${PORT} VITE_SERVER_PORT=${PORT} pnpm start`, + url: baseURL, + reuseExistingServer: !process.env.CI, + stdout: 'pipe', + }, + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], +}) diff --git a/e2e/react-start/issue-8180-loader/src/routeTree.gen.ts b/e2e/react-start/issue-8180-loader/src/routeTree.gen.ts new file mode 100644 index 00000000000..dceedffdc12 --- /dev/null +++ b/e2e/react-start/issue-8180-loader/src/routeTree.gen.ts @@ -0,0 +1,68 @@ +/* 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 IndexRouteImport } from './routes/index' + +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +} as any) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute +} +export interface FileRoutesByTo { + '/': typeof IndexRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/': typeof IndexRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' + fileRoutesByTo: FileRoutesByTo + to: '/' + id: '__root__' | '/' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute +} + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + } +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +import type { getRouter } from './router.tsx' +import type { createStart } from '@tanstack/react-start' +declare module '@tanstack/react-start' { + interface Register { + ssr: true + router: Awaited> + } +} diff --git a/e2e/react-start/issue-8180-loader/src/router.tsx b/e2e/react-start/issue-8180-loader/src/router.tsx new file mode 100644 index 00000000000..58f4d54e882 --- /dev/null +++ b/e2e/react-start/issue-8180-loader/src/router.tsx @@ -0,0 +1,6 @@ +import { createRouter } from '@tanstack/react-router' +import { routeTree } from './routeTree.gen' + +export function getRouter() { + return createRouter({ routeTree }) +} diff --git a/e2e/react-start/issue-8180-loader/src/routes/__root.tsx b/e2e/react-start/issue-8180-loader/src/routes/__root.tsx new file mode 100644 index 00000000000..1180b2313dd --- /dev/null +++ b/e2e/react-start/issue-8180-loader/src/routes/__root.tsx @@ -0,0 +1,58 @@ +import { + HeadContent, + Outlet, + Scripts, + createRootRoute, +} from '@tanstack/react-router' +import type { ReactNode } from 'react' + +const data = { session: { user: 'test' } } + +async function waitForOneMicrotask() { + await Promise.resolve() + return data +} + +async function waitLonger() { + await new Promise((resolve) => setTimeout(resolve, 50)) + return data +} + +export const Route = createRootRoute({ + component: RootComponent, + shellComponent: RootShell, + ssr: false, + loader: ({ location }) => { + const delay = new URLSearchParams(location.searchStr).get('delay') + if (delay === 'microtask') { + return waitForOneMicrotask() + } + if (delay === 'longer') { + return waitLonger() + } + return data + }, +}) + +function RootShell({ children }: { children: ReactNode }) { + return ( + + + + + + {children} + + + + ) +} + +function RootComponent() { + return ( +
+

Issue 8180 loader

+ +
+ ) +} diff --git a/e2e/react-start/issue-8180-loader/src/routes/index.tsx b/e2e/react-start/issue-8180-loader/src/routes/index.tsx new file mode 100644 index 00000000000..0d4f4136bae --- /dev/null +++ b/e2e/react-start/issue-8180-loader/src/routes/index.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: () =>
Hydrated
, +}) diff --git a/e2e/react-start/issue-8180-loader/tests/app.spec.ts b/e2e/react-start/issue-8180-loader/tests/app.spec.ts new file mode 100644 index 00000000000..ef42e9e3902 --- /dev/null +++ b/e2e/react-start/issue-8180-loader/tests/app.spec.ts @@ -0,0 +1,29 @@ +import { expect, test } from '@playwright/test' + +const cases = [ + { name: 'synchronous loader', path: '/?delay=sync' }, + { name: 'loader after one microtask', path: '/?delay=microtask' }, + { name: 'longer asynchronous loader', path: '/?delay=longer' }, +] + +for (const testCase of cases) { + test(`#8180: ${testCase.name} does not report browser errors during hydration`, async ({ + page, + }) => { + const browserErrors: Array = [] + page.on('console', (message) => { + if (message.type() === 'error') { + browserErrors.push(message.text()) + } + }) + page.on('pageerror', (error) => { + browserErrors.push(error.message) + }) + + const response = await page.goto(testCase.path) + expect(response?.ok()).toBe(true) + await expect(page.getByTestId('hydrated')).toBeVisible() + + expect(browserErrors).toEqual([]) + }) +} diff --git a/e2e/react-start/issue-8180-loader/tsconfig.json b/e2e/react-start/issue-8180-loader/tsconfig.json new file mode 100644 index 00000000000..2afe40d931c --- /dev/null +++ b/e2e/react-start/issue-8180-loader/tsconfig.json @@ -0,0 +1,18 @@ +{ + "include": ["**/*.ts", "**/*.tsx"], + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "isolatedModules": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "target": "ES2022", + "allowJs": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true + } +} diff --git a/e2e/react-start/issue-8180-loader/vite.config.ts b/e2e/react-start/issue-8180-loader/vite.config.ts new file mode 100644 index 00000000000..5c04b4c90f5 --- /dev/null +++ b/e2e/react-start/issue-8180-loader/vite.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from 'vite' +import { tanstackStart } from '@tanstack/react-start/plugin/vite' +import viteReact from '@vitejs/plugin-react' + +export default defineConfig({ + resolve: { + dedupe: ['react', 'react-dom'], + // Keep monorepo packages on this fixture's React 18 runtime. + noExternal: ['@tanstack/react-router'], + tsconfigPaths: true, + }, + plugins: [tanstackStart(), viteReact()], +}) diff --git a/e2e/react-start/issue-8180/.gitignore b/e2e/react-start/issue-8180/.gitignore new file mode 100644 index 00000000000..229709a89de --- /dev/null +++ b/e2e/react-start/issue-8180/.gitignore @@ -0,0 +1,5 @@ +node_modules +dist +test-results +playwright-report +port*.txt diff --git a/e2e/react-start/issue-8180/.prettierignore b/e2e/react-start/issue-8180/.prettierignore new file mode 100644 index 00000000000..083bdb7c4c6 --- /dev/null +++ b/e2e/react-start/issue-8180/.prettierignore @@ -0,0 +1 @@ +src/routeTree.gen.ts diff --git a/e2e/react-start/issue-8180/package.json b/e2e/react-start/issue-8180/package.json new file mode 100644 index 00000000000..e86dea5e28e --- /dev/null +++ b/e2e/react-start/issue-8180/package.json @@ -0,0 +1,29 @@ +{ + "name": "tanstack-react-start-e2e-issue-8180", + "private": true, + "sideEffects": false, + "type": "module", + "scripts": { + "build": "vite build && tsc --noEmit", + "start": "pnpx srvx --prod -s ../client dist/server/server.js", + "test:e2e": "rm -rf port*.txt; playwright test --project=chromium" + }, + "dependencies": { + "@tanstack/react-router": "workspace:*", + "@tanstack/react-start": "workspace:*", + "react": "18.3.1", + "react-dom": "18.3.1" + }, + "devDependencies": { + "@playwright/test": "^1.61.0", + "@tanstack/router-e2e-utils": "workspace:*", + "@types/node": "^22.10.2", + "@types/react": "^19.0.8", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^6.0.1", + "srvx": "^0.11.9", + "@typescript/native": "npm:typescript@^7.0.2", + "typescript": "npm:@typescript/typescript6@^6.0.2", + "vite": "^8.0.14" + } +} diff --git a/e2e/react-start/issue-8180/playwright.config.ts b/e2e/react-start/issue-8180/playwright.config.ts new file mode 100644 index 00000000000..d275f440ba1 --- /dev/null +++ b/e2e/react-start/issue-8180/playwright.config.ts @@ -0,0 +1,25 @@ +import { defineConfig, devices } from '@playwright/test' +import { getTestServerPort } from '@tanstack/router-e2e-utils' +import packageJson from './package.json' with { type: 'json' } + +const PORT = await getTestServerPort(packageJson.name) +const baseURL = `http://localhost:${PORT}` + +export default defineConfig({ + testDir: './tests', + workers: 1, + reporter: [['line']], + use: { baseURL }, + webServer: { + command: `VITE_SERVER_PORT=${PORT} pnpm build && NODE_ENV=production PORT=${PORT} VITE_SERVER_PORT=${PORT} pnpm start`, + url: baseURL, + reuseExistingServer: !process.env.CI, + stdout: 'pipe', + }, + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], +}) diff --git a/e2e/react-start/issue-8180/src/routeTree.gen.ts b/e2e/react-start/issue-8180/src/routeTree.gen.ts new file mode 100644 index 00000000000..dceedffdc12 --- /dev/null +++ b/e2e/react-start/issue-8180/src/routeTree.gen.ts @@ -0,0 +1,68 @@ +/* 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 IndexRouteImport } from './routes/index' + +const IndexRoute = IndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => rootRouteImport, +} as any) + +export interface FileRoutesByFullPath { + '/': typeof IndexRoute +} +export interface FileRoutesByTo { + '/': typeof IndexRoute +} +export interface FileRoutesById { + __root__: typeof rootRouteImport + '/': typeof IndexRoute +} +export interface FileRouteTypes { + fileRoutesByFullPath: FileRoutesByFullPath + fullPaths: '/' + fileRoutesByTo: FileRoutesByTo + to: '/' + id: '__root__' | '/' + fileRoutesById: FileRoutesById +} +export interface RootRouteChildren { + IndexRoute: typeof IndexRoute +} + +declare module '@tanstack/react-router' { + interface FileRoutesByPath { + '/': { + id: '/' + path: '/' + fullPath: '/' + preLoaderRoute: typeof IndexRouteImport + parentRoute: typeof rootRouteImport + } + } +} + +const rootRouteChildren: RootRouteChildren = { + IndexRoute: IndexRoute, +} +export const routeTree = rootRouteImport + ._addFileChildren(rootRouteChildren) + ._addFileTypes() + +import type { getRouter } from './router.tsx' +import type { createStart } from '@tanstack/react-start' +declare module '@tanstack/react-start' { + interface Register { + ssr: true + router: Awaited> + } +} diff --git a/e2e/react-start/issue-8180/src/router.tsx b/e2e/react-start/issue-8180/src/router.tsx new file mode 100644 index 00000000000..58f4d54e882 --- /dev/null +++ b/e2e/react-start/issue-8180/src/router.tsx @@ -0,0 +1,6 @@ +import { createRouter } from '@tanstack/react-router' +import { routeTree } from './routeTree.gen' + +export function getRouter() { + return createRouter({ routeTree }) +} diff --git a/e2e/react-start/issue-8180/src/routes/__root.tsx b/e2e/react-start/issue-8180/src/routes/__root.tsx new file mode 100644 index 00000000000..15155da23a2 --- /dev/null +++ b/e2e/react-start/issue-8180/src/routes/__root.tsx @@ -0,0 +1,58 @@ +import { + HeadContent, + Outlet, + Scripts, + createRootRoute, +} from '@tanstack/react-router' +import type { ReactNode } from 'react' + +const context = { session: { user: 'test' } } + +async function waitForOneMicrotask() { + await Promise.resolve() + return context +} + +async function waitLonger() { + await new Promise((resolve) => setTimeout(resolve, 50)) + return context +} + +export const Route = createRootRoute({ + component: RootComponent, + shellComponent: RootShell, + ssr: false, + beforeLoad: ({ location }) => { + const delay = new URLSearchParams(location.searchStr).get('delay') + if (delay === 'microtask') { + return waitForOneMicrotask() + } + if (delay === 'longer') { + return waitLonger() + } + return context + }, +}) + +function RootShell({ children }: { children: ReactNode }) { + return ( + + + + + + {children} + + + + ) +} + +function RootComponent() { + return ( +
+

Issue 8180

+ +
+ ) +} diff --git a/e2e/react-start/issue-8180/src/routes/index.tsx b/e2e/react-start/issue-8180/src/routes/index.tsx new file mode 100644 index 00000000000..0d4f4136bae --- /dev/null +++ b/e2e/react-start/issue-8180/src/routes/index.tsx @@ -0,0 +1,5 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: () =>
Hydrated
, +}) diff --git a/e2e/react-start/issue-8180/tests/app.spec.ts b/e2e/react-start/issue-8180/tests/app.spec.ts new file mode 100644 index 00000000000..5c6d1a3134b --- /dev/null +++ b/e2e/react-start/issue-8180/tests/app.spec.ts @@ -0,0 +1,29 @@ +import { expect, test } from '@playwright/test' + +const cases = [ + { name: 'synchronous beforeLoad', path: '/?delay=sync' }, + { name: 'beforeLoad after one microtask', path: '/?delay=microtask' }, + { name: 'longer asynchronous beforeLoad', path: '/?delay=longer' }, +] + +for (const testCase of cases) { + test(`#8180: ${testCase.name} does not report browser errors during hydration`, async ({ + page, + }) => { + const browserErrors: Array = [] + page.on('console', (message) => { + if (message.type() === 'error') { + browserErrors.push(message.text()) + } + }) + page.on('pageerror', (error) => { + browserErrors.push(error.message) + }) + + const response = await page.goto(testCase.path) + expect(response?.ok()).toBe(true) + await expect(page.getByTestId('hydrated')).toBeVisible() + + expect(browserErrors).toEqual([]) + }) +} diff --git a/e2e/react-start/issue-8180/tsconfig.json b/e2e/react-start/issue-8180/tsconfig.json new file mode 100644 index 00000000000..2afe40d931c --- /dev/null +++ b/e2e/react-start/issue-8180/tsconfig.json @@ -0,0 +1,18 @@ +{ + "include": ["**/*.ts", "**/*.tsx"], + "compilerOptions": { + "strict": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "isolatedModules": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "target": "ES2022", + "allowJs": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true + } +} diff --git a/e2e/react-start/issue-8180/vite.config.ts b/e2e/react-start/issue-8180/vite.config.ts new file mode 100644 index 00000000000..5c04b4c90f5 --- /dev/null +++ b/e2e/react-start/issue-8180/vite.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from 'vite' +import { tanstackStart } from '@tanstack/react-start/plugin/vite' +import viteReact from '@vitejs/plugin-react' + +export default defineConfig({ + resolve: { + dedupe: ['react', 'react-dom'], + // Keep monorepo packages on this fixture's React 18 runtime. + noExternal: ['@tanstack/react-router'], + tsconfigPaths: true, + }, + plugins: [tanstackStart(), viteReact()], +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ec4bd68739a..1600fe82d6a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,6 +43,11 @@ overrides: solid-js: 1.9.12 react: ^19.2.3 react-dom: ^19.2.3 + tanstack-react-start-e2e-issue-8180>react: 18.3.1 + tanstack-react-start-e2e-issue-8180>react-dom: 18.3.1 + tanstack-react-start-e2e-issue-8180-loader>react: 18.3.1 + tanstack-react-start-e2e-issue-8180-loader>react-dom: 18.3.1 + react-dom@18.3.1>react: 18.3.1 '@types/react': ^19.2.8 '@types/react-dom': ^19.2.3 eslint: ^9.22.0 @@ -2799,6 +2804,98 @@ importers: specifier: ^8.0.14 version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) + e2e/react-start/issue-8180: + dependencies: + '@tanstack/react-router': + specifier: workspace:* + version: link:../../../packages/react-router + '@tanstack/react-start': + specifier: workspace:* + version: link:../../../packages/react-start + react: + specifier: 18.3.1 + version: 18.3.1 + react-dom: + specifier: 18.3.1 + version: 18.3.1(react@18.3.1) + devDependencies: + '@playwright/test': + specifier: ^1.61.0 + version: 1.61.1 + '@tanstack/router-e2e-utils': + specifier: workspace:* + version: link:../../e2e-utils + '@types/node': + specifier: 25.0.9 + version: 25.0.9 + '@types/react': + specifier: ^19.2.8 + version: 19.2.9 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.9) + '@typescript/native': + specifier: npm:typescript@^7.0.2 + version: typescript@7.0.2 + '@vitejs/plugin-react': + specifier: ^6.0.1 + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0(supports-color@10.2.2))(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + srvx: + specifier: ^0.11.9 + version: 0.11.12 + typescript: + specifier: npm:@typescript/typescript6@^6.0.2 + version: '@typescript/typescript6@6.0.2' + vite: + specifier: ^8.0.14 + version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) + + e2e/react-start/issue-8180-loader: + dependencies: + '@tanstack/react-router': + specifier: workspace:* + version: link:../../../packages/react-router + '@tanstack/react-start': + specifier: workspace:* + version: link:../../../packages/react-start + react: + specifier: 18.3.1 + version: 18.3.1 + react-dom: + specifier: 18.3.1 + version: 18.3.1(react@18.3.1) + devDependencies: + '@playwright/test': + specifier: ^1.61.0 + version: 1.61.1 + '@tanstack/router-e2e-utils': + specifier: workspace:* + version: link:../../e2e-utils + '@types/node': + specifier: 25.0.9 + version: 25.0.9 + '@types/react': + specifier: ^19.2.8 + version: 19.2.9 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.9) + '@typescript/native': + specifier: npm:typescript@^7.0.2 + version: typescript@7.0.2 + '@vitejs/plugin-react': + specifier: ^6.0.1 + version: 6.0.1(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.0(supports-color@10.2.2))(rolldown@1.0.2)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)))(babel-plugin-react-compiler@1.0.0)(vite@8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0)) + srvx: + specifier: ^0.11.9 + version: 0.11.12 + typescript: + specifier: npm:@typescript/typescript6@^6.0.2 + version: '@typescript/typescript6@6.0.2' + vite: + specifier: ^8.0.14 + version: 8.0.14(@types/node@25.0.9)(esbuild@0.27.4)(jiti@2.7.0)(sass@1.97.2)(terser@5.37.0)(tsx@4.20.3)(yaml@2.9.0) + e2e/react-start/query-integration: dependencies: '@tanstack/react-query': @@ -26663,6 +26760,11 @@ packages: rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: 18.3.1 + react-dom@19.2.3: resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} peerDependencies: @@ -26750,6 +26852,10 @@ packages: react: ^19.2.3 react-dom: ^19.2.3 + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + react@19.2.3: resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} engines: {node: '>=0.10.0'} @@ -27046,6 +27152,9 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -41388,6 +41497,12 @@ snapshots: defu: 6.1.4 destr: 2.0.5 + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + react-dom@19.2.3(react@19.2.3): dependencies: react: 19.2.3 @@ -41470,6 +41585,10 @@ snapshots: react-dom: 19.2.3(react@19.2.3) swr: 2.3.4(react@19.2.3) + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + react@19.2.3: {} read-package-up@11.0.0: @@ -41818,6 +41937,10 @@ snapshots: dependencies: xmlchars: 2.2.0 + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + scheduler@0.27.0: {} schema-utils@3.3.0: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 74f26abae24..06f871ecf76 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -63,6 +63,11 @@ overrides: solid-js: 1.9.12 react: 'catalog:' react-dom: 'catalog:' + 'tanstack-react-start-e2e-issue-8180>react': 18.3.1 + 'tanstack-react-start-e2e-issue-8180>react-dom': 18.3.1 + 'tanstack-react-start-e2e-issue-8180-loader>react': 18.3.1 + 'tanstack-react-start-e2e-issue-8180-loader>react-dom': 18.3.1 + 'react-dom@18.3.1>react': 18.3.1 '@types/react': 'catalog:' '@types/react-dom': 'catalog:' eslint: 'catalog:'