11import type {
22 AsyncAPIChannelObject ,
33 AsyncAPIContext ,
4+ AsyncAPIParameterObject ,
45 ReferenceObject ,
56} from '../types.js' ;
67import {
@@ -9,6 +10,7 @@ import {
910 tsLiteral ,
1011 tsModifiers ,
1112 tsPropertyIndex ,
13+ tsUnion ,
1214} from 'openapi-typescript/dist/lib/ts.js' ;
1315import { getEntries } from 'openapi-typescript/dist/lib/utils.js' ;
1416import ts from 'typescript' ;
@@ -83,13 +85,16 @@ export default function transformChannelsObject(
8385 if ( channel . parameters && typeof channel . parameters === 'object' ) {
8486 const paramMembers : ts . TypeElement [ ] = [ ] ;
8587
86- for ( const [ paramId ] of Object . entries ( channel . parameters ) ) {
88+ for ( const [ paramId , param ] of Object . entries ( channel . parameters ) ) {
8789 paramMembers . push (
8890 ts . factory . createPropertySignature (
8991 tsModifiers ( { readonly : ctx . immutable } ) ,
9092 tsPropertyIndex ( paramId ) ,
9193 undefined ,
92- ts . factory . createKeywordTypeNode ( ts . SyntaxKind . StringKeyword )
94+ transformChannelParameterType (
95+ param as AsyncAPIParameterObject | ReferenceObject ,
96+ ctx
97+ )
9398 )
9499 ) ;
95100 }
@@ -151,3 +156,24 @@ export default function transformChannelsObject(
151156
152157 return ts . factory . createTypeLiteralNode ( members ) ;
153158}
159+
160+ function transformChannelParameterType (
161+ parameter : AsyncAPIParameterObject | ReferenceObject ,
162+ ctx : AsyncAPIContext
163+ ) : ts . TypeNode {
164+ const parameterObject =
165+ '$ref' in parameter
166+ ? ctx . resolve < AsyncAPIParameterObject > ( parameter . $ref )
167+ : parameter ;
168+
169+ const enumValues =
170+ parameterObject ?. enum ?. filter (
171+ ( value ) : value is string => typeof value === 'string'
172+ ) ?? [ ] ;
173+
174+ if ( enumValues . length > 0 ) {
175+ return tsUnion ( enumValues . map ( tsLiteral ) ) ;
176+ }
177+
178+ return ts . factory . createKeywordTypeNode ( ts . SyntaxKind . StringKeyword ) ;
179+ }
0 commit comments