mirror of
https://github.com/Redocly/redoc.git
synced 2024-11-22 16:46:34 +03:00
fix: false-positive recursive detection with allOf at the same level
This commit is contained in:
parent
4649683785
commit
faa74d6002
|
@ -44,6 +44,7 @@ class RefCounter {
|
|||
export class OpenAPIParser {
|
||||
specUrl?: string;
|
||||
spec: OpenAPISpec;
|
||||
mergeRefs: Set<string>;
|
||||
|
||||
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<string>(),
|
||||
): 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 (
|
||||
|
|
Loading…
Reference in New Issue
Block a user