Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/start-server-core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@
"@tanstack/router-core": "workspace:*",
"@tanstack/start-client-core": "workspace:*",
"@tanstack/start-storage-context": "workspace:*",
"h3-v2": "npm:h3@2.0.1-rc.5",
"h3-v2": "npm:h3@2.0.0-beta.5",
"seroval": "^1.4.0",
"tiny-invariant": "^1.3.3"
},
Expand Down
2 changes: 1 addition & 1 deletion packages/start-server-core/src/request-response.ts
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ export function clearSession(config: Partial<SessionConfig>): Promise<void> {
// not public API
export function getResponse() {
const event = getH3Event()
return event.res
return event._res
}
Comment on lines 327 to 331
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
# Locate and read the request-response.ts file around the target lines
fd -t f "request-response.ts" packages/start-server-core/src

# Get file stats to understand size
wc -l packages/start-server-core/src/request-response.ts

Repository: TanStack/router


<shell_result>
Repository: TanStack/router
Exit code: 0

stdout:

packages/start-server-core/src/request-response.ts
338 packages/start-server-core/src/request-response.ts

</shell_result>


Script executed:

#!/bin/bash
# Read the relevant section of the file
sed -n '320,338p' packages/start-server-core/src/request-response.ts

Repository: TanStack/router


<shell_result>
Repository: TanStack/router
Exit code: 0

stdout:

 * Clear the session data for the current request.
 */
export function clearSession(config: Partial<SessionConfig>): Promise<void> {
  const event = getH3Event()
  return h3_clearSession(event, { name: 'start', ...config })
}

// not public API
export function getResponse() {
  const event = getH3Event()
  return event._res
}

// not public API (yet)
export function getValidatedQuery<TSchema extends StandardSchemaV1>(
  schema: StandardSchemaV1,
): Promise<StandardSchemaV1.InferOutput<TSchema>> {
  return h3_getValidatedQuery(getH3Event(), schema)
}

</shell_result>


Script executed:

#!/bin/bash
# Check h3 version in package.json
fd -t f "package.json" packages/start-server-core | head -1 | xargs cat | grep -A 5 -B 5 '"h3"'

Repository: TanStack/router


<shell_result>
Repository: TanStack/router
Exit code: 1

</shell_result>


Script executed:

#!/bin/bash
# Search for h3 version across all package.json files
find . -name "package.json" -type f | xargs grep -l '"h3"' | head -5

Repository: TanStack/router


<shell_result>
Repository: TanStack/router
Exit code: 0

</shell_result>


Script executed:

#!/bin/bash
# Search for getResponse() function calls
rg -n "getResponse\(" packages/start-server-core/ --type ts

echo "---"

# Search for event._res usages
rg -n "event\._res" . --type ts

echo "---"

# Search for h3 imports to understand the version
rg -n "from.*['\"]h3['\"]" . --type ts | head -20

Repository: TanStack/router


<shell_result>
Repository: TanStack/router
Exit code: 0

stdout:

packages/start-server-core/src/server-functions-handler.ts:186:      const response = getResponse()
packages/start-server-core/src/server-functions-handler.ts:302:      const response = getResponse()
packages/start-server-core/src/request-response.ts:328:export function getResponse() {
---
./packages/start-server-core/src/request-response.ts:330:  return event._res
---
./packages/nitro-v2-vite-plugin/src/index.ts:123:                  [virtualEntry]: `import { fromWebHandler } from 'h3'

</shell_result>


Script executed:

#!/bin/bash
# Read server-functions-handler.ts around line 186 and 302 to see how getResponse() is used
echo "=== Around line 186 ==="
sed -n '180,192p' packages/start-server-core/src/server-functions-handler.ts

echo -e "\n=== Around line 302 ==="
sed -n '296,308p' packages/start-server-core/src/server-functions-handler.ts

Repository: TanStack/router


<shell_result>
Repository: TanStack/router
Exit code: 0

stdout:

=== Around line 186 ===
      // }

      if (isNotFound(result)) {
        return isNotFoundResponse(result)
      }

      const response = getResponse()
      let nonStreamingBody: any = undefined

      if (result !== undefined) {
        // first run without the stream in case `result` does not need streaming
        let done = false as boolean
        const callbacks: {

=== Around line 302 ===
          toCrossJSONAsync(error, {
            refs: new Map(),
            plugins: serovalPlugins,
          }),
        ),
      )
      const response = getResponse()
      return new Response(serializedError, {
        status: response?.status ?? 500,
        statusText: response?.statusText,
        headers: {
          'Content-Type': 'application/json',
          [X_TSS_SERIALIZED]: 'true',

</shell_result>


Script executed:

#!/bin/bash
# Search for setResponseStatus and status manipulation
rg -n "setResponseStatus\|event\.res\|event\._res" packages/start-server-core/src/request-response.ts -A 2 -B 2

echo -e "\n=== Full request-response.ts for context ==="
cat -n packages/start-server-core/src/request-response.ts

Repository: TanStack/router


<shell_result>
Repository: TanStack/router
Exit code: 0

stdout:


=== Full request-response.ts for context ===
     1	import { AsyncLocalStorage } from 'node:async_hooks'
     2	
     3	import {
     4	  H3Event,
     5	  clearSession as h3_clearSession,
     6	  deleteCookie as h3_deleteCookie,
     7	  getRequestHost as h3_getRequestHost,
     8	  getRequestIP as h3_getRequestIP,
     9	  getRequestProtocol as h3_getRequestProtocol,
    10	  getRequestURL as h3_getRequestURL,
    11	  getSession as h3_getSession,
    12	  getValidatedQuery as h3_getValidatedQuery,
    13	  parseCookies as h3_parseCookies,
    14	  sanitizeStatusCode as h3_sanitizeStatusCode,
    15	  sanitizeStatusMessage as h3_sanitizeStatusMessage,
    16	  sealSession as h3_sealSession,
    17	  setCookie as h3_setCookie,
    18	  toResponse as h3_toResponse,
    19	  unsealSession as h3_unsealSession,
    20	  updateSession as h3_updateSession,
    21	  useSession as h3_useSession,
    22	} from 'h3-v2'
    23	import type {
    24	  RequestHeaderMap,
    25	  RequestHeaderName,
    26	  ResponseHeaderMap,
    27	  ResponseHeaderName,
    28	  TypedHeaders,
    29	} from 'fetchdts'
    30	
    31	import type { CookieSerializeOptions } from 'cookie-es'
    32	import type {
    33	  Session,
    34	  SessionConfig,
    35	  SessionData,
    36	  SessionManager,
    37	  SessionUpdate,
    38	} from './session'
    39	import type { StandardSchemaV1 } from '@standard-schema/spec'
    40	import type { RequestHandler } from './request-handler'
    41	
    42	interface StartEvent {
    43	  h3Event: H3Event
    44	}
    45	const eventStorage = new AsyncLocalStorage<StartEvent>()
    46	
    47	export type { ResponseHeaderName, RequestHeaderName }
    48	
    49	export function requestHandler<TRegister = unknown>(
    50	  handler: RequestHandler<TRegister>,
    51	) {
    52	  return (request: Request, requestOpts: any): Promise<Response> | Response => {
    53	    const h3Event = new H3Event(request)
    54	
    55	    const response = eventStorage.run({ h3Event }, () =>
    56	      handler(request, requestOpts),
    57	    )
    58	    return h3_toResponse(response, h3Event)
    59	  }
    60	}
    61	
    62	function getH3Event() {
    63	  const event = eventStorage.getStore()
    64	  if (!event) {
    65	    throw new Error(
    66	      `No StartEvent found in AsyncLocalStorage. Make sure you are using the function within the server runtime.`,
    67	    )
    68	  }
    69	  return event.h3Event
    70	}
    71	
    72	export function getRequest(): Request {
    73	  const event = getH3Event()
    74	  return event.req
    75	}
    76	
    77	export function getRequestHeaders(): TypedHeaders<RequestHeaderMap> {
    78	  // TODO `as any` not needed when fetchdts is updated
    79	  return getH3Event().req.headers as any
    80	}
    81	
    82	export function getRequestHeader(name: RequestHeaderName): string | undefined {
    83	  return getRequestHeaders().get(name) || undefined
    84	}
    85	
    86	export function getRequestIP(opts?: {
    87	  /**
    88	   * Use the X-Forwarded-For HTTP header set by proxies.
    89	   *
    90	   * Note: Make sure that this header can be trusted (your application running behind a CDN or reverse proxy) before enabling.
    91	   */
    92	  xForwardedFor?: boolean
    93	}) {
    94	  return h3_getRequestIP(getH3Event(), opts)
    95	}
    96	
    97	/**
    98	 * Get the request hostname.
    99	 *
   100	 * If `xForwardedHost` is `true`, it will use the `x-forwarded-host` header if it exists.
   101	 *
   102	 * If no host header is found, it will default to "localhost".
   103	 */
   104	export function getRequestHost(opts?: { xForwardedHost?: boolean }) {
   105	  return h3_getRequestHost(getH3Event(), opts)
   106	}
   107	
   108	/**
   109	 * Get the full incoming request URL.
   110	 *
   111	 * If `xForwardedHost` is `true`, it will use the `x-forwarded-host` header if it exists.
   112	 *
   113	 * If `xForwardedProto` is `false`, it will not use the `x-forwarded-proto` header.
   114	 */
   115	export function getRequestUrl(opts?: {
   116	  xForwardedHost?: boolean
   117	  xForwardedProto?: boolean
   118	}) {
   119	  return h3_getRequestURL(getH3Event(), opts)
   120	}
   121	
   122	/**
   123	 * Get the request protocol.
   124	 *
   125	 * If `x-forwarded-proto` header is set to "https", it will return "https". You can disable this behavior by setting `xForwardedProto` to `false`.
   126	 *
   127	 * If protocol cannot be determined, it will default to "http".
   128	 */
   129	export function getRequestProtocol(opts?: {
   130	  xForwardedProto?: boolean
   131	}): 'http' | 'https' | (string & {}) {
   132	  return h3_getRequestProtocol(getH3Event(), opts)
   133	}
   134	
   135	export function setResponseHeaders(
   136	  headers: TypedHeaders<ResponseHeaderMap>,
   137	): void {
   138	  const event = getH3Event()
   139	  for (const [name, value] of Object.entries(headers)) {
   140	    event.res.headers.set(name, value)
   141	  }
   142	}
   143	
   144	export function getResponseHeaders(): TypedHeaders<ResponseHeaderMap> {
   145	  const event = getH3Event()
   146	  return event.res.headers
   147	}
   148	
   149	export function getResponseHeader(
   150	  name: ResponseHeaderName,
   151	): string | undefined {
   152	  const event = getH3Event()
   153	  return event.res.headers.get(name) || undefined
   154	}
   155	
   156	export function setResponseHeader(
   157	  name: ResponseHeaderName,
   158	  value: string | Array<string>,
   159	): void {
   160	  const event = getH3Event()
   161	  if (Array.isArray(value)) {
   162	    event.res.headers.delete(name)
   163	    for (const valueItem of value) {
   164	      event.res.headers.append(name, valueItem)
   165	    }
   166	  } else {
   167	    event.res.headers.set(name, value)
   168	  }
   169	}
   170	export function removeResponseHeader(name: ResponseHeaderName): void {
   171	  const event = getH3Event()
   172	  event.res.headers.delete(name)
   173	}
   174	
   175	export function clearResponseHeaders(
   176	  headerNames?: Array<ResponseHeaderName>,
   177	): void {
   178	  const event = getH3Event()
   179	  // If headerNames is provided, clear only those headers
   180	  if (headerNames && headerNames.length > 0) {
   181	    for (const name of headerNames) {
   182	      event.res.headers.delete(name)
   183	    }
   184	    // Otherwise, clear all headers
   185	  } else {
   186	    for (const name of event.res.headers.keys()) {
   187	      event.res.headers.delete(name)
   188	    }
   189	  }
   190	}
   191	
   192	export function getResponseStatus(): number {
   193	  return getH3Event().res.status || 200
   194	}
   195	
   196	export function setResponseStatus(code?: number, text?: string): void {
   197	  const event = getH3Event()
   198	  if (code) {
   199	    event.res.status = h3_sanitizeStatusCode(code, event.res.status)
   200	  }
   201	  if (text) {
   202	    event.res.statusText = h3_sanitizeStatusMessage(text)
   203	  }
   204	}
   205	
   206	/**
   207	 * Parse the request to get HTTP Cookie header string and return an object of all cookie name-value pairs.
   208	 * @returns Object of cookie name-value pairs
   209	 * ```ts
   210	 * const cookies = getCookies()
   211	 * ```
   212	 */
   213	export function getCookies(): Record<string, string> {
   214	  const event = getH3Event()
   215	  return h3_parseCookies(event)
   216	}
   217	
   218	/**
   219	 * Get a cookie value by name.
   220	 * @param name Name of the cookie to get
   221	 * @returns {*} Value of the cookie (String or undefined)
   222	 * ```ts
   223	 * const authorization = getCookie('Authorization')
   224	 * ```
   225	 */
   226	export function getCookie(name: string): string | undefined {
   227	  return getCookies()[name] || undefined
   228	}
   229	
   230	/**
   231	 * Set a cookie value by name.
   232	 * @param name Name of the cookie to set
   233	 * @param value Value of the cookie to set
   234	 * @param options {CookieSerializeOptions} Options for serializing the cookie
   235	 * ```ts
   236	 * setCookie('Authorization', '1234567')
   237	 * ```
   238	 */
   239	export function setCookie(
   240	  name: string,
   241	  value: string,
   242	  options?: CookieSerializeOptions,
   243	): void {
   244	  const event = getH3Event()
   245	  h3_setCookie(event, name, value, options)
   246	}
   247	
   248	/**
   249	 * Remove a cookie by name.
   250	 * @param name Name of the cookie to delete
   251	 * @param serializeOptions {CookieSerializeOptions} Cookie options
   252	 * ```ts
   253	 * deleteCookie('SessionId')
   254	 * ```
   255	 */
   256	export function deleteCookie(
   257	  name: string,
   258	  options?: CookieSerializeOptions,
   259	): void {
   260	  const event = getH3Event()
   261	  h3_deleteCookie(event, name, options)
   262	}
   263	
   264	function getDefaultSessionConfig(config: SessionConfig): SessionConfig {
   265	  return {
   266	    name: 'start',
   267	    ...config,
   268	  }
   269	}
   270	
   271	/**
   272	 * Create a session manager for the current request.
   273	 */
   274	export function useSession<TSessionData extends SessionData = SessionData>(
   275	  config: SessionConfig,
   276	): Promise<SessionManager<TSessionData>> {
   277	  const event = getH3Event()
   278	  return h3_useSession(event, getDefaultSessionConfig(config))
   279	}
   280	/**
   281	 * Get the session for the current request
   282	 */
   283	export function getSession<TSessionData extends SessionData = SessionData>(
   284	  config: SessionConfig,
   285	): Promise<Session<TSessionData>> {
   286	  const event = getH3Event()
   287	  return h3_getSession(event, getDefaultSessionConfig(config))
   288	}
   289	
   290	/**
   291	 * Update the session data for the current request.
   292	 */
   293	export function updateSession<TSessionData extends SessionData = SessionData>(
   294	  config: SessionConfig,
   295	  update?: SessionUpdate<TSessionData>,
   296	): Promise<Session<TSessionData>> {
   297	  const event = getH3Event()
   298	  return h3_updateSession(event, getDefaultSessionConfig(config), update)
   299	}
   300	
   301	/**
   302	 * Encrypt and sign the session data for the current request.
   303	 */
   304	export function sealSession(config: SessionConfig): Promise<string> {
   305	  const event = getH3Event()
   306	  return h3_sealSession(event, getDefaultSessionConfig(config))
   307	}
   308	/**
   309	 * Decrypt and verify the session data for the current request.
   310	 */
   311	export function unsealSession(
   312	  config: SessionConfig,
   313	  sealed: string,
   314	): Promise<Partial<Session>> {
   315	  const event = getH3Event()
   316	  return h3_unsealSession(event, getDefaultSessionConfig(config), sealed)
   317	}
   318	
   319	/**
   320	 * Clear the session data for the current request.
   321	 */
   322	export function clearSession(config: Partial<SessionConfig>): Promise<void> {
   323	  const event = getH3Event()
   324	  return h3_clearSession(event, { name: 'start', ...config })
   325	}
   326	
   327	// not public API
   328	export function getResponse() {
   329	  const event = getH3Event()
   330	  return event._res
   331	}
   332	
   333	// not public API (yet)
   334	export function getValidatedQuery<TSchema extends StandardSchemaV1>(
   335	  schema: StandardSchemaV1,
   336	): Promise<StandardSchemaV1.InferOutput<TSchema>> {
   337	  return h3_getValidatedQuery(getH3Event(), schema)
   338	}

</shell_result>


Script executed:

#!/bin/bash
# Search for h3-v2 or h3 in lock files or dependencies
find . -name "package-lock.json" -o -name "yarn.lock" -o -name "pnpm-lock.yaml" | head -1

# Check root package.json for h3-v2
cat package.json | grep -A 5 -B 5 "h3"

# Also check if there's a root packages directory listing
ls -la packages/ | head -20

Repository: TanStack/router


<shell_result>
Repository: TanStack/router
Exit code: 0

stdout:

./pnpm-lock.yaml
total 0
drwxr-xr-x 37 jailuser jailuser 740 Nov 26 14:18 .
drwxr-xr-x 13 jailuser jailuser 720 Nov 26 14:20 ..
drwxr-xr-x  4 jailuser jailuser 160 Nov 26 14:18 arktype-adapter
drwxr-xr-x  4 jailuser jailuser 180 Nov 26 14:18 directive-functions-plugin
drwxr-xr-x  3 jailuser jailuser 160 Nov 26 14:18 eslint-plugin-router
drwxr-xr-x  4 jailuser jailuser 160 Nov 26 14:18 history
drwxr-xr-x  3 jailuser jailuser 160 Nov 26 14:18 nitro-v2-vite-plugin
drwxr-xr-x  4 jailuser jailuser 200 Nov 26 14:18 react-router
drwxr-xr-x  3 jailuser jailuser 160 Nov 26 14:18 react-router-devtools
drwxr-xr-x  3 jailuser jailuser 160 Nov 26 14:18 react-router-ssr-query
drwxr-xr-x  3 jailuser jailuser 180 Nov 26 14:18 react-start
drwxr-xr-x  3 jailuser jailuser 160 Nov 26 14:18 react-start-client
drwxr-xr-x  3 jailuser jailuser 160 Nov 26 14:18 react-start-server
drwxr-xr-x  4 jailuser jailuser 180 Nov 26 14:18 router-cli
drwxr-xr-x  4 jailuser jailuser 200 Nov 26 14:18 router-core
drwxr-xr-x  3 jailuser jailuser 160 Nov 26 14:18 router-devtools
drwxr-xr-x  4 jailuser jailuser 180 Nov 26 14:18 router-devtools-core
drwxr-xr-x  4 jailuser jailuser 200 Nov 26 14:18 router-generator
drwxr-xr-x  4 jailuser jailuser 180 Nov 26 14:18 router-plugin

</shell_result>


Script executed:

#!/bin/bash
# Check start-server-core package.json
echo "=== start-server-core package.json ==="
cat packages/start-server-core/package.json

echo -e "\n=== Root package.json ==="
head -50 package.json

Repository: TanStack/router


<shell_result>
Repository: TanStack/router
Exit code: 0

stdout:

=== start-server-core package.json ===
{
  "name": "@tanstack/start-server-core",
  "version": "1.139.7",
  "description": "Modern and scalable routing for React applications",
  "author": "Tanner Linsley",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/TanStack/router.git",
    "directory": "packages/start-server-core"
  },
  "homepage": "https://tanstack.com/start",
  "funding": {
    "type": "github",
    "url": "https://github.com/sponsors/tannerlinsley"
  },
  "keywords": [
    "react",
    "location",
    "router",
    "routing",
    "async",
    "async router",
    "typescript"
  ],
  "scripts": {
    "clean": "rimraf ./dist && rimraf ./coverage",
    "test": "pnpm test:eslint && pnpm test:types && pnpm test:build && pnpm test:unit",
    "test:unit": "vitest",
    "test:eslint": "eslint ./src",
    "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"",
    "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js",
    "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js",
    "test:types:ts56": "node ../../node_modules/typescript56/lib/tsc.js",
    "test:types:ts57": "node ../../node_modules/typescript57/lib/tsc.js",
    "test:types:ts58": "node ../../node_modules/typescript58/lib/tsc.js",
    "test:types:ts59": "tsc",
    "test:build": "publint --strict && attw --ignore-rules no-resolution --pack .",
    "build": "vite build"
  },
  "type": "module",
  "types": "dist/esm/index.d.ts",
  "exports": {
    ".": {
      "import": {
        "types": "./dist/esm/index.d.ts",
        "default": "./dist/esm/index.js"
      }
    },
    "./createServerRpc": {
      "import": {
        "types": "./dist/esm/createServerRpc.d.ts",
        "default": "./dist/esm/createServerRpc.js"
      }
    },
    "./createSsrRpc": {
      "import": {
        "types": "./dist/esm/createSsrRpc.d.ts",
        "default": "./dist/esm/createSsrRpc.js"
      }
    },
    "./package.json": "./package.json"
  },
  "imports": {
    "#tanstack-start-server-fn-manifest": {
      "default": "./dist/esm/fake-start-server-fn-manifest.js"
    }
  },
  "sideEffects": false,
  "files": [
    "dist",
    "src"
  ],
  "engines": {
    "node": ">=22.12.0"
  },
  "dependencies": {
    "@tanstack/history": "workspace:*",
    "@tanstack/router-core": "workspace:*",
    "@tanstack/start-client-core": "workspace:*",
    "@tanstack/start-storage-context": "workspace:*",
    "h3-v2": "npm:h3@2.0.0-beta.4",
    "seroval": "^1.4.0",
    "tiny-invariant": "^1.3.3"
  },
  "devDependencies": {
    "@standard-schema/spec": "^1.0.0",
    "cookie-es": "^2.0.0",
    "fetchdts": "^0.1.6"
  }
}

=== Root package.json ===
{
  "name": "root",
  "private": true,
  "repository": {
    "type": "git",
    "url": "https://github.com/TanStack/router.git"
  },
  "packageManager": "pnpm@10.13.1",
  "type": "module",
  "scripts": {
    "cleanNodeModules": "pnpm -r exec rm -rf node_modules",
    "clean": "pnpm --filter \"./packages/**\" run clean",
    "preinstall": "node -e \"if(process.env.CI == 'true') {console.info('Skipping preinstall...')} else {process.exit(1)}\" || npx -y only-allow pnpm",
    "test": "pnpm run test:ci",
    "test:pr": "nx affected --targets=test:eslint,test:unit,test:e2e,test:types,test:build,build",
    "test:ci": "nx run-many --targets=test:eslint,test:unit,test:e2e,test:types,test:build,build",
    "test:eslint": "nx affected --target=test:eslint --exclude=examples/**,e2e/**",
    "test:format": "pnpm run prettier --check",
    "test:unit": "nx affected --target=test:unit --exclude=examples/**,e2e/**",
    "test:unit:dev": "pnpm run test:unit && nx watch --all -- pnpm run test:unit",
    "test:build": "nx affected --target=test:build --exclude=examples/**",
    "test:types": "nx affected --target=test:types --exclude=examples/**",
    "test:e2e": "nx run-many --target=test:e2e",
    "build": "nx affected --target=build --exclude=e2e/** --exclude=examples/**",
    "build:all": "nx run-many --target=build --exclude=examples/** --exclude=e2e/**",
    "watch": "pnpm run build:all && nx watch --all -- pnpm run build:all",
    "dev": "pnpm run watch",
    "prettier": "prettier --experimental-cli --ignore-unknown '**/*'",
    "prettier:write": "pnpm run prettier --write",
    "cipublish": "node scripts/publish.js",
    "gpt-generate": "node gpt/generate.js",
    "set-ts-version": "node scripts/set-ts-version.js",
    "labeler-generate": "node scripts/generate-labeler-config.mjs",
    "cleanup-empty-packages": "node scripts/cleanup-empty-packages.mjs",
    "verify-links": "node scripts/verify-links.ts"
  },
  "devDependencies": {
    "@arethetypeswrong/cli": "^0.18.2",
    "@eslint-react/eslint-plugin": "^1.26.2",
    "@playwright/test": "^1.56.1",
    "@tanstack/config": "0.22.0",
    "@tanstack/react-query": "^5.90.7",
    "@tanstack/query-core": "^5.90.7",
    "@types/node": "22.10.2",
    "@types/react": "^19.2.2",
    "@types/react-dom": "^19.2.2",
    "@vitest/browser": "^3.0.6",
    "@vitest/ui": "^3.0.6",
    "eslint": "^9.22.0",
    "eslint-plugin-react-hooks": "^5.1.0",

</shell_result>


Script executed:

#!/bin/bash
# Search for H3Event import and type definition
echo "=== Searching for H3Event type definitions or usage ==="
rg -n "H3Event\|event\.res\|event\._res" packages/start-server-core/src/ -A 3 -B 1 | head -100

echo -e "\n=== Check how h3_toResponse is used ==="
sed -n '49,60p' packages/start-server-core/src/request-response.ts

Repository: TanStack/router


<shell_result>
Repository: TanStack/router
Exit code: 0

stdout:

=== Searching for H3Event type definitions or usage ===

=== Check how h3_toResponse is used ===
export function requestHandler<TRegister = unknown>(
  handler: RequestHandler<TRegister>,
) {
  return (request: Request, requestOpts: any): Promise<Response> | Response => {
    const h3Event = new H3Event(request)

    const response = eventStorage.run({ h3Event }, () =>
      handler(request, requestOpts),
    )
    return h3_toResponse(response, h3Event)
  }
}

</shell_result>


Script executed:

#!/bin/bash
# Read broader context around line 186 in server-functions-handler.ts
echo "=== Context around line 186 ==="
sed -n '170,200p' packages/start-server-core/src/server-functions-handler.ts

echo -e "\n=== Context around line 302 ==="
sed -n '285,315p' packages/start-server-core/src/server-functions-handler.ts

echo -e "\n=== Full getResponse usage context ==="
rg -n "setResponseStatus" packages/start-server-core/src/server-functions-handler.ts -B 3 -A 3

Repository: TanStack/router


<shell_result>
Repository: TanStack/router
Exit code: 1

stdout:

=== Context around line 186 ===
      //   const pipeableStream = renderToPipeableStream(result)

      //   setHeaders(event, {
      //     'Content-Type': 'text/x-component',
      //   } as any)

      //   sendStream(event, response)
      //   event._handled = true

      //   return new Response(null, { status: 200 })
      // }

      if (isNotFound(result)) {
        return isNotFoundResponse(result)
      }

      const response = getResponse()
      let nonStreamingBody: any = undefined

      if (result !== undefined) {
        // first run without the stream in case `result` does not need streaming
        let done = false as boolean
        const callbacks: {
          onParse: (value: any) => void
          onDone: () => void
          onError: (error: any) => void
        } = {
          onParse: (value) => {
            nonStreamingBody = value
          },
          onDone: () => {

=== Context around line 302 ===
        return isNotFoundResponse(error)
      }

      console.info()
      console.info('Server Fn Error!')
      console.info()
      console.error(error)
      console.info()

      const serializedError = JSON.stringify(
        await Promise.resolve(
          toCrossJSONAsync(error, {
            refs: new Map(),
            plugins: serovalPlugins,
          }),
        ),
      )
      const response = getResponse()
      return new Response(serializedError, {
        status: response?.status ?? 500,
        statusText: response?.statusText,
        headers: {
          'Content-Type': 'application/json',
          [X_TSS_SERIALIZED]: 'true',
        },
      })
    }
  })()

  request.signal.removeEventListener('abort', abort)


=== Full getResponse usage context ===

</shell_result>


Script executed:

#!/bin/bash
# Check git history of this change if available
echo "=== Git log for request-response.ts around getResponse ==="
git log --oneline -n 20 packages/start-server-core/src/request-response.ts 2>/dev/null | head -10

echo -e "\n=== Git show for recent changes ==="
git log -p -n 1 --all -- packages/start-server-core/src/request-response.ts 2>/dev/null | head -200

echo -e "\n=== Search for TODO or FIXME comments ==="
rg -n "TODO|FIXME|XXX" packages/start-server-core/src/request-response.ts packages/start-server-core/src/server-functions-handler.ts

Repository: TanStack/router


<shell_result>
Repository: TanStack/router
Exit code: 0

stdout:

=== Git log for request-response.ts around getResponse ===
d239a207f Revert "chore: bump h3-v2 to 2.0.1-rc.5 (#5959)"

=== Git show for recent changes ===

=== Search for TODO or FIXME comments ===
packages/start-server-core/src/server-functions-handler.ts:163:      // TODO: RSCs Where are we getting this package?
packages/start-server-core/src/request-response.ts:78:  // TODO `as any` not needed when fetchdts is updated

</shell_result>


Script executed:

#!/bin/bash
# Get the revert commit details
echo "=== Revert commit details ==="
git show d239a207f --stat

echo -e "\n=== Check the current state vs before ==="
git diff d239a207f~1 d239a207f -- packages/start-server-core/package.json

echo -e "\n=== Look for PR or issue references ==="
git log --all --grep="h3" --oneline | head -10

Repository: TanStack/router


<shell_result>
Repository: TanStack/router
Exit code: 0

stdout:

=== Revert commit details ===
commit d239a207f5e5124321952a9f0a277643b92ff15c
Author: Birk Skyum <74932975+birkskyum@users.noreply.github.com>
Date:   Wed Nov 26 15:18:11 2025 +0100

    Revert "chore: bump h3-v2 to 2.0.1-rc.5 (#5959)"
    
    This reverts commit 97afc67cb5946cf4177cddaa41be7a7140a1b9a0.

 .gitattributes                                     |     2 +
 .github/FUNDING.yml                                |     1 +
 .github/ISSUE_TEMPLATE/bug_report.yml              |    98 +
 .github/ISSUE_TEMPLATE/config.yml                  |    11 +
 .github/renovate.json                              |    40 +
 .github/workflows/autofix.yml                      |    32 +
 .github/workflows/ci.yml                           |    52 +
 .github/workflows/labeler.yml                      |    16 +
 .github/workflows/pr.yml                           |    54 +
 .gitignore                                         |    81 +
 .npmrc                                             |     3 +
 .nvmrc                                             |     1 +
 .nx/workflows/dynamic-changesets.yaml              |     4 +
 .prettierignore                                    |    18 +
 AGENTS.md                                          |   171 +
 CONTRIBUTING.md                                    |    80 +
 DEBUGGING.md                                       |   334 +
 LICENSE                                            |    21 +
 README.md                                          |   196 +
 docs/router/api/file-based-routing.md              |   203 +
 .../assets/reading-writing-file-devjokes-1.png     |   Bin 0 -> 189723 bytes
 .../assets/reading-writing-file-devjokes-2.png     |   Bin 0 -> 221271 bytes
 docs/router/assets/reading-writing-file-setup.png  |   Bin 0 -> 249861 bytes
 ...h-serialization-deserialization-idempotency.jpg |   Bin 0 -> 28697 bytes
 docs/router/config.json                            |   702 +
 docs/router/eslint/create-route-property-order.md  |    57 +
 docs/router/eslint/eslint-plugin-router.md         |   134 +
 docs/router/framework/react/api/router.md          |    89 +
 .../react/api/router/ActiveLinkOptionsType.md      |    33 +
 .../react/api/router/AsyncRouteComponentType.md    |    12 +
 .../framework/react/api/router/FileRouteClass.md   |    63 +
 .../framework/react/api/router/LinkOptionsType.md  |    51 +
 .../framework/react/api/router/LinkPropsType.md    |    26 +
 .../react/api/router/MatchRouteOptionsType.md      |    44 +
 .../react/api/router/NavigateOptionsType.md        |    78 +
 .../react/api/router/NotFoundErrorType.md          |    50 +
 .../react/api/router/NotFoundRouteClass.md         |    53 +
 .../react/api/router/ParsedHistoryStateType.md     |    14 +
 .../react/api/router/ParsedLocationType.md         |    19 +
 .../framework/react/api/router/RedirectType.md     |    47 +
 .../framework/react/api/router/RegisterType.md     |    28 +
 .../framework/react/api/router/RootRouteClass.md   |    58 +
 .../framework/react/api/router/RouteApiClass.md    |    37 +
 .../framework/react/api/router/RouteApiType.md     |   151 +
 .../framework/react/api/router/RouteClass.md       |    45 +
 .../framework/react/api/router/RouteMaskType.md    |    28 +
 .../framework/react/api/router/RouteMatchType.md   |    29 +
 .../framework/react/api/router/RouteOptionsType.md |   368 +
 .../router/framework/react/api/router/RouteType.md |    31 +
 .../framework/react/api/router/RouterClass.md      |    40 +
 .../framework/react/api/router/RouterEventsType.md |    98 +
 .../react/api/router/RouterOptionsType.md          |   322 +
 .../framework/react/api/router/RouterStateType.md  |    57 +
 .../framework/react/api/router/RouterType.md       |   224 +
 .../react/api/router/ToMaskOptionsType.md          |    14 +
 .../framework/react/api/router/ToOptionsType.md    |    24 +
 .../react/api/router/UseMatchRouteOptionsType.md   |    13 +
 .../react/api/router/ViewTransitionOptionsType.md  |    41 +
 .../framework/react/api/router/awaitComponent.md   |    46 +
 .../react/api/router/catchBoundaryComponent.md     |    56 +
 .../react/api/router/catchNotFoundComponent.md     |    49 +
 .../react/api/router/clientOnlyComponent.md        |    50 +
 .../react/api/router/createFileRouteFunction.md    |    40 +
 .../api/router/createLazyFileRouteFunction.md      |    48 +
 .../react/api/router/createLazyRouteFunction.md    |    71 +
 .../react/api/router/createRootRouteFunction.md    |    50 +
 .../router/createRootRouteWithContextFunction.md   |    53 +
 .../react/api/router/createRouteFunction.md        |    37 +
 .../react/api/router/createRouteMaskFunction.md    |    35 +
 .../react/api/router/createRouterFunction.md       |    32 +
 .../api/router/defaultGlobalNotFoundComponent.md   |    12 +
 .../framework/react/api/router/deferFunction.md    |    49 +
 .../react/api/router/errorComponentComponent.md    |    32 +
 .../react/api/router/getRouteApiFunction.md        |    33 +
 .../react/api/router/historyStateInterface.md      |    20 +
 .../react/api/router/isNotFoundFunction.md         |    34 +
 .../react/api/router/isRedirectFunction.md         |    34 +
 .../react/api/router/lazyRouteComponentFunction.md |    50 +
 .../framework/react/api/router/linkComponent.md    |    37 +
 .../framework/react/api/router/linkOptions.md      |    38 +
 .../react/api/router/matchRouteComponent.md        |    42 +
 .../react/api/router/navigateComponent.md          |    18 +
 .../react/api/router/notFoundComponentComponent.md |    36 +
 .../framework/react/api/router/notFoundFunction.md |    40 +
 .../framework/react/api/router/outletComponent.md  |    15 +
 .../framework/react/api/router/redirectFunction.md |    53 +
 .../react/api/router/retainSearchParamsFunction.md |    48 +
 .../api/router/rootRouteWithContextFunction.md     |    54 +
 .../react/api/router/stripSearchParamsFunction.md  |    78 +
 .../framework/react/api/router/useAwaitedHook.md   |    35 +
 .../framework/react/api/router/useBlockerHook.md   |   213 +
 .../framework/react/api/router/useCanGoBack.md     |    40 +
 .../react/api/router/useChildMatchesHook.md        |    42 +
 .../framework/react/api/router/useLinkPropsHook.md |    21 +
 .../react/api/router/useLoaderDataHook.md          |    54 +
 .../react/api/router/useLoaderDepsHook.md          |    58 +
 .../framework/react/api/router/useLocationHook.md  |    40 +
 .../framework/react/api/router/useMatchHook.md     |    93 +
 .../react/api/router/useMatchRouteHook.md          |   116 +
 .../framework/react/api/router/useMatchesHook.md   |    43 +
 .../framework/react/api/router/useNavigateHook.md  |    93 +
 .../framework/react/api/router/useParamsHook.md    |    69 +
 .../react/api/router/useParentMatchesHook.md       |    42 +
 .../react/api/router/useRouteContextHook.md        |    47 +
 .../framework/react/api/router/useRouterHook.md    |    25 +
 .../react/api/router/useRouterStateHook.md         |    50 +
 .../framework/react/api/router/useSearchHook.md    |    73 +
 docs/router/framework/react/comparison.md          |    96 +
 docs/router/framework/react/decisions-on-dx.md     |   237 +
 docs/router/framework/react/devtools.md            |   191 +
 docs/router/framework/react/faq.md                 |    66 +
 .../framework/react/guide/authenticated-routes.md  |   184 +
 .../react/guide/automatic-code-splitting.md        |   232 +
 .../router/framework/react/guide/code-splitting.md |   305 +
 .../framework/react/guide/creating-a-router.md     |    76 +
 docs/router/framework/react/guide/custom-link.md   |   238 +
 .../guide/custom-search-param-serialization.md     |   228 +
 docs/router/framework/react/guide/data-loading.md  |   547 +
 .../router/framework/react/guide/data-mutations.md |   140 +
 .../framework/react/guide/deferred-data-loading.md |   162 +
 .../react/guide/document-head-management.md        |   158 +
 .../framework/react/guide/external-data-loading.md |   188 +
 docs/router/framework/react/guide/history-types.md |    55 +
 docs/router/framework/react/guide/link-options.md  |   117 +
 .../framework/react/guide/navigation-blocking.md   |   260 +
 docs/router/framework/react/guide/navigation.md    |   796 +
 .../framework/react/guide/not-found-errors.md      |   303 +
 docs/router/framework/react/guide/outlets.md       |    31 +
 .../framework/react/guide/parallel-routes.md       |     5 +
 docs/router/framework/react/guide/path-params.md   |   763 +
 docs/router/framework/react/guide/preloading.md    |   153 +
 .../framework/react/guide/render-optimizations.md  |    88 +
 docs/router/framework/react/guide/route-masking.md |   140 +
 .../router/framework/react/guide/router-context.md |   350 +
 .../framework/react/guide/scroll-restoration.md    |   203 +
 docs/router/framework/react/guide/search-params.md |   676 +
 docs/router/framework/react/guide/ssr.md           |   213 +
 .../framework/react/guide/static-route-data.md     |    81 +
 docs/router/framework/react/guide/type-safety.md   |   287 +
 .../router/framework/react/guide/type-utilities.md |   201 +
 docs/router/framework/react/how-to/README.md       |    82 +
 .../how-to/arrays-objects-dates-search-params.md   |   768 +
 .../framework/react/how-to/debug-router-issues.md  |   768 +
 .../framework/react/how-to/deploy-to-production.md |   448 +
 .../router/framework/react/how-to/drafts/README.md |    64 +
 .../drafts/build-search-filtering-systems.draft.md |   192 +
 .../optimize-search-param-performance.draft.md     |    90 +
 .../how-to/drafts/search-params-in-forms.draft.md  |   157 +
 docs/router/framework/react/how-to/install.md      |    47 +
 .../framework/react/how-to/integrate-chakra-ui.md  |   823 +
 .../react/how-to/integrate-framer-motion.md        |   778 +
 .../react/how-to/integrate-material-ui.md          |   717 +
 .../framework/react/how-to/integrate-shadcn-ui.md  |   518 +
 .../react/how-to/migrate-from-react-router.md      |   744 +
 .../react/how-to/navigate-with-search-params.md    |   345 +
 .../framework/react/how-to/setup-auth-providers.md |   634 +
 .../framework/react/how-to/setup-authentication.md |   485 +
 .../react/how-to/setup-basic-search-params.md      |   431 +
 docs/router/framework/react/how-to/setup-rbac.md   |   738 +
 docs/router/framework/react/how-to/setup-ssr.md    |   554 +
 .../router/framework/react/how-to/setup-testing.md |   975 +
 .../how-to/share-search-params-across-routes.md    |   245 +
 .../react/how-to/test-file-based-routing.md        |   952 +
 .../react/how-to/use-environment-variables.md      |   689 +
 .../react/how-to/validate-search-params.md         |   643 +
 docs/router/framework/react/installation/manual.md |   231 +
 .../installation/migrate-from-react-location.md    |   267 +
 .../installation/migrate-from-react-router.md      |    34 +
 .../framework/react/installation/with-esbuild.md   |    82 +
 .../react/installation/with-router-cli.md          |   103 +
 .../framework/react/installation/with-rspack.md    |    88 +
 .../framework/react/installation/with-vite.md      |    90 +
 .../framework/react/installation/with-webpack.md   |    81 +
 docs/router/framework/react/llm-support.md         |    32 +
 docs/router/framework/react/overview.md            |   141 +
 docs/router/framework/react/quick-start.md         |   140 +
 .../framework/react/routing/code-based-routing.md  |   433 +
 .../framework/react/routing/file-based-routing.md  |   125 +
 .../react/routing/file-naming-conventions.md       |    46 +
 .../framework/react/routing/route-matching.md      |    93 +
 docs/router/framework/react/routing/route-trees.md |    67 +
 .../framework/react/routing/routing-concepts.md    |   462 +
 .../framework/react/routing/virtual-file-routes.md |   360 +
 docs/router/framework/solid/decisions-on-dx.md     |     4 +
 docs/router/framework/solid/devtools.md            |    11 +
 docs/router/framework/solid/faq.md                 |     4 +
 .../framework/solid/guide/authenticated-routes.md  |     9 +
 .../solid/guide/automatic-code-splitting.md        |     4 +
 .../router/framework/solid/guide/code-splitting.md |     4 +
 .../framework/solid/guide/creating-a-router.md     |     4 +
 docs/router/framework/solid/guide/custom-link.md   |    46 +
 .../guide/custom-search-param-serialization.md     |     4 +
 docs/router/framework/solid/guide/data-loading.md  |     4 +
 .../router/framework/solid/guide/data-mutations.md |     4 +
 .../framework/solid/guide/deferred-data-loading.md |     9 +
 .../solid/guide/document-head-management.md        |     4 +
 .../framework/solid/guide/external-data-loading.md |     4 +
 docs/router/framework/solid/guide/history-types.md |     4 +
 docs/router/framework/solid/guide/link-options.md  |     4 +
 .../framework/solid/guide/navigation-blocking.md   |   157 +
 docs/router/framework/solid/guide/navigation.md    |     4 +
 .../framework/solid/guide/not-found-errors.md      |     4 +
 docs/router/framework/solid/guide/outlets.md       |     4 +
 docs/router/framework/solid/guide/path-params.md   |    15 +
 docs/router/framework/solid/guide/preloading.md    |     4 +
 docs/router/framework/solid/guide/route-masking.md |     4 +
 .../router/framework/solid/guide/router-context.md |     4 +
 .../framework/solid/guide/scroll-restoration.md    |    45 +
 docs/router/framework/solid/guide/search-params.md |     4 +
 docs/router/framework/solid/guide/ssr.md           |    19 +
 .../framework/solid/guide/static-route-data.md     |     4 +
 docs/router/framework/solid/guide/type-safety.md   |     4 +
 .../router/framework/solid/guide/type-utilities.md |    39 +
 docs/router/framework/solid/installation/manual.md |    11 +
 .../framework/solid/installation/with-esbuild.md   |    99 +
 .../solid/installation/with-router-cli.md          |    31 +
 .../framework/solid/installation/with-rspack.md    |    89 +
 .../framework/solid/installation/with-vite.md      |    49 +
 .../framework/solid/installation/with-webpack.md   |    92 +
 docs/router/framework/solid/llm-support.md         |     3 +
 docs/router/framework/solid/overview.md            |     4 +
 docs/router/framework/solid/quick-start.md         |    65 +
 .../framework/solid/routing/code-based-routing.md  |     4 +
 .../framework/solid/routing/file-based-routing.md  |    54 +
 .../solid/routing/file-naming-conventions.md       |     4 +
 .../framework/solid/routing/route-matching.md      |     4 +
 docs/router/framework/solid/routing/route-trees.md |     4 +
 .../framework/solid/routing/routing-concepts.md    |     4 +
 .../framework/solid/routing/virtual-file-routes.md |     5 +
 docs/router/integrations/query.md                  |   144 +
 docs/start/config.json                             |   385 +
 docs/start/framework/react/build-from-scratch.md   |   282 +
 docs/start/framework/react/getting-started.md      |    24 +
 .../react/guide/authentication-overview.md         |   239 +
 docs/start/framework/react/guide/authentication.md |   610 +
 .../framework/react/guide/client-entry-point.md    |    73 +
 .../react/guide/code-execution-patterns.md         |   146 +
 docs/start/framework/react/guide/databases.md      |   106 +
 .../framework/react/guide/environment-functions.md |   123 +
 .../framework/react/guide/environment-variables.md |   473 +
 .../framework/react/guide/error-boundaries.md      |    53 +
 .../start/framework/react/guide/execution-model.md |   332 +
 docs/start/framework/react/guide/hosting.md        |   400 +
 .../framework/react/guide/hydration-errors.md      |   136 +
 docs/start/framework/react/guide/middleware.md     |   550 +
 docs/start/framework/react/guide/observability.md  |   778 +
 docs/start/framework/react/guide/path-aliases.md   |    57 +
 docs/start/framework/react/guide/routing.md        |   235 +
 docs/start/framework/react/guide/selective-ssr.md  |   228 +
 .../framework/react/guide/server-entry-point.md    |   102 +
 .../framework/react/guide/server-functions.md      |   275 +
 docs/start/framework/react/guide/server-routes.md  |   443 +
 docs/start/framework/react/guide/spa-mode.md       |   188 +
 .../framework/react/guide/static-prerendering.md   |    88 +
 .../react/guide/static-server-functions.md         |    35 +
 .../guide/streaming-data-from-server-functions.md  |    97 +
 .../framework/react/guide/tailwind-integration.md  |   139 +
 docs/start/framework/react/migrate-from-next-js.md |   432 +
 docs/start/framework/react/overview.md             |    49 +
 docs/start/framework/react/quick-start.md          |    86 +
 .../react/tutorial/fetching-external-api.md        |   317 +
 .../react/tutorial/reading-writing-file.md         |   583 +
 docs/start/framework/solid/build-from-scratch.md   |   268 +
 docs/start/framework/solid/getting-started.md      |    17 +
 .../solid/guide/authentication-overview.md         |     9 +
 docs/start/framework/solid/guide/authentication.md |   602 +
 .../framework/solid/guide/client-entry-point.md    |    64 +
 .../solid/guide/code-execution-patterns.md         |   146 +
 docs/start/framework/solid/guide/databases.md      |     5 +
 .../framework/solid/guide/environment-functions.md |     4 +
 .../framework/solid/guide/environment-variables.md |   473 +
 .../framework/solid/guide/error-boundaries.md      |    52 +
 .../start/framework/solid/guide/execution-model.md |   331 +
 docs/start/framework/solid/guide/hosting.md        |   389 +
 .../framework/solid/guide/hydration-errors.md      |   129 +
 docs/start/framework/solid/guide/middleware.md     |     5 +
 docs/start/framework/solid/guide/observability.md  |   661 +
 docs/start/framework/solid/guide/path-aliases.md   |     5 +
 .../framework/solid/guide/reading-writing-file.md  |     5 +
 docs/start/framework/solid/guide/routing.md        |   231 +
 docs/start/framework/solid/guide/selective-ssr.md  |   222 +
 .../framework/solid/guide/server-entry-point.md    |     5 +
 .../framework/solid/guide/server-functions.md      |     9 +
 docs/start/framework/solid/guide/server-routes.md  |   443 +
 docs/start/framework/solid/guide/spa-mode.md       |     5 +
 .../framework/solid/guide/static-prerendering.md   |    88 +
 .../solid/guide/static-server-functions.md         |     5 +
 .../framework/solid/guide/tailwind-integration.md  |   144 +
 docs/start/framework/solid/overview.md             |     9 +
 docs/start/framework/solid/quick-start.md          |    63 +
 e2e/e2e-utils/eslint.config.js                     |     5 +
 e2e/e2e-utils/package.json                         |    40 +
 e2e/e2e-utils/src/derivePort.ts                    |    27 +
 e2e/e2e-utils/src/e2eSetupTeardown.ts              |    16 +
 e2e/e2e-utils/src/fixture.ts                       |    28 +
 e2e/e2e-utils/src/index.ts                         |     7 +
 e2e/e2e-utils/src/localDummyServer.ts              |   128 +
 e2e/e2e-utils/src/posts.ts                         |   619 +
 e2e/e2e-utils/src/resolve-runtime-suffix.ts        |    13 +
 e2e/e2e-utils/src/to-runtime-path.ts               |    17 +
 e2e/e2e-utils/src/users.ts                         |   258 +
 e2e/e2e-utils/tsconfig.json                        |     4 +
 e2e/e2e-utils/vite.config.ts                       |    39 +
 e2e/react-router/basepath-file-based/.gitignore    |    11 +
 e2e/react-router/basepath-file-based/index.html    |    11 +
 e2e/react-router/basepath-file-based/package.json  |    28 +
 .../basepath-file-based/playwright.config.ts       |    41 +
 e2e/react-router/basepath-file-based/src/main.tsx  |    27 +
 .../basepath-file-based/src/routeTree.gen.ts       |    77 +
 .../basepath-file-based/src/routes/__root.tsx      |     3 +
 .../basepath-file-based/src/routes/about.tsx       |    20 +
 .../basepath-file-based/src/routes/index.tsx       |    25 +
 .../tests/reload-document.test.ts                  |    18 +
 .../tests/setup/global.setup.ts                    |     6 +
 .../tests/setup/global.teardown.ts                 |     6 +
 e2e/react-router/basepath-file-based/tsconfig.json |    15 +
 .../basepath-file-based/vite.config.js             |     9 +
 .../basic-esbuild-file-based/.gitignore            |    11 +
 .../basic-esbuild-file-based/index.html            |    24 +
 .../basic-esbuild-file-based/package.json          |    29 +
 .../basic-esbuild-file-based/playwright.config.ts  |    41 +
 .../basic-esbuild-file-based/src/esbuild.config.js |    10 +
 .../basic-esbuild-file-based/src/main.tsx          |    26 +
 .../basic-esbuild-file-based/src/posts.tsx         |    36 +
 .../basic-esbuild-file-based/src/routeTree.gen.ts  |   424 +
 .../src/routes/(group)/_layout.inside.tsx          |    23 +
 .../src/routes/(group)/_layout.tsx                 |    10 +
 .../src/routes/(group)/lazyinside.lazy.tsx         |    24 +
 .../src/routes/(group)/lazyinside.tsx              |     7 +
 .../basic-esbuild-file-based/src/routes/__root.tsx |    82 +
 .../src/routes/_layout.tsx                         |    16 +
 .../src/routes/_layout/_layout-2.tsx               |    34 +
 .../src/routes/_layout/_layout-2/layout-a.tsx      |     9 +
 .../src/routes/_layout/_layout-2/layout-b.tsx      |     9 +
 .../basic-esbuild-file-based/src/routes/index.tsx  |    14 +
 .../src/routes/posts.$postId.tsx                   |    28 +
 .../src/routes/posts.index.tsx                     |    10 +
 .../basic-esbuild-file-based/src/routes/posts.tsx  |    39 +
 .../basic-esbuild-file-based/tests/app.spec.ts     |    48 +
 .../tests/setup/global.setup.ts                    |     6 +
 .../tests/setup/global.teardown.ts                 |     6 +
 .../basic-esbuild-file-based/tsconfig.json         |    14 +
 .../basic-file-based-code-splitting/.gitignore     |    11 +
 .../basic-file-based-code-splitting/index.html     |    12 +
 .../basic-file-based-code-splitting/package.json   |    34 +
 .../playwright.config.ts                           |    41 +
 .../postcss.config.mjs                             |     5 +
 .../basic-file-based-code-splitting/src/main.tsx   |    27 +
 .../basic-file-based-code-splitting/src/posts.tsx  |    36 +
 .../src/routeTree.gen.ts                           |   360 +
 .../src/routes/__root.tsx                          |    80 +
 .../src/routes/_layout.tsx                         |    16 +
 .../src/routes/_layout/_layout-2.tsx               |    34 +
 .../src/routes/_layout/_layout-2/layout-a.tsx      |     7 +
 .../src/routes/_layout/_layout-2/layout-b.tsx      |     7 +
 .../src/routes/index.tsx                           |    13 +
 .../src/routes/posts.$postId.tsx                   |    32 +
 .../src/routes/posts.index.tsx                     |     9 +
 .../src/routes/posts.tsx                           |    39 +
 .../src/routes/viewport-test.tsx                   |     3 +
 .../src/routes/without-loader.tsx                  |     3 +
 .../basic-file-based-code-splitting/src/styles.css |    21 +
 .../tests/app.spec.ts                              |    33 +
 .../tests/preload.spec.ts                          |    42 +
 .../tests/setup/global.setup.ts                    |     6 +
 .../tests/setup/global.teardown.ts                 |     6 +
 .../basic-file-based-code-splitting/tsconfig.json  |    15 +
 .../basic-file-based-code-splitting/vite.config.ts |    41 +
 e2e/react-router/basic-file-based/.gitignore       |    11 +
 e2e/react-router/basic-file-based/index.html       |    11 +
 e2e/react-router/basic-file-based/package.json     |    41 +
 .../basic-file-based/playwright.config.ts          |    58 +
 .../basic-file-based/postcss.config.mjs            |     5 +
 .../src/components/RenderCounter.tsx               |     7 +
 e2e/react-router/basic-file-based/src/main.tsx     |    27 +
 e2e/react-router/basic-file-based/src/posts.tsx    |    36 +
 .../basic-file-based/src/routeTree.gen.ts          |  2466 ++
 .../src/routes/(another-group)/onlyrouteinside.tsx |    26 +
 .../src/routes/(group)/_layout.insidelayout.tsx    |    24 +
 .../src/routes/(group)/_layout.tsx                 |    11 +
 .../basic-file-based/src/routes/(group)/inside.tsx |    24 +
 .../src/routes/(group)/lazyinside.lazy.tsx         |    21 +
 .../src/routes/(group)/lazyinside.tsx              |     7 +
 .../src/routes/(group)/subfolder/inside.tsx        |    24 +
 .../basic-file-based/src/routes/__root.tsx         |   157 +
 .../basic-file-based/src/routes/_layout.tsx        |    17 +
 .../src/routes/_layout/_layout-2.tsx               |    35 +
 .../src/routes/_layout/_layout-2/layout-a.tsx      |     8 +
 .../src/routes/_layout/_layout-2/layout-b.tsx      |     8 +
 .../basic-file-based/src/routes/anchor.tsx         |   220 +
 .../src/routes/component-types-test.tsx            |    12 +
 .../basic-file-based/src/routes/editing-a.tsx      |    46 +
 .../basic-file-based/src/routes/editing-b.tsx      |    40 +
 .../src/routes/hover-preload-hash.tsx              |   265 +
 .../basic-file-based/src/routes/index.tsx          |    14 +
 .../src/routes/non-nested/deep/$baz.index.tsx      |    19 +
 .../src/routes/non-nested/deep/$baz.route.tsx      |    16 +
 .../non-nested/deep/$baz_.bar.$foo.index.tsx       |    19 +
 .../non-nested/deep/$baz_.bar.$foo.route.tsx       |    16 +
 .../routes/non-nested/deep/$baz_.bar.$foo_.qux.tsx |    19 +
 .../src/routes/non-nested/deep/$baz_.bar.index.tsx |    19 +
 .../src/routes/non-nested/deep/$baz_.bar.route.tsx |    16 +
 .../src/routes/non-nested/deep/$baz_.bar_.qux.tsx  |    19 +
 .../src/routes/non-nested/deep/route.tsx           |    58 +
 .../src/routes/non-nested/named/$baz.foo.tsx       |    20 +
 .../src/routes/non-nested/named/$baz.index.tsx     |    19 +
 .../src/routes/non-nested/named/$baz.route.tsx     |    16 +
 .../src/routes/non-nested/named/$baz_.bar.tsx      |    19 +
 .../src/routes/non-nested/named/route.tsx          |    58 +
 .../src/routes/non-nested/path/baz.foo.tsx         |    20 +
 .../src/routes/non-nested/path/baz.index.tsx       |    19 +
 .../src/routes/non-nested/path/baz.route.tsx       |    16 +
 .../src/routes/non-nested/path/baz_.bar.tsx        |    19 +
 .../src/routes/non-nested/path/route.tsx           |    33 +
 .../routes/non-nested/prefix/prefix{$baz}.foo.tsx  |    20 +
 .../non-nested/prefix/prefix{$baz}.index.tsx       |    19 +
 .../non-nested/prefix/prefix{$baz}.route.tsx       |    16 +
 .../routes/non-nested/prefix/prefix{$baz}_.bar.tsx |    19 +
 .../src/routes/non-nested/prefix/route.tsx         |    58 +
 .../src/routes/non-nested/route.tsx                |    32 +
 .../src/routes/non-nested/suffix/route.tsx         |    58 +
 .../routes/non-nested/suffix/{$baz}suffix.foo.tsx  |    20 +
 .../non-nested/suffix/{$baz}suffix.index.tsx       |    19 +
 .../non-nested/suffix/{$baz}suffix.route.tsx       |    16 +
 .../routes/non-nested/suffix/{$baz}suffix_.bar.tsx |    19 +
 .../basic-file-based/src/routes/notRemountDeps.tsx |    44 +
 .../src/routes/params-ps/index.tsx                 |   127 +
 .../src/routes/params-ps/named/$foo/$bar.$baz.tsx  |    17 +
 .../src/routes/params-ps/named/$foo/$bar.route.tsx |    45 +
 .../src/routes/params-ps/named/$foo/route.tsx      |    50 +
 .../src/routes/params-ps/named/index.tsx           |     7 +
 .../src/routes/params-ps/named/prefix{$foo}.tsx    |    14 +
 .../src/routes/params-ps/named/{$foo}suffix.tsx    |    14 +
 .../src/routes/params-ps/non-nested/$foo_/$bar.tsx |    23 +
 .../routes/params-ps/non-nested/$foo_/route.tsx    |     3 +
 .../src/routes/params-ps/non-nested/route.tsx      |    34 +
 .../src/routes/params-ps/wildcard/$.tsx            |    14 +
 .../src/routes/params-ps/wildcard/index.tsx        |     8 +
 .../params-ps/wildcard/prefix@\353\214\200{$}.tsx" |    15 +
 .../src/routes/params-ps/wildcard/prefix{$}.tsx    |    14 +
 .../src/routes/params-ps/wildcard/{$}suffix.tsx    |    14 +
 .../params-ps/wildcard/{$}suffix@\353\214\200.tsx" |    15 +
 .../src/routes/params.single.$value.tsx            |    43 +
 .../basic-file-based/src/routes/posts.$postId.tsx  |    31 +
 .../basic-file-based/src/routes/posts.index.tsx    |    10 +
 .../basic-file-based/src/routes/posts.tsx          |    47 +
 .../src/routes/posts_.$postId.edit.tsx             |    29 +
 .../src/routes/redirect/$target.tsx                |    22 +
 .../src/routes/redirect/$target/index.tsx          |    66 +
 .../src/routes/redirect/$target/via-beforeLoad.tsx |    17 +
 .../src/routes/redirect/$target/via-loader.tsx     |    19 +
 .../basic-file-based/src/routes/redirect/index.tsx |    29 +
 .../src/routes/redirect/preload/first.tsx          |    24 +
 .../src/routes/redirect/preload/second.tsx         |    15 +
 .../src/routes/redirect/preload/third.tsx          |     8 +
 .../basic-file-based/src/routes/relative/index.tsx |    22 +
 .../src/routes/relative/link/nested/deep/index.tsx |    13 +
 .../src/routes/relative/link/nested/index.tsx      |    13 +
 .../src/routes/relative/link/path/$path/index.tsx  |    31 +
 .../src/routes/relative/link/path/index.tsx        |    18 +
 .../src/routes/relative/link/relative-link-a.tsx   |    13 +
 .../src/routes/relative/link/relative-link-b.tsx   |    13 +
 .../src/routes/relative/link/route.tsx             |   103 +
 .../src/routes/relative/link/with-search/index.tsx |    28 +
 .../relative/useNavigate/nested/deep/index.tsx     |    13 +
 .../routes/relative/useNavigate/nested/index.tsx   |    13 +
 .../relative/useNavigate/path/$path/index.tsx      |    40 +
 .../src/routes/relative/useNavigate/path/index.tsx |    18 +
 .../useNavigate/relative-useNavigate-a.tsx         |    15 +
 .../useNavigate/relative-useNavigate-b.tsx         |    15 +
 .../src/routes/relative/useNavigate/route.tsx      |   134 +
 .../relative/useNavigate/with-search/index.tsx     |    34 +
 .../basic-file-based/src/routes/remountDeps.tsx    |    44 +
 .../src/routes/search-params/default.tsx           |    28 +
 .../src/routes/search-params/index.tsx             |    43 +
 .../src/routes/search-params/route.tsx             |     8 +
 .../src/routes/structural-sharing.$enabled.tsx     |    80 +
 .../route.tsx"                                     |    63 +
 .../wildcard.$.tsx"                                |    19 +
 .../\360\237\232\200.$id.tsx"                      |    19 +
 e2e/react-router/basic-file-based/src/styles.css   |    21 +
 .../basic-file-based/tests/app.spec.ts             |   328 +
 .../tests/hover-preload-hash.spec.ts               |    24 +
 .../tests/non-nested-paths.spec.ts                 |   350 +
 .../basic-file-based/tests/params.spec.ts          |   494 +
 .../basic-file-based/tests/redirect.spec.ts        |   136 +
 .../basic-file-based/tests/relative.spec.ts        |   273 +
 .../tests/scroll-into-view.spec.ts                 |   213 +
 .../basic-file-based/tests/search-params.spec.ts   |   143 +
 .../basic-file-based/tests/setup/global.setup.ts   |     6 +
 .../tests/setup/global.teardown.ts                 |     6 +
 .../tests/utils/useExperimentalNonNestedRoutes.ts  |     6 +
 e2e/react-router/basic-file-based/tsconfig.json    |    15 +
 e2e/react-router/basic-file-based/vite.config.js   |    16 +
 .../basic-react-query-file-based/.gitignore        |    11 +
 .../basic-react-query-file-based/index.html        |    12 +
 .../basic-react-query-file-based/package.json      |    35 +
 .../playwright.config.ts                           |    40 +
 .../postcss.config.mjs                             |     5 +
 .../basic-react-query-file-based/src/main.tsx      |    39 +
 .../src/postQueryOptions.tsx                       |     8 +
 .../basic-react-query-file-based/src/posts.tsx     |    37 +
 .../src/postsQueryOptions.tsx                      |     7 +
 .../src/routeTree.gen.ts                           |   246 +
 .../src/routes/__root.tsx                          |    70 +
 .../src/routes/_layout.tsx                         |    17 +
 .../src/routes/_layout/_layout-2.tsx               |    35 +
 .../src/routes/_layout/_layout-2/layout-a.tsx      |     8 +
 .../src/routes/_layout/_layout-2/layout-b.tsx      |     8 +
 .../src/routes/index.tsx                           |    14 +
 .../src/routes/posts.$postId.tsx                   |    55 +
 .../src/routes/posts.index.tsx                     |    10 +
 .../src/routes/posts.tsx                           |    43 +
 .../basic-react-query-file-based/src/styles.css    |    21 +
 .../basic-react-query-file-based/tests/app.spec.ts |    51 +
 .../tests/setup/global.setup.ts                    |     6 +
 .../tests/setup/global.teardown.ts                 |     6 +
 .../basic-react-query-file-based/tsconfig.json     |    15 +
 .../basic-react-query-file-based/vite.config.js    |    11 +
 e2e/react-router/basic-react-query/.gitignore      |    11 +
 e2e/react-router/basic-react-query/index.html      |    12 +
 e2e/react-router/basic-react-query/package.json    |    33 +
 .../basic-react-query/playwright.config.ts         |    41 +
 .../basic-react-query/postcss.config.mjs           |     5 +
 e2e/react-router/basic-react-query/src/main.tsx    |   276 +
 .../basic-react-query/src/posts.lazy.tsx           |    40 +
 e2e/react-router/basic-react-query/src/posts.ts    |    48 +
 e2e/react-router/basic-react-query/src/styles.css  |    21 +
 .../basic-react-query/tests/app.spec.ts            |    33 +
 .../basic-react-query/tests/setup/global.setup.ts  |     6 +
 .../tests/setup/global.teardown.ts                 |     6 +
 e2e/react-router/basic-react-query/tsconfig.json   |    15 +
 e2e/react-router/basic-react-query/vite.config.js  |     7 +
 .../basic-scroll-restoration/.gitignore            |    11 +
 .../basic-scroll-restoration/index.html            |    12 +
 .../basic-scroll-restoration/package.json          |    32 +
 .../basic-scroll-restoration/playwright.config.ts  |    34 +
 .../basic-scroll-restoration/postcss.config.mjs    |     5 +
 .../basic-scroll-restoration/src/main.tsx          |   297 +
 .../basic-scroll-restoration/src/styles.css        |    21 +
 .../basic-scroll-restoration/tests/app.spec.ts     |   117 +
 .../tests/router-events.spec.ts                    |    44 +
 .../basic-scroll-restoration/tsconfig.json         |    14 +
 .../basic-scroll-restoration/vite.config.js        |     7 +
 .../basic-virtual-file-based/.gitignore            |    11 +
 .../basic-virtual-file-based/index.html            |    12 +
 .../basic-virtual-file-based/package.json          |    34 +
 .../basic-virtual-file-based/playwright.config.ts  |    41 +
 .../basic-virtual-file-based/postcss.config.mjs    |     5 +
 .../basic-virtual-file-based/routes.ts             |    22 +
 .../basic-virtual-file-based/src/main.tsx          |    27 +
 .../basic-virtual-file-based/src/posts.tsx         |    38 +
 .../basic-virtual-file-based/src/routeTree.gen.ts  |   428 +
 .../basic-virtual-file-based/src/routes/a.tsx      |     7 +
 .../basic-virtual-file-based/src/routes/b.tsx      |     7 +
 .../src/routes/file-based-subtree/hello/index.tsx  |     3 +
 .../src/routes/file-based-subtree/hello/route.tsx  |    27 +
 .../routes/file-based-subtree/hello/universe.tsx   |     3 +
 .../src/routes/file-based-subtree/hello/world.tsx  |     3 +
 .../basic-virtual-file-based/src/routes/home.tsx   |    13 +
 .../src/routes/layout/first-layout.tsx             |    16 +
 .../src/routes/layout/second-layout.tsx            |    34 +
 .../src/routes/posts/posts-detail.tsx              |    28 +
 .../src/routes/posts/posts-home.tsx                |     9 +
 .../src/routes/posts/posts.tsx                     |    39 +
 .../basic-virtual-file-based/src/routes/root.tsx   |    70 +
 .../basic-virtual-file-based/src/styles.css        |    21 +
 .../basic-virtual-file-based/tests/app.spec.ts     |    33 +
 .../tests/setup/global.setup.ts                    |     6 +
 .../tests/setup/global.teardown.ts                 |     6 +
 .../basic-virtual-file-based/tsconfig.json         |    15 +
 .../basic-virtual-file-based/vite.config.ts        |    17 +
 .../.gitignore                                     |    13 +
 .../index.html                                     |    12 +
 .../package.json                                   |    34 +
 .../playwright.config.ts                           |    41 +
 .../postcss.config.mjs                             |     5 +
 .../routes.ts                                      |    22 +
 .../src/main.tsx                                   |    27 +
 .../src/posts.tsx                                  |    36 +
 .../src/routes/a.tsx                               |     7 +
 .../src/routes/b.tsx                               |     7 +
 .../src/routes/file-based-subtree/hello/index.tsx  |     3 +
 .../src/routes/file-based-subtree/hello/route.tsx  |    27 +
 .../routes/file-based-subtree/hello/universe.tsx   |     3 +
 .../src/routes/file-based-subtree/hello/world.tsx  |     3 +
 .../src/routes/home.tsx                            |    13 +
 .../src/routes/layout/first-layout.tsx             |    16 +
 .../src/routes/layout/second-layout.tsx            |    34 +
 .../src/routes/posts/posts-detail.tsx              |    28 +
 .../src/routes/posts/posts-home.tsx                |     9 +
 .../src/routes/posts/posts.tsx                     |    39 +
 .../src/routes/root.tsx                            |    70 +
 .../src/styles.css                                 |    23 +
 .../tests/app.spec.ts                              |    36 +
 .../tests/setup/global.setup.ts                    |     6 +
 .../tests/setup/global.teardown.ts                 |     6 +
 .../tsconfig.json                                  |    15 +
 .../vite.config.ts                                 |    16 +
 e2e/react-router/basic/.gitignore                  |    11 +
 e2e/react-router/basic/index.html                  |    12 +
 e2e/react-router/basic/package.json                |    31 +
 e2e/react-router/basic/playwright.config.ts        |    41 +
 e2e/react-router/basic/postcss.config.mjs          |     5 +
 e2e/react-router/basic/src/main.tsx                |   456 +
 e2e/react-router/basic/src/posts.lazy.tsx          |    36 +
 e2e/react-router/basic/src/posts.ts                |    36 +
 e2e/react-router/basic/src/styles.css              |    21 +
 e2e/react-router/basic/tests/app.spec.ts           |    64 +
 e2e/react-router/basic/tests/params.spec.ts        |   149 +
 e2e/react-router/basic/tests/setup/global.setup.ts |     6 +
 .../basic/tests/setup/global.teardown.ts           |     6 +
 e2e/react-router/basic/tsconfig.json               |    15 +
 e2e/react-router/basic/vite.config.js              |     7 +
 e2e/react-router/generator-cli-only/.gitignore     |    11 +
 e2e/react-router/generator-cli-only/index.html     |    12 +
 e2e/react-router/generator-cli-only/package.json   |    32 +
 .../generator-cli-only/playwright.config.ts        |    41 +
 .../generator-cli-only/postcss.config.mjs          |     5 +
 e2e/react-router/generator-cli-only/src/main.tsx   |    31 +
 e2e/react-router/generator-cli-only/src/posts.ts   |    36 +
 .../generator-cli-only/src/routeTree.gen.ts        |   230 +
 .../generator-cli-only/src/routes/__root.tsx       |    62 +
 .../src/routes/_pathlessLayout.tsx                 |    17 +
 .../src/routes/_pathlessLayout/_nested-layout.tsx  |    35 +
 .../_pathlessLayout/_nested-layout/route-a.tsx     |    10 +
 .../_pathlessLayout/_nested-layout/route-b.tsx     |    10 +
 .../generator-cli-only/src/routes/index.tsx        |    14 +
 .../src/routes/posts.$postId.tsx                   |    29 +
 .../generator-cli-only/src/routes/posts.index.tsx  |    10 +
 .../generator-cli-only/src/routes/posts.route.tsx  |    40 +
 e2e/react-router/generator-cli-only/src/styles.css |    21 +
 .../generator-cli-only/tests/app.spec.ts           |    35 +
 .../generator-cli-only/tests/setup/global.setup.ts |     6 +
 .../tests/setup/global.teardown.ts                 |     6 +
 e2e/react-router/generator-cli-only/tsconfig.json  |    15 +
 .../generator-cli-only/tsr.config.json             |     4 +
 e2e/react-router/generator-cli-only/vite.config.js |     7 +
 e2e/react-router/js-only-file-based/.gitignore     |    11 +
 e2e/react-router/js-only-file-based/index.html     |    12 +
 e2e/react-router/js-only-file-based/package.json   |    32 +
 .../js-only-file-based/playwright.config.ts        |    42 +
 .../js-only-file-based/postcss.config.mjs          |     5 +
 e2e/react-router/js-only-file-based/src/main.jsx   |    24 +
 e2e/react-router/js-only-file-based/src/posts.js   |    27 +
 .../js-only-file-based/src/routeTree.gen.js        |    95 +
 .../js-only-file-based/src/routes/__root.jsx       |    62 +
 .../src/routes/_pathlessLayout.jsx                 |    17 +
 .../src/routes/_pathlessLayout/_nested-layout.jsx  |    35 +
 .../_pathlessLayout/_nested-layout/route-a.jsx     |    10 +
 .../_pathlessLayout/_nested-layout/route-b.jsx     |    10 +
 .../js-only-file-based/src/routes/index.jsx        |    14 +
 .../src/routes/posts.$postId.jsx                   |    28 +
 .../js-only-file-based/src/routes/posts.index.jsx  |    10 +
 .../js-only-file-based/src/routes/posts.route.jsx  |    40 +
 e2e/react-router/js-only-file-based/src/styles.css |    21 +
 .../js-only-file-based/tests/app.spec.ts           |    35 +
 .../js-only-file-based/tests/setup/global.setup.ts |     6 +
 .../tests/setup/global.teardown.ts                 |     6 +
 e2e/react-router/js-only-file-based/tsconfig.json  |    14 +
 e2e/react-router/js-only-file-based/vite.config.js |    14 +
 .../rspack-basic-file-based/.gitignore             |    21 +
 e2e/react-router/rspack-basic-file-based/README.md |     6 +
 .../rspack-basic-file-based/package.json           |    32 +
 .../rspack-basic-file-based/playwright.config.ts   |    41 +
 .../rspack-basic-file-based/postcss.config.mjs     |     5 +
 .../rspack-basic-file-based/rsbuild.config.ts      |    17 +
 .../rspack-basic-file-based/src/app.tsx            |    24 +
 .../rspack-basic-file-based/src/env.d.ts           |     1 +
 .../rspack-basic-file-based/src/index.tsx          |    14 +
 .../rspack-basic-file-based/src/posts.tsx          |    36 +
 .../rspack-basic-file-based/src/routes/__root.tsx  |    62 +
 .../rspack-basic-file-based/src/routes/_layout.tsx |    17 +
 .../src/routes/_layout/_layout-2.tsx               |    35 +
 .../src/routes/_layout/_layout-2/layout-a.tsx      |     8 +
 .../src/routes/_layout/_layout-2/layout-b.tsx      |     8 +
 .../rspack-basic-file-based/src/routes/index.tsx   |    14 +
 .../src/routes/posts.$postId.tsx                   |    29 +
 .../src/routes/posts.index.tsx                     |    10 +
 .../rspack-basic-file-based/src/routes/posts.tsx   |    40 +
 .../rspack-basic-file-based/src/styles.css         |    23 +
 .../rspack-basic-file-based/tests/app.spec.ts      |    33 +
 .../tests/setup/global.setup.ts                    |     6 +
 .../tests/setup/global.teardown.ts                 |     6 +
 .../rspack-basic-file-based/tsconfig.json          |    17 +
 .../.gitignore                                     |    21 +
 .../README.md                                      |     6 +
 .../package.json                                   |    33 +
 .../playwright.config.ts                           |    41 +
 .../postcss.config.mjs                             |     5 +
 .../routes.ts                                      |    22 +
 .../rsbuild.config.ts                              |    18 +
 .../src/app.tsx                                    |    24 +
 .../src/env.d.ts                                   |     1 +
 .../src/index.tsx                                  |    14 +
 .../src/posts.tsx                                  |    38 +
 .../src/routes/a.tsx                               |     8 +
 .../src/routes/b.tsx                               |     8 +
 .../src/routes/file-based-subtree/hello/index.tsx  |     4 +
 .../src/routes/file-based-subtree/hello/route.tsx  |    28 +
 .../routes/file-based-subtree/hello/universe.tsx   |     4 +
 .../src/routes/file-based-subtree/hello/world.tsx  |     4 +
 .../src/routes/home.tsx                            |    14 +
 .../src/routes/layout/first-layout.tsx             |    17 +
 .../src/routes/layout/second-layout.tsx            |    35 +
 .../src/routes/posts/posts-detail.tsx              |    29 +
 .../src/routes/posts/posts-home.tsx                |    10 +
 .../src/routes/posts/posts.tsx                     |    40 +
 .../src/routes/root.tsx                            |    70 +
 .../src/styles.css                                 |    23 +
 .../tests/app.spec.ts                              |    36 +
 .../tests/setup/global.setup.ts                    |     6 +
 .../tests/setup/global.teardown.ts                 |     6 +
 .../tsconfig.json                                  |    17 +
 .../tsr.config.json                                |     5 +
 .../scroll-restoration-sandbox-vite/.gitignore     |     7 +
 .../scroll-restoration-sandbox-vite/README.md      |    16 +
 .../scroll-restoration-sandbox-vite/index.html     |    12 +
 .../scroll-restoration-sandbox-vite/package.json   |    37 +
 .../playwright.browser.config.ts                   |    47 +
 .../playwright.hash.config.ts                      |    45 +
 .../postcss.config.mjs                             |     5 +
 .../scroll-restoration-sandbox-vite/src/main.tsx   |    37 +
 .../scroll-restoration-sandbox-vite/src/posts.tsx  |    41 +
 .../src/routeTree.gen.ts                           |   181 +
 .../src/routes/(tests)/lazy-page.lazy.tsx          |    18 +
 .../src/routes/(tests)/lazy-page.tsx               |     2 +
 .../routes/(tests)/lazy-with-loader-page.lazy.tsx  |    16 +
 .../src/routes/(tests)/lazy-with-loader-page.tsx   |     9 +
 .../src/routes/(tests)/normal-page.tsx             |    18 +
 .../src/routes/(tests)/page-with-search.tsx        |    19 +
 .../src/routes/(tests)/virtual-page.lazy.tsx       |    18 +
 .../src/routes/-components/scroll-block.tsx        |    16 +
 .../src/routes/__root.tsx                          |    62 +
 .../src/routes/index.tsx                           |    38 +
 .../scroll-restoration-sandbox-vite/src/styles.css |    21 +
 .../tests/app.spec.ts                              |    66 +
 .../tests/setup/global.setup.ts                    |     6 +
 .../tests/setup/global.teardown.ts                 |     6 +
 .../scroll-restoration-sandbox-vite/tsconfig.json  |    15 +
 .../scroll-restoration-sandbox-vite/vite.config.js |     8 +
 e2e/react-router/sentry-integration/.gitignore     |    11 +
 e2e/react-router/sentry-integration/index.html     |    12 +
 e2e/react-router/sentry-integration/package.json   |    34 +
 .../sentry-integration/playwright.config.ts        |    34 +
 .../sentry-integration/postcss.config.mjs          |     5 +
 e2e/react-router/sentry-integration/src/main.tsx   |    92 +
 e2e/react-router/sentry-integration/src/styles.css |    21 +
 .../sentry-integration/tests/app.spec.ts           |    10 +
 e2e/react-router/sentry-integration/tsconfig.json  |    14 +
 e2e/react-router/sentry-integration/vite.config.js |     8 +
 e2e/react-router/view-transitions/.gitignore       |    10 +
 .../view-transitions/.vscode/settings.json         |    11 +
 e2e/react-router/view-transitions/README.md        |     6 +
 e2e/react-router/view-transitions/index.html       |    12 +
 e2e/react-router/view-transitions/package.json     |    34 +
 .../view-transitions/playwright.config.ts          |    41 +
 .../view-transitions/postcss.config.mjs            |     5 +
 e2e/react-router/view-transitions/src/main.tsx     |    55 +
 e2e/react-router/view-transitions/src/posts.tsx    |    32 +
 .../view-transitions/src/routeTree.gen.ts          |   171 +
 .../view-transitions/src/routes/__root.tsx         |    47 +
 .../view-transitions/src/routes/explore.tsx        |    31 +
 .../view-transitions/src/routes/how-it-works.tsx   |    32 +
 .../view-transitions/src/routes/index.tsx          |    25 +
 .../view-transitions/src/routes/posts.$postId.tsx  |    29 +
 .../view-transitions/src/routes/posts.index.tsx    |    10 +
 .../view-transitions/src/routes/posts.route.tsx    |    44 +
 e2e/react-router/view-transitions/src/styles.css   |   114 +
 .../view-transitions/tests/app.spec.ts             |    10 +
 .../view-transitions/tests/setup/global.setup.ts   |     6 +
 .../tests/setup/global.teardown.ts                 |     6 +
 e2e/react-router/view-transitions/tsconfig.json    |    14 +
 e2e/react-router/view-transitions/vite.config.js   |    14 +
 e2e/react-start/basic-auth/.env                    |     7 +
 e2e/react-start/basic-auth/.gitignore              |    20 +
 e2e/react-start/basic-auth/.prettierignore         |     4 +
 e2e/react-start/basic-auth/dev.db                  |   Bin 0 -> 24576 bytes
 e2e/react-start/basic-auth/package.json            |    43 +
 e2e/react-start/basic-auth/playwright.config.ts    |    34 +
 e2e/react-start/basic-auth/postcss.config.mjs      |     5 +
 e2e/react-start/basic-auth/prisma.config.ts        |    12 +
 .../migrations/20240811183753_init/migration.sql   |     8 +
 .../prisma/migrations/migration_lock.toml          |     3 +
 e2e/react-start/basic-auth/prisma/schema.prisma    |    16 +
 .../basic-auth/public/android-chrome-192x192.png   |   Bin 0 -> 29964 bytes
 .../basic-auth/public/android-chrome-512x512.png   |   Bin 0 -> 109271 bytes
 .../basic-auth/public/apple-touch-icon.png         |   Bin 0 -> 27246 bytes
 .../basic-auth/public/favicon-16x16.png            |   Bin 0 -> 832 bytes
 .../basic-auth/public/favicon-32x32.png            |   Bin 0 -> 2115 bytes
 e2e/react-start/basic-auth/public/favicon.ico      |   Bin 0 -> 15406 bytes
 e2e/react-start/basic-auth/public/favicon.png      |   Bin 0 -> 1507 bytes
 e2e/react-start/basic-auth/public/site.webmanifest |    19 +
 e2e/react-start/basic-auth/src/components/Auth.tsx |    57 +
 .../src/components/DefaultCatchBoundary.tsx        |    53 +
 .../basic-auth/src/components/Login.tsx            |    71 +
 .../basic-auth/src/components/NotFound.tsx         |    25 +
 .../basic-auth/src/hooks/useMutation.ts            |    44 +
 .../basic-auth/src/prisma-generate

... [stdout truncated: output exceeded 50000 characters (396781 total). Please modify your command to reduce output size, for example by:
- Using grep/rg to filter results
- Using head/tail to limit lines
- Using --max-count flag with grep/rg
- Processing output with awk/sed to extract only needed information]

stderr:

fatal: bad revision 'd239a207f~1'

</shell_result>


Script executed:

#!/bin/bash
# Check the actual commit for h3 version change
echo "=== Current h3 version in start-server-core ==="
rg -n '"h3-v2"' packages/start-server-core/package.json

echo -e "\n=== Check if there are other files that might document h3 internals ==="
rg -n "event\.res|event\._res" packages/start-server-core/src/ --type ts

echo -e "\n=== Look at the broader context of server-functions-handler error handling ==="
sed -n '295,320p' packages/start-server-core/src/server-functions-handler.ts

Repository: TanStack/router


<shell_result>
Repository: TanStack/router
Exit code: 0

stdout:

=== Current h3 version in start-server-core ===
82:    "h3-v2": "npm:h3@2.0.0-beta.4",

=== Check if there are other files that might document h3 internals ===
packages/start-server-core/src/request-response.ts:140:    event.res.headers.set(name, value)
packages/start-server-core/src/request-response.ts:146:  return event.res.headers
packages/start-server-core/src/request-response.ts:153:  return event.res.headers.get(name) || undefined
packages/start-server-core/src/request-response.ts:162:    event.res.headers.delete(name)
packages/start-server-core/src/request-response.ts:164:      event.res.headers.append(name, valueItem)
packages/start-server-core/src/request-response.ts:167:    event.res.headers.set(name, value)
packages/start-server-core/src/request-response.ts:172:  event.res.headers.delete(name)
packages/start-server-core/src/request-response.ts:182:      event.res.headers.delete(name)
packages/start-server-core/src/request-response.ts:186:    for (const name of event.res.headers.keys()) {
packages/start-server-core/src/request-response.ts:187:      event.res.headers.delete(name)
packages/start-server-core/src/request-response.ts:199:    event.res.status = h3_sanitizeStatusCode(code, event.res.status)
packages/start-server-core/src/request-response.ts:202:    event.res.statusText = h3_sanitizeStatusMessage(text)
packages/start-server-core/src/request-response.ts:330:  return event._res

=== Look at the broader context of server-functions-handler error handling ===
        await Promise.resolve(
          toCrossJSONAsync(error, {
            refs: new Map(),
            plugins: serovalPlugins,
          }),
        ),
      )
      const response = getResponse()
      return new Response(serializedError, {
        status: response?.status ?? 500,
        statusText: response?.statusText,
        headers: {
          'Content-Type': 'application/json',
          [X_TSS_SERIALIZED]: 'true',
        },
      })
    }
  })()

  request.signal.removeEventListener('abort', abort)

  return response
}

function isNotFoundResponse(error: any) {
  const { headers, ...rest } = error

</shell_result>


h3 H3Event event._res event.res difference h3@2.0.0


<web_search_result>
Short answer: event._res is an internal (implementation) response object used by H3/srvx; event.res is the public "prepared response" API you should use (status, statusText, headers, etc.). In v2 H3 hid/changed internals (event._res and event.res._headers) — don't rely on _res (it's internal/unstable); use event.res and return values instead. [1][2]

Sources:

  • H3Event API (event.res = prepared response). [1]
  • H3 v2 release notes / changelog (internal event._res and event.res._headers were hidden). [2]
    </web_search_result>

Script executed:

#!/bin/bash
# Search for test files related to getResponse
find packages/start-server-core -name "*.test.*" -o -name "*.spec.*" | xargs grep -l "getResponse" 2>/dev/null

echo -e "\n=== Look for Response usage in server-functions-handler ==="
rg -n "new Response" packages/start-server-core/src/server-functions-handler.ts -B 5 -A 5 | head -60

echo -e "\n=== Check what h3_toResponse does ==="
rg -n "h3_toResponse" packages/start-server-core/src/ -B 2 -A 2

Repository: TanStack/router


<shell_result>
Repository: TanStack/router
Exit code: 0

stdout:


=== Look for Response usage in server-functions-handler ===
174-      //   } as any)
175-
176-      //   sendStream(event, response)
177-      //   event._handled = true
178-
179:      //   return new Response(null, { status: 200 })
180-      // }
181-
182-      if (isNotFound(result)) {
183-        return isNotFoundResponse(result)
184-      }
--
216-          onError: (error) => {
217-            callbacks.onError(error)
218-          },
219-        })
220-        if (done) {
221:          return new Response(
222-            nonStreamingBody ? JSON.stringify(nonStreamingBody) : undefined,
223-            {
224-              status: response?.status,
225-              statusText: response?.statusText,
226-              headers: {
--
248-            if (nonStreamingBody !== undefined) {
249-              callbacks.onParse(nonStreamingBody)
250-            }
251-          },
252-        })
253:        return new Response(stream, {
254-          status: response?.status,
255-          statusText: response?.statusText,
256-          headers: {
257-            'Content-Type': 'application/x-ndjson',
258-            [X_TSS_SERIALIZED]: 'true',
259-          },
260-        })
261-      }
262-
263:      return new Response(undefined, {
264-        status: response?.status,
265-        statusText: response?.statusText,
266-      })
267-    } catch (error: any) {
268-      if (error instanceof Response) {
--
298-            plugins: serovalPlugins,
299-          }),
300-        ),
301-      )
302-      const response = getResponse()
303:      return new Response(serializedError, {
304-        status: response?.status ?? 500,
305-        statusText: response?.statusText,
306-        headers: {
307-          'Content-Type': 'application/json',
308-          [X_TSS_SERIALIZED]: 'true',
--
317-}
318-

=== Check what h3_toResponse does ===
packages/start-server-core/src/request-response.ts-16-  sealSession as h3_sealSession,
packages/start-server-core/src/request-response.ts-17-  setCookie as h3_setCookie,
packages/start-server-core/src/request-response.ts:18:  toResponse as h3_toResponse,
packages/start-server-core/src/request-response.ts-19-  unsealSession as h3_unsealSession,
packages/start-server-core/src/request-response.ts-20-  updateSession as h3_updateSession,
--
packages/start-server-core/src/request-response.ts-56-      handler(request, requestOpts),
packages/start-server-core/src/request-response.ts-57-    )
packages/start-server-core/src/request-response.ts:58:    return h3_toResponse(response, h3Event)
packages/start-server-core/src/request-response.ts-59-  }
packages/start-server-core/src/request-response.ts-60-}

</shell_result>


getResponse() returns an internal h3 property that is not synchronized with where response status is actually written; verify event._res is the correct object to return or switch to event.res

The review concern is valid. The code has an inconsistency:

  • setResponseStatus() (lines 196–204) writes to event.res.status and event.res.statusText
  • getResponse() (line 330) returns event._res (a different object)
  • Multiple call sites in server-functions-handler.ts (lines 186, 224–225, 254–255, 264–265, 302–305) read response?.status and response?.statusText from the returned value

Per h3's v2 documentation, event._res is an internal implementation detail that h3 explicitly hides in v2.x releases, while event.res is the public API. Since setResponseStatus() modifies event.res, returning event._res creates a synchronization risk where status/statusText values could diverge.

Recommendation: Either switch getResponse() to return event.res (the public API where status is actually managed) or add a comment explaining why event._res must be used and verify under h3@2.0.0-beta.4 that both objects stay synchronized.

🤖 Prompt for AI Agents
In packages/start-server-core/src/request-response.ts around lines 327 to 331,
getResponse() returns event._res which is an internal h3 implementation detail
and is inconsistent with setResponseStatus() that writes to event.res; change
getResponse() to return event.res so callers read the public, synchronized
response object (or if there's a deliberate reason to use _res, add a clear
comment explaining why and add a runtime check/assert that event._res and
event.res are synchronized under the targeted h3 version); update any related
call sites to rely on event.res if necessary.


// not public API (yet)
Expand Down
16 changes: 8 additions & 8 deletions packages/start-server-core/src/server-functions-handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -221,8 +221,8 @@ export const handleServerAction = async ({
return new Response(
nonStreamingBody ? JSON.stringify(nonStreamingBody) : undefined,
{
status: response.status,
statusText: response.statusText,
status: response?.status,
statusText: response?.statusText,
headers: {
'Content-Type': 'application/json',
[X_TSS_SERIALIZED]: 'true',
Expand Down Expand Up @@ -251,8 +251,8 @@ export const handleServerAction = async ({
},
})
return new Response(stream, {
status: response.status,
statusText: response.statusText,
status: response?.status,
statusText: response?.statusText,
headers: {
'Content-Type': 'application/x-ndjson',
[X_TSS_SERIALIZED]: 'true',
Expand All @@ -261,8 +261,8 @@ export const handleServerAction = async ({
}

return new Response(undefined, {
status: response.status,
statusText: response.statusText,
status: response?.status,
statusText: response?.statusText,
})
} catch (error: any) {
if (error instanceof Response) {
Expand Down Expand Up @@ -301,8 +301,8 @@ export const handleServerAction = async ({
)
const response = getResponse()
return new Response(serializedError, {
status: response.status ?? 500,
statusText: response.statusText,
status: response?.status ?? 500,
statusText: response?.statusText,
headers: {
'Content-Type': 'application/json',
[X_TSS_SERIALIZED]: 'true',
Expand Down
41 changes: 13 additions & 28 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading