mirror of
https://github.com/Redocly/redoc.git
synced 2025-02-17 02:10:39 +03:00
parent
e0f58dc601
commit
7e5b6d9029
|
@ -182,6 +182,8 @@ export class OpenAPIParser {
|
||||||
$ref?: string,
|
$ref?: string,
|
||||||
forceCircular: boolean = false,
|
forceCircular: boolean = false,
|
||||||
): MergedOpenAPISchema {
|
): MergedOpenAPISchema {
|
||||||
|
schema = this.hoistOneOfs(schema);
|
||||||
|
|
||||||
if (schema.allOf === undefined) {
|
if (schema.allOf === undefined) {
|
||||||
return schema;
|
return schema;
|
||||||
}
|
}
|
||||||
|
@ -291,4 +293,28 @@ export class OpenAPIParser {
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private hoistOneOfs(schema: OpenAPISchema) {
|
||||||
|
if (schema.allOf === undefined) {
|
||||||
|
return schema;
|
||||||
|
}
|
||||||
|
|
||||||
|
const allOf = schema.allOf;
|
||||||
|
for (let i = 0; i < allOf.length; i++) {
|
||||||
|
const sub = allOf[i];
|
||||||
|
if (Array.isArray(sub.oneOf)) {
|
||||||
|
const beforeAllOf = allOf.slice(0, i);
|
||||||
|
const afterAllOf = allOf.slice(i + 1);
|
||||||
|
return {
|
||||||
|
oneOf: sub.oneOf.map(part => {
|
||||||
|
return this.mergeAllOf({
|
||||||
|
allOf: [...beforeAllOf, part, ...afterAllOf],
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return schema;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
16
src/services/__tests__/OpenAPIParser.test.ts
Normal file
16
src/services/__tests__/OpenAPIParser.test.ts
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
import { OpenAPIParser } from '../OpenAPIParser';
|
||||||
|
import { RedocNormalizedOptions } from '../RedocNormalizedOptions';
|
||||||
|
|
||||||
|
const opts = new RedocNormalizedOptions({});
|
||||||
|
|
||||||
|
describe('Models', () => {
|
||||||
|
describe('Schema', () => {
|
||||||
|
let parser;
|
||||||
|
|
||||||
|
test('should hoist oneOfs when mergin allOf', () => {
|
||||||
|
const spec = require('./fixtures/oneOfHoist.json');
|
||||||
|
parser = new OpenAPIParser(spec, undefined, opts);
|
||||||
|
expect(parser.mergeAllOf(spec.components.schemas.test)).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,84 @@
|
||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
|
exports[`Models Schema should hoist oneOfs when mergin allOf 1`] = `
|
||||||
|
Object {
|
||||||
|
"oneOf": Array [
|
||||||
|
Object {
|
||||||
|
"oneOf": Array [
|
||||||
|
Object {
|
||||||
|
"allOf": undefined,
|
||||||
|
"parentRefs": Array [],
|
||||||
|
"properties": Object {
|
||||||
|
"extra": Object {
|
||||||
|
"type": "string",
|
||||||
|
},
|
||||||
|
"password": Object {
|
||||||
|
"description": "The user's password",
|
||||||
|
"type": "string",
|
||||||
|
},
|
||||||
|
"username": Object {
|
||||||
|
"description": "The user's name",
|
||||||
|
"type": "string",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"allOf": undefined,
|
||||||
|
"parentRefs": Array [],
|
||||||
|
"properties": Object {
|
||||||
|
"extra": Object {
|
||||||
|
"type": "string",
|
||||||
|
},
|
||||||
|
"mobile": Object {
|
||||||
|
"description": "The user's mobile",
|
||||||
|
"type": "string",
|
||||||
|
},
|
||||||
|
"username": Object {
|
||||||
|
"description": "The user's name",
|
||||||
|
"type": "string",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"oneOf": Array [
|
||||||
|
Object {
|
||||||
|
"allOf": undefined,
|
||||||
|
"parentRefs": Array [],
|
||||||
|
"properties": Object {
|
||||||
|
"email": Object {
|
||||||
|
"description": "The user's email",
|
||||||
|
"type": "string",
|
||||||
|
},
|
||||||
|
"extra": Object {
|
||||||
|
"type": "string",
|
||||||
|
},
|
||||||
|
"password": Object {
|
||||||
|
"description": "The user's password",
|
||||||
|
"type": "string",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Object {
|
||||||
|
"allOf": undefined,
|
||||||
|
"parentRefs": Array [],
|
||||||
|
"properties": Object {
|
||||||
|
"email": Object {
|
||||||
|
"description": "The user's email",
|
||||||
|
"type": "string",
|
||||||
|
},
|
||||||
|
"extra": Object {
|
||||||
|
"type": "string",
|
||||||
|
},
|
||||||
|
"mobile": Object {
|
||||||
|
"description": "The user's mobile",
|
||||||
|
"type": "string",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
`;
|
62
src/services/__tests__/fixtures/oneOfHoist.json
Normal file
62
src/services/__tests__/fixtures/oneOfHoist.json
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
{
|
||||||
|
"openapi": "3.0.0",
|
||||||
|
"info": {
|
||||||
|
"version": "1.0",
|
||||||
|
"title": "Foo"
|
||||||
|
},
|
||||||
|
"components": {
|
||||||
|
"schemas": {
|
||||||
|
"test": {
|
||||||
|
"allOf": [
|
||||||
|
{
|
||||||
|
"oneOf": [
|
||||||
|
{
|
||||||
|
"properties": {
|
||||||
|
"username": {
|
||||||
|
"description": "The user's name",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"properties": {
|
||||||
|
"email": {
|
||||||
|
"description": "The user's email",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"properties": {
|
||||||
|
"extra": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"oneOf": [
|
||||||
|
{
|
||||||
|
"properties": {
|
||||||
|
"password": {
|
||||||
|
"description": "The user's password",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"properties": {
|
||||||
|
"mobile": {
|
||||||
|
"description": "The user's mobile",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user