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' ;
@@ -84,22 +86,15 @@ export default function transformChannelsObject(
8486 const paramMembers : ts . TypeElement [ ] = [ ] ;
8587
8688 for ( const [ paramId , param ] of Object . entries ( channel . parameters ) ) {
87- let paramType : ts . TypeNode ;
88-
89- if ( param && '$ref' in param ) {
90- paramType = oapiRef ( ( param as ReferenceObject ) . $ref ) ;
91- } else {
92- paramType = ts . factory . createKeywordTypeNode (
93- ts . SyntaxKind . UnknownKeyword
94- ) ;
95- }
96-
9789 paramMembers . push (
9890 ts . factory . createPropertySignature (
9991 tsModifiers ( { readonly : ctx . immutable } ) ,
10092 tsPropertyIndex ( paramId ) ,
10193 undefined ,
102- paramType
94+ transformChannelParameterType (
95+ param as AsyncAPIParameterObject | ReferenceObject ,
96+ ctx
97+ )
10398 )
10499 ) ;
105100 }
@@ -161,3 +156,24 @@ export default function transformChannelsObject(
161156
162157 return ts . factory . createTypeLiteralNode ( members ) ;
163158}
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