diff --git a/.changeset/tame-months-knock.md b/.changeset/tame-months-knock.md new file mode 100644 index 0000000000..5f2d1457b2 --- /dev/null +++ b/.changeset/tame-months-knock.md @@ -0,0 +1,5 @@ +--- +'@gitbook/react-openapi': patch +--- + +Fix merge logic for allOf alternatives diff --git a/packages/react-openapi/src/OpenAPISchema.tsx b/packages/react-openapi/src/OpenAPISchema.tsx index 7c5e71d812..ee808f3a0a 100644 --- a/packages/react-openapi/src/OpenAPISchema.tsx +++ b/packages/react-openapi/src/OpenAPISchema.tsx @@ -556,8 +556,10 @@ function mergeAlternatives( schemaOrRef.enum ) { const keys = Object.keys(schemaOrRef); - if (keys.every((key) => ['type', 'enum', 'nullable'].includes(key))) { - latest.enum = Array.from(new Set([...latest.enum, ...schemaOrRef.enum])); + if (keys.some((key) => ['type', 'enum', 'nullable'].includes(key))) { + latest.enum = Array.from( + new Set([...(latest.enum || []), ...(schemaOrRef.enum || [])]) + ); latest.nullable = latest.nullable || schemaOrRef.nullable; return acc; } @@ -566,18 +568,20 @@ function mergeAlternatives( if (latest && latest.type === 'object' && schemaOrRef.type === 'object') { const keys = Object.keys(schemaOrRef); if ( - keys.every((key) => + keys.some((key) => ['type', 'properties', 'required', 'nullable'].includes(key) ) ) { latest.properties = { - ...latest.properties, - ...schemaOrRef.properties, + ...(latest.properties || {}), + ...(schemaOrRef.properties || {}), }; latest.required = Array.from( new Set([ - ...(Array.isArray(latest.required) ? latest.required : []), - ...(Array.isArray(schemaOrRef.required) + ...(latest.required && Array.isArray(latest.required) + ? latest.required + : []), + ...(schemaOrRef.required && Array.isArray(schemaOrRef.required) ? schemaOrRef.required : []), ])