@orpc/server 0.10.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. package/dist/{chunk-TDFYNRZV.js → chunk-CVLK2PBB.js} +0 -1
  2. package/dist/fetch.js +1 -2
  3. package/dist/index.js +1 -2
  4. package/dist/src/adapters/fetch.d.ts +0 -1
  5. package/dist/src/builder.d.ts +0 -1
  6. package/dist/src/index.d.ts +0 -1
  7. package/dist/src/middleware.d.ts +0 -1
  8. package/dist/src/procedure-builder.d.ts +0 -1
  9. package/dist/src/procedure-caller.d.ts +0 -1
  10. package/dist/src/procedure-implementer.d.ts +0 -1
  11. package/dist/src/procedure.d.ts +0 -1
  12. package/dist/src/router-builder.d.ts +0 -1
  13. package/dist/src/router-caller.d.ts +0 -1
  14. package/dist/src/router-implementer.d.ts +0 -1
  15. package/dist/src/router.d.ts +0 -1
  16. package/dist/src/types.d.ts +0 -1
  17. package/dist/src/utils.d.ts +0 -1
  18. package/package.json +12 -16
  19. package/dist/chunk-TDFYNRZV.js.map +0 -1
  20. package/dist/fetch.js.map +0 -1
  21. package/dist/index.js.map +0 -1
  22. package/dist/src/adapters/fetch.d.ts.map +0 -1
  23. package/dist/src/builder.d.ts.map +0 -1
  24. package/dist/src/index.d.ts.map +0 -1
  25. package/dist/src/middleware.d.ts.map +0 -1
  26. package/dist/src/procedure-builder.d.ts.map +0 -1
  27. package/dist/src/procedure-caller.d.ts.map +0 -1
  28. package/dist/src/procedure-implementer.d.ts.map +0 -1
  29. package/dist/src/procedure.d.ts.map +0 -1
  30. package/dist/src/router-builder.d.ts.map +0 -1
  31. package/dist/src/router-caller.d.ts.map +0 -1
  32. package/dist/src/router-implementer.d.ts.map +0 -1
  33. package/dist/src/router.d.ts.map +0 -1
  34. package/dist/src/types.d.ts.map +0 -1
  35. package/dist/src/utils.d.ts.map +0 -1
  36. package/dist/tsconfig.tsbuildinfo +0 -1
  37. package/src/adapters/fetch.test.ts +0 -629
  38. package/src/adapters/fetch.ts +0 -290
  39. package/src/builder.test.ts +0 -371
  40. package/src/builder.ts +0 -238
  41. package/src/index.ts +0 -16
  42. package/src/middleware.test.ts +0 -260
  43. package/src/middleware.ts +0 -136
  44. package/src/procedure-builder.test.ts +0 -223
  45. package/src/procedure-builder.ts +0 -158
  46. package/src/procedure-caller.test.ts +0 -171
  47. package/src/procedure-caller.ts +0 -138
  48. package/src/procedure-implementer.test.ts +0 -220
  49. package/src/procedure-implementer.ts +0 -102
  50. package/src/procedure.test.ts +0 -317
  51. package/src/procedure.ts +0 -237
  52. package/src/router-builder.test.ts +0 -106
  53. package/src/router-builder.ts +0 -122
  54. package/src/router-caller.test.ts +0 -126
  55. package/src/router-caller.ts +0 -64
  56. package/src/router-implementer.test.ts +0 -116
  57. package/src/router-implementer.ts +0 -113
  58. package/src/router.test-d.ts +0 -48
  59. package/src/router.test.ts +0 -142
  60. package/src/router.ts +0 -91
  61. package/src/types.test.ts +0 -18
  62. package/src/types.ts +0 -13
  63. package/src/utils.test.ts +0 -16
  64. package/src/utils.ts +0 -16
