@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.
- 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 +40 -40
- package/dist/esm/createMiddleware.js.map +1 -1
- package/dist/esm/createServerFn.d.ts +49 -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 +101 -91
- package/src/createServerFn.ts +174 -210
- 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 +124 -105
- package/src/tests/createServerMiddleware.test-d.ts +11 -9
- package/src/tests/envOnly.test-d.ts +9 -9
- package/dist/esm/serializer.d.ts +0 -23
- package/dist/esm/serializer.js +0 -152
- package/dist/esm/serializer.js.map +0 -1
- package/dist/esm/tests/serializer.test.d.ts +0 -1
- package/src/serializer.ts +0 -206
- 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,
|
|
@@ -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
|
-
|
|
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,220 @@ 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
321
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
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,
|
|
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, 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
|
|
369
|
+
export type ValidateValidatorInput<
|
|
370
|
+
TRegister extends Register,
|
|
371
|
+
TValidator,
|
|
372
|
+
> = ValidateSerializable<
|
|
407
373
|
ResolveValidatorInput<TValidator>,
|
|
408
|
-
|
|
374
|
+
RegisteredSerializableInput<TRegister> | FormData
|
|
409
375
|
>
|
|
410
376
|
|
|
411
|
-
export type
|
|
412
|
-
|
|
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
|
|
385
|
+
: ResolveValidatorInput<TValidator> extends ValidateValidator<
|
|
386
|
+
TRegister,
|
|
387
|
+
TValidator
|
|
388
|
+
>
|
|
420
389
|
? TValidator
|
|
421
390
|
: never)
|
|
422
|
-
|
|
|
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
|
-
|
|
413
|
+
TMiddlewares,
|
|
427
414
|
TValidator,
|
|
428
415
|
> {
|
|
429
|
-
middleware: <const TNewMiddlewares
|
|
416
|
+
middleware: <const TNewMiddlewares>(
|
|
430
417
|
middlewares: Constrain<
|
|
431
418
|
TNewMiddlewares,
|
|
432
|
-
ReadonlyArray<
|
|
419
|
+
ReadonlyArray<
|
|
420
|
+
| AnyFunctionMiddleware
|
|
421
|
+
| AnyRequestMiddleware
|
|
422
|
+
| ServerFnAfterMiddleware<any, any, any, any>
|
|
423
|
+
>
|
|
433
424
|
>,
|
|
434
425
|
) => ServerFnAfterMiddleware<
|
|
426
|
+
TRegister,
|
|
435
427
|
TMethod,
|
|
436
|
-
|
|
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
|
|
448
|
-
|
|
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<
|
|
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,
|
|
477
|
-
ServerFnHandler<
|
|
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
|
-
|
|
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
|
-
|
|
512
|
-
|
|
513
|
-
|
|
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 = (
|
|
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
|
-
:
|
|
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
|
|
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
|
|
9
|
+
export const createClientOnlyFn: EnvOnlyFn = (fn) => fn
|