@@ -16,26 +16,28 @@ import {
1616  transformCompareRules , 
1717}  from  '../core' 
1818import  type  {  OpenApi3SchemaRulesOptions  }  from  './openapi3.types' 
19- import  {  CompareRules ,   AdapterResolver  }  from  '../types' 
19+ import  {  AdapterResolver ,   CompareRules  }  from  '../types' 
2020import  { 
21+   JSON_SCHEMA_NODE_TYPE_NULL , 
22+   JSON_SCHEMA_PROPERTY_ANY_OF , 
23+   JSON_SCHEMA_PROPERTY_NULLABLE , 
24+   JSON_SCHEMA_PROPERTY_ONE_OF , 
25+   JSON_SCHEMA_PROPERTY_TITLE , 
26+   JSON_SCHEMA_PROPERTY_TYPE , 
2127  JsonSchemaSpecVersion , 
2228  normalize , 
2329  type  OpenApiSpecVersion , 
2430  OriginsMetaRecord , 
31+   setOrigins , 
2532  SPEC_TYPE_JSON_SCHEMA_04 , 
2633  SPEC_TYPE_JSON_SCHEMA_07 , 
2734  SPEC_TYPE_OPEN_API_30 , 
2835  SPEC_TYPE_OPEN_API_31 , 
29-   JSON_SCHEMA_PROPERTY_NULLABLE , 
30-   JSON_SCHEMA_PROPERTY_ANY_OF , 
31-   JSON_SCHEMA_PROPERTY_ONE_OF , 
32-   JSON_SCHEMA_PROPERTY_TYPE , 
33-   JSON_SCHEMA_NODE_TYPE_NULL , 
34-   setOrigins , 
3536}  from  '@netcracker/qubership-apihub-api-unifier' 
3637import  {  schemaParamsCalculator  }  from  './openapi3.description.schema' 
37- import  {  isObject ,   isArray  }  from  '../utils' 
38+ import  {  isArray ,   isObject  }  from  '../utils' 
3839
40+ const  NULL_TYPE_COMBINERS  =  [ JSON_SCHEMA_PROPERTY_ANY_OF ,  JSON_SCHEMA_PROPERTY_ONE_OF ]  as  const 
3941const  SPEC_TYPE_TO_VERSION : Record < OpenApiSpecVersion ,  string >  =  { 
4042  [ SPEC_TYPE_OPEN_API_30 ] : '3.0.0' , 
4143  [ SPEC_TYPE_OPEN_API_31 ] : '3.1.0' , 
@@ -69,96 +71,68 @@ const openApiJsonSchemaAnyFactory: (version: OpenApiSpecVersion) => NativeAnySch
6971  return  normalizedSpec . components . schemas . empty  as  Record < PropertyKey ,  unknown > 
7072} 
7173
72- // Helper function to check if a schema has null type 
7374const  hasNullType  =  ( schema : unknown ) : boolean  =>  { 
74-   if  ( ! isObject ( schema ) )  return  false 
75-   
76-   // Check direct type property 
75+   if  ( ! isObject ( schema ) )  { 
76+     return  false 
77+   } 
78+ 
7779  const  type  =  schema [ JSON_SCHEMA_PROPERTY_TYPE ] 
78-   if  ( type  ===  JSON_SCHEMA_NODE_TYPE_NULL )  return  true 
79-   if  ( isArray ( type )  &&  type . includes ( JSON_SCHEMA_NODE_TYPE_NULL ) )  return  true 
80-   
81-   // Check in combiners (anyOf, oneOf) 
82-   for  ( const  combiner  of  [ JSON_SCHEMA_PROPERTY_ANY_OF ,  JSON_SCHEMA_PROPERTY_ONE_OF ]  as  const )  { 
83-     const  combinerArray  =  schema [ combiner ] 
84-     if  ( isArray ( combinerArray ) )  { 
85-       for  ( const  item  of  combinerArray )  { 
86-         if  ( hasNullType ( item ) )  return  true 
87-       } 
88-     } 
80+   if  ( type  ===  JSON_SCHEMA_NODE_TYPE_NULL )  { 
81+     return  true 
82+   } 
83+ 
84+   if  ( isArray ( type )  &&  type . includes ( JSON_SCHEMA_NODE_TYPE_NULL ) )  { 
85+     return  true 
8986  } 
90-   
91-   return  false 
92- } 
9387
94- // Builds a "null" type schema carrying over relevant origins from source 
95- // const buildNullTypeWithOrigins = ( 
96- //   valueWithoutNullable: Record<PropertyKey, unknown>, 
97- //   originsFlag: PropertyKey, 
98- // ): Record<PropertyKey, unknown> => { 
99- //   const nullTypeObject: Record<PropertyKey, unknown> = { 
100- //     [JSON_SCHEMA_PROPERTY_TYPE]: JSON_SCHEMA_NODE_TYPE_NULL, 
101- //   } 
102- //   const valueOrigins = valueWithoutNullable[originsFlag] as Record<PropertyKey, unknown> | undefined 
103- // 
104- //   if (valueWithoutNullable.title) { 
105- //     nullTypeObject.title = valueWithoutNullable.title 
106- //     const titleOrigin = valueOrigins && (valueOrigins as Record<PropertyKey, unknown>).title 
107- //     if (titleOrigin !== undefined) { 
108- //       nullTypeObject[originsFlag] = { title: titleOrigin } 
109- //     } 
110- //   } 
111- // 
112- //   const nullableOrigin = valueOrigins && (valueOrigins as Record<PropertyKey, unknown>).nullable 
113- //   if (nullableOrigin !== undefined) { 
114- //     const existing = (nullTypeObject[originsFlag] as Record<PropertyKey, unknown>) || {} 
115- //     nullTypeObject[originsFlag] = { ...existing, nullable: nullableOrigin } 
116- //   } 
117- // 
118- //   return nullTypeObject 
119- // } 
88+   return  NULL_TYPE_COMBINERS . some ( ( combiner )  =>  { 
89+     const  variants  =  schema [ combiner ] 
90+     return  isArray ( variants )  &&  variants . some ( hasNullType ) 
91+   } ) 
92+ } 
12093
12194const  buildNullTypeWithOrigins  =  ( 
12295  valueWithoutNullable : Record < PropertyKey ,  unknown > , 
12396  originsFlag : PropertyKey , 
124-   syntheticTitleFlag : PropertyKey 
97+   syntheticTitleFlag : symbol   |   undefined , 
12598) : Record < PropertyKey ,  unknown >  =>  { 
126-   const  nullTypeObject : Record < PropertyKey ,  unknown >  =  { 
99+   const  nullableObject : Record < PropertyKey ,  unknown >  =  { 
127100    [ JSON_SCHEMA_PROPERTY_TYPE ] : JSON_SCHEMA_NODE_TYPE_NULL , 
128101  } 
129102
130-   const  valueOrigins  =  valueWithoutNullable [ originsFlag ]  as  Record < PropertyKey ,  unknown >  |  undefined 
131103  const  origins : Record < PropertyKey ,  unknown >  =  { } 
104+   const  valueOrigins  =  valueWithoutNullable [ originsFlag ]  as  Record < PropertyKey ,  unknown >  |  undefined 
132105
133-   if  ( valueWithoutNullable . title )  { 
134-     nullTypeObject . title  =  valueWithoutNullable . title 
135-     if  ( valueOrigins ?. title  !==  undefined )  { 
136-       origins . title  =  valueOrigins . title 
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 ] 
137111    } 
138112  } 
139113
140-   if  ( valueOrigins ?. nullable   !==   undefined )  { 
141- 
142-      // origins.nullable = valueOrigins.nullable 
114+   if  ( syntheticTitleFlag   &&   valueWithoutNullable [ syntheticTitleFlag ] )  { 
115+      nullableObject [ syntheticTitleFlag ]   =   true 
116+   } 
143117
118+   if  ( valueOrigins  &&  valueOrigins [ JSON_SCHEMA_PROPERTY_NULLABLE ]  !==  undefined )  { 
144119    const  getOriginParent  =  ( item : unknown )  =>  ( { 
145120      value : JSON_SCHEMA_PROPERTY_TYPE , 
146121      parent : ( item  as  any ) ?. parent , 
147122    } ) 
148123
149-     origins [ JSON_SCHEMA_PROPERTY_TYPE ]  =  Array . isArray ( valueOrigins . nullable ) 
124+     origins [ JSON_SCHEMA_PROPERTY_TYPE ]  =  isArray ( valueOrigins . nullable ) 
150125      ? valueOrigins . nullable . map ( getOriginParent ) 
151126      : getOriginParent ( valueOrigins . nullable ) 
152127  } 
153128
154129  if  ( Object . keys ( origins ) . length  >  0 )  { 
155-     nullTypeObject [ originsFlag ]  =  origins 
130+     nullableObject [ originsFlag ]  =  origins 
156131  } 
157132
158-   return  nullTypeObject 
133+   return  nullableObject 
159134} 
160135
161- // Adapter to transform JSON Schemas used in OpenAPI 3.0 schemas to JSON Schemas used in OpenAPI 3.1 for comparison 
162136const  jsonSchemaOas30to31Adapter : AdapterResolver  =  ( value ,  reference ,  ctx )  =>  { 
163137  if  ( ! isObject ( value )  ||  ! isObject ( reference ) )  { 
164138    return  value 
@@ -172,12 +146,13 @@ const jsonSchemaOas30to31Adapter: AdapterResolver = (value, reference, ctx) => {
172146    return  value 
173147  } 
174148
175-   const  originsFlag : PropertyKey  =  ctx . options . originsFlag 
176-   // @ts -ignore 
177-   const  syntheticTitleFlag : PropertyKey  =  ctx . options . syntheticTitleFlag 
149+   const  {  originsFlag,  syntheticTitleFlag }  =  ctx . options 
178150
179151  return  ctx . transformer ( value ,  'nullable-to-anyof' ,  ( current )  =>  { 
180-     const  {  [ JSON_SCHEMA_PROPERTY_NULLABLE ] : _nullable ,  ...valueWithoutNullable  }  =  current  as  Record < PropertyKey ,  unknown > 
152+     const  { 
153+       [ JSON_SCHEMA_PROPERTY_NULLABLE ] : _nullable , 
154+       ...valueWithoutNullable 
155+     }  =  current  as  Record < PropertyKey ,  unknown > 
181156
182157    const  nullTypeObject  =  buildNullTypeWithOrigins ( valueWithoutNullable ,  originsFlag ,  syntheticTitleFlag ) 
183158
0 commit comments