ssr benchmarks#7606
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughThe PR generalizes the SSR benchmark request loop, updates benchmark documentation and Nx wiring, and adds multiple SSR scenario apps for React, Solid, and Vue covering control flow, head, loaders, selective SSR, assets, before-load, global middleware, rewrites, and serialization. ChangesSSR benchmarks
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
✨ Finishing Touches🧪 Generate unit tests (beta)
|
|
View your CI Pipeline Execution ↗ for commit 8524c9e
☁️ Nx Cloud last updated this comment at |
🚀 Changeset Version Preview3 package(s) bumped directly, 10 bumped as dependents. 🟩 Patch bumps
|
Bundle Size Benchmarks
Current gzip tracks all emitted client JS chunks. Initial gzip tracks only the entry/import graph. Trend sparkline is historical current gzip ending with this PR measurement; lower is better. |
There was a problem hiding this comment.
Actionable comments posted: 17
🧹 Nitpick comments (2)
benchmarks/ssr/scenarios/selective-ssr/react/src/routes/__root.tsx (1)
8-11: Document the benchmark tradeoff (or parseq) instead of type-casting invalidateSearch.In
benchmarks/ssr/scenarios/selective-ssr/react/src/routes/__root.tsx,validateSearch: (s) => s as { q?: string }is a type-only cast—malformedqwill pass through and won’t trigger theVALIDATE_SEARCH/onErrorpath.
Becauseqisn’t used anywhere else insrc/routesand the same cast appears across other SSR benchmark variants, this is likely intentional; add a short comment explaining that validation is intentionally skipped for benchmark fidelity, or switch to lightweight parsing/coercion if search state should be trustworthy.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@benchmarks/ssr/scenarios/selective-ssr/react/src/routes/__root.tsx` around lines 8 - 11, The validateSearch currently uses a type-only cast (validateSearch: (s) => s as { q?: string }) which lets malformed q values bypass VALIDATE_SEARCH/onError; update the implementation so either (1) replace the cast with a lightweight parser/coercer that extracts and sanitizes q (e.g., ensure s.q is a string or undefined) inside the validateSearch function, or (2) if this lax behavior is intentional for benchmark fidelity, add a concise comment above the validateSearch entry referencing Route/createRootRoute and explaining that validation is intentionally skipped for performance measurement and why it’s acceptable; ensure references to q, VALIDATE_SEARCH/onError, and src/routes are included in the comment to make the tradeoff explicit.benchmarks/ssr/scenarios/control-flow/vue/src/routes/__root.tsx (1)
13-13: ⚡ Quick winAvoid unchecked cast in
validateSearch.
validateSearch: (s) => s as { q?: string }asserts shape without validating it. This can typeqasstringeven when query input is not a string.As per coding guidelines, TypeScript files should maintain extensive type safety and avoid unsafe assertions for externally shaped input.
Suggested change
export const Route = createRootRoute({ component: RootComponent, notFoundComponent: RootNotFoundComponent, - validateSearch: (s) => s as { q?: string }, + validateSearch: (s: Record<string, unknown>) => ({ + q: typeof s.q === 'string' ? s.q : undefined, + }), })🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@benchmarks/ssr/scenarios/control-flow/vue/src/routes/__root.tsx` at line 13, Replace the unchecked cast in validateSearch to perform a runtime shape check: inside validateSearch(s) ensure s is an object and if s.q exists verify typeof s.q === "string" before returning { q: s.q }, otherwise return {} (or { q: undefined }) so the function returns a correctly validated { q?: string } without using an unsafe as-cast; update the validateSearch implementation referenced by name to use these typeof/object checks and safe fallback.Source: Coding guidelines
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@benchmarks/ssr/scenarios/control-flow/react/src/routes/__root.tsx`:
- Around line 8-12: The validateSearch currently just type-asserts and doesn't
normalize or validate q; update the validateSearch callback passed into
createRootRoute (the Route definition) to perform runtime parsing: read s.q, if
it's undefined leave undefined, if it's a string keep it, if it's another
primitive coerce to string (e.g., String(s.q)), and if it's an invalid shape
(object/array) either return { q: undefined } or throw an Error per your route
policy—ensuring the returned value is exactly { q?: string } at runtime rather
than a TypeScript assertion.
In `@benchmarks/ssr/scenarios/control-flow/shared.ts`:
- Around line 62-67: The runNotFoundLoop function omits the iterations option
causing it to use the default 10 and skew results versus the redirect benchmark;
update runNotFoundLoop (which calls runRequestLoop) to pass an explicit
iterations value (e.g., iterations: 100 to match the redirect path) in the
options object alongside seed, buildRequest, and validateResponse so both
control-flow scenarios use the same iteration count.
In `@benchmarks/ssr/scenarios/control-flow/solid/src/routes/__root.tsx`:
- Line 11: The current validateSearch uses an unchecked cast (as { q?: string })
which allows non-string runtime values; update validateSearch to perform runtime
narrowing: ensure the incoming s is a non-null object, check that s.q exists and
is of type string (or coerce/normalize explicitly if desired), and return { q }
only when it's a string (otherwise return {} or { q: undefined }). Locate the
validateSearch arrow in __root.tsx and replace the cast with these runtime
checks so downstream code receives a properly narrowed { q?: string } shape.
In `@benchmarks/ssr/scenarios/head/solid/src/routes/__root.tsx`:
- Line 20: The validateSearch property currently performs a type cast
(validateSearch: (s) => s as { q?: string }) which skips runtime checks; replace
it with a real parser that narrows and sanitizes input in the validateSearch
function (e.g., accept any, check that s is an object, verify s.q is either
undefined or a string, coerce or return undefined for non-strings, or
throw/return a validation error), and return a correctly typed { q?: string }
result so invalid runtime values cannot leak into typed code.
In `@benchmarks/ssr/scenarios/head/vue/src/routes/__root.tsx`:
- Line 22: The current unchecked cast in validateSearch should be replaced with
a runtime check that ensures q is a string (or undefined) instead of blindly
casting; update validateSearch to inspect the incoming s (and handle array
values if possible), e.g. return { q: typeof s?.q === "string" ? s.q : undefined
} (or if s.q can be an array use Array.isArray to pick the first string
element), thereby removing the unsafe `s as { q?: string }` cast and returning a
properly validated { q?: string } result.
In `@benchmarks/ssr/scenarios/loaders/react/src/routes/__root.tsx`:
- Around line 10-13: The validateSearch function currently treats page only as a
number and therefore drops string query values like "?page=2"; update
validateSearch (in __root.tsx) to accept numeric strings too by checking for
typeof s.page === 'number' OR typeof s.page === 'string' and parsing it (e.g.,
parseInt/Number with an isNaN fallback to 0), and leave tags handling as-is
(Array.isArray(s.tags) ? s.tags as string[] : []); ensure parsed page is a safe
integer fallback to 0 when parsing fails.
In `@benchmarks/ssr/scenarios/loaders/solid/src/routes/__root.tsx`:
- Around line 10-13: The validateSearch function currently only accepts numbers
for s.page and thus ignores numeric query strings; update validateSearch (the
function named validateSearch) to coerce string numeric inputs to numbers (e.g.,
use Number(...) or parseInt(...) on s.page) and fall back to 0 when the result
is NaN or not provided, while keeping tags handling the same.
In `@benchmarks/ssr/scenarios/loaders/vue/src/routes/__root.tsx`:
- Around line 12-15: The validateSearch implementation loses numeric string
inputs and unsafely casts tags; update validateSearch to coerce page from
number-like inputs by accepting numbers or numeric strings (parse/Number and
validate isFinite) and default only if invalid, and for tags keep
Array.isArray(s.tags) but filter and map to ensure each element is a string
(e.g., filter by typeof === 'string') before returning []; refer to the
validateSearch function in __root.tsx and replace the current simple typeof/cast
logic with these validated coercions to preserve strict type safety.
In `@benchmarks/ssr/scenarios/selective-ssr/solid/src/routes/__root.tsx`:
- Line 10: The validateSearch implementation in __root.tsx currently only casts
(validateSearch: (s) => s as { q?: string }) which provides no runtime checks;
replace this with a real runtime validator that either uses a schema adapter
(e.g., Zod or Valibot) or an explicit guard that coerces/validates the q field
to string|undefined and throws on malformed input so the router won't pass
invalid values to useSearch(); locate the validateSearch export in the root
route and implement validation/coercion there (or wire a Zod/Valibot schema) to
ensure q is a string if present.
In `@benchmarks/ssr/scenarios/server-fns/react/src/fns.ts`:
- Around line 15-19: The current validation only checks that p?.nested?.list is
an array but not the item types; update the check inside the validator (the
block referencing p?.q, p?.n, and p?.nested?.list) to also ensure every element
in p?.nested?.list is a string (e.g., use Array.isArray(p?.nested?.list) &&
p.nested.list.every(item => typeof item === 'string')) so the runtime shape
matches the Payload expectation used by echo; keep the existing guards for p?.q
and p?.n and fail/return early if any item is not a string.
In `@benchmarks/ssr/scenarios/server-fns/solid/src/fns.ts`:
- Around line 15-19: The runtime validator in validate (the payload checker)
currently only verifies Array.isArray(p?.nested?.list) but not element types;
update the condition to ensure p?.nested?.list is an array of strings (e.g.
Array.isArray(p?.nested?.list) && p.nested.list.every(item => typeof item ===
'string')) so the validator enforces Payload's Array<string> for nested.list;
adjust the if condition that checks typeof p?.q, typeof p?.n and
!Array.isArray(p?.nested?.list) to include the element-type check for
p.nested.list.
In `@benchmarks/ssr/scenarios/server-fns/vue/src/fns.ts`:
- Around line 15-24: The current payload validation only ensures p.q is a
string, p.n is typeof 'number' (which permits NaN/Infinity), and p.nested.list
is an array; strengthen it by validating Number.isFinite(p.n) (or isFinite) to
reject NaN/Infinity and by checking p.nested.list.every(item => typeof item ===
'string') to ensure all list items are strings; update the guard that throws
'invalid payload' (the checks around p?.q, p?.n, p?.nested?.list and the return
of p) to use these stricter conditions so the returned Payload matches its
declared contract.
In `@benchmarks/ssr/scenarios/server-fns/vue/src/routeTree.gen.ts`:
- Around line 79-85: The generated import in routeTree.gen.ts uses a .tsx
extension which triggers TS5097; update the import to drop the extension (change
import type { getRouter } from './router.tsx' to import type { getRouter } from
'./router') or alternatively enable allowImportingTsExtensions in the benchmark
tsconfig chain; locate the declarations around getRouter and createStart in
benchmarks/ssr/scenarios/server-fns/vue/src/routeTree.gen.ts and either remove
the .tsx suffix from the import specifier or add
compilerOptions.allowImportingTsExtensions: true to the appropriate tsconfig so
TypeScript no longer errors on the .tsx import.
In `@benchmarks/ssr/scenarios/streaming/react/src/routes/__root.tsx`:
- Around line 8-11: The current validateSearch uses an assertion (s as { q?:
string }) which skips runtime narrowing; update the Route/createRootRoute
validateSearch to accept s: Record<string, unknown> and perform a runtime check
to return a properly typed { q?: string } object (e.g., check typeof (s as
any).q === 'string' and only then include q, otherwise return {} or undefined).
Modify the validateSearch implementation (in the Route definition that
references RootComponent) to perform that explicit narrowing instead of a type
assertion so strict typing works across root routes.
In `@benchmarks/ssr/scenarios/streaming/vue/src/routes/__root.tsx`:
- Line 12: The validateSearch property currently uses an unchecked TypeScript
cast (validateSearch: (s) => s as { q?: string }) which skips runtime
validation; replace it with a runtime coercion function for safety: change
validateSearch to accept s: Record<string, unknown> and return a plain object {
q?: string } where q is set only if typeof s.q === 'string', otherwise
undefined, mirroring the pattern used in other routes to avoid unsafe
assertions.
In `@benchmarks/ssr/scenarios/streaming/vue/src/routes/stream`.$id.tsx:
- Around line 13-23: Remove the duplicated static fallback paragraphs that
render alongside the Suspense fallbacks: delete the top-level
<p>loading-small</p> (and the analogous <p>loading-big</p> in the later block)
so only the Suspense fallback is emitted while data.value.slowSmall /
data.value.slowBig are pending; locate the Suspense + Await blocks in
stream.$id.tsx (the Await components using promise={data.value.slowSmall} and
promise={data.value.slowBig} with children props) and keep their fallback
functions, removing the extra static <p> nodes that caused double "loading-*"
output.
---
Nitpick comments:
In `@benchmarks/ssr/scenarios/control-flow/vue/src/routes/__root.tsx`:
- Line 13: Replace the unchecked cast in validateSearch to perform a runtime
shape check: inside validateSearch(s) ensure s is an object and if s.q exists
verify typeof s.q === "string" before returning { q: s.q }, otherwise return {}
(or { q: undefined }) so the function returns a correctly validated { q?: string
} without using an unsafe as-cast; update the validateSearch implementation
referenced by name to use these typeof/object checks and safe fallback.
In `@benchmarks/ssr/scenarios/selective-ssr/react/src/routes/__root.tsx`:
- Around line 8-11: The validateSearch currently uses a type-only cast
(validateSearch: (s) => s as { q?: string }) which lets malformed q values
bypass VALIDATE_SEARCH/onError; update the implementation so either (1) replace
the cast with a lightweight parser/coercer that extracts and sanitizes q (e.g.,
ensure s.q is a string or undefined) inside the validateSearch function, or (2)
if this lax behavior is intentional for benchmark fidelity, add a concise
comment above the validateSearch entry referencing Route/createRootRoute and
explaining that validation is intentionally skipped for performance measurement
and why it’s acceptable; ensure references to q, VALIDATE_SEARCH/onError, and
src/routes are included in the comment to make the tradeoff explicit.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 91130b74-ac3b-48fc-adcd-dbda85c6d955
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (255)
benchmarks/ssr/README.mdbenchmarks/ssr/bench-utils.tsbenchmarks/ssr/package.jsonbenchmarks/ssr/react/project.jsonbenchmarks/ssr/scenarios/control-flow/react/project.jsonbenchmarks/ssr/scenarios/control-flow/react/speed.bench.tsbenchmarks/ssr/scenarios/control-flow/react/src/routeTree.gen.tsbenchmarks/ssr/scenarios/control-flow/react/src/router.tsxbenchmarks/ssr/scenarios/control-flow/react/src/routes/__root.tsxbenchmarks/ssr/scenarios/control-flow/react/src/routes/from.$id.tsxbenchmarks/ssr/scenarios/control-flow/react/src/routes/index.tsxbenchmarks/ssr/scenarios/control-flow/react/src/routes/missing.$id.tsxbenchmarks/ssr/scenarios/control-flow/react/src/routes/target.$id.tsxbenchmarks/ssr/scenarios/control-flow/react/tsconfig.jsonbenchmarks/ssr/scenarios/control-flow/react/vite.config.tsbenchmarks/ssr/scenarios/control-flow/shared.tsbenchmarks/ssr/scenarios/control-flow/solid/project.jsonbenchmarks/ssr/scenarios/control-flow/solid/speed.bench.tsbenchmarks/ssr/scenarios/control-flow/solid/src/routeTree.gen.tsbenchmarks/ssr/scenarios/control-flow/solid/src/router.tsxbenchmarks/ssr/scenarios/control-flow/solid/src/routes/__root.tsxbenchmarks/ssr/scenarios/control-flow/solid/src/routes/from.$id.tsxbenchmarks/ssr/scenarios/control-flow/solid/src/routes/index.tsxbenchmarks/ssr/scenarios/control-flow/solid/src/routes/missing.$id.tsxbenchmarks/ssr/scenarios/control-flow/solid/src/routes/target.$id.tsxbenchmarks/ssr/scenarios/control-flow/solid/tsconfig.jsonbenchmarks/ssr/scenarios/control-flow/solid/vite.config.tsbenchmarks/ssr/scenarios/control-flow/vue/project.jsonbenchmarks/ssr/scenarios/control-flow/vue/speed.bench.tsbenchmarks/ssr/scenarios/control-flow/vue/src/routeTree.gen.tsbenchmarks/ssr/scenarios/control-flow/vue/src/router.tsxbenchmarks/ssr/scenarios/control-flow/vue/src/routes/__root.tsxbenchmarks/ssr/scenarios/control-flow/vue/src/routes/from.$id.tsxbenchmarks/ssr/scenarios/control-flow/vue/src/routes/index.tsxbenchmarks/ssr/scenarios/control-flow/vue/src/routes/missing.$id.tsxbenchmarks/ssr/scenarios/control-flow/vue/src/routes/target.$id.tsxbenchmarks/ssr/scenarios/control-flow/vue/tsconfig.jsonbenchmarks/ssr/scenarios/control-flow/vue/vite.config.tsbenchmarks/ssr/scenarios/head/react/project.jsonbenchmarks/ssr/scenarios/head/react/speed.bench.tsbenchmarks/ssr/scenarios/head/react/src/routeTree.gen.tsbenchmarks/ssr/scenarios/head/react/src/router.tsxbenchmarks/ssr/scenarios/head/react/src/routes/__root.tsxbenchmarks/ssr/scenarios/head/react/src/routes/h.$a.$b.$c.tsxbenchmarks/ssr/scenarios/head/react/src/routes/h.$a.$b.tsxbenchmarks/ssr/scenarios/head/react/src/routes/h.$a.tsxbenchmarks/ssr/scenarios/head/react/tsconfig.jsonbenchmarks/ssr/scenarios/head/react/vite.config.tsbenchmarks/ssr/scenarios/head/shared.tsbenchmarks/ssr/scenarios/head/solid/project.jsonbenchmarks/ssr/scenarios/head/solid/speed.bench.tsbenchmarks/ssr/scenarios/head/solid/src/routeTree.gen.tsbenchmarks/ssr/scenarios/head/solid/src/router.tsxbenchmarks/ssr/scenarios/head/solid/src/routes/__root.tsxbenchmarks/ssr/scenarios/head/solid/src/routes/h.$a.$b.$c.tsxbenchmarks/ssr/scenarios/head/solid/src/routes/h.$a.$b.tsxbenchmarks/ssr/scenarios/head/solid/src/routes/h.$a.tsxbenchmarks/ssr/scenarios/head/solid/tsconfig.jsonbenchmarks/ssr/scenarios/head/solid/vite.config.tsbenchmarks/ssr/scenarios/head/vue/project.jsonbenchmarks/ssr/scenarios/head/vue/speed.bench.tsbenchmarks/ssr/scenarios/head/vue/src/routeTree.gen.tsbenchmarks/ssr/scenarios/head/vue/src/router.tsxbenchmarks/ssr/scenarios/head/vue/src/routes/__root.tsxbenchmarks/ssr/scenarios/head/vue/src/routes/h.$a.$b.$c.tsxbenchmarks/ssr/scenarios/head/vue/src/routes/h.$a.$b.tsxbenchmarks/ssr/scenarios/head/vue/src/routes/h.$a.tsxbenchmarks/ssr/scenarios/head/vue/tsconfig.jsonbenchmarks/ssr/scenarios/head/vue/vite.config.tsbenchmarks/ssr/scenarios/loaders/react/project.jsonbenchmarks/ssr/scenarios/loaders/react/speed.bench.tsbenchmarks/ssr/scenarios/loaders/react/src/routeTree.gen.tsbenchmarks/ssr/scenarios/loaders/react/src/router.tsxbenchmarks/ssr/scenarios/loaders/react/src/routes/$a.$b.$c.tsxbenchmarks/ssr/scenarios/loaders/react/src/routes/$a.$b.tsxbenchmarks/ssr/scenarios/loaders/react/src/routes/$a.tsxbenchmarks/ssr/scenarios/loaders/react/src/routes/__root.tsxbenchmarks/ssr/scenarios/loaders/react/tsconfig.jsonbenchmarks/ssr/scenarios/loaders/react/vite.config.tsbenchmarks/ssr/scenarios/loaders/shared-bench.tsbenchmarks/ssr/scenarios/loaders/shared-data.tsbenchmarks/ssr/scenarios/loaders/solid/project.jsonbenchmarks/ssr/scenarios/loaders/solid/speed.bench.tsbenchmarks/ssr/scenarios/loaders/solid/src/routeTree.gen.tsbenchmarks/ssr/scenarios/loaders/solid/src/router.tsxbenchmarks/ssr/scenarios/loaders/solid/src/routes/$a.$b.$c.tsxbenchmarks/ssr/scenarios/loaders/solid/src/routes/$a.$b.tsxbenchmarks/ssr/scenarios/loaders/solid/src/routes/$a.tsxbenchmarks/ssr/scenarios/loaders/solid/src/routes/__root.tsxbenchmarks/ssr/scenarios/loaders/solid/tsconfig.jsonbenchmarks/ssr/scenarios/loaders/solid/vite.config.tsbenchmarks/ssr/scenarios/loaders/vue/project.jsonbenchmarks/ssr/scenarios/loaders/vue/speed.bench.tsbenchmarks/ssr/scenarios/loaders/vue/src/routeTree.gen.tsbenchmarks/ssr/scenarios/loaders/vue/src/router.tsxbenchmarks/ssr/scenarios/loaders/vue/src/routes/$a.$b.$c.tsxbenchmarks/ssr/scenarios/loaders/vue/src/routes/$a.$b.tsxbenchmarks/ssr/scenarios/loaders/vue/src/routes/$a.tsxbenchmarks/ssr/scenarios/loaders/vue/src/routes/__root.tsxbenchmarks/ssr/scenarios/loaders/vue/tsconfig.jsonbenchmarks/ssr/scenarios/loaders/vue/vite.config.tsbenchmarks/ssr/scenarios/selective-ssr/react/project.jsonbenchmarks/ssr/scenarios/selective-ssr/react/speed.bench.tsbenchmarks/ssr/scenarios/selective-ssr/react/src/routeTree.gen.tsbenchmarks/ssr/scenarios/selective-ssr/react/src/router.tsxbenchmarks/ssr/scenarios/selective-ssr/react/src/routes/__root.tsxbenchmarks/ssr/scenarios/selective-ssr/react/src/routes/mix.$a.$b.$c.tsxbenchmarks/ssr/scenarios/selective-ssr/react/src/routes/mix.$a.$b.tsxbenchmarks/ssr/scenarios/selective-ssr/react/src/routes/mix.$a.tsxbenchmarks/ssr/scenarios/selective-ssr/react/tsconfig.jsonbenchmarks/ssr/scenarios/selective-ssr/react/vite.config.tsbenchmarks/ssr/scenarios/selective-ssr/shared-bench.tsbenchmarks/ssr/scenarios/selective-ssr/solid/project.jsonbenchmarks/ssr/scenarios/selective-ssr/solid/speed.bench.tsbenchmarks/ssr/scenarios/selective-ssr/solid/src/routeTree.gen.tsbenchmarks/ssr/scenarios/selective-ssr/solid/src/router.tsxbenchmarks/ssr/scenarios/selective-ssr/solid/src/routes/__root.tsxbenchmarks/ssr/scenarios/selective-ssr/solid/src/routes/mix.$a.$b.$c.tsxbenchmarks/ssr/scenarios/selective-ssr/solid/src/routes/mix.$a.$b.tsxbenchmarks/ssr/scenarios/selective-ssr/solid/src/routes/mix.$a.tsxbenchmarks/ssr/scenarios/selective-ssr/solid/tsconfig.jsonbenchmarks/ssr/scenarios/selective-ssr/solid/vite.config.tsbenchmarks/ssr/scenarios/selective-ssr/vue/project.jsonbenchmarks/ssr/scenarios/selective-ssr/vue/speed.bench.tsbenchmarks/ssr/scenarios/selective-ssr/vue/src/routeTree.gen.tsbenchmarks/ssr/scenarios/selective-ssr/vue/src/router.tsxbenchmarks/ssr/scenarios/selective-ssr/vue/src/routes/__root.tsxbenchmarks/ssr/scenarios/selective-ssr/vue/src/routes/mix.$a.$b.$c.tsxbenchmarks/ssr/scenarios/selective-ssr/vue/src/routes/mix.$a.$b.tsxbenchmarks/ssr/scenarios/selective-ssr/vue/src/routes/mix.$a.tsxbenchmarks/ssr/scenarios/selective-ssr/vue/tsconfig.jsonbenchmarks/ssr/scenarios/selective-ssr/vue/vite.config.tsbenchmarks/ssr/scenarios/server-fns/bench.tsbenchmarks/ssr/scenarios/server-fns/react/project.jsonbenchmarks/ssr/scenarios/server-fns/react/speed.bench.tsbenchmarks/ssr/scenarios/server-fns/react/src/fns.tsbenchmarks/ssr/scenarios/server-fns/react/src/routeTree.gen.tsbenchmarks/ssr/scenarios/server-fns/react/src/router.tsxbenchmarks/ssr/scenarios/server-fns/react/src/routes/__root.tsxbenchmarks/ssr/scenarios/server-fns/react/src/routes/api.fn-urls.tsbenchmarks/ssr/scenarios/server-fns/react/src/routes/index.tsxbenchmarks/ssr/scenarios/server-fns/react/tsconfig.jsonbenchmarks/ssr/scenarios/server-fns/react/vite.config.tsbenchmarks/ssr/scenarios/server-fns/solid/project.jsonbenchmarks/ssr/scenarios/server-fns/solid/speed.bench.tsbenchmarks/ssr/scenarios/server-fns/solid/src/fns.tsbenchmarks/ssr/scenarios/server-fns/solid/src/routeTree.gen.tsbenchmarks/ssr/scenarios/server-fns/solid/src/router.tsxbenchmarks/ssr/scenarios/server-fns/solid/src/routes/__root.tsxbenchmarks/ssr/scenarios/server-fns/solid/src/routes/api.fn-urls.tsbenchmarks/ssr/scenarios/server-fns/solid/src/routes/index.tsxbenchmarks/ssr/scenarios/server-fns/solid/tsconfig.jsonbenchmarks/ssr/scenarios/server-fns/solid/vite.config.tsbenchmarks/ssr/scenarios/server-fns/vue/project.jsonbenchmarks/ssr/scenarios/server-fns/vue/speed.bench.tsbenchmarks/ssr/scenarios/server-fns/vue/src/fns.tsbenchmarks/ssr/scenarios/server-fns/vue/src/routeTree.gen.tsbenchmarks/ssr/scenarios/server-fns/vue/src/router.tsxbenchmarks/ssr/scenarios/server-fns/vue/src/routes/__root.tsxbenchmarks/ssr/scenarios/server-fns/vue/src/routes/api.fn-urls.tsbenchmarks/ssr/scenarios/server-fns/vue/src/routes/index.tsxbenchmarks/ssr/scenarios/server-fns/vue/tsconfig.jsonbenchmarks/ssr/scenarios/server-fns/vue/vite.config.tsbenchmarks/ssr/scenarios/server-routes-middleware/react/project.jsonbenchmarks/ssr/scenarios/server-routes-middleware/react/speed.bench.tsbenchmarks/ssr/scenarios/server-routes-middleware/react/src/middleware.tsbenchmarks/ssr/scenarios/server-routes-middleware/react/src/routeTree.gen.tsbenchmarks/ssr/scenarios/server-routes-middleware/react/src/router.tsxbenchmarks/ssr/scenarios/server-routes-middleware/react/src/routes/__root.tsxbenchmarks/ssr/scenarios/server-routes-middleware/react/src/routes/api.chain.$id.tsbenchmarks/ssr/scenarios/server-routes-middleware/react/src/routes/index.tsxbenchmarks/ssr/scenarios/server-routes-middleware/react/tsconfig.jsonbenchmarks/ssr/scenarios/server-routes-middleware/react/vite.config.tsbenchmarks/ssr/scenarios/server-routes-middleware/shared.tsbenchmarks/ssr/scenarios/server-routes-middleware/solid/project.jsonbenchmarks/ssr/scenarios/server-routes-middleware/solid/speed.bench.tsbenchmarks/ssr/scenarios/server-routes-middleware/solid/src/middleware.tsbenchmarks/ssr/scenarios/server-routes-middleware/solid/src/routeTree.gen.tsbenchmarks/ssr/scenarios/server-routes-middleware/solid/src/router.tsxbenchmarks/ssr/scenarios/server-routes-middleware/solid/src/routes/__root.tsxbenchmarks/ssr/scenarios/server-routes-middleware/solid/src/routes/api.chain.$id.tsbenchmarks/ssr/scenarios/server-routes-middleware/solid/src/routes/index.tsxbenchmarks/ssr/scenarios/server-routes-middleware/solid/tsconfig.jsonbenchmarks/ssr/scenarios/server-routes-middleware/solid/vite.config.tsbenchmarks/ssr/scenarios/server-routes-middleware/vue/project.jsonbenchmarks/ssr/scenarios/server-routes-middleware/vue/speed.bench.tsbenchmarks/ssr/scenarios/server-routes-middleware/vue/src/middleware.tsbenchmarks/ssr/scenarios/server-routes-middleware/vue/src/routeTree.gen.tsbenchmarks/ssr/scenarios/server-routes-middleware/vue/src/router.tsxbenchmarks/ssr/scenarios/server-routes-middleware/vue/src/routes/__root.tsxbenchmarks/ssr/scenarios/server-routes-middleware/vue/src/routes/api.chain.$id.tsbenchmarks/ssr/scenarios/server-routes-middleware/vue/src/routes/index.tsxbenchmarks/ssr/scenarios/server-routes-middleware/vue/tsconfig.jsonbenchmarks/ssr/scenarios/server-routes-middleware/vue/vite.config.tsbenchmarks/ssr/scenarios/server-routes/react/project.jsonbenchmarks/ssr/scenarios/server-routes/react/speed.bench.tsbenchmarks/ssr/scenarios/server-routes/react/src/routeTree.gen.tsbenchmarks/ssr/scenarios/server-routes/react/src/router.tsxbenchmarks/ssr/scenarios/server-routes/react/src/routes/__root.tsxbenchmarks/ssr/scenarios/server-routes/react/src/routes/api.users.$id.tsbenchmarks/ssr/scenarios/server-routes/react/src/routes/index.tsxbenchmarks/ssr/scenarios/server-routes/react/tsconfig.jsonbenchmarks/ssr/scenarios/server-routes/react/vite.config.tsbenchmarks/ssr/scenarios/server-routes/shared.tsbenchmarks/ssr/scenarios/server-routes/solid/project.jsonbenchmarks/ssr/scenarios/server-routes/solid/speed.bench.tsbenchmarks/ssr/scenarios/server-routes/solid/src/routeTree.gen.tsbenchmarks/ssr/scenarios/server-routes/solid/src/router.tsxbenchmarks/ssr/scenarios/server-routes/solid/src/routes/__root.tsxbenchmarks/ssr/scenarios/server-routes/solid/src/routes/api.users.$id.tsbenchmarks/ssr/scenarios/server-routes/solid/src/routes/index.tsxbenchmarks/ssr/scenarios/server-routes/solid/tsconfig.jsonbenchmarks/ssr/scenarios/server-routes/solid/vite.config.tsbenchmarks/ssr/scenarios/server-routes/vue/project.jsonbenchmarks/ssr/scenarios/server-routes/vue/speed.bench.tsbenchmarks/ssr/scenarios/server-routes/vue/src/routeTree.gen.tsbenchmarks/ssr/scenarios/server-routes/vue/src/router.tsxbenchmarks/ssr/scenarios/server-routes/vue/src/routes/__root.tsxbenchmarks/ssr/scenarios/server-routes/vue/src/routes/api.users.$id.tsbenchmarks/ssr/scenarios/server-routes/vue/src/routes/index.tsxbenchmarks/ssr/scenarios/server-routes/vue/tsconfig.jsonbenchmarks/ssr/scenarios/server-routes/vue/vite.config.tsbenchmarks/ssr/scenarios/streaming/react/project.jsonbenchmarks/ssr/scenarios/streaming/react/speed.bench.tsbenchmarks/ssr/scenarios/streaming/react/src/routeTree.gen.tsbenchmarks/ssr/scenarios/streaming/react/src/router.tsxbenchmarks/ssr/scenarios/streaming/react/src/routes/__root.tsxbenchmarks/ssr/scenarios/streaming/react/src/routes/stream.$id.tsxbenchmarks/ssr/scenarios/streaming/react/tsconfig.jsonbenchmarks/ssr/scenarios/streaming/react/vite.config.tsbenchmarks/ssr/scenarios/streaming/shared-bench.tsbenchmarks/ssr/scenarios/streaming/shared-data.tsbenchmarks/ssr/scenarios/streaming/solid/project.jsonbenchmarks/ssr/scenarios/streaming/solid/speed.bench.tsbenchmarks/ssr/scenarios/streaming/solid/src/routeTree.gen.tsbenchmarks/ssr/scenarios/streaming/solid/src/router.tsxbenchmarks/ssr/scenarios/streaming/solid/src/routes/__root.tsxbenchmarks/ssr/scenarios/streaming/solid/src/routes/stream.$id.tsxbenchmarks/ssr/scenarios/streaming/solid/tsconfig.jsonbenchmarks/ssr/scenarios/streaming/solid/vite.config.tsbenchmarks/ssr/scenarios/streaming/vue/project.jsonbenchmarks/ssr/scenarios/streaming/vue/speed.bench.tsbenchmarks/ssr/scenarios/streaming/vue/src/routeTree.gen.tsbenchmarks/ssr/scenarios/streaming/vue/src/router.tsxbenchmarks/ssr/scenarios/streaming/vue/src/routes/__root.tsxbenchmarks/ssr/scenarios/streaming/vue/src/routes/stream.$id.tsxbenchmarks/ssr/scenarios/streaming/vue/tsconfig.jsonbenchmarks/ssr/scenarios/streaming/vue/vite.config.tsbenchmarks/ssr/solid/project.jsonbenchmarks/ssr/vitest.config.tsbenchmarks/ssr/vitest.react.config.tsbenchmarks/ssr/vitest.solid.config.tsbenchmarks/ssr/vitest.vue.config.tsbenchmarks/ssr/vue/project.jsonpackage.json
Merging this PR will not alter performance
Performance Changes
Comparing Footnotes |
There was a problem hiding this comment.
🧹 Nitpick comments (1)
benchmarks/ssr/scenarios/loaders/react/project.json (1)
15-15: Potential Windows compatibility issue withNODE_ENV=productionin benchmark build commands
NODE_ENV=production vite build ...uses Unix env-var syntax;cross-envisn’t used inbenchmarks/ssr/scenarios/**/project.json(same pattern appears across many SSR scenarios).- No Windows CI/runner references or Windows-related docs were found for the SSR benchmarks; if Windows execution is required, switch to
cross-envand apply it consistently.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@benchmarks/ssr/scenarios/loaders/react/project.json` at line 15, The build command string "NODE_ENV=production vite build --config {projectRoot}/vite.config.ts" in the project.json scenarios uses Unix shell env syntax which breaks on Windows; update the command to use a cross-platform env tool (e.g. prefix with "cross-env NODE_ENV=production ...") and ensure "cross-env" is added to devDependencies if not present, then apply the same change consistently across all benchmarks/ssr/scenarios/**/project.json files that contain the same pattern so Windows runners can execute the build.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@benchmarks/ssr/scenarios/loaders/react/project.json`:
- Line 15: The build command string "NODE_ENV=production vite build --config
{projectRoot}/vite.config.ts" in the project.json scenarios uses Unix shell env
syntax which breaks on Windows; update the command to use a cross-platform env
tool (e.g. prefix with "cross-env NODE_ENV=production ...") and ensure
"cross-env" is added to devDependencies if not present, then apply the same
change consistently across all benchmarks/ssr/scenarios/**/project.json files
that contain the same pattern so Windows runners can execute the build.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 3d052f57-7948-459f-b10a-7d092de6b431
📒 Files selected for processing (27)
benchmarks/ssr/react/project.jsonbenchmarks/ssr/scenarios/control-flow/react/project.jsonbenchmarks/ssr/scenarios/control-flow/solid/project.jsonbenchmarks/ssr/scenarios/control-flow/vue/project.jsonbenchmarks/ssr/scenarios/head/react/project.jsonbenchmarks/ssr/scenarios/head/solid/project.jsonbenchmarks/ssr/scenarios/head/vue/project.jsonbenchmarks/ssr/scenarios/loaders/react/project.jsonbenchmarks/ssr/scenarios/loaders/solid/project.jsonbenchmarks/ssr/scenarios/loaders/vue/project.jsonbenchmarks/ssr/scenarios/selective-ssr/react/project.jsonbenchmarks/ssr/scenarios/selective-ssr/solid/project.jsonbenchmarks/ssr/scenarios/selective-ssr/vue/project.jsonbenchmarks/ssr/scenarios/server-fns/react/project.jsonbenchmarks/ssr/scenarios/server-fns/solid/project.jsonbenchmarks/ssr/scenarios/server-fns/vue/project.jsonbenchmarks/ssr/scenarios/server-routes-middleware/react/project.jsonbenchmarks/ssr/scenarios/server-routes-middleware/solid/project.jsonbenchmarks/ssr/scenarios/server-routes-middleware/vue/project.jsonbenchmarks/ssr/scenarios/server-routes/react/project.jsonbenchmarks/ssr/scenarios/server-routes/solid/project.jsonbenchmarks/ssr/scenarios/server-routes/vue/project.jsonbenchmarks/ssr/scenarios/streaming/react/project.jsonbenchmarks/ssr/scenarios/streaming/solid/project.jsonbenchmarks/ssr/scenarios/streaming/vue/project.jsonbenchmarks/ssr/solid/project.jsonbenchmarks/ssr/vue/project.json
✅ Files skipped from review due to trivial changes (6)
- benchmarks/ssr/scenarios/server-routes-middleware/react/project.json
- benchmarks/ssr/scenarios/server-routes/vue/project.json
- benchmarks/ssr/scenarios/head/react/project.json
- benchmarks/ssr/vue/project.json
- benchmarks/ssr/scenarios/selective-ssr/react/project.json
- benchmarks/ssr/scenarios/server-routes-middleware/solid/project.json
🚧 Files skipped from review as they are similar to previous changes (20)
- benchmarks/ssr/scenarios/server-fns/react/project.json
- benchmarks/ssr/scenarios/streaming/react/project.json
- benchmarks/ssr/scenarios/server-fns/solid/project.json
- benchmarks/ssr/scenarios/selective-ssr/solid/project.json
- benchmarks/ssr/scenarios/loaders/solid/project.json
- benchmarks/ssr/scenarios/loaders/vue/project.json
- benchmarks/ssr/scenarios/control-flow/vue/project.json
- benchmarks/ssr/scenarios/streaming/solid/project.json
- benchmarks/ssr/scenarios/streaming/vue/project.json
- benchmarks/ssr/scenarios/selective-ssr/vue/project.json
- benchmarks/ssr/scenarios/server-fns/vue/project.json
- benchmarks/ssr/scenarios/head/solid/project.json
- benchmarks/ssr/scenarios/server-routes-middleware/vue/project.json
- benchmarks/ssr/react/project.json
- benchmarks/ssr/scenarios/head/vue/project.json
- benchmarks/ssr/scenarios/server-routes/solid/project.json
- benchmarks/ssr/scenarios/control-flow/react/project.json
- benchmarks/ssr/solid/project.json
- benchmarks/ssr/scenarios/control-flow/solid/project.json
- benchmarks/ssr/scenarios/server-routes/react/project.json
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@nx.json`:
- Around line 68-71: Add the missing upstream dependency for the test:types:ssr
target by adding a dependsOn entry matching other type-test targets (e.g., the
same dependsOn used by test:types), so SSR type tests require the upstream
build/production tasks before running; update the test:types:ssr target (symbol
"test:types:ssr") to include the appropriate "dependsOn" array (for example the
same value as "test:types") to enforce the required upstream build dependency.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: b0fc7fd1-9b61-4e5e-ba1c-b42151142238
📒 Files selected for processing (29)
benchmarks/ssr/package.jsonbenchmarks/ssr/react/project.jsonbenchmarks/ssr/scenarios/control-flow/react/project.jsonbenchmarks/ssr/scenarios/control-flow/solid/project.jsonbenchmarks/ssr/scenarios/control-flow/vue/project.jsonbenchmarks/ssr/scenarios/head/react/project.jsonbenchmarks/ssr/scenarios/head/solid/project.jsonbenchmarks/ssr/scenarios/head/vue/project.jsonbenchmarks/ssr/scenarios/loaders/react/project.jsonbenchmarks/ssr/scenarios/loaders/solid/project.jsonbenchmarks/ssr/scenarios/loaders/vue/project.jsonbenchmarks/ssr/scenarios/selective-ssr/react/project.jsonbenchmarks/ssr/scenarios/selective-ssr/solid/project.jsonbenchmarks/ssr/scenarios/selective-ssr/vue/project.jsonbenchmarks/ssr/scenarios/server-fns/react/project.jsonbenchmarks/ssr/scenarios/server-fns/solid/project.jsonbenchmarks/ssr/scenarios/server-fns/vue/project.jsonbenchmarks/ssr/scenarios/server-routes-middleware/react/project.jsonbenchmarks/ssr/scenarios/server-routes-middleware/solid/project.jsonbenchmarks/ssr/scenarios/server-routes-middleware/vue/project.jsonbenchmarks/ssr/scenarios/server-routes/react/project.jsonbenchmarks/ssr/scenarios/server-routes/solid/project.jsonbenchmarks/ssr/scenarios/server-routes/vue/project.jsonbenchmarks/ssr/scenarios/streaming/react/project.jsonbenchmarks/ssr/scenarios/streaming/solid/project.jsonbenchmarks/ssr/scenarios/streaming/vue/project.jsonbenchmarks/ssr/solid/project.jsonbenchmarks/ssr/vue/project.jsonnx.json
💤 Files with no reviewable changes (28)
- benchmarks/ssr/scenarios/loaders/react/project.json
- benchmarks/ssr/scenarios/head/react/project.json
- benchmarks/ssr/scenarios/streaming/vue/project.json
- benchmarks/ssr/solid/project.json
- benchmarks/ssr/scenarios/control-flow/vue/project.json
- benchmarks/ssr/scenarios/head/vue/project.json
- benchmarks/ssr/scenarios/loaders/solid/project.json
- benchmarks/ssr/scenarios/streaming/react/project.json
- benchmarks/ssr/vue/project.json
- benchmarks/ssr/scenarios/server-routes/react/project.json
- benchmarks/ssr/scenarios/server-routes/vue/project.json
- benchmarks/ssr/scenarios/loaders/vue/project.json
- benchmarks/ssr/scenarios/control-flow/react/project.json
- benchmarks/ssr/scenarios/selective-ssr/react/project.json
- benchmarks/ssr/scenarios/server-fns/vue/project.json
- benchmarks/ssr/scenarios/control-flow/solid/project.json
- benchmarks/ssr/scenarios/server-routes-middleware/solid/project.json
- benchmarks/ssr/scenarios/selective-ssr/solid/project.json
- benchmarks/ssr/scenarios/server-fns/react/project.json
- benchmarks/ssr/scenarios/server-routes/solid/project.json
- benchmarks/ssr/scenarios/server-fns/solid/project.json
- benchmarks/ssr/scenarios/streaming/solid/project.json
- benchmarks/ssr/scenarios/server-routes-middleware/vue/project.json
- benchmarks/ssr/scenarios/selective-ssr/vue/project.json
- benchmarks/ssr/scenarios/server-routes-middleware/react/project.json
- benchmarks/ssr/react/project.json
- benchmarks/ssr/scenarios/head/solid/project.json
- benchmarks/ssr/package.json
There was a problem hiding this comment.
Actionable comments posted: 8
🧹 Nitpick comments (1)
benchmarks/ssr/scenarios/serialization/solid/src/routes/rich.$id.tsx (1)
12-12: ⚡ Quick winRemove the shared
Array.from(...)[0]allocation from both rich-serialization benchmarks.
benchmarks/ssr/scenarios/serialization/solid/src/routes/rich.$id.tsxandbenchmarks/ssr/scenarios/serialization/react/src/routes/rich.$id.tsxboth materialize the entireSetjust to read its first item. Because these files are part of the SSR benchmark suite, that repeated allocation pollutes the measured render cost in both scenarios. Switching both sites totags.values().next().valuekeeps the scenario behavior the same without adding per-request array creation.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@benchmarks/ssr/scenarios/serialization/solid/src/routes/rich`.$id.tsx at line 12, The helper function firstTag currently does Array.from(data().tags)[0], which allocates a new array; change it to return data().tags.values().next().value to avoid materializing the whole Set (i.e., replace Array.from(data().tags)[0] with data().tags.values().next().value in the firstTag implementation), preserving behavior for empty sets (it will yield undefined) and avoiding the per-request allocation in the SSR benchmark.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@benchmarks/ssr/bench-utils.ts`:
- Around line 113-120: The current pendingBodyReads logic pushes
response.text().then(... validateBody ...) and awaits
Promise.all(pendingBodyReads) which fails fast and leaves other response.text()
reads running; update the drain to use Promise.allSettled(pendingBodyReads),
collect any rejection from the validateBody handlers (or response.text()) and
after allSettled completes rethrow the first error (or aggregate) so all body
reads finish before the benchmark exits; locate the pendingBodyReads array usage
and the final await Promise.all(...) and replace with Promise.allSettled(...) +
rethrow handling.
In `@benchmarks/ssr/scenarios/assets/shared.ts`:
- Around line 69-80: The linked-control sanity check must assert exclusivity of
linked CSS (not just presence); in the block that fetches via handler.fetch and
checks linkedResponse/linkedBody/linkedLinkHeader, add an assertion that
linkedBody does NOT contain inline style tags (e.g., verify linkedBody does not
contain '<style') so the test fails if both inline <style> and linked styles are
emitted, ensuring the control benchmark measures the non-inline path
exclusively.
In `@benchmarks/ssr/scenarios/assets/vue/src/server.ts`:
- Around line 21-28: The createTransform implementation in transformAssets
(function createTransform, context type CreateTransformContext) currently uses
the raw x-assets-cdn header as the prefix passed into createCdnTransform
(falling back to cdnOrigin), which lets clients choose arbitrary CDN origins;
change this to validate/match the header value against a small allowlist of
known CDN host keys (e.g., a Map or object mapping short header tokens to
concrete origins) and only use the mapped origin when there's an exact match,
otherwise fall back to cdnOrigin; update both
benchmarks/ssr/scenarios/assets/vue/src/server.ts and
benchmarks/ssr/scenarios/assets/solid/src/server.ts to perform this mapping
before calling createCdnTransform and keep the warmup branch using cdnOrigin as
before.
In `@benchmarks/ssr/scenarios/global-middleware/react/src/fns.ts`:
- Around line 6-18: The validate function currently only checks that
payload?.nested?.list is an array but not that its elements are strings; update
validate (in the function named validate that returns Payload) to assert each
element of payload.nested.list is a string (e.g., iterate with
Array.prototype.every or a simple loop) and throw a clear Error('invalid
payload: nested.list must be an array of strings') when any element fails,
ensuring the returned Payload.nested.list is indeed Array<string>.
In `@benchmarks/ssr/scenarios/global-middleware/solid/src/routes/api.ping`.$id.ts:
- Around line 10-18: The GET handler currently coerces an undefined context into
{} and casts it to GlobalMiddlewareContext, hiding wiring bugs; update the GET:
({ params, context }) => { ... } handler to validate that context is present and
has the expected fields (e.g., requestTrace and requestTotal) before casting to
GlobalMiddlewareContext, and if the validation fails return an error response
(or throw) instead of proceeding to call makeServerRouteMarker(params.id,
middlewareContext) and returning a 200 payload; ensure the check uses the
GlobalMiddlewareContext shape and short-circuits early to fail fast when
middleware context is missing or malformed.
In `@benchmarks/ssr/scenarios/rewrites/react/src/router.tsx`:
- Line 4: The localePrefixRe currently requires a trailing path segment and thus
misses locale-only inputs like "/fr"; update the regex literal localePrefixRe to
accept an optional trailing slash/segment (e.g., change to
/^\/(fr|de|es)(\/.*)?$/) so both "/fr" and "/fr/..." match, and apply the same
adjustment to the other occurrences around lines 16-19 that rely on this
pattern.
In `@benchmarks/ssr/scenarios/rewrites/vue/src/router.tsx`:
- Around line 4-22: The input rewrite in getRouter currently uses localePrefixRe
which requires a trailing path segment so URLs like "/fr" don't match; update
the input rewrite to accept locale-only paths by changing the match logic
(either the regex localePrefixRe to allow an optional group, e.g. make the
second capture optional, or after matching handle when match[2] is undefined)
and when a locale-only path is detected set url.pathname to "/" (not empty) and
set the "_locale" searchParam to the matched locale; ensure this change is
applied inside the input function in getRouter so it mirrors the output rewrite
behavior.
In `@benchmarks/ssr/scenarios/serialization/shared-bench.ts`:
- Around line 74-78: The plain-path assertions in shared-bench.ts forget to
assert that the rich date payload is absent; add an exclusion for the
richDateIso value so a rich-date leak into /plain will fail. Specifically, in
the block using assertIncludes/assertExcludes (around the plain-body checks) add
an assertExcludes(plainBody, richDateIso, 'plain') next to the other plain
assertions (the ones calling assertIncludes/assertExcludes) to ensure
richDateIso is not present in the plain response.
---
Nitpick comments:
In `@benchmarks/ssr/scenarios/serialization/solid/src/routes/rich`.$id.tsx:
- Line 12: The helper function firstTag currently does
Array.from(data().tags)[0], which allocates a new array; change it to return
data().tags.values().next().value to avoid materializing the whole Set (i.e.,
replace Array.from(data().tags)[0] with data().tags.values().next().value in the
firstTag implementation), preserving behavior for empty sets (it will yield
undefined) and avoiding the per-request allocation in the SSR benchmark.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 7c0aadfa-8286-42a1-a66a-5b30b667efc0
📒 Files selected for processing (178)
benchmarks/ssr/README.mdbenchmarks/ssr/bench-utils.tsbenchmarks/ssr/package.jsonbenchmarks/ssr/scenarios/assets/react/project.jsonbenchmarks/ssr/scenarios/assets/react/speed.bench.tsbenchmarks/ssr/scenarios/assets/react/src/routeTree.gen.tsbenchmarks/ssr/scenarios/assets/react/src/router.tsxbenchmarks/ssr/scenarios/assets/react/src/routes/__root.tsxbenchmarks/ssr/scenarios/assets/react/src/routes/a.$x.$y.tsxbenchmarks/ssr/scenarios/assets/react/src/routes/a.$x.tsxbenchmarks/ssr/scenarios/assets/react/src/server.tsbenchmarks/ssr/scenarios/assets/react/src/styles/assets-a.cssbenchmarks/ssr/scenarios/assets/react/src/styles/assets-leaf.cssbenchmarks/ssr/scenarios/assets/react/tsconfig.jsonbenchmarks/ssr/scenarios/assets/react/vite.config.tsbenchmarks/ssr/scenarios/assets/shared.tsbenchmarks/ssr/scenarios/assets/solid/project.jsonbenchmarks/ssr/scenarios/assets/solid/speed.bench.tsbenchmarks/ssr/scenarios/assets/solid/src/routeTree.gen.tsbenchmarks/ssr/scenarios/assets/solid/src/router.tsxbenchmarks/ssr/scenarios/assets/solid/src/routes/__root.tsxbenchmarks/ssr/scenarios/assets/solid/src/routes/a.$x.$y.tsxbenchmarks/ssr/scenarios/assets/solid/src/routes/a.$x.tsxbenchmarks/ssr/scenarios/assets/solid/src/server.tsbenchmarks/ssr/scenarios/assets/solid/src/styles/assets-a.cssbenchmarks/ssr/scenarios/assets/solid/src/styles/assets-leaf.cssbenchmarks/ssr/scenarios/assets/solid/tsconfig.jsonbenchmarks/ssr/scenarios/assets/solid/vite.config.tsbenchmarks/ssr/scenarios/assets/vue/project.jsonbenchmarks/ssr/scenarios/assets/vue/speed.bench.tsbenchmarks/ssr/scenarios/assets/vue/src/routeTree.gen.tsbenchmarks/ssr/scenarios/assets/vue/src/router.tsxbenchmarks/ssr/scenarios/assets/vue/src/routes/__root.tsxbenchmarks/ssr/scenarios/assets/vue/src/routes/a.$x.$y.tsxbenchmarks/ssr/scenarios/assets/vue/src/routes/a.$x.tsxbenchmarks/ssr/scenarios/assets/vue/src/server.tsbenchmarks/ssr/scenarios/assets/vue/src/styles/assets-a.cssbenchmarks/ssr/scenarios/assets/vue/src/styles/assets-leaf.cssbenchmarks/ssr/scenarios/assets/vue/tsconfig.jsonbenchmarks/ssr/scenarios/assets/vue/vite.config.tsbenchmarks/ssr/scenarios/before-load/react/project.jsonbenchmarks/ssr/scenarios/before-load/react/speed.bench.tsbenchmarks/ssr/scenarios/before-load/react/src/routeTree.gen.tsbenchmarks/ssr/scenarios/before-load/react/src/router.tsxbenchmarks/ssr/scenarios/before-load/react/src/routes/$a.$b.$c.tsxbenchmarks/ssr/scenarios/before-load/react/src/routes/$a.$b.tsxbenchmarks/ssr/scenarios/before-load/react/src/routes/$a.tsxbenchmarks/ssr/scenarios/before-load/react/src/routes/__root.tsxbenchmarks/ssr/scenarios/before-load/react/tsconfig.jsonbenchmarks/ssr/scenarios/before-load/react/vite.config.tsbenchmarks/ssr/scenarios/before-load/shared-bench.tsbenchmarks/ssr/scenarios/before-load/shared.tsbenchmarks/ssr/scenarios/before-load/solid/project.jsonbenchmarks/ssr/scenarios/before-load/solid/speed.bench.tsbenchmarks/ssr/scenarios/before-load/solid/src/routeTree.gen.tsbenchmarks/ssr/scenarios/before-load/solid/src/router.tsxbenchmarks/ssr/scenarios/before-load/solid/src/routes/$a.$b.$c.tsxbenchmarks/ssr/scenarios/before-load/solid/src/routes/$a.$b.tsxbenchmarks/ssr/scenarios/before-load/solid/src/routes/$a.tsxbenchmarks/ssr/scenarios/before-load/solid/src/routes/__root.tsxbenchmarks/ssr/scenarios/before-load/solid/tsconfig.jsonbenchmarks/ssr/scenarios/before-load/solid/vite.config.tsbenchmarks/ssr/scenarios/before-load/vue/project.jsonbenchmarks/ssr/scenarios/before-load/vue/speed.bench.tsbenchmarks/ssr/scenarios/before-load/vue/src/routeTree.gen.tsbenchmarks/ssr/scenarios/before-load/vue/src/router.tsxbenchmarks/ssr/scenarios/before-load/vue/src/routes/$a.$b.$c.tsxbenchmarks/ssr/scenarios/before-load/vue/src/routes/$a.$b.tsxbenchmarks/ssr/scenarios/before-load/vue/src/routes/$a.tsxbenchmarks/ssr/scenarios/before-load/vue/src/routes/__root.tsxbenchmarks/ssr/scenarios/before-load/vue/tsconfig.jsonbenchmarks/ssr/scenarios/before-load/vue/vite.config.tsbenchmarks/ssr/scenarios/control-flow/react/speed.bench.tsbenchmarks/ssr/scenarios/control-flow/react/src/routeTree.gen.tsbenchmarks/ssr/scenarios/control-flow/react/src/routes/boom.$id.tsxbenchmarks/ssr/scenarios/control-flow/react/src/routes/headers.$id.tsxbenchmarks/ssr/scenarios/control-flow/shared.tsbenchmarks/ssr/scenarios/control-flow/solid/speed.bench.tsbenchmarks/ssr/scenarios/control-flow/solid/src/routeTree.gen.tsbenchmarks/ssr/scenarios/control-flow/solid/src/routes/boom.$id.tsxbenchmarks/ssr/scenarios/control-flow/solid/src/routes/headers.$id.tsxbenchmarks/ssr/scenarios/control-flow/vue/speed.bench.tsbenchmarks/ssr/scenarios/control-flow/vue/src/routeTree.gen.tsbenchmarks/ssr/scenarios/control-flow/vue/src/routes/boom.$id.tsxbenchmarks/ssr/scenarios/control-flow/vue/src/routes/headers.$id.tsxbenchmarks/ssr/scenarios/global-middleware/bench.tsbenchmarks/ssr/scenarios/global-middleware/react/project.jsonbenchmarks/ssr/scenarios/global-middleware/react/speed.bench.tsbenchmarks/ssr/scenarios/global-middleware/react/src/fns.tsbenchmarks/ssr/scenarios/global-middleware/react/src/routeTree.gen.tsbenchmarks/ssr/scenarios/global-middleware/react/src/router.tsxbenchmarks/ssr/scenarios/global-middleware/react/src/routes/__root.tsxbenchmarks/ssr/scenarios/global-middleware/react/src/routes/api.fn-urls.tsbenchmarks/ssr/scenarios/global-middleware/react/src/routes/api.ping.$id.tsbenchmarks/ssr/scenarios/global-middleware/react/src/routes/index.tsxbenchmarks/ssr/scenarios/global-middleware/react/src/routes/page.$id.tsxbenchmarks/ssr/scenarios/global-middleware/react/src/start.tsbenchmarks/ssr/scenarios/global-middleware/react/tsconfig.jsonbenchmarks/ssr/scenarios/global-middleware/react/vite.config.tsbenchmarks/ssr/scenarios/global-middleware/shared.tsbenchmarks/ssr/scenarios/global-middleware/solid/project.jsonbenchmarks/ssr/scenarios/global-middleware/solid/speed.bench.tsbenchmarks/ssr/scenarios/global-middleware/solid/src/fns.tsbenchmarks/ssr/scenarios/global-middleware/solid/src/routeTree.gen.tsbenchmarks/ssr/scenarios/global-middleware/solid/src/router.tsxbenchmarks/ssr/scenarios/global-middleware/solid/src/routes/__root.tsxbenchmarks/ssr/scenarios/global-middleware/solid/src/routes/api.fn-urls.tsbenchmarks/ssr/scenarios/global-middleware/solid/src/routes/api.ping.$id.tsbenchmarks/ssr/scenarios/global-middleware/solid/src/routes/index.tsxbenchmarks/ssr/scenarios/global-middleware/solid/src/routes/page.$id.tsxbenchmarks/ssr/scenarios/global-middleware/solid/src/start.tsbenchmarks/ssr/scenarios/global-middleware/solid/tsconfig.jsonbenchmarks/ssr/scenarios/global-middleware/solid/vite.config.tsbenchmarks/ssr/scenarios/global-middleware/vue/project.jsonbenchmarks/ssr/scenarios/global-middleware/vue/speed.bench.tsbenchmarks/ssr/scenarios/global-middleware/vue/src/fns.tsbenchmarks/ssr/scenarios/global-middleware/vue/src/routeTree.gen.tsbenchmarks/ssr/scenarios/global-middleware/vue/src/router.tsxbenchmarks/ssr/scenarios/global-middleware/vue/src/routes/__root.tsxbenchmarks/ssr/scenarios/global-middleware/vue/src/routes/api.fn-urls.tsbenchmarks/ssr/scenarios/global-middleware/vue/src/routes/api.ping.$id.tsbenchmarks/ssr/scenarios/global-middleware/vue/src/routes/index.tsxbenchmarks/ssr/scenarios/global-middleware/vue/src/routes/page.$id.tsxbenchmarks/ssr/scenarios/global-middleware/vue/src/start.tsbenchmarks/ssr/scenarios/global-middleware/vue/tsconfig.jsonbenchmarks/ssr/scenarios/global-middleware/vue/vite.config.tsbenchmarks/ssr/scenarios/rewrites/react/project.jsonbenchmarks/ssr/scenarios/rewrites/react/speed.bench.tsbenchmarks/ssr/scenarios/rewrites/react/src/routeTree.gen.tsbenchmarks/ssr/scenarios/rewrites/react/src/router.tsxbenchmarks/ssr/scenarios/rewrites/react/src/routes/__root.tsxbenchmarks/ssr/scenarios/rewrites/react/src/routes/p.$a.$b.tsxbenchmarks/ssr/scenarios/rewrites/react/src/routes/p.$a.tsxbenchmarks/ssr/scenarios/rewrites/react/tsconfig.jsonbenchmarks/ssr/scenarios/rewrites/react/vite.config.tsbenchmarks/ssr/scenarios/rewrites/shared.tsbenchmarks/ssr/scenarios/rewrites/solid/project.jsonbenchmarks/ssr/scenarios/rewrites/solid/speed.bench.tsbenchmarks/ssr/scenarios/rewrites/solid/src/routeTree.gen.tsbenchmarks/ssr/scenarios/rewrites/solid/src/router.tsxbenchmarks/ssr/scenarios/rewrites/solid/src/routes/__root.tsxbenchmarks/ssr/scenarios/rewrites/solid/src/routes/p.$a.$b.tsxbenchmarks/ssr/scenarios/rewrites/solid/src/routes/p.$a.tsxbenchmarks/ssr/scenarios/rewrites/solid/tsconfig.jsonbenchmarks/ssr/scenarios/rewrites/solid/vite.config.tsbenchmarks/ssr/scenarios/rewrites/vue/project.jsonbenchmarks/ssr/scenarios/rewrites/vue/speed.bench.tsbenchmarks/ssr/scenarios/rewrites/vue/src/routeTree.gen.tsbenchmarks/ssr/scenarios/rewrites/vue/src/router.tsxbenchmarks/ssr/scenarios/rewrites/vue/src/routes/__root.tsxbenchmarks/ssr/scenarios/rewrites/vue/src/routes/p.$a.$b.tsxbenchmarks/ssr/scenarios/rewrites/vue/src/routes/p.$a.tsxbenchmarks/ssr/scenarios/rewrites/vue/tsconfig.jsonbenchmarks/ssr/scenarios/rewrites/vue/vite.config.tsbenchmarks/ssr/scenarios/serialization/react/project.jsonbenchmarks/ssr/scenarios/serialization/react/speed.bench.tsbenchmarks/ssr/scenarios/serialization/react/src/routeTree.gen.tsbenchmarks/ssr/scenarios/serialization/react/src/router.tsxbenchmarks/ssr/scenarios/serialization/react/src/routes/__root.tsxbenchmarks/ssr/scenarios/serialization/react/src/routes/plain.$id.tsxbenchmarks/ssr/scenarios/serialization/react/src/routes/rich.$id.tsxbenchmarks/ssr/scenarios/serialization/react/src/serialization.tsbenchmarks/ssr/scenarios/serialization/react/src/start.tsxbenchmarks/ssr/scenarios/serialization/react/tsconfig.jsonbenchmarks/ssr/scenarios/serialization/react/vite.config.tsbenchmarks/ssr/scenarios/serialization/shared-bench.tsbenchmarks/ssr/scenarios/serialization/shared-data.tsbenchmarks/ssr/scenarios/serialization/solid/project.jsonbenchmarks/ssr/scenarios/serialization/solid/speed.bench.tsbenchmarks/ssr/scenarios/serialization/solid/src/routeTree.gen.tsbenchmarks/ssr/scenarios/serialization/solid/src/router.tsxbenchmarks/ssr/scenarios/serialization/solid/src/routes/__root.tsxbenchmarks/ssr/scenarios/serialization/solid/src/routes/plain.$id.tsxbenchmarks/ssr/scenarios/serialization/solid/src/routes/rich.$id.tsxbenchmarks/ssr/scenarios/serialization/solid/src/serialization.tsbenchmarks/ssr/scenarios/serialization/solid/src/start.tsxbenchmarks/ssr/scenarios/serialization/solid/tsconfig.jsonbenchmarks/ssr/scenarios/serialization/solid/vite.config.ts
✅ Files skipped from review due to trivial changes (74)
- benchmarks/ssr/scenarios/assets/vue/src/styles/assets-a.css
- benchmarks/ssr/scenarios/before-load/react/speed.bench.ts
- benchmarks/ssr/scenarios/assets/react/src/styles/assets-a.css
- benchmarks/ssr/scenarios/control-flow/react/src/routes/headers.$id.tsx
- benchmarks/ssr/scenarios/assets/react/tsconfig.json
- benchmarks/ssr/scenarios/before-load/solid/tsconfig.json
- benchmarks/ssr/scenarios/before-load/solid/src/routes/$a.tsx
- benchmarks/ssr/scenarios/control-flow/solid/src/routes/boom.$id.tsx
- benchmarks/ssr/scenarios/before-load/vue/tsconfig.json
- benchmarks/ssr/scenarios/global-middleware/solid/src/routes/api.fn-urls.ts
- benchmarks/ssr/scenarios/global-middleware/vue/src/routes/api.fn-urls.ts
- benchmarks/ssr/scenarios/assets/react/src/router.tsx
- benchmarks/ssr/scenarios/before-load/vue/src/router.tsx
- benchmarks/ssr/scenarios/serialization/solid/tsconfig.json
- benchmarks/ssr/scenarios/rewrites/solid/speed.bench.ts
- benchmarks/ssr/scenarios/global-middleware/solid/src/router.tsx
- benchmarks/ssr/scenarios/assets/solid/src/routes/a.$x.tsx
- benchmarks/ssr/scenarios/assets/vue/project.json
- benchmarks/ssr/scenarios/rewrites/react/tsconfig.json
- benchmarks/ssr/scenarios/rewrites/solid/project.json
- benchmarks/ssr/scenarios/before-load/solid/src/routes/__root.tsx
- benchmarks/ssr/scenarios/global-middleware/vue/src/router.tsx
- benchmarks/ssr/scenarios/serialization/react/tsconfig.json
- benchmarks/ssr/scenarios/global-middleware/react/src/router.tsx
- benchmarks/ssr/scenarios/serialization/solid/speed.bench.ts
- benchmarks/ssr/scenarios/global-middleware/solid/tsconfig.json
- benchmarks/ssr/scenarios/global-middleware/vue/src/routes/index.tsx
- benchmarks/ssr/scenarios/before-load/vue/vite.config.ts
- benchmarks/ssr/scenarios/control-flow/react/src/routes/boom.$id.tsx
- benchmarks/ssr/scenarios/assets/solid/src/styles/assets-a.css
- benchmarks/ssr/scenarios/before-load/vue/project.json
- benchmarks/ssr/scenarios/before-load/react/vite.config.ts
- benchmarks/ssr/scenarios/serialization/solid/project.json
- benchmarks/ssr/scenarios/rewrites/vue/project.json
- benchmarks/ssr/scenarios/global-middleware/vue/project.json
- benchmarks/ssr/scenarios/global-middleware/react/src/routes/index.tsx
- benchmarks/ssr/scenarios/serialization/solid/src/start.tsx
- benchmarks/ssr/scenarios/global-middleware/react/vite.config.ts
- benchmarks/ssr/scenarios/assets/solid/src/router.tsx
- benchmarks/ssr/scenarios/control-flow/solid/src/routes/headers.$id.tsx
- benchmarks/ssr/scenarios/assets/vue/src/styles/assets-leaf.css
- benchmarks/ssr/scenarios/rewrites/react/src/routes/p.$a.$b.tsx
- benchmarks/ssr/scenarios/serialization/solid/src/router.tsx
- benchmarks/ssr/scenarios/assets/vue/src/router.tsx
- benchmarks/ssr/scenarios/assets/solid/src/routes/__root.tsx
- benchmarks/ssr/scenarios/before-load/shared.ts
- benchmarks/ssr/scenarios/rewrites/react/src/routes/p.$a.tsx
- benchmarks/ssr/scenarios/global-middleware/react/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/before-load/react/src/router.tsx
- benchmarks/ssr/scenarios/global-middleware/solid/src/routes/index.tsx
- benchmarks/ssr/scenarios/global-middleware/solid/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/assets/react/vite.config.ts
- benchmarks/ssr/scenarios/before-load/react/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/rewrites/vue/tsconfig.json
- benchmarks/ssr/scenarios/rewrites/vue/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/global-middleware/solid/src/routes/__root.tsx
- benchmarks/ssr/scenarios/serialization/solid/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/before-load/vue/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/serialization/shared-data.ts
- benchmarks/ssr/scenarios/before-load/solid/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/rewrites/react/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/assets/vue/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/rewrites/solid/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/assets/react/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/serialization/react/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/rewrites/solid/src/routes/__root.tsx
- benchmarks/ssr/scenarios/global-middleware/vue/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/control-flow/react/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/assets/solid/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/control-flow/solid/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/control-flow/vue/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/assets/react/src/styles/assets-leaf.css
- benchmarks/ssr/scenarios/assets/solid/tsconfig.json
- benchmarks/ssr/scenarios/serialization/react/src/router.tsx
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@benchmarks/ssr/scenarios/before-load/vue/src/routes/`$a.$b.$c.tsx:
- Around line 5-15: The current casts to BeforeLoadContext in beforeLoad and
loader are unsafe because BeforeLoadContext.chainToken is optional; replace the
direct casts with a runtime narrowing guard that checks typeof
context?.chainToken === "string" before using it (e.g., in beforeLoad when
building chainToken and ctxC, and in loader before calling
makeBeforeLoadMarker). If the guard fails, handle the missing chainToken
explicitly (throw a descriptive error or return a safe default) rather than
relying on the cast so makeBeforeLoadMarker always receives a valid chainToken.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 04167deb-4ca4-4234-b2e5-652b5d41acc5
📒 Files selected for processing (178)
benchmarks/ssr/README.mdbenchmarks/ssr/bench-utils.tsbenchmarks/ssr/package.jsonbenchmarks/ssr/scenarios/assets/react/project.jsonbenchmarks/ssr/scenarios/assets/react/speed.bench.tsbenchmarks/ssr/scenarios/assets/react/src/routeTree.gen.tsbenchmarks/ssr/scenarios/assets/react/src/router.tsxbenchmarks/ssr/scenarios/assets/react/src/routes/__root.tsxbenchmarks/ssr/scenarios/assets/react/src/routes/a.$x.$y.tsxbenchmarks/ssr/scenarios/assets/react/src/routes/a.$x.tsxbenchmarks/ssr/scenarios/assets/react/src/server.tsbenchmarks/ssr/scenarios/assets/react/src/styles/assets-a.cssbenchmarks/ssr/scenarios/assets/react/src/styles/assets-leaf.cssbenchmarks/ssr/scenarios/assets/react/tsconfig.jsonbenchmarks/ssr/scenarios/assets/react/vite.config.tsbenchmarks/ssr/scenarios/assets/shared.tsbenchmarks/ssr/scenarios/assets/solid/project.jsonbenchmarks/ssr/scenarios/assets/solid/speed.bench.tsbenchmarks/ssr/scenarios/assets/solid/src/routeTree.gen.tsbenchmarks/ssr/scenarios/assets/solid/src/router.tsxbenchmarks/ssr/scenarios/assets/solid/src/routes/__root.tsxbenchmarks/ssr/scenarios/assets/solid/src/routes/a.$x.$y.tsxbenchmarks/ssr/scenarios/assets/solid/src/routes/a.$x.tsxbenchmarks/ssr/scenarios/assets/solid/src/server.tsbenchmarks/ssr/scenarios/assets/solid/src/styles/assets-a.cssbenchmarks/ssr/scenarios/assets/solid/src/styles/assets-leaf.cssbenchmarks/ssr/scenarios/assets/solid/tsconfig.jsonbenchmarks/ssr/scenarios/assets/solid/vite.config.tsbenchmarks/ssr/scenarios/assets/vue/project.jsonbenchmarks/ssr/scenarios/assets/vue/speed.bench.tsbenchmarks/ssr/scenarios/assets/vue/src/routeTree.gen.tsbenchmarks/ssr/scenarios/assets/vue/src/router.tsxbenchmarks/ssr/scenarios/assets/vue/src/routes/__root.tsxbenchmarks/ssr/scenarios/assets/vue/src/routes/a.$x.$y.tsxbenchmarks/ssr/scenarios/assets/vue/src/routes/a.$x.tsxbenchmarks/ssr/scenarios/assets/vue/src/server.tsbenchmarks/ssr/scenarios/assets/vue/src/styles/assets-a.cssbenchmarks/ssr/scenarios/assets/vue/src/styles/assets-leaf.cssbenchmarks/ssr/scenarios/assets/vue/tsconfig.jsonbenchmarks/ssr/scenarios/assets/vue/vite.config.tsbenchmarks/ssr/scenarios/before-load/react/project.jsonbenchmarks/ssr/scenarios/before-load/react/speed.bench.tsbenchmarks/ssr/scenarios/before-load/react/src/routeTree.gen.tsbenchmarks/ssr/scenarios/before-load/react/src/router.tsxbenchmarks/ssr/scenarios/before-load/react/src/routes/$a.$b.$c.tsxbenchmarks/ssr/scenarios/before-load/react/src/routes/$a.$b.tsxbenchmarks/ssr/scenarios/before-load/react/src/routes/$a.tsxbenchmarks/ssr/scenarios/before-load/react/src/routes/__root.tsxbenchmarks/ssr/scenarios/before-load/react/tsconfig.jsonbenchmarks/ssr/scenarios/before-load/react/vite.config.tsbenchmarks/ssr/scenarios/before-load/shared-bench.tsbenchmarks/ssr/scenarios/before-load/shared.tsbenchmarks/ssr/scenarios/before-load/solid/project.jsonbenchmarks/ssr/scenarios/before-load/solid/speed.bench.tsbenchmarks/ssr/scenarios/before-load/solid/src/routeTree.gen.tsbenchmarks/ssr/scenarios/before-load/solid/src/router.tsxbenchmarks/ssr/scenarios/before-load/solid/src/routes/$a.$b.$c.tsxbenchmarks/ssr/scenarios/before-load/solid/src/routes/$a.$b.tsxbenchmarks/ssr/scenarios/before-load/solid/src/routes/$a.tsxbenchmarks/ssr/scenarios/before-load/solid/src/routes/__root.tsxbenchmarks/ssr/scenarios/before-load/solid/tsconfig.jsonbenchmarks/ssr/scenarios/before-load/solid/vite.config.tsbenchmarks/ssr/scenarios/before-load/vue/project.jsonbenchmarks/ssr/scenarios/before-load/vue/speed.bench.tsbenchmarks/ssr/scenarios/before-load/vue/src/routeTree.gen.tsbenchmarks/ssr/scenarios/before-load/vue/src/router.tsxbenchmarks/ssr/scenarios/before-load/vue/src/routes/$a.$b.$c.tsxbenchmarks/ssr/scenarios/before-load/vue/src/routes/$a.$b.tsxbenchmarks/ssr/scenarios/before-load/vue/src/routes/$a.tsxbenchmarks/ssr/scenarios/before-load/vue/src/routes/__root.tsxbenchmarks/ssr/scenarios/before-load/vue/tsconfig.jsonbenchmarks/ssr/scenarios/before-load/vue/vite.config.tsbenchmarks/ssr/scenarios/control-flow/react/speed.bench.tsbenchmarks/ssr/scenarios/control-flow/react/src/routeTree.gen.tsbenchmarks/ssr/scenarios/control-flow/react/src/routes/boom.$id.tsxbenchmarks/ssr/scenarios/control-flow/react/src/routes/headers.$id.tsxbenchmarks/ssr/scenarios/control-flow/shared.tsbenchmarks/ssr/scenarios/control-flow/solid/speed.bench.tsbenchmarks/ssr/scenarios/control-flow/solid/src/routeTree.gen.tsbenchmarks/ssr/scenarios/control-flow/solid/src/routes/boom.$id.tsxbenchmarks/ssr/scenarios/control-flow/solid/src/routes/headers.$id.tsxbenchmarks/ssr/scenarios/control-flow/vue/speed.bench.tsbenchmarks/ssr/scenarios/control-flow/vue/src/routeTree.gen.tsbenchmarks/ssr/scenarios/control-flow/vue/src/routes/boom.$id.tsxbenchmarks/ssr/scenarios/control-flow/vue/src/routes/headers.$id.tsxbenchmarks/ssr/scenarios/global-middleware/bench.tsbenchmarks/ssr/scenarios/global-middleware/react/project.jsonbenchmarks/ssr/scenarios/global-middleware/react/speed.bench.tsbenchmarks/ssr/scenarios/global-middleware/react/src/fns.tsbenchmarks/ssr/scenarios/global-middleware/react/src/routeTree.gen.tsbenchmarks/ssr/scenarios/global-middleware/react/src/router.tsxbenchmarks/ssr/scenarios/global-middleware/react/src/routes/__root.tsxbenchmarks/ssr/scenarios/global-middleware/react/src/routes/api.fn-urls.tsbenchmarks/ssr/scenarios/global-middleware/react/src/routes/api.ping.$id.tsbenchmarks/ssr/scenarios/global-middleware/react/src/routes/index.tsxbenchmarks/ssr/scenarios/global-middleware/react/src/routes/page.$id.tsxbenchmarks/ssr/scenarios/global-middleware/react/src/start.tsbenchmarks/ssr/scenarios/global-middleware/react/tsconfig.jsonbenchmarks/ssr/scenarios/global-middleware/react/vite.config.tsbenchmarks/ssr/scenarios/global-middleware/shared.tsbenchmarks/ssr/scenarios/global-middleware/solid/project.jsonbenchmarks/ssr/scenarios/global-middleware/solid/speed.bench.tsbenchmarks/ssr/scenarios/global-middleware/solid/src/fns.tsbenchmarks/ssr/scenarios/global-middleware/solid/src/routeTree.gen.tsbenchmarks/ssr/scenarios/global-middleware/solid/src/router.tsxbenchmarks/ssr/scenarios/global-middleware/solid/src/routes/__root.tsxbenchmarks/ssr/scenarios/global-middleware/solid/src/routes/api.fn-urls.tsbenchmarks/ssr/scenarios/global-middleware/solid/src/routes/api.ping.$id.tsbenchmarks/ssr/scenarios/global-middleware/solid/src/routes/index.tsxbenchmarks/ssr/scenarios/global-middleware/solid/src/routes/page.$id.tsxbenchmarks/ssr/scenarios/global-middleware/solid/src/start.tsbenchmarks/ssr/scenarios/global-middleware/solid/tsconfig.jsonbenchmarks/ssr/scenarios/global-middleware/solid/vite.config.tsbenchmarks/ssr/scenarios/global-middleware/vue/project.jsonbenchmarks/ssr/scenarios/global-middleware/vue/speed.bench.tsbenchmarks/ssr/scenarios/global-middleware/vue/src/fns.tsbenchmarks/ssr/scenarios/global-middleware/vue/src/routeTree.gen.tsbenchmarks/ssr/scenarios/global-middleware/vue/src/router.tsxbenchmarks/ssr/scenarios/global-middleware/vue/src/routes/__root.tsxbenchmarks/ssr/scenarios/global-middleware/vue/src/routes/api.fn-urls.tsbenchmarks/ssr/scenarios/global-middleware/vue/src/routes/api.ping.$id.tsbenchmarks/ssr/scenarios/global-middleware/vue/src/routes/index.tsxbenchmarks/ssr/scenarios/global-middleware/vue/src/routes/page.$id.tsxbenchmarks/ssr/scenarios/global-middleware/vue/src/start.tsbenchmarks/ssr/scenarios/global-middleware/vue/tsconfig.jsonbenchmarks/ssr/scenarios/global-middleware/vue/vite.config.tsbenchmarks/ssr/scenarios/rewrites/react/project.jsonbenchmarks/ssr/scenarios/rewrites/react/speed.bench.tsbenchmarks/ssr/scenarios/rewrites/react/src/routeTree.gen.tsbenchmarks/ssr/scenarios/rewrites/react/src/router.tsxbenchmarks/ssr/scenarios/rewrites/react/src/routes/__root.tsxbenchmarks/ssr/scenarios/rewrites/react/src/routes/p.$a.$b.tsxbenchmarks/ssr/scenarios/rewrites/react/src/routes/p.$a.tsxbenchmarks/ssr/scenarios/rewrites/react/tsconfig.jsonbenchmarks/ssr/scenarios/rewrites/react/vite.config.tsbenchmarks/ssr/scenarios/rewrites/shared.tsbenchmarks/ssr/scenarios/rewrites/solid/project.jsonbenchmarks/ssr/scenarios/rewrites/solid/speed.bench.tsbenchmarks/ssr/scenarios/rewrites/solid/src/routeTree.gen.tsbenchmarks/ssr/scenarios/rewrites/solid/src/router.tsxbenchmarks/ssr/scenarios/rewrites/solid/src/routes/__root.tsxbenchmarks/ssr/scenarios/rewrites/solid/src/routes/p.$a.$b.tsxbenchmarks/ssr/scenarios/rewrites/solid/src/routes/p.$a.tsxbenchmarks/ssr/scenarios/rewrites/solid/tsconfig.jsonbenchmarks/ssr/scenarios/rewrites/solid/vite.config.tsbenchmarks/ssr/scenarios/rewrites/vue/project.jsonbenchmarks/ssr/scenarios/rewrites/vue/speed.bench.tsbenchmarks/ssr/scenarios/rewrites/vue/src/routeTree.gen.tsbenchmarks/ssr/scenarios/rewrites/vue/src/router.tsxbenchmarks/ssr/scenarios/rewrites/vue/src/routes/__root.tsxbenchmarks/ssr/scenarios/rewrites/vue/src/routes/p.$a.$b.tsxbenchmarks/ssr/scenarios/rewrites/vue/src/routes/p.$a.tsxbenchmarks/ssr/scenarios/rewrites/vue/tsconfig.jsonbenchmarks/ssr/scenarios/rewrites/vue/vite.config.tsbenchmarks/ssr/scenarios/serialization/react/project.jsonbenchmarks/ssr/scenarios/serialization/react/speed.bench.tsbenchmarks/ssr/scenarios/serialization/react/src/routeTree.gen.tsbenchmarks/ssr/scenarios/serialization/react/src/router.tsxbenchmarks/ssr/scenarios/serialization/react/src/routes/__root.tsxbenchmarks/ssr/scenarios/serialization/react/src/routes/plain.$id.tsxbenchmarks/ssr/scenarios/serialization/react/src/routes/rich.$id.tsxbenchmarks/ssr/scenarios/serialization/react/src/serialization.tsbenchmarks/ssr/scenarios/serialization/react/src/start.tsxbenchmarks/ssr/scenarios/serialization/react/tsconfig.jsonbenchmarks/ssr/scenarios/serialization/react/vite.config.tsbenchmarks/ssr/scenarios/serialization/shared-bench.tsbenchmarks/ssr/scenarios/serialization/shared-data.tsbenchmarks/ssr/scenarios/serialization/solid/project.jsonbenchmarks/ssr/scenarios/serialization/solid/speed.bench.tsbenchmarks/ssr/scenarios/serialization/solid/src/routeTree.gen.tsbenchmarks/ssr/scenarios/serialization/solid/src/router.tsxbenchmarks/ssr/scenarios/serialization/solid/src/routes/__root.tsxbenchmarks/ssr/scenarios/serialization/solid/src/routes/plain.$id.tsxbenchmarks/ssr/scenarios/serialization/solid/src/routes/rich.$id.tsxbenchmarks/ssr/scenarios/serialization/solid/src/serialization.tsbenchmarks/ssr/scenarios/serialization/solid/src/start.tsxbenchmarks/ssr/scenarios/serialization/solid/tsconfig.jsonbenchmarks/ssr/scenarios/serialization/solid/vite.config.ts
✅ Files skipped from review due to trivial changes (37)
- benchmarks/ssr/scenarios/assets/solid/src/styles/assets-leaf.css
- benchmarks/ssr/scenarios/assets/solid/tsconfig.json
- benchmarks/ssr/scenarios/assets/react/project.json
- benchmarks/ssr/scenarios/before-load/shared.ts
- benchmarks/ssr/scenarios/global-middleware/vue/tsconfig.json
- benchmarks/ssr/scenarios/control-flow/vue/speed.bench.ts
- benchmarks/ssr/scenarios/assets/react/src/routes/__root.tsx
- benchmarks/ssr/scenarios/assets/solid/src/router.tsx
- benchmarks/ssr/scenarios/serialization/react/project.json
- benchmarks/ssr/scenarios/serialization/react/src/serialization.ts
- benchmarks/ssr/scenarios/assets/solid/src/styles/assets-a.css
- benchmarks/ssr/scenarios/assets/vue/tsconfig.json
- benchmarks/ssr/scenarios/serialization/solid/project.json
- benchmarks/ssr/scenarios/assets/vue/src/styles/assets-leaf.css
- benchmarks/ssr/scenarios/rewrites/react/tsconfig.json
- benchmarks/ssr/scenarios/global-middleware/react/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/before-load/solid/vite.config.ts
- benchmarks/ssr/scenarios/assets/solid/project.json
- benchmarks/ssr/scenarios/assets/react/tsconfig.json
- benchmarks/ssr/scenarios/assets/react/vite.config.ts
- benchmarks/ssr/scenarios/before-load/vue/vite.config.ts
- benchmarks/ssr/scenarios/global-middleware/solid/project.json
- benchmarks/ssr/scenarios/global-middleware/solid/tsconfig.json
- benchmarks/ssr/scenarios/before-load/solid/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/serialization/solid/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/before-load/vue/tsconfig.json
- benchmarks/ssr/scenarios/assets/vue/src/styles/assets-a.css
- benchmarks/ssr/scenarios/rewrites/vue/tsconfig.json
- benchmarks/ssr/scenarios/control-flow/vue/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/before-load/solid/project.json
- benchmarks/ssr/scenarios/control-flow/react/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/serialization/react/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/before-load/vue/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/global-middleware/solid/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/before-load/react/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/rewrites/solid/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/assets/solid/src/routeTree.gen.ts
🚧 Files skipped from review as they are similar to previous changes (119)
- benchmarks/ssr/scenarios/assets/react/src/styles/assets-leaf.css
- benchmarks/ssr/scenarios/assets/vue/src/router.tsx
- benchmarks/ssr/scenarios/global-middleware/vue/src/routes/page.$id.tsx
- benchmarks/ssr/scenarios/before-load/solid/speed.bench.ts
- benchmarks/ssr/scenarios/rewrites/react/src/routes/__root.tsx
- benchmarks/ssr/scenarios/assets/vue/project.json
- benchmarks/ssr/scenarios/before-load/react/src/routes/$a.tsx
- benchmarks/ssr/scenarios/serialization/solid/src/serialization.ts
- benchmarks/ssr/scenarios/global-middleware/vue/src/routes/api.ping.$id.ts
- benchmarks/ssr/scenarios/global-middleware/vue/src/routes/api.fn-urls.ts
- benchmarks/ssr/scenarios/rewrites/react/speed.bench.ts
- benchmarks/ssr/scenarios/serialization/solid/src/start.tsx
- benchmarks/ssr/scenarios/rewrites/solid/speed.bench.ts
- benchmarks/ssr/scenarios/serialization/solid/src/router.tsx
- benchmarks/ssr/scenarios/global-middleware/solid/src/router.tsx
- benchmarks/ssr/scenarios/rewrites/solid/src/routes/p.$a.$b.tsx
- benchmarks/ssr/scenarios/rewrites/vue/project.json
- benchmarks/ssr/scenarios/rewrites/solid/src/routes/__root.tsx
- benchmarks/ssr/scenarios/assets/vue/vite.config.ts
- benchmarks/ssr/scenarios/serialization/solid/src/routes/rich.$id.tsx
- benchmarks/ssr/scenarios/assets/vue/src/routes/a.$x.$y.tsx
- benchmarks/ssr/scenarios/before-load/react/src/routes/__root.tsx
- benchmarks/ssr/scenarios/global-middleware/solid/vite.config.ts
- benchmarks/ssr/scenarios/before-load/react/project.json
- benchmarks/ssr/scenarios/global-middleware/solid/src/routes/index.tsx
- benchmarks/ssr/scenarios/global-middleware/vue/src/routes/__root.tsx
- benchmarks/ssr/scenarios/rewrites/vue/src/routes/__root.tsx
- benchmarks/ssr/scenarios/assets/solid/src/routes/a.$x.tsx
- benchmarks/ssr/scenarios/serialization/react/src/routes/__root.tsx
- benchmarks/ssr/scenarios/before-load/vue/project.json
- benchmarks/ssr/scenarios/serialization/solid/vite.config.ts
- benchmarks/ssr/scenarios/serialization/react/src/start.tsx
- benchmarks/ssr/scenarios/rewrites/react/vite.config.ts
- benchmarks/ssr/scenarios/global-middleware/react/tsconfig.json
- benchmarks/ssr/scenarios/before-load/solid/src/routes/$a.tsx
- benchmarks/ssr/scenarios/control-flow/react/speed.bench.ts
- benchmarks/ssr/scenarios/global-middleware/solid/src/routes/api.ping.$id.ts
- benchmarks/ssr/scenarios/before-load/react/src/router.tsx
- benchmarks/ssr/scenarios/assets/react/src/styles/assets-a.css
- benchmarks/ssr/scenarios/control-flow/vue/src/routes/boom.$id.tsx
- benchmarks/ssr/scenarios/global-middleware/react/src/routes/__root.tsx
- benchmarks/ssr/scenarios/assets/react/speed.bench.ts
- benchmarks/ssr/scenarios/global-middleware/solid/src/routes/api.fn-urls.ts
- benchmarks/ssr/scenarios/before-load/vue/src/routes/$a.tsx
- benchmarks/ssr/scenarios/assets/solid/vite.config.ts
- benchmarks/ssr/scenarios/control-flow/react/src/routes/boom.$id.tsx
- benchmarks/ssr/scenarios/assets/solid/src/routes/__root.tsx
- benchmarks/ssr/scenarios/rewrites/vue/speed.bench.ts
- benchmarks/ssr/scenarios/before-load/vue/src/routes/$a.$b.tsx
- benchmarks/ssr/scenarios/before-load/react/src/routes/$a.$b.$c.tsx
- benchmarks/ssr/scenarios/serialization/solid/src/routes/__root.tsx
- benchmarks/ssr/scenarios/global-middleware/vue/project.json
- benchmarks/ssr/scenarios/global-middleware/react/vite.config.ts
- benchmarks/ssr/scenarios/rewrites/solid/project.json
- benchmarks/ssr/scenarios/before-load/vue/src/routes/__root.tsx
- benchmarks/ssr/scenarios/serialization/solid/tsconfig.json
- benchmarks/ssr/scenarios/before-load/vue/src/router.tsx
- benchmarks/ssr/scenarios/global-middleware/vue/src/router.tsx
- benchmarks/ssr/scenarios/serialization/react/src/router.tsx
- benchmarks/ssr/scenarios/before-load/solid/src/routes/$a.$b.$c.tsx
- benchmarks/ssr/scenarios/global-middleware/react/src/routes/api.ping.$id.ts
- benchmarks/ssr/scenarios/global-middleware/react/src/routes/page.$id.tsx
- benchmarks/ssr/scenarios/rewrites/react/src/routes/p.$a.$b.tsx
- benchmarks/ssr/scenarios/before-load/vue/speed.bench.ts
- benchmarks/ssr/scenarios/global-middleware/vue/vite.config.ts
- benchmarks/ssr/scenarios/before-load/solid/src/router.tsx
- benchmarks/ssr/scenarios/global-middleware/vue/src/fns.ts
- benchmarks/ssr/scenarios/global-middleware/react/src/fns.ts
- benchmarks/ssr/scenarios/before-load/react/tsconfig.json
- benchmarks/ssr/scenarios/before-load/react/src/routes/$a.$b.tsx
- benchmarks/ssr/scenarios/rewrites/vue/vite.config.ts
- benchmarks/ssr/scenarios/control-flow/solid/src/routes/headers.$id.tsx
- benchmarks/ssr/scenarios/assets/react/src/server.ts
- benchmarks/ssr/scenarios/global-middleware/solid/src/start.ts
- benchmarks/ssr/scenarios/assets/react/src/routes/a.$x.$y.tsx
- benchmarks/ssr/scenarios/rewrites/solid/src/router.tsx
- benchmarks/ssr/scenarios/before-load/react/speed.bench.ts
- benchmarks/ssr/scenarios/serialization/shared-data.ts
- benchmarks/ssr/scenarios/serialization/solid/src/routes/plain.$id.tsx
- benchmarks/ssr/scenarios/assets/react/src/router.tsx
- benchmarks/ssr/scenarios/assets/react/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/assets/solid/speed.bench.ts
- benchmarks/ssr/scenarios/serialization/react/vite.config.ts
- benchmarks/ssr/scenarios/global-middleware/vue/speed.bench.ts
- benchmarks/ssr/scenarios/global-middleware/react/src/router.tsx
- benchmarks/ssr/scenarios/rewrites/vue/src/router.tsx
- benchmarks/ssr/scenarios/before-load/react/vite.config.ts
- benchmarks/ssr/scenarios/assets/shared.ts
- benchmarks/ssr/scenarios/global-middleware/solid/src/routes/page.$id.tsx
- benchmarks/ssr/scenarios/assets/react/src/routes/a.$x.tsx
- benchmarks/ssr/scenarios/global-middleware/vue/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/serialization/react/src/routes/plain.$id.tsx
- benchmarks/ssr/scenarios/control-flow/solid/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/global-middleware/react/speed.bench.ts
- benchmarks/ssr/scenarios/rewrites/solid/vite.config.ts
- benchmarks/ssr/scenarios/global-middleware/vue/src/routes/index.tsx
- benchmarks/ssr/scenarios/rewrites/react/src/routeTree.gen.ts
- benchmarks/ssr/scenarios/rewrites/solid/src/routes/p.$a.tsx
- benchmarks/ssr/scenarios/global-middleware/react/src/start.ts
- benchmarks/ssr/scenarios/global-middleware/react/src/routes/api.fn-urls.ts
- benchmarks/ssr/scenarios/serialization/react/tsconfig.json
- benchmarks/ssr/scenarios/rewrites/react/src/routes/p.$a.tsx
- benchmarks/ssr/scenarios/global-middleware/solid/src/fns.ts
- benchmarks/ssr/scenarios/before-load/shared-bench.ts
- benchmarks/ssr/scenarios/global-middleware/react/src/routes/index.tsx
- benchmarks/ssr/scenarios/rewrites/react/src/router.tsx
- benchmarks/ssr/scenarios/assets/vue/src/server.ts
- benchmarks/ssr/scenarios/serialization/react/src/routes/rich.$id.tsx
- benchmarks/ssr/scenarios/control-flow/vue/src/routes/headers.$id.tsx
- benchmarks/ssr/scenarios/global-middleware/shared.ts
- benchmarks/ssr/scenarios/rewrites/shared.ts
- benchmarks/ssr/scenarios/rewrites/vue/src/routes/p.$a.$b.tsx
- benchmarks/ssr/scenarios/global-middleware/react/project.json
- benchmarks/ssr/scenarios/assets/vue/speed.bench.ts
- benchmarks/ssr/scenarios/global-middleware/bench.ts
- benchmarks/ssr/scenarios/assets/solid/src/server.ts
- benchmarks/ssr/package.json
- benchmarks/ssr/scenarios/control-flow/solid/speed.bench.ts
- benchmarks/ssr/scenarios/control-flow/shared.ts
| beforeLoad: ({ params, context }) => { | ||
| const parent = context as BeforeLoadContext | ||
|
|
||
| return { | ||
| chainToken: `${parent.chainToken}.${params.c}`, | ||
| ctxC: params.c, | ||
| } | ||
| }, | ||
| loader: ({ context }) => ({ | ||
| marker: makeBeforeLoadMarker(context as BeforeLoadContext), | ||
| }), |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Verify parent/child beforeLoad context contract and current assertions
rg -n -C3 'beforeLoad|chainToken|BeforeLoadContext|as BeforeLoadContext' \
benchmarks/ssr/scenarios/before-load/vue/src/routes \
benchmarks/ssr/scenarios/before-load/shared.tsRepository: TanStack/router
Length of output: 4324
Replace as BeforeLoadContext casts with a narrowing guard for context.chainToken.
In benchmarks/ssr/scenarios/before-load/vue/src/routes/$a.$b.$c.tsx, beforeLoad and loader cast context to BeforeLoadContext, but BeforeLoadContext declares chainToken?: string. makeBeforeLoadMarker interpolates context.chainToken, so an unexpected/missing parent context contract would silently produce an incorrect marker. Narrow context once (e.g., type guard) before using it.
Proposed change
import { createFileRoute } from '`@tanstack/vue-router`'
import { makeBeforeLoadMarker, type BeforeLoadContext } from '../../../shared'
+function isBeforeLoadContext(value: unknown): value is BeforeLoadContext {
+ return (
+ typeof value === 'object' &&
+ value !== null &&
+ 'chainToken' in value &&
+ typeof (value as { chainToken: unknown }).chainToken === 'string'
+ )
+}
+
export const Route = createFileRoute('/$a/$b/$c')({
beforeLoad: ({ params, context }) => {
- const parent = context as BeforeLoadContext
+ if (!isBeforeLoadContext(context)) {
+ throw new Error('Missing chainToken in beforeLoad context')
+ }
return {
- chainToken: `${parent.chainToken}.${params.c}`,
+ chainToken: `${context.chainToken}.${params.c}`,
ctxC: params.c,
}
},
- loader: ({ context }) => ({
- marker: makeBeforeLoadMarker(context as BeforeLoadContext),
- }),
+ loader: ({ context }) => {
+ if (!isBeforeLoadContext(context)) {
+ throw new Error('Missing chainToken in loader context')
+ }
+
+ return {
+ marker: makeBeforeLoadMarker(context),
+ }
+ },
component: LevelCComponent,
})🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@benchmarks/ssr/scenarios/before-load/vue/src/routes/`$a.$b.$c.tsx around
lines 5 - 15, The current casts to BeforeLoadContext in beforeLoad and loader
are unsafe because BeforeLoadContext.chainToken is optional; replace the direct
casts with a runtime narrowing guard that checks typeof context?.chainToken ===
"string" before using it (e.g., in beforeLoad when building chainToken and ctxC,
and in loader before calling makeBeforeLoadMarker). If the guard fails, handle
the missing chainToken explicitly (throw a descriptive error or return a safe
default) rather than relying on the cast so makeBeforeLoadMarker always receives
a valid chainToken.
Source: Coding guidelines
Summary by CodeRabbit
New Features
Documentation
Chores