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:
router.tsx / getRouter() is dead code - nothing imports it anywhere in a --router-only project.
- 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
pnpx @tanstack/cli create --router-only
- Open
src/main.tsx and src/router.tsx
- 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
Which project does this relate to?
Create Tanstack App
Describe the bug
When scaffolding a Router-only SPA (
create --router-only), the generatedsrc/router.tsxexports agetRouter()factory, but the generatedsrc/main.tsxdoes not use it. Instead,main.tsxbuilds its own router inline withcreateRouter(...).As a result:
router.tsx/getRouter()is dead code - nothing imports it anywhere in a--router-onlyproject.declare module '@tanstack/react-router' { interface Register { ... } }block is duplicated in bothmain.tsx(router: typeof router) androuter.tsx(router: ReturnType<typeof getRouter>).In the default (TanStack Start) mode this is fine because Start consumes
getRouter()fromrouter.tsxas the entry, andmain.tsxis not generated. But in--router-onlymode the two files diverge androuter.tsxis left orphaned.Your Example Website or App
pnpx @tanstack/cli create --router-only
Steps to Reproduce the Bug or Issue
pnpx @tanstack/cli create --router-onlysrc/main.tsxandsrc/router.tsxgetRouter-> only defined inrouter.tsx, never imported(No StackBlitz needed - this is reproducible purely from the CLI output.)
Expected behavior
In
--router-onlymode,main.tsxshould import and usegetRouter()fromrouter.tsx, and theRegistermodule augmentation should live in a single place (router.tsx). Something like:This keeps a single source of truth for router configuration across both Start and Router-only modes, removes the dead
getRouter(), and removes the duplicateRegisterdeclaration.Screenshots or Videos
No response
Platform
Additional context
packages/create/src/frameworks/react/project/base/src/main.tsx.ejs<% if (!routerOnly) { ignoreFile() } %>-> only emitted for router-onlyrouter+ declaresRegisterinstead of importinggetRouterpackages/create/src/frameworks/react/project/base/src/router.tsx.ejsignoreFile()guard -> always emitted, exportsgetRouter()+ declaresRegisterThe Solid templates have an identical structure:
packages/create/src/frameworks/solid/project/base/src/main.tsx.ejspackages/create/src/frameworks/solid/project/base/src/router.tsx.ejs