TanStack / TanStack/router

Start: the Vite plugin and `tsr generate` write different routeTree.gen.ts (Start footer added, then stripped)

Open
#8,437 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

enhancement
Dominant language
TypeScript
Stars
15.1k
Forks
1.9k
Avg merge
1d 20h
Merged PRs (30d)
143

Description

Which project does this relate to?

Start

Describe the bug

The TanStack Start Vite plugin and the Router CLI write different routeTree.gen.ts files for the same project, and the scaffold produced by tanstack create ships both.

The Start plugin (@tanstack/start-plugin-core, start-router-plugin/route-tree-footer.ts) appends a footer to the generated route tree:

import type { getRouter } from './router.tsx'
import type { createStart } from '@tanstack/react-start'
declare module '@tanstack/react-start' {
  interface Register {
    ssr: true
    router: Awaited<ReturnType<typeof getRouter>>
  }
}

tsr generate (@tanstack/router-cli) does not know about Start and writes the file without it. So every vite build or vite dev adds the nine lines and every tsr generate removes them. In a project that commits routeTree.gen.ts, the file flips on every run of whichever tool ran last.

The scaffold's router.tsx still carries declare module '@tanstack/react-router' { interface Register { router } }, which masks the problem for the router registration. The ssr: true registration has no such fallback: after tsr generate, RegisteredSsr is false, so the serialisable-loader-result check (ValidateSerializableLifecycleResult) silently degrades to any until the next Vite run puts the footer back.

Complete minimal reproducer

https://github.com/TheBinaryGuy/tanstack-start-tsr-footer-repro (the unmodified tanstack create output plus a repro script; bun install && bun run repro shows the diff after each step). Open in StackBlitz: https://stackblitz.com/github/TheBinaryGuy/tanstack-start-tsr-footer-repro

Steps to Reproduce the Bug
npx @tanstack/cli@latest create start-ref --framework React --package-manager bun --non-interactive --no-examples --no-toolchain --deployment nitro
cd start-ref
git add -A && git commit -qm scaffold
bun run build                 # Start plugin: routeTree.gen.ts gains the 9-line footer
git diff --stat src/routeTree.gen.ts
bun run generate-routes       # the scaffold's own `tsr generate` script: footer removed again
git diff --stat src/routeTree.gen.ts
bun run build                 # footer added again
git diff --stat src/routeTree.gen.ts

Observed with @tanstack/react-start 1.168.54, @tanstack/start-plugin-core 1.171.44, @tanstack/router-cli 1.167.36 (and the same with 1.168.49 / 1.171.39 / 1.167.33).

Expected behavior

Both generators produce the same file for a Start project. Either tsr generate reads the Start footer (for example by resolving it the same way the plugin does when @tanstack/react-start is present), or the scaffold does not ship a generate-routes script that undoes what its own build writes, and the Router CLI docs say it is not for Start projects.

Platform
  • OS: macOS 27.0 (arm64)
  • Bun 1.4.0, Node 24
  • Vite 7
Additional context

The Router CLI installation docs already say to use the CLI "only if you are not using a supported bundler", which suggests the fix may be on the scaffold and docs side rather than teaching the CLI about Start. A related report about the Start plugin overriding router generator configuration is #7768.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with start-router-plugin/route-tree-footer.ts and the scaffold's router.tsx and generate-routes script; use the linked minimal reproducer to compare routeTree.gen.ts after build and tsr generate. Check the Router CLI installation guidance and related issue #7768 before choosing the affected package. Done means a Start scaffold no longer flips routeTree.gen.ts between the two commands, with the documented workflow remaining consistent.

Written by the indexing model from the issue text.

Assessment

Tech stack
react, typescript, vite
Domain
build-system, developer-experience, tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Clearly specified
Newbie friendliness
58/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.