@@ -268,29 +268,44 @@ export class OpenAPIParser {
268268 } > ;
269269
270270 for ( const { $ref : subSchemaRef , schema : subSchema } of allOfSchemas ) {
271- if (
272- receiver . type !== subSchema . type &&
273- receiver . type !== undefined &&
274- subSchema . type !== undefined
275- ) {
276- console . warn (
277- `Incompatible types in allOf at "${ $ref } ": "${ receiver . type } " and "${ subSchema . type } "` ,
278- ) ;
271+ const {
272+ type,
273+ enum : enumProperty ,
274+ properties,
275+ items,
276+ required,
277+ ...otherConstraints
278+ } = subSchema ;
279+
280+ if ( receiver . type !== type && receiver . type !== undefined && type !== undefined ) {
281+ console . warn ( `Incompatible types in allOf at "${ $ref } ": "${ receiver . type } " and "${ type } "` ) ;
282+ }
283+
284+ if ( type !== undefined ) {
285+ if ( Array . isArray ( type ) && Array . isArray ( receiver . type ) ) {
286+ receiver . type = [ ...type , ...receiver . type ] ;
287+ } else {
288+ receiver . type = type ;
289+ }
279290 }
280291
281- if ( subSchema . type !== undefined ) {
282- receiver . type = subSchema . type ;
292+ if ( enumProperty !== undefined ) {
293+ if ( Array . isArray ( enumProperty ) && Array . isArray ( receiver . enum ) ) {
294+ receiver . enum = [ ...enumProperty , ...receiver . enum ] ;
295+ } else {
296+ receiver . enum = enumProperty ;
297+ }
283298 }
284299
285- if ( subSchema . properties !== undefined ) {
300+ if ( properties !== undefined ) {
286301 receiver . properties = receiver . properties || { } ;
287- for ( const prop in subSchema . properties ) {
302+ for ( const prop in properties ) {
288303 if ( ! receiver . properties [ prop ] ) {
289- receiver . properties [ prop ] = subSchema . properties [ prop ] ;
304+ receiver . properties [ prop ] = properties [ prop ] ;
290305 } else {
291306 // merge inner properties
292307 const mergedProp = this . mergeAllOf (
293- { allOf : [ receiver . properties [ prop ] , subSchema . properties [ prop ] ] } ,
308+ { allOf : [ receiver . properties [ prop ] , properties [ prop ] ] } ,
294309 $ref + '/properties/' + prop ,
295310 ) ;
296311 receiver . properties [ prop ] = mergedProp ;
@@ -299,22 +314,19 @@ export class OpenAPIParser {
299314 }
300315 }
301316
302- if ( subSchema . items !== undefined ) {
317+ if ( items !== undefined ) {
303318 receiver . items = receiver . items || { } ;
304319 // merge inner properties
305- receiver . items = this . mergeAllOf (
306- { allOf : [ receiver . items , subSchema . items ] } ,
307- $ref + '/items' ,
308- ) ;
320+ receiver . items = this . mergeAllOf ( { allOf : [ receiver . items , items ] } , $ref + '/items' ) ;
309321 }
310322
311- if ( subSchema . required !== undefined ) {
312- receiver . required = ( receiver . required || [ ] ) . concat ( subSchema . required ) ;
323+ if ( required !== undefined ) {
324+ receiver . required = ( receiver . required || [ ] ) . concat ( required ) ;
313325 }
314326
315327 // merge rest of constraints
316328 // TODO: do more intelligent merge
317- receiver = { ...subSchema , ...receiver } ;
329+ receiver = { ...receiver , ...otherConstraints } ;
318330
319331 if ( subSchemaRef ) {
320332 receiver . parentRefs ! . push ( subSchemaRef ) ;
0 commit comments