UNPKG

fumadocs-openapi

Version:

Generate MDX docs for your OpenAPI spec

76 lines (74 loc) 2.78 kB
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