diff --git a/src/services/OpenAPIParser.ts b/src/services/OpenAPIParser.ts index 029af319..a215b4f0 100644 --- a/src/services/OpenAPIParser.ts +++ b/src/services/OpenAPIParser.ts @@ -44,6 +44,7 @@ class RefCounter { export class OpenAPIParser { specUrl?: string; spec: OpenAPISpec; + mergeRefs: Set; private _refCounter: RefCounter = new RefCounter(); @@ -57,6 +58,8 @@ export class OpenAPIParser { this.spec = spec; + this.mergeRefs = new Set(); + const href = IS_BROWSER ? window.location.href : ''; if (typeof specUrl === 'string') { this.specUrl = urlResolve(href, specUrl); @@ -183,7 +186,12 @@ export class OpenAPIParser { schema: OpenAPISchema, $ref?: string, forceCircular: boolean = false, + used$Refs = new Set(), ): MergedOpenAPISchema { + if ($ref) { + used$Refs.add($ref); + } + schema = this.hoistOneOfs(schema); if (schema.allOf === undefined) { @@ -205,16 +213,25 @@ export class OpenAPIParser { receiver.items = { ...receiver.items }; } - const allOfSchemas = schema.allOf.map(subSchema => { - const resolved = this.deref(subSchema, forceCircular); - const subRef = subSchema.$ref || undefined; - const subMerged = this.mergeAllOf(resolved, subRef, forceCircular); - receiver.parentRefs!.push(...(subMerged.parentRefs || [])); - return { - $ref: subRef, - schema: subMerged, - }; - }); + const allOfSchemas = schema.allOf + .map(subSchema => { + if (subSchema && subSchema.$ref && used$Refs.has(subSchema.$ref)) { + return undefined; + } + + const resolved = this.deref(subSchema, forceCircular); + const subRef = subSchema.$ref || undefined; + const subMerged = this.mergeAllOf(resolved, subRef, forceCircular, used$Refs); + receiver.parentRefs!.push(...(subMerged.parentRefs || [])); + return { + $ref: subRef, + schema: subMerged, + }; + }) + .filter(child => child !== undefined) as Array<{ + $ref: string | undefined; + schema: MergedOpenAPISchema; + }>; for (const { $ref: subSchemaRef, schema: subSchema } of allOfSchemas) { if (