mirror of
https://github.com/Redocly/redoc.git
synced 2025-08-07 13:44:54 +03:00
chore: fix deref for non-schemas
This commit is contained in:
parent
fa6957f22f
commit
5332e33c9f
|
@ -9,7 +9,7 @@ const swagger = window.location.search.indexOf('swagger') > -1;
|
|||
const userUrl = window.location.search.match(/url=(.*)$/);
|
||||
|
||||
const specUrl =
|
||||
(userUrl && userUrl[1]) || (swagger ? 'swagger.yaml' : big ? 'big-openapi.json' : 'openapi-3-1.yaml');
|
||||
(userUrl && userUrl[1]) || (swagger ? 'swagger.yaml' : big ? 'big-openapi.json' : 'openapi.yaml');
|
||||
|
||||
const options: RedocRawOptions = { nativeScrollbars: false, maxDisplayedEnumValues: 3 };
|
||||
|
||||
|
|
|
@ -148,7 +148,7 @@ export class OpenAPIParser {
|
|||
* @param obj object to dereference
|
||||
* @param forceCircular whether to dereference even if it is circular ref
|
||||
*/
|
||||
deref<T extends object>(obj: OpenAPIRef | T, forceCircular = false): T {
|
||||
deref<T extends object>(obj: OpenAPIRef | T, forceCircular = false, mergeAsAllOf = false): T {
|
||||
if (this.isRef(obj)) {
|
||||
const schemaName = getDefinitionName(obj.$ref);
|
||||
if (schemaName && this.options.ignoreNamedSchemas.has(schemaName)) {
|
||||
|
@ -166,22 +166,22 @@ export class OpenAPIParser {
|
|||
// deref again in case one more $ref is here
|
||||
let result = resolved;
|
||||
if (this.isRef(resolved)) {
|
||||
result = this.deref(resolved);
|
||||
result = this.deref(resolved, false, mergeAsAllOf);
|
||||
this.exitRef(resolved);
|
||||
}
|
||||
return this.allowMergeRefs ? this.mergeRefs(obj, resolved) : result;
|
||||
return this.allowMergeRefs ? this.mergeRefs(obj, resolved, mergeAsAllOf) : result;
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
mergeRefs(ref, resolved) {
|
||||
mergeRefs(ref, resolved, mergeAsAllOf: boolean) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
const { $ref, ...rest } = ref;
|
||||
const keys = Object.keys(rest);
|
||||
if (keys.length === 0) {
|
||||
return resolved;
|
||||
}
|
||||
if (keys.some((k) => k !== 'description' && k !== 'title' && k !== 'externalDocs')) {
|
||||
if (mergeAsAllOf && keys.some((k) => k !== 'description' && k !== 'title' && k !== 'externalDocs')) {
|
||||
return {
|
||||
allOf: [resolved, rest],
|
||||
};
|
||||
|
@ -244,7 +244,7 @@ export class OpenAPIParser {
|
|||
return undefined;
|
||||
}
|
||||
|
||||
const resolved = this.deref(subSchema, forceCircular);
|
||||
const resolved = this.deref(subSchema, forceCircular, true);
|
||||
const subRef = subSchema.$ref || undefined;
|
||||
const subMerged = this.mergeAllOf(resolved, subRef, forceCircular, used$Refs);
|
||||
receiver.parentRefs!.push(...(subMerged.parentRefs || []));
|
||||
|
|
|
@ -76,7 +76,7 @@ export class SchemaModel {
|
|||
makeObservable(this);
|
||||
|
||||
this.pointer = schemaOrRef.$ref || pointer || '';
|
||||
this.rawSchema = parser.deref(schemaOrRef);
|
||||
this.rawSchema = parser.deref(schemaOrRef, false, true);
|
||||
this.schema = parser.mergeAllOf(this.rawSchema, this.pointer, isChild);
|
||||
|
||||
this.init(parser, isChild);
|
||||
|
@ -193,7 +193,7 @@ export class SchemaModel {
|
|||
|
||||
private initOneOf(oneOf: OpenAPISchema[], parser: OpenAPIParser) {
|
||||
this.oneOf = oneOf!.map((variant, idx) => {
|
||||
const derefVariant = parser.deref(variant);
|
||||
const derefVariant = parser.deref(variant, false, true);
|
||||
|
||||
const merged = parser.mergeAllOf(derefVariant, this.pointer + '/oneOf/' + idx);
|
||||
|
||||
|
|
|
@ -1864,16 +1864,10 @@ Object {
|
|||
"content": Object {
|
||||
"application/json": Object {
|
||||
"schema": Object {
|
||||
"allOf": Array [
|
||||
Object {
|
||||
"$ref": "#/components/schemas/Pet",
|
||||
"description": "My Pet",
|
||||
"title": "Pettie",
|
||||
},
|
||||
Object {
|
||||
"$ref": "#/components/schemas/Pet",
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
"application/xml": Object {
|
||||
"schema": Object {
|
||||
|
@ -1952,11 +1946,7 @@ Object {
|
|||
"Category": Object {
|
||||
"properties": Object {
|
||||
"id": Object {
|
||||
"allOf": Array [
|
||||
Object {
|
||||
"$ref": "#/components/schemas/Id",
|
||||
},
|
||||
],
|
||||
"description": "Category ID",
|
||||
},
|
||||
"name": Object {
|
||||
|
@ -2039,19 +2029,11 @@ Object {
|
|||
"type": "boolean",
|
||||
},
|
||||
"id": Object {
|
||||
"allOf": Array [
|
||||
Object {
|
||||
"$ref": "#/components/schemas/Id",
|
||||
},
|
||||
],
|
||||
"description": "Order ID",
|
||||
},
|
||||
"petId": Object {
|
||||
"allOf": Array [
|
||||
Object {
|
||||
"$ref": "#/components/schemas/Id",
|
||||
},
|
||||
],
|
||||
"description": "Pet ID",
|
||||
},
|
||||
"quantity": Object {
|
||||
|
@ -2096,26 +2078,14 @@ Object {
|
|||
},
|
||||
"properties": Object {
|
||||
"category": Object {
|
||||
"allOf": Array [
|
||||
Object {
|
||||
"$ref": "#/components/schemas/Category",
|
||||
},
|
||||
],
|
||||
"description": "Categories this pet belongs to",
|
||||
},
|
||||
"friend": Object {
|
||||
"allOf": Array [
|
||||
Object {
|
||||
"$ref": "#/components/schemas/Pet",
|
||||
},
|
||||
],
|
||||
},
|
||||
"id": Object {
|
||||
"allOf": Array [
|
||||
Object {
|
||||
"$ref": "#/components/schemas/Id",
|
||||
},
|
||||
],
|
||||
"description": "Pet ID",
|
||||
"externalDocs": Object {
|
||||
"description": "Find more info here",
|
||||
|
@ -2186,11 +2156,7 @@ Object {
|
|||
"Tag": Object {
|
||||
"properties": Object {
|
||||
"id": Object {
|
||||
"allOf": Array [
|
||||
Object {
|
||||
"$ref": "#/components/schemas/Id",
|
||||
},
|
||||
],
|
||||
"description": "Tag ID",
|
||||
},
|
||||
"name": Object {
|
||||
|
@ -2239,6 +2205,7 @@ Object {
|
|||
"oneOf": Array [
|
||||
Object {
|
||||
"$ref": "#/components/schemas/Pet",
|
||||
"title": "Pettie",
|
||||
},
|
||||
Object {
|
||||
"$ref": "#/components/schemas/Tag",
|
||||
|
|
Loading…
Reference in New Issue
Block a user