Skip to content

chore(deps): upgrade Vitest to 5 and migrate benchmarks to the bench fixture - #8723

Merged
schiller-manuel merged 2 commits into
mainfrom
vitest-5
Oct 15, 2026
Merged

schiller-manuel merged 2 commits into
mainfrom
vitest-5

Conversation

@schiller-manuel

@schiller-manuel schiller-manuel commented Oct 15, 2026 •

Copy link
Copy Markdown
Collaborator

Why

On Node 25+/26, Vitest 4's jsdom environment keeps Node's native localStorage/sessionStorage globals while Storage is jsdom's (vitest-dev/vitest#10867). That fails router-core's scroll-restoration-lifecycle.test.ts on Node 26 and forced a --no-experimental-webstorage workaround in #8509. Vitest fixed this only in v5 (vitest-dev/vitest#10293). With this PR, the whole unit/type suite passes on Node 24.8.0 and 26.10.0 without that flag.

Changes

Dependencies

  • vitest / @vitest/ui → ^5.0.4 (catalog and the 4 examples that pin it)
  • @testing-library/jest-dom → ^7.0.1. 7.x declares vitest as a peer.
  • @codspeed/vitest-plugin → ^6.0.1, the first version with Vitest 5 support. This supersedes the plugin bump in bump node version to 26.10.0 #8509.

Temporary jest-dom workaround: remove after testing-library/jest-dom#742 is merged and released

Each package that uses jest-dom gets a jest-dom.setup.ts that:

  • calls expect.extend(matchers) from @testing-library/jest-dom/matchers. @testing-library/jest-dom/vitest imports vitest from its own location, which under pnpm peer variants can be a different vitest@5.0.4 copy. Vitest 5 bundles expect, so extending that copy broke rejects.toThrow in react-router.
  • augments Vitest 5's Matchers<R, T>. jest-dom 7.0.1 still augments Vitest 4's Assertion<T>, so every matcher fails typecheck.
  • keeps jest-dom in its file name. vite-plugin-solid skips injecting @testing-library/jest-dom/vitest only when a setup path contains it.

Other test-side migration

  • { sequential: true } → { concurrent: false } (option removed in v5).
  • Deleted solid-start-client/src/tests/createServerFn.test-d.tsx. It was fully commented out, and Vitest 5 fails empty suites.

Benchmarks (bench API rewrite)

  • All ~220 bench() files now use the bench test fixture.
  • CodSpeed URIs are unchanged. In the CodSpeed suites, the describe that owned the benches becomes a test with the same title, so the URIs stay file::<title>::<bench name>. I diffed all URIs from the client-nav (react/solid/vue), ssr, memory-client and memory-server React suites against the Vitest 4 runner: 94/94 identical.
  • Lifecycle: suite hooks are gone (the v5 provider calls only per-bench hooks).
    • The benchLifecycle() helper in benchmarks/cpu-simulation.ts keeps main's behavior. CodSpeed simulation/memory runs get a fresh app per invocation. Plain Tinybench runs keep one app per warmup/run phase (otherwise a single scenario took 268 s instead of ~11 s).
    • Memory suites use memoryBenchHooks(), which yields the turn and then prepares state per invocation.
    • Hydration's per-iteration Task-hook adapter is replaced by plain beforeEach/afterEach.
  • Bench functions must be async. CodSpeed's v5 provider awaits only AsyncFunctions; a plain arrow returning a promise would be measured only up to its first await. SSR arrows and memory-server run functions are now async.
  • --mode benchmark on every bench command. Vitest 4 ran benches in that Vite mode. Under v5's default test mode, vite-plugin-solid injects a jest-dom setup file that Solid benchmark packages cannot resolve.
  • Timeouts: benchmarks rely on Vitest 5's 60 s minimum timeout for benchmark tests. In this PR's CodSpeed CI run, the slowest of 194 instrumented benchmarks took 28.5 s (p95 17.3 s).
  • Top-level client-nav configs now set benchmark.include to their own speed.bench.ts. Vitest 5's default glob otherwise collected every framework's benches.
  • Docs: --outputJson → --reporter=json --outputFile, and lifecycle notes in the client-nav/memory READMEs and benchmarks/AGENTS.md.

Validation

  • test:unit + test:types for all 46 workspace projects (excluding examples/e2e): pass on Node 24.8.0 and Node 26.10.0 (Nx cache skipped)
  • test:eslint: pass
  • All 12 CodSpeed suites (client-nav/ssr in simulation mode, memory-client/memory-server in memory mode, × react/solid/vue): run through the CodSpeed 6.0.1 analysis provider with the expected bench counts
  • Plain vitest bench:
    • client-nav react: 15 benches, ~11.6 s each
    • ssr react, memory client/server react: pass
    • Link suite (-t filter): pass
    • router-core route-tree-construction (--testNamePattern): pass
  • Both search-validator-adapters examples: tests and typecheck pass

CodSpeed numbers should be unchanged except for the async wrapper on SSR and memory-server bench functions, which adds one promise adoption per invocation.

Follow-ups

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Bug Fixes

    • Updated test setup across packages and examples to keep DOM matchers available with the newer test runner.
    • Adjusted benchmark lifecycle handling so setup and cleanup run consistently across standard and performance-analysis runs.
  • Chores

    • Updated benchmark and workspace tooling to newer test-runner versions.
    • Migrated performance benchmarks to the test runner’s current benchmark format and updated benchmark commands and reporting instructions.

