fix: show siblings schema with oneOf (#2576)

This commit is contained in:
Alex Varchuk 2024-08-29 20:22:07 +02:00 committed by GitHub
parent a7607eafdd
commit 60d131b0a9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 89 additions and 5 deletions

View File

@ -364,14 +364,18 @@ export class OpenAPIParser {
const allOf = schema.allOf; const allOf = schema.allOf;
for (let i = 0; i < allOf.length; i++) { for (let i = 0; i < allOf.length; i++) {
const sub = allOf[i]; const { oneOf, ...sub } = allOf[i];
if (Array.isArray(sub.oneOf)) { if (!oneOf) {
continue;
}
if (Array.isArray(oneOf)) {
const beforeAllOf = allOf.slice(0, i); const beforeAllOf = allOf.slice(0, i);
const afterAllOf = allOf.slice(i + 1); const afterAllOf = allOf.slice(i + 1);
const siblingValues = Object.keys(sub).length > 0 ? [sub] : [];
return { return {
oneOf: sub.oneOf.map((part: OpenAPISchema) => { oneOf: oneOf.map((part: OpenAPISchema) => {
return { return {
allOf: [...beforeAllOf, part, ...afterAllOf], allOf: [...beforeAllOf, ...siblingValues, part, ...afterAllOf],
'x-refsStack': refsStack, 'x-refsStack': refsStack,
}; };
}), }),

View File

@ -21,6 +21,14 @@ exports[`Models Schema should hoist oneOfs when mergin allOf 1`] = `
"oneOf": [ "oneOf": [
{ {
"allOf": [ "allOf": [
{
"properties": {
"id": {
"description": "The user's ID",
"type": "integer",
},
},
},
{ {
"properties": { "properties": {
"username": { "username": {
@ -61,6 +69,14 @@ exports[`Models Schema should hoist oneOfs when mergin allOf 1`] = `
}, },
{ {
"allOf": [ "allOf": [
{
"properties": {
"id": {
"description": "The user's ID",
"type": "integer",
},
},
},
{ {
"properties": { "properties": {
"email": { "email": {
@ -99,6 +115,55 @@ exports[`Models Schema should hoist oneOfs when mergin allOf 1`] = `
], ],
"x-refsStack": undefined, "x-refsStack": undefined,
}, },
{
"allOf": [
{
"properties": {
"id": {
"description": "The user's ID",
"type": "integer",
},
},
},
{
"properties": {
"id": {
"description": "The user's ID",
"format": "uuid",
"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",
},
},
},
],
},
],
"x-refsStack": undefined,
},
], ],
} }
`; `;

View File

@ -9,6 +9,12 @@
"test": { "test": {
"allOf": [ "allOf": [
{ {
"properties": {
"id": {
"description": "The user's ID",
"type": "integer"
}
},
"oneOf": [ "oneOf": [
{ {
"properties": { "properties": {
@ -25,6 +31,15 @@
"type": "string" "type": "string"
} }
} }
},
{
"properties": {
"id": {
"description": "The user's ID",
"type": "string",
"format": "uuid"
}
}
} }
] ]
}, },
@ -59,4 +74,4 @@
} }
} }
} }
} }