@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.
- package/dist/esm/{serializer → client}/ServerFunctionSerializationAdapter.js +2 -2
- package/dist/esm/client/ServerFunctionSerializationAdapter.js.map +1 -0
- package/dist/esm/client/createClientRpc.d.ts +6 -0
- package/dist/esm/{createClientRpc.js → client/createClientRpc.js} +4 -4
- package/dist/esm/client/createClientRpc.js.map +1 -0
- package/dist/esm/client/hydrateStart.d.ts +2 -0
- package/dist/esm/client/hydrateStart.js +29 -0
- package/dist/esm/client/hydrateStart.js.map +1 -0
- package/dist/esm/client/index.d.ts +2 -0
- package/dist/esm/client/index.js +7 -0
- package/dist/esm/client/index.js.map +1 -0
- package/dist/esm/{serverFnFetcher.js → client/serverFnFetcher.js} +6 -6
- package/dist/esm/client/serverFnFetcher.js.map +1 -0
- package/dist/esm/constants.d.ts +1 -0
- package/dist/esm/constants.js +4 -0
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/createMiddleware.d.ts +95 -86
- package/dist/esm/createMiddleware.js +5 -5
- package/dist/esm/createMiddleware.js.map +1 -1
- package/dist/esm/createServerFn.d.ts +64 -61
- package/dist/esm/createServerFn.js +57 -30
- package/dist/esm/createServerFn.js.map +1 -1
- package/dist/esm/createStart.d.ts +27 -0
- package/dist/esm/createStart.js +14 -0
- package/dist/esm/createStart.js.map +1 -0
- package/dist/esm/fake-start-entry.d.ts +5 -0
- package/dist/esm/fake-start-entry.js +11 -0
- package/dist/esm/fake-start-entry.js.map +1 -0
- package/dist/esm/getDefaultSerovalPlugins.d.ts +1 -0
- package/dist/esm/getDefaultSerovalPlugins.js +14 -0
- package/dist/esm/getDefaultSerovalPlugins.js.map +1 -0
- package/dist/esm/getGlobalStartContext.d.ts +3 -0
- package/dist/esm/getGlobalStartContext.js +15 -0
- package/dist/esm/getGlobalStartContext.js.map +1 -0
- package/dist/esm/getRouterInstance.d.ts +2 -1
- package/dist/esm/getRouterInstance.js +1 -1
- package/dist/esm/getRouterInstance.js.map +1 -1
- package/dist/esm/getServerContextAfterGlobalMiddlewares.d.ts +1 -0
- package/dist/esm/getServerContextAfterGlobalMiddlewares.js +10 -0
- package/dist/esm/getServerContextAfterGlobalMiddlewares.js.map +1 -0
- package/dist/esm/getStartOptions.d.ts +1 -0
- package/dist/esm/getStartOptions.js +7 -0
- package/dist/esm/getStartOptions.js.map +1 -0
- package/dist/esm/global.d.ts +7 -0
- package/dist/esm/index.d.ts +11 -6
- package/dist/esm/index.js +9 -9
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/serverRoute.d.ts +66 -0
- package/dist/esm/startEntry.d.ts +8 -0
- package/package.json +18 -5
- package/src/{serializer → client}/ServerFunctionSerializationAdapter.ts +2 -2
- package/src/{createClientRpc.ts → client/createClientRpc.ts} +5 -3
- package/src/client/hydrateStart.ts +33 -0
- package/src/client/index.ts +3 -0
- package/src/{serverFnFetcher.ts → client/serverFnFetcher.ts} +11 -16
- package/src/constants.ts +3 -0
- package/src/createMiddleware.ts +269 -255
- package/src/createServerFn.ts +277 -290
- package/src/createStart.ts +122 -0
- package/src/fake-start-entry.ts +4 -0
- package/src/getDefaultSerovalPlugins.ts +17 -0
- package/src/getGlobalStartContext.ts +18 -0
- package/src/getRouterInstance.ts +5 -4
- package/src/getServerContextAfterGlobalMiddlewares.ts +7 -0
- package/src/getStartOptions.ts +6 -0
- package/src/global.ts +9 -0
- package/src/index.tsx +12 -11
- package/src/serverRoute.ts +474 -0
- package/src/start-entry.d.ts +11 -0
- package/src/startEntry.ts +10 -0
- package/src/tests/createServerFn.test-d.ts +147 -123
- package/src/tests/createServerMiddleware.test-d.ts +22 -17
- package/dist/esm/createClientRpc.d.ts +0 -6
- package/dist/esm/createClientRpc.js.map +0 -1
- package/dist/esm/registerGlobalMiddleware.d.ts +0 -5
- package/dist/esm/registerGlobalMiddleware.js +0 -9
- package/dist/esm/registerGlobalMiddleware.js.map +0 -1
- package/dist/esm/serializer/ServerFunctionSerializationAdapter.js.map +0 -1
- package/dist/esm/serializer/getClientSerovalPlugins.d.ts +0 -3
- package/dist/esm/serializer/getClientSerovalPlugins.js +0 -13
- package/dist/esm/serializer/getClientSerovalPlugins.js.map +0 -1
- package/dist/esm/serializer/getDefaultSerovalPlugins.d.ts +0 -3
- package/dist/esm/serializer/getDefaultSerovalPlugins.js +0 -19
- package/dist/esm/serializer/getDefaultSerovalPlugins.js.map +0 -1
- package/dist/esm/serverFnFetcher.js.map +0 -1
- package/src/registerGlobalMiddleware.ts +0 -9
- package/src/serializer/getClientSerovalPlugins.ts +0 -10
- package/src/serializer/getDefaultSerovalPlugins.ts +0 -24
- /package/dist/esm/{serializer → client}/ServerFunctionSerializationAdapter.d.ts +0 -0
- /package/dist/esm/{serverFnFetcher.d.ts → client/serverFnFetcher.d.ts} +0 -0
package/src/createServerFn.ts
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
24
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
46
|
+
TInputValidator
|
|
52
47
|
>,
|
|
53
|
-
)
|
|
48
|
+
) => ServerFnBuilder<TRegister, TMethod>
|
|
49
|
+
|
|
50
|
+
export const createServerFn: CreateServerFn<Register> = (options, __opts) => {
|
|
54
51
|
const resolvedOptions = (__opts || options || {}) as ServerFnBaseOptions<
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
|
60
|
+
resolvedOptions.method = 'GET' as Method
|
|
65
61
|
}
|
|
66
62
|
|
|
67
|
-
|
|
63
|
+
const res: ServerFnBuilder<Register, Method> = {
|
|
68
64
|
options: resolvedOptions as any,
|
|
69
65
|
middleware: (middleware) => {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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<
|
|
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
|
-
|
|
108
|
-
...extractedFn,
|
|
109
|
-
extractedFn,
|
|
110
|
-
serverFn,
|
|
111
|
-
})
|
|
103
|
+
const newOptions = { ...resolvedOptions, extractedFn, serverFn }
|
|
112
104
|
|
|
113
105
|
const resolvedMiddleware = [
|
|
114
|
-
...(
|
|
115
|
-
serverFnBaseToMiddleware(
|
|
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
|
-
...
|
|
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
|
-
...
|
|
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
|
|
188
|
-
|
|
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(
|
|
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
|
-
|
|
240
|
-
|
|
241
|
-
|
|
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
|
|
262
|
+
TRegister,
|
|
286
263
|
TMiddlewares,
|
|
287
|
-
|
|
264
|
+
TInputValidator,
|
|
288
265
|
TResponse,
|
|
289
|
-
TServerFnResponseType extends ServerFnResponseType,
|
|
290
266
|
> extends FetcherBase {
|
|
291
267
|
(
|
|
292
|
-
options?: OptionalFetcherDataOptions<TMiddlewares,
|
|
293
|
-
):
|
|
268
|
+
options?: OptionalFetcherDataOptions<TMiddlewares, TInputValidator>,
|
|
269
|
+
): Promise<FetcherData<TRegister, TResponse>>
|
|
294
270
|
}
|
|
295
271
|
|
|
296
272
|
export interface RequiredFetcher<
|
|
297
|
-
TRegister
|
|
273
|
+
TRegister,
|
|
298
274
|
TMiddlewares,
|
|
299
|
-
|
|
275
|
+
TInputValidator,
|
|
300
276
|
TResponse,
|
|
301
|
-
TServerFnResponseType extends ServerFnResponseType,
|
|
302
277
|
> extends FetcherBase {
|
|
303
278
|
(
|
|
304
|
-
opts: RequiredFetcherDataOptions<TMiddlewares,
|
|
305
|
-
):
|
|
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,
|
|
288
|
+
export interface OptionalFetcherDataOptions<TMiddlewares, TInputValidator>
|
|
314
289
|
extends FetcherBaseOptions {
|
|
315
|
-
data?: Expand<IntersectAllValidatorInputs<TMiddlewares,
|
|
290
|
+
data?: Expand<IntersectAllValidatorInputs<TMiddlewares, TInputValidator>>
|
|
316
291
|
}
|
|
317
292
|
|
|
318
|
-
export interface RequiredFetcherDataOptions<TMiddlewares,
|
|
293
|
+
export interface RequiredFetcherDataOptions<TMiddlewares, TInputValidator>
|
|
319
294
|
extends FetcherBaseOptions {
|
|
320
|
-
data: Expand<IntersectAllValidatorInputs<TMiddlewares,
|
|
295
|
+
data: Expand<IntersectAllValidatorInputs<TMiddlewares, TInputValidator>>
|
|
321
296
|
}
|
|
322
297
|
|
|
323
|
-
export
|
|
324
|
-
|
|
325
|
-
|
|
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
|
-
|
|
350
|
-
|
|
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
|
|
316
|
+
TRegister,
|
|
360
317
|
TMethod,
|
|
361
|
-
TServerFnResponseType extends ServerFnResponseType,
|
|
362
318
|
TMiddlewares,
|
|
363
|
-
|
|
319
|
+
TInputValidator,
|
|
364
320
|
TResponse,
|
|
365
321
|
> = (
|
|
366
|
-
ctx: ServerFnCtx<
|
|
367
|
-
) => ServerFnReturnType<TRegister,
|
|
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
|
-
|
|
329
|
+
TInputValidator,
|
|
374
330
|
> {
|
|
375
331
|
method: TMethod
|
|
376
|
-
|
|
377
|
-
|
|
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
|
|
345
|
+
TRegister,
|
|
396
346
|
TMethod extends Method = 'GET',
|
|
397
|
-
TServerFnResponseType extends ServerFnResponseType = 'data',
|
|
398
347
|
TResponse = unknown,
|
|
399
348
|
TMiddlewares = unknown,
|
|
400
|
-
|
|
349
|
+
TInputValidator = unknown,
|
|
401
350
|
> = {
|
|
402
351
|
method: TMethod
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
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
|
-
|
|
362
|
+
TInputValidator,
|
|
414
363
|
TResponse
|
|
415
364
|
>
|
|
416
365
|
functionId: string
|
|
417
366
|
}
|
|
418
367
|
|
|
419
368
|
export type ValidateValidatorInput<
|
|
420
|
-
TRegister
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
>
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
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<
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
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
|
-
|
|
406
|
+
TMethod,
|
|
407
|
+
TInputValidator
|
|
438
408
|
>
|
|
439
|
-
?
|
|
409
|
+
? TInputValidator
|
|
440
410
|
: never)
|
|
441
|
-
| ValidateValidator<TRegister,
|
|
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
|
|
421
|
+
TRegister,
|
|
445
422
|
TMethod extends Method,
|
|
446
|
-
|
|
447
|
-
|
|
423
|
+
TMiddlewares,
|
|
424
|
+
TInputValidator,
|
|
448
425
|
> {
|
|
449
|
-
middleware: <const TNewMiddlewares
|
|
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
|
-
|
|
458
|
-
|
|
459
|
-
TValidator
|
|
434
|
+
AppendMiddlewares<TMiddlewares, TNewMiddlewares>,
|
|
435
|
+
TInputValidator
|
|
460
436
|
>
|
|
461
437
|
}
|
|
462
438
|
|
|
463
439
|
export interface ServerFnAfterMiddleware<
|
|
464
|
-
TRegister
|
|
440
|
+
TRegister,
|
|
465
441
|
TMethod extends Method,
|
|
466
|
-
TServerFnResponseType extends ServerFnResponseType,
|
|
467
442
|
TMiddlewares,
|
|
468
|
-
|
|
469
|
-
> extends
|
|
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
|
-
|
|
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
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
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
|
|
471
|
+
TRegister,
|
|
500
472
|
TMethod extends Method,
|
|
501
|
-
TServerFnResponseType extends ServerFnResponseType,
|
|
502
473
|
TMiddlewares,
|
|
503
474
|
> {
|
|
504
|
-
|
|
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
|
|
479
|
+
TRegister,
|
|
514
480
|
TMethod extends Method,
|
|
515
|
-
TServerFnResponseType extends ServerFnResponseType,
|
|
516
481
|
TMiddlewares,
|
|
517
|
-
|
|
518
|
-
> extends
|
|
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
|
-
|
|
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
|
|
494
|
+
TRegister,
|
|
534
495
|
TMethod extends Method,
|
|
535
|
-
TServerFnResponseType extends ServerFnResponseType,
|
|
536
496
|
TMiddlewares,
|
|
537
|
-
|
|
538
|
-
> extends
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
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
|
|
509
|
+
TRegister,
|
|
549
510
|
TMethod extends Method,
|
|
550
|
-
TServerFnResponseType extends ServerFnResponseType,
|
|
551
511
|
TMiddlewares,
|
|
552
|
-
|
|
512
|
+
TInputValidator,
|
|
553
513
|
> {
|
|
554
514
|
handler: <TNewResponse>(
|
|
555
515
|
fn?: ServerFn<
|
|
556
516
|
TRegister,
|
|
557
517
|
TMethod,
|
|
558
|
-
TServerFnResponseType,
|
|
559
518
|
TMiddlewares,
|
|
560
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
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
|
-
|
|
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
|
-
:
|
|
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
|
-
|
|
716
|
-
options: ServerFnBaseOptions<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
|
-
|
|
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
|
},
|