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

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