@orpc/server 0.2.1 → 0.3.1

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.
Files changed (48) hide show
  1. package/dist/{chunk-26DTFWOI.js → chunk-YYGRQD4L.js} +26 -36
  2. package/dist/chunk-YYGRQD4L.js.map +1 -0
  3. package/dist/fetch.js +12 -12
  4. package/dist/fetch.js.map +1 -1
  5. package/dist/index.js +9 -15
  6. package/dist/index.js.map +1 -1
  7. package/dist/src/adapters/fetch.d.ts +2 -2
  8. package/dist/src/adapters/fetch.d.ts.map +1 -1
  9. package/dist/src/builder.d.ts +2 -2
  10. package/dist/src/builder.d.ts.map +1 -1
  11. package/dist/src/procedure-builder.d.ts +2 -2
  12. package/dist/src/procedure-builder.d.ts.map +1 -1
  13. package/dist/src/procedure-caller.d.ts +7 -16
  14. package/dist/src/procedure-caller.d.ts.map +1 -1
  15. package/dist/src/procedure-implementer.d.ts +2 -2
  16. package/dist/src/procedure-implementer.d.ts.map +1 -1
  17. package/dist/src/procedure.d.ts +11 -10
  18. package/dist/src/procedure.d.ts.map +1 -1
  19. package/dist/src/router-caller.d.ts +8 -17
  20. package/dist/src/router-caller.d.ts.map +1 -1
  21. package/dist/src/router.d.ts +2 -2
  22. package/dist/src/router.d.ts.map +1 -1
  23. package/dist/src/types.d.ts +0 -1
  24. package/dist/src/types.d.ts.map +1 -1
  25. package/dist/tsconfig.tsbuildinfo +1 -1
  26. package/package.json +8 -6
  27. package/src/adapters/fetch.test.ts +18 -18
  28. package/src/adapters/fetch.ts +9 -5
  29. package/src/builder.test.ts +4 -4
  30. package/src/builder.ts +6 -6
  31. package/src/middleware.test.ts +1 -1
  32. package/src/procedure-builder.test.ts +2 -2
  33. package/src/procedure-builder.ts +6 -6
  34. package/src/procedure-caller.test.ts +27 -36
  35. package/src/procedure-caller.ts +36 -44
  36. package/src/procedure-implementer.test.ts +8 -8
  37. package/src/procedure-implementer.ts +6 -6
  38. package/src/procedure.test.ts +20 -20
  39. package/src/procedure.ts +30 -45
  40. package/src/router-builder.test.ts +4 -4
  41. package/src/router-caller.test.ts +5 -52
  42. package/src/router-caller.ts +11 -31
  43. package/src/router-implementer.test.ts +6 -6
  44. package/src/router.test-d.ts +2 -2
  45. package/src/router.test.ts +10 -10
  46. package/src/router.ts +4 -4
  47. package/src/types.ts +0 -1
  48. package/dist/chunk-26DTFWOI.js.map +0 -1
@@ -18,7 +18,7 @@ it('isProcedure', () => {
18
18
  InputSchema: undefined,
19
19
  OutputSchema: undefined,
20
20
  }),
21
- handler: () => {},
21
+ func: () => {},
22
22
  }),
23
23
  ),
24
24
  ),
@@ -29,7 +29,7 @@ it('isProcedure', () => {
29
29
  InputSchema: undefined,
30
30
  OutputSchema: undefined,
31
31
  }),
32
- handler: () => {},
32
+ func: () => {},
33
33
  },
34
34
  }).toSatisfy(isProcedure)
35
35
 
