@tanstack/start-client-core 1.132.0-alpha.1 → 1.132.0-alpha.11

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 +40 -40
  8. package/dist/esm/createMiddleware.js.map +1 -1
  9. package/dist/esm/createServerFn.d.ts +49 -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 +101 -91
  37. package/src/createServerFn.ts +174 -210
  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 +124 -105
  46. package/src/tests/createServerMiddleware.test-d.ts +11 -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 -152
  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 -206
  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,
@@ -166,10 +163,20 @@ export function createServerFn<
166
163
  ) as any
167
164
  },
168
165
  }
166
+ const fun = (options?: { method?: TMethod }) => {
167
+ return {
168
+ ...res,
169
+ options: {
170
+ ...res.options,
171
+ ...options,
172
+ },
173
+ }
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,220 @@ 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
321
 
339
- // see https://h3.unjs.io/guide/event-handler#responses-types
340
- export type RawResponse = Response | ReadableStream | Readable | null | string
341
-
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, 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<
369
+ export type ValidateValidatorInput<
370
+ TRegister extends Register,
371
+ TValidator,
372
+ > = ValidateSerializable<
407
373
  ResolveValidatorInput<TValidator>,
408
- Date | undefined | FormData
374
+ RegisteredSerializableInput<TRegister> | FormData
409
375
  >
410
376
 
411
- export type ValidatorSerializerStringify<TValidator> =
412
- ValidatorInputStringify<TValidator> extends infer TInput
377
+ export type ValidateValidator<TRegister extends Register, TValidator> =
378
+ ValidateValidatorInput<TRegister, TValidator> extends infer TInput
413
379
  ? Validator<TInput, any>
414
380
  : never
415
381
 
416
- export type ConstrainValidator<TValidator> =
382
+ export type ConstrainValidator<TRegister extends Register, TValidator> =
417
383
  | (unknown extends TValidator
418
384
  ? TValidator
419
- : ResolveValidatorInput<TValidator> extends ValidatorInputStringify<TValidator>
385
+ : ResolveValidatorInput<TValidator> extends ValidateValidator<
386
+ TRegister,
387
+ TValidator
388
+ >
420
389
  ? TValidator
421
390
  : never)
422
- | ValidatorSerializerStringify<TValidator>
391
+ | ValidateValidator<TRegister, TValidator>
392
+
393
+ type ToTuple<T> = T extends undefined
394
+ ? []
395
+ : T extends ReadonlyArray<any>
396
+ ? T
397
+ : [T]
398
+
399
+ type ExtractMiddlewareArray<T> = T extends readonly [infer Head, ...infer Tail]
400
+ ? Head extends ServerFnAfterMiddleware<
401
+ any,
402
+ any,
403
+ infer TMiddlewares extends ReadonlyArray<unknown>,
404
+ any
405
+ >
406
+ ? [...TMiddlewares, ...ExtractMiddlewareArray<Tail>]
407
+ : [Head, ...ExtractMiddlewareArray<Tail>]
408
+ : []
423
409
 
424
410
  export interface ServerFnMiddleware<
411
+ TRegister extends Register,
425
412
  TMethod extends Method,
426
- TServerFnResponseType extends ServerFnResponseType,
413
+ TMiddlewares,
427
414
  TValidator,
428
415
  > {
429
- middleware: <const TNewMiddlewares = undefined>(
416
+ middleware: <const TNewMiddlewares>(
430
417
  middlewares: Constrain<
431
418
  TNewMiddlewares,
432
- ReadonlyArray<AnyFunctionMiddleware>
419
+ ReadonlyArray<
420
+ | AnyFunctionMiddleware
421
+ | AnyRequestMiddleware
422
+ | ServerFnAfterMiddleware<any, any, any, any>
423
+ >
433
424
  >,
434
425
  ) => ServerFnAfterMiddleware<
426
+ TRegister,
435
427
  TMethod,
436
- TServerFnResponseType,
437
- TNewMiddlewares,
428
+ [...ToTuple<TMiddlewares>, ...ExtractMiddlewareArray<TNewMiddlewares>],
438
429
  TValidator
439
430
  >
440
431
  }
441
432
 
442
433
  export interface ServerFnAfterMiddleware<
434
+ TRegister extends Register,
443
435
  TMethod extends Method,
444
- TServerFnResponseType extends ServerFnResponseType,
445
436
  TMiddlewares,
446
437
  TValidator,
447
- > extends ServerFnValidator<TMethod, TServerFnResponseType, TMiddlewares>,
448
- ServerFnHandler<TMethod, TServerFnResponseType, TMiddlewares, TValidator> {}
438
+ > extends ServerFnMiddleware<TRegister, TMethod, TMiddlewares, undefined>,
439
+ ServerFnValidator<TRegister, TMethod, TMiddlewares>,
440
+ ServerFnHandler<TRegister, TMethod, TMiddlewares, TValidator> {
441
+ <TNewMethod extends Method = TMethod>(options?: {
442
+ method?: TNewMethod
443
+ }): ServerFnAfterMiddleware<TRegister, TNewMethod, TMiddlewares, TValidator>
444
+ options: ServerFnBaseOptions<
445
+ TRegister,
446
+ TMethod,
447
+ unknown,
448
+ TMiddlewares,
449
+ TValidator
450
+ >
451
+ [TSS_SERVER_FUNCTION_FACTORY]: true
452
+ }
449
453
 
450
454
  export type ValidatorFn<
455
+ TRegister extends Register,
451
456
  TMethod extends Method,
452
- TServerFnResponseType extends ServerFnResponseType,
453
457
  TMiddlewares,
454
458
  > = <TValidator>(
455
- validator: ConstrainValidator<TValidator>,
456
- ) => ServerFnAfterValidator<
457
- TMethod,
458
- TServerFnResponseType,
459
- TMiddlewares,
460
- TValidator
461
- >
459
+ validator: ConstrainValidator<TRegister, TValidator>,
460
+ ) => ServerFnAfterValidator<TRegister, TMethod, TMiddlewares, TValidator>
462
461
 
463
462
  export interface ServerFnValidator<
463
+ TRegister extends Register,
464
464
  TMethod extends Method,
465
- TServerFnResponseType extends ServerFnResponseType,
466
465
  TMiddlewares,
467
466
  > {
468
- validator: ValidatorFn<TMethod, TServerFnResponseType, TMiddlewares>
467
+ validator: ValidatorFn<TRegister, TMethod, TMiddlewares>
469
468
  }
470
469
 
471
470
  export interface ServerFnAfterValidator<
471
+ TRegister extends Register,
472
472
  TMethod extends Method,
473
- TServerFnResponseType extends ServerFnResponseType,
474
473
  TMiddlewares,
475
474
  TValidator,
476
- > extends ServerFnMiddleware<TMethod, TServerFnResponseType, TValidator>,
477
- ServerFnHandler<TMethod, TServerFnResponseType, TMiddlewares, TValidator> {}
475
+ > extends ServerFnMiddleware<TRegister, TMethod, TMiddlewares, TValidator>,
476
+ ServerFnHandler<TRegister, TMethod, TMiddlewares, TValidator> {}
478
477
 
479
478
  export interface ServerFnAfterTyper<
479
+ TRegister extends Register,
480
480
  TMethod extends Method,
481
- TServerFnResponseType extends ServerFnResponseType,
482
481
  TMiddlewares,
483
482
  TValidator,
484
- > extends ServerFnHandler<
485
- TMethod,
486
- TServerFnResponseType,
487
- TMiddlewares,
488
- TValidator
489
- > {}
483
+ > extends ServerFnHandler<TRegister, TMethod, TMiddlewares, TValidator> {}
490
484
 
491
485
  // Handler
492
486
  export interface ServerFnHandler<
487
+ TRegister extends Register,
493
488
  TMethod extends Method,
494
- TServerFnResponseType extends ServerFnResponseType,
495
489
  TMiddlewares,
496
490
  TValidator,
497
491
  > {
498
492
  handler: <TNewResponse>(
499
- fn?: ServerFn<
500
- TMethod,
501
- TServerFnResponseType,
502
- TMiddlewares,
503
- TValidator,
504
- TNewResponse
505
- >,
506
- ) => Fetcher<TMiddlewares, TValidator, TNewResponse, TServerFnResponseType>
493
+ fn?: ServerFn<TRegister, TMethod, TMiddlewares, TValidator, TNewResponse>,
494
+ ) => Fetcher<TRegister, TMiddlewares, TValidator, TNewResponse>
507
495
  }
