@tanstack/react-start-rsc 0.0.22 → 0.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import { fileURLToPath } from "node:url";
2
2
  import path from "pathe";
3
- import { createVirtualModule } from "@tanstack/start-plugin-core";
3
+ import { createVirtualModule } from "@tanstack/start-plugin-core/vite";
4
4
  //#region src/plugin/vite.ts
5
5
  var isClientEnvironment = (env) => env.config.consumer === "client";
6
6
  var RSC_HMR_VIRTUAL_ID = "virtual:tanstack-rsc-hmr";
@@ -1 +1 @@
1
- {"version":3,"file":"vite.js","names":[],"sources":["../../../src/plugin/vite.ts"],"sourcesContent":["import { fileURLToPath } from 'node:url'\nimport path from 'pathe'\nimport { createVirtualModule } from '@tanstack/start-plugin-core'\nimport type {\n TanStackStartVitePluginCoreOptions,\n ViteRscForwardSsrResolverStrategy,\n} from '@tanstack/start-plugin-core'\nimport type { PluginOption, UserConfig } from 'vite'\n\nconst isClientEnvironment = (env: { config: { consumer: string } }) =>\n env.config.consumer === 'client'\n\n// Virtual module ids used by the React Start RSC runtime.\nconst RSC_HMR_VIRTUAL_ID = 'virtual:tanstack-rsc-hmr'\nconst RSC_RUNTIME_VIRTUAL_ID = 'virtual:tanstack-rsc-runtime'\nconst RSC_BROWSER_DECODE_VIRTUAL_ID = 'virtual:tanstack-rsc-browser-decode'\nconst RSC_SSR_DECODE_VIRTUAL_ID = 'virtual:tanstack-rsc-ssr-decode'\nconst RSC_ENV_NAME = 'rsc'\n\nconst currentDir = path.dirname(fileURLToPath(import.meta.url))\nconst entryDir = path.resolve(currentDir, '..', '..', 'plugin', 'entry')\nconst rscEntryPath = path.resolve(entryDir, 'rsc.tsx')\n\nexport function configureRsc(): {\n envName: string\n providerEnvironmentName: TanStackStartVitePluginCoreOptions['providerEnvironmentName']\n ssrResolverStrategy: TanStackStartVitePluginCoreOptions['ssrResolverStrategy']\n serializationAdapters: TanStackStartVitePluginCoreOptions['serializationAdapters']\n} {\n const serializationAdapters: TanStackStartVitePluginCoreOptions['serializationAdapters'] =\n [\n // IMPORTANT: plugin-adapters-plugin only calls the top-level factory once.\n // That factory must return a flat array of adapters (not nested arrays),\n // otherwise router-core ends up with non-adapter entries and Seroval crashes.\n {\n client: {\n module: '@tanstack/react-start/rsc/serialization/client',\n export: 'rscSerializationAdapter',\n isFactory: true,\n },\n server: {\n module: '@tanstack/react-start/rsc/serialization/server',\n export: 'rscSerializationAdapter',\n isFactory: true,\n },\n },\n ]\n const ssrResolverStrategy = {\n type: 'vite-rsc-forward',\n sourceEnvironmentName: RSC_ENV_NAME,\n sourceEntry: 'index',\n exportName: 'getServerFnById',\n } satisfies ViteRscForwardSsrResolverStrategy\n return {\n envName: RSC_ENV_NAME,\n providerEnvironmentName: RSC_ENV_NAME,\n ssrResolverStrategy,\n serializationAdapters,\n }\n}\nexport function reactStartRscVitePlugin(): PluginOption {\n return [\n // When RSC is enabled, SSR needs noExternal: true to ensure single React instance.\n // The RSC decoder's dynamic imports for client components can cause module duplication\n // without this, leading to \"Invalid hook call\" errors.\n // We use the top-level `ssr` config option as `environments.ssr.resolve.noExternal`\n // doesn't have the same effect.\n {\n name: 'tanstack-react-start:rsc-ssr-config',\n config() {\n return {\n ssr: {\n noExternal: true,\n },\n }\n },\n },\n {\n name: 'tanstack-react-start:rsc-env-config',\n config() {\n return {\n rsc: {\n // Disable @vitejs/plugin-rsc's built-in server handler middleware.\n // TanStack Start has its own request handling via the SSR environment.\n serverHandler: false,\n // Disable CSS link precedence to prevent React 19 SSR suspension\n // TanStack Start handles CSS preloading via manifest injection instead\n cssLinkPrecedence: false,\n },\n environments: {\n [RSC_ENV_NAME]: {\n consumer: 'server',\n // Force @tanstack packages to be processed by Vite as source code\n // rather than treated as external modules. This ensures:\n // 1. createIsomorphicFn transforms are applied\n // 2. Imports are resolved within the RSC environment context\n // with proper react-server conditions and pre-bundled deps\n resolve: {\n noExternal: [\n '@tanstack/start**',\n '@tanstack/react-start',\n '@tanstack/react-start-rsc',\n '@tanstack/react-router',\n ],\n },\n build: {\n rollupOptions: {\n input: {\n index: rscEntryPath,\n },\n },\n },\n },\n },\n } satisfies UserConfig & {\n rsc: {\n serverHandler: false\n cssLinkPrecedence?: boolean\n }\n }\n },\n },\n\n // Runtime bridge into the Vite RSC environment.\n createVirtualModule({\n name: 'tanstack-react-start:rsc-runtime-virtual',\n moduleId: RSC_RUNTIME_VIRTUAL_ID,\n load() {\n const envName = this.environment.name\n if (envName === RSC_ENV_NAME) {\n return `export { renderToReadableStream, createFromReadableStream, createTemporaryReferenceSet, decodeReply, loadServerAction, decodeAction, decodeFormState } from '@vitejs/plugin-rsc/rsc'`\n }\n return `\nexport function renderToReadableStream() { throw new Error('renderToReadableStream can only be used in RSC environment'); }\nexport function createFromReadableStream() { throw new Error('createFromReadableStream can only be used in RSC environment'); }\nexport function createTemporaryReferenceSet() { throw new Error('createTemporaryReferenceSet can only be used in RSC environment'); }\nexport function decodeReply() { throw new Error('decodeReply can only be used in RSC environment'); }\nexport function loadServerAction() { throw new Error('loadServerAction can only be used in RSC environment'); }\nexport function decodeAction() { throw new Error('decodeAction can only be used in RSC environment'); }\nexport function decodeFormState() { throw new Error('decodeFormState can only be used in RSC environment'); }\n`\n },\n }),\n createVirtualModule({\n name: 'tanstack-react-start:rsc-browser-decode-virtual',\n moduleId: RSC_BROWSER_DECODE_VIRTUAL_ID,\n load() {\n return `export { createFromReadableStream, createFromFetch } from '@vitejs/plugin-rsc/browser'`\n },\n }),\n createVirtualModule({\n name: 'tanstack-react-start:rsc-ssr-decode-virtual',\n moduleId: RSC_SSR_DECODE_VIRTUAL_ID,\n load() {\n return `export { setOnClientReference, createFromReadableStream } from '@vitejs/plugin-rsc/ssr'`\n },\n }),\n createVirtualModule({\n name: 'tanstack-react-start:rsc-hmr-virtual:dev',\n moduleId: RSC_HMR_VIRTUAL_ID,\n apply: 'serve',\n applyToEnvironment: isClientEnvironment,\n load() {\n return `\nexport function setupRscHmr() {\nif (!import.meta.hot) {\n return\n}\n\n let __invalidateQueued = false\n\n function __queueInvalidate() {\n if (__invalidateQueued) return\n __invalidateQueued = true\n queueMicrotask(async () => {\n __invalidateQueued = false\n try {\n const router = window.__TSR_ROUTER__\n if (!router) {\n console.warn('[rsc:hmr] No router found on window.__TSR_ROUTER__')\n return\n }\n await router.invalidate()\n } catch (e) {\n console.warn('[rsc:hmr] Failed to invalidate router:', e)\n }\n })\n }\n\n import.meta.hot.on('rsc:update', () => {\n __queueInvalidate()\n })\n}\n`\n },\n }),\n createVirtualModule({\n name: 'tanstack-react-start:rsc-hmr-virtual:prod',\n moduleId: RSC_HMR_VIRTUAL_ID,\n applyToEnvironment: isClientEnvironment,\n apply: 'build',\n load() {\n return 'export function setupRscHmr() {} '\n },\n }),\n ]\n}\n"],"mappings":";;;;AASA,IAAM,uBAAuB,QAC3B,IAAI,OAAO,aAAa;AAG1B,IAAM,qBAAqB;AAC3B,IAAM,yBAAyB;AAC/B,IAAM,gCAAgC;AACtC,IAAM,4BAA4B;AAClC,IAAM,eAAe;AAErB,IAAM,aAAa,KAAK,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;AAC/D,IAAM,WAAW,KAAK,QAAQ,YAAY,MAAM,MAAM,UAAU,QAAQ;AACxE,IAAM,eAAe,KAAK,QAAQ,UAAU,UAAU;AAEtD,SAAgB,eAKd;AAyBA,QAAO;EACL,SAAS;EACT,yBAAyB;EACzB,qBAT0B;GAC1B,MAAM;GACN,uBAAuB;GACvB,aAAa;GACb,YAAY;GACb;EAKC,uBA3BA,CAIE;GACE,QAAQ;IACN,QAAQ;IACR,QAAQ;IACR,WAAW;IACZ;GACD,QAAQ;IACN,QAAQ;IACR,QAAQ;IACR,WAAW;IACZ;GACF,CACF;EAYF;;AAEH,SAAgB,0BAAwC;AACtD,QAAO;EAML;GACE,MAAM;GACN,SAAS;AACP,WAAO,EACL,KAAK,EACH,YAAY,MACb,EACF;;GAEJ;EACD;GACE,MAAM;GACN,SAAS;AACP,WAAO;KACL,KAAK;MAGH,eAAe;MAGf,mBAAmB;MACpB;KACD,cAAc,GACX,eAAe;MACd,UAAU;MAMV,SAAS,EACP,YAAY;OACV;OACA;OACA;OACA;OACD,EACF;MACD,OAAO,EACL,eAAe,EACb,OAAO,EACL,OAAO,cACR,EACF,EACF;MACF,EACF;KACF;;GAOJ;EAGD,oBAAoB;GAClB,MAAM;GACN,UAAU;GACV,OAAO;AAEL,QADgB,KAAK,YAAY,SACjB,aACd,QAAO;AAET,WAAO;;;;;;;;;;GAUV,CAAC;EACF,oBAAoB;GAClB,MAAM;GACN,UAAU;GACV,OAAO;AACL,WAAO;;GAEV,CAAC;EACF,oBAAoB;GAClB,MAAM;GACN,UAAU;GACV,OAAO;AACL,WAAO;;GAEV,CAAC;EACF,oBAAoB;GAClB,MAAM;GACN,UAAU;GACV,OAAO;GACP,oBAAoB;GACpB,OAAO;AACL,WAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCV,CAAC;EACF,oBAAoB;GAClB,MAAM;GACN,UAAU;GACV,oBAAoB;GACpB,OAAO;GACP,OAAO;AACL,WAAO;;GAEV,CAAC;EACH"}
1
+ {"version":3,"file":"vite.js","names":[],"sources":["../../../src/plugin/vite.ts"],"sourcesContent":["import { fileURLToPath } from 'node:url'\nimport path from 'pathe'\nimport { createVirtualModule } from '@tanstack/start-plugin-core/vite'\nimport type {\n TanStackStartVitePluginCoreOptions,\n ViteRscForwardSsrResolverStrategy,\n} from '@tanstack/start-plugin-core/vite'\nimport type { PluginOption, UserConfig } from 'vite'\n\nconst isClientEnvironment = (env: { config: { consumer: string } }) =>\n env.config.consumer === 'client'\n\n// Virtual module ids used by the React Start RSC runtime.\nconst RSC_HMR_VIRTUAL_ID = 'virtual:tanstack-rsc-hmr'\nconst RSC_RUNTIME_VIRTUAL_ID = 'virtual:tanstack-rsc-runtime'\nconst RSC_BROWSER_DECODE_VIRTUAL_ID = 'virtual:tanstack-rsc-browser-decode'\nconst RSC_SSR_DECODE_VIRTUAL_ID = 'virtual:tanstack-rsc-ssr-decode'\nconst RSC_ENV_NAME = 'rsc'\n\nconst currentDir = path.dirname(fileURLToPath(import.meta.url))\nconst entryDir = path.resolve(currentDir, '..', '..', 'plugin', 'entry')\nconst rscEntryPath = path.resolve(entryDir, 'rsc.tsx')\n\nexport function configureRsc(): {\n envName: string\n providerEnvironmentName: TanStackStartVitePluginCoreOptions['providerEnvironmentName']\n ssrResolverStrategy: TanStackStartVitePluginCoreOptions['ssrResolverStrategy']\n serializationAdapters: TanStackStartVitePluginCoreOptions['serializationAdapters']\n} {\n const serializationAdapters: TanStackStartVitePluginCoreOptions['serializationAdapters'] =\n [\n // IMPORTANT: plugin-adapters-plugin only calls the top-level factory once.\n // That factory must return a flat array of adapters (not nested arrays),\n // otherwise router-core ends up with non-adapter entries and Seroval crashes.\n {\n client: {\n module: '@tanstack/react-start/rsc/serialization/client',\n export: 'rscSerializationAdapter',\n isFactory: true,\n },\n server: {\n module: '@tanstack/react-start/rsc/serialization/server',\n export: 'rscSerializationAdapter',\n isFactory: true,\n },\n },\n ]\n const ssrResolverStrategy = {\n type: 'vite-rsc-forward',\n sourceEnvironmentName: RSC_ENV_NAME,\n sourceEntry: 'index',\n exportName: 'getServerFnById',\n } satisfies ViteRscForwardSsrResolverStrategy\n return {\n envName: RSC_ENV_NAME,\n providerEnvironmentName: RSC_ENV_NAME,\n ssrResolverStrategy,\n serializationAdapters,\n }\n}\nexport function reactStartRscVitePlugin(): PluginOption {\n return [\n // When RSC is enabled, SSR needs noExternal: true to ensure single React instance.\n // The RSC decoder's dynamic imports for client components can cause module duplication\n // without this, leading to \"Invalid hook call\" errors.\n // We use the top-level `ssr` config option as `environments.ssr.resolve.noExternal`\n // doesn't have the same effect.\n {\n name: 'tanstack-react-start:rsc-ssr-config',\n config() {\n return {\n ssr: {\n noExternal: true,\n },\n }\n },\n },\n {\n name: 'tanstack-react-start:rsc-env-config',\n config() {\n return {\n rsc: {\n // Disable @vitejs/plugin-rsc's built-in server handler middleware.\n // TanStack Start has its own request handling via the SSR environment.\n serverHandler: false,\n // Disable CSS link precedence to prevent React 19 SSR suspension\n // TanStack Start handles CSS preloading via manifest injection instead\n cssLinkPrecedence: false,\n },\n environments: {\n [RSC_ENV_NAME]: {\n consumer: 'server',\n // Force @tanstack packages to be processed by Vite as source code\n // rather than treated as external modules. This ensures:\n // 1. createIsomorphicFn transforms are applied\n // 2. Imports are resolved within the RSC environment context\n // with proper react-server conditions and pre-bundled deps\n resolve: {\n noExternal: [\n '@tanstack/start**',\n '@tanstack/react-start',\n '@tanstack/react-start-rsc',\n '@tanstack/react-router',\n ],\n },\n build: {\n rollupOptions: {\n input: {\n index: rscEntryPath,\n },\n },\n },\n },\n },\n } satisfies UserConfig & {\n rsc: {\n serverHandler: false\n cssLinkPrecedence?: boolean\n }\n }\n },\n },\n\n // Runtime bridge into the Vite RSC environment.\n createVirtualModule({\n name: 'tanstack-react-start:rsc-runtime-virtual',\n moduleId: RSC_RUNTIME_VIRTUAL_ID,\n load() {\n const envName = this.environment.name\n if (envName === RSC_ENV_NAME) {\n return `export { renderToReadableStream, createFromReadableStream, createTemporaryReferenceSet, decodeReply, loadServerAction, decodeAction, decodeFormState } from '@vitejs/plugin-rsc/rsc'`\n }\n return `\nexport function renderToReadableStream() { throw new Error('renderToReadableStream can only be used in RSC environment'); }\nexport function createFromReadableStream() { throw new Error('createFromReadableStream can only be used in RSC environment'); }\nexport function createTemporaryReferenceSet() { throw new Error('createTemporaryReferenceSet can only be used in RSC environment'); }\nexport function decodeReply() { throw new Error('decodeReply can only be used in RSC environment'); }\nexport function loadServerAction() { throw new Error('loadServerAction can only be used in RSC environment'); }\nexport function decodeAction() { throw new Error('decodeAction can only be used in RSC environment'); }\nexport function decodeFormState() { throw new Error('decodeFormState can only be used in RSC environment'); }\n`\n },\n }),\n createVirtualModule({\n name: 'tanstack-react-start:rsc-browser-decode-virtual',\n moduleId: RSC_BROWSER_DECODE_VIRTUAL_ID,\n load() {\n return `export { createFromReadableStream, createFromFetch } from '@vitejs/plugin-rsc/browser'`\n },\n }),\n createVirtualModule({\n name: 'tanstack-react-start:rsc-ssr-decode-virtual',\n moduleId: RSC_SSR_DECODE_VIRTUAL_ID,\n load() {\n return `export { setOnClientReference, createFromReadableStream } from '@vitejs/plugin-rsc/ssr'`\n },\n }),\n createVirtualModule({\n name: 'tanstack-react-start:rsc-hmr-virtual:dev',\n moduleId: RSC_HMR_VIRTUAL_ID,\n apply: 'serve',\n applyToEnvironment: isClientEnvironment,\n load() {\n return `\nexport function setupRscHmr() {\nif (!import.meta.hot) {\n return\n}\n\n let __invalidateQueued = false\n\n function __queueInvalidate() {\n if (__invalidateQueued) return\n __invalidateQueued = true\n queueMicrotask(async () => {\n __invalidateQueued = false\n try {\n const router = window.__TSR_ROUTER__\n if (!router) {\n console.warn('[rsc:hmr] No router found on window.__TSR_ROUTER__')\n return\n }\n await router.invalidate()\n } catch (e) {\n console.warn('[rsc:hmr] Failed to invalidate router:', e)\n }\n })\n }\n\n import.meta.hot.on('rsc:update', () => {\n __queueInvalidate()\n })\n}\n`\n },\n }),\n createVirtualModule({\n name: 'tanstack-react-start:rsc-hmr-virtual:prod',\n moduleId: RSC_HMR_VIRTUAL_ID,\n applyToEnvironment: isClientEnvironment,\n apply: 'build',\n load() {\n return 'export function setupRscHmr() {} '\n },\n }),\n ]\n}\n"],"mappings":";;;;AASA,IAAM,uBAAuB,QAC3B,IAAI,OAAO,aAAa;AAG1B,IAAM,qBAAqB;AAC3B,IAAM,yBAAyB;AAC/B,IAAM,gCAAgC;AACtC,IAAM,4BAA4B;AAClC,IAAM,eAAe;AAErB,IAAM,aAAa,KAAK,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;AAC/D,IAAM,WAAW,KAAK,QAAQ,YAAY,MAAM,MAAM,UAAU,QAAQ;AACxE,IAAM,eAAe,KAAK,QAAQ,UAAU,UAAU;AAEtD,SAAgB,eAKd;AAyBA,QAAO;EACL,SAAS;EACT,yBAAyB;EACzB,qBAT0B;GAC1B,MAAM;GACN,uBAAuB;GACvB,aAAa;GACb,YAAY;GACb;EAKC,uBA3BA,CAIE;GACE,QAAQ;IACN,QAAQ;IACR,QAAQ;IACR,WAAW;IACZ;GACD,QAAQ;IACN,QAAQ;IACR,QAAQ;IACR,WAAW;IACZ;GACF,CACF;EAYF;;AAEH,SAAgB,0BAAwC;AACtD,QAAO;EAML;GACE,MAAM;GACN,SAAS;AACP,WAAO,EACL,KAAK,EACH,YAAY,MACb,EACF;;GAEJ;EACD;GACE,MAAM;GACN,SAAS;AACP,WAAO;KACL,KAAK;MAGH,eAAe;MAGf,mBAAmB;MACpB;KACD,cAAc,GACX,eAAe;MACd,UAAU;MAMV,SAAS,EACP,YAAY;OACV;OACA;OACA;OACA;OACD,EACF;MACD,OAAO,EACL,eAAe,EACb,OAAO,EACL,OAAO,cACR,EACF,EACF;MACF,EACF;KACF;;GAOJ;EAGD,oBAAoB;GAClB,MAAM;GACN,UAAU;GACV,OAAO;AAEL,QADgB,KAAK,YAAY,SACjB,aACd,QAAO;AAET,WAAO;;;;;;;;;;GAUV,CAAC;EACF,oBAAoB;GAClB,MAAM;GACN,UAAU;GACV,OAAO;AACL,WAAO;;GAEV,CAAC;EACF,oBAAoB;GAClB,MAAM;GACN,UAAU;GACV,OAAO;AACL,WAAO;;GAEV,CAAC;EACF,oBAAoB;GAClB,MAAM;GACN,UAAU;GACV,OAAO;GACP,oBAAoB;GACpB,OAAO;AACL,WAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCV,CAAC;EACF,oBAAoB;GAClB,MAAM;GACN,UAAU;GACV,oBAAoB;GACpB,OAAO;GACP,OAAO;AACL,WAAO;;GAEV,CAAC;EACH"}
@@ -1,4 +1,4 @@
1
- import { TanStackStartVitePluginCoreOptions } from '@tanstack/start-plugin-core';
1
+ import { TanStackStartVitePluginCoreOptions } from '@tanstack/start-plugin-core/vite';
2
2
  import { PluginOption } from 'vite';
3
3
  export declare function configureRsc(): {
4
4
  envName: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/react-start-rsc",
3
- "version": "0.0.22",
3
+ "version": "0.0.24",
4
4
  "description": "React Server Components support for TanStack Start",
5
5
  "author": "Tanner Linsley",
6
6
  "license": "MIT",
@@ -82,9 +82,9 @@
82
82
  "@tanstack/router-utils": "1.161.7",
83
83
  "@tanstack/start-client-core": "1.167.17",
84
84
  "@tanstack/start-fn-stubs": "1.161.6",
85
- "@tanstack/start-plugin-core": "1.168.0",
86
- "@tanstack/start-server-core": "1.167.19",
87
- "@tanstack/start-storage-context": "1.166.29"
85
+ "@tanstack/start-plugin-core": "1.169.1",
86
+ "@tanstack/start-storage-context": "1.166.29",
87
+ "@tanstack/start-server-core": "1.167.19"
88
88
  },
89
89
  "devDependencies": {
90
90
  "@rspack/core": "2.0.0",
@@ -1,10 +1,10 @@
1
1
  import { fileURLToPath } from 'node:url'
2
2
  import path from 'pathe'
3
- import { createVirtualModule } from '@tanstack/start-plugin-core'
3
+ import { createVirtualModule } from '@tanstack/start-plugin-core/vite'
4
4
  import type {
5
5
  TanStackStartVitePluginCoreOptions,
6
6
  ViteRscForwardSsrResolverStrategy,
7
- } from '@tanstack/start-plugin-core'
7
+ } from '@tanstack/start-plugin-core/vite'
8
8
  import type { PluginOption, UserConfig } from 'vite'
9
9
 
10
10
  const isClientEnvironment = (env: { config: { consumer: string } }) =>