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);