@tanstack/start-client-core 1.132.0-alpha.2 → 1.132.0-alpha.21

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.
Files changed (53) hide show
  1. package/dist/esm/constants.d.ts +5 -0
  2. package/dist/esm/constants.js +13 -0
  3. package/dist/esm/constants.js.map +1 -0
  4. package/dist/esm/createClientRpc.d.ts +6 -0
  5. package/dist/esm/createClientRpc.js +26 -0
  6. package/dist/esm/createClientRpc.js.map +1 -0
  7. package/dist/esm/createMiddleware.d.ts +42 -42
  8. package/dist/esm/createMiddleware.js.map +1 -1
  9. package/dist/esm/createServerFn.d.ts +57 -61
  10. package/dist/esm/createServerFn.js +40 -46
  11. package/dist/esm/createServerFn.js.map +1 -1
  12. package/dist/esm/envOnly.d.ts +2 -2
  13. package/dist/esm/envOnly.js +4 -4
  14. package/dist/esm/envOnly.js.map +1 -1
  15. package/dist/esm/getRouterInstance.d.ts +1 -0
  16. package/dist/esm/getRouterInstance.js +7 -0
  17. package/dist/esm/getRouterInstance.js.map +1 -0
  18. package/dist/esm/index.d.ts +6 -5
  19. package/dist/esm/index.js +13 -8
  20. package/dist/esm/index.js.map +1 -1
  21. package/dist/esm/serializer/ServerFunctionSerializationAdapter.d.ts +5 -0
  22. package/dist/esm/serializer/ServerFunctionSerializationAdapter.js +17 -0
  23. package/dist/esm/serializer/ServerFunctionSerializationAdapter.js.map +1 -0
  24. package/dist/esm/serializer/getClientSerovalPlugins.d.ts +3 -0
  25. package/dist/esm/serializer/getClientSerovalPlugins.js +13 -0
  26. package/dist/esm/serializer/getClientSerovalPlugins.js.map +1 -0
  27. package/dist/esm/serializer/getDefaultSerovalPlugins.d.ts +1 -0
  28. package/dist/esm/serializer/getDefaultSerovalPlugins.js +16 -0
  29. package/dist/esm/serializer/getDefaultSerovalPlugins.js.map +1 -0
  30. package/dist/esm/serverFnFetcher.d.ts +1 -0
  31. package/dist/esm/serverFnFetcher.js +217 -0
  32. package/dist/esm/serverFnFetcher.js.map +1 -0
  33. package/package.json +5 -4
  34. package/src/constants.ts +8 -0
  35. package/src/createClientRpc.ts +26 -0
  36. package/src/createMiddleware.ts +113 -95
  37. package/src/createServerFn.ts +230 -208
  38. package/src/envOnly.ts +2 -2
  39. package/src/getRouterInstance.ts +7 -0
  40. package/src/index.tsx +11 -15
  41. package/src/serializer/ServerFunctionSerializationAdapter.ts +16 -0
  42. package/src/serializer/getClientSerovalPlugins.ts +10 -0
  43. package/src/serializer/getDefaultSerovalPlugins.ts +19 -0
  44. package/src/serverFnFetcher.ts +299 -0
  45. package/src/tests/createServerFn.test-d.ts +134 -108
  46. package/src/tests/createServerMiddleware.test-d.ts +16 -9
  47. package/src/tests/envOnly.test-d.ts +9 -9
  48. package/dist/esm/serializer.d.ts +0 -23
  49. package/dist/esm/serializer.js +0 -162
  50. package/dist/esm/serializer.js.map +0 -1
  51. package/dist/esm/tests/serializer.test.d.ts +0 -1
  52. package/src/serializer.ts +0 -219
  53. package/src/tests/serializer.test.tsx +0 -151
@@ -1,29 +1,26 @@
1
1
  import { isNotFound, isRedirect } from '@tanstack/router-core'
2
2
  import { mergeHeaders } from '@tanstack/router-core/ssr/client'
3
- import { getStartContext } from '@tanstack/start-storage-context'
4
3
  import { globalMiddleware } from './registerGlobalMiddleware'
5
4
 
