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:
importReactDOMfrom'react-dom/client'import{RouterProvider}from'@tanstack/react-router'import{getRouter}from'./router'constrouter=getRouter()constrootElement=document.getElementById('app')!if(!rootElement.innerHTML){constroot=ReactDOM.createRoot(rootElement)root.render(<RouterProviderrouter={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.ejspackages/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