11import type { DecoratedContractProcedure } from './procedure-decorated'
2- import type { ContractRouterBuilder } from './router-builder'
2+ import type { AdaptedContractRouter , ContractRouterBuilder } from './router-builder'
33import { z } from 'zod'
44import { ContractBuilder } from './builder'
55import { ContractProcedure } from './procedure'
66
7- const builder = new ContractBuilder ( )
7+ const schema = z . object ( {
8+ value : z . string ( ) ,
9+ } )
10+
11+ const baseErrorMap = {
12+ BASE : {
13+ status : 500 ,
14+ data : z . object ( {
15+ message : z . string ( ) ,
16+ } ) ,
17+ } ,
18+ }
19+
20+ const builder = new ContractBuilder ( { errorMap : baseErrorMap } )
21+
22+ describe ( 'self chainable' , ( ) => {
23+ describe ( 'errors' , ( ) => {
24+ const errors = {
25+ BAD : {
26+ status : 500 ,
27+ data : schema ,
28+ } ,
29+ ERROR2 : {
30+ status : 401 ,
31+ data : schema ,
32+ } ,
33+ } as const
34+
35+ it ( 'should merge and strict with old one' , ( ) => {
36+ expectTypeOf ( builder . errors ( errors ) ) . toEqualTypeOf <
37+ ContractBuilder < typeof errors & typeof baseErrorMap >
38+ > ( )
39+ } )
40+
41+ it ( 'should prevent redefine errorMap' , ( ) => {
42+ // @ts -expect-error - not allow redefine errorMap
43+ builder . errors ( { BASE : baseErrorMap . BASE } )
44+ // @ts -expect-error - not allow redefine errorMap - even with undefined
45+ builder . errors ( { BASE : undefined } )
46+ } )
47+ } )
48+ } )
849
950describe ( 'to ContractRouterBuilder' , ( ) => {
1051 it ( 'prefix' , ( ) => {
1152 expectTypeOf ( builder . prefix ( '/prefix' ) ) . toEqualTypeOf <
12- ContractRouterBuilder
53+ ContractRouterBuilder < typeof baseErrorMap >
1354 > ( )
1455
1556 // @ts -expect-error - invalid prefix
@@ -20,7 +61,7 @@ describe('to ContractRouterBuilder', () => {
2061
2162 it ( 'tags' , ( ) => {
2263 expectTypeOf ( builder . tag ( 'tag1' , 'tag2' ) ) . toEqualTypeOf <
23- ContractRouterBuilder
64+ ContractRouterBuilder < typeof baseErrorMap >
2465 > ( )
2566
2667 // @ts -expect-error - invalid tag
@@ -33,11 +74,11 @@ describe('to ContractRouterBuilder', () => {
3374describe ( 'to DecoratedContractProcedure' , ( ) => {
3475 it ( 'route' , ( ) => {
3576 expectTypeOf ( builder . route ( { method : 'GET' , path : '/path' } ) ) . toEqualTypeOf <
36- DecoratedContractProcedure < undefined , undefined , undefined >
77+ DecoratedContractProcedure < undefined , undefined , typeof baseErrorMap >
3778 > ( )
3879
3980 expectTypeOf ( builder . route ( { } ) ) . toEqualTypeOf <
40- DecoratedContractProcedure < undefined , undefined , undefined >
81+ DecoratedContractProcedure < undefined , undefined , typeof baseErrorMap >
4182 > ( )
4283
4384 // @ts -expect-error - invalid method
@@ -46,17 +87,13 @@ describe('to DecoratedContractProcedure', () => {
4687 builder . route ( { method : 'GET' , path : '' } )
4788 } )
4889
49- const schema = z . object ( {
50- value : z . string ( ) ,
51- } )
52-
5390 it ( 'input' , ( ) => {
5491 expectTypeOf ( builder . input ( schema ) ) . toEqualTypeOf <
55- DecoratedContractProcedure < typeof schema , undefined , undefined >
92+ DecoratedContractProcedure < typeof schema , undefined , typeof baseErrorMap >
5693 > ( )
5794
5895 expectTypeOf ( builder . input ( schema , { value : 'example' } ) ) . toEqualTypeOf <
59- DecoratedContractProcedure < typeof schema , undefined , undefined >
96+ DecoratedContractProcedure < typeof schema , undefined , typeof baseErrorMap >
6097 > ( )
6198
6299 // @ts -expect-error - invalid schema
@@ -68,11 +105,11 @@ describe('to DecoratedContractProcedure', () => {
68105
69106 it ( 'output' , ( ) => {
70107 expectTypeOf ( builder . output ( schema ) ) . toEqualTypeOf <
71- DecoratedContractProcedure < undefined , typeof schema , undefined >
108+ DecoratedContractProcedure < undefined , typeof schema , typeof baseErrorMap >
72109 > ( )
73110
74111 expectTypeOf ( builder . output ( schema , { value : 'example' } ) ) . toEqualTypeOf <
75- DecoratedContractProcedure < undefined , typeof schema , undefined >
112+ DecoratedContractProcedure < undefined , typeof schema , typeof baseErrorMap >
76113 > ( )
77114
78115 // @ts -expect-error - invalid schema
@@ -81,54 +118,39 @@ describe('to DecoratedContractProcedure', () => {
81118 // @ts -expect-error - invalid example
82119 builder . output ( schema , { } )
83120 } )
84-
85- it ( 'errors' , ( ) => {
86- const errors = {
87- BAD : {
88- status : 500 ,
89- data : schema ,
90- } ,
91- ERROR2 : {
92- status : 401 ,
93- data : schema ,
94- } ,
95- } as const
96-
97- expectTypeOf ( builder . errors ( errors ) ) . toEqualTypeOf <
98- DecoratedContractProcedure < undefined , undefined , typeof errors >
99- > ( )
100-
101- expectTypeOf ( builder . output ( schema , { value : 'example' } ) ) . toEqualTypeOf <
102- DecoratedContractProcedure < undefined , typeof schema , undefined >
103- > ( )
104-
105- // @ts -expect-error - invalid schema
106- builder . errors ( { UNAUTHORIZED : { data : { } } } )
107- } )
108121} )
109122
110123describe ( 'to router' , ( ) => {
111- const router = {
112- a : {
113- b : {
114- c : new ContractProcedure ( { InputSchema : undefined , OutputSchema : undefined , errorMap : undefined } ) ,
115- } ,
124+ const errors = {
125+ CONFLICT : {
126+ status : 400 ,
127+ data : z . object ( {
128+ message : z . string ( ) ,
129+ } ) ,
116130 } ,
117131 }
118132
119- const emptyRouter = {
133+ const router = { a : { b : {
134+ c : new ContractProcedure ( { InputSchema : undefined , OutputSchema : undefined , errorMap : errors } ) ,
135+ } } }
120136
121- }
137+ it ( 'adapt all procedures' , ( ) => {
138+ expectTypeOf ( builder . router ( router ) ) . toEqualTypeOf < AdaptedContractRouter < typeof router , typeof baseErrorMap > > ( )
139+ expectTypeOf ( builder . router ( { } ) ) . toEqualTypeOf < Record < never , never > > ( )
122140
123- const invalidRouter = {
124- a : 1 ,
125- }
141+ // @ts -expect-error - invalid router
142+ builder . router ( { a : 1 } )
143+ } )
126144
127- it ( 'router' , ( ) => {
128- expectTypeOf ( builder . router ( router ) ) . toEqualTypeOf < typeof router > ( )
129- expectTypeOf ( builder . router ( emptyRouter ) ) . toEqualTypeOf < typeof emptyRouter > ( )
145+ it ( 'throw on conflict error map' , ( ) => {
146+ builder . router ( { ping : { } as ContractProcedure < any , any , { BASE : typeof baseErrorMap [ 'BASE' ] } > } )
147+ // @ts -expect-error conflict
148+ builder . router ( { ping : { } as ContractProcedure < any , any , { BASE : { message : string } } > } )
149+ } )
130150
131- // @ts -expect-error - invalid router
132- builder . router ( invalidRouter )
151+ it ( 'only required partial match error map' , ( ) => {
152+ expectTypeOf ( builder . router ( { ping : { } as ContractProcedure < any , any , { OTHER : { status : number } } > } ) ) . toEqualTypeOf < {
153+ ping : DecoratedContractProcedure < any , any , { OTHER : { status : number } } & typeof baseErrorMap >
154+ } > ( )
133155 } )
134156} )
0 commit comments