@@ -16,8 +16,9 @@ import {
1616  transformCompareRules , 
1717}  from  '../core' 
1818import  type  {  OpenApi3SchemaRulesOptions  }  from  './openapi3.types' 
19- import  {  AdapterResolver ,  CompareRules  }  from  '../types' 
19+ import  {  AdapterContext ,   AdapterResolver ,  CompareRules  }  from  '../types' 
2020import  { 
21+   cleanOrigins , 
2122  JSON_SCHEMA_NODE_TYPE_NULL , 
2223  JSON_SCHEMA_PROPERTY_ANY_OF , 
2324  JSON_SCHEMA_PROPERTY_NULLABLE , 
@@ -93,47 +94,50 @@ const hasNullType = (schema: unknown): boolean => {
9394
9495const  buildNullTypeWithOrigins  =  ( 
9596  valueWithoutNullable : Record < PropertyKey ,  unknown > , 
96-   originsFlag :  PropertyKey , 
97-   syntheticTitleFlag :  symbol   |   undefined , 
97+   context :  AdapterContext < unknown > , 
98+   factory :  NativeAnySchemaFactory , 
9899) : Record < PropertyKey ,  unknown >  =>  { 
99-   const  nullableObject : Record < PropertyKey ,  unknown >  =  { 
100-     [ JSON_SCHEMA_PROPERTY_TYPE ] : JSON_SCHEMA_NODE_TYPE_NULL , 
101-   } 
102- 
103-   const  origins : Record < PropertyKey ,  unknown >  =  { } 
104-   const  valueOrigins  =  valueWithoutNullable [ originsFlag ]  as  Record < PropertyKey ,  unknown >  |  undefined 
100+   const  {  options,  valueOrigins }  =  context 
101+   const  {  originsFlag,  syntheticTitleFlag }  =  options 
105102
106-   const  valueTitle  =  valueWithoutNullable [ JSON_SCHEMA_PROPERTY_TITLE ] 
107-   if  ( valueTitle )  { 
108-     nullableObject [ JSON_SCHEMA_PROPERTY_TITLE ]  =  valueTitle 
109-     if  ( valueOrigins  &&  valueOrigins [ JSON_SCHEMA_PROPERTY_TITLE ]  !==  undefined )  { 
110-       origins [ JSON_SCHEMA_PROPERTY_TITLE ]  =  valueOrigins [ JSON_SCHEMA_PROPERTY_TITLE ] 
111-     } 
112-   } 
103+   const  nullableObject  =  factory ( 
104+     {  [ JSON_SCHEMA_PROPERTY_TYPE ] : JSON_SCHEMA_NODE_TYPE_NULL  } , 
105+     valueOrigins , 
106+     options , 
107+   ) 
113108
114-   if  ( syntheticTitleFlag  &&  valueWithoutNullable [ syntheticTitleFlag ] )  { 
115-     nullableObject [ syntheticTitleFlag ]  =  true 
116-   } 
109+   const  inputOrigins  =  valueWithoutNullable [ originsFlag ]  as  Record < PropertyKey ,  unknown >  |  undefined 
110+   const  nullOrigins  =  nullableObject [ originsFlag ]  as  Record < PropertyKey ,  unknown >  |  undefined  ??  { } 
117111
118-   if  ( valueOrigins  &&  valueOrigins [ JSON_SCHEMA_PROPERTY_NULLABLE ]   !==   undefined )  { 
112+   if  ( inputOrigins  &&  inputOrigins . nullable )  { 
119113    const  getOriginParent  =  ( item : unknown )  =>  ( { 
120114      value : JSON_SCHEMA_PROPERTY_TYPE , 
121115      parent : ( item  as  any ) ?. parent , 
122116    } ) 
123117
124-     origins [ JSON_SCHEMA_PROPERTY_TYPE ]  =  isArray ( valueOrigins . nullable ) 
125-       ? valueOrigins . nullable . map ( getOriginParent ) 
126-       : getOriginParent ( valueOrigins . nullable ) 
118+     nullOrigins [ JSON_SCHEMA_PROPERTY_TYPE ]  =  isArray ( inputOrigins . nullable ) 
119+       ? inputOrigins . nullable . map ( getOriginParent ) 
120+       : getOriginParent ( inputOrigins . nullable ) 
127121  } 
128122
129-   if  ( Object . keys ( origins ) . length  >  0 )  { 
130-     nullableObject [ originsFlag ]  =  origins 
123+   const  valueTitle  =  valueWithoutNullable [ JSON_SCHEMA_PROPERTY_TITLE ] 
124+   if  ( valueTitle )  { 
125+     nullableObject [ JSON_SCHEMA_PROPERTY_TITLE ]  =  valueTitle 
126+ 
127+     const  titleOrigins  =  inputOrigins  &&  inputOrigins [ JSON_SCHEMA_PROPERTY_TITLE ] 
128+     if  ( titleOrigins )  { 
129+       nullOrigins [ JSON_SCHEMA_PROPERTY_TITLE ]  =  titleOrigins 
130+     } 
131+   } 
132+ 
133+   if  ( syntheticTitleFlag  &&  valueWithoutNullable [ syntheticTitleFlag ] )  { 
134+     nullableObject [ syntheticTitleFlag ]  =  true 
131135  } 
132136
133137  return  nullableObject 
134138} 
135139
136- const  jsonSchemaOas30to31Adapter : AdapterResolver  =  ( value ,  reference ,  ctx )  =>  { 
140+ const  jsonSchemaOas30to31Adapter : ( factory :  NativeAnySchemaFactory )   =>   AdapterResolver  =  ( factory )   =>   ( value ,  reference ,  valueContext )  =>  { 
137141  if  ( ! isObject ( value )  ||  ! isObject ( reference ) )  { 
138142    return  value 
139143  } 
@@ -146,23 +150,25 @@ const jsonSchemaOas30to31Adapter: AdapterResolver = (value, reference, ctx) => {
146150    return  value 
147151  } 
148152
149-   const  {  originsFlag,  syntheticTitleFlag  }  =  ctx . options 
153+   const  {  originsFlag  }  =  valueContext . options 
150154
151-   return  ctx . transformer ( value ,  'nullable-to-anyof' ,  ( current )  =>  { 
155+   return  valueContext . transformer ( value ,  'nullable-to-anyof' ,  ( current )  =>  { 
152156    const  { 
153157      [ JSON_SCHEMA_PROPERTY_NULLABLE ] : _nullable , 
154158      ...valueWithoutNullable 
155159    }  =  current  as  Record < PropertyKey ,  unknown > 
156160
157-     const  nullTypeObject  =  buildNullTypeWithOrigins ( valueWithoutNullable ,  originsFlag ,  syntheticTitleFlag ) 
161+     const  nullTypeObject  =  buildNullTypeWithOrigins ( valueWithoutNullable ,  valueContext ,  factory ) 
162+ 
163+     cleanOrigins ( valueWithoutNullable ,  JSON_SCHEMA_PROPERTY_NULLABLE ,  originsFlag ) 
158164
159165    const  anyOfArray  =  [ valueWithoutNullable ,  nullTypeObject ] 
160166
161167    const  result : Record < PropertyKey ,  unknown >  =  {  [ JSON_SCHEMA_PROPERTY_ANY_OF ] : anyOfArray  } 
162168
163-     setOrigins ( result ,  JSON_SCHEMA_PROPERTY_ANY_OF ,  originsFlag ,  ctx . valueOrigins ) 
164-     setOrigins ( anyOfArray ,  0 ,  originsFlag ,  ctx . valueOrigins ) 
165-     setOrigins ( anyOfArray ,  1 ,  originsFlag ,  ctx . valueOrigins ) 
169+     setOrigins ( result ,  JSON_SCHEMA_PROPERTY_ANY_OF ,  originsFlag ,  valueContext . valueOrigins ) 
170+     setOrigins ( anyOfArray ,  0 ,  originsFlag ,  valueContext . valueOrigins ) 
171+     setOrigins ( anyOfArray ,  1 ,  originsFlag ,  valueContext . valueOrigins ) 
166172
167173    return  result 
168174  } ) 
@@ -175,7 +181,7 @@ export const openApiSchemaRules = (options: OpenApi3SchemaRulesOptions): Compare
175181  const  schemaRules  =  jsonSchemaRules ( { 
176182    additionalRules : { 
177183      adapter : [ 
178-         ...( options . version  ===  SPEC_TYPE_OPEN_API_31  ? [ jsonSchemaOas30to31Adapter ]  : [ ] ) , 
184+         ...( options . version  ===  SPEC_TYPE_OPEN_API_31  ? [ jsonSchemaOas30to31Adapter ( openApiJsonSchemaAnyFactory ( options . version ) ) ]  : [ ] ) , 
179185        jsonSchemaAdapter ( openApiJsonSchemaAnyFactory ( options . version ) ) , 
180186      ] , 
181187      descriptionParamCalculator : schemaParamsCalculator , 
@@ -190,7 +196,7 @@ export const openApiSchemaRules = (options: OpenApi3SchemaRulesOptions): Compare
190196          nonBreaking , 
191197          ( {  after } )  =>  breakingIf ( ! ! after . value ) , 
192198        ] , 
193-         description : diffDescription ( resolveSchemaDescriptionTemplates ( 'nullable status' ) ) 
199+         description : diffDescription ( resolveSchemaDescriptionTemplates ( 'nullable status' ) ) , 
194200      } , 
195201      '/discriminator' : {  $ : allUnclassified  } , 
196202      '/example' : {  $ : allAnnotation ,  description : diffDescription ( resolveSchemaDescriptionTemplates ( 'example' ) )  } , 
@@ -199,15 +205,15 @@ export const openApiSchemaRules = (options: OpenApi3SchemaRulesOptions): Compare
199205        description : diffDescription ( resolveSchemaDescriptionTemplates ( 'externalDocs' ) ) , 
200206        '/description' : { 
201207          $ : allAnnotation , 
202-           description : diffDescription ( resolveSchemaDescriptionTemplates ( 'description of externalDocs' ) ) 
208+           description : diffDescription ( resolveSchemaDescriptionTemplates ( 'description of externalDocs' ) ) , 
203209        } , 
204210        '/url' : { 
205211          $ : allAnnotation , 
206-           description : diffDescription ( resolveSchemaDescriptionTemplates ( 'url of externalDocs' ) ) 
212+           description : diffDescription ( resolveSchemaDescriptionTemplates ( 'url of externalDocs' ) ) , 
207213        } , 
208214        '/*' : { 
209215          $ : allAnnotation , 
210-           description : diffDescription ( resolveSchemaDescriptionTemplates ( 'externalDocs' ) ) 
216+           description : diffDescription ( resolveSchemaDescriptionTemplates ( 'externalDocs' ) ) , 
211217        } , 
212218      } , 
213219      '/xml' : { } , 
0 commit comments