…fixture

Vitest 5 lets jsdom environments replace Node 25+'s native Web Storage
globals (vitest-dev/vitest#10293), which Vitest 4 left in place on Node 26.

- Bump vitest/@vitest/ui to ^5.0.4, @testing-library/jest-dom to ^7.0.1
  and @codspeed/vitest-plugin to ^6.0.1 (Vitest 5 support).
- Temporary jest-dom workaround until testing-library/jest-dom#742 ships:
  extend `expect` with the matchers directly and augment Vitest 5's
  `Matchers<R, T>`. `@testing-library/jest-dom/vitest` can bind a different
  Vitest copy under pnpm peer variants, which breaks `rejects.toThrow`.
- Replace the removed `sequential` suite option and delete a fully
  commented-out typecheck file that Vitest 5 rejects as empty.
- Rewrite all `bench()` files for the `bench` test fixture. CodSpeed suites
  turn the owning `describe` into a `test` with the same title, so every
  CodSpeed URI stays identical. Lifecycles move to per-bench hooks: suites
  that used suite hooks under CodSpeed keep fresh state per CodSpeed
  invocation, while Tinybench keeps one instance per warmup/run phase.
- Bench functions are `async`: CodSpeed's Vitest 5 provider only awaits
  AsyncFunctions.
- Run benchmarks with `--mode benchmark`, as Vitest 4 did, so
  vite-plugin-solid does not inject a jest-dom setup file, and give
  benchmark tests a 10 minute timeout for instrumented runs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@changeset-bot

changeset-bot Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 7eead0c

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
🔒 Security Review ✅ Completed 2026-10-15T15:38:12.553636Z ba052fd PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@coderabbitai

coderabbitai Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository: TanStack/router/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 33092304-6e90-4132-a158-1b4fb2785501
📥 Commits

Reviewing files that changed from the base of the PR and between 6777b8b and 7eead0c.

⛔ Files ignored due to path filters: 1
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing: 299
  • benchmarks/AGENTS.md
  • benchmarks/client-nav/README.md
  • benchmarks/client-nav/link-performance/client.bench.ts
  • benchmarks/client-nav/link-performance/project.json
  • benchmarks/client-nav/link-performance/ssr.bench.ts
  • benchmarks/client-nav/package.json
  • benchmarks/client-nav/react/speed.bench.ts
  • benchmarks/client-nav/react/vite.config.ts
  • benchmarks/client-nav/scenarios/async-pipeline/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/async-pipeline/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/async-pipeline/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/control-flow/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/control-flow/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/control-flow/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/head/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/head/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/head/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/history/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/history/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/history/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/hydration/react/hydration.test.ts
  • benchmarks/client-nav/scenarios/hydration/react/project.json
  • benchmarks/client-nav/scenarios/hydration/react/setup.ts
  • benchmarks/client-nav/scenarios/hydration/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/hydration/solid/hydration.test.ts
  • benchmarks/client-nav/scenarios/hydration/solid/project.json
  • benchmarks/client-nav/scenarios/hydration/solid/setup.ts
  • benchmarks/client-nav/scenarios/hydration/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/link-churn/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/link-churn/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/link-churn/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/links/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/links/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/links/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/loaders/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/loaders/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/loaders/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/mount/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/mount/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/mount/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/nested-params/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/nested-params/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/nested-params/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/preload/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/preload/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/preload/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/rewrites/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/rewrites/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/rewrites/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/route-tree-scale/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/route-tree-scale/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/route-tree-scale/vue/speed.bench.ts
  • benchmarks/client-nav/scenarios/search-params/react/speed.bench.ts
  • benchmarks/client-nav/scenarios/search-params/solid/speed.bench.ts
  • benchmarks/client-nav/scenarios/search-params/vue/speed.bench.ts
  • benchmarks/client-nav/solid/speed.bench.ts
  • benchmarks/client-nav/solid/vite.config.ts
  • benchmarks/client-nav/vue/speed.bench.ts
  • benchmarks/client-nav/vue/vite.config.ts
  • benchmarks/cpu-simulation.ts
  • benchmarks/memory/README.md
  • benchmarks/memory/client/bench-utils.ts
  • benchmarks/memory/client/benchmark.ts
  • benchmarks/memory/client/package.json
  • benchmarks/memory/client/scenarios/interrupted-navigations/react/memory.bench.ts
  • benchmarks/memory/client/scenarios/interrupted-navigations/solid/memory.bench.ts
  • benchmarks/memory/client/scenarios/interrupted-navigations/vue/memory.bench.ts
  • benchmarks/memory/client/scenarios/loader-data-retention/react/memory.bench.ts
  • benchmarks/memory/client/scenarios/loader-data-retention/solid/memory.bench.ts
  • benchmarks/memory/client/scenarios/loader-data-retention/vue/memory.bench.ts
  • benchmarks/memory/client/scenarios/mount-unmount/react/memory.bench.ts
  • benchmarks/memory/client/scenarios/mount-unmount/solid/memory.bench.ts
  • benchmarks/memory/client/scenarios/mount-unmount/vue/memory.bench.ts
  • benchmarks/memory/client/scenarios/navigation-churn/react/memory.bench.ts
  • benchmarks/memory/client/scenarios/navigation-churn/solid/memory.bench.ts
  • benchmarks/memory/client/scenarios/navigation-churn/vue/memory.bench.ts
  • benchmarks/memory/client/scenarios/preload-churn/react/memory.bench.ts
  • benchmarks/memory/client/scenarios/preload-churn/solid/memory.bench.ts
  • benchmarks/memory/client/scenarios/preload-churn/vue/memory.bench.ts
  • benchmarks/memory/client/scenarios/unique-location-churn/react/memory.bench.ts
  • benchmarks/memory/client/scenarios/unique-location-churn/solid/memory.bench.ts
  • benchmarks/memory/client/scenarios/unique-location-churn/vue/memory.bench.ts
  • benchmarks/memory/client/vitest.setup.ts
  • benchmarks/memory/runtime.ts
  • benchmarks/memory/server/bench-utils.ts
  • benchmarks/memory/server/benchmark.ts
  • benchmarks/memory/server/package.json
  • benchmarks/memory/server/scenarios/aborted-requests/react/memory.bench.ts
  • benchmarks/memory/server/scenarios/aborted-requests/shared.ts
  • benchmarks/memory/server/scenarios/aborted-requests/solid/memory.bench.ts
  • benchmarks/memory/server/scenarios/aborted-requests/vue/memory.bench.ts
  • benchmarks/memory/server/scenarios/error-paths/react/memory.bench.ts
  • benchmarks/memory/server/scenarios/error-paths/react/memory.error.bench.ts
  • benchmarks/memory/server/scenarios/error-paths/react/memory.not-found.bench.ts
  • benchmarks/memory/server/scenarios/error-paths/react/memory.unmatched.bench.ts
  • benchmarks/memory/server/scenarios/error-paths/shared.ts
  • benchmarks/memory/server/scenarios/error-paths/solid/memory.bench.ts
  • benchmarks/memory/server/scenarios/error-paths/solid/memory.error.bench.ts
  • benchmarks/memory/server/scenarios/error-paths/solid/memory.not-found.bench.ts
  • benchmarks/memory/server/scenarios/error-paths/solid/memory.unmatched.bench.ts
  • benchmarks/memory/server/scenarios/error-paths/vue/memory.bench.ts
  • benchmarks/memory/server/scenarios/error-paths/vue/memory.error.bench.ts
  • benchmarks/memory/server/scenarios/error-paths/vue/memory.not-found.bench.ts
  • benchmarks/memory/server/scenarios/error-paths/vue/memory.unmatched.bench.ts
  • benchmarks/memory/server/scenarios/peak-large-page/react/memory.bench.ts
  • benchmarks/memory/server/scenarios/peak-large-page/shared.ts
  • benchmarks/memory/server/scenarios/peak-large-page/solid/memory.bench.ts
  • benchmarks/memory/server/scenarios/peak-large-page/vue/memory.bench.ts
  • benchmarks/memory/server/scenarios/request-churn/react/memory.bench.ts
  • benchmarks/memory/server/scenarios/request-churn/shared.ts
  • benchmarks/memory/server/scenarios/request-churn/solid/memory.bench.ts
  • benchmarks/memory/server/scenarios/request-churn/vue/memory.bench.ts
  • benchmarks/memory/server/scenarios/serialization-payload/react/memory.bench.ts
  • benchmarks/memory/server/scenarios/serialization-payload/shared.ts
  • benchmarks/memory/server/scenarios/serialization-payload/solid/memory.bench.ts
  • benchmarks/memory/server/scenarios/serialization-payload/vue/memory.bench.ts
  • benchmarks/memory/server/scenarios/server-fn-churn/react/memory.bench.ts
  • benchmarks/memory/server/scenarios/server-fn-churn/shared.ts
  • benchmarks/memory/server/scenarios/server-fn-churn/solid/memory.bench.ts
  • benchmarks/memory/server/scenarios/server-fn-churn/vue/memory.bench.ts
  • benchmarks/memory/server/scenarios/streaming-peak/react/memory.bench.ts
  • benchmarks/memory/server/scenarios/streaming-peak/shared.ts
  • benchmarks/memory/server/scenarios/streaming-peak/solid/memory.bench.ts
  • benchmarks/memory/server/scenarios/streaming-peak/vue/memory.bench.ts
  • benchmarks/memory/server/vitest.setup.ts
  • benchmarks/memory/turn.ts
  • benchmarks/ssr/package.json
  • benchmarks/ssr/react/speed.bench.ts
  • benchmarks/ssr/scenarios/assets/react/speed.assets-linked-css-control.bench.ts
  • benchmarks/ssr/scenarios/assets/react/speed.bench.ts
  • benchmarks/ssr/scenarios/assets/solid/speed.assets-linked-css-control.bench.ts
  • benchmarks/ssr/scenarios/assets/solid/speed.bench.ts
  • benchmarks/ssr/scenarios/assets/vue/speed.assets-linked-css-control.bench.ts
  • benchmarks/ssr/scenarios/assets/vue/speed.bench.ts
  • benchmarks/ssr/scenarios/before-load/react/speed.bench.ts
  • benchmarks/ssr/scenarios/before-load/solid/speed.bench.ts
  • benchmarks/ssr/scenarios/before-load/vue/speed.bench.ts
  • benchmarks/ssr/scenarios/control-flow/react/speed.bench.ts
  • benchmarks/ssr/scenarios/control-flow/react/speed.control-flow-error-500.bench.ts
  • benchmarks/ssr/scenarios/control-flow/react/speed.control-flow-route-headers.bench.ts
  • benchmarks/ssr/scenarios/control-flow/react/speed.control-flow-unmatched-404.bench.ts
  • benchmarks/ssr/scenarios/control-flow/react/speed.not-found.bench.ts
  • benchmarks/ssr/scenarios/control-flow/solid/speed.bench.ts
  • benchmarks/ssr/scenarios/control-flow/solid/speed.control-flow-error-500.bench.ts
  • benchmarks/ssr/scenarios/control-flow/solid/speed.control-flow-route-headers.bench.ts
  • benchmarks/ssr/scenarios/control-flow/solid/speed.control-flow-unmatched-404.bench.ts
  • benchmarks/ssr/scenarios/control-flow/solid/speed.not-found.bench.ts
  • benchmarks/ssr/scenarios/control-flow/vue/speed.bench.ts
  • benchmarks/ssr/scenarios/control-flow/vue/speed.control-flow-error-500.bench.ts
  • benchmarks/ssr/scenarios/control-flow/vue/speed.control-flow-route-headers.bench.ts
  • benchmarks/ssr/scenarios/control-flow/vue/speed.control-flow-unmatched-404.bench.ts
  • benchmarks/ssr/scenarios/control-flow/vue/speed.not-found.bench.ts
  • benchmarks/ssr/scenarios/global-middleware/react/speed.bench.ts
  • benchmarks/ssr/scenarios/global-middleware/react/speed.global-mw-server-fn.bench.ts
  • benchmarks/ssr/scenarios/global-middleware/react/speed.global-mw-server-route-0-middleware.bench.ts
  • benchmarks/ssr/scenarios/global-middleware/react/speed.global-mw-server-route-1-middleware.bench.ts
  • benchmarks/ssr/scenarios/global-middleware/react/speed.global-mw-server-route-2-middleware.bench.ts
  • benchmarks/ssr/scenarios/global-middleware/react/speed.global-mw-server-route.bench.ts
  • benchmarks/ssr/scenarios/global-middleware/solid/speed.bench.ts
  • benchmarks/ssr/scenarios/global-middleware/solid/speed.global-mw-server-fn.bench.ts
  • benchmarks/ssr/scenarios/global-middleware/solid/speed.global-mw-server-route-0-middleware.bench.ts
  • benchmarks/ssr/scenarios/global-middleware/solid/speed.global-mw-server-route-1-middleware.bench.ts
  • benchmarks/ssr/scenarios/global-middleware/solid/speed.global-mw-server-route-2-middleware.bench.ts
  • benchmarks/ssr/scenarios/global-middleware/solid/speed.global-mw-server-route.bench.ts
  • benchmarks/ssr/scenarios/global-middleware/vue/speed.bench.ts
  • benchmarks/ssr/scenarios/global-middleware/vue/speed.global-mw-server-fn.bench.ts
  • benchmarks/ssr/scenarios/global-middleware/vue/speed.global-mw-server-route-0-middleware.bench.ts
  • benchmarks/ssr/scenarios/global-middleware/vue/speed.global-mw-server-route-1-middleware.bench.ts
  • benchmarks/ssr/scenarios/global-middleware/vue/speed.global-mw-server-route-2-middleware.bench.ts
  • benchmarks/ssr/scenarios/global-middleware/vue/speed.global-mw-server-route.bench.ts
  • benchmarks/ssr/scenarios/head/react/speed.bench.ts
  • benchmarks/ssr/scenarios/head/solid/speed.bench.ts
  • benchmarks/ssr/scenarios/head/vue/speed.bench.ts
  • benchmarks/ssr/scenarios/loaders/react/speed.bench.ts
  • benchmarks/ssr/scenarios/loaders/solid/speed.bench.ts
  • benchmarks/ssr/scenarios/loaders/vue/speed.bench.ts
  • benchmarks/ssr/scenarios/rewrites/react/speed.bench.ts
  • benchmarks/ssr/scenarios/rewrites/react/speed.rewrite-passthrough.bench.ts
  • benchmarks/ssr/scenarios/rewrites/solid/speed.bench.ts
  • benchmarks/ssr/scenarios/rewrites/solid/speed.rewrite-passthrough.bench.ts
  • benchmarks/ssr/scenarios/rewrites/vue/speed.bench.ts
  • benchmarks/ssr/scenarios/rewrites/vue/speed.rewrite-passthrough.bench.ts
  • benchmarks/ssr/scenarios/selective-ssr/react/speed.bench.ts
  • benchmarks/ssr/scenarios/selective-ssr/solid/speed.bench.ts
  • benchmarks/ssr/scenarios/selective-ssr/vue/speed.bench.ts
  • benchmarks/ssr/scenarios/serialization/react/speed.bench.ts
  • benchmarks/ssr/scenarios/serialization/react/speed.dehydrate-plain-control.bench.ts
  • benchmarks/ssr/scenarios/serialization/solid/speed.bench.ts
  • benchmarks/ssr/scenarios/serialization/solid/speed.dehydrate-plain-control.bench.ts
  • benchmarks/ssr/scenarios/serialization/vue/speed.bench.ts
  • benchmarks/ssr/scenarios/serialization/vue/speed.dehydrate-plain-control.bench.ts
  • benchmarks/ssr/scenarios/server-fn-transport/react/speed.bench.ts
  • benchmarks/ssr/scenarios/server-fn-transport/react/speed.server-fn-raw-response.bench.ts
  • benchmarks/ssr/scenarios/server-fn-transport/react/speed.server-fn-raw-stream.bench.ts
  • benchmarks/ssr/scenarios/server-fn-transport/solid/speed.bench.ts
  • benchmarks/ssr/scenarios/server-fn-transport/solid/speed.server-fn-raw-response.bench.ts
  • benchmarks/ssr/scenarios/server-fn-transport/solid/speed.server-fn-raw-stream.bench.ts
  • benchmarks/ssr/scenarios/server-fn-transport/vue/speed.bench.ts
  • benchmarks/ssr/scenarios/server-fn-transport/vue/speed.server-fn-raw-response.bench.ts
  • benchmarks/ssr/scenarios/server-fn-transport/vue/speed.server-fn-raw-stream.bench.ts
  • benchmarks/ssr/scenarios/server-fns/react/speed.bench.ts
  • benchmarks/ssr/scenarios/server-fns/react/speed.server-fn-during-document-ssr.bench.ts
  • benchmarks/ssr/scenarios/server-fns/react/speed.server-fn-not-found.bench.ts
  • benchmarks/ssr/scenarios/server-fns/react/speed.server-fn-post.bench.ts
  • benchmarks/ssr/scenarios/server-fns/react/speed.server-fn-redirect.bench.ts
  • benchmarks/ssr/scenarios/server-fns/react/speed.server-fn-send-context.bench.ts
  • benchmarks/ssr/scenarios/server-fns/solid/speed.bench.ts
  • benchmarks/ssr/scenarios/server-fns/solid/speed.server-fn-during-document-ssr.bench.ts
  • benchmarks/ssr/scenarios/server-fns/solid/speed.server-fn-not-found.bench.ts
  • benchmarks/ssr/scenarios/server-fns/solid/speed.server-fn-post.bench.ts
  • benchmarks/ssr/scenarios/server-fns/solid/speed.server-fn-redirect.bench.ts
  • benchmarks/ssr/scenarios/server-fns/solid/speed.server-fn-send-context.bench.ts
  • benchmarks/ssr/scenarios/server-fns/vue/speed.bench.ts
  • benchmarks/ssr/scenarios/server-fns/vue/speed.server-fn-during-document-ssr.bench.ts
  • benchmarks/ssr/scenarios/server-fns/vue/speed.server-fn-not-found.bench.ts
  • benchmarks/ssr/scenarios/server-fns/vue/speed.server-fn-post.bench.ts
  • benchmarks/ssr/scenarios/server-fns/vue/speed.server-fn-redirect.bench.ts
  • benchmarks/ssr/scenarios/server-fns/vue/speed.server-fn-send-context.bench.ts
  • benchmarks/ssr/scenarios/server-routes-middleware/react/speed.bench.ts
  • benchmarks/ssr/scenarios/server-routes-middleware/solid/speed.bench.ts
  • benchmarks/ssr/scenarios/server-routes-middleware/vue/speed.bench.ts
  • benchmarks/ssr/scenarios/server-routes/react/speed.bench.ts
  • benchmarks/ssr/scenarios/server-routes/solid/speed.bench.ts
  • benchmarks/ssr/scenarios/server-routes/vue/speed.bench.ts
  • benchmarks/ssr/scenarios/streaming/react/speed.bench.ts
  • benchmarks/ssr/scenarios/streaming/solid/speed.bench.ts
  • benchmarks/ssr/scenarios/streaming/vue/speed.bench.ts
  • benchmarks/ssr/solid/speed.bench.ts
  • benchmarks/ssr/vue/speed.bench.ts
  • examples/react/search-validator-adapters/package.json
  • examples/react/search-validator-adapters/tests/arktype.test.tsx
  • examples/react/search-validator-adapters/tests/jest-dom.setup.ts
  • examples/react/search-validator-adapters/tests/valibot.test.tsx
  • examples/react/search-validator-adapters/vite.config.ts
  • examples/react/start-bun/package.json
  • examples/solid/search-validator-adapters/package.json
  • examples/solid/search-validator-adapters/tests/arktype.test.tsx
  • examples/solid/search-validator-adapters/tests/jest-dom.setup.ts
  • examples/solid/search-validator-adapters/tests/valibot.test.tsx
  • examples/solid/search-validator-adapters/vite.config.ts
  • examples/solid/start-bun/package.json
  • packages/arktype-adapter/tests/index.test.tsx
  • packages/arktype-adapter/tests/jest-dom.setup.ts
  • packages/arktype-adapter/vite.config.ts
  • packages/react-router/tests/blocker.test.tsx
  • packages/react-router/tests/jest-dom.setup.ts
  • packages/react-router/tests/link.bench.tsx
  • packages/react-router/tests/setupTests.tsx
  • packages/react-router/tests/useBlocker.test.tsx
  • packages/react-router/tests/useNavigate.test.tsx
  • packages/react-router/vite.config.ts
  • packages/router-core/tests/build-location.bench.ts
  • packages/router-core/tests/cache-commit.bench.ts
  • packages/router-core/tests/cache-navigation.bench.ts
  • packages/router-core/tests/closing-tag-detection.bench.ts
  • packages/router-core/tests/deep-equal.bench.ts
  • packages/router-core/tests/fallback-route-lifecycle.bench.ts
  • packages/router-core/tests/hydrationQueue.bench.ts
  • packages/router-core/tests/lightweight-location.bench.ts
  • packages/router-core/tests/matching-interpolation.bench.ts
  • packages/router-core/tests/new-process-route-tree.test.ts
  • packages/router-core/tests/path-decoder.bench.ts
  • packages/router-core/tests/path-interpolation.bench.ts
  • packages/router-core/tests/replace-equal-deep.bench.ts
  • packages/router-core/tests/rewrite.bench.ts
  • packages/router-core/tests/route-tree-construction.bench.ts
  • packages/router-core/tests/searchParams-parse.bench.ts
  • packages/router-core/tests/searchParams.bench.ts
  • packages/router-core/tests/ssr-match-id.bench.ts
  • packages/router-ssr-query-core/tests/dehydrate.bench.ts
  • packages/router-ssr-query-core/tests/server-lifecycle.bench.ts
  • packages/solid-router/tests/blocker.test.tsx
  • packages/solid-router/tests/jest-dom.setup.ts
  • packages/solid-router/tests/link.bench.tsx
  • packages/solid-router/tests/setupTests.tsx
  • packages/solid-router/tests/useBlocker.test.tsx
  • packages/solid-router/tests/useNavigate.test.tsx
  • packages/solid-router/vite.config.ts
  • packages/solid-start-client/src/tests/createServerFn.test-d.tsx
  • packages/solid-start-client/src/tests/jest-dom.setup.ts
  • packages/solid-start-client/src/tests/setupTests.tsx
  • packages/solid-start-client/vite.config.ts
  • packages/start-client-core/tests/function-middleware.bench.ts
  • packages/start-server-core/tests/response-reconciliation.bench.md
  • packages/start-server-core/tests/response-reconciliation.bench.ts
  • packages/valibot-adapter/tests/index.test.tsx
  • packages/valibot-adapter/tests/jest-dom.setup.ts
  • packages/valibot-adapter/vite.config.ts
  • packages/vue-router/tests/blocker.test.tsx
  • packages/vue-router/tests/jest-dom.setup.ts
  • packages/vue-router/tests/link.bench.tsx
  • packages/vue-router/tests/setupTests.tsx
  • packages/vue-router/tests/useBlocker.test.tsx
  • packages/vue-router/tests/useNavigate.test.tsx
  • packages/vue-router/vite.config.ts
  • packages/zod-adapter/tests/index.test.tsx
  • packages/zod-adapter/tests/jest-dom.setup.ts
  • packages/zod-adapter/vite.config.ts
  • pnpm-workspace.yaml
💤 Files with no reviewable changes: 26
  • packages/react-router/tests/useBlocker.test.tsx
  • packages/react-router/tests/useNavigate.test.tsx
  • benchmarks/memory/server/vitest.setup.ts
  • examples/react/search-validator-adapters/tests/arktype.test.tsx
  • benchmarks/memory/client/vitest.setup.ts
  • examples/react/search-validator-adapters/tests/valibot.test.tsx
  • benchmarks/client-nav/scenarios/hydration/solid/setup.ts
  • examples/solid/search-validator-adapters/tests/arktype.test.tsx
  • packages/solid-start-client/src/tests/setupTests.tsx
  • packages/solid-router/tests/blocker.test.tsx
  • examples/solid/search-validator-adapters/tests/valibot.test.tsx
  • packages/arktype-adapter/tests/index.test.tsx
  • benchmarks/client-nav/scenarios/hydration/react/hydration.test.ts
  • packages/react-router/tests/blocker.test.tsx
  • packages/solid-router/tests/useBlocker.test.tsx
  • packages/vue-router/tests/setupTests.tsx
  • packages/vue-router/tests/blocker.test.tsx
  • packages/vue-router/tests/useNavigate.test.tsx
  • packages/solid-router/tests/setupTests.tsx
  • packages/solid-start-client/src/tests/createServerFn.test-d.tsx
  • packages/react-router/tests/setupTests.tsx
  • packages/solid-router/tests/useNavigate.test.tsx
  • benchmarks/client-nav/scenarios/hydration/react/setup.ts
  • packages/valibot-adapter/tests/index.test.tsx
  • packages/vue-router/tests/useBlocker.test.tsx
  • packages/zod-adapter/tests/index.test.tsx

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.

📝 Walkthrough

The pull request updates benchmark registration and lifecycle handling across benchmark suites. It also updates Vitest and jest-dom setup across tests, including dependency ranges and benchmark commands.

Changes: Benchmark migration

Layer / File(s) Summary
Client-navigation lifecycle and commands
benchmarks/cpu-simulation.ts, benchmarks/client-nav/*
Client-navigation benchmarks use test-scoped benchmark callbacks and shared lifecycle handling. Commands specify benchmark mode, and framework configurations add benchmark discovery entries.
Memory benchmark hooks and workloads
benchmarks/memory/*
Memory benchmarks use memoryBenchHooks; server workload runners are declared async. Client and server setup behavior is adjusted.
SSR and package benchmarks
benchmarks/ssr/*, packages/*/tests/*.bench.ts, packages/start-*/tests/*.bench.ts
Benchmark registrations move to Vitest test callbacks and the provided bench fixture. Existing benchmark workloads and settings are generally retained.
Benchmark guidance
benchmarks/AGENTS.md, benchmarks/client-nav/README.md, benchmarks/memory/README.md, packages/start-server-core/tests/response-reconciliation.bench.md
Documentation updates benchmark mode, lifecycle hooks, async workload requirements, and JSON report commands.

Vitest 5 test setup

Layer / File(s) Summary
jest-dom matcher setup
examples/*/search-validator-adapters/*, packages/*/tests/jest-dom.setup.ts, packages/*/vite.config.ts, packages/*/tests/*test.tsx
Dedicated setup files extend Vitest’s expect with jest-dom matchers and add matcher type augmentations. Vitest configurations load the setup files, replacing test-file imports.
Dependency and test configuration updates
pnpm-workspace.yaml, examples/*/package.json, benchmarks/*/package.json, packages/router-core/tests/new-process-route-tree.test.ts
Vitest and jest-dom version ranges are updated, CodSpeed’s Vitest plugin is upgraded, and performance commands add benchmark mode. The route-mask test disables concurrency.

Priority: ⬇️ Low

Estimated code review effort: 4 (Complex) | ~60 minutes

Merge Risk: ⚪ Minimal · up to 7eead

This change upgrades the test and benchmark tooling to Vitest 5 and migrates the benchmarks to the new benchmark API. Product runtime code is not affected. No outstanding defects were identified.

Pre-merge checks: Passed 4 · Inconclusive 1

Failed Failed checks: 1 inconclusive

Check name Status Explanation Resolution
Docstring Coverage Inconclusive Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 2 functions across 50 files. (223 skipped:… Write docstrings for the functions missing them to satisfy the coverage threshold.
Passed Passed checks: 4 passed
Check name Status Explanation
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Title check Passed The title clearly identifies the two main changes: upgrading Vitest to 5 and migrating benchmarks to the bench fixture. It is concise and specific.
Description check Passed The description is detailed and directly covers the motivation, dependency changes, benchmark migration, validation results, follow-ups, and AI authorship. It does not reproduce the template's exact C…
Full details: Docstring Coverage

Explanation

Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 2 functions across 50 files. (223 skipped: 16 unsupported, 207 over the file limit.)

✨ Finishing Touches: 💡 2
📝 Generate docstrings: 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
🛠️ Fix failing CI checks: 💡
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@nx-cloud

nx-cloud Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

View your CI Pipeline Execution ↗ for commit 7eead0c

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

☁️ Nx Cloud last updated this comment at 2026-10-15 21:43:32 UTC

@socket-security

socket-security Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Added@​vitest/​ui@​5.0.4991007598100
Addedvitest@​5.0.4981007998100
Added@​testing-library/​jest-dom@​7.0.110010010091100
Updated@​codspeed/​vitest-plugin@​5.7.1 ⏵ 6.0.1100 +3100100 +396100

View full report

@github-actions

Copy link
Copy Markdown
Contributor

🚀 Changeset Version Preview

No changeset entries found. Merging this PR will not cause a version bump for any packages.

@github-actions

Copy link
Copy Markdown
Contributor

Bundle Size Benchmarks

This pull request does not affect bundle size in any measured scenario.

@pkg-pr-new

pkg-pr-new Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
More templates

@tanstack/arktype-adapter

npm i https://pkg.pr.new/@tanstack/arktype-adapter@8723

@tanstack/eslint-plugin-router

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

@tanstack/eslint-plugin-start

npm i https://pkg.pr.new/@tanstack/eslint-plugin-start@8723

@tanstack/history

npm i https://pkg.pr.new/@tanstack/history@8723

@tanstack/react-router

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

@tanstack/react-router-devtools

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

@tanstack/react-router-ssr-query

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

@tanstack/react-start

npm i https://pkg.pr.new/@tanstack/react-start@8723

@tanstack/react-start-client

npm i https://pkg.pr.new/@tanstack/react-start-client@8723

@tanstack/react-start-rsc

npm i https://pkg.pr.new/@tanstack/react-start-rsc@8723

@tanstack/react-start-server

npm i https://pkg.pr.new/@tanstack/react-start-server@8723

@tanstack/router-cli

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

@tanstack/router-core

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

@tanstack/router-devtools

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

@tanstack/router-devtools-core

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

@tanstack/router-generator

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

@tanstack/router-plugin

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

@tanstack/router-ssr-query-core

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

@tanstack/router-utils

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

@tanstack/router-vite-plugin

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

@tanstack/solid-router

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

@tanstack/solid-router-devtools

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

@tanstack/solid-router-ssr-query

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

@tanstack/solid-start

npm i https://pkg.pr.new/@tanstack/solid-start@8723

@tanstack/solid-start-client

npm i https://pkg.pr.new/@tanstack/solid-start-client@8723

@tanstack/solid-start-server

npm i https://pkg.pr.new/@tanstack/solid-start-server@8723

@tanstack/start-client-core

npm i https://pkg.pr.new/@tanstack/start-client-core@8723

@tanstack/start-fn-stubs

npm i https://pkg.pr.new/@tanstack/start-fn-stubs@8723

@tanstack/start-plugin-core

npm i https://pkg.pr.new/@tanstack/start-plugin-core@8723

@tanstack/start-server-core

npm i https://pkg.pr.new/@tanstack/start-server-core@8723

@tanstack/start-static-server-functions

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

@tanstack/start-storage-context

npm i https://pkg.pr.new/@tanstack/start-storage-context@8723

@tanstack/valibot-adapter

npm i https://pkg.pr.new/@tanstack/valibot-adapter@8723

@tanstack/virtual-file-routes

npm i https://pkg.pr.new/@tanstack/virtual-file-routes@8723

@tanstack/vue-router

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

@tanstack/vue-router-devtools

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

@tanstack/vue-router-ssr-query

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

@tanstack/vue-start

npm i https://pkg.pr.new/@tanstack/vue-start@8723

@tanstack/vue-start-client

npm i https://pkg.pr.new/@tanstack/vue-start-client@8723

@tanstack/vue-start-server

npm i https://pkg.pr.new/@tanstack/vue-start-server@8723

@tanstack/zod-adapter

npm i https://pkg.pr.new/@tanstack/zod-adapter@8723

commit: 7eead0c

@codspeed

codspeed Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Merging this PR will degrade performance by 3.28%

ℹ️ 3 benchmarks have no flame graph

The flamegraph could not be generated because too much time was spent in runtime internals, making the visualization not useful for performance analysis.

⚠️ Different runtime environments detected

Some benchmarks with significant performance changes were compared across different runtime environments,
which may affect the accuracy of the results.

Open the report in CodSpeed to investigate

#### 🎉 Hooray! `codspeed-node` just leveled up to 6.0.1!

A heads-up, this is a breaking change and it might affect your current performance baseline a bit. But here's the exciting part - it's packed with new, cool features and promises improved result stability 🥳!
Curious about what's new? Visit our releases page to delve into all the awesome details about this new version.

⚡ 7 improved benchmarks
❌ 27 regressed benchmarks
✅ 160 untouched benchmarks
⏩ 3 skipped benchmarks1

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
❌ Memory mem server server-fn-churn (react) 65.3 KB 77.1 KB -15.22%
❌ Simulation ssr request loop (react) 144.4 ms 160.7 ms -10.14%
❌ Memory mem server error-paths redirect (react) 10.8 KB 12.1 KB -10.11%
❌ Memory mem client unique-location-churn (react) 71.8 KB 78.2 KB -8.21%
❌ Simulation ssr redirect (react) 100.4 ms 108.7 ms -7.64%
❌ Simulation ssr global-mw server-route 0 middleware (react) 143.8 ms 152.5 ms -5.66%
❌ Simulation ssr rewrite passthrough (react) 154.9 ms 163.9 ms -5.5%
❌ Simulation ssr server-route (react) 109.5 ms 115.8 ms -5.48%
❌ Simulation ssr global-mw server-route 1 middleware (react) 156.8 ms 165.5 ms -5.25%
❌ Simulation ssr global-mw server-route 3 middlewares (react) 161.8 ms 170.6 ms -5.16%
❌ Simulation ssr control-flow route headers (react) 230.5 ms 242.9 ms -5.12%
❌ Simulation ssr rewrite localized (react) 162.3 ms 171 ms -5.09%
❌ Simulation ssr global-mw server-route 2 middlewares (react) 159.4 ms 167.9 ms -5.03%
❌ Simulation ssr global-mw document (react) 225.4 ms 236.9 ms -4.87%
❌ Simulation ssr control-flow unmatched 404 (react) 183.6 ms 192.9 ms -4.85%
❌ Simulation ssr not-found (react) 139.8 ms 146.6 ms -4.65%
❌ Simulation ssr server-route middleware (react) 102.6 ms 107.6 ms -4.65%
❌ Simulation ssr server-fn during document ssr (react) 170.4 ms 178.7 ms -4.63%
❌ Simulation ssr control-flow error 500 (react) 175.3 ms 182.7 ms -4.05%
❌ Simulation ssr before-load chain (react) 141.4 ms 147.3 ms -4.01%
... ... ... ... ... ...

ℹ️ Only the first 20 benchmarks are displayed. Go to the app to view all benchmarks.

Tip

Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.


Comparing vitest-5 (7eead0c) with main (6777b8b)

Open in CodSpeed

Footnotes

  1. 3 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports. ↩

Comment thread benchmarks/cpu-simulation.ts Outdated
Vitest 5 already gives benchmark tests at least a 60 s timeout. In this
PR's CodSpeed CI run, the slowest of 194 instrumented benchmark tests took
28.5 s (p95 17.3 s, median 7.7 s), and plain Tinybench runs stay around
10-15 s, so the default floor covers every suite and still catches a hung
benchmark.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@schiller-manuel
schiller-manuel merged commit 7a06725 into main Oct 15, 2026
29 of 30 checks passed
@schiller-manuel
schiller-manuel deleted the vitest-5 branch October 15, 2026 22:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants