Skip to content

Conversation

@schiller-manuel
Copy link
Contributor

@schiller-manuel schiller-manuel commented Feb 3, 2026

Summary by CodeRabbit

  • New Features

    • Adds a context-bridge to expose server-side context to client routes, plus sample Home/Next routes, devtools, global styling, and a JSON-sorting utility.
  • Tests

    • Adds Playwright end-to-end tests verifying context bridging and navigation.
  • Chores

    • Adds e2e project configs (build/dev/test) and updates internal package export mappings.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 3, 2026

📝 Walkthrough

Walkthrough

Adds an end-to-end React Start context-bridge test app, a generic createStartContextBridge utility for serializing selected server context to the client, route/router wiring to consume the bridged context, Playwright tests, and an isServer export-map update in router-core.

Changes

Cohort / File(s) Summary
E2E Project Config
e2e/react-start/context-bridge/.gitignore, e2e/react-start/context-bridge/package.json, e2e/react-start/context-bridge/tsconfig.json, e2e/react-start/context-bridge/vite.config.ts, e2e/react-start/context-bridge/playwright.config.ts
Adds e2e project scaffolding: ignore patterns, package manifest with scripts/deps, TypeScript config, Vite config, and Playwright config (dev server integration and baseURL handling).
E2E Routes & Router
e2e/react-start/context-bridge/src/router.tsx, e2e/react-start/context-bridge/src/routes/__root.tsx, e2e/react-start/context-bridge/src/routes/index.tsx, e2e/react-start/context-bridge/src/routes/next.tsx, e2e/react-start/context-bridge/src/start.ts
Implements router setup with Start context bridge, root shell and devtools, two file routes that expose server/global/bridged context, and server middleware chain (mwA/mwB/mwC) that augments request context.
E2E Utilities & Generated Types
e2e/react-start/context-bridge/src/utils/sortJson.ts, e2e/react-start/context-bridge/src/styles/app.css, e2e/react-start/context-bridge/src/routeTree.gen.ts
Adds recursive JSON sorter, minimal CSS reset, and generated TanStack Router route/type definitions including Register augmentation for SSR integration.
E2E Tests
e2e/react-start/context-bridge/tests/context-bridge.spec.ts
Adds Playwright tests validating server context, global Start context, and bridged context contents and persistence across navigation to /next.
Context Bridge Utility
packages/start-client-core/src/createStartContextBridge.ts, packages/start-client-core/src/index.tsx
Introduces createStartContextBridge<TSelected> implementing server-side dehydration and client-side hydration of a selected Start context subset; re-exported from package index.
isServer Export Map
packages/router-core/package.json
Updates export map type paths for isServer ESM and CJS type entries from client.* to development.*.

Sequence Diagram(s)

sequenceDiagram
  participant Test as Playwright
  participant DevServer as Dev Server (Vite)
  participant Server as Start Instance
  participant Browser as Client (Browser)
  participant Router as TanStack Router

  Test->>DevServer: start webServer
  DevServer->>Server: forward HTTP requests
  Server->>Server: mwA -> mwB -> mwC (augment request context)
  Server->>Browser: serve HTML (router.dehydrate includes [bridgeKey]: selected)
  Browser->>Router: hydrate (router.hydrate merges bridged data into router.context)
  Browser->>Router: render route -> component reads bridged context via createStartContextBridge.get()
  Test->>Browser: navigate to /next and re-check bridged context
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • nlynzaad
  • brenelz

Poem

🐇 I nibble dehydrated crumbs in cheer,

Middleware hums its three-step song so clear,
I bridge server whispers to the client side,
Routes drink the context on a gentle ride,
Tests clap paws — the rabbit hops in gear! 🥕

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat: add start context bridge' accurately describes the main change: adding a new context bridge feature for TanStack Start with implementation and e2e tests.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch createStartContextBridge

Comment @coderabbitai help to get the list of available commands and usage tips.

@nx-cloud
Copy link

nx-cloud bot commented Feb 3, 2026

View your CI Pipeline Execution ↗ for commit 2cd5db8

