@@ -3938,4 +3938,142 @@ testCase("route with nested array examples", ROUTE_WITH_NESTED_ARRAY_EXAMPLES, {
3938
3938
}
3939
3939
}
3940
3940
}
3941
- } ) ;
3941
+ } ) ;
3942
+
3943
+ const ROUTE_WITH_RECORD_TYPES = `
3944
+ import * as t from 'io-ts';
3945
+ import * as h from '@api-ts/io-ts-http';
3946
+
3947
+ const ValidKeys = t.keyof({ name: "name", age: "age", address: "address" });
3948
+ const PersonObject = t.type({ bigName: t.string, bigAge: t.number });
3949
+
3950
+ export const route = h.httpRoute({
3951
+ path: '/foo',
3952
+ method: 'GET',
3953
+ request: h.httpRequest({
3954
+ query: {
3955
+ name: t.string,
3956
+ },
3957
+ }),
3958
+ response: {
3959
+ 200: {
3960
+ person: t.record(ValidKeys, t.string),
3961
+ anotherPerson: t.record(ValidKeys, PersonObject),
3962
+ bigPerson: t.record(t.string, t.string),
3963
+ anotherBigPerson: t.record(t.string, PersonObject),
3964
+ }
3965
+ },
3966
+ });
3967
+ ` ;
3968
+
3969
+ testCase ( "route with record types" , ROUTE_WITH_RECORD_TYPES , {
3970
+ openapi : '3.0.3' ,
3971
+ info : {
3972
+ title : 'Test' ,
3973
+ version : '1.0.0'
3974
+ } ,
3975
+ paths : {
3976
+ '/foo' : {
3977
+ get : {
3978
+ parameters : [
3979
+ {
3980
+ name : 'name' ,
3981
+ in : 'query' ,
3982
+ required : true ,
3983
+ schema : {
3984
+ type : 'string'
3985
+ }
3986
+ }
3987
+ ] ,
3988
+ responses : {
3989
+ '200' : {
3990
+ description : 'OK' ,
3991
+ content : {
3992
+ 'application/json' : {
3993
+ schema : {
3994
+ type : 'object' ,
3995
+ properties : {
3996
+ // becomes t.type()
3997
+ person : {
3998
+ type : 'object' ,
3999
+ properties : {
4000
+ name : { type : 'string' } ,
4001
+ age : { type : 'string' } ,
4002
+ address : { type : 'string' }
4003
+ } ,
4004
+ required : [ 'name' , 'age' , 'address' ]
4005
+ } ,
4006
+ // becomes t.type()
4007
+ anotherPerson : {
4008
+ type : 'object' ,
4009
+ properties : {
4010
+ name : {
4011
+ type : 'object' ,
4012
+ properties : {
4013
+ bigName : { type : 'string' } ,
4014
+ bigAge : { type : 'number' }
4015
+ } ,
4016
+ required : [ 'bigName' , 'bigAge' ]
4017
+ } ,
4018
+ age : {
4019
+ type : 'object' ,
4020
+ properties : {
4021
+ bigName : { type : 'string' } ,
4022
+ bigAge : { type : 'number' }
4023
+ } ,
4024
+ required : [ 'bigName' , 'bigAge' ]
4025
+ } ,
4026
+ address : {
4027
+ type : 'object' ,
4028
+ properties : {
4029
+ bigName : { type : 'string' } ,
4030
+ bigAge : { type : 'number' }
4031
+ } ,
4032
+ required : [ 'bigName' , 'bigAge' ]
4033
+ }
4034
+ } ,
4035
+ required : [ 'name' , 'age' , 'address' ]
4036
+ } ,
4037
+ bigPerson : {
4038
+ // stays as t.record()
4039
+ type : 'object' ,
4040
+ additionalProperties : { type : 'string' }
4041
+ } ,
4042
+ anotherBigPerson : {
4043
+ // stays as t.record()
4044
+ type : 'object' ,
4045
+ additionalProperties : {
4046
+ type : 'object' ,
4047
+ properties : {
4048
+ bigName : { type : 'string' } ,
4049
+ bigAge : { type : 'number' }
4050
+ } ,
4051
+ required : [ 'bigName' , 'bigAge' ]
4052
+ }
4053
+ }
4054
+ } ,
4055
+ required : [ 'person' , 'anotherPerson' , 'bigPerson' , 'anotherBigPerson' ]
4056
+ }
4057
+ }
4058
+ }
4059
+ }
4060
+ }
4061
+ }
4062
+ }
4063
+ } ,
4064
+ components : {
4065
+ schemas : {
4066
+ ValidKeys : {
4067
+ title : 'ValidKeys' ,
4068
+ type : 'string' ,
4069
+ enum : [ 'name' , 'age' , 'address' ]
4070
+ } ,
4071
+ PersonObject : {
4072
+ title : 'PersonObject' ,
4073
+ type : 'object' ,
4074
+ properties : { bigName : { type : 'string' } , bigAge : { type : 'number' } } ,
4075
+ required : [ 'bigName' , 'bigAge' ]
4076
+ }
4077
+ }
4078
+ }
4079
+ } ) ;
0 commit comments