@orpc/server 0.2.1 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/{chunk-26DTFWOI.js → chunk-YYGRQD4L.js} +26 -36
- package/dist/chunk-YYGRQD4L.js.map +1 -0
- package/dist/fetch.js +12 -12
- package/dist/fetch.js.map +1 -1
- package/dist/index.js +9 -15
- package/dist/index.js.map +1 -1
- package/dist/src/adapters/fetch.d.ts +2 -2
- package/dist/src/adapters/fetch.d.ts.map +1 -1
- package/dist/src/builder.d.ts +2 -2
- package/dist/src/builder.d.ts.map +1 -1
- package/dist/src/procedure-builder.d.ts +2 -2
- package/dist/src/procedure-builder.d.ts.map +1 -1
- package/dist/src/procedure-caller.d.ts +7 -16
- package/dist/src/procedure-caller.d.ts.map +1 -1
- package/dist/src/procedure-implementer.d.ts +2 -2
- package/dist/src/procedure-implementer.d.ts.map +1 -1
- package/dist/src/procedure.d.ts +11 -10
- package/dist/src/procedure.d.ts.map +1 -1
- package/dist/src/router-caller.d.ts +8 -17
- package/dist/src/router-caller.d.ts.map +1 -1
- package/dist/src/router.d.ts +2 -2
- package/dist/src/router.d.ts.map +1 -1
- package/dist/src/types.d.ts +0 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -6
- package/src/adapters/fetch.test.ts +18 -18
- package/src/adapters/fetch.ts +9 -5
- package/src/builder.test.ts +4 -4
- package/src/builder.ts +6 -6
- package/src/middleware.test.ts +1 -1
- package/src/procedure-builder.test.ts +2 -2
- package/src/procedure-builder.ts +6 -6
- package/src/procedure-caller.test.ts +27 -36
- package/src/procedure-caller.ts +36 -44
- package/src/procedure-implementer.test.ts +8 -8
- package/src/procedure-implementer.ts +6 -6
- package/src/procedure.test.ts +20 -20
- package/src/procedure.ts +30 -45
- package/src/router-builder.test.ts +4 -4
- package/src/router-caller.test.ts +5 -52
- package/src/router-caller.ts +11 -31
- package/src/router-implementer.test.ts +6 -6
- package/src/router.test-d.ts +2 -2
- package/src/router.test.ts +10 -10
- package/src/router.ts +4 -4
- package/src/types.ts +0 -1
- package/dist/chunk-26DTFWOI.js.map +0 -1
package/src/adapters/fetch.ts
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
import type {
|
4
4
|
PartialOnUndefinedDeep,
|
5
5
|
Promisable,
|
6
|
+
Value,
|
6
7
|
} from '@orpc/shared'
|
7
8
|
import type { Router } from '../router'
|
8
9
|
import {
|
@@ -16,6 +17,7 @@ import {
|
|
16
17
|
isPlainObject,
|
17
18
|
mapValues,
|
18
19
|
trim,
|
20
|
+
value,
|
19
21
|
} from '@orpc/shared'
|
20
22
|
import { ORPCError } from '@orpc/shared/error'
|
21
23
|
import {
|
@@ -91,6 +93,8 @@ export function createFetchHandler<TRouter extends Router<any>>(
|
|
91
93
|
? new ORPCSerializer()
|
92
94
|
: new OpenAPISerializer({ accept })
|
93
95
|
|
96
|
+
const context = await value(requestOptions.context)
|
97
|
+
|
94
98
|
const handler = async () => {
|
95
99
|
const url = new URL(requestOptions.request.url)
|
96
100
|
const pathname = `/${trim(url.pathname.replace(requestOptions.prefix ?? '', ''), '/')}`
|
@@ -196,9 +200,7 @@ export function createFetchHandler<TRouter extends Router<any>>(
|
|
196
200
|
})()
|
197
201
|
|
198
202
|
const caller = createProcedureCaller({
|
199
|
-
context
|
200
|
-
internal: false,
|
201
|
-
validate: true,
|
203
|
+
context,
|
202
204
|
procedure,
|
203
205
|
path,
|
204
206
|
})
|
@@ -214,7 +216,7 @@ export function createFetchHandler<TRouter extends Router<any>>(
|
|
214
216
|
}
|
215
217
|
|
216
218
|
try {
|
217
|
-
return await options.hooks?.(
|
219
|
+
return await options.hooks?.(context as any, {
|
218
220
|
next: handler,
|
219
221
|
response: response => response,
|
220
222
|
}) ?? await handler()
|
@@ -268,7 +270,9 @@ export type FetchHandlerOptions<TRouter extends Router<any>> = {
|
|
268
270
|
/**
|
269
271
|
* The context used to handle the request.
|
270
272
|
*/
|
271
|
-
context:
|
273
|
+
context: Value<
|
274
|
+
TRouter extends Router<infer UContext> ? UContext : never
|
275
|
+
>
|
272
276
|
}>
|
273
277
|
|
274
278
|
export interface FetchHandler<TRouter extends Router<any>> {
|
package/src/builder.test.ts
CHANGED
@@ -74,7 +74,7 @@ describe('use middleware', () => {
|
|
74
74
|
return { postId: '1' }
|
75
75
|
},
|
76
76
|
)
|
77
|
-
.
|
77
|
+
.func((_, context) => {
|
78
78
|
expectTypeOf(context).toMatchTypeOf<{ user: string }>()
|
79
79
|
})
|
80
80
|
})
|
@@ -145,7 +145,7 @@ it('router method', () => {
|
|
145
145
|
// Because of the router keyword is special, we can't use instanceof
|
146
146
|
expect(osw.router.zz$pi.contract).toEqual(userFindContract)
|
147
147
|
expect(
|
148
|
-
osw.router.
|
148
|
+
osw.router.func(() => {
|
149
149
|
return { name: '' }
|
150
150
|
}),
|
151
151
|
).toSatisfy(isProcedure)
|
@@ -286,7 +286,7 @@ describe('handler method', () => {
|
|
286
286
|
it('without middlewares', () => {
|
287
287
|
const osw = os.context<{ auth: boolean }>()
|
288
288
|
|
289
|
-
const procedure = osw.
|
289
|
+
const procedure = osw.func((input, context, meta) => {
|
290
290
|
expectTypeOf(input).toEqualTypeOf<unknown>()
|
291
291
|
expectTypeOf(context).toEqualTypeOf<{ auth: boolean }>()
|
292
292
|
expectTypeOf(meta).toEqualTypeOf<Meta>()
|
@@ -317,7 +317,7 @@ describe('handler method', () => {
|
|
317
317
|
|
318
318
|
const osw = os.context<{ auth: boolean }>().use(mid)
|
319
319
|
|
320
|
-
const procedure = osw.
|
320
|
+
const procedure = osw.func((input, context, meta) => {
|
321
321
|
expectTypeOf(input).toEqualTypeOf<unknown>()
|
322
322
|
expectTypeOf(context).toMatchTypeOf<{ auth: boolean }>()
|
323
323
|
expectTypeOf(meta).toEqualTypeOf<Meta>()
|
package/src/builder.ts
CHANGED
@@ -20,7 +20,7 @@ import {
|
|
20
20
|
import {
|
21
21
|
type DecoratedProcedure,
|
22
22
|
decorateProcedure,
|
23
|
-
type
|
23
|
+
type ProcedureFunc,
|
24
24
|
} from './procedure'
|
25
25
|
import { ProcedureBuilder } from './procedure-builder'
|
26
26
|
import { ProcedureImplementer } from './procedure-implementer'
|
@@ -137,20 +137,20 @@ export class Builder<TContext extends Context, TExtraContext extends Context> {
|
|
137
137
|
/**
|
138
138
|
* Convert to Procedure
|
139
139
|
*/
|
140
|
-
|
141
|
-
|
140
|
+
func<UFuncOutput = undefined>(
|
141
|
+
func: ProcedureFunc<
|
142
142
|
TContext,
|
143
143
|
TExtraContext,
|
144
144
|
undefined,
|
145
145
|
undefined,
|
146
|
-
|
146
|
+
UFuncOutput
|
147
147
|
>,
|
148
148
|
): DecoratedProcedure<
|
149
149
|
TContext,
|
150
150
|
TExtraContext,
|
151
151
|
undefined,
|
152
152
|
undefined,
|
153
|
-
|
153
|
+
UFuncOutput
|
154
154
|
> {
|
155
155
|
return decorateProcedure({
|
156
156
|
zz$p: {
|
@@ -159,7 +159,7 @@ export class Builder<TContext extends Context, TExtraContext extends Context> {
|
|
159
159
|
InputSchema: undefined,
|
160
160
|
OutputSchema: undefined,
|
161
161
|
}),
|
162
|
-
|
162
|
+
func,
|
163
163
|
},
|
164
164
|
})
|
165
165
|
}
|
package/src/middleware.test.ts
CHANGED
@@ -163,7 +163,7 @@ describe('use middleware', () => {
|
|
163
163
|
|
164
164
|
describe('handler', () => {
|
165
165
|
it('infer types', () => {
|
166
|
-
const handler = builder.
|
166
|
+
const handler = builder.func((input, context, meta) => {
|
167
167
|
expectTypeOf(input).toEqualTypeOf<unknown>()
|
168
168
|
expectTypeOf(context).toEqualTypeOf<{ auth: boolean }>()
|
169
169
|
expectTypeOf(meta).toEqualTypeOf<Meta>()
|
@@ -196,7 +196,7 @@ describe('handler', () => {
|
|
196
196
|
const handler = builder
|
197
197
|
.use(mid1)
|
198
198
|
.use(mid2)
|
199
|
-
.
|
199
|
+
.func((input, context, meta) => {
|
200
200
|
expectTypeOf(input).toEqualTypeOf<unknown>()
|
201
201
|
expectTypeOf(context).toEqualTypeOf<
|
202
202
|
{ userId: string } & { auth: boolean }
|
package/src/procedure-builder.ts
CHANGED
@@ -11,7 +11,7 @@ import {
|
|
11
11
|
import {
|
12
12
|
type DecoratedProcedure,
|
13
13
|
decorateProcedure,
|
14
|
-
type
|
14
|
+
type ProcedureFunc,
|
15
15
|
} from './procedure'
|
16
16
|
import { ProcedureImplementer } from './procedure-implementer'
|
17
17
|
|
@@ -132,26 +132,26 @@ export class ProcedureBuilder<
|
|
132
132
|
* Convert to Procedure
|
133
133
|
*/
|
134
134
|
|
135
|
-
|
136
|
-
|
135
|
+
func<UFuncOutput extends SchemaOutput<TOutputSchema>>(
|
136
|
+
func: ProcedureFunc<
|
137
137
|
TContext,
|
138
138
|
TExtraContext,
|
139
139
|
TInputSchema,
|
140
140
|
TOutputSchema,
|
141
|
-
|
141
|
+
UFuncOutput
|
142
142
|
>,
|
143
143
|
): DecoratedProcedure<
|
144
144
|
TContext,
|
145
145
|
TExtraContext,
|
146
146
|
TInputSchema,
|
147
147
|
TOutputSchema,
|
148
|
-
|
148
|
+
UFuncOutput
|
149
149
|
> {
|
150
150
|
return decorateProcedure({
|
151
151
|
zz$p: {
|
152
152
|
middlewares: this.zz$pb.middlewares,
|
153
153
|
contract: this.zz$pb.contract,
|
154
|
-
|
154
|
+
func,
|
155
155
|
},
|
156
156
|
})
|
157
157
|
}
|
@@ -2,17 +2,15 @@ import { z } from 'zod'
|
|
2
2
|
import { createProcedureCaller, os } from '.'
|
3
3
|
|
4
4
|
describe('createProcedureCaller', () => {
|
5
|
-
|
6
|
-
|
7
|
-
let context = { auth: true }
|
5
|
+
const path = ['ping']
|
6
|
+
const context = { auth: true }
|
8
7
|
|
9
8
|
const osw = os.context<{ auth?: boolean }>()
|
10
9
|
const procedure = osw
|
11
10
|
.input(z.object({ value: z.string().transform(v => Number(v)) }))
|
12
11
|
.output(z.object({ value: z.number().transform(v => v.toString()) }))
|
13
|
-
.
|
12
|
+
.func((input, context, meta) => {
|
14
13
|
expect(context).toEqual(context)
|
15
|
-
expect(meta.internal).toBe(internal)
|
16
14
|
expect(meta.path).toBe(path)
|
17
15
|
|
18
16
|
return input
|
@@ -34,8 +32,7 @@ describe('createProcedureCaller', () => {
|
|
34
32
|
it('with validate', async () => {
|
35
33
|
const caller = createProcedureCaller({
|
36
34
|
procedure,
|
37
|
-
context,
|
38
|
-
internal,
|
35
|
+
context: async () => context,
|
39
36
|
path,
|
40
37
|
})
|
41
38
|
|
@@ -53,41 +50,14 @@ describe('createProcedureCaller', () => {
|
|
53
50
|
)
|
54
51
|
})
|
55
52
|
|
56
|
-
it('without validate', async () => {
|
57
|
-
internal = true
|
58
|
-
path = []
|
59
|
-
context = { auth: false }
|
60
|
-
|
61
|
-
const caller = createProcedureCaller({
|
62
|
-
procedure,
|
63
|
-
context,
|
64
|
-
internal,
|
65
|
-
path,
|
66
|
-
validate: false,
|
67
|
-
})
|
68
|
-
|
69
|
-
expectTypeOf(caller).toMatchTypeOf<
|
70
|
-
(input: { value: number }) => Promise<{
|
71
|
-
value: number
|
72
|
-
}>
|
73
|
-
>()
|
74
|
-
|
75
|
-
expect(await caller({ value: 123 })).toEqual({ value: 123 })
|
76
|
-
|
77
|
-
// @ts-expect-error it's not validate so bellow still works
|
78
|
-
expect(await caller({ value: '123' })).toEqual({ value: '123' })
|
79
|
-
})
|
80
|
-
|
81
53
|
it('without validate and schema', () => {
|
82
|
-
const procedure = osw.
|
54
|
+
const procedure = osw.func(() => {
|
83
55
|
return { value: true }
|
84
56
|
})
|
85
57
|
|
86
58
|
const caller = createProcedureCaller({
|
87
59
|
procedure,
|
88
60
|
context,
|
89
|
-
internal,
|
90
|
-
validate: false,
|
91
61
|
})
|
92
62
|
|
93
63
|
expectTypeOf(caller).toMatchTypeOf<
|
@@ -146,7 +116,7 @@ describe('createProcedureCaller', () => {
|
|
146
116
|
.input(z.object({ id: z.string() }))
|
147
117
|
.use(mid1)
|
148
118
|
.use(mid2)
|
149
|
-
.
|
119
|
+
.func((input, context, meta) => {
|
150
120
|
expect(context).toEqual({ userId: '1', auth: false })
|
151
121
|
|
152
122
|
expect(ref.value).toBe(2)
|
@@ -162,4 +132,25 @@ describe('createProcedureCaller', () => {
|
|
162
132
|
|
163
133
|
expect(caller({ id: '1' })).resolves.toEqual('pong')
|
164
134
|
})
|
135
|
+
|
136
|
+
it('accept form data', async () => {
|
137
|
+
const ping = osw
|
138
|
+
.input(z.object({ id: z.number() }))
|
139
|
+
.output(z.object({ id: z.number() }))
|
140
|
+
.func((input, context, meta) => {
|
141
|
+
expect(context).toEqual(context)
|
142
|
+
|
143
|
+
return input
|
144
|
+
})
|
145
|
+
|
146
|
+
const caller = createProcedureCaller({
|
147
|
+
procedure: ping,
|
148
|
+
context,
|
149
|
+
})
|
150
|
+
|
151
|
+
const form = new FormData()
|
152
|
+
form.append('id', '1')
|
153
|
+
|
154
|
+
expect(await caller(form)).toEqual({ id: 1 })
|
155
|
+
})
|
165
156
|
})
|
package/src/procedure-caller.ts
CHANGED
@@ -2,84 +2,78 @@ import type { SchemaInput, SchemaOutput } from '@orpc/contract'
|
|
2
2
|
import type { MiddlewareMeta } from './middleware'
|
3
3
|
import type { Procedure } from './procedure'
|
4
4
|
import type { Context } from './types'
|
5
|
+
import { type Value, value } from '@orpc/shared'
|
5
6
|
import { ORPCError } from '@orpc/shared/error'
|
7
|
+
import { OpenAPIDeserializer } from '@orpc/transformer'
|
6
8
|
import { mergeContext } from './utils'
|
7
9
|
|
8
10
|
export interface CreateProcedureCallerOptions<
|
9
11
|
TProcedure extends Procedure<any, any, any, any, any>,
|
10
|
-
TValidate extends boolean,
|
11
12
|
> {
|
12
13
|
procedure: TProcedure
|
13
14
|
|
14
15
|
/**
|
15
16
|
* The context used when calling the procedure.
|
16
17
|
*/
|
17
|
-
context:
|
18
|
-
|
19
|
-
|
18
|
+
context: Value<
|
19
|
+
TProcedure extends Procedure<infer UContext, any, any, any, any>
|
20
|
+
? UContext
|
21
|
+
: never
|
22
|
+
>
|
20
23
|
|
21
24
|
/**
|
22
25
|
* This is helpful for logging and analytics.
|
23
|
-
*/
|
24
|
-
path?: string[]
|
25
|
-
|
26
|
-
/**
|
27
|
-
* This flag helpful when you want bypass some logics not necessary to internal server calls.
|
28
26
|
*
|
29
|
-
* @
|
27
|
+
* @internal
|
30
28
|
*/
|
31
|
-
|
32
|
-
|
33
|
-
/**
|
34
|
-
* Indicate whether validate input and output.
|
35
|
-
*
|
36
|
-
* @default true
|
37
|
-
*/
|
38
|
-
validate?: TValidate
|
29
|
+
path?: string[]
|
39
30
|
}
|
40
31
|
|
41
32
|
export type ProcedureCaller<
|
42
33
|
TProcedure extends Procedure<any, any, any, any, any>,
|
43
|
-
TValidate extends boolean,
|
44
34
|
> = TProcedure extends Procedure<
|
45
35
|
any,
|
46
36
|
any,
|
47
37
|
infer UInputSchema,
|
48
38
|
infer UOutputSchema,
|
49
|
-
infer
|
39
|
+
infer UFuncOutput
|
50
40
|
>
|
51
41
|
? (
|
52
|
-
input:
|
53
|
-
? SchemaInput<UInputSchema>
|
54
|
-
: SchemaOutput<UInputSchema>,
|
42
|
+
input: SchemaInput<UInputSchema> | FormData,
|
55
43
|
) => Promise<
|
56
|
-
|
57
|
-
? SchemaOutput<UOutputSchema, UHandlerOutput>
|
58
|
-
: SchemaInput<UOutputSchema, UHandlerOutput>
|
44
|
+
SchemaOutput<UOutputSchema, UFuncOutput>
|
59
45
|
>
|
60
46
|
: never
|
61
47
|
|
62
48
|
export function createProcedureCaller<
|
63
49
|
TProcedure extends Procedure<any, any, any, any, any>,
|
64
|
-
TValidate extends boolean = true,
|
65
50
|
>(
|
66
|
-
options: CreateProcedureCallerOptions<TProcedure
|
67
|
-
): ProcedureCaller<TProcedure
|
68
|
-
const internal = options.internal ?? true
|
51
|
+
options: CreateProcedureCallerOptions<TProcedure>,
|
52
|
+
): ProcedureCaller<TProcedure> {
|
69
53
|
const path = options.path ?? []
|
70
54
|
const procedure = options.procedure
|
71
|
-
const validate = options.validate ?? true
|
72
55
|
|
73
56
|
const caller = async (input: unknown): Promise<unknown> => {
|
74
|
-
const
|
75
|
-
if (!
|
57
|
+
const input_ = (() => {
|
58
|
+
if (!(input instanceof FormData)) {
|
76
59
|
return input
|
60
|
+
}
|
61
|
+
|
62
|
+
const transformer = new OpenAPIDeserializer({
|
63
|
+
schema: procedure.zz$p.contract.zz$cp.InputSchema,
|
64
|
+
})
|
65
|
+
|
66
|
+
return transformer.deserializeAsFormData(input)
|
67
|
+
})()
|
68
|
+
|
69
|
+
const validInput = (() => {
|
77
70
|
const schema = procedure.zz$p.contract.zz$cp.InputSchema
|
78
|
-
if (!schema)
|
79
|
-
return
|
71
|
+
if (!schema) {
|
72
|
+
return input_
|
73
|
+
}
|
80
74
|
|
81
75
|
try {
|
82
|
-
return schema.parse(
|
76
|
+
return schema.parse(input_)
|
83
77
|
}
|
84
78
|
catch (e) {
|
85
79
|
throw new ORPCError({
|
@@ -92,7 +86,7 @@ export function createProcedureCaller<
|
|
92
86
|
|
93
87
|
const middlewares = procedure.zz$p.middlewares ?? []
|
94
88
|
let currentMidIndex = 0
|
95
|
-
let currentContext: Context = options.context
|
89
|
+
let currentContext: Context = await value(options.context)
|
96
90
|
|
97
91
|
const next: MiddlewareMeta<unknown>['next'] = async (nextOptions) => {
|
98
92
|
const mid = middlewares[currentMidIndex]
|
@@ -103,17 +97,15 @@ export function createProcedureCaller<
|
|
103
97
|
return await mid(validInput, currentContext, {
|
104
98
|
path,
|
105
99
|
procedure,
|
106
|
-
internal,
|
107
100
|
next,
|
108
101
|
output: output => ({ output, context: undefined }),
|
109
102
|
})
|
110
103
|
}
|
111
104
|
else {
|
112
105
|
return {
|
113
|
-
output: await await procedure.zz$p.
|
106
|
+
output: await await procedure.zz$p.func(validInput, currentContext, {
|
114
107
|
path,
|
115
108
|
procedure,
|
116
|
-
internal,
|
117
109
|
}),
|
118
110
|
context: currentContext,
|
119
111
|
}
|
@@ -123,11 +115,11 @@ export function createProcedureCaller<
|
|
123
115
|
const output = (await next({})).output
|
124
116
|
|
125
117
|
const validOutput = await (async () => {
|
126
|
-
if (!validate)
|
127
|
-
return output
|
128
118
|
const schema = procedure.zz$p.contract.zz$cp.OutputSchema
|
129
|
-
if (!schema)
|
119
|
+
if (!schema) {
|
130
120
|
return output
|
121
|
+
}
|
122
|
+
|
131
123
|
const result = await schema.safeParseAsync(output)
|
132
124
|
if (result.error) {
|
133
125
|
throw new ORPCError({
|
@@ -142,5 +134,5 @@ export function createProcedureCaller<
|
|
142
134
|
return validOutput
|
143
135
|
}
|
144
136
|
|
145
|
-
return caller as ProcedureCaller<TProcedure
|
137
|
+
return caller as ProcedureCaller<TProcedure>
|
146
138
|
}
|
@@ -111,9 +111,9 @@ describe('use middleware', () => {
|
|
111
111
|
|
112
112
|
describe('output schema', () => {
|
113
113
|
it('auto infer output schema if output schema is not specified', async () => {
|
114
|
-
const sr = os.
|
114
|
+
const sr = os.func(() => ({ a: 1 }))
|
115
115
|
|
116
|
-
const result = await sr.zz$p.
|
116
|
+
const result = await sr.zz$p.func({}, undefined, {
|
117
117
|
method: 'GET',
|
118
118
|
path: '/',
|
119
119
|
} as any)
|
@@ -129,9 +129,9 @@ describe('output schema', () => {
|
|
129
129
|
}),
|
130
130
|
})
|
131
131
|
|
132
|
-
const sr = srb1.
|
132
|
+
const sr = srb1.func(() => ({ b: 1 }))
|
133
133
|
|
134
|
-
const result = await sr.zz$p.
|
134
|
+
const result = await sr.zz$p.func({}, {}, {
|
135
135
|
method: 'GET',
|
136
136
|
path: '/',
|
137
137
|
} as any)
|
@@ -142,7 +142,7 @@ describe('output schema', () => {
|
|
142
142
|
|
143
143
|
describe('handler', () => {
|
144
144
|
it('infer types', () => {
|
145
|
-
const handler = implementer1.
|
145
|
+
const handler = implementer1.func((input, context, meta) => {
|
146
146
|
expectTypeOf(input).toEqualTypeOf<unknown>()
|
147
147
|
expectTypeOf(context).toEqualTypeOf<{ auth: boolean }>()
|
148
148
|
expectTypeOf(meta).toEqualTypeOf<Meta>()
|
@@ -163,7 +163,7 @@ describe('handler', () => {
|
|
163
163
|
>()
|
164
164
|
expect(isProcedure(handler)).toBe(true)
|
165
165
|
|
166
|
-
implementer2.
|
166
|
+
implementer2.func((input, context, meta) => {
|
167
167
|
expectTypeOf(input).toEqualTypeOf<{ id: string }>()
|
168
168
|
expectTypeOf(context).toEqualTypeOf<{ auth: boolean }>()
|
169
169
|
expectTypeOf(meta).toEqualTypeOf<Meta>()
|
@@ -174,7 +174,7 @@ describe('handler', () => {
|
|
174
174
|
})
|
175
175
|
|
176
176
|
// @ts-expect-error mismatch output
|
177
|
-
implementer2.
|
177
|
+
implementer2.func(() => {})
|
178
178
|
})
|
179
179
|
|
180
180
|
it('combine middlewares', () => {
|
@@ -193,7 +193,7 @@ describe('handler', () => {
|
|
193
193
|
const handler = implementer2
|
194
194
|
.use(mid1)
|
195
195
|
.use(mid2)
|
196
|
-
.
|
196
|
+
.func((input, context, meta) => {
|
197
197
|
expectTypeOf(input).toEqualTypeOf<{ id: string }>()
|
198
198
|
expectTypeOf(context).toEqualTypeOf<
|
199
199
|
{ auth: boolean } & { userId: string }
|
@@ -8,7 +8,7 @@ import {
|
|
8
8
|
import {
|
9
9
|
type DecoratedProcedure,
|
10
10
|
decorateProcedure,
|
11
|
-
type
|
11
|
+
type ProcedureFunc,
|
12
12
|
} from './procedure'
|
13
13
|
|
14
14
|
export class ProcedureImplementer<
|
@@ -76,26 +76,26 @@ export class ProcedureImplementer<
|
|
76
76
|
})
|
77
77
|
}
|
78
78
|
|
79
|
-
|
80
|
-
|
79
|
+
func<UFuncOutput extends SchemaOutput<TOutputSchema>>(
|
80
|
+
func: ProcedureFunc<
|
81
81
|
TContext,
|
82
82
|
TExtraContext,
|
83
83
|
TInputSchema,
|
84
84
|
TOutputSchema,
|
85
|
-
|
85
|
+
UFuncOutput
|
86
86
|
>,
|
87
87
|
): DecoratedProcedure<
|
88
88
|
TContext,
|
89
89
|
TExtraContext,
|
90
90
|
TInputSchema,
|
91
91
|
TOutputSchema,
|
92
|
-
|
92
|
+
UFuncOutput
|
93
93
|
> {
|
94
94
|
return decorateProcedure({
|
95
95
|
zz$p: {
|
96
96
|
middlewares: this.zz$pi.middlewares,
|
97
97
|
contract: this.zz$pi.contract,
|
98
|
-
|
98
|
+
func,
|
99
99
|
},
|
100
100
|
})
|
101
101
|
}
|