1+ import { BrandEnum } from "../const/brands.const" ;
2+ import { ZOD_UTILS } from "../const/deps.const" ;
13import { ZOD_IMPORT } from "../const/zod.const" ;
4+ import { iterateSchema , OnSchemaCallbackData } from "../core/openapi/iterateSchema" ;
25import { getZodSchemaRefs } from "../core/zod/getZodSchemaRefs" ;
3- import { GenerateType , GenerateTypeParams , GenerateZodSchemaData } from "../types/generate" ;
6+ import { GenerateType , GenerateTypeParams , GenerateZodSchemaData , Import } from "../types/generate" ;
7+ import { matchesBrand } from "../utils/brand.utils" ;
48import { getModelsImports } from "../utils/generate/generate.imports.utils" ;
5- import { getNamespaceName } from "../utils/generate/generate.utils" ;
9+ import { getNamespaceName , getZodUtilsImportPath } from "../utils/generate/generate.utils" ;
610import { getHbsTemplateDelegate } from "../utils/hbs/hbs-template.utils" ;
11+ import { isSchemaObject } from "../utils/openapi-schema.utils" ;
712import { isEnumZodSchema } from "../utils/zod-schema.utils" ;
813
914export function generateModels ( { resolver, data, tag = "" } : GenerateTypeParams ) {
@@ -25,23 +30,52 @@ export function generateModels({ resolver, data, tag = "" }: GenerateTypeParams)
2530 const zodSchemasData : Record < string , GenerateZodSchemaData > = Object . entries ( zodSchemas ) . reduce (
2631 ( acc , [ key , code ] ) => {
2732 const ref = resolver . getRefByZodSchemaName ( key ) ;
28- return {
29- ...acc ,
30- [ key ] : {
31- code,
32- isCircular : ! ! ref && resolver . isSchemaCircular ( ref ) ,
33- isEnum : isEnumZodSchema ( code ) ,
34- schemaObj : resolver . getZodSchemaObj ( key ) ,
35- } ,
33+ const schemaObj = resolver . getZodSchemaObj ( key ) ;
34+
35+ let hasBrand = false ;
36+ if ( schemaObj && isSchemaObject ( schemaObj ) ) {
37+ const onSchema = ( data : OnSchemaCallbackData < never > ) => {
38+ if ( data . type === "reference" ) {
39+ return true ;
40+ }
41+ Object . values ( BrandEnum ) . forEach ( ( brand ) => {
42+ if (
43+ ( data . schema && isSchemaObject ( data . schema ) && matchesBrand ( data . schema , brand ) ) ||
44+ ( data . parentSchema && isSchemaObject ( data . parentSchema ) && matchesBrand ( data . parentSchema , brand ) )
45+ ) {
46+ hasBrand = true ;
47+ }
48+ } ) ;
49+ } ;
50+ iterateSchema ( schemaObj , { onSchema } ) ;
51+ }
52+
53+ const value = {
54+ code,
55+ isCircular : ! ! ref && resolver . isSchemaCircular ( ref ) ,
56+ isEnum : isEnumZodSchema ( code ) ,
57+ schemaObj,
58+ hasBrand,
3659 } ;
60+
61+ return { ...acc , [ key ] : value } ;
3762 } ,
3863 { } ,
3964 ) ;
4065
66+ const hasZodUtilsImport =
67+ resolver . options . branded && Object . values ( zodSchemasData ) . some ( ( zodSchema ) => zodSchema . hasBrand ) ;
68+ const zodUtilsImport : Import = {
69+ bindings : [ ZOD_UTILS . namespace ] ,
70+ from : getZodUtilsImportPath ( resolver . options ) ,
71+ } ;
72+
4173 const hbsTemplate = getHbsTemplateDelegate ( resolver , "models" ) ;
4274
4375 return hbsTemplate ( {
4476 zodImport : ZOD_IMPORT ,
77+ hasZodUtilsImport,
78+ zodUtilsImport,
4579 modelsImports,
4680 includeNamespace : resolver . options . tsNamespaces ,
4781 namespace : getNamespaceName ( { type : GenerateType . Models , tag, options : resolver . options } ) ,
0 commit comments