@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.
- package/dist/esm/constants.d.ts +5 -0
- package/dist/esm/constants.js +13 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/createClientRpc.d.ts +6 -0
- package/dist/esm/createClientRpc.js +26 -0
- package/dist/esm/createClientRpc.js.map +1 -0
- package/dist/esm/createMiddleware.d.ts +42 -42
- package/dist/esm/createMiddleware.js.map +1 -1
- package/dist/esm/createServerFn.d.ts +57 -61
- package/dist/esm/createServerFn.js +40 -46
- package/dist/esm/createServerFn.js.map +1 -1
- package/dist/esm/envOnly.d.ts +2 -2
- package/dist/esm/envOnly.js +4 -4
- package/dist/esm/envOnly.js.map +1 -1
- package/dist/esm/getRouterInstance.d.ts +1 -0
- package/dist/esm/getRouterInstance.js +7 -0
- package/dist/esm/getRouterInstance.js.map +1 -0
- package/dist/esm/index.d.ts +6 -5
- package/dist/esm/index.js +13 -8
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/serializer/ServerFunctionSerializationAdapter.d.ts +5 -0
- package/dist/esm/serializer/ServerFunctionSerializationAdapter.js +17 -0
- package/dist/esm/serializer/ServerFunctionSerializationAdapter.js.map +1 -0
- package/dist/esm/serializer/getClientSerovalPlugins.d.ts +3 -0
- package/dist/esm/serializer/getClientSerovalPlugins.js +13 -0
- package/dist/esm/serializer/getClientSerovalPlugins.js.map +1 -0
- package/dist/esm/serializer/getDefaultSerovalPlugins.d.ts +1 -0
- package/dist/esm/serializer/getDefaultSerovalPlugins.js +16 -0
- package/dist/esm/serializer/getDefaultSerovalPlugins.js.map +1 -0
- package/dist/esm/serverFnFetcher.d.ts +1 -0
- package/dist/esm/serverFnFetcher.js +217 -0
- package/dist/esm/serverFnFetcher.js.map +1 -0
- package/package.json +5 -4
- package/src/constants.ts +8 -0
- package/src/createClientRpc.ts +26 -0
- package/src/createMiddleware.ts +113 -95
- package/src/createServerFn.ts +230 -208
- package/src/envOnly.ts +2 -2
- package/src/getRouterInstance.ts +7 -0
- package/src/index.tsx +11 -15
- package/src/serializer/ServerFunctionSerializationAdapter.ts +16 -0
- package/src/serializer/getClientSerovalPlugins.ts +10 -0
- package/src/serializer/getDefaultSerovalPlugins.ts +19 -0
- package/src/serverFnFetcher.ts +299 -0
- package/src/tests/createServerFn.test-d.ts +134 -108
- package/src/tests/createServerMiddleware.test-d.ts +16 -9
- package/src/tests/envOnly.test-d.ts +9 -9
- package/dist/esm/serializer.d.ts +0 -23
- package/dist/esm/serializer.js +0 -162
- package/dist/esm/serializer.js.map +0 -1
- package/dist/esm/tests/serializer.test.d.ts +0 -1
- package/src/serializer.ts +0 -219
- package/src/tests/serializer.test.tsx +0 -151
package/src/createServerFn.ts
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
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<
|
|
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
|
-
|
|
63
|
+
const res: ServerFnBuilder<TRegister, TMethod> = {
|
|
72
64
|
options: resolvedOptions as any,
|
|
73
65
|
middleware: (middleware) => {
|
|
74
|
-
|
|
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,
|
|
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,
|
|
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<
|
|
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
|
-
|
|
109
|
-
...extractedFn,
|
|
110
|
-
extractedFn,
|
|
111
|
-
serverFn,
|
|
112
|
-
})
|
|
115
|
+
const newOptions = { ...resolvedOptions, extractedFn, serverFn }
|
|
113
116
|
|
|
114
117
|
const resolvedMiddleware = [
|
|
115
|
-
...(
|
|
116
|
-
serverFnBaseToMiddleware(
|
|
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
|
-
...
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
):
|
|
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
|
-
):
|
|
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
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
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
|
-
|
|
344
|
-
TResponse
|
|
345
|
-
|
|
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,
|
|
357
|
-
) => ServerFnReturnType<
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
407
|
-
|
|
408
|
-
|
|
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
|
|
412
|
-
|
|
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<
|
|
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
|
|
401
|
+
: ResolveValidatorInput<TValidator> extends ValidateValidator<
|
|
402
|
+
TRegister,
|
|
403
|
+
TMethod,
|
|
404
|
+
TValidator
|
|
405
|
+
>
|
|
420
406
|
? TValidator
|
|
421
407
|
: never)
|
|
422
|
-
|
|
|
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
|
-
|
|
420
|
+
TMiddlewares,
|
|
427
421
|
TValidator,
|
|
428
422
|
> {
|
|
429
|
-
middleware: <const TNewMiddlewares
|
|
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
|
-
|
|
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
|
|
448
|
-
|
|
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<
|
|
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
|
|
477
|
-
|
|
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
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
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
|
-
|
|
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
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
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
|
|
525
|
-
|
|
526
|
-
|
|
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
|
-
|
|
529
|
-
return {
|
|
530
|
-
context: {},
|
|
531
|
-
data: formData,
|
|
532
|
-
}
|
|
533
|
-
}
|
|
553
|
+
export type AnyServerFn = ServerFnWithTypes<any, any, any, any, any>
|
|
534
554
|
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
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 = (
|
|
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
|
-
:
|
|
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,
|