Skip to content

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

Description

@TheBinaryGuy

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions