v3: Cannot build TanStack Start pnpm monorepo in SPA mode with Nitro
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 11.2k
- Forks
- 899
- Avg merge
- 2d 24m
- Merged PRs (30d)
- 40
Description
Environment
node: 22.18.0
nitro: nitro-nightly@3.0.1-20251105-152910-c0ee44bf
Reproduction
https://github.com/rohanajayjain/ts-start-bug
Describe the bug
Trying to build in a pnpm monorepo using TanStack Start and Better Auth in SPA mode with nitro fails.
This seems to be specifically a nitro related issue as building without the nitro plugin works.
With SPA mode disabled, nitro can build the code without errors. We can then run node --env-file=.env .output/server/index.mjs as well without issue.
I've tried without adding ssr: { external: ["pg"] } and with it and get different logs (included below).
Without adding ssr: { external: ["pg"] }, we get ReferenceError: Cannot access 'pg' before initialization.
With [ssr](ssr: { external: ["pg"] }), we get Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'pg' imported from /home/codebench/Dev/ts-start-bug/apps/web/.nitro/vite/services/ssr/assets/router-w0xdFAbu.js
Did you mean to import "pg/lib/index.js"?
Additional context
No response
Logs
When ssr external isn't set:
codebench@codebench:~/Dev/ts-start-bug/apps/web$ pnpm build
> web@0.0.1 build /home/codebench/Dev/ts-start-bug/apps/web
> vite build
vite v7.2.0 building client environment for production...
✓ 204 modules transformed.
.output/public/assets/index-DtR-hLxC.js 0.66 kB │ gzip: 0.41 kB
.output/public/assets/main-Dh3ZPKv-.js 352.12 kB │ gzip: 111.39 kB
✓ built in 977ms
vite v7.2.0 building ssr environment for production...
✓ 767 modules transformed.
.nitro/vite/services/ssr/assets/start-HYkvq4Ni.js 0.06 kB
.nitro/vite/services/ssr/assets/_tanstack-start-manifest_v-B07cSHf9.js 0.45 kB
.nitro/vite/services/ssr/assets/index-DndBZZAl.js 1.37 kB
.nitro/vite/services/ssr/assets/bun-sqlite-dialect-B2O0-0JW-DZaXpg95.js 4.72 kB
.nitro/vite/services/ssr/assets/node-sqlite-dialect-5DWxxNaH-CXgDQ1bH.js 4.74 kB
.nitro/vite/services/ssr/assets/index-n0yJTA-g.js 6.41 kB
.nitro/vite/services/ssr/assets/index-y4iGJYqZ.js 8.27 kB
.nitro/vite/services/ssr/server.js 116.39 kB
.nitro/vite/services/ssr/assets/router-ugILWlS3.js 1,819.28 kB
✓ built in 2.08s
[prerender] Prerendering pages...
[prerender] Concurrency: 8
[prerender] Crawling: /
ReferenceError: Cannot access 'pg' before initialization
at get default (file:///home/codebench/Dev/ts-start-bug/apps/web/.nitro/vite/services/ssr/assets/router-ugILWlS3.js:59:5)
... 8 lines matching cause stack trace ...
at async file:///home/codebench/Dev/ts-start-bug/node_modules/.pnpm/@tanstack+start-plugin-core@1.134.12_@tanstack+react-router@1.134.12_react-dom@19.2.0_r_967f5b275724ce77a0f689c31de802f9/node_modules/@tanstack/start-plugin-core/dist/esm/queue.js:38:17 {
cause: ReferenceError: Cannot access 'pg' before initialization
at get default (file:///home/codebench/Dev/ts-start-bug/apps/web/.nitro/vite/services/ssr/assets/router-ugILWlS3.js:59:5)
at getAugmentedNamespace (file:///home/codebench/Dev/ts-start-bug/apps/web/.nitro/vite/services/ssr/assets/router-ugILWlS3.js:47956:13)
at file:///home/codebench/Dev/ts-start-bug/apps/web/.nitro/vite/services/ssr/assets/router-ugILWlS3.js:52097:36
at ModuleJob.run (node:internal/modules/esm/module_job:343:25)
at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:647:26)
at async getEntries (file:///home/codebench/Dev/ts-start-bug/apps/web/.nitro/vite/services/ssr/server.js:3263:21)
at async startRequestResolver (file:///home/codebench/Dev/ts-start-bug/apps/web/.nitro/vite/services/ssr/server.js:3320:33)
at async localFetch (file:///home/codebench/Dev/ts-start-bug/node_modules/.pnpm/@tanstack+start-plugin-core@1.134.12_@tanstack+react-router@1.134.12_react-dom@19.2.0_r_967f5b275724ce77a0f689c31de802f9/node_modules/@tanstack/start-plugin-core/dist/esm/prerender.js:63:22)
at async file:///home/codebench/Dev/ts-start-bug/node_modules/.pnpm/@tanstack+start-plugin-core@1.134.12_@tanstack+react-router@1.134.12_react-dom@19.2.0_r_967f5b275724ce77a0f689c31de802f9/node_modules/@tanstack/start-plugin-core/dist/esm/prerender.js:125:23
at async file:///home/codebench/Dev/ts-start-bug/node_modules/.pnpm/@tanstack+start-plugin-core@1.134.12_@tanstack+react-router@1.134.12_react-dom@19.2.0_r_967f5b275724ce77a0f689c31de802f9/node_modules/@tanstack/start-plugin-core/dist/esm/queue.js:38:17,
status: 500,
statusText: undefined,
headers: undefined,
data: undefined,
body: undefined,
unhandled: true
}
[prerender] Prerendered 0 pages:
[sitemap] Hint: Pages found, but no sitemap host has been set. To enable sitemap generation, set the `sitemap.host` option.
[nitro 10:56:32 am] ◐ Building [Nitro] (preset: node-server, compatibility: 2025-11-06)
file:///home/codebench/Dev/ts-start-bug/node_modules/.pnpm/@tanstack+start-plugin-core@1.134.12_@tanstack+react-router@1.134.12_react-dom@19.2.0_r_967f5b275724ce77a0f689c31de802f9/node_modules/@tanstack/start-plugin-core/dist/esm/prerender.js:138
throw new Error(`Failed to fetch ${page.path}: ${res.statusText}`, {
^
Error: Failed to fetch /: Internal Server Error
at file:///home/codebench/Dev/ts-start-bug/node_modules/.pnpm/@tanstack+start-plugin-core@1.134.12_@tanstack+react-router@1.134.12_react-dom@19.2.0_r_967f5b275724ce77a0f689c31de802f9/node_modules/@tanstack/start-plugin-core/dist/esm/prerender.js:138:19
at async file:///home/codebench/Dev/ts-start-bug/node_modules/.pnpm/@tanstack+start-plugin-core@1.134.12_@tanstack+react-router@1.134.12_react-dom@19.2.0_r_967f5b275724ce77a0f689c31de802f9/node_modules/@tanstack/start-plugin-core/dist/esm/queue.js:38:17 {
[cause]: NodeResponse$1 [Response] {}
}
Node.js v22.18.0
ELIFECYCLE Command failed with exit code 1.`
---
With ssr external with ['pg']:
codebench@codebench:~/Dev/ts-start-bug/apps/web$ pnpm build
> web@0.0.1 build /home/codebench/Dev/ts-start-bug/apps/web
> vite build
vite v7.2.0 building client environment for production...
✓ 204 modules transformed.
.output/public/assets/index-DtR-hLxC.js 0.66 kB │ gzip: 0.41 kB
.output/public/assets/main-Dh3ZPKv-.js 352.12 kB │ gzip: 111.39 kB
✓ built in 993ms
vite v7.2.0 building ssr environment for production...
✓ 685 modules transformed.
.nitro/vite/services/ssr/assets/start-HYkvq4Ni.js 0.06 kB
.nitro/vite/services/ssr/assets/_tanstack-start-manifest_v-B07cSHf9.js 0.45 kB
.nitro/vite/services/ssr/assets/index-XYXuMfZ2.js 1.23 kB
.nitro/vite/services/ssr/assets/bun-sqlite-dialect-B2O0-0JW-C9efU9gy.js 4.57 kB
.nitro/vite/services/ssr/assets/node-sqlite-dialect-5DWxxNaH-B2JIiB1Z.js 4.59 kB
.nitro/vite/services/ssr/assets/index-DP2UTXPC.js 6.26 kB
.nitro/vite/services/ssr/assets/index-Dv7V5yx9.js 8.12 kB
.nitro/vite/services/ssr/server.js 116.39 kB
.nitro/vite/services/ssr/assets/router-w0xdFAbu.js 1,653.52 kB
✓ built in 1.86s
[prerender] Prerendering pages...
[prerender] Concurrency: 8
[prerender] Crawling: /
Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'pg' imported from /home/codebench/Dev/ts-start-bug/apps/web/.nitro/vite/services/ssr/assets/router-w0xdFAbu.js
Did you mean to import "pg/lib/index.js"?
at Object.getPackageJSONURL (node:internal/modules/package_json_reader:255:9)
... 7 lines matching cause stack trace ...
at ModuleJob._link (node:internal/modules/esm/module_job:183:49) {
cause: Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'pg' imported from /home/codebench/Dev/ts-start-bug/apps/web/.nitro/vite/services/ssr/assets/router-w0xdFAbu.js
Did you mean to import "pg/lib/index.js"?
at Object.getPackageJSONURL (node:internal/modules/package_json_reader:255:9)
at packageResolve (node:internal/modules/esm/resolve:767:81)
at moduleResolve (node:internal/modules/esm/resolve:853:18)
at defaultResolve (node:internal/modules/esm/resolve:983:11)
at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:783:12)
at #cachedDefaultResolve (node:internal/modules/esm/loader:707:25)
at ModuleLoader.resolve (node:internal/modules/esm/loader:690:38)
at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:307:38)
at ModuleJob._link (node:internal/modules/esm/module_job:183:49) {
code: 'ERR_MODULE_NOT_FOUND'
},
status: 500,
statusText: undefined,
headers: undefined,
data: undefined,
body: undefined,
unhandled: true
}
[prerender] Prerendered 0 pages:
[sitemap] Hint: Pages found, but no sitemap host has been set. To enable sitemap generation, set the `sitemap.host` option.
[nitro 11:00:13 am] ◐ Building [Nitro] (preset: node-server, compatibility: 2025-11-06)
file:///home/codebench/Dev/ts-start-bug/node_modules/.pnpm/@tanstack+start-plugin-core@1.134.12_@tanstack+react-router@1.134.12_react-dom@19.2.0_r_967f5b275724ce77a0f689c31de802f9/node_modules/@tanstack/start-plugin-core/dist/esm/prerender.js:138
throw new Error(`Failed to fetch ${page.path}: ${res.statusText}`, {
^
Error: Failed to fetch /: Internal Server Error
at file:///home/codebench/Dev/ts-start-bug/node_modules/.pnpm/@tanstack+start-plugin-core@1.134.12_@tanstack+react-router@1.134.12_react-dom@19.2.0_r_967f5b275724ce77a0f689c31de802f9/node_modules/@tanstack/start-plugin-core/dist/esm/prerender.js:138:19
at async file:///home/codebench/Dev/ts-start-bug/node_modules/.pnpm/@tanstack+start-plugin-core@1.134.12_@tanstack+react-router@1.134.12_react-dom@19.2.0_r_967f5b275724ce77a0f689c31de802f9/node_modules/@tanstack/start-plugin-core/dist/esm/queue.js:38:17 {
[cause]: NodeResponse$1 [Response] {}
}
Node.js v22.18.0
ELIFECYCLE Command failed with exit code 1.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the linked ts-start-bug reproduction and run pnpm build in SPA mode with Nitro, first without and then with ssr: { external: ["pg"] }. Compare the two failure paths and the working non-SPA build; done means the SPA-mode monorepo build and prerender complete successfully without either reported error.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- nodejs, typescript
- Domain
- backend, build-system
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 35/100