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