Command Status Duration Result
nx affected --targets=test:eslint,test:unit,tes... ✅ Succeeded 6m 9s View ↗
nx run-many --target=build --exclude=examples/*... ✅ Succeeded 4s View ↗

☁️ Nx Cloud last updated this comment at 2026-02-03 23:50:41 UTC

@pkg-pr-new
Copy link

pkg-pr-new bot commented Feb 3, 2026

More templates

@tanstack/arktype-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/arktype-adapter@6593

@tanstack/eslint-plugin-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/eslint-plugin-router@6593

@tanstack/history

npm i https://pkg.pr.new/TanStack/router/@tanstack/history@6593

@tanstack/nitro-v2-vite-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/nitro-v2-vite-plugin@6593

@tanstack/react-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router@6593

@tanstack/react-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-devtools@6593

@tanstack/react-router-ssr-query

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-router-ssr-query@6593

@tanstack/react-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start@6593

@tanstack/react-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-client@6593

@tanstack/react-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/react-start-server@6593

@tanstack/router-cli

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-cli@6593

@tanstack/router-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-core@6593

@tanstack/router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools@6593

@tanstack/router-devtools-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-devtools-core@6593

@tanstack/router-generator

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-generator@6593

@tanstack/router-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-plugin@6593

@tanstack/router-ssr-query-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-ssr-query-core@6593

@tanstack/router-utils

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-utils@6593

@tanstack/router-vite-plugin

npm i https://pkg.pr.new/TanStack/router/@tanstack/router-vite-plugin@6593

@tanstack/solid-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router@6593

@tanstack/solid-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router-devtools@6593

@tanstack/solid-router-ssr-query

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-router-ssr-query@6593

@tanstack/solid-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start@6593

@tanstack/solid-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-client@6593

@tanstack/solid-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/solid-start-server@6593

@tanstack/start-client-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-client-core@6593

@tanstack/start-fn-stubs

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-fn-stubs@6593

@tanstack/start-plugin-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-plugin-core@6593

@tanstack/start-server-core

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-server-core@6593

@tanstack/start-static-server-functions

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-static-server-functions@6593

@tanstack/start-storage-context

npm i https://pkg.pr.new/TanStack/router/@tanstack/start-storage-context@6593

@tanstack/valibot-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/valibot-adapter@6593

@tanstack/virtual-file-routes

npm i https://pkg.pr.new/TanStack/router/@tanstack/virtual-file-routes@6593

@tanstack/vue-router

npm i https://pkg.pr.new/TanStack/router/@tanstack/vue-router@6593

@tanstack/vue-router-devtools

npm i https://pkg.pr.new/TanStack/router/@tanstack/vue-router-devtools@6593

@tanstack/vue-router-ssr-query

npm i https://pkg.pr.new/TanStack/router/@tanstack/vue-router-ssr-query@6593

@tanstack/vue-start

npm i https://pkg.pr.new/TanStack/router/@tanstack/vue-start@6593

@tanstack/vue-start-client

npm i https://pkg.pr.new/TanStack/router/@tanstack/vue-start-client@6593

@tanstack/vue-start-server

npm i https://pkg.pr.new/TanStack/router/@tanstack/vue-start-server@6593

@tanstack/zod-adapter

npm i https://pkg.pr.new/TanStack/router/@tanstack/zod-adapter@6593

commit: 2cd5db8

@schiller-manuel schiller-manuel force-pushed the createStartContextBridge branch from 615893a to 3eec39b Compare February 3, 2026 23:38
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In `@e2e/react-start/context-bridge/package.json`:
- Around line 14-30: Update the package.json dependency specifiers for internal
TanStack packages to use the workspace protocol wildcard: replace "workspace:^"
with "workspace:*" for the packages named "@tanstack/react-router",
"@tanstack/react-router-devtools", "@tanstack/react-start", and
"@tanstack/router-e2e-utils" so they use workspace:* instead of workspace:^.

In `@e2e/react-start/context-bridge/src/routes/__root.tsx`:
- Around line 23-58: RootDocument renders the lazily-loaded RouterDevtools
(RouterDevtools) directly which will throw without a Suspense boundary; update
RootDocument to wrap the RouterDevtools invocation in a React.Suspense boundary
(with a lightweight fallback such as null or a small loader) so the lazy import
resolves correctly, and ensure React.Suspense is imported/available in the file;
keep the existing production-guarded RouterDevtools definition unchanged.

In `@e2e/react-start/context-bridge/vite.config.ts`:
- Around line 7-10: The Vite config currently hardcodes server.port to 3000
inside the defineConfig call; update the server.port assignment in
vite.config.ts to read process.env.VITE_SERVER_PORT and parse it as an integer
(fallback to 3000 when missing) so Vite respects the port Playwright provides;
modify the server.port expression used in defineConfig accordingly (use
parseInt(process.env.VITE_SERVER_PORT) with a default).
🧹 Nitpick comments (2)
e2e/react-start/context-bridge/src/utils/sortJson.ts (1)

1-17: Tighten typing to JSON values to avoid unsafe casts.

The current as T/as unknown as T casts sidestep strict typing. Consider a JSON-specific type to keep this utility safe and self-documenting.

♻️ Suggested refactor
+type JsonPrimitive = string | number | boolean | null
+type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue }
+
-export function sortJson<T>(value: T): T {
+export function sortJson(value: JsonValue): JsonValue {
   if (Array.isArray(value)) {
-    return value.map(sortJson) as T
+    return value.map(sortJson)
   }

   if (!value || typeof value !== 'object') {
     return value
   }

-  const obj = value as Record<string, unknown>
-  const out: Record<string, unknown> = {}
+  const obj = value as Record<string, JsonValue>
+  const out: Record<string, JsonValue> = {}

   for (const key of Object.keys(obj).sort()) {
     out[key] = sortJson(obj[key])
   }

-  return out as T
+  return out
 }

As per coding guidelines: Use TypeScript strict mode with extensive type safety for all code.

packages/start-client-core/src/createStartContextBridge.ts (1)

70-80: Avoid any on the hydrate payload to preserve strict typing.

dehydrated: any and related casts bypass the strict-mode intent. Prefer unknown + narrowing (or a shared Dehydrated type) to keep safety intact.

♻️ Suggested refactor
-      router.options.hydrate = async (dehydrated: any) => {
-        await ogHydrate?.(dehydrated)
-        const selected = dehydrated?.[key] as
-          | Record<string, unknown>
-          | undefined
-        if (!selected) return
+      router.options.hydrate = async (dehydrated: unknown) => {
+        await ogHydrate?.(dehydrated as unknown)
+        if (!dehydrated || typeof dehydrated !== 'object') return
+        const selected = (dehydrated as Record<string, unknown>)[key]
+        if (!selected || typeof selected !== 'object') return

         router.update({
-          context: safeObjectMerge(router.options.context, selected),
+          context: safeObjectMerge(
+            router.options.context,
+            selected as Record<string, unknown>,
+          ),
         })
       }

As per coding guidelines: Use TypeScript strict mode with extensive type safety for all code.

Comment on lines +14 to +30
"dependencies": {
"@tanstack/react-router": "workspace:^",
"@tanstack/react-router-devtools": "workspace:^",
"@tanstack/react-start": "workspace:^",
"express": "^5.1.0",
"http-proxy-middleware": "^3.0.5",
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"devDependencies": {
"@playwright/test": "^1.50.1",
"@tailwindcss/vite": "^4.1.18",
"@tanstack/router-e2e-utils": "workspace:^",
"@types/node": "^22.10.2",
"@types/react": "^19.0.8",
"@types/react-dom": "^19.0.3",
"@vitejs/plugin-react": "^4.3.4",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Use workspace:* for internal TanStack dependencies.

🔧 Suggested update
   "dependencies": {
-    "@tanstack/react-router": "workspace:^",
-    "@tanstack/react-router-devtools": "workspace:^",
-    "@tanstack/react-start": "workspace:^",
+    "@tanstack/react-router": "workspace:*",
+    "@tanstack/react-router-devtools": "workspace:*",
+    "@tanstack/react-start": "workspace:*",
     "express": "^5.1.0",
     "http-proxy-middleware": "^3.0.5",
     "react": "^19.0.0",
     "react-dom": "^19.0.0"
   },
   "devDependencies": {
     "@playwright/test": "^1.50.1",
     "@tailwindcss/vite": "^4.1.18",
-    "@tanstack/router-e2e-utils": "workspace:^",
+    "@tanstack/router-e2e-utils": "workspace:*",

As per coding guidelines: Use workspace protocol workspace:* for internal dependencies in package.json files.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"dependencies": {
"@tanstack/react-router": "workspace:^",
"@tanstack/react-router-devtools": "workspace:^",
"@tanstack/react-start": "workspace:^",
"express": "^5.1.0",
"http-proxy-middleware": "^3.0.5",
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"devDependencies": {
"@playwright/test": "^1.50.1",
"@tailwindcss/vite": "^4.1.18",
"@tanstack/router-e2e-utils": "workspace:^",
"@types/node": "^22.10.2",
"@types/react": "^19.0.8",
"@types/react-dom": "^19.0.3",
"@vitejs/plugin-react": "^4.3.4",
"dependencies": {
"@tanstack/react-router": "workspace:*",
"@tanstack/react-router-devtools": "workspace:*",
"@tanstack/react-start": "workspace:*",
"express": "^5.1.0",
"http-proxy-middleware": "^3.0.5",
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"devDependencies": {
"@playwright/test": "^1.50.1",
"@tailwindcss/vite": "^4.1.18",
"@tanstack/router-e2e-utils": "workspace:*",
"@types/node": "^22.10.2",
"@types/react": "^19.0.8",
"@types/react-dom": "^19.0.3",
"@vitejs/plugin-react": "^4.3.4",
🤖 Prompt for AI Agents
In `@e2e/react-start/context-bridge/package.json` around lines 14 - 30, Update the
package.json dependency specifiers for internal TanStack packages to use the
workspace protocol wildcard: replace "workspace:^" with "workspace:*" for the
packages named "@tanstack/react-router", "@tanstack/react-router-devtools",
"@tanstack/react-start", and "@tanstack/router-e2e-utils" so they use
workspace:* instead of workspace:^.

Comment on lines +23 to +58
const RouterDevtools =
process.env.NODE_ENV === 'production'
? () => null
: React.lazy(() =>
import('@tanstack/react-router-devtools').then((res) => ({
default: res.TanStackRouterDevtools,
})),
)

function RootDocument({ children }: { children: React.ReactNode }) {
return (
<html>
<head>
<HeadContent />
</head>
<body>
<div className="p-2 flex gap-3 text-lg">
<Link
to="/"
activeOptions={{ exact: true }}
activeProps={{ className: 'font-bold' }}
>
Home
</Link>
<Link
to="/next"
activeOptions={{ exact: true }}
activeProps={{ className: 'font-bold' }}
>
Next
</Link>
</div>
<hr />
{children}
<RouterDevtools position="bottom-right" />
<Scripts />
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🌐 Web query:

React.lazy Suspense boundary requirement React 18 19 runtime error

💡 Result:

In React 18 and React 19, a React.lazy() component must be rendered under an ancestor <Suspense> boundary because rendering a lazy component while its code is still loading “suspends” (it throws a Promise). React then walks up the rendered tree looking for the nearest <Suspense> to show its fallback; if it can’t find one, you’ll get a runtime failure/blank screen. [1]

Key “boundary requirement” gotchas that commonly cause runtime errors:

  • The <Suspense> must be above the lazy component in the rendered tree. A <Suspense> inside the component that suspends won’t help, because React can’t reach it when that component suspends during its own render. [2]
  • If you see A component suspended while responding to synchronous input… in React 18+, it usually means a user-driven synchronous update (navigation, typing, click) caused something to suspend (often a lazy route or Suspense-based data). Typical fixes are:
    • move/add a higher Suspense boundary (e.g., wrap your router / route outlet), and/or
    • wrap the update that triggers the suspend in startTransition. [3]

Minimal correct pattern

import { Suspense, lazy } from "react";

const Page = lazy(() => import("./Page"));

export function App() {
  return (
    <Suspense fallback={<div>Loading…</div>}>
      <Page />
    </Suspense>
  );
}

Sources: React lazy docs (v19.2) [1], explanation of boundary placement (React walks up to nearest <Suspense>) [2], React 18 runtime error (“suspended while responding to synchronous input”) discussion and fixes [3].

[1] (react.dev)
[2] (stackoverflow.com)
[3] (stackoverflow.com)

Citations:


Wrap the lazy devtools in a Suspense boundary.
Rendering a React.lazy component without Suspense will throw at runtime. The <Suspense> boundary must be placed above the lazy component in the rendered tree for React to properly handle code-splitting and suspense.

✅ Suggested fix
-        <RouterDevtools position="bottom-right" />
+        <React.Suspense fallback={null}>
+          <RouterDevtools position="bottom-right" />
+        </React.Suspense>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const RouterDevtools =
process.env.NODE_ENV === 'production'
? () => null
: React.lazy(() =>
import('@tanstack/react-router-devtools').then((res) => ({
default: res.TanStackRouterDevtools,
})),
)
function RootDocument({ children }: { children: React.ReactNode }) {
return (
<html>
<head>
<HeadContent />
</head>
<body>
<div className="p-2 flex gap-3 text-lg">
<Link
to="/"
activeOptions={{ exact: true }}
activeProps={{ className: 'font-bold' }}
>
Home
</Link>
<Link
to="/next"
activeOptions={{ exact: true }}
activeProps={{ className: 'font-bold' }}
>
Next
</Link>
</div>
<hr />
{children}
<RouterDevtools position="bottom-right" />
<Scripts />
const RouterDevtools =
process.env.NODE_ENV === 'production'
? () => null
: React.lazy(() =>
import('@tanstack/react-router-devtools').then((res) => ({
default: res.TanStackRouterDevtools,
})),
)
function RootDocument({ children }: { children: React.ReactNode }) {
return (
<html>
<head>
<HeadContent />
</head>
<body>
<div className="p-2 flex gap-3 text-lg">
<Link
to="/"
activeOptions={{ exact: true }}
activeProps={{ className: 'font-bold' }}
>
Home
</Link>
<Link
to="/next"
activeOptions={{ exact: true }}
activeProps={{ className: 'font-bold' }}
>
Next
</Link>
</div>
<hr />
{children}
<React.Suspense fallback={null}>
<RouterDevtools position="bottom-right" />
</React.Suspense>
<Scripts />
🤖 Prompt for AI Agents
In `@e2e/react-start/context-bridge/src/routes/__root.tsx` around lines 23 - 58,
RootDocument renders the lazily-loaded RouterDevtools (RouterDevtools) directly
which will throw without a Suspense boundary; update RootDocument to wrap the
RouterDevtools invocation in a React.Suspense boundary (with a lightweight
fallback such as null or a small loader) so the lazy import resolves correctly,
and ensure React.Suspense is imported/available in the file; keep the existing
production-guarded RouterDevtools definition unchanged.

Comment on lines +7 to +10
export default defineConfig({
server: {
port: 3000,
},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify port alignment between Vite and Playwright config
rg -n "getTestServerPort|baseURL|port" e2e/react-start/context-bridge/playwright.config.ts e2e/react-start/context-bridge/vite.config.ts

Repository: TanStack/router

Length of output: 1541


🏁 Script executed:

cat e2e/react-start/context-bridge/vite.config.ts

Repository: TanStack/router

Length of output: 504


🏁 Script executed:

cat e2e/react-start/context-bridge/playwright.config.ts

Repository: TanStack/router

Length of output: 788


Vite config must respect the VITE_SERVER_PORT environment variable that Playwright passes.

The vite.config.ts hardcodes port: 3000, but playwright.config.ts is configured to pass a dynamically-derived port via the VITE_SERVER_PORT environment variable (line 16 in playwright.config.ts: VITE_SERVER_PORT=${PORT}). The Vite config ignores this, causing test failures when the Playwright webServer tries to reach the dev server on the derived port while Vite listens on 3000.

Update vite.config.ts to read the environment variable:

server: {
  port: process.env.VITE_SERVER_PORT ? parseInt(process.env.VITE_SERVER_PORT) : 3000,
},
🤖 Prompt for AI Agents
In `@e2e/react-start/context-bridge/vite.config.ts` around lines 7 - 10, The Vite
config currently hardcodes server.port to 3000 inside the defineConfig call;
update the server.port assignment in vite.config.ts to read
process.env.VITE_SERVER_PORT and parse it as an integer (fallback to 3000 when
missing) so Vite respects the port Playwright provides; modify the server.port
expression used in defineConfig accordingly (use
parseInt(process.env.VITE_SERVER_PORT) with a default).

@schiller-manuel schiller-manuel force-pushed the createStartContextBridge branch from 3eec39b to 2cd5db8 Compare February 3, 2026 23:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants