From f3d8afb624f8324393ccc64007010a43c4f7208e Mon Sep 17 00:00:00 2001 From: Manuel Schiller Date: Thu, 21 May 2026 22:27:11 +0200 Subject: [PATCH] fix(start): explicitly re-export public API to survive SSR cold-start cycle see #7459 --- .changeset/trim-start-meta-reexports.md | 7 +++++++ packages/react-start/src/index.ts | 16 +++++++++++++++- packages/solid-start/src/index.ts | 15 +++++++++++++++ packages/vue-start/src/index.ts | 15 +++++++++++++++ 4 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 .changeset/trim-start-meta-reexports.md diff --git a/.changeset/trim-start-meta-reexports.md b/.changeset/trim-start-meta-reexports.md new file mode 100644 index 0000000000..553324cc19 --- /dev/null +++ b/.changeset/trim-start-meta-reexports.md @@ -0,0 +1,7 @@ +--- +'@tanstack/react-start': patch +'@tanstack/solid-start': patch +'@tanstack/vue-start': patch +--- + +Explicitly re-export public API names from `@tanstack/start-client-core` (`createServerFn`, `createMiddleware`, `createStart`, `createCsrfMiddleware`, `createIsomorphicFn`, `createClientOnlyFn`, `createServerOnlyFn`) alongside the existing `export *`. The explicit named re-exports are registered at link time (via Vite SSR's `defineExport` at `fileStartIndex`), so the namespace has these getters before any import body runs — survives the cold-start SSR cycle through user middleware where `export *` would otherwise produce a partial facade (`createMiddleware is not a function`). Workaround for vitejs/vite#22491 / #22493. diff --git a/packages/react-start/src/index.ts b/packages/react-start/src/index.ts index 65b116ec2e..0947745215 100644 --- a/packages/react-start/src/index.ts +++ b/packages/react-start/src/index.ts @@ -1,6 +1,20 @@ export { useServerFn } from './useServerFn' export * from '@tanstack/start-client-core' -export { createServerFn } from '@tanstack/start-client-core' +// Explicit re-exports shadow `export *` above so these public-API names are +// registered on the namespace at link time (via Vite SSR's `defineExport` +// at fileStartIndex), surviving the cold-start SSR cycle through user +// middleware. See vitejs/vite#22491 / #22493. Trim list to genuine public +// API only; internals fall through `export *` and are safe because they +// aren't imported at top level in the cycle path. +export { + createClientOnlyFn, + createCsrfMiddleware, + createIsomorphicFn, + createMiddleware, + createServerFn, + createServerOnlyFn, + createStart, +} from '@tanstack/start-client-core' export { Hydrate } from '@tanstack/react-start-client' export type { HydrateOptions, diff --git a/packages/solid-start/src/index.ts b/packages/solid-start/src/index.ts index 0cdac87c81..44d8c36c88 100644 --- a/packages/solid-start/src/index.ts +++ b/packages/solid-start/src/index.ts @@ -1,5 +1,20 @@ export { useServerFn } from './useServerFn' export * from '@tanstack/start-client-core' +// Explicit re-exports shadow `export *` above so these public-API names are +// registered on the namespace at link time (via Vite SSR's `defineExport` +// at fileStartIndex), surviving the cold-start SSR cycle through user +// middleware. See vitejs/vite#22491 / #22493. Trim list to genuine public +// API only; internals fall through `export *` and are safe because they +// aren't imported at top level in the cycle path. +export { + createClientOnlyFn, + createCsrfMiddleware, + createIsomorphicFn, + createMiddleware, + createServerFn, + createServerOnlyFn, + createStart, +} from '@tanstack/start-client-core' export { Hydrate } from '@tanstack/solid-start-client' export type { HydrateOptions, diff --git a/packages/vue-start/src/index.ts b/packages/vue-start/src/index.ts index 8b51b6c783..21b3b5b003 100644 --- a/packages/vue-start/src/index.ts +++ b/packages/vue-start/src/index.ts @@ -1,2 +1,17 @@ export { useServerFn } from './useServerFn' export * from '@tanstack/start-client-core' +// Explicit re-exports shadow `export *` above so these public-API names are +// registered on the namespace at link time (via Vite SSR's `defineExport` +// at fileStartIndex), surviving the cold-start SSR cycle through user +// middleware. See vitejs/vite#22491 / #22493. Trim list to genuine public +// API only; internals fall through `export *` and are safe because they +// aren't imported at top level in the cycle path. +export { + createClientOnlyFn, + createCsrfMiddleware, + createIsomorphicFn, + createMiddleware, + createServerFn, + createServerOnlyFn, + createStart, +} from '@tanstack/start-client-core'