nitrojs / nitrojs/nitro

v3: Cannot build TanStack Start pnpm monorepo in SPA mode with Nitro

Open
#3,741 7 comments 3 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug tanstack v3 vite plugin
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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.