Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 12 additions & 8 deletions src/codegen/generators/typescript/headers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,10 +67,14 @@ export interface ProcessedHeadersData {
}

// Core generator function that works with processed data
export async function generateTypescriptHeadersCore(
processedData: ProcessedHeadersData,
generator: TypescriptHeadersGeneratorInternal
): Promise<Record<string, OutputModel | undefined>> {
export async function generateTypescriptHeadersCore({
processedData,
context
}: {
processedData: ProcessedHeadersData;
context: TypescriptHeadersContext;
}): Promise<Record<string, OutputModel | undefined>> {
const {generator} = context;
const modelinaGenerator = new TypeScriptFileGenerator({
...defaultCodegenTypescriptModelinaOptions,
constraints: {
Expand All @@ -95,7 +99,7 @@ export async function generateTypescriptHeadersCore(
return content;
}
return `${content}
${generateTypescriptValidationCode({model, renderer})}`;
${generateTypescriptValidationCode({model, renderer, context})}`;
}
}
}
Expand Down Expand Up @@ -150,10 +154,10 @@ export async function generateTypescriptHeaders(
}

// Generate models using processed data
const channelModels = await generateTypescriptHeadersCore(
const channelModels = await generateTypescriptHeadersCore({
processedData,
generator
);
context
});

return {
channelModels,
Expand Down
24 changes: 14 additions & 10 deletions src/codegen/generators/typescript/payloads.ts
Original file line number Diff line number Diff line change
Expand Up @@ -323,10 +323,14 @@ export async function generateTypescriptPayloadsCore(

// Core generator function that works with processed schema data
// eslint-disable-next-line sonarjs/cognitive-complexity
export async function generateTypescriptPayloadsCoreFromSchemas(
processedSchemaData: ProcessedPayloadSchemaData,
generator: TypeScriptPayloadGeneratorInternal
): Promise<TypeScriptPayloadRenderType> {
export async function generateTypescriptPayloadsCoreFromSchemas({
context,
processedSchemaData
}: {
processedSchemaData: ProcessedPayloadSchemaData;
context: TypeScriptPayloadContext;
}): Promise<TypeScriptPayloadRenderType> {
const generator = context.generator;
const modelinaGenerator = new TypeScriptFileGenerator({
...defaultCodegenTypescriptModelinaOptions,
presets: [
Expand All @@ -343,7 +347,7 @@ export async function generateTypescriptPayloadsCoreFromSchemas(
return content;
}
return `${content}
${generateTypescriptValidationCode({model, renderer})}`;
${generateTypescriptValidationCode({model, renderer, context})}`;
}
}
},
Expand All @@ -356,7 +360,7 @@ ${generateTypescriptValidationCode({model, renderer})}`;
${renderUnionUnmarshal(model, renderer)}
${renderUnionMarshal(model)}
${renderUnionUnmarshalByStatusCode(model)}
${generator.includeValidation ? generateTypescriptValidationCode({model, renderer, asClassMethods: false}) : ''}
${generator.includeValidation ? generateTypescriptValidationCode({model, renderer, asClassMethods: false, context}) : ''}
`;
}
return content;
Expand Down Expand Up @@ -484,7 +488,7 @@ ${generator.includeValidation ? generateTypescriptValidationCode({model, rendere
export async function generateTypescriptPayload(
context: TypeScriptPayloadContext
): Promise<TypeScriptPayloadRenderType> {
const {asyncapiDocument, openapiDocument, inputType, generator} = context;
const {asyncapiDocument, openapiDocument, inputType} = context;

let processedSchemaData: ProcessedPayloadSchemaData;

Expand All @@ -511,8 +515,8 @@ export async function generateTypescriptPayload(
}

// Generate final result using processed schema data
return generateTypescriptPayloadsCoreFromSchemas(
return generateTypescriptPayloadsCoreFromSchemas({
processedSchemaData,
generator
);
context
});
}
14 changes: 13 additions & 1 deletion src/codegen/modelina/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import {ConstrainedMetaModel} from '@asyncapi/modelina';
import {TypeScriptRenderer} from '@asyncapi/modelina/lib/types/generators/typescript/TypeScriptRenderer';
import {
TypescriptHeadersContext,
TypeScriptPayloadContext
} from '../generators';

/**
* Safe stringify that removes x- properties and circular references by assuming true
Expand Down Expand Up @@ -85,11 +89,13 @@ export function safeStringify(value: any): string {
export function generateTypescriptValidationCode({
model,
renderer,
asClassMethods = true
asClassMethods = true,
context
}: {
model: ConstrainedMetaModel;
renderer: TypeScriptRenderer;
asClassMethods?: boolean;
context: TypeScriptPayloadContext | TypescriptHeadersContext;
}) {
renderer.dependencyManager.addTypeScriptDependency(
'{Ajv, Options as AjvOptions, ErrorObject, ValidateFunction}',
Expand All @@ -114,6 +120,11 @@ export function generateTypescriptValidationCode({
? 'this.theCodeGenSchema'
: 'theCodeGenSchema';

const vocabularies =
context.inputType === 'openapi'
? 'ajvInstance.addVocabulary(["xml", "example"])'
: '';

return `${schemaProperty} = ${safeStringify(model.originalInput)};
${methodPrefix}validate(context?: {data: any, ajvValidatorFunction?: ValidateFunction, ajvInstance?: Ajv, ajvOptions?: AjvOptions}): { valid: boolean; errors?: ErrorObject[]; } {
const {data, ajvValidatorFunction} = context ?? {};
Expand All @@ -127,6 +138,7 @@ ${methodPrefix}validate(context?: {data: any, ajvValidatorFunction?: ValidateFun
${methodPrefix}createValidator(context?: {ajvInstance?: Ajv, ajvOptions?: AjvOptions}): ValidateFunction {
const {ajvInstance} = {...context ?? {}, ajvInstance: new Ajv(context?.ajvOptions ?? {})};
addFormats(ajvInstance);
${vocabularies}
const validate = ajvInstance.compile(${compileCall});
return validate;
}
Expand Down
1 change: 1 addition & 0 deletions src/codegen/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ export const zodOpenAPITypeScriptGenerators = z.discriminatedUnion('preset', [
zodTypescriptParametersGenerator,
zodTypescriptHeadersGenerator,
zodTypescriptTypesGenerator,
zodTypescriptChannelsGenerator,
zodCustomGenerator
]);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ class DeletePetHeaders {
public static createValidator(context?: {ajvInstance?: Ajv, ajvOptions?: AjvOptions}): ValidateFunction {
const {ajvInstance} = {...context ?? {}, ajvInstance: new Ajv(context?.ajvOptions ?? {})};
addFormats(ajvInstance);
ajvInstance.addVocabulary(["xml", "example"])
const validate = ajvInstance.compile(this.theCodeGenSchema);
return validate;
}
Expand Down Expand Up @@ -106,6 +107,7 @@ class DeletePetHeaders {
public static createValidator(context?: {ajvInstance?: Ajv, ajvOptions?: AjvOptions}): ValidateFunction {
const {ajvInstance} = {...context ?? {}, ajvInstance: new Ajv(context?.ajvOptions ?? {})};
addFormats(ajvInstance);
ajvInstance.addVocabulary(["xml", "example"])
const validate = ajvInstance.compile(this.theCodeGenSchema);
return validate;
}
Expand Down Expand Up @@ -163,6 +165,7 @@ class DeletePetHeaders {
public static createValidator(context?: {ajvInstance?: Ajv, ajvOptions?: AjvOptions}): ValidateFunction {
const {ajvInstance} = {...context ?? {}, ajvInstance: new Ajv(context?.ajvOptions ?? {})};
addFormats(ajvInstance);
ajvInstance.addVocabulary(["xml", "example"])
const validate = ajvInstance.compile(this.theCodeGenSchema);
return validate;
}
Expand Down Expand Up @@ -254,6 +257,7 @@ class SimpleObjectHeaders {
public static createValidator(context?: {ajvInstance?: Ajv, ajvOptions?: AjvOptions}): ValidateFunction {
const {ajvInstance} = {...context ?? {}, ajvInstance: new Ajv(context?.ajvOptions ?? {})};
addFormats(ajvInstance);

const validate = ajvInstance.compile(this.theCodeGenSchema);
return validate;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ export function validate(context?: {data: any, ajvValidatorFunction?: ValidateFu
export function createValidator(context?: {ajvInstance?: Ajv, ajvOptions?: AjvOptions}): ValidateFunction {
const {ajvInstance} = {...context ?? {}, ajvInstance: new Ajv(context?.ajvOptions ?? {})};
addFormats(ajvInstance);

const validate = ajvInstance.compile(theCodeGenSchema);
return validate;
}
Expand Down Expand Up @@ -214,6 +215,7 @@ class SimpleObject2 {
public static createValidator(context?: {ajvInstance?: Ajv, ajvOptions?: AjvOptions}): ValidateFunction {
const {ajvInstance} = {...context ?? {}, ajvInstance: new Ajv(context?.ajvOptions ?? {})};
addFormats(ajvInstance);

const validate = ajvInstance.compile(this.theCodeGenSchema);
return validate;
}
Expand Down Expand Up @@ -305,6 +307,7 @@ class SimpleObject {
public static createValidator(context?: {ajvInstance?: Ajv, ajvOptions?: AjvOptions}): ValidateFunction {
const {ajvInstance} = {...context ?? {}, ajvInstance: new Ajv(context?.ajvOptions ?? {})};
addFormats(ajvInstance);

const validate = ajvInstance.compile(this.theCodeGenSchema);
return validate;
}
Expand Down
Loading