@@ -57,7 +57,7 @@ it('isProcedure', () => {
57
57
 
58
58
  describe('route method', () => {
59
59
  it('sets route options correctly', () => {
60
- const p = os.context<{ auth: boolean }>().handler(() => {
60
+ const p = os.context<{ auth: boolean }>().func(() => {
61
61
  return 'test'
62
62
  })
63
63
 
@@ -69,11 +69,11 @@ describe('route method', () => {
69
69
 
70
70
  it('preserves existing context and handler', () => {
71
71
  const handler = () => 'test'
72
- const p = os.context<{ auth: boolean }>().handler(handler)
72
+ const p = os.context<{ auth: boolean }>().func(handler)
73
73
 
74
74
  const p2 = p.route({ path: '/test' })
75
75
 
76
- expect(p2.zz$p.handler).toBe(handler)
76
+ expect(p2.zz$p.func).toBe(handler)
77
77
  // Context type is preserved through the route method
78
78
  expectTypeOf(p2).toEqualTypeOf<
79
79
  DecoratedProcedure<
@@ -90,7 +90,7 @@ describe('route method', () => {
90
90
  const p = os
91
91
  .context<{ auth: boolean }>()
92
92
  .route({ path: '/api', method: 'POST' })
93
- .handler(() => 'test')
93
+ .func(() => 'test')
94
94
 
95
95
  const p2 = p.prefix('/v1')
96
96
 
@@ -105,7 +105,7 @@ describe('route method', () => {
105
105
  .context<{ auth: boolean }>()
106
106
  .route({ path: '/test' })
107
107
  .use(mid)
108
- .handler((input, context) => {
108
+ .func((input, context) => {
109
109
  expectTypeOf(context).toEqualTypeOf<
110
110
  { auth: boolean } & { userId: string }
111
111
  >()
@@ -120,7 +120,7 @@ describe('route method', () => {
120
120
  const p = os
121
121
  .context<{ auth: boolean }>()
122
122
  .route({ path: '/test1', method: 'GET' })
123
- .handler(() => 'test')
123
+ .func(() => 'test')
124
124
 
125
125
  const p2 = p.route({ path: '/test2', method: 'POST' })
126
126
 
@@ -136,7 +136,7 @@ describe('route method', () => {
136
136
  .input(inputSchema)
137
137
  .output(outputSchema)
138
138
  .route({ path: '/test' })
139
- .handler((input) => {
139
+ .func((input) => {
140
140
  expectTypeOf(input).toEqualTypeOf<{ id: number }>()
141
141
  return 'test'
142
142
  })
@@ -157,7 +157,7 @@ describe('route method', () => {
157
157
  })
158
158
 
159
159
  it('prefix method', () => {
160
- const p = os.context<{ auth: boolean }>().handler(() => {
160
+ const p = os.context<{ auth: boolean }>().func(() => {
161
161
  return 'unnoq'
162
162
  })
163
163
 
@@ -168,7 +168,7 @@ it('prefix method', () => {
168
168
  const p3 = os
169
169
  .context<{ auth: boolean }>()
170
170
  .route({ path: '/test1' })
171
- .handler(() => {
171
+ .func(() => {
172
172
  return 'unnoq'
173
173
  })
174
174
 
@@ -183,7 +183,7 @@ describe('use middleware', () => {
183
183
  .use((_, __, meta) => {
184
184
  return meta.next({ context: { postId: 'string' } })
185
185
  })
186
- .handler(() => {
186
+ .func(() => {
187
187
  return 'unnoq'
188
188
  })
189
189
 
@@ -251,7 +251,7 @@ describe('use middleware', () => {
251
251
  const mid2 = vi.fn()
252
252
  const mid3 = vi.fn()
253
253
 
254
- const p1 = os.use(mid1).handler(() => 'unnoq')
254
+ const p1 = os.use(mid1).func(() => 'unnoq')
255
255
  const p2 = p1.use(mid2).use(mid3)
256
256
 
257
257
  expect(p2.zz$p.middlewares).toEqual([mid3, mid2, mid1])
@@ -260,12 +260,12 @@ describe('use middleware', () => {
260
260
 
261
261
  describe('server action', () => {
262
262
  it('only accept undefined context', () => {
263
- expectTypeOf(os.handler(() => {})).toMatchTypeOf<(...args: any[]) => any>()
263
+ expectTypeOf(os.func(() => {})).toMatchTypeOf<(...args: any[]) => any>()
264
264
  expectTypeOf(
265
- os.context<{ auth: boolean } | undefined>().handler(() => {}),
265
+ os.context<{ auth: boolean } | undefined>().func(() => {}),
266
266
  ).toMatchTypeOf<(...args: any[]) => any>()
267
267
  expectTypeOf(
268
- os.context<{ auth: boolean }>().handler(() => {}),
268
+ os.context<{ auth: boolean }>().func(() => {}),
269
269
  ).not.toMatchTypeOf<(...args: any[]) => any>()
270
270
  })
271
271
 
@@ -273,13 +273,13 @@ describe('server action', () => {
273
273
  const p = os
274
274
  .input(z.object({ id: z.number() }))
275
275
  .output(z.string())
276
- .handler(() => 'string')
276
+ .func(() => 'string')
277
277
 
278
278
  expectTypeOf(p).toMatchTypeOf<
279
279
  (input: { id: number } | FormData) => Promise<string>
280
280
  >()
281
281
 
282
- const p2 = os.input(z.object({ id: z.number() })).handler(() => 12333)
282
+ const p2 = os.input(z.object({ id: z.number() })).func(() => 12333)
283
283
 
284
284
  expectTypeOf(p2).toMatchTypeOf<
285
285
  (input: { id: number } | FormData) => Promise<number>
@@ -289,7 +289,7 @@ describe('server action', () => {
289
289
  it('works with input', async () => {
290
290
  const p = os
291
291
  .input(z.object({ id: z.number(), date: z.date() }))
292
- .handler(async (input, context) => {
292
+ .func(async (input, context) => {
293
293
  expect(context).toBe(undefined)
294
294
  return input
295
295
  })
@@ -303,7 +303,7 @@ describe('server action', () => {
303
303
  it('can deserialize form data', async () => {
304
304
  const p = os
305
305
  .input(z.object({ id: z.number(), nested: z.object({ date: z.date() }) }))
306
- .handler(async input => input)
306
+ .func(async input => input)
307
307
 
308
308
  const form = new FormData()
309
309
  form.append('id', '123')
package/src/procedure.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { Promisable } from '@orpc/shared'
2
+ import type { ProcedureCaller } from './procedure-caller'
2
3
  import type { Context, MergeContext, Meta } from './types'
3
4
  import {
4
5
  type ContractProcedure,
@@ -10,7 +11,6 @@ import {
10
11
  type SchemaInput,
11
12
  type SchemaOutput,
12
13
  } from '@orpc/contract'
13
- import { OpenAPIDeserializer } from '@orpc/transformer'
14
14
  import {
15
15
  decorateMiddleware,
16
16
  type MapInputMiddleware,
@@ -23,18 +23,18 @@ export class Procedure<
23
23
  TExtraContext extends Context,
24
24
  TInputSchema extends Schema,
25
25
  TOutputSchema extends Schema,
26
- THandlerOutput extends SchemaOutput<TOutputSchema>,
26
+ TFuncOutput extends SchemaOutput<TOutputSchema>,
27
27
  > {
28
28
  constructor(
29
29
  public zz$p: {
30
30
  middlewares?: Middleware<any, any, any, any>[]
31
31
  contract: ContractProcedure<TInputSchema, TOutputSchema>
32
- handler: ProcedureHandler<
32
+ func: ProcedureFunc<
33
33
  TContext,
34
34
  TExtraContext,
35
35
  TInputSchema,
36
36
  TOutputSchema,
37
- THandlerOutput
37
+ TFuncOutput
38
38
  >
39
39
  },
40
40
  ) {}
@@ -45,13 +45,13 @@ export type DecoratedProcedure<
45
45
  TExtraContext extends Context,
46
46
  TInputSchema extends Schema,
47
47
  TOutputSchema extends Schema,
48
- THandlerOutput extends SchemaOutput<TOutputSchema>,
48
+ TFuncOutput extends SchemaOutput<TOutputSchema>,
49
49
  > = Procedure<
50
50
  TContext,
51
51
  TExtraContext,
52
52
  TInputSchema,
53
53
  TOutputSchema,
54
- THandlerOutput
54
+ TFuncOutput
55
55
  > & {
56
56
  prefix: (
57
57
  prefix: HTTPPath,
@@ -60,7 +60,7 @@ export type DecoratedProcedure<
60
60
  TExtraContext,
61
61
  TInputSchema,
62
62
  TOutputSchema,
63
- THandlerOutput
63
+ TFuncOutput
64
64
  >
65
65
 
66
66
  route: (
@@ -70,7 +70,7 @@ export type DecoratedProcedure<
70
70
  TExtraContext,
71
71
  TInputSchema,
72
72
  TOutputSchema,
73
- THandlerOutput
73
+ TFuncOutput
74
74
  >
75
75
 
76
76
  use: (<
@@ -82,14 +82,14 @@ export type DecoratedProcedure<
82
82
  MergeContext<TContext, TExtraContext>,
83
83
  UExtraContext,
84
84
  SchemaOutput<TInputSchema>,
85
- SchemaInput<TOutputSchema, THandlerOutput>
85
+ SchemaInput<TOutputSchema, TFuncOutput>
86
86
  >,
87
87
  ) => DecoratedProcedure<
88
88
  TContext,
89
89
  MergeContext<TExtraContext, UExtraContext>,
90
90
  TInputSchema,
91
91
  TOutputSchema,
92
- THandlerOutput
92
+ TFuncOutput
93
93
  >) & (<
94
94
  UExtraContext extends
95
95
  | Partial<MergeContext<Context, MergeContext<TContext, TExtraContext>>>
@@ -100,10 +100,10 @@ export type DecoratedProcedure<
100
100
  MergeContext<TContext, TExtraContext>,
101
101
  UExtraContext,
102
102
  UMappedInput,
103
- SchemaInput<TOutputSchema, THandlerOutput>
103
+ SchemaInput<TOutputSchema, TFuncOutput>
104
104
  >,
105
105
  mapInput: MapInputMiddleware<
106
- SchemaOutput<TInputSchema, THandlerOutput>,
106
+ SchemaOutput<TInputSchema, TFuncOutput>,
107
107
  UMappedInput
108
108
  >,
109
109
  ) => DecoratedProcedure<
@@ -111,15 +111,19 @@ export type DecoratedProcedure<
111
111
  MergeContext<TExtraContext, UExtraContext>,
112
112
  TInputSchema,
113
113
  TOutputSchema,
114
- THandlerOutput
114
+ TFuncOutput
115
115
  >)
116
116
  } & (undefined extends TContext
117
- ? (
118
- input: SchemaInput<TInputSchema> | FormData,
119
- ) => Promise<SchemaOutput<TOutputSchema, THandlerOutput>>
117
+ ? ProcedureCaller<Procedure<
118
+ TContext,
119
+ TExtraContext,
120
+ TInputSchema,
121
+ TOutputSchema,
122
+ TFuncOutput
123
+ >>
120
124
  : unknown)
121
125
 
122
- export interface ProcedureHandler<
126
+ export interface ProcedureFunc<
123
127
  TContext extends Context,
124
128
  TExtraContext extends Context,
125
129
  TInputSchema extends Schema,
@@ -140,49 +144,30 @@ export function decorateProcedure<
140
144
  TExtraContext extends Context,
141
145
  TInputSchema extends Schema,
142
146
  TOutputSchema extends Schema,
143
- THandlerOutput extends SchemaOutput<TOutputSchema>,
147
+ TFuncOutput extends SchemaOutput<TOutputSchema>,
144
148
  >(
145
149
  procedure: Procedure<
146
150
  TContext,
147
151
  TExtraContext,
148
152
  TInputSchema,
149
153
  TOutputSchema,
150
- THandlerOutput
154
+ TFuncOutput
151
155
  >,
152
156
  ): DecoratedProcedure<
153
157
  TContext,
154
158
  TExtraContext,
155
159
  TInputSchema,
156
160
  TOutputSchema,
157
- THandlerOutput
161
+ TFuncOutput
158
162
  > {
159
163
  if (DECORATED_PROCEDURE_SYMBOL in procedure) {
160
164
  return procedure as any
161
165
  }
162
166
 
163
- const serverAction = async (input: unknown): Promise<SchemaOutput<TOutputSchema, THandlerOutput>> => {
164
- const input_ = (() => {
165
- if (!(input instanceof FormData))
166
- return input
167
-
168
- const transformer = new OpenAPIDeserializer({
169
- schema: procedure.zz$p.contract.zz$cp.InputSchema,
170
- })
171
-
172
- return transformer.deserializeAsFormData(input)
173
- })()
174
-
175
- const procedureCaller = createProcedureCaller({
176
- procedure,
177
- context: undefined as any,
178
- internal: false,
179
- validate: true,
180
- })
181
-
182
- return await procedureCaller(input_ as any)
183
- }
184
-
185
- return Object.assign(serverAction, {
167
+ return Object.assign(createProcedureCaller({
168
+ procedure,
169
+ context: undefined as any,
170
+ }), {
186
171
  [DECORATED_PROCEDURE_SYMBOL]: true,
187
172
  zz$p: procedure.zz$p,
188
173
 
@@ -246,7 +231,7 @@ export function isProcedure(item: unknown): item is WELL_DEFINED_PROCEDURE {
246
231
  && item.zz$p !== null
247
232
  && 'contract' in item.zz$p
248
233
  && isContractProcedure(item.zz$p.contract)
249
- && 'handler' in item.zz$p
250
- && typeof item.zz$p.handler === 'function'
234
+ && 'func' in item.zz$p
235
+ && typeof item.zz$p.func === 'function'
251
236
  )
252
237
  }
@@ -6,10 +6,10 @@ import { RouterBuilder } from './router-builder'
6
6
  const builder = new RouterBuilder<undefined, undefined>({})
7
7
  const ping = os
8
8
  .route({ method: 'GET', path: '/ping', tags: ['ping'] })
9
- .handler(() => 'ping')
9
+ .func(() => 'ping')
10
10
  const pong = os
11
11
  .output(z.object({ id: z.string() }))
12
- .handler(() => ({ id: '123' }))
12
+ .func(() => ({ id: '123' }))
13
13
 
14
14
  describe('prefix', () => {
15
15
  it('chainable prefix', () => {
@@ -80,7 +80,7 @@ describe('middleware', () => {
80
80
  InputSchema: undefined,
81
81
  OutputSchema: undefined,
82
82
  }),
83
- handler: () => {},
83
+ func: () => {},
84
84
  })
85
85
 
86
86
  const decorated = decorateProcedure({
@@ -89,7 +89,7 @@ describe('middleware', () => {
89
89
  InputSchema: undefined,
90
90
  OutputSchema: undefined,
91
91
  }),
92
- handler: () => {},
92
+ func: () => {},
93
93
  },
94
94
  })
95
95
 
@@ -2,24 +2,22 @@ import { z } from 'zod'
2
2
  import { createRouterCaller, os } from '.'
3
3
 
4
4
  describe('createRouterCaller', () => {
5
- let internal = false
6
- let context = { auth: true }
5
+ const internal = false
6
+ const context = { auth: true }
7
7
 
8
8
  const osw = os.context<{ auth?: boolean }>()
9
9
 
10
10
  const ping = osw
11
11
  .input(z.object({ value: z.string().transform(v => Number(v)) }))
12
12
  .output(z.object({ value: z.number().transform(v => v.toString()) }))
13
- .handler((input, context, meta) => {
13
+ .func((input, context, meta) => {
14
14
  expect(context).toEqual(context)
15
- expect(meta.internal).toEqual(internal)
16
15
 
17
16
  return input
18
17
  })
19
18
 
20
- const pong = osw.handler((_, context, meta) => {
19
+ const pong = osw.func((_, context, meta) => {
21
20
  expect(context).toEqual(context)
22
- expect(meta.internal).toBe(internal)
23
21
 
24
22
  return { value: true }
25
23
  })
@@ -50,7 +48,6 @@ describe('createRouterCaller', () => {
50
48
  const caller = createRouterCaller({
51
49
  router,
52
50
  context,
53
- internal,
54
51
  })
55
52
 
56
53
  expectTypeOf(caller.ping).toMatchTypeOf<
@@ -98,52 +95,8 @@ describe('createRouterCaller', () => {
98
95
  )
99
96
  })
100
97
 
101
- it('without validate', () => {
102
- internal = true
103
- context = { auth: false }
104
-
105
- const caller = createRouterCaller({
106
- router,
107
- context,
108
- internal,
109
- validate: false,
110
- })
111
-
112
- expectTypeOf(caller.ping).toMatchTypeOf<
113
- (input: { value: number }) => Promise<{
114
- value: number
115
- }>
116
- >()
117
-
118
- expectTypeOf(caller.pong).toMatchTypeOf<
119
- (input: unknown) => Promise<{
120
- value: boolean
121
- }>
122
- >()
123
-
124
- expectTypeOf(caller.nested.ping).toMatchTypeOf<
125
- (input: { value: number }) => Promise<{
126
- value: number
127
- }>
128
- >()
129
-
130
- expectTypeOf(caller.nested.pong).toMatchTypeOf<
131
- (input: unknown) => Promise<{
132
- value: boolean
133
- }>
134
- >()
135
-
136
- expect(caller.ping({ value: 123 })).resolves.toEqual({ value: 123 })
137
- expect(caller.pong({ value: 123 })).resolves.toEqual({ value: true })
138
- expect(caller.nested.ping({ value: 123 })).resolves.toEqual({ value: 123 })
139
- expect(caller.nested.pong({ value: 123 })).resolves.toEqual({ value: true })
140
-
141
- // @ts-expect-error it's not validate so bellow still works
142
- expect(caller.ping({ value: '123' })).resolves.toEqual({ value: '123' })
143
- })
144
-
145
98
  it('path', () => {
146
- const ping = osw.handler((_, __, { path }) => {
99
+ const ping = osw.func((_, __, { path }) => {
147
100
  return path
148
101
  })
149
102
 
@@ -1,59 +1,43 @@
1
- import type {} from '@orpc/contract'
1
+ import type { Value } from '@orpc/shared'
2
2
  import type { Router } from './router'
3
3
  import { isProcedure, type Procedure } from './procedure'
4
4
  import { createProcedureCaller, type ProcedureCaller } from './procedure-caller'
5
5
 
6
6
  export interface CreateRouterCallerOptions<
7
7
  TRouter extends Router<any>,
8
- TValidate extends boolean,
9
8
  > {
10
9
  router: TRouter
11
10
 
12
11
  /**
13
12
  * The context used when calling the procedure.
14
13
  */
15
- context: TRouter extends Router<infer UContext> ? UContext : never
14
+ context: Value<
15
+ TRouter extends Router<infer UContext> ? UContext : never
16
+ >
16
17
 
17
18
  /**
18
19
  * This is helpful for logging and analytics.
19
- */
20
- basePath?: string[]
21
-
22
- /**
23
- * This flag helpful when you want bypass some logics not necessary to internal server calls.
24
- *
25
- * @default true
26
- */
27
- internal?: boolean
28
-
29
- /**
30
- * Indicate whether validate input and output.
31
20
  *
32
- * @default true
21
+ * @internal
33
22
  */
34
- validate?: TValidate
23
+ basePath?: string[]
35
24
  }
36
25
 
37
26
  export type RouterCaller<
38
27
  TRouter extends Router<any>,
39
- TValidate extends boolean,
40
28
  > = {
41
29
  [K in keyof TRouter]: TRouter[K] extends Procedure<any, any, any, any, any>
42
- ? ProcedureCaller<TRouter[K], TValidate>
30
+ ? ProcedureCaller<TRouter[K]>
43
31
  : TRouter[K] extends Router<any>
44
- ? RouterCaller<TRouter[K], TValidate>
32
+ ? RouterCaller<TRouter[K]>
45
33
  : never
46
34
  }
47
35
 
48
36
  export function createRouterCaller<
49
37
  TRouter extends Router<any>,
50
- TValidate extends boolean = true,
51
38
  >(
52
- options: CreateRouterCallerOptions<TRouter, TValidate>,
53
- ): RouterCaller<TRouter, TValidate> {
54
- const internal = options.internal ?? true
55
- const validate = options.validate ?? true
56
-
39
+ options: CreateRouterCallerOptions<TRouter>,
40
+ ): RouterCaller<TRouter> {
57
41
  const caller: Record<string, unknown> = {}
58
42
 
59
43
  for (const key in options.router) {
@@ -65,8 +49,6 @@ export function createRouterCaller<
65
49
  procedure: item,
66
50
  context: options.context as any,
67
51
  path,
68
- internal,
69
- validate,
70
52
  })
71
53
  }
72
54
  else {
@@ -74,11 +56,9 @@ export function createRouterCaller<
74
56
  router: item as any,
75
57
  context: options.context,
76
58
  basePath: path,
77
- internal,
78
- validate,
79
59
  })
80
60
  }
81
61
  }
82
62
 
83
- return caller as RouterCaller<TRouter, TValidate>
63
+ return caller as RouterCaller<TRouter>
84
64
  }
@@ -17,15 +17,15 @@ const cr = oc.router({
17
17
 
18
18
  const osw = os.context<{ auth: boolean }>().contract(cr)
19
19
 
20
- const p1 = osw.p1.handler(() => {
20
+ const p1 = osw.p1.func(() => {
21
21
  return 'unnoq'
22
22
  })
23
23
 
24
- const p2 = osw.nested.p2.handler(() => {
24
+ const p2 = osw.nested.p2.func(() => {
25
25
  return 'unnoq'
26
26
  })
27
27
 
28
- const p3 = osw.nested2.p3.handler(() => {
28
+ const p3 = osw.nested2.p3.func(() => {
29
29
  return 'unnoq'
30
30
  })
31
31
 
@@ -37,7 +37,7 @@ it('required all procedure match', () => {
37
37
  implementer.router({
38
38
  p1,
39
39
  nested: {
40
- p2: os.contract(cp2).handler(() => ''),
40
+ p2: os.contract(cp2).func(() => ''),
41
41
  },
42
42
  nested2: {
43
43
  p3,
@@ -47,7 +47,7 @@ it('required all procedure match', () => {
47
47
  expect(() => {
48
48
  implementer.router({
49
49
  // @ts-expect-error p1 is mismatch
50
- p1: os.handler(() => {}),
50
+ p1: os.func(() => {}),
51
51
  nested: {
52
52
  p2,
53
53
  },
@@ -76,7 +76,7 @@ it('required all procedure match', () => {
76
76
  p1: os
77
77
  .input(z.string())
78
78
  .output(z.string())
79
- .handler(() => 'unnoq'),
79
+ .func(() => 'unnoq'),
80
80
  nested: {
81
81
  p2,
82
82
  },
@@ -6,11 +6,11 @@ const router = os.router({
6
6
  ping: os
7
7
  .input(z.object({ ping: z.string().transform(() => 1) }))
8
8
  .output(z.object({ pong: z.number().transform(() => '1') }))
9
- .handler(() => ({ pong: 1 })),
9
+ .func(() => ({ pong: 1 })),
10
10
  user: {
11
11
  find: os
12
12
  .input(z.object({ find: z.number().transform(() => '1') }))
13
- .handler(() => ({ user: { id: 1 } }))
13
+ .func(() => ({ user: { id: 1 } }))
14
14
  ,
15
15
  },
16
16
  })
@@ -6,22 +6,22 @@ it('require procedure match context', () => {
6
6
  const osw = os.context<{ auth: boolean, userId: string }>()
7
7
 
8
8
  osw.router({
9
- ping: osw.context<{ auth: boolean }>().handler(() => {
9
+ ping: osw.context<{ auth: boolean }>().func(() => {
10
10
  return { pong: 'ping' }
11
11
  }),
12
12
 
13
13
  // @ts-expect-error userId is not match
14
- ping2: osw.context<{ userId: number }>().handler(() => {
14
+ ping2: osw.context<{ userId: number }>().func(() => {
15
15
  return { name: 'unnoq' }
16
16
  }),
17
17
 
18
18
  nested: {
19
- ping: osw.context<{ auth: boolean }>().handler(() => {
19
+ ping: osw.context<{ auth: boolean }>().func(() => {
20
20
  return { pong: 'ping' }
21
21
  }),
22
22
 
23
23
  // @ts-expect-error userId is not match
24
- ping2: osw.context<{ userId: number }>().handler(() => {
24
+ ping2: osw.context<{ userId: number }>().func(() => {
25
25
  return { name: 'unnoq' }
26
26
  }),
27
27
  },
@@ -31,10 +31,10 @@ it('require procedure match context', () => {
31
31
  it('require match contract', () => {
32
32
  const pingContract = oc.route({ method: 'GET', path: '/ping' })
33
33
  const pongContract = oc.input(z.string()).output(z.string())
34
- const ping = os.contract(pingContract).handler(() => {
34
+ const ping = os.contract(pingContract).func(() => {
35
35
  return 'ping'
36
36
  })
37
- const pong = os.contract(pongContract).handler(() => {
37
+ const pong = os.contract(pongContract).func(() => {
38
38
  return 'pong'
39
39
  })
40
40
 
@@ -85,7 +85,7 @@ it('require match contract', () => {
85
85
  nested: {
86
86
  ping,
87
87
  // @ts-expect-error nested.pong is mismatch
88
- pong: os.handler(() => 'ping'),
88
+ pong: os.func(() => 'ping'),
89
89
  },
90
90
  }
91
91
 
@@ -120,18 +120,18 @@ it('toContractRouter', () => {
120
120
  const osw = os.contract(contract)
121
121
 
122
122
  const router = osw.router({
123
- p1: osw.p1.handler(() => {
123
+ p1: osw.p1.func(() => {
124
124
  return 'unnoq'
125
125
  }),
126
126
 
127
127
  nested: osw.nested.router({
128
- p2: osw.nested.p2.handler(() => {
128
+ p2: osw.nested.p2.func(() => {
129
129
  return 'unnoq'
130
130
  }),
131
131
  }),
132
132
 
133
133
  nested2: {
134
- p3: osw.nested2.p3.handler(() => {
134
+ p3: osw.nested2.p3.func(() => {
135
135
  return 'unnoq'
136
136
  }),
137
137
  },