diff --git a/.changeset/smart-feet-argue.md b/.changeset/smart-feet-argue.md new file mode 100644 index 000000000..079dada9b --- /dev/null +++ b/.changeset/smart-feet-argue.md @@ -0,0 +1,5 @@ +--- +'@gitbook/react-openapi': patch +--- + +Handle invalid OpenAPI Responses diff --git a/packages/react-openapi/src/OpenAPIResponseExample.tsx b/packages/react-openapi/src/OpenAPIResponseExample.tsx index 6d1cfdac2..b4b865f50 100644 --- a/packages/react-openapi/src/OpenAPIResponseExample.tsx +++ b/packages/react-openapi/src/OpenAPIResponseExample.tsx @@ -6,8 +6,8 @@ import { OpenAPIResponseExampleContent } from './OpenAPIResponseExampleContent'; import { type OpenAPIContext, getOpenAPIClientContext } from './context'; import type { OpenAPIOperationData, OpenAPIWebhookData } from './types'; import { getExampleFromReference, getExamples } from './util/example'; -import { createStateKey, getStatusCodeDefaultLabel } from './utils'; -import { checkIsReference, resolveDescription } from './utils'; +import { createStateKey, getStatusCodeDefaultLabel, resolveDescription } from './utils'; +import { checkIsReference } from './utils'; /** * Display an example of the response content. @@ -41,45 +41,47 @@ export function OpenAPIResponseExample(props: { return Number(a) - Number(b); }); - const tabs = responses.map(([key, responseObject]) => { - const description = resolveDescription(responseObject); - const label = description ? ( - - ) : ( - getStatusCodeDefaultLabel(key, context) - ); + const tabs = responses + .filter(([_, responseObject]) => responseObject && typeof responseObject === 'object') + .map(([key, responseObject]) => { + const description = resolveDescription(responseObject); + const label = description ? ( + + ) : ( + getStatusCodeDefaultLabel(key, context) + ); + + if (checkIsReference(responseObject)) { + return { + key: key, + label, + statusCode: key, + body: ( + + ), + }; + } + + if (!responseObject.content || Object.keys(responseObject.content).length === 0) { + return { + key: key, + label, + statusCode: key, + body: , + }; + } - if (checkIsReference(responseObject)) { return { key: key, label, statusCode: key, - body: ( - - ), + body: , }; - } - - if (!responseObject.content || Object.keys(responseObject.content).length === 0) { - return { - key: key, - label, - statusCode: key, - body: , - }; - } - - return { - key: key, - label, - statusCode: key, - body: , - }; - }); + }); if (tabs.length === 0) { return null; diff --git a/packages/react-openapi/src/OpenAPIResponses.tsx b/packages/react-openapi/src/OpenAPIResponses.tsx index efee2b3ce..c4565aa78 100644 --- a/packages/react-openapi/src/OpenAPIResponses.tsx +++ b/packages/react-openapi/src/OpenAPIResponses.tsx @@ -20,8 +20,9 @@ export function OpenAPIResponses(props: { }) { const { responses, context } = props; - const groups = Object.entries(responses).map( - ([statusCode, response]: [string, OpenAPIV3.ResponseObject]) => { + const groups = Object.entries(responses) + .filter(([_, response]) => response && typeof response === 'object') + .map(([statusCode, response]: [string, OpenAPIV3.ResponseObject]) => { const tabs = (() => { // If there is no content, but there are headers, we need to show the headers if ( @@ -83,8 +84,7 @@ export function OpenAPIResponses(props: { ), tabs, }; - } - ); + }); const state = useResponseExamplesState(context.blockKey, groups[0]?.key);