package/src/builder.ts DELETED
@@ -1,238 +0,0 @@
1
- import type { IsEqual } from '@orpc/shared'
2
- import type { HandledRouter, Router } from './router'
3
- import type { Context, MergeContext } from './types'
4
- import {
5
- ContractProcedure,
6
- type ContractRouter,
7
- type HTTPPath,
8
- isContractProcedure,
9
- type RouteOptions,
10
- type Schema,
11
- type SchemaInput,
12
- type SchemaOutput,
13
- } from '@orpc/contract'
14
- import {
15
- type DecoratedMiddleware,
16
- decorateMiddleware,
17
- type MapInputMiddleware,
18
- type Middleware,
19
- } from './middleware'
20
- import {
21
- type DecoratedProcedure,
22
- decorateProcedure,
23
- type ProcedureFunc,
24
- } from './procedure'
25
- import { ProcedureBuilder } from './procedure-builder'
26
- import { ProcedureImplementer } from './procedure-implementer'
27
- import { RouterBuilder } from './router-builder'
28
- import {
29
- type ChainedRouterImplementer,
30
- chainRouterImplementer,
31
- } from './router-implementer'
32
-
33
- export class Builder<TContext extends Context, TExtraContext extends Context> {
34
- constructor(
35
- public zz$b: {
36
- middlewares?: Middleware<any, any, any, any>[]
37
- } = {},
38
- ) {}
39
-
40
- /**
41
- * Self chainable
42
- */
43
-
44
- context<UContext extends Context>(): IsEqual<UContext, Context> extends true
45
- ? Builder<TContext, TExtraContext>
46
- : Builder<UContext, TExtraContext> {
47
- return this as any
48
- }
49
-
50
- use<
51
- UExtraContext extends
52
- | Partial<MergeContext<Context, MergeContext<TContext, TExtraContext>>>
53
- | undefined = undefined,
54
- >(
55
- middleware: Middleware<
56
- MergeContext<TContext, TExtraContext>,
57
- UExtraContext,
58
- unknown,
59
- unknown
60
- >,
61
- ): Builder<TContext, MergeContext<TExtraContext, UExtraContext>>
62
-
63
- use<
64
- UExtraContext extends
65
- | Partial<MergeContext<Context, MergeContext<TContext, TExtraContext>>>
66
- | undefined = undefined,
67
- UMappedInput = unknown,
68
- >(
69
- middleware: Middleware<
70
- MergeContext<TContext, TExtraContext>,
71
- UExtraContext,
72
- UMappedInput,
73
- unknown
74
- >,
75
- mapInput: MapInputMiddleware<unknown, UMappedInput>,
76
- ): Builder<TContext, MergeContext<TExtraContext, UExtraContext>>
77
-
78
- use(
79
- middleware: Middleware<any, any, any, any>,
80
- mapInput?: MapInputMiddleware<any, any>,
81
- ): Builder<any, any> {
82
- const middleware_ = mapInput
83
- ? decorateMiddleware(middleware).mapInput(mapInput)
84
- : middleware
85
-
86
- return new Builder({
87
- ...this.zz$b,
88
- middlewares: [...(this.zz$b.middlewares || []), middleware_],
89
- })
90
- }
91
-
92
- /**
93
- * Convert to ContractProcedureBuilder
94
- */
95
-
96
- route(
97
- opts: RouteOptions,
98
- ): ProcedureBuilder<TContext, TExtraContext, undefined, undefined> {
99
- return new ProcedureBuilder({
100
- middlewares: this.zz$b.middlewares,
101
- contract: new ContractProcedure({
102
- ...opts,
103
- InputSchema: undefined,
104
- OutputSchema: undefined,
105
- }),
106
- })
107
- }
108
-
109
- input<USchema extends Schema = undefined>(
110
- schema: USchema,
111
- example?: SchemaInput<USchema>,
112
- ): ProcedureBuilder<TContext, TExtraContext, USchema, undefined> {
113
- return new ProcedureBuilder({
114
- middlewares: this.zz$b.middlewares,
115
- contract: new ContractProcedure({
116
- OutputSchema: undefined,
117
- InputSchema: schema,
118
- inputExample: example,
119
- }),
120
- })
121
- }
122
-
123
- output<USchema extends Schema = undefined>(
124
- schema: USchema,
125
- example?: SchemaOutput<USchema>,
126
- ): ProcedureBuilder<TContext, TExtraContext, undefined, USchema> {
127
- return new ProcedureBuilder({
128
- middlewares: this.zz$b.middlewares,
129
- contract: new ContractProcedure({
130
- InputSchema: undefined,
131
- OutputSchema: schema,
132
- outputExample: example,
133
- }),
134
- })
135
- }
136
-
137
- /**
138
- * Convert to Procedure
139
- */
140
- func<UFuncOutput = undefined>(
141
- func: ProcedureFunc<
142
- TContext,
143
- TExtraContext,
144
- undefined,
145
- undefined,
146
- UFuncOutput
147
- >,
148
- ): DecoratedProcedure<
149
- TContext,
150
- TExtraContext,
151
- undefined,
152
- undefined,
153
- UFuncOutput
154
- > {
155
- return decorateProcedure({
156
- zz$p: {
157
- middlewares: this.zz$b.middlewares,
158
- contract: new ContractProcedure({
159
- InputSchema: undefined,
160
- OutputSchema: undefined,
161
- }),
162
- func,
163
- },
164
- })
165
- }
166
-
167
- /**
168
- * Convert to ProcedureImplementer | RouterBuilder
169
- */
170
-
171
- contract<UContract extends ContractProcedure<any, any> | ContractRouter>(
172
- contract: UContract,
173
- ): UContract extends ContractProcedure<
174
- infer UInputSchema,
175
- infer UOutputSchema
176
- >
177
- ? ProcedureImplementer<TContext, TExtraContext, UInputSchema, UOutputSchema>
178
- : UContract extends ContractRouter
179
- ? ChainedRouterImplementer<TContext, UContract, TExtraContext>
180
- : never {
181
- if (isContractProcedure(contract)) {
182
- return new ProcedureImplementer({
183
- contract,
184
- middlewares: this.zz$b.middlewares,
185
- }) as any
186
- }
187
-
188
- return chainRouterImplementer(
189
- contract as ContractRouter,
190
- this.zz$b.middlewares,
191
- ) as any
192
- }
193
-
194
- /**
195
- * Create ExtendedMiddleware
196
- */
197
-
198
- // TODO: TOutput always any, infer not work at all, because TOutput used inside middleware params,
199
- // solution (maybe): create new generic for .output() method
200
- middleware<UExtraContext extends Context = undefined, TInput = unknown, TOutput = any>(
201
- middleware: Middleware<
202
- MergeContext<TContext, TExtraContext>,
203
- UExtraContext,
204
- TInput,
205
- TOutput
206
- >,
207
- ): DecoratedMiddleware<
208
- MergeContext<TContext, TExtraContext>,
209
- UExtraContext,
210
- TInput,
211
- TOutput
212
- > {
213
- return decorateMiddleware(middleware)
214
- }
215
-
216
- prefix(prefix: HTTPPath): RouterBuilder<TContext, TExtraContext> {
217
- return new RouterBuilder({
218
- ...this.zz$b,
219
- prefix,
220
- })
221
- }
222
-
223
- tags(...tags: string[]): RouterBuilder<TContext, TExtraContext> {
224
- return new RouterBuilder({
225
- ...this.zz$b,
226
- tags,
227
- })
228
- }
229
-
230
- /**
231
- * Create DecoratedRouter
232
- */
233
- router<URouter extends Router<TContext>>(
234
- router: URouter,
235
- ): HandledRouter<URouter> {
236
- return new RouterBuilder<TContext, TExtraContext>(this.zz$b).router(router)
237
- }
238
- }
package/src/index.ts DELETED
@@ -1,16 +0,0 @@
1
- import { Builder } from './builder'
2
-
3
- export * from './builder'
4
- export * from './middleware'
5
- export * from './procedure'
6
- export * from './procedure-builder'
7
- export * from './procedure-caller'
8
- export * from './procedure-implementer'
9
- export * from './router'
10
- export * from './router-caller'
11
- export * from './router-implementer'
12
- export * from './types'
13
- export * from './utils'
14
- export * from '@orpc/shared/error'
15
-
16
- export const os = new Builder<undefined | Record<string, unknown>, undefined>()
@@ -1,260 +0,0 @@
1
- import type { DecoratedMiddleware, Middleware, MiddlewareMeta } from './middleware'
2
- import { os } from '.'
3
- import { decorateMiddleware } from './middleware'
4
-
5
- describe('middleware', () => {
6
- it('just a function', () => {
7
- const mid: Middleware<
8
- { auth: boolean },
9
- { userId: string },
10
- unknown,
11
- unknown
12
- > = (input, context, meta) => {
13
- expectTypeOf(input).toEqualTypeOf<unknown>()
14
- expectTypeOf(context).toEqualTypeOf<{ auth: boolean }>()
15
- expectTypeOf(meta).toEqualTypeOf<MiddlewareMeta< unknown>>()
16
-
17
- return meta.next({ context: { userId: '1' } })
18
- }
19
- })
20
-
21
- it('expect required return if has extra context', () => {
22
- const mid: Middleware<
23
- { auth: boolean },
24
- { userId: string },
25
- unknown,
26
- unknown
27
- > = (input, context, meta) => {
28
- expectTypeOf(input).toEqualTypeOf<unknown>()
29
- expectTypeOf(context).toEqualTypeOf<{ auth: boolean }>()
30
- expectTypeOf(meta).toEqualTypeOf<MiddlewareMeta< unknown>>()
31
-
32
- return meta.next({ context: { userId: '1' } })
33
- }
34
-
35
- // @ts-expect-error mid must call next
36
- const mid2: Middleware<
37
- { auth: boolean },
38
- { userId: string },
39
- unknown,
40
- unknown
41
- > = (input, context, meta) => {
42
- expectTypeOf(input).toEqualTypeOf<unknown>()
43
- expectTypeOf(context).toEqualTypeOf<{ auth: boolean }>()
44
- expectTypeOf(meta).toEqualTypeOf<MiddlewareMeta< unknown>>()
45
- }
46
-
47
- // @ts-expect-error mid return invalid context
48
- const mid3: Middleware<
49
- { auth: boolean },
50
- { userId: string },
51
- unknown,
52
- unknown
53
- > = (input, context, meta) => {
54
- expectTypeOf(input).toEqualTypeOf<unknown>()
55
- expectTypeOf(context).toEqualTypeOf<{ auth: boolean }>()
56
- expectTypeOf(meta).toEqualTypeOf<MiddlewareMeta<unknown>>()
57
-
58
- return meta.next({
59
- context: {
60
- valid: false,
61
- },
62
- })
63
- }
64
- })
65
- })
66
-
67
- describe('decorateMiddleware', () => {
68
- it('infer types', () => {
69
- const mid = decorateMiddleware<
70
- { auth: boolean },
71
- { userId: string },
72
- { id: string },
73
- { name: string }
74
- >((input, context, meta) => {
75
- expectTypeOf(input).toEqualTypeOf<{ id: string }>()
76
- expectTypeOf(context).toEqualTypeOf<{ auth: boolean }>()
77
- expectTypeOf(meta).toEqualTypeOf<MiddlewareMeta<{ name: string }>>()
78
-
79
- return meta.next({
80
- context: {
81
- userId: '1',
82
- },
83
- })
84
- })
85
-
86
- expectTypeOf(mid).toEqualTypeOf<
87
- DecoratedMiddleware<
88
- { auth: boolean },
89
- { userId: string },
90
- { id: string },
91
- { name: string }
92
- >
93
- >()
94
-
95
- expectTypeOf(mid).toMatchTypeOf<
96
- Middleware<
97
- { auth: boolean },
98
- { userId: string },
99
- { id: string },
100
- { name: string }
101
- >
102
- >()
103
- })
104
-
105
- it('concat: infer types', () => {
106
- const mid = decorateMiddleware<
107
- { auth: boolean },
108
- undefined,
109
- { id: string },
110
- { name: string }
111
- >((_, __, meta) => meta.next({})).concat(async (input, context, meta) => {
112
- expectTypeOf(input).toEqualTypeOf<{ id: string }>()
113
- expectTypeOf(context).toEqualTypeOf<{ auth: boolean }>()
114
- expectTypeOf(meta).toEqualTypeOf<MiddlewareMeta<{ name: string }>>()
115
-
116
- return meta.next({
117
- context: {
118
- userId: '1',
119
- },
120
- })
121
- })
122
-
123
- expectTypeOf(mid).toEqualTypeOf<
124
- DecoratedMiddleware<
125
- { auth: boolean },
126
- { userId: string },
127
- { id: string },
128
- { name: string }
129
- >
130
- >()
131
- })
132
-
133
- it('concat: can expect input', () => {
134
- const mid = decorateMiddleware<
135
- { auth: boolean },
136
- undefined,
137
- unknown,
138
- unknown
139
- >((_, __, meta) => meta.next({}))
140
- .concat((input: { id: string }, _, meta) => meta.next({}))
141
- .concat((input: { status: string }, _, meta) => meta.next({}))
142
-
143
- expectTypeOf(mid).toEqualTypeOf<
144
- DecoratedMiddleware<
145
- { auth: boolean },
146
- undefined,
147
- { id: string } & { status: string },
148
- unknown
149
- >
150
- >()
151
-
152
- // MID2 isn't usable because input type is wrong
153
- const mid2 = mid.concat((input: { id: number }, _, meta) => meta.next({}))
154
- expectTypeOf(mid2).toMatchTypeOf<
155
- DecoratedMiddleware<
156
- { auth: boolean },
157
- undefined,
158
- { id: never, status: string },
159
- unknown
160
- >
161
- >()
162
- })
163
-
164
- it('concat: deep copy', () => {
165
- const middleware = decorateMiddleware((_, __, meta) => meta.next({}))
166
- const mid2 = middleware.concat((_, __, meta) => meta.next({}))
167
- expect(mid2).not.toBe(middleware)
168
- })
169
-
170
- it('concat: can map input', async () => {
171
- const middleware = decorateMiddleware<
172
- { auth: boolean },
173
- undefined,
174
- unknown,
175
- unknown
176
- >((_, __, meta) => meta.next({}))
177
-
178
- const mid2 = middleware.concat(
179
- (input: { postId: number }, _, meta) => meta.next({ context: { a: 'a' } }),
180
- input => ({ postId: 12455 }),
181
- )
182
-
183
- // mid2 input is unknown, because it's map input does not expect anything
184
- expectTypeOf(mid2).toEqualTypeOf<
185
- DecoratedMiddleware<{ auth: boolean }, { a: string }, unknown, unknown>
186
- >()
187
-
188
- const fn = vi.fn()
189
- const mid3 = middleware.concat(
190
- (input: { postId: string }, _, meta) => {
191
- fn()
192
- expect(input).toEqual({ postId: '123' })
193
-
194
- return meta.next({})
195
- },
196
- (input: { postId: number }) => {
197
- fn()
198
- expect(input).toEqual({ postId: 123 })
199
- return {
200
- postId: `${input.postId}`,
201
- }
202
- },
203
- )
204
-
205
- await mid3({ postId: 123 }, {} as any, { next: () => {} } as any)
206
- expect(fn).toHaveBeenCalledTimes(2)
207
-
208
- // INPUT now follow expect types from map not from middleware
209
- expectTypeOf(mid3).toMatchTypeOf<
210
- DecoratedMiddleware<
211
- { auth: boolean },
212
- undefined,
213
- { postId: number },
214
- unknown
215
- >
216
- >()
217
- })
218
-
219
- it('mapInput', async () => {
220
- const fn = vi.fn()
221
-
222
- const mid = decorateMiddleware<
223
- undefined,
224
- undefined,
225
- { id: string },
226
- unknown
227
- >(fn).mapInput((input: { postId: string }) => {
228
- return { id: input.postId }
229
- })
230
-
231
- expectTypeOf(mid).toEqualTypeOf<
232
- DecoratedMiddleware<undefined, undefined, { postId: string }, unknown>
233
- >()
234
-
235
- await mid({ postId: '1' }, undefined, {} as any)
236
-
237
- expect(fn).toHaveBeenCalledWith({ id: '1' }, undefined, {})
238
- })
239
- })
240
-
241
- it('middleware can output', async () => {
242
- let mid2Called = false
243
- let handlerCalled = false
244
- const ping = os
245
- .use((input, ctx, meta) => {
246
- return meta.output('from middleware')
247
- })
248
- .use((input, ctx, meta) => {
249
- mid2Called = true
250
- return meta.output('from middleware 2')
251
- })
252
- .func(() => {
253
- handlerCalled = true
254
- return 'from handler'
255
- })
256
-
257
- expect(await ping(undefined)).toBe('from middleware')
258
- expect(mid2Called).toBeFalsy()
259
- expect(handlerCalled).toBeFalsy()
260
- })
package/src/middleware.ts DELETED
@@ -1,136 +0,0 @@
1
- import type { Promisable } from '@orpc/shared'
2
- import type { Context, MergeContext, Meta } from './types'
3
- import { mergeContext } from './utils'
4
-
5
- export type MiddlewareResult<TExtraContext extends Context, TOutput> = Promisable<{
6
- output: TOutput
7
- context: TExtraContext
8
- }>
9
-
10
- export interface MiddlewareMeta<
11
- TOutput,
12
- > extends Meta {
13
- next: <UExtraContext extends Context = undefined>(
14
- options: UExtraContext extends undefined ? { context?: UExtraContext } : { context: UExtraContext }
15
- ) => MiddlewareResult<UExtraContext, TOutput>
16
- output: <UOutput>(output: UOutput) => MiddlewareResult<undefined, UOutput>
17
- }
18
-
19
- export interface Middleware<
20
- TContext extends Context,
21
- TExtraContext extends Context,
22
- TInput,
23
- TOutput,
24
- > {
25
- (
26
- input: TInput,
27
- context: TContext,
28
- meta: MiddlewareMeta<TOutput>,
29
- ): Promisable<
30
- MiddlewareResult<TExtraContext, TOutput>
31
- >
32
- }
33
-
34
- export interface MapInputMiddleware<TInput, TMappedInput> {
35
- (input: TInput): TMappedInput
36
- }
37
-
38
- export interface DecoratedMiddleware<
39
- TContext extends Context,
40
- TExtraContext extends Context,
41
- TInput,
42
- TOutput,
43
- > extends Middleware<TContext, TExtraContext, TInput, TOutput> {
44
- concat: (<
45
- UExtraContext extends Partial<MergeContext<Context, MergeContext<TContext, TExtraContext>>> | undefined = undefined,
46
- UInput = TInput,
47
- >(
48
- middleware: Middleware<
49
- MergeContext<TContext, TExtraContext>,
50
- UExtraContext,
51
- UInput & TInput,
52
- TOutput
53
- >,
54
- ) => DecoratedMiddleware<
55
- TContext,
56
- MergeContext<TExtraContext, UExtraContext>,
57
- TInput & UInput,
58
- TOutput
59
- >) & (<
60
- UExtraContext extends Partial<MergeContext<Context, MergeContext<TContext, TExtraContext>>> | undefined = undefined,
61
- UInput = TInput,
62
- UMappedInput = unknown,
63
- >(
64
- middleware: Middleware<
65
- MergeContext<TContext, TExtraContext>,
66
- UExtraContext,
67
- UMappedInput,
68
- TOutput
69
- >,
70
- mapInput: MapInputMiddleware<UInput, UMappedInput>,
71
- ) => DecoratedMiddleware<
72
- TContext,
73
- MergeContext<TExtraContext, UExtraContext>,
74
- TInput & UInput,
75
- TOutput
76
- >)
77
-
78
- mapInput: <UInput = unknown>(
79
- map: MapInputMiddleware<UInput, TInput>,
80
- ) => DecoratedMiddleware<TContext, TExtraContext, UInput, TOutput>
81
- }
82
-
83
- const decoratedMiddlewareSymbol = Symbol('🔒decoratedMiddleware')
84
-
85
- export function decorateMiddleware<
86
- TContext extends Context,
87
- TExtraContext extends Context,
88
- TInput,
89
- TOutput,
90
- >(
91
- middleware: Middleware<TContext, TExtraContext, TInput, TOutput>,
92
- ): DecoratedMiddleware<TContext, TExtraContext, TInput, TOutput> {
93
- if (Reflect.get(middleware, decoratedMiddlewareSymbol)) {
94
- return middleware as any
95
- }
96
-
97
- const concat = (
98
- concatMiddleware: Middleware<any, any, any, any>,
99
- mapInput?: MapInputMiddleware<any, any>,
100
- ): Middleware<any, any, any, any> => {
101
- const concatMiddleware_ = mapInput
102
- ? decorateMiddleware(concatMiddleware).mapInput(mapInput)
103
- : concatMiddleware
104
-
105
- return decorateMiddleware(async (input, context, meta, ...rest) => {
106
- const input_ = input as any
107
- const context_ = context as any
108
- const meta_ = meta as any
109
-
110
- const next: MiddlewareMeta<any>['next'] = async (options) => {
111
- return concatMiddleware_(input_, mergeContext(context_, options.context), meta_, ...rest)
112
- }
113
-
114
- const m1 = await middleware(input_, context_, {
115
- ...meta_,
116
- next,
117
- }, ...rest)
118
-
119
- return m1
120
- })
121
- }
122
-
123
- const mapInput = <UInput = unknown>(
124
- map: MapInputMiddleware<UInput, TInput>,
125
- ): DecoratedMiddleware<TContext, TExtraContext, UInput, TOutput> => {
126
- return decorateMiddleware((input, ...rest) =>
127
- middleware(map(input), ...rest),
128
- )
129
- }
130
-
131
- return Object.assign(middleware, {
132
- [decoratedMiddlewareSymbol]: true,
133
- concat: concat as any,
134
- mapInput,
135
- })
136
- }