@@ -340,20 +340,63 @@ export class $RefParser {
340
340
throw ono ( "mergeMany called with no schemas. Did you run parseMany?" ) ;
341
341
}
342
342
343
- const first : any = schemas [ 0 ] || { } ;
344
343
const merged : any = { } ;
345
344
346
- if ( typeof first . openapi === "string" ) {
347
- merged . openapi = first . openapi ;
345
+ // Determine spec version: prefer first occurrence of openapi, else swagger
346
+ let chosenOpenapi : string | undefined ;
347
+ let chosenSwagger : string | undefined ;
348
+ for ( const s of schemas ) {
349
+ if ( ! chosenOpenapi && s && typeof ( s as any ) . openapi === "string" ) {
350
+ chosenOpenapi = ( s as any ) . openapi ;
351
+ }
352
+ if ( ! chosenSwagger && s && typeof ( s as any ) . swagger === "string" ) {
353
+ chosenSwagger = ( s as any ) . swagger ;
354
+ }
355
+ if ( chosenOpenapi && chosenSwagger ) {
356
+ break ;
357
+ }
358
+ }
359
+ if ( typeof chosenOpenapi === "string" ) {
360
+ merged . openapi = chosenOpenapi ;
361
+ } else if ( typeof chosenSwagger === "string" ) {
362
+ merged . swagger = chosenSwagger ;
363
+ }
364
+
365
+ // Merge info: take first non-empty per-field across inputs
366
+ const infoAccumulator : any = { } ;
367
+ for ( const s of schemas ) {
368
+ const info = ( s as any ) ?. info ;
369
+ if ( info && typeof info === "object" ) {
370
+ for ( const [ k , v ] of Object . entries ( info ) ) {
371
+ if ( infoAccumulator [ k ] === undefined && v !== undefined ) {
372
+ infoAccumulator [ k ] = JSON . parse ( JSON . stringify ( v ) ) ;
373
+ }
374
+ }
375
+ }
348
376
}
349
- if ( typeof first . swagger === "string" ) {
350
- merged . swagger = first . swagger ;
377
+ if ( Object . keys ( infoAccumulator ) . length > 0 ) {
378
+ merged . info = infoAccumulator ;
351
379
}
352
- if ( first . info ) {
353
- merged . info = JSON . parse ( JSON . stringify ( first . info ) ) ;
380
+
381
+ // Merge servers: union by url+description
382
+ const servers : any [ ] = [ ] ;
383
+ const seenServers = new Set < string > ( ) ;
384
+ for ( const s of schemas ) {
385
+ const arr = ( s as any ) ?. servers ;
386
+ if ( Array . isArray ( arr ) ) {
387
+ for ( const srv of arr ) {
388
+ if ( srv && typeof srv === "object" ) {
389
+ const key = `${ srv . url || "" } |${ srv . description || "" } ` ;
390
+ if ( ! seenServers . has ( key ) ) {
391
+ seenServers . add ( key ) ;
392
+ servers . push ( JSON . parse ( JSON . stringify ( srv ) ) ) ;
393
+ }
394
+ }
395
+ }
396
+ }
354
397
}
355
- if ( first . servers ) {
356
- merged . servers = JSON . parse ( JSON . stringify ( first . servers ) ) ;
398
+ if ( servers . length > 0 ) {
399
+ merged . servers = servers ;
357
400
}
358
401
359
402
merged . paths = { } ;
0 commit comments