6
- import { startSerializer } from './serializer'
7
-
8
- import { createIsomorphicFn } from './createIsomorphicFn'
9
- import type {
10
- SerializerParse,
11
- SerializerStringify,
12
- SerializerStringifyBy,
13
- } from './serializer'
5
+ import { getRouterInstance } from './getRouterInstance'
6
+ import { TSS_SERVER_FUNCTION_FACTORY } from './constants'
14
7
  import type {
15
8
  AnyRouter,
16
9
  AnyValidator,
17
10
  Constrain,
18
11
  Expand,
12
+ Register,
13
+ RegisteredSerializableInput,
19
14
  ResolveValidatorInput,
15
+ ValidateSerializable,
16
+ ValidateSerializableInput,
17
+ ValidateSerializableInputResult,
20
18
  Validator,
21
19
  } from '@tanstack/router-core'
22
20
  import type { JsonResponse } from '@tanstack/router-core/ssr/client'
23
- import type { Readable } from 'node:stream'
24
21
  import type {
25
22
  AnyFunctionMiddleware,
26
- AssignAllClientSendContext,
23
+ AnyRequestMiddleware,
27
24
  AssignAllServerContext,
28
25
  FunctionMiddlewareClientFnResult,
29
26
  FunctionMiddlewareServerFnResult,
@@ -33,32 +30,27 @@ import type {
33
30
 
34
31
  type TODO = any
35
32
 
36
- const getRouterInstance = createIsomorphicFn()
37
- .client(() => window.__TSR_ROUTER__!)
38
- .server(() => getStartContext({ throwIfNotFound: false })?.router)
39
-
40
33
  export function createServerFn<
34
+ TRegister extends Register,
41
35
  TMethod extends Method,
42
- TServerFnResponseType extends ServerFnResponseType = 'data',
43
36
  TResponse = unknown,
44
37
  TMiddlewares = undefined,
45
38
  TValidator = undefined,
46
39
  >(
47
40
  options?: {
48
41
  method?: TMethod
49
- response?: TServerFnResponseType
50
42
  },
51
43
  __opts?: ServerFnBaseOptions<
44
+ TRegister,
52
45
  TMethod,
53
- TServerFnResponseType,
54
46
  TResponse,
55
47
  TMiddlewares,
56
48
  TValidator
57
49
  >,
58
- ): ServerFnBuilder<TMethod, TServerFnResponseType> {
50
+ ): ServerFnBuilder<TRegister, TMethod> {
59
51
  const resolvedOptions = (__opts || options || {}) as ServerFnBaseOptions<
52
+ TRegister,
60
53
  TMethod,
61
- ServerFnResponseType,
62
54
  TResponse,
63
55
  TMiddlewares,
64
56
  TValidator
@@ -68,52 +60,63 @@ export function createServerFn<
68
60
  resolvedOptions.method = 'GET' as TMethod
69
61
  }
70
62
 
71
- return {
63
+ const res: ServerFnBuilder<TRegister, TMethod> = {
72
64
  options: resolvedOptions as any,
73
65
  middleware: (middleware) => {
74
- return createServerFn<
66
+ // multiple calls to `middleware()` merge the middlewares with the previously supplied ones
67
+ // this is primarily useful for letting users create their own abstractions on top of `createServerFn`
68
+
69
+ const newMiddleware = [...(resolvedOptions.middleware || [])]
70
+ middleware.map((m) => {
71
+ if (TSS_SERVER_FUNCTION_FACTORY in m) {
72
+ if (m.options.middleware) {
73
+ newMiddleware.push(...m.options.middleware)
74
+ }
75
+ } else {
76
+ newMiddleware.push(m)
77
+ }
78
+ })
79
+
80
+ const newOptions = {
81
+ ...resolvedOptions,
82
+ middleware: newMiddleware,
83
+ }
84
+ const res = createServerFn<
85
+ TRegister,
75
86
  TMethod,
76
- ServerFnResponseType,
77
87
  TResponse,
78
88
  TMiddlewares,
79
89
  TValidator
80
- >(undefined, Object.assign(resolvedOptions, { middleware })) as any
90
+ >(undefined, newOptions) as any
91
+ res[TSS_SERVER_FUNCTION_FACTORY] = true
92
+ return res
81
93
  },
82
94
  validator: (validator) => {
95
+ const newOptions = { ...resolvedOptions, validator: validator as any }
83
96
  return createServerFn<
97
+ TRegister,
84
98
  TMethod,
85
- ServerFnResponseType,
86
99
  TResponse,
87
100
  TMiddlewares,
88
101
  TValidator
89
- >(undefined, Object.assign(resolvedOptions, { validator })) as any
102
+ >(undefined, newOptions) as any
90
103
  },
91
104
  handler: (...args) => {
92
105
  // This function signature changes due to AST transformations
93
106
  // in the babel plugin. We need to cast it to the correct
94
107
  // function signature post-transformation
95
108
  const [extractedFn, serverFn] = args as unknown as [
96
- CompiledFetcherFn<TResponse, TServerFnResponseType>,
97
- ServerFn<
98
- TMethod,
99
- TServerFnResponseType,
100
- TMiddlewares,
101
- TValidator,
102
- TResponse
103
- >,
109
+ CompiledFetcherFn<TRegister, TResponse>,
110
+ ServerFn<TRegister, TMethod, TMiddlewares, TValidator, TResponse>,
104
111
  ]
105
112
 
106
113
  // Keep the original function around so we can use it
107
114
  // in the server environment
108
- Object.assign(resolvedOptions, {
109
- ...extractedFn,
110
- extractedFn,
111
- serverFn,
112
- })
115
+ const newOptions = { ...resolvedOptions, extractedFn, serverFn }
113
116
 
114
117
  const resolvedMiddleware = [
115
- ...(resolvedOptions.middleware || []),
116
- serverFnBaseToMiddleware(resolvedOptions),
118
+ ...(newOptions.middleware || []),
119
+ serverFnBaseToMiddleware(newOptions),
117
120
  ]
118
121
 
119
122
  // We want to make sure the new function has the same
@@ -124,16 +127,13 @@ export function createServerFn<
124
127
  // Start by executing the client-side middleware chain
125
128
  return executeMiddleware(resolvedMiddleware, 'client', {
126
129
  ...extractedFn,
127
- ...resolvedOptions,
130
+ ...newOptions,
128
131
  data: opts?.data as any,
129
132
  headers: opts?.headers,
130
133
  signal: opts?.signal,
131
134
  context: {},
132
135
  router: getRouterInstance(),
133
136
  }).then((d) => {
134
- if (resolvedOptions.response === 'full') {
135
- return d
136
- }
137
137
  if (d.error) throw d.error
138
138
  return d.result
139
139
  })
@@ -143,10 +143,7 @@ export function createServerFn<
143
143
  ...extractedFn,
144
144
  // The extracted function on the server-side calls
145
145
  // this function
146
- __executeServer: async (opts_: any, signal: AbortSignal) => {
147
- const opts =
148
- opts_ instanceof FormData ? extractFormDataContext(opts_) : opts_
149
-
146
+ __executeServer: async (opts: any, signal: AbortSignal) => {
150
147
  const ctx = {
151
148
  ...extractedFn,
152
149
  ...opts,
@@ -165,11 +162,21 @@ export function createServerFn<
165
162
  },
166
163
  ) as any
167
164
  },
165
+ } as ServerFnBuilder<TRegister, TMethod>
166
+ const fun = (options?: { method?: TMethod }) => {
167
+ return {
168
+ ...res,
169
+ options: {
170
+ ...res.options,
171
+ ...options,
172
+ },
173
+ }
168
174
  }
175
+ return Object.assign(fun, res)
169
176
  }
170
177
 
171
178
  export async function executeMiddleware(
172
- middlewares: Array<AnyFunctionMiddleware>,
179
+ middlewares: Array<AnyFunctionMiddleware | AnyRequestMiddleware>,
173
180
  env: 'client' | 'server',
174
181
  opts: ServerFnMiddlewareOptions,
175
182
  ): Promise<ServerFnMiddlewareResult> {
@@ -188,15 +195,16 @@ export async function executeMiddleware(
188
195
  }
189
196
 
190
197
  if (
198
+ 'validator' in nextMiddleware.options &&
191
199
  nextMiddleware.options.validator &&
192
- (env === 'client' ? nextMiddleware.options.validateClient : true)
200
+ env === 'server'
193
201
  ) {
194
202
  // Execute the middleware's input function
195
203
  ctx.data = await execValidator(nextMiddleware.options.validator, ctx.data)
196
204
  }
197
205
 
198
206
  const middlewareFn = (
199
- env === 'client'
207
+ env === 'client' && 'client' in nextMiddleware.options
200
208
  ? nextMiddleware.options.client
201
209
  : nextMiddleware.options.server
202
210
  ) as MiddlewareFn | undefined
@@ -232,7 +240,6 @@ export async function executeMiddleware(
232
240
  export type CompiledFetcherFnOptions = {
233
241
  method: Method
234
242
  data: unknown
235
- response?: ServerFnResponseType
236
243
  headers?: HeadersInit
237
244
  signal?: AbortSignal
238
245
  context?: any
@@ -240,30 +247,19 @@ export type CompiledFetcherFnOptions = {
240
247
  }
241
248
 
242
249
  export type Fetcher<
250
+ TRegister extends Register,
243
251
  TMiddlewares,
244
252
  TValidator,
245
253
  TResponse,
246
- TServerFnResponseType extends ServerFnResponseType,
247
254
  > =
248
255
  undefined extends IntersectAllValidatorInputs<TMiddlewares, TValidator>
249
- ? OptionalFetcher<
250
- TMiddlewares,
251
- TValidator,
252
- TResponse,
253
- TServerFnResponseType
254
- >
255
- : RequiredFetcher<
256
- TMiddlewares,
257
- TValidator,
258
- TResponse,
259
- TServerFnResponseType
260
- >
256
+ ? OptionalFetcher<TRegister, TMiddlewares, TValidator, TResponse>
257
+ : RequiredFetcher<TRegister, TMiddlewares, TValidator, TResponse>
261
258
 
262
259
  export interface FetcherBase {
263
260
  url: string
264
261
  __executeServer: (opts: {
265
262
  method: Method
266
- response?: ServerFnResponseType
267
263
  data: unknown
268
264
  headers?: HeadersInit
269
265
  context?: any
@@ -271,36 +267,26 @@ export interface FetcherBase {
271
267
  }) => Promise<unknown>
272
268
  }
273
269
 
274
- export type FetchResult<
275
- TMiddlewares,
276
- TResponse,
277
- TServerFnResponseType extends ServerFnResponseType,
278
- > = TServerFnResponseType extends 'raw'
279
- ? Promise<Response>
280
- : TServerFnResponseType extends 'full'
281
- ? Promise<FullFetcherData<TMiddlewares, TResponse>>
282
- : Promise<FetcherData<TResponse>>
283
-
284
270
  export interface OptionalFetcher<
271
+ TRegister extends Register,
285
272
  TMiddlewares,
286
273
  TValidator,
287
274
  TResponse,
288
- TServerFnResponseType extends ServerFnResponseType,
289
275
  > extends FetcherBase {
290
276
  (
291
277
  options?: OptionalFetcherDataOptions<TMiddlewares, TValidator>,
292
- ): FetchResult<TMiddlewares, TResponse, TServerFnResponseType>
278
+ ): Promise<FetcherData<TRegister, TResponse>>
293
279
  }
294
280
 
295
281
  export interface RequiredFetcher<
282
+ TRegister extends Register,
296
283
  TMiddlewares,
297
284
  TValidator,
298
285
  TResponse,
299
- TServerFnResponseType extends ServerFnResponseType,
300
286
  > extends FetcherBase {
301
287
  (
302
288
  opts: RequiredFetcherDataOptions<TMiddlewares, TValidator>,
303
- ): FetchResult<TMiddlewares, TResponse, TServerFnResponseType>
289
+ ): Promise<FetcherData<TRegister, TResponse>>
304
290
  }
305
291
 
306
292
  export type FetcherBaseOptions = {
@@ -318,240 +304,278 @@ export interface RequiredFetcherDataOptions<TMiddlewares, TValidator>
318
304
  data: Expand<IntersectAllValidatorInputs<TMiddlewares, TValidator>>
319
305
  }
320
306
 
321
- export interface FullFetcherData<TMiddlewares, TResponse> {
322
- error: unknown
323
- result: FetcherData<TResponse>
324
- context: AssignAllClientSendContext<TMiddlewares>
325
- }
326
-
327
- export type FetcherData<TResponse> =
328
- TResponse extends JsonResponse<any>
329
- ? SerializerParse<ReturnType<TResponse['json']>>
330
- : SerializerParse<TResponse>
307
+ export type FetcherData<
308
+ TRegister extends Register,
309
+ TResponse,
310
+ > = TResponse extends Response
311
+ ? Response
312
+ : TResponse extends JsonResponse<any>
313
+ ? ValidateSerializableInputResult<TRegister, ReturnType<TResponse['json']>>
314
+ : ValidateSerializableInputResult<TRegister, TResponse>
331
315
 
332
316
  export type RscStream<T> = {
333
317
  __cacheState: T
334
318
  }
335
319
 
336
320
  export type Method = 'GET' | 'POST'
337
- export type ServerFnResponseType = 'data' | 'full' | 'raw'
338
-
339
- // see https://h3.unjs.io/guide/event-handler#responses-types
340
- export type RawResponse = Response | ReadableStream | Readable | null | string
341
321
 
342
- export type ServerFnReturnType<
343
- TServerFnResponseType extends ServerFnResponseType,
344
- TResponse,
345
- > = TServerFnResponseType extends 'raw'
346
- ? RawResponse | Promise<RawResponse>
347
- : Promise<SerializerStringify<TResponse>> | SerializerStringify<TResponse>
322
+ export type ServerFnReturnType<TRegister extends Register, TResponse> =
323
+ | Response
324
+ | Promise<ValidateSerializableInput<TRegister, TResponse>>
325
+ | ValidateSerializableInput<TRegister, TResponse>
348
326
 
349
327
  export type ServerFn<
328
+ TRegister extends Register,
350
329
  TMethod,
351
- TServerFnResponseType extends ServerFnResponseType,
352
330
  TMiddlewares,
353
331
  TValidator,
354
332
  TResponse,
355
333
  > = (
356
- ctx: ServerFnCtx<TMethod, TServerFnResponseType, TMiddlewares, TValidator>,
357
- ) => ServerFnReturnType<TServerFnResponseType, TResponse>
334
+ ctx: ServerFnCtx<TMethod, TMiddlewares, TValidator>,
335
+ ) => ServerFnReturnType<TRegister, TResponse>
358
336
 
359
- export interface ServerFnCtx<
360
- TMethod,
361
- TServerFnResponseType extends ServerFnResponseType,
362
- TMiddlewares,
363
- TValidator,
364
- > {
337
+ export interface ServerFnCtx<TMethod, TMiddlewares, TValidator> {
365
338
  method: TMethod
366
- response: TServerFnResponseType
367
339
  data: Expand<IntersectAllValidatorOutputs<TMiddlewares, TValidator>>
368
340
  context: Expand<AssignAllServerContext<TMiddlewares>>
369
341
  signal: AbortSignal
370
342
  }
371
343
 
372
- export type CompiledFetcherFn<
373
- TResponse,
374
- TServerFnResponseType extends ServerFnResponseType,
375
- > = {
344
+ export type CompiledFetcherFn<TRegister extends Register, TResponse> = {
376
345
  (
377
- opts: CompiledFetcherFnOptions &
378
- ServerFnBaseOptions<Method, TServerFnResponseType>,
346
+ opts: CompiledFetcherFnOptions & ServerFnBaseOptions<TRegister, Method>,
379
347
  ): Promise<TResponse>
380
348
  url: string
381
349
  }
382
350
 
383
351
  export type ServerFnBaseOptions<
352
+ TRegister extends Register,
384
353
  TMethod extends Method = 'GET',
385
- TServerFnResponseType extends ServerFnResponseType = 'data',
386
354
  TResponse = unknown,
387
355
  TMiddlewares = unknown,
388
356
  TInput = unknown,
389
357
  > = {
390
358
  method: TMethod
391
- response?: TServerFnResponseType
392
- validateClient?: boolean
393
- middleware?: Constrain<TMiddlewares, ReadonlyArray<AnyFunctionMiddleware>>
394
- validator?: ConstrainValidator<TInput>
395
- extractedFn?: CompiledFetcherFn<TResponse, TServerFnResponseType>
396
- serverFn?: ServerFn<
397
- TMethod,
398
- TServerFnResponseType,
359
+ middleware?: Constrain<
399
360
  TMiddlewares,
400
- TInput,
401
- TResponse
361
+ ReadonlyArray<AnyFunctionMiddleware | AnyRequestMiddleware>
402
362
  >
363
+ validator?: ConstrainValidator<TRegister, TMethod, TInput>
364
+ extractedFn?: CompiledFetcherFn<TRegister, TResponse>
365
+ serverFn?: ServerFn<TRegister, TMethod, TMiddlewares, TInput, TResponse>
403
366
  functionId: string
404
367
  }
405
368
 
406
- export type ValidatorInputStringify<TValidator> = SerializerStringifyBy<
407
- ResolveValidatorInput<TValidator>,
408
- Date | undefined | FormData
409
- >
369
+ export type ValidateValidatorInput<
370
+ TRegister extends Register,
371
+ TMethod extends Method,
372
+ TValidator,
373
+ > = TMethod extends 'POST'
374
+ ? ResolveValidatorInput<TValidator> extends FormData
375
+ ? ResolveValidatorInput<TValidator>
376
+ : ValidateSerializable<
377
+ ResolveValidatorInput<TValidator>,
378
+ RegisteredSerializableInput<TRegister>
379
+ >
380
+ : ValidateSerializable<
381
+ ResolveValidatorInput<TValidator>,
382
+ RegisteredSerializableInput<TRegister>
383
+ >
410
384
 
411
- export type ValidatorSerializerStringify<TValidator> =
412
- ValidatorInputStringify<TValidator> extends infer TInput
385
+ export type ValidateValidator<
386
+ TRegister extends Register,
387
+ TMethod extends Method,
388
+ TValidator,
389
+ > =
390
+ ValidateValidatorInput<TRegister, TMethod, TValidator> extends infer TInput
413
391
  ? Validator<TInput, any>
414
392
  : never
415
393
 
416
- export type ConstrainValidator<TValidator> =
394
+ export type ConstrainValidator<
395
+ TRegister extends Register,
396
+ TMethod extends Method,
397
+ TValidator,
398
+ > =
417
399
  | (unknown extends TValidator
418
400
  ? TValidator
419
- : ResolveValidatorInput<TValidator> extends ValidatorInputStringify<TValidator>
401
+ : ResolveValidatorInput<TValidator> extends ValidateValidator<
402
+ TRegister,
403
+ TMethod,
404
+ TValidator
405
+ >
420
406
  ? TValidator
421
407
  : never)
422
- | ValidatorSerializerStringify<TValidator>
408
+ | ValidateValidator<TRegister, TMethod, TValidator>
409
+
410
+ export type AppendMiddlewares<TMiddlewares, TNewMiddlewares> =
411
+ TMiddlewares extends ReadonlyArray<any>
412
+ ? TNewMiddlewares extends ReadonlyArray<any>
413
+ ? readonly [...TMiddlewares, ...TNewMiddlewares]
414
+ : TMiddlewares
415
+ : TNewMiddlewares
423
416
 
424
417
  export interface ServerFnMiddleware<
418
+ TRegister extends Register,
425
419
  TMethod extends Method,
426
- TServerFnResponseType extends ServerFnResponseType,
420
+ TMiddlewares,
427
421
  TValidator,
428
422
  > {
429
- middleware: <const TNewMiddlewares = undefined>(
423
+ middleware: <const TNewMiddlewares>(
430
424
  middlewares: Constrain<
431
425
  TNewMiddlewares,
432
- ReadonlyArray<AnyFunctionMiddleware>
426
+ ReadonlyArray<AnyFunctionMiddleware | AnyRequestMiddleware | AnyServerFn>
433
427
  >,
434
428
  ) => ServerFnAfterMiddleware<
429
+ TRegister,
435
430
  TMethod,
436
- TServerFnResponseType,
437
- TNewMiddlewares,
431
+ AppendMiddlewares<TMiddlewares, TNewMiddlewares>,
438
432
  TValidator
439
433
  >
440
434
  }
441
435
 
442
436
  export interface ServerFnAfterMiddleware<
437
+ TRegister extends Register,
443
438
  TMethod extends Method,
444
- TServerFnResponseType extends ServerFnResponseType,
445
439
  TMiddlewares,
446
440
  TValidator,
447
- > extends ServerFnValidator<TMethod, TServerFnResponseType, TMiddlewares>,
448
- ServerFnHandler<TMethod, TServerFnResponseType, TMiddlewares, TValidator> {}
441
+ > extends ServerFnWithTypes<
442
+ TRegister,
443
+ TMethod,
444
+ TMiddlewares,
445
+ TValidator,
446
+ undefined
447
+ >,
448
+ ServerFnMiddleware<TRegister, TMethod, TMiddlewares, undefined>,
449
+ ServerFnValidator<TRegister, TMethod, TMiddlewares>,
450
+ ServerFnHandler<TRegister, TMethod, TMiddlewares, TValidator> {
451
+ <TNewMethod extends Method = TMethod>(options?: {
452
+ method?: TNewMethod
453
+ }): ServerFnAfterMiddleware<TRegister, TNewMethod, TMiddlewares, TValidator>
454
+ }
449
455
 
450
456
  export type ValidatorFn<
457
+ TRegister extends Register,
451
458
  TMethod extends Method,
452
- TServerFnResponseType extends ServerFnResponseType,
453
459
  TMiddlewares,
454
460
  > = <TValidator>(
455
- validator: ConstrainValidator<TValidator>,
456
- ) => ServerFnAfterValidator<
457
- TMethod,
458
- TServerFnResponseType,
459
- TMiddlewares,
460
- TValidator
461
- >
461
+ validator: ConstrainValidator<TRegister, TMethod, TValidator>,
462
+ ) => ServerFnAfterValidator<TRegister, TMethod, TMiddlewares, TValidator>
462
463
 
463
464
  export interface ServerFnValidator<
465
+ TRegister extends Register,
464
466
  TMethod extends Method,
465
- TServerFnResponseType extends ServerFnResponseType,
466
467
  TMiddlewares,
467
468
  > {
468
- validator: ValidatorFn<TMethod, TServerFnResponseType, TMiddlewares>
469
+ validator: ValidatorFn<TRegister, TMethod, TMiddlewares>
469
470
  }
470
471
 
471
472
  export interface ServerFnAfterValidator<
473
+ TRegister extends Register,
472
474
  TMethod extends Method,
473
- TServerFnResponseType extends ServerFnResponseType,
474
475
  TMiddlewares,
475
476
  TValidator,
476
- > extends ServerFnMiddleware<TMethod, TServerFnResponseType, TValidator>,
477
- ServerFnHandler<TMethod, TServerFnResponseType, TMiddlewares, TValidator> {}
477
+ > extends ServerFnWithTypes<
478
+ TRegister,
479
+ TMethod,
480
+ TMiddlewares,
481
+ TValidator,
482
+ undefined
483
+ >,
484
+ ServerFnMiddleware<TRegister, TMethod, TMiddlewares, TValidator>,
485
+ ServerFnHandler<TRegister, TMethod, TMiddlewares, TValidator> {}
478
486
 
479
487
  export interface ServerFnAfterTyper<
488
+ TRegister extends Register,
480
489
  TMethod extends Method,
481
- TServerFnResponseType extends ServerFnResponseType,
482
490
  TMiddlewares,
483
491
  TValidator,
484
- > extends ServerFnHandler<
485
- TMethod,
486
- TServerFnResponseType,
487
- TMiddlewares,
488
- TValidator
489
- > {}
492
+ > extends ServerFnWithTypes<
493
+ TRegister,
494
+ TMethod,
495
+ TMiddlewares,
496
+ TValidator,
497
+ undefined
498
+ >,
499
+ ServerFnHandler<TRegister, TMethod, TMiddlewares, TValidator> {}
490
500
 
491
501
  // Handler
492
502
  export interface ServerFnHandler<
503
+ TRegister extends Register,
493
504
  TMethod extends Method,
494
- TServerFnResponseType extends ServerFnResponseType,
495
505
  TMiddlewares,
496
506
  TValidator,
497
507
  > {
498
508
  handler: <TNewResponse>(
499
- fn?: ServerFn<
500
- TMethod,
501
- TServerFnResponseType,
502
- TMiddlewares,
503
- TValidator,
504
- TNewResponse
505
- >,
506
- ) => Fetcher<TMiddlewares, TValidator, TNewResponse, TServerFnResponseType>
509
+ fn?: ServerFn<TRegister, TMethod, TMiddlewares, TValidator, TNewResponse>,
510
+ ) => Fetcher<TRegister, TMiddlewares, TValidator, TNewResponse>
507
511
  }
508
512
 
509
513
  export interface ServerFnBuilder<
514
+ TRegister extends Register,
510
515
  TMethod extends Method = 'GET',
511
- TServerFnResponseType extends ServerFnResponseType = 'data',
512
- > extends ServerFnMiddleware<TMethod, TServerFnResponseType, undefined>,
513
- ServerFnValidator<TMethod, TServerFnResponseType, undefined>,
514
- ServerFnHandler<TMethod, TServerFnResponseType, undefined, undefined> {
516
+ > extends ServerFnWithTypes<
517
+ TRegister,
518
+ TMethod,
519
+ undefined,
520
+ undefined,
521
+ undefined
522
+ >,
523
+ ServerFnMiddleware<TRegister, TMethod, undefined, undefined>,
524
+ ServerFnValidator<TRegister, TMethod, undefined>,
525
+ ServerFnHandler<TRegister, TMethod, undefined, undefined> {
515
526
  options: ServerFnBaseOptions<
527
+ TRegister,
516
528
  TMethod,
517
- TServerFnResponseType,
518
529
  unknown,
519
530
  undefined,
520
531
  undefined
521
532
  >
522
533
  }
523
534
 
524
- export function extractFormDataContext(formData: FormData) {
525
- const serializedContext = formData.get('__TSR_CONTEXT')
526
- formData.delete('__TSR_CONTEXT')
535
+ export interface ServerFnWithTypes<
536
+ in out TRegister extends Register,
537
+ in out TMethod extends Method,
538
+ in out TMiddlewares,
539
+ in out TValidator,
540
+ in out TResponse,
541
+ > {
542
+ _types: ServerFnTypes<TMethod, TMiddlewares, TValidator, TResponse>
543
+ options: ServerFnBaseOptions<
544
+ TRegister,
545
+ TMethod,
546
+ unknown,
547
+ undefined,
548
+ undefined
549
+ >
550
+ [TSS_SERVER_FUNCTION_FACTORY]: true
551
+ }
527
552
 
528
- if (typeof serializedContext !== 'string') {
529
- return {
530
- context: {},
531
- data: formData,
532
- }
533
- }
553
+ export type AnyServerFn = ServerFnWithTypes<any, any, any, any, any>
534
554
 
535
- try {
536
- const context = startSerializer.parse(serializedContext)
537
- return {
538
- context,
539
- data: formData,
540
- }
541
- } catch {
542
- return {
543
- data: formData,
544
- }
545
- }
555
+ export interface ServerFnTypes<
556
+ in out TMethod extends Method,
557
+ in out TMiddlewares,
558
+ in out TValidator,
559
+ in out TResponse,
560
+ > {
561
+ method: TMethod
562
+ middlewares: TMiddlewares
563
+ validator: TValidator
564
+ response: TResponse
565
+ allServerContext: AssignAllServerContext<TMiddlewares>
566
+ allInput: IntersectAllValidatorInputs<TMiddlewares, TValidator>
567
+ allOutput: IntersectAllValidatorOutputs<TMiddlewares, TValidator>
546
568
  }
547
569
 
548
570
  export function flattenMiddlewares(
549
- middlewares: Array<AnyFunctionMiddleware>,
550
- ): Array<AnyFunctionMiddleware> {
551
- const seen = new Set<AnyFunctionMiddleware>()
552
- const flattened: Array<AnyFunctionMiddleware> = []
553
-
554
- const recurse = (middleware: Array<AnyFunctionMiddleware>) => {
571
+ middlewares: Array<AnyFunctionMiddleware | AnyRequestMiddleware>,
572
+ ): Array<AnyFunctionMiddleware | AnyRequestMiddleware> {
573
+ const seen = new Set<AnyFunctionMiddleware | AnyRequestMiddleware>()
574
+ const flattened: Array<AnyFunctionMiddleware | AnyRequestMiddleware> = []
575
+
576
+ const recurse = (
577
+ middleware: Array<AnyFunctionMiddleware | AnyRequestMiddleware>,
578
+ ) => {
555
579
  middleware.forEach((m) => {
556
580
  if (m.options.middleware) {
557
581
  recurse(m.options.middleware)
@@ -571,7 +595,6 @@ export function flattenMiddlewares(
571
595
 
572
596
  export type ServerFnMiddlewareOptions = {
573
597
  method: Method
574
- response?: ServerFnResponseType
575
598
  data: any
576
599
  headers?: HeadersInit
577
600
  signal?: AbortSignal
@@ -622,7 +645,7 @@ export const applyMiddleware = async (
622
645
  result:
623
646
  userCtx.result !== undefined
624
647
  ? userCtx.result
625
- : ctx.response === 'raw'
648
+ : userCtx instanceof Response
626
649
  ? userCtx
627
650
  : (ctx as any).result,
628
651
  error: userCtx.error ?? (ctx as any).error,
@@ -667,7 +690,6 @@ export function serverFnBaseToMiddleware(
667
690
  _types: undefined!,
668
691
  options: {
669
692
  validator: options.validator,
670
- validateClient: options.validateClient,
671
693
  client: async ({ next, sendContext, ...ctx }) => {
672
694
  const payload = {
673
695
  ...ctx,