1+ /* eslint-disable security/detect-object-injection */
12import {
23 OutputModel ,
34 TS_COMMON_PRESET ,
@@ -7,8 +8,10 @@ import {
78import { AsyncAPIDocumentInterface } from '@asyncapi/parser' ;
89import { GenericCodegenContext , HeadersRenderType } from '../../types' ;
910import { z } from 'zod' ;
10- import { defaultCodegenTypescriptModelinaOptions , pascalCase } from './utils' ;
11+ import { defaultCodegenTypescriptModelinaOptions } from './utils' ;
1112import { OpenAPIV2 , OpenAPIV3 , OpenAPIV3_1 } from 'openapi-types' ;
13+ import { processAsyncAPIHeaders } from '../../inputs/asyncapi/generators/headers' ;
14+ import { processOpenAPIHeaders } from '../../inputs/openapi/generators/headers' ;
1215
1316export const zodTypescriptHeadersGenerator = z . object ( {
1417 id : z . string ( ) . optional ( ) . default ( 'headers-typescript' ) ,
@@ -42,13 +45,19 @@ export interface TypescriptHeadersContext extends GenericCodegenContext {
4245export type TypeScriptHeadersRenderType =
4346 HeadersRenderType < TypescriptHeadersGeneratorInternal > ;
4447
45- export async function generateTypescriptHeaders (
46- context : TypescriptHeadersContext
47- ) : Promise < TypeScriptHeadersRenderType > {
48- const { asyncapiDocument, inputType, generator} = context ;
49- if ( inputType === 'asyncapi' && asyncapiDocument === undefined ) {
50- throw new Error ( 'Expected AsyncAPI input, was not given' ) ;
51- }
48+ // Interface for processed headers data (input-agnostic)
49+ export interface ProcessedHeadersData {
50+ channelHeaders : Record < string , {
51+ schema : any ;
52+ schemaId : string ;
53+ } | undefined > ;
54+ }
55+
56+ // Core generator function that works with processed data
57+ export async function generateTypescriptHeadersCore (
58+ processedData : ProcessedHeadersData ,
59+ generator : TypescriptHeadersGeneratorInternal
60+ ) : Promise < Record < string , OutputModel | undefined > > {
5261 const modelinaGenerator = new TypeScriptFileGenerator ( {
5362 ...defaultCodegenTypescriptModelinaOptions ,
5463 enumType : 'union' ,
@@ -63,33 +72,57 @@ export async function generateTypescriptHeaders(
6372 }
6473 ]
6574 } ) ;
66- const returnType : Record < string , OutputModel | undefined > = { } ;
67- for ( const channel of asyncapiDocument ! . allChannels ( ) . all ( ) ) {
68- const messages = channel . messages ( ) . all ( ) ;
69- for ( const message of messages ) {
70- if ( message . hasHeaders ( ) ) {
71- const schemaObj : any = {
72- additionalProperties : false ,
73- ...message . headers ( ) ?. json ( ) ,
74- type : 'object' ,
75- $id : pascalCase ( `${ message . id ( ) } _headers` ) ,
76- $schema : 'http://json-schema.org/draft-07/schema'
77- } ;
78- const models = await modelinaGenerator . generateToFiles (
79- schemaObj ,
80- generator . outputPath ,
81- { exportType : 'named' } ,
82- true
83- ) ;
84- returnType [ channel . id ( ) ] = models [ 0 ] ;
85- } else {
86- returnType [ channel . id ( ) ] = undefined ;
87- }
75+
76+ const channelModels : Record < string , OutputModel | undefined > = { } ;
77+
78+ for ( const [ channelId , headerData ] of Object . entries ( processedData . channelHeaders ) ) {
79+ if ( headerData ) {
80+ const models = await modelinaGenerator . generateToFiles (
81+ headerData . schema ,
82+ generator . outputPath ,
83+ { exportType : 'named' } ,
84+ true
85+ ) ;
86+ channelModels [ channelId ] = models [ 0 ] ;
87+ } else {
88+ channelModels [ channelId ] = undefined ;
8889 }
8990 }
9091
92+ return channelModels ;
93+ }
94+
95+ // Main generator function that orchestrates input processing and generation
96+ export async function generateTypescriptHeaders (
97+ context : TypescriptHeadersContext
98+ ) : Promise < TypeScriptHeadersRenderType > {
99+ const { asyncapiDocument, openapiDocument, inputType, generator} = context ;
100+
101+ let processedData : ProcessedHeadersData ;
102+
103+ // Process input based on type
104+ switch ( inputType ) {
105+ case 'asyncapi' :
106+ if ( ! asyncapiDocument ) {
107+ throw new Error ( 'Expected AsyncAPI input, was not given' ) ;
108+ }
109+ processedData = processAsyncAPIHeaders ( asyncapiDocument ) ;
110+ break ;
111+ case 'openapi' :
112+ if ( ! openapiDocument ) {
113+ throw new Error ( 'Expected OpenAPI input, was not given' ) ;
114+ }
115+ processedData = processOpenAPIHeaders ( openapiDocument ) ;
116+ break ;
117+ default :
118+ throw new Error ( `Unsupported input type: ${ inputType } ` ) ;
119+ }
120+
121+ // Generate models using processed data
122+ const channelModels = await generateTypescriptHeadersCore ( processedData , generator ) ;
123+
91124 return {
92- channelModels : returnType ,
125+ channelModels,
93126 generator
94127 } ;
95128}
0 commit comments