diff --git a/e2e/react-start/server-functions/src/routes/middleware/send-serverFn.tsx b/e2e/react-start/server-functions/src/routes/middleware/send-serverFn.tsx index 73bba934b04..15fe6c80dc7 100644 --- a/e2e/react-start/server-functions/src/routes/middleware/send-serverFn.tsx +++ b/e2e/react-start/server-functions/src/routes/middleware/send-serverFn.tsx @@ -6,7 +6,7 @@ const middleware = createMiddleware({ type: 'function' }).client( async ({ next }) => { return next({ sendContext: { - serverFn: barFn as any, + serverFn: barFn, }, }) }, diff --git a/packages/router-core/src/index.ts b/packages/router-core/src/index.ts index 92b7592d399..ab822a51e73 100644 --- a/packages/router-core/src/index.ts +++ b/packages/router-core/src/index.ts @@ -420,6 +420,9 @@ export type { SerializerExtensions, ValidateSerializable, RegisteredSerializableInput, + SerializableExtensions, + DefaultSerializable, + Serializable, } from './ssr/serializer/transformer' export { diff --git a/packages/router-core/src/ssr/serializer/transformer.ts b/packages/router-core/src/ssr/serializer/transformer.ts index 9e8b2b11309..cf58b4f596e 100644 --- a/packages/router-core/src/ssr/serializer/transformer.ts +++ b/packages/router-core/src/ssr/serializer/transformer.ts @@ -9,14 +9,19 @@ import type { import type { LooseReturnType } from '../../utils' import type { AnyRoute, ResolveAllSSR } from '../../route' -export type Serializable = - | number - | string - | boolean - | null - | undefined - | bigint - | Date +export interface DefaultSerializable { + number: number + string: string + boolean: boolean + null: null + undefined: undefined + bigint: bigint + Date: Date +} + +export interface SerializableExtensions extends DefaultSerializable {} + +export type Serializable = SerializableExtensions[keyof SerializableExtensions] export function createSerializationAdapter< TInput = unknown, diff --git a/packages/start-client-core/src/createServerFn.ts b/packages/start-client-core/src/createServerFn.ts index 5315dbe24a4..3ae9a3682cc 100644 --- a/packages/start-client-core/src/createServerFn.ts +++ b/packages/start-client-core/src/createServerFn.ts @@ -4,6 +4,7 @@ import { mergeHeaders } from '@tanstack/router-core/ssr/client' import { TSS_SERVER_FUNCTION_FACTORY } from './constants' import { getServerContextAfterGlobalMiddlewares } from './getServerContextAfterGlobalMiddlewares' import { getStartOptions } from './getStartOptions' +import type { TSS_SERVER_FUNCTION } from './constants' import type { AnyValidator, Constrain, @@ -248,6 +249,7 @@ export type Fetcher = : RequiredFetcher export interface FetcherBase { + [TSS_SERVER_FUNCTION]: true url: string __executeServer: (opts: { method: Method diff --git a/packages/start-client-core/src/createStart.ts b/packages/start-client-core/src/createStart.ts index 16ca284976e..ac90efaeaf5 100644 --- a/packages/start-client-core/src/createStart.ts +++ b/packages/start-client-core/src/createStart.ts @@ -1,4 +1,5 @@ import { createMiddleware } from './createMiddleware' +import type { TSS_SERVER_FUNCTION } from './constants' import type { AnyFunctionMiddleware, AnyRequestMiddleware, @@ -116,7 +117,7 @@ export type AnyStartInstance = StartInstance export type AnyStartInstanceOptions = StartInstanceOptions declare module '@tanstack/router-core' { - interface Register { - ssr: true + interface SerializableExtensions { + serverFn: { [TSS_SERVER_FUNCTION]: true } } } diff --git a/packages/start-client-core/src/tests/createServerFn.test-d.ts b/packages/start-client-core/src/tests/createServerFn.test-d.ts index b0fdc619281..177c679774c 100644 --- a/packages/start-client-core/src/tests/createServerFn.test-d.ts +++ b/packages/start-client-core/src/tests/createServerFn.test-d.ts @@ -1,6 +1,7 @@ import { describe, expectTypeOf, test } from 'vitest' import { createMiddleware } from '../createMiddleware' import { createServerFn } from '../createServerFn' +import { TSS_SERVER_FUNCTION } from '../constants' import type { Constrain, Register, Validator } from '@tanstack/router-core' import type { ConstrainValidator } from '../createServerFn' @@ -586,3 +587,14 @@ test('createServerFn with inputValidator and request middleware', () => { Promise >() }) + +test('createServerFn has TSS_SERVER_FUNCTION symbol set', () => { + const fn = createServerFn().handler(() => ({})) + expectTypeOf(fn).toHaveProperty(TSS_SERVER_FUNCTION) + expectTypeOf(fn[TSS_SERVER_FUNCTION]).toEqualTypeOf() +}) + +test('createServerFn fetcher itself is serializable', () => { + const fn1 = createServerFn().handler(() => ({})) + const fn2 = createServerFn().handler(() => fn1) +})