TanStack / TanStack/cli

[Bug] --router-only main.tsx ignores getRouter() from router.tsx (router.tsx becomes dead code + duplicate Register declaration)

Offen
#480 1 Kommentar 2 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
TypeScript
Sterne
1.3k
Forks
185
Ø Merge
18 Std. 45 Min.
Gemergte PRs (30 T.)
2

Beschreibung

Which project does this relate to?

Create Tanstack App

Describe the bug

When scaffolding a Router-only SPA (create --router-only), the generated src/router.tsx exports a getRouter() factory, but the generated src/main.tsx does not use it. Instead, main.tsx builds its own router inline with createRouter(...).

As a result:

  1. router.tsx / getRouter() is dead code - nothing imports it anywhere in a --router-only project.
  2. The declare module '@tanstack/react-router' { interface Register { ... } } block is duplicated in both main.tsx (router: typeof router) and router.tsx (router: ReturnType<typeof getRouter>).

In the default (TanStack Start) mode this is fine because Start consumes getRouter() from router.tsx as the entry, and main.tsx is not generated. But in --router-only mode the two files diverge and router.tsx is left orphaned.

Your Example Website or App

pnpx @tanstack/cli create --router-only

Steps to Reproduce the Bug or Issue
  1. pnpx @tanstack/cli create --router-only
  2. Open src/main.tsx and src/router.tsx
  3. Grep the project for getRouter -> only defined in router.tsx, never imported
    (No StackBlitz needed - this is reproducible purely from the CLI output.)
Expected behavior

In --router-only mode, main.tsx should import and use getRouter() from router.tsx, and the Register module augmentation should live in a single place (router.tsx). Something like:

import ReactDOM from 'react-dom/client'
import { RouterProvider } from '@tanstack/react-router'
import { getRouter } from './router'

const router = getRouter()

const rootElement = document.getElementById('app')!

if (!rootElement.innerHTML) {
  const root = ReactDOM.createRoot(rootElement)
  root.render(<RouterProvider router={router} />)
}

This keeps a single source of truth for router configuration across both Start and Router-only modes, removes the dead getRouter(), and removes the duplicate Register declaration.

Screenshots or Videos

No response

Platform
  • OS: macOS
  • @tanstack/cli: 0.69.5
Additional context
  • packages/create/src/frameworks/react/project/base/src/main.tsx.ejs
  • Line 1: <% if (!routerOnly) { ignoreFile() } %> -> only emitted for router-only
  • Lines 6-16: creates its own router + declares Register instead of importing getRouter
  • packages/create/src/frameworks/react/project/base/src/router.tsx.ejs
  • No ignoreFile() guard -> always emitted, exports getRouter() + declares Register

The Solid templates have an identical structure:

  • packages/create/src/frameworks/solid/project/base/src/main.tsx.ejs
  • packages/create/src/frameworks/solid/project/base/src/router.tsx.ejs

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit packages/create/src/frameworks/react/project/base/src/main.tsx.ejs und router.tsx.ejs und vergleiche anschließend die entsprechenden Solid-Templates. Führe die CLI mit --router-only aus und prüfe die generierten Dateien; abgeschlossen ist die Aufgabe, wenn main.tsx getRouter() verwendet und die Router-Konfiguration sowie die Register-Deklaration im generierten Projekt nicht mehr dupliziert sind.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
typescript
Bereich
cli, tooling
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Ruhig
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
76/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.