@tanstack/start-client-core 1.132.0-alpha.8 → 1.132.0

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