@orpc/server 0.1.0 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/chunk-26DTFWOI.js +200 -0
- package/dist/chunk-26DTFWOI.js.map +1 -0
- package/dist/fetch.js +87 -91
- package/dist/fetch.js.map +1 -1
- package/dist/index.js +6 -9
- package/dist/index.js.map +1 -1
- package/dist/src/adapters/fetch.d.ts +9 -3
- package/dist/src/adapters/fetch.d.ts.map +1 -1
- package/dist/src/builder.d.ts +4 -4
- package/dist/src/builder.d.ts.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/middleware.d.ts +17 -7
- package/dist/src/middleware.d.ts.map +1 -1
- package/dist/src/procedure-builder.d.ts +4 -4
- package/dist/src/procedure-builder.d.ts.map +1 -1
- package/dist/src/procedure-caller.d.ts +0 -5
- package/dist/src/procedure-caller.d.ts.map +1 -1
- package/dist/src/procedure-implementer.d.ts +4 -5
- package/dist/src/procedure-implementer.d.ts.map +1 -1
- package/dist/src/procedure.d.ts +8 -9
- package/dist/src/procedure.d.ts.map +1 -1
- package/dist/src/router-builder.d.ts +2 -2
- package/dist/src/router-builder.d.ts.map +1 -1
- package/dist/src/router-caller.d.ts +1 -6
- package/dist/src/router-caller.d.ts.map +1 -1
- package/dist/src/router-implementer.d.ts +2 -2
- package/dist/src/router-implementer.d.ts.map +1 -1
- package/dist/src/router.d.ts +1 -1
- package/dist/src/router.d.ts.map +1 -1
- package/dist/src/types.d.ts +1 -10
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils.d.ts +1 -2
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/src/adapters/fetch.test.ts +32 -17
- package/src/adapters/fetch.ts +134 -123
- package/src/builder.test.ts +48 -39
- package/src/builder.ts +32 -30
- package/src/index.ts +2 -2
- package/src/middleware.test.ts +54 -73
- package/src/middleware.ts +39 -22
- package/src/procedure-builder.test.ts +26 -22
- package/src/procedure-builder.ts +15 -15
- package/src/procedure-caller.test.ts +25 -70
- package/src/procedure-caller.ts +69 -88
- package/src/procedure-implementer.test.ts +27 -22
- package/src/procedure-implementer.ts +16 -17
- package/src/procedure.test.ts +17 -12
- package/src/procedure.ts +46 -45
- package/src/router-builder.test.ts +4 -4
- package/src/router-builder.ts +12 -10
- package/src/router-caller.test.ts +6 -6
- package/src/router-caller.ts +5 -16
- package/src/router-implementer.test.ts +12 -12
- package/src/router-implementer.ts +9 -6
- package/src/router.test.ts +4 -4
- package/src/router.ts +12 -10
- package/src/types.test.ts +1 -1
- package/src/types.ts +1 -15
- package/src/utils.test.ts +2 -229
- package/src/utils.ts +5 -84
- package/dist/chunk-ACLC6USM.js +0 -262
- package/dist/chunk-ACLC6USM.js.map +0 -1
package/src/adapters/fetch.ts
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
/// <reference lib="dom" />
|
2
2
|
|
3
|
+
import type {
|
4
|
+
PartialOnUndefinedDeep,
|
5
|
+
Promisable,
|
6
|
+
} from '@orpc/shared'
|
7
|
+
import type { Router } from '../router'
|
3
8
|
import {
|
4
9
|
type HTTPPath,
|
5
10
|
ORPC_HEADER,
|
@@ -7,7 +12,6 @@ import {
|
|
7
12
|
standardizeHTTPPath,
|
8
13
|
} from '@orpc/contract'
|
9
14
|
import {
|
10
|
-
type PartialOnUndefinedDeep,
|
11
15
|
get,
|
12
16
|
isPlainObject,
|
13
17
|
mapValues,
|
@@ -15,27 +19,32 @@ import {
|
|
15
19
|
} from '@orpc/shared'
|
16
20
|
import { ORPCError } from '@orpc/shared/error'
|
17
21
|
import {
|
18
|
-
ORPCDeserializer,
|
19
|
-
ORPCSerializer,
|
20
22
|
OpenAPIDeserializer,
|
21
23
|
OpenAPISerializer,
|
24
|
+
ORPCDeserializer,
|
25
|
+
ORPCSerializer,
|
22
26
|
zodCoerce,
|
23
27
|
} from '@orpc/transformer'
|
24
28
|
import { LinearRouter } from 'hono/router/linear-router'
|
25
29
|
import { RegExpRouter } from 'hono/router/reg-exp-router'
|
26
|
-
import { type WELL_DEFINED_PROCEDURE
|
30
|
+
import { isProcedure, type WELL_DEFINED_PROCEDURE } from '../procedure'
|
27
31
|
import { createProcedureCaller } from '../procedure-caller'
|
28
|
-
|
29
|
-
|
30
|
-
|
32
|
+
|
33
|
+
export interface FetchHandlerHooks {
|
34
|
+
next: () => Promise<Response>
|
35
|
+
response: (response: Response) => Response
|
36
|
+
}
|
31
37
|
|
32
38
|
export interface CreateFetchHandlerOptions<TRouter extends Router<any>> {
|
33
39
|
router: TRouter
|
34
40
|
|
41
|
+
/**
|
42
|
+
* Hooks for executing logics on lifecycle events.
|
43
|
+
*/
|
35
44
|
hooks?: (
|
36
45
|
context: TRouter extends Router<infer UContext> ? UContext : never,
|
37
|
-
|
38
|
-
) => Promisable<
|
46
|
+
hooks: FetchHandlerHooks,
|
47
|
+
) => Promisable<Response>
|
39
48
|
|
40
49
|
/**
|
41
50
|
* It will help improve the cold start time. But it will increase the performance.
|
@@ -64,7 +73,8 @@ export function createFetchHandler<TRouter extends Router<any>>(
|
|
64
73
|
|
65
74
|
routing.add(method, path, [currentPath, item])
|
66
75
|
}
|
67
|
-
}
|
76
|
+
}
|
77
|
+
else {
|
68
78
|
addRouteRecursively(item, currentPath)
|
69
79
|
}
|
70
80
|
}
|
@@ -73,143 +83,143 @@ export function createFetchHandler<TRouter extends Router<any>>(
|
|
73
83
|
addRouteRecursively(options.router, [])
|
74
84
|
|
75
85
|
return async (requestOptions) => {
|
76
|
-
const isORPCTransformer
|
77
|
-
requestOptions.request.headers.get(ORPC_HEADER) === ORPC_HEADER_VALUE
|
86
|
+
const isORPCTransformer
|
87
|
+
= requestOptions.request.headers.get(ORPC_HEADER) === ORPC_HEADER_VALUE
|
78
88
|
const accept = requestOptions.request.headers.get('Accept') || undefined
|
79
89
|
|
80
90
|
const serializer = isORPCTransformer
|
81
91
|
? new ORPCSerializer()
|
82
92
|
: new OpenAPISerializer({ accept })
|
83
93
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
const pathname = `/${trim(url.pathname.replace(requestOptions.prefix ?? '', ''), '/')}`
|
94
|
+
const handler = async () => {
|
95
|
+
const url = new URL(requestOptions.request.url)
|
96
|
+
const pathname = `/${trim(url.pathname.replace(requestOptions.prefix ?? '', ''), '/')}`
|
88
97
|
|
89
|
-
|
90
|
-
|
91
|
-
|
98
|
+
let path: string[] | undefined
|
99
|
+
let procedure: WELL_DEFINED_PROCEDURE | undefined
|
100
|
+
let params: Record<string, string> | undefined
|
92
101
|
|
93
|
-
|
94
|
-
|
95
|
-
|
102
|
+
if (isORPCTransformer) {
|
103
|
+
path = trim(pathname, '/').split('/').map(decodeURIComponent)
|
104
|
+
const val = get(options.router, path)
|
96
105
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
106
|
+
if (isProcedure(val)) {
|
107
|
+
procedure = val
|
108
|
+
}
|
109
|
+
}
|
110
|
+
else {
|
111
|
+
const customMethod
|
112
|
+
= requestOptions.request.method === 'POST'
|
103
113
|
? url.searchParams.get('method')?.toUpperCase()
|
104
114
|
: undefined
|
105
|
-
|
115
|
+
const method = customMethod || requestOptions.request.method
|
106
116
|
|
107
|
-
|
117
|
+
const [matches, params_] = routing.match(method, pathname)
|
108
118
|
|
109
|
-
|
110
|
-
|
111
|
-
|
119
|
+
const [match] = matches.sort((a, b) => {
|
120
|
+
return Object.keys(a[1]).length - Object.keys(b[1]).length
|
121
|
+
})
|
122
|
+
|
123
|
+
if (match) {
|
124
|
+
path = match[0][0]
|
125
|
+
procedure = match[0][1]
|
112
126
|
|
113
|
-
if (
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
params = mapValues(
|
119
|
-
(match as any)[1]!,
|
120
|
-
(v) => params_[v as number]!,
|
121
|
-
)
|
122
|
-
} else {
|
123
|
-
params = match[1] as Record<string, string>
|
124
|
-
}
|
127
|
+
if (params_) {
|
128
|
+
params = mapValues(
|
129
|
+
(match as any)[1]!,
|
130
|
+
v => params_[v as number]!,
|
131
|
+
)
|
125
132
|
}
|
133
|
+
else {
|
134
|
+
params = match[1] as Record<string, string>
|
135
|
+
}
|
136
|
+
}
|
126
137
|
|
127
|
-
|
128
|
-
|
138
|
+
if (!path || !procedure) {
|
139
|
+
path = trim(pathname, '/').split('/').map(decodeURIComponent)
|
129
140
|
|
130
|
-
|
141
|
+
const val = get(options.router, path)
|
131
142
|
|
132
|
-
|
133
|
-
|
134
|
-
}
|
143
|
+
if (isProcedure(val)) {
|
144
|
+
procedure = val
|
135
145
|
}
|
136
146
|
}
|
147
|
+
}
|
137
148
|
|
138
|
-
|
139
|
-
|
140
|
-
|
149
|
+
if (!path || !procedure) {
|
150
|
+
throw new ORPCError({ code: 'NOT_FOUND', message: 'Not found' })
|
151
|
+
}
|
141
152
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
}
|
153
|
+
const deserializer = isORPCTransformer
|
154
|
+
? new ORPCDeserializer()
|
155
|
+
: new OpenAPIDeserializer({
|
156
|
+
schema: procedure.zz$p.contract.zz$cp.InputSchema,
|
157
|
+
})
|
148
158
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
const input_ = await (async () => {
|
158
|
-
try {
|
159
|
-
return await deserializer.deserialize(requestOptions.request)
|
160
|
-
} catch (e) {
|
161
|
-
throw new ORPCError({
|
162
|
-
code: 'BAD_REQUEST',
|
163
|
-
message:
|
159
|
+
const input_ = await (async () => {
|
160
|
+
try {
|
161
|
+
return await deserializer.deserialize(requestOptions.request)
|
162
|
+
}
|
163
|
+
catch (e) {
|
164
|
+
throw new ORPCError({
|
165
|
+
code: 'BAD_REQUEST',
|
166
|
+
message:
|
164
167
|
'Cannot parse request. Please check the request body and Content-Type header.',
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
168
|
+
cause: e,
|
169
|
+
})
|
170
|
+
}
|
171
|
+
})()
|
169
172
|
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
173
|
+
const input = (() => {
|
174
|
+
if (!params || Object.keys(params).length === 0) {
|
175
|
+
return input_
|
176
|
+
}
|
174
177
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
178
|
+
const coercedParams = procedure.zz$p.contract.zz$cp.InputSchema
|
179
|
+
? (zodCoerce(
|
180
|
+
procedure.zz$p.contract.zz$cp.InputSchema,
|
181
|
+
{ ...params },
|
182
|
+
{
|
183
|
+
bracketNotation: true,
|
184
|
+
},
|
185
|
+
) as object)
|
186
|
+
: params
|
187
|
+
|
188
|
+
if (!isPlainObject(input_)) {
|
189
|
+
return coercedParams
|
190
|
+
}
|
188
191
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
192
|
+
return {
|
193
|
+
...coercedParams,
|
194
|
+
...input_,
|
195
|
+
}
|
196
|
+
})()
|
197
|
+
|
198
|
+
const caller = createProcedureCaller({
|
199
|
+
context: requestOptions.context,
|
200
|
+
internal: false,
|
201
|
+
validate: true,
|
202
|
+
procedure,
|
203
|
+
path,
|
204
|
+
})
|
202
205
|
|
203
|
-
|
206
|
+
const output = await caller(input)
|
204
207
|
|
205
|
-
|
208
|
+
const { body, headers } = serializer.serialize(output)
|
206
209
|
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
})
|
210
|
+
return new Response(body, {
|
211
|
+
status: 200,
|
212
|
+
headers,
|
211
213
|
})
|
212
|
-
}
|
214
|
+
}
|
215
|
+
|
216
|
+
try {
|
217
|
+
return await options.hooks?.(requestOptions.context as any, {
|
218
|
+
next: handler,
|
219
|
+
response: response => response,
|
220
|
+
}) ?? await handler()
|
221
|
+
}
|
222
|
+
catch (e) {
|
213
223
|
const error = toORPCError(e)
|
214
224
|
|
215
225
|
try {
|
@@ -217,9 +227,10 @@ export function createFetchHandler<TRouter extends Router<any>>(
|
|
217
227
|
|
218
228
|
return new Response(body, {
|
219
229
|
status: error.status,
|
220
|
-
headers
|
230
|
+
headers,
|
221
231
|
})
|
222
|
-
}
|
232
|
+
}
|
233
|
+
catch (e) {
|
223
234
|
const error = toORPCError(e)
|
224
235
|
|
225
236
|
// fallback to OpenAPI serializer (without accept) when expected serializer has failed
|
@@ -229,7 +240,7 @@ export function createFetchHandler<TRouter extends Router<any>>(
|
|
229
240
|
|
230
241
|
return new Response(body, {
|
231
242
|
status: error.status,
|
232
|
-
headers
|
243
|
+
headers,
|
233
244
|
})
|
234
245
|
}
|
235
246
|
}
|
@@ -268,8 +279,8 @@ function toORPCError(e: unknown): ORPCError<any, any> {
|
|
268
279
|
return e instanceof ORPCError
|
269
280
|
? e
|
270
281
|
: new ORPCError({
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
282
|
+
code: 'INTERNAL_SERVER_ERROR',
|
283
|
+
message: 'Internal server error',
|
284
|
+
cause: e,
|
285
|
+
})
|
275
286
|
}
|
package/src/builder.test.ts
CHANGED
@@ -1,19 +1,22 @@
|
|
1
|
+
import type {
|
2
|
+
Builder,
|
3
|
+
DecoratedMiddleware,
|
4
|
+
DecoratedProcedure,
|
5
|
+
Meta,
|
6
|
+
MiddlewareMeta,
|
7
|
+
} from '.'
|
1
8
|
import { oc } from '@orpc/contract'
|
2
9
|
import { z } from 'zod'
|
3
10
|
import {
|
11
|
+
isProcedure,
|
4
12
|
os,
|
5
|
-
type Builder,
|
6
|
-
type DecoratedMiddleware,
|
7
|
-
type DecoratedProcedure,
|
8
|
-
type Meta,
|
9
13
|
ProcedureBuilder,
|
10
14
|
ProcedureImplementer,
|
11
15
|
RouterImplementer,
|
12
|
-
isProcedure,
|
13
16
|
} from '.'
|
14
17
|
import { RouterBuilder } from './router-builder'
|
15
18
|
|
16
|
-
|
19
|
+
it('context method', () => {
|
17
20
|
expectTypeOf<
|
18
21
|
typeof os extends Builder<infer TContext, any> ? TContext : never
|
19
22
|
>().toEqualTypeOf<undefined | Record<string, unknown>>()
|
@@ -40,17 +43,21 @@ describe('use middleware', () => {
|
|
40
43
|
osw.use((input, context, meta) => {
|
41
44
|
expectTypeOf(input).toEqualTypeOf<unknown>()
|
42
45
|
expectTypeOf(context).toEqualTypeOf<Context>()
|
43
|
-
expectTypeOf(meta).toEqualTypeOf<
|
46
|
+
expectTypeOf(meta).toEqualTypeOf<MiddlewareMeta<unknown>>()
|
47
|
+
|
48
|
+
return meta.next({})
|
44
49
|
})
|
45
50
|
})
|
46
51
|
|
47
52
|
it('can map context', () => {
|
48
53
|
osw
|
49
|
-
.use(() => {
|
50
|
-
return { context: { userId: '1' } }
|
54
|
+
.use((_, __, meta) => {
|
55
|
+
return meta.next({ context: { userId: '1' } })
|
51
56
|
})
|
52
|
-
.use((_, context) => {
|
57
|
+
.use((_, context, meta) => {
|
53
58
|
expectTypeOf(context).toMatchTypeOf<Context & { userId: string }>()
|
59
|
+
|
60
|
+
return meta.next({})
|
54
61
|
})
|
55
62
|
})
|
56
63
|
|
@@ -59,8 +66,8 @@ describe('use middleware', () => {
|
|
59
66
|
// @ts-expect-error mismatch input
|
60
67
|
.use((input: { postId: string }) => {})
|
61
68
|
.use(
|
62
|
-
(input: { postId: string }) => {
|
63
|
-
return { context: { user: '1' } }
|
69
|
+
(input: { postId: string }, _, meta) => {
|
70
|
+
return meta.next({ context: { user: '1' } })
|
64
71
|
},
|
65
72
|
(input) => {
|
66
73
|
expectTypeOf(input).toEqualTypeOf<unknown>()
|
@@ -80,17 +87,19 @@ describe('create middleware', () => {
|
|
80
87
|
.middleware((input, context, meta) => {
|
81
88
|
expectTypeOf(input).toEqualTypeOf<unknown>()
|
82
89
|
expectTypeOf(context).toEqualTypeOf<{ auth: boolean }>()
|
83
|
-
expectTypeOf(meta).toEqualTypeOf<
|
90
|
+
expectTypeOf(meta).toEqualTypeOf<MiddlewareMeta<any>>()
|
91
|
+
|
92
|
+
return meta.next({ })
|
84
93
|
})
|
85
94
|
|
86
95
|
expectTypeOf(mid).toEqualTypeOf<
|
87
|
-
DecoratedMiddleware<{ auth: boolean }, undefined, unknown,
|
96
|
+
DecoratedMiddleware<{ auth: boolean }, undefined, unknown, any>
|
88
97
|
>()
|
89
98
|
})
|
90
99
|
|
91
100
|
it('map context', () => {
|
92
|
-
const mid = os.context<{ auth: boolean }>().middleware(() => {
|
93
|
-
return { context: { userId: '1' } }
|
101
|
+
const mid = os.context<{ auth: boolean }>().middleware((_, __, meta) => {
|
102
|
+
return meta.next({ context: { userId: '1' } })
|
94
103
|
})
|
95
104
|
|
96
105
|
expectTypeOf(mid).toEqualTypeOf<
|
@@ -98,13 +107,13 @@ describe('create middleware', () => {
|
|
98
107
|
{ auth: boolean },
|
99
108
|
{ userId: string },
|
100
109
|
unknown,
|
101
|
-
|
110
|
+
any
|
102
111
|
>
|
103
112
|
>()
|
104
113
|
})
|
105
114
|
})
|
106
115
|
|
107
|
-
|
116
|
+
it('router method', () => {
|
108
117
|
const pingContract = oc.input(z.string()).output(z.string())
|
109
118
|
const userFindContract = oc
|
110
119
|
.input(z.object({ id: z.string() }))
|
@@ -149,7 +158,7 @@ describe('define procedure builder', () => {
|
|
149
158
|
const schema2 = z.object({ a: z.string() })
|
150
159
|
const example2 = { a: '' }
|
151
160
|
|
152
|
-
|
161
|
+
it('input method', () => {
|
153
162
|
const builder = osw.input(schema1, example1)
|
154
163
|
|
155
164
|
expectTypeOf(builder).toEqualTypeOf<
|
@@ -168,7 +177,7 @@ describe('define procedure builder', () => {
|
|
168
177
|
})
|
169
178
|
})
|
170
179
|
|
171
|
-
|
180
|
+
it('output method', () => {
|
172
181
|
const builder = osw.output(schema2, example2)
|
173
182
|
|
174
183
|
expectTypeOf(builder).toEqualTypeOf<
|
@@ -187,7 +196,7 @@ describe('define procedure builder', () => {
|
|
187
196
|
})
|
188
197
|
})
|
189
198
|
|
190
|
-
|
199
|
+
it('route method', () => {
|
191
200
|
const builder = osw.route({
|
192
201
|
method: 'GET',
|
193
202
|
path: '/test',
|
@@ -217,21 +226,21 @@ describe('define procedure builder', () => {
|
|
217
226
|
})
|
218
227
|
})
|
219
228
|
|
220
|
-
|
221
|
-
const mid = os.middleware(() => {
|
222
|
-
return {
|
229
|
+
it('with middlewares', () => {
|
230
|
+
const mid = os.middleware((_, __, meta) => {
|
231
|
+
return meta.next({
|
223
232
|
context: {
|
224
233
|
userId: 'string',
|
225
234
|
},
|
226
|
-
}
|
235
|
+
})
|
227
236
|
})
|
228
237
|
|
229
|
-
const mid2 = os.middleware(() => {
|
230
|
-
return {
|
238
|
+
const mid2 = os.middleware((_, __, meta) => {
|
239
|
+
return meta.next({
|
231
240
|
context: {
|
232
241
|
mid2: true,
|
233
242
|
},
|
234
|
-
}
|
243
|
+
})
|
235
244
|
})
|
236
245
|
|
237
246
|
const osw = os.context<{ auth: boolean }>().use(mid).use(mid2)
|
@@ -280,7 +289,7 @@ describe('handler method', () => {
|
|
280
289
|
const procedure = osw.handler((input, context, meta) => {
|
281
290
|
expectTypeOf(input).toEqualTypeOf<unknown>()
|
282
291
|
expectTypeOf(context).toEqualTypeOf<{ auth: boolean }>()
|
283
|
-
expectTypeOf(meta).toEqualTypeOf<Meta
|
292
|
+
expectTypeOf(meta).toEqualTypeOf<Meta>()
|
284
293
|
})
|
285
294
|
|
286
295
|
expectTypeOf(procedure).toEqualTypeOf<
|
@@ -298,12 +307,12 @@ describe('handler method', () => {
|
|
298
307
|
})
|
299
308
|
|
300
309
|
it('with middlewares', () => {
|
301
|
-
const mid = os.middleware(() => {
|
302
|
-
return {
|
310
|
+
const mid = os.middleware((_, __, meta) => {
|
311
|
+
return meta.next({
|
303
312
|
context: {
|
304
313
|
userId: 'string',
|
305
314
|
},
|
306
|
-
}
|
315
|
+
})
|
307
316
|
})
|
308
317
|
|
309
318
|
const osw = os.context<{ auth: boolean }>().use(mid)
|
@@ -311,7 +320,7 @@ describe('handler method', () => {
|
|
311
320
|
const procedure = osw.handler((input, context, meta) => {
|
312
321
|
expectTypeOf(input).toEqualTypeOf<unknown>()
|
313
322
|
expectTypeOf(context).toMatchTypeOf<{ auth: boolean }>()
|
314
|
-
expectTypeOf(meta).toEqualTypeOf<Meta
|
323
|
+
expectTypeOf(meta).toEqualTypeOf<Meta>()
|
315
324
|
})
|
316
325
|
|
317
326
|
expectTypeOf(procedure).toEqualTypeOf<
|
@@ -329,11 +338,11 @@ describe('handler method', () => {
|
|
329
338
|
})
|
330
339
|
})
|
331
340
|
|
332
|
-
|
341
|
+
it('prefix', () => {
|
333
342
|
const builder = os
|
334
343
|
.context<{ auth: boolean }>()
|
335
|
-
.use(() => {
|
336
|
-
return { context: { userId: '1' } }
|
344
|
+
.use((_, __, meta) => {
|
345
|
+
return meta.next({ context: { userId: '1' } })
|
337
346
|
})
|
338
347
|
.prefix('/api')
|
339
348
|
|
@@ -345,11 +354,11 @@ test('prefix', () => {
|
|
345
354
|
expect(builder.zz$rb.prefix).toEqual('/api')
|
346
355
|
})
|
347
356
|
|
348
|
-
|
357
|
+
it('tags', () => {
|
349
358
|
const builder = os
|
350
359
|
.context<{ auth: boolean }>()
|
351
|
-
.use(() => {
|
352
|
-
return { context: { userId: '1' } }
|
360
|
+
.use((_, __, meta) => {
|
361
|
+
return meta.next({ context: { userId: '1' } })
|
353
362
|
})
|
354
363
|
.tags('user', 'user2')
|
355
364
|
|