fumadocs-openapi
Version:
Generate MDX docs for your OpenAPI spec
76 lines (74 loc) • 2.78 kB
JavaScript
import { getPreferredType } from "../../utils/schema.js";
import { AccordionContent, AccordionHeader, AccordionItem, AccordionTrigger, Accordions } from "../components/accordion.js";
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
import { Tab, Tabs } from "fumadocs-ui/components/tabs";
import { sample } from "openapi-sampler";
//#region src/ui/operation/response-tabs.tsx
function ResponseTabs({ operation, ctx }) {
if (!operation.responses) return null;
const tabs = [];
for (const [code, response] of Object.entries(operation.responses)) {
const media = response.content ? getPreferredType(response.content) : null;
const responseOfType = media ? response.content?.[media] : null;
const tab = {
code,
response,
mediaType: media
};
if (responseOfType?.examples) {
tab.examples ??= [];
for (const [key, sample$1] of Object.entries(responseOfType.examples)) {
const title = sample$1?.summary || `Example ${key}`;
tab.examples.push({
label: title,
sample: sample$1.value,
description: sample$1?.description
});
}
} else if (responseOfType?.example || responseOfType?.schema) {
tab.examples ??= [];
tab.examples.push({
label: "Example",
sample: responseOfType.example ?? sample(responseOfType.schema)
});
}
tabs.push(tab);
}
const { renderResponseTabs = renderResponseTabsDefault } = ctx.content ?? {};
return renderResponseTabs(tabs, ctx);
}
function renderResponseTabsDefault(tabs, ctx) {
function renderExampleContent(example) {
return /* @__PURE__ */ jsxs(Fragment, { children: [example.description && ctx.renderMarkdown(example.description), ctx.renderCodeBlock("json", JSON.stringify(example.sample, null, 2))] });
}
async function renderResponse(tab) {
const { examples = [] } = tab;
let slot = "Empty";
if (examples.length > 1) slot = /* @__PURE__ */ jsx(Accordions, {
type: "single",
className: "pt-2",
defaultValue: examples[0].label,
children: examples.map((example, i) => /* @__PURE__ */ jsxs(AccordionItem, {
value: example.label,
children: [/* @__PURE__ */ jsx(AccordionHeader, { children: /* @__PURE__ */ jsx(AccordionTrigger, { children: example.label }) }), /* @__PURE__ */ jsx(AccordionContent, {
className: "prose-no-margin",
children: renderExampleContent(example)
})]
}, i))
});
else if (examples.length === 1) slot = renderExampleContent(examples[0]);
return /* @__PURE__ */ jsx(Tab, {
value: tab.code,
children: slot
});
}
if (tabs.length === 0) return null;
return /* @__PURE__ */ jsx(Tabs, {
groupId: "fumadocs_openapi_responses",
items: tabs.map((tab) => tab.code),
children: tabs.map(renderResponse)
});
}
//#endregion
export { ResponseTabs };
//# sourceMappingURL=response-tabs.js.map