508
496
 
509
497
  export interface ServerFnBuilder<
498
+ TRegister extends Register,
510
499
  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> {
500
+ > extends ServerFnMiddleware<TRegister, TMethod, undefined, undefined>,
501
+ ServerFnValidator<TRegister, TMethod, undefined>,
502
+ ServerFnHandler<TRegister, TMethod, undefined, undefined> {
515
503
  options: ServerFnBaseOptions<
504
+ TRegister,
516
505
  TMethod,
517
- TServerFnResponseType,
518
506
  unknown,
519
507
  undefined,
520
508
  undefined
521
509
  >
522
510
  }
523
511
 
524
- export function extractFormDataContext(formData: FormData) {
525
- const serializedContext = formData.get('__TSR_CONTEXT')
526
- formData.delete('__TSR_CONTEXT')
527
-
528
- if (typeof serializedContext !== 'string') {
529
- return {
530
- context: {},
531
- data: formData,
532
- }
533
- }
534
-
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
- }
546
- }
547
-
548
512
  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>) => {
513
+ middlewares: Array<AnyFunctionMiddleware | AnyRequestMiddleware>,
514
+ ): Array<AnyFunctionMiddleware | AnyRequestMiddleware> {
515
+ const seen = new Set<AnyFunctionMiddleware | AnyRequestMiddleware>()
516
+ const flattened: Array<AnyFunctionMiddleware | AnyRequestMiddleware> = []
517
+
518
+ const recurse = (
519
+ middleware: Array<AnyFunctionMiddleware | AnyRequestMiddleware>,
520
+ ) => {
555
521
  middleware.forEach((m) => {
556
522
  if (m.options.middleware) {
557
523
  recurse(m.options.middleware)
@@ -571,7 +537,6 @@ export function flattenMiddlewares(
571
537
 
572
538
  export type ServerFnMiddlewareOptions = {
573
539
  method: Method
574
- response?: ServerFnResponseType
575
540
  data: any
576
541
  headers?: HeadersInit
577
542
  signal?: AbortSignal
@@ -622,7 +587,7 @@ export const applyMiddleware = async (
622
587
  result:
623
588
  userCtx.result !== undefined
624
589
  ? userCtx.result
625
- : ctx.response === 'raw'
590
+ : userCtx instanceof Response
626
591
  ? userCtx
627
592
  : (ctx as any).result,
628
593
  error: userCtx.error ?? (ctx as any).error,
@@ -667,7 +632,6 @@ export function serverFnBaseToMiddleware(
667
632
  _types: undefined!,
668
633
  options: {
669
634
  validator: options.validator,
670
- validateClient: options.validateClient,
671
635
  client: async ({ next, sendContext, ...ctx }) => {
672
636
  const payload = {
673
637
  ...ctx,
package/src/envOnly.ts CHANGED
@@ -2,8 +2,8 @@ type EnvOnlyFn = <TFn extends (...args: Array<any>) => any>(fn: TFn) => TFn
2
2
 
3
3
  // A function that will only be available in the server build
4
4
  // If called on the client, it will throw an error
5
- export const serverOnly: EnvOnlyFn = (fn) => fn
5
+ export const createServerOnlyFn: EnvOnlyFn = (fn) => fn
6
6
 
7
7
  // A function that will only be available in the client build
8
8
  // If called on the server, it will throw an error
9
- export const clientOnly: EnvOnlyFn = (fn) => fn
9
+ export const createClientOnlyFn: EnvOnlyFn = (fn) => fn