mirror of
https://github.com/Redocly/redoc.git
synced 2025-01-31 10:04:08 +03:00
parent
81a44a239a
commit
6e390f9c79
|
@ -296,8 +296,8 @@ export class OpenAPIParser {
|
||||||
* returns map of definition pointer to definition name
|
* returns map of definition pointer to definition name
|
||||||
* @param $refs array of references to find derived from
|
* @param $refs array of references to find derived from
|
||||||
*/
|
*/
|
||||||
findDerived($refs: string[]): Dict<string> {
|
findDerived($refs: string[]): Dict<string[]> {
|
||||||
const res: Dict<string> = {};
|
const res: Dict<string[]> = {};
|
||||||
const schemas = (this.spec.components && this.spec.components.schemas) || {};
|
const schemas = (this.spec.components && this.spec.components.schemas) || {};
|
||||||
for (const defName in schemas) {
|
for (const defName in schemas) {
|
||||||
const def = this.deref(schemas[defName]);
|
const def = this.deref(schemas[defName]);
|
||||||
|
@ -305,7 +305,7 @@ export class OpenAPIParser {
|
||||||
def.allOf !== undefined &&
|
def.allOf !== undefined &&
|
||||||
def.allOf.find(obj => obj.$ref !== undefined && $refs.indexOf(obj.$ref) > -1)
|
def.allOf.find(obj => obj.$ref !== undefined && $refs.indexOf(obj.$ref) > -1)
|
||||||
) {
|
) {
|
||||||
res['#/components/schemas/' + defName] = def['x-discriminator-value'] || defName;
|
res['#/components/schemas/' + defName] = [def['x-discriminator-value'] || defName];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
|
|
|
@ -216,7 +216,7 @@ export class SchemaModel {
|
||||||
) {
|
) {
|
||||||
const discriminator = getDiscriminator(schema)!;
|
const discriminator = getDiscriminator(schema)!;
|
||||||
this.discriminatorProp = discriminator.propertyName;
|
this.discriminatorProp = discriminator.propertyName;
|
||||||
const derived = parser.findDerived([...(schema.parentRefs || []), this.pointer]);
|
const inversedMapping = parser.findDerived([...(schema.parentRefs || []), this.pointer]);
|
||||||
|
|
||||||
if (schema.oneOf) {
|
if (schema.oneOf) {
|
||||||
for (const variant of schema.oneOf) {
|
for (const variant of schema.oneOf) {
|
||||||
|
@ -224,19 +224,37 @@ export class SchemaModel {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const name = JsonPointer.baseName(variant.$ref);
|
const name = JsonPointer.baseName(variant.$ref);
|
||||||
derived[variant.$ref] = name;
|
inversedMapping[variant.$ref] = [name];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const mapping = discriminator.mapping || {};
|
const mapping = discriminator.mapping || {};
|
||||||
for (const name in mapping) {
|
for (const name in mapping) {
|
||||||
derived[mapping[name]] = name;
|
const $ref = mapping[name];
|
||||||
|
|
||||||
|
if (Array.isArray(inversedMapping[$ref])) {
|
||||||
|
inversedMapping[$ref].push(name);
|
||||||
|
} else {
|
||||||
|
inversedMapping[$ref] = [name];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const refs = Object.keys(derived);
|
const refs: Array<{ $ref; name }> = [];
|
||||||
this.oneOf = refs.map(ref => {
|
|
||||||
const innerSchema = new SchemaModel(parser, parser.byRef(ref)!, ref, this.options, true);
|
for (const $ref of Object.keys(inversedMapping)) {
|
||||||
innerSchema.title = derived[ref];
|
const names = inversedMapping[$ref];
|
||||||
|
if (Array.isArray(names)) {
|
||||||
|
for (const name of names) {
|
||||||
|
refs.push({ $ref, name });
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
refs.push({ $ref, name: names });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.oneOf = refs.map(({ $ref, name }) => {
|
||||||
|
const innerSchema = new SchemaModel(parser, parser.byRef($ref)!, $ref, this.options, true);
|
||||||
|
innerSchema.title = name;
|
||||||
return innerSchema;
|
return innerSchema;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user