From 3e36a90ea9742c851cf5a11feaa94f7ff29148b6 Mon Sep 17 00:00:00 2001 From: Tanner Linsley Date: Sat, 18 Apr 2026 23:54:50 -0600 Subject: [PATCH 1/3] feat(perf): swap React for @tanstack/dom-vite shim MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drop-in React-compatible shim (~9-10KB gzipped) replacing react / react-dom / react-dom/server via the @tanstack/dom-vite Vite plugin. Installing just @tanstack/dom-vite pulls the full set (dom-core, scheduler, react, react-dom, react-dom-server) transitively. Build-size win: app-shell + react gzip 160KB → 116KB (-44KB). Mobile Lighthouse: slight improvement (-128ms FCP, -27ms TBT). Desktop Lighthouse: parity with baseline. Also: - oxlint: ignore .claude/, disable nested config discovery so stale agent worktrees with their own oxlintrc copies don't break lint. --- .oxlintrc.json | 3 ++- package.json | 3 ++- pnpm-lock.yaml | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ vite.config.ts | 8 ++++++++ 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/.oxlintrc.json b/.oxlintrc.json index 1f8d113da..f6467d88c 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -19,7 +19,8 @@ ".tanstack-start", ".netlify", "public", - "convex/.temp" + "convex/.temp", + ".claude" ], "rules": { "no-array-constructor": "error", diff --git a/package.json b/package.json index b22d7b667..af7965471 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "build": "vite build", "start": "vite start", "start:prod": "pnpm run with-env node scripts/run-built-server.mjs", - "lint": "oxlint --type-aware", + "lint": "oxlint --type-aware --disable-nested-config", "format": "oxfmt --write", "db:generate": "drizzle-kit generate", "db:migrate": "drizzle-kit migrate", @@ -122,6 +122,7 @@ "@playwright/test": "^1.59.0", "@shikijs/transformers": "^4.0.2", "@tanstack/devtools-vite": "^0.6.0", + "@tanstack/dom-vite": "0.1.0-alpha.2", "@tanstack/react-devtools": "^0.10.2", "@tanstack/react-query-devtools": "^5.99.0", "@types/hast": "^3.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eba7abb83..078ce2539 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -294,6 +294,9 @@ importers: '@tanstack/devtools-vite': specifier: ^0.6.0 version: 0.6.0(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + '@tanstack/dom-vite': + specifier: 0.1.0-alpha.2 + version: 0.1.0-alpha.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) '@tanstack/react-devtools': specifier: ^0.10.2 version: 0.10.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.12) @@ -3490,6 +3493,14 @@ packages: peerDependencies: solid-js: '>=1.9.7' + '@tanstack/dom-core@0.1.0-alpha.2': + resolution: {integrity: sha512-UizkhC4GBVN+nxgXVf9x3FWE5rv3LYylj8ypFGIxKLI+DvOPUjEZIShrgcIXgTGNABu65l+A3h6wCeIyFaEyng==} + + '@tanstack/dom-vite@0.1.0-alpha.2': + resolution: {integrity: sha512-bhjIkK860hsWO0Z6ezoKL9nmOEbywI+b6HRjZYmuL0His61Ig3e63nKueYTEOL2GWQeHExWXUe7BMM10ddf4dw==} + peerDependencies: + vite: '>=5' + '@tanstack/history@1.161.6': resolution: {integrity: sha512-NaOGLRrddszbQj9upGat6HG/4TKvXLvu+osAIgfxPYA+eIvYKv8GKDJOrY2D3/U9MRnKfMWD7bU4jeD4xmqyIg==} engines: {node: '>=20.19'} @@ -3517,6 +3528,12 @@ packages: react: '>=16.8' react-dom: '>=16.8' + '@tanstack/react-dom-server@0.1.0-alpha.2': + resolution: {integrity: sha512-4HXiksIkl/NmBlIvNDl5MUSjMwOiT4k/Ziu6h36T7DMfNtx7Vh4kaW6a16layfBFMlduY7j+T2JscbRM9Pfjkg==} + + '@tanstack/react-dom@0.1.0-alpha.2': + resolution: {integrity: sha512-l8EdzkyYFJXYLw+7sn3hJrifzYkc+z7trjMWi7orTTuNtQCOq8j7bNtD/BcCouzUIp0WYa43FYfYCDuuh4dJxA==} + '@tanstack/react-hotkeys@0.9.1': resolution: {integrity: sha512-/qdQUUVkYAHAWRGdFXqFgWpW/S+a6OzkvxWNWKLLDHQODJlO6EPBPa073CglaafBfzig58RK07T09ET+NnZhpg==} engines: {node: '>=18'} @@ -3622,6 +3639,9 @@ packages: react: '>=16.8' react-dom: '>=16.8' + '@tanstack/react@0.1.0-alpha.2': + resolution: {integrity: sha512-FBHUsVgoBMGls4n25qp83HOIIYPC57ciL8z5sdPzqgIy62p1qG7JGkUF259dbBz6+DUVtPWhpSR1g8vLX5Mi5w==} + '@tanstack/router-core@1.168.13': resolution: {integrity: sha512-RjFUQDLfa05WnPZLV+xENUni2CUF1ftz3cFLpm/AdrXdN6VFHp0mhu94zHVPgt0XJwXEEcIyNHjQn+9IcXk0JA==} engines: {node: '>=20.19'} @@ -3679,6 +3699,9 @@ packages: resolution: {integrity: sha512-nRcYw+w2OEgK6VfjirYvGyPLOK+tZQz1jkYcmH5AjMamQ9PycnlxZF2aEZtPpNoUsaceX2bHptn6Ub5hGXqNvw==} engines: {node: '>=20.19'} + '@tanstack/scheduler@0.1.0-alpha.2': + resolution: {integrity: sha512-ZJdR19r3+SBHziWSjw+yDUC/dbpKnMjj0f0kntEOwdaS9X5DSiRCEBb71iQZkRZIcI7mqh6Jqtvqw7M5rphF1A==} + '@tanstack/start-client-core@1.167.15': resolution: {integrity: sha512-WT4vy+aoc6kVKJeTt+uTwIiwCvhtQ0Nx2GavRyL4ks3l0YYnzv9qgGgNHPlvDY8crA1zO280v9SYEe/UjDuizQ==} engines: {node: '>=22.12.0'} @@ -11384,6 +11407,17 @@ snapshots: - csstype - utf-8-validate + '@tanstack/dom-core@0.1.0-alpha.2': {} + + '@tanstack/dom-vite@0.1.0-alpha.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))': + dependencies: + '@tanstack/dom-core': 0.1.0-alpha.2 + '@tanstack/react': 0.1.0-alpha.2 + '@tanstack/react-dom': 0.1.0-alpha.2 + '@tanstack/react-dom-server': 0.1.0-alpha.2 + '@tanstack/scheduler': 0.1.0-alpha.2 + vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + '@tanstack/history@1.161.6': {} '@tanstack/hotkeys@0.7.1': @@ -11412,6 +11446,16 @@ snapshots: - solid-js - utf-8-validate + '@tanstack/react-dom-server@0.1.0-alpha.2': + dependencies: + '@tanstack/dom-core': 0.1.0-alpha.2 + '@tanstack/react': 0.1.0-alpha.2 + + '@tanstack/react-dom@0.1.0-alpha.2': + dependencies: + '@tanstack/dom-core': 0.1.0-alpha.2 + '@tanstack/react': 0.1.0-alpha.2 + '@tanstack/react-hotkeys@0.9.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@tanstack/hotkeys': 0.7.1 @@ -11548,6 +11592,10 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) + '@tanstack/react@0.1.0-alpha.2': + dependencies: + '@tanstack/dom-core': 0.1.0-alpha.2 + '@tanstack/router-core@1.168.13': dependencies: '@tanstack/history': 1.161.6 @@ -11623,6 +11671,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@tanstack/scheduler@0.1.0-alpha.2': {} + '@tanstack/start-client-core@1.167.15': dependencies: '@tanstack/router-core': 1.168.13 diff --git a/vite.config.ts b/vite.config.ts index 4f2da0792..7ac92f1e9 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,5 +1,6 @@ import { sentryTanstackStart } from '@sentry/tanstackstart-react/vite' import { defineConfig } from 'vite' +import { tanstackDom } from '@tanstack/dom-vite' import contentCollections from '@content-collections/vite' import { devtools as tanstackDevtools } from '@tanstack/devtools-vite' import { tanstackStart } from '@tanstack/react-start/plugin/vite' @@ -102,6 +103,12 @@ export default defineConfig({ 'discord-interactions', // Don't pre-bundle CLI so we always get fresh changes during dev ...(isDev ? ['@tanstack/cli'] : []), + // `use client` libraries that plugin-rsc pre-bundles inconsistently + // across client/ssr/rsc envs when combined with our React shim — each + // env resolves `react` to a different target, so the optimizer's hash + // diverges. Excluding from optimize keeps resolution deterministic per + // env and silences the 50k+ "inconsistently optimized" warning flood. + 'lucide-react', ], }, build: { @@ -168,6 +175,7 @@ export default defineConfig({ }, }, plugins: [ + tanstackDom(), ...(isDev ? [tanstackDevtools()] : []), tanstackStart({ rsc: { From 8a00018a559f480bfd8ad65bdb88e49fe046670b Mon Sep 17 00:00:00 2001 From: Tanner Linsley Date: Sun, 19 Apr 2026 02:02:14 -0600 Subject: [PATCH 2/3] chore(deps): bump @tanstack/dom-vite to 0.1.0-alpha.3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Brings in raw REACT_LAZY_TYPE child handling in both SSR (walkNode) and client (pushChildren). RSC Flight serializes 'use client' components — CodeBlock, CodeBlockView, CodeExplorer, etc. — as bare lazy objects directly in the tree (not wrapped in REACT_ELEMENT_TYPE). The previous shim dropped those silently, so code snippets disappeared on docs pages (e.g. /virtual/latest/docs/introduction). --- package.json | 2 +- pnpm-lock.yaml | 60 +++++++++++++++++++++++++------------------------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/package.json b/package.json index af7965471..ee6e45872 100644 --- a/package.json +++ b/package.json @@ -122,7 +122,7 @@ "@playwright/test": "^1.59.0", "@shikijs/transformers": "^4.0.2", "@tanstack/devtools-vite": "^0.6.0", - "@tanstack/dom-vite": "0.1.0-alpha.2", + "@tanstack/dom-vite": "0.1.0-alpha.3", "@tanstack/react-devtools": "^0.10.2", "@tanstack/react-query-devtools": "^5.99.0", "@types/hast": "^3.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 078ce2539..63a3774ce 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -295,8 +295,8 @@ importers: specifier: ^0.6.0 version: 0.6.0(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) '@tanstack/dom-vite': - specifier: 0.1.0-alpha.2 - version: 0.1.0-alpha.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + specifier: 0.1.0-alpha.3 + version: 0.1.0-alpha.3(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) '@tanstack/react-devtools': specifier: ^0.10.2 version: 0.10.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.12) @@ -3493,11 +3493,11 @@ packages: peerDependencies: solid-js: '>=1.9.7' - '@tanstack/dom-core@0.1.0-alpha.2': - resolution: {integrity: sha512-UizkhC4GBVN+nxgXVf9x3FWE5rv3LYylj8ypFGIxKLI+DvOPUjEZIShrgcIXgTGNABu65l+A3h6wCeIyFaEyng==} + '@tanstack/dom-core@0.1.0-alpha.3': + resolution: {integrity: sha512-H28e7bhNySHyRloQiGSP+N6/XZzfhvG39Y8/j4wZ2LYWCVVAO1HLmpvAxPGR7qlGt1Nb1wa6VJJkenxr3fiZRA==} - '@tanstack/dom-vite@0.1.0-alpha.2': - resolution: {integrity: sha512-bhjIkK860hsWO0Z6ezoKL9nmOEbywI+b6HRjZYmuL0His61Ig3e63nKueYTEOL2GWQeHExWXUe7BMM10ddf4dw==} + '@tanstack/dom-vite@0.1.0-alpha.3': + resolution: {integrity: sha512-a54xkjDT8dzKePGVMPqJPEsn/vdmXIyOa8aGqlb93UQKxDhA3gpN8yhGvvDpeRbiVQE3tW3UYEkUmtDO0dptZg==} peerDependencies: vite: '>=5' @@ -3528,11 +3528,11 @@ packages: react: '>=16.8' react-dom: '>=16.8' - '@tanstack/react-dom-server@0.1.0-alpha.2': - resolution: {integrity: sha512-4HXiksIkl/NmBlIvNDl5MUSjMwOiT4k/Ziu6h36T7DMfNtx7Vh4kaW6a16layfBFMlduY7j+T2JscbRM9Pfjkg==} + '@tanstack/react-dom-server@0.1.0-alpha.3': + resolution: {integrity: sha512-2/UYgA3jCEj8mhMUhilglT/diYgnedbioNj2ljlnGhGQOhL32Z0UwxEEq4ZBLoAZxBGXQwKRDcoMakiVGl4MJg==} - '@tanstack/react-dom@0.1.0-alpha.2': - resolution: {integrity: sha512-l8EdzkyYFJXYLw+7sn3hJrifzYkc+z7trjMWi7orTTuNtQCOq8j7bNtD/BcCouzUIp0WYa43FYfYCDuuh4dJxA==} + '@tanstack/react-dom@0.1.0-alpha.3': + resolution: {integrity: sha512-ug/huPkkQ6klJ0BQSaogl6e/eqxbgCu9G9/o8bDr0KH3JlKJtA5feWJTjJpyjL6lAnh1M/ryqnZrosZadXr21Q==} '@tanstack/react-hotkeys@0.9.1': resolution: {integrity: sha512-/qdQUUVkYAHAWRGdFXqFgWpW/S+a6OzkvxWNWKLLDHQODJlO6EPBPa073CglaafBfzig58RK07T09ET+NnZhpg==} @@ -3639,8 +3639,8 @@ packages: react: '>=16.8' react-dom: '>=16.8' - '@tanstack/react@0.1.0-alpha.2': - resolution: {integrity: sha512-FBHUsVgoBMGls4n25qp83HOIIYPC57ciL8z5sdPzqgIy62p1qG7JGkUF259dbBz6+DUVtPWhpSR1g8vLX5Mi5w==} + '@tanstack/react@0.1.0-alpha.3': + resolution: {integrity: sha512-CYjIS8nRfRo1h9iHlNIQs2ihdDDL1lKOGCkAqBKRDfmThqg47smLgQCFJ/oD9dkwiskY8fmtW9Ixw2lTzZL2PQ==} '@tanstack/router-core@1.168.13': resolution: {integrity: sha512-RjFUQDLfa05WnPZLV+xENUni2CUF1ftz3cFLpm/AdrXdN6VFHp0mhu94zHVPgt0XJwXEEcIyNHjQn+9IcXk0JA==} @@ -3699,8 +3699,8 @@ packages: resolution: {integrity: sha512-nRcYw+w2OEgK6VfjirYvGyPLOK+tZQz1jkYcmH5AjMamQ9PycnlxZF2aEZtPpNoUsaceX2bHptn6Ub5hGXqNvw==} engines: {node: '>=20.19'} - '@tanstack/scheduler@0.1.0-alpha.2': - resolution: {integrity: sha512-ZJdR19r3+SBHziWSjw+yDUC/dbpKnMjj0f0kntEOwdaS9X5DSiRCEBb71iQZkRZIcI7mqh6Jqtvqw7M5rphF1A==} + '@tanstack/scheduler@0.1.0-alpha.3': + resolution: {integrity: sha512-RyETyBYefa1xVOEKj8WIRnoXisKL2yc8fG+u07PAiidvFuS5K4+PMgVVWnnaLy5jH98epxTxaoKoxJxQvnkfpw==} '@tanstack/start-client-core@1.167.15': resolution: {integrity: sha512-WT4vy+aoc6kVKJeTt+uTwIiwCvhtQ0Nx2GavRyL4ks3l0YYnzv9qgGgNHPlvDY8crA1zO280v9SYEe/UjDuizQ==} @@ -11407,15 +11407,15 @@ snapshots: - csstype - utf-8-validate - '@tanstack/dom-core@0.1.0-alpha.2': {} + '@tanstack/dom-core@0.1.0-alpha.3': {} - '@tanstack/dom-vite@0.1.0-alpha.2(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))': + '@tanstack/dom-vite@0.1.0-alpha.3(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: - '@tanstack/dom-core': 0.1.0-alpha.2 - '@tanstack/react': 0.1.0-alpha.2 - '@tanstack/react-dom': 0.1.0-alpha.2 - '@tanstack/react-dom-server': 0.1.0-alpha.2 - '@tanstack/scheduler': 0.1.0-alpha.2 + '@tanstack/dom-core': 0.1.0-alpha.3 + '@tanstack/react': 0.1.0-alpha.3 + '@tanstack/react-dom': 0.1.0-alpha.3 + '@tanstack/react-dom-server': 0.1.0-alpha.3 + '@tanstack/scheduler': 0.1.0-alpha.3 vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) '@tanstack/history@1.161.6': {} @@ -11446,15 +11446,15 @@ snapshots: - solid-js - utf-8-validate - '@tanstack/react-dom-server@0.1.0-alpha.2': + '@tanstack/react-dom-server@0.1.0-alpha.3': dependencies: - '@tanstack/dom-core': 0.1.0-alpha.2 - '@tanstack/react': 0.1.0-alpha.2 + '@tanstack/dom-core': 0.1.0-alpha.3 + '@tanstack/react': 0.1.0-alpha.3 - '@tanstack/react-dom@0.1.0-alpha.2': + '@tanstack/react-dom@0.1.0-alpha.3': dependencies: - '@tanstack/dom-core': 0.1.0-alpha.2 - '@tanstack/react': 0.1.0-alpha.2 + '@tanstack/dom-core': 0.1.0-alpha.3 + '@tanstack/react': 0.1.0-alpha.3 '@tanstack/react-hotkeys@0.9.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: @@ -11592,9 +11592,9 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - '@tanstack/react@0.1.0-alpha.2': + '@tanstack/react@0.1.0-alpha.3': dependencies: - '@tanstack/dom-core': 0.1.0-alpha.2 + '@tanstack/dom-core': 0.1.0-alpha.3 '@tanstack/router-core@1.168.13': dependencies: @@ -11671,7 +11671,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/scheduler@0.1.0-alpha.2': {} + '@tanstack/scheduler@0.1.0-alpha.3': {} '@tanstack/start-client-core@1.167.15': dependencies: From 9771d0d6d4509f8c10796086833cdc11c989a5a6 Mon Sep 17 00:00:00 2001 From: Tanner Linsley Date: Mon, 20 Apr 2026 00:39:05 -0600 Subject: [PATCH 3/3] feat: bump @tanstack/dom-vite to 0.1.0-alpha.4 + alias runtime-specific server variants MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pulls in the shell-chunk batching perf fix landed in the shim's react-dom-server (0.1.0-alpha.4 vs. alpha.3 before). Adds manual top-level aliases for `react-dom/server.{edge,node,bun, browser}` and `react-dom/static.*` → `@tanstack/react-dom-server`. The shim ships a single universal server build; React splits per runtime and @vitejs/plugin-rsc / the Netlify edge adapter import those per-runtime specifiers conditionally. Vite 8's EnvironmentResolveOptions doesn't accept `alias`, so these have to live at top-level resolve.alias. Home route verified rendering cleanly via SSR with no console errors. --- package.json | 2 +- pnpm-lock.yaml | 18 +++++++++--------- vite.config.ts | 18 ++++++++++++++++++ 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index ee6e45872..8010f4abc 100644 --- a/package.json +++ b/package.json @@ -122,7 +122,7 @@ "@playwright/test": "^1.59.0", "@shikijs/transformers": "^4.0.2", "@tanstack/devtools-vite": "^0.6.0", - "@tanstack/dom-vite": "0.1.0-alpha.3", + "@tanstack/dom-vite": "0.1.0-alpha.4", "@tanstack/react-devtools": "^0.10.2", "@tanstack/react-query-devtools": "^5.99.0", "@types/hast": "^3.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 63a3774ce..0325ab9d3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -295,8 +295,8 @@ importers: specifier: ^0.6.0 version: 0.6.0(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) '@tanstack/dom-vite': - specifier: 0.1.0-alpha.3 - version: 0.1.0-alpha.3(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + specifier: 0.1.0-alpha.4 + version: 0.1.0-alpha.4(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) '@tanstack/react-devtools': specifier: ^0.10.2 version: 0.10.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(solid-js@1.9.12) @@ -3496,8 +3496,8 @@ packages: '@tanstack/dom-core@0.1.0-alpha.3': resolution: {integrity: sha512-H28e7bhNySHyRloQiGSP+N6/XZzfhvG39Y8/j4wZ2LYWCVVAO1HLmpvAxPGR7qlGt1Nb1wa6VJJkenxr3fiZRA==} - '@tanstack/dom-vite@0.1.0-alpha.3': - resolution: {integrity: sha512-a54xkjDT8dzKePGVMPqJPEsn/vdmXIyOa8aGqlb93UQKxDhA3gpN8yhGvvDpeRbiVQE3tW3UYEkUmtDO0dptZg==} + '@tanstack/dom-vite@0.1.0-alpha.4': + resolution: {integrity: sha512-h2OxFHW/fYPGrC6dMHkFfcxbUyR2p3iIGAxBobuRefcQOdJDsXEk9SloeLTVDj53YwGy+x835ADgAUnYXFzZYA==} peerDependencies: vite: '>=5' @@ -3528,8 +3528,8 @@ packages: react: '>=16.8' react-dom: '>=16.8' - '@tanstack/react-dom-server@0.1.0-alpha.3': - resolution: {integrity: sha512-2/UYgA3jCEj8mhMUhilglT/diYgnedbioNj2ljlnGhGQOhL32Z0UwxEEq4ZBLoAZxBGXQwKRDcoMakiVGl4MJg==} + '@tanstack/react-dom-server@0.1.0-alpha.4': + resolution: {integrity: sha512-fJNgE/+H/y/jubOCF+29CypuVUe/FDYP19rTDf5NK8UdeUlQ7KIKs7ZAhLg2i3gz/U7c+DFnaennRciKX8cp5g==} '@tanstack/react-dom@0.1.0-alpha.3': resolution: {integrity: sha512-ug/huPkkQ6klJ0BQSaogl6e/eqxbgCu9G9/o8bDr0KH3JlKJtA5feWJTjJpyjL6lAnh1M/ryqnZrosZadXr21Q==} @@ -11409,12 +11409,12 @@ snapshots: '@tanstack/dom-core@0.1.0-alpha.3': {} - '@tanstack/dom-vite@0.1.0-alpha.3(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))': + '@tanstack/dom-vite@0.1.0-alpha.4(vite@8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@tanstack/dom-core': 0.1.0-alpha.3 '@tanstack/react': 0.1.0-alpha.3 '@tanstack/react-dom': 0.1.0-alpha.3 - '@tanstack/react-dom-server': 0.1.0-alpha.3 + '@tanstack/react-dom-server': 0.1.0-alpha.4 '@tanstack/scheduler': 0.1.0-alpha.3 vite: 8.0.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)(@types/node@25.5.0)(esbuild@0.27.4)(jiti@2.6.1)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) @@ -11446,7 +11446,7 @@ snapshots: - solid-js - utf-8-validate - '@tanstack/react-dom-server@0.1.0-alpha.3': + '@tanstack/react-dom-server@0.1.0-alpha.4': dependencies: '@tanstack/dom-core': 0.1.0-alpha.3 '@tanstack/react': 0.1.0-alpha.3 diff --git a/vite.config.ts b/vite.config.ts index 7ac92f1e9..644812963 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -37,10 +37,28 @@ const rscSsrExternals = [ const sentrySsrExternals = ['@sentry/node', '@sentry/tanstackstart-react'] const dbSsrExternals = ['drizzle-orm', 'drizzle-orm/postgres-js'] +// Runtime-specific `react-dom/server` variants aren't in @tanstack/dom-vite's +// default alias map — our shim ships a single universal server build, unlike +// React which maintains per-runtime forks (edge/node/bun/browser + static.*). +// @vitejs/plugin-rsc and Netlify's edge adapter import them conditionally, so +// we funnel them all to `@tanstack/react-dom-server` at the top-level resolve +// (Vite 8's `EnvironmentResolveOptions` doesn't accept `alias`, so env-scoped +// aliasing isn't an option). +const serverVariantAliases: Record = { + 'react-dom/server.edge': '@tanstack/react-dom-server', + 'react-dom/server.node': '@tanstack/react-dom-server', + 'react-dom/server.bun': '@tanstack/react-dom-server', + 'react-dom/server.browser': '@tanstack/react-dom-server', + 'react-dom/static.edge': '@tanstack/react-dom-server', + 'react-dom/static.node': '@tanstack/react-dom-server', + 'react-dom/static': '@tanstack/react-dom-server', +} + export default defineConfig({ resolve: { alias: { '~': path.resolve(__dirname, './src'), + ...serverVariantAliases, }, }, server: {