fumadocs-openapi 10.2.2 → 10.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generate-file.d.ts +53 -49
- package/dist/generate-file.d.ts.map +1 -1
- package/dist/generate-file.js +88 -102
- package/dist/generate-file.js.map +1 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.js +3 -1
- package/dist/playground/client.d.ts +88 -72
- package/dist/playground/client.d.ts.map +1 -1
- package/dist/playground/client.js +446 -296
- package/dist/playground/client.js.map +1 -0
- package/dist/playground/components/inputs.js +395 -172
- package/dist/playground/components/inputs.js.map +1 -0
- package/dist/playground/components/oauth-dialog.js +270 -174
- package/dist/playground/components/oauth-dialog.js.map +1 -0
- package/dist/playground/components/server-select.js +115 -55
- package/dist/playground/components/server-select.js.map +1 -0
- package/dist/playground/fetcher.d.ts +10 -18
- package/dist/playground/fetcher.d.ts.map +1 -1
- package/dist/playground/fetcher.js +67 -75
- package/dist/playground/fetcher.js.map +1 -0
- package/dist/playground/get-default-values.js +23 -26
- package/dist/playground/get-default-values.js.map +1 -0
- package/dist/playground/index.d.ts +23 -13
- package/dist/playground/index.d.ts.map +1 -1
- package/dist/playground/index.js +87 -91
- package/dist/playground/index.js.map +1 -0
- package/dist/playground/lazy.js +9 -2
- package/dist/playground/lazy.js.map +1 -0
- package/dist/playground/schema.d.ts +18 -55
- package/dist/playground/schema.d.ts.map +1 -1
- package/dist/playground/schema.js +117 -106
- package/dist/playground/schema.js.map +1 -0
- package/dist/playground/status-info.js +49 -37
- package/dist/playground/status-info.js.map +1 -0
- package/dist/requests/generators/csharp.js +40 -50
- package/dist/requests/generators/csharp.js.map +1 -0
- package/dist/requests/generators/curl.js +28 -27
- package/dist/requests/generators/curl.js.map +1 -0
- package/dist/requests/generators/go.js +39 -35
- package/dist/requests/generators/go.js.map +1 -0
- package/dist/requests/generators/index.js +49 -43
- package/dist/requests/generators/index.js.map +1 -0
- package/dist/requests/generators/java.js +56 -67
- package/dist/requests/generators/java.js.map +1 -0
- package/dist/requests/generators/javascript.js +38 -45
- package/dist/requests/generators/javascript.js.map +1 -0
- package/dist/requests/generators/python.js +33 -37
- package/dist/requests/generators/python.js.map +1 -0
- package/dist/requests/media/adapter.d.ts +38 -84
- package/dist/requests/media/adapter.d.ts.map +1 -1
- package/dist/requests/media/adapter.js +122 -169
- package/dist/requests/media/adapter.js.map +1 -0
- package/dist/requests/media/encode.d.ts +12 -7
- package/dist/requests/media/encode.d.ts.map +1 -1
- package/dist/requests/media/encode.js +131 -109
- package/dist/requests/media/encode.js.map +1 -0
- package/dist/requests/media/resolve-adapter.js +28 -28
- package/dist/requests/media/resolve-adapter.js.map +1 -0
- package/dist/requests/string-utils.js +28 -35
- package/dist/requests/string-utils.js.map +1 -0
- package/dist/requests/to-python-object.js +16 -28
- package/dist/requests/to-python-object.js.map +1 -0
- package/dist/requests/types.d.ts +25 -21
- package/dist/requests/types.d.ts.map +1 -1
- package/dist/scalar/client.js +57 -20
- package/dist/scalar/client.js.map +1 -0
- package/dist/scalar/index.d.ts +8 -2
- package/dist/scalar/index.d.ts.map +1 -1
- package/dist/scalar/index.js +29 -19
- package/dist/scalar/index.js.map +1 -0
- package/dist/server/create.d.ts +29 -25
- package/dist/server/create.d.ts.map +1 -1
- package/dist/server/create.js +42 -39
- package/dist/server/create.js.map +1 -0
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.js +4 -2
- package/dist/server/proxy.d.ts +28 -28
- package/dist/server/proxy.d.ts.map +1 -1
- package/dist/server/proxy.js +58 -75
- package/dist/server/proxy.js.map +1 -0
- package/dist/server/source-api.d.ts +32 -29
- package/dist/server/source-api.d.ts.map +1 -1
- package/dist/server/source-api.js +82 -75
- package/dist/server/source-api.js.map +1 -0
- package/dist/types.d.ts +41 -36
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/api-page.d.ts +140 -136
- package/dist/ui/api-page.d.ts.map +1 -1
- package/dist/ui/api-page.js +134 -118
- package/dist/ui/api-page.js.map +1 -0
- package/dist/ui/client/index.d.ts +30 -26
- package/dist/ui/client/index.d.ts.map +1 -1
- package/dist/ui/client/index.js +8 -2
- package/dist/ui/client/index.js.map +1 -0
- package/dist/ui/client/storage-key.js +16 -10
- package/dist/ui/client/storage-key.js.map +1 -0
- package/dist/ui/components/accordion.js +40 -14
- package/dist/ui/components/accordion.js.map +1 -0
- package/dist/ui/components/dialog.js +51 -15
- package/dist/ui/components/dialog.js.map +1 -0
- package/dist/ui/components/input.js +18 -8
- package/dist/ui/components/input.js.map +1 -0
- package/dist/ui/components/method-label.js +38 -33
- package/dist/ui/components/method-label.js.map +1 -0
- package/dist/ui/components/select.js +66 -15
- package/dist/ui/components/select.js.map +1 -0
- package/dist/ui/contexts/api.js +96 -85
- package/dist/ui/contexts/api.js.map +1 -0
- package/dist/ui/contexts/api.lazy.js +9 -2
- package/dist/ui/contexts/api.lazy.js.map +1 -0
- package/dist/ui/index.d.ts +2 -2
- package/dist/ui/index.js +3 -1
- package/dist/ui/operation/client.js +65 -27
- package/dist/ui/operation/client.js.map +1 -0
- package/dist/ui/operation/index.js +403 -186
- package/dist/ui/operation/index.js.map +1 -0
- package/dist/ui/operation/request-tabs.d.ts +15 -16
- package/dist/ui/operation/request-tabs.d.ts.map +1 -1
- package/dist/ui/operation/request-tabs.js +151 -131
- package/dist/ui/operation/request-tabs.js.map +1 -0
- package/dist/ui/operation/response-tabs.d.ts +27 -28
- package/dist/ui/operation/response-tabs.d.ts.map +1 -1
- package/dist/ui/operation/response-tabs.js +73 -56
- package/dist/ui/operation/response-tabs.js.map +1 -0
- package/dist/ui/operation/usage-tabs/client.js +117 -88
- package/dist/ui/operation/usage-tabs/client.js.map +1 -0
- package/dist/ui/operation/usage-tabs/index.d.ts +22 -21
- package/dist/ui/operation/usage-tabs/index.d.ts.map +1 -1
- package/dist/ui/operation/usage-tabs/index.js +63 -48
- package/dist/ui/operation/usage-tabs/index.js.map +1 -0
- package/dist/ui/operation/usage-tabs/lazy.js +11 -4
- package/dist/ui/operation/usage-tabs/lazy.js.map +1 -0
- package/dist/ui/schema/client.d.ts +11 -7
- package/dist/ui/schema/client.d.ts.map +1 -1
- package/dist/ui/schema/client.js +213 -127
- package/dist/ui/schema/client.js.map +1 -0
- package/dist/ui/schema/index.d.ts +51 -50
- package/dist/ui/schema/index.d.ts.map +1 -1
- package/dist/ui/schema/index.js +225 -248
- package/dist/ui/schema/index.js.map +1 -0
- package/dist/ui/schema/lazy.js +9 -2
- package/dist/ui/schema/lazy.js.map +1 -0
- package/dist/utils/cn.js +3 -1
- package/dist/utils/deep-equal.js +18 -26
- package/dist/utils/deep-equal.js.map +1 -0
- package/dist/utils/get-typescript-schema.js +21 -19
- package/dist/utils/get-typescript-schema.js.map +1 -0
- package/dist/utils/id-to-title.js +13 -16
- package/dist/utils/id-to-title.js.map +1 -0
- package/dist/utils/lazy.js +13 -11
- package/dist/utils/lazy.js.map +1 -0
- package/dist/utils/merge-schema.js +130 -174
- package/dist/utils/merge-schema.js.map +1 -0
- package/dist/utils/pages/builder.d.ts +80 -76
- package/dist/utils/pages/builder.d.ts.map +1 -1
- package/dist/utils/pages/builder.js +101 -118
- package/dist/utils/pages/builder.js.map +1 -0
- package/dist/utils/pages/preset-auto.d.ts +58 -55
- package/dist/utils/pages/preset-auto.d.ts.map +1 -1
- package/dist/utils/pages/preset-auto.js +124 -137
- package/dist/utils/pages/preset-auto.js.map +1 -0
- package/dist/utils/pages/to-body.js +21 -18
- package/dist/utils/pages/to-body.js.map +1 -0
- package/dist/utils/pages/to-static-data.js +48 -40
- package/dist/utils/pages/to-static-data.js.map +1 -0
- package/dist/utils/pages/to-text.d.ts +43 -41
- package/dist/utils/pages/to-text.d.ts.map +1 -1
- package/dist/utils/pages/to-text.js +93 -126
- package/dist/utils/pages/to-text.js.map +1 -0
- package/dist/utils/process-document.d.ts +18 -19
- package/dist/utils/process-document.d.ts.map +1 -1
- package/dist/utils/process-document.js +43 -54
- package/dist/utils/process-document.js.map +1 -0
- package/dist/utils/remove-undefined.js +18 -18
- package/dist/utils/remove-undefined.js.map +1 -0
- package/dist/utils/schema-to-string.js +46 -64
- package/dist/utils/schema-to-string.js.map +1 -0
- package/dist/utils/schema.d.ts +11 -27
- package/dist/utils/schema.d.ts.map +1 -1
- package/dist/utils/schema.js +43 -44
- package/dist/utils/schema.js.map +1 -0
- package/dist/utils/url.js +35 -56
- package/dist/utils/url.js.map +1 -0
- package/dist/utils/use-query.js +39 -33
- package/dist/utils/use-query.js.map +1 -0
- package/package.json +34 -33
- package/dist/index.d.ts.map +0 -1
- package/dist/playground/components/inputs.d.ts +0 -25
- package/dist/playground/components/inputs.d.ts.map +0 -1
- package/dist/playground/components/oauth-dialog.d.ts +0 -13
- package/dist/playground/components/oauth-dialog.d.ts.map +0 -1
- package/dist/playground/components/server-select.d.ts +0 -3
- package/dist/playground/components/server-select.d.ts.map +0 -1
- package/dist/playground/get-default-values.d.ts +0 -3
- package/dist/playground/get-default-values.d.ts.map +0 -1
- package/dist/playground/lazy.d.ts +0 -2
- package/dist/playground/lazy.d.ts.map +0 -1
- package/dist/playground/status-info.d.ts +0 -8
- package/dist/playground/status-info.d.ts.map +0 -1
- package/dist/requests/generators/csharp.d.ts +0 -3
- package/dist/requests/generators/csharp.d.ts.map +0 -1
- package/dist/requests/generators/curl.d.ts +0 -3
- package/dist/requests/generators/curl.d.ts.map +0 -1
- package/dist/requests/generators/go.d.ts +0 -3
- package/dist/requests/generators/go.d.ts.map +0 -1
- package/dist/requests/generators/index.d.ts +0 -3
- package/dist/requests/generators/index.d.ts.map +0 -1
- package/dist/requests/generators/java.d.ts +0 -3
- package/dist/requests/generators/java.d.ts.map +0 -1
- package/dist/requests/generators/javascript.d.ts +0 -3
- package/dist/requests/generators/javascript.d.ts.map +0 -1
- package/dist/requests/generators/python.d.ts +0 -3
- package/dist/requests/generators/python.d.ts.map +0 -1
- package/dist/requests/media/resolve-adapter.d.ts +0 -19
- package/dist/requests/media/resolve-adapter.d.ts.map +0 -1
- package/dist/requests/string-utils.d.ts +0 -7
- package/dist/requests/string-utils.d.ts.map +0 -1
- package/dist/requests/to-python-object.d.ts +0 -2
- package/dist/requests/to-python-object.d.ts.map +0 -1
- package/dist/requests/types.js +0 -1
- package/dist/scalar/client.d.ts +0 -7
- package/dist/scalar/client.d.ts.map +0 -1
- package/dist/server/index.d.ts.map +0 -1
- package/dist/types.js +0 -1
- package/dist/ui/client/storage-key.d.ts +0 -9
- package/dist/ui/client/storage-key.d.ts.map +0 -1
- package/dist/ui/components/accordion.d.ts +0 -8
- package/dist/ui/components/accordion.d.ts.map +0 -1
- package/dist/ui/components/dialog.d.ts +0 -20
- package/dist/ui/components/dialog.d.ts.map +0 -1
- package/dist/ui/components/input.d.ts +0 -6
- package/dist/ui/components/input.d.ts.map +0 -1
- package/dist/ui/components/method-label.d.ts +0 -10
- package/dist/ui/components/method-label.d.ts.map +0 -1
- package/dist/ui/components/select.d.ts +0 -14
- package/dist/ui/components/select.d.ts.map +0 -1
- package/dist/ui/contexts/api.d.ts +0 -33
- package/dist/ui/contexts/api.d.ts.map +0 -1
- package/dist/ui/contexts/api.lazy.d.ts +0 -2
- package/dist/ui/contexts/api.lazy.d.ts.map +0 -1
- package/dist/ui/icons.d.ts +0 -49
- package/dist/ui/icons.d.ts.map +0 -1
- package/dist/ui/icons.js +0 -281
- package/dist/ui/index.d.ts.map +0 -1
- package/dist/ui/operation/client.d.ts +0 -19
- package/dist/ui/operation/client.d.ts.map +0 -1
- package/dist/ui/operation/index.d.ts +0 -12
- package/dist/ui/operation/index.d.ts.map +0 -1
- package/dist/ui/operation/usage-tabs/client.d.ts +0 -23
- package/dist/ui/operation/usage-tabs/client.d.ts.map +0 -1
- package/dist/ui/operation/usage-tabs/lazy.d.ts +0 -4
- package/dist/ui/operation/usage-tabs/lazy.d.ts.map +0 -1
- package/dist/ui/schema/lazy.d.ts +0 -2
- package/dist/ui/schema/lazy.d.ts.map +0 -1
- package/dist/utils/cn.d.ts +0 -2
- package/dist/utils/cn.d.ts.map +0 -1
- package/dist/utils/deep-equal.d.ts +0 -2
- package/dist/utils/deep-equal.d.ts.map +0 -1
- package/dist/utils/get-typescript-schema.d.ts +0 -4
- package/dist/utils/get-typescript-schema.d.ts.map +0 -1
- package/dist/utils/id-to-title.d.ts +0 -2
- package/dist/utils/id-to-title.d.ts.map +0 -1
- package/dist/utils/lazy.d.ts +0 -5
- package/dist/utils/lazy.d.ts.map +0 -1
- package/dist/utils/merge-schema.d.ts +0 -7
- package/dist/utils/merge-schema.d.ts.map +0 -1
- package/dist/utils/pages/to-body.d.ts +0 -4
- package/dist/utils/pages/to-body.d.ts.map +0 -1
- package/dist/utils/pages/to-static-data.d.ts +0 -10
- package/dist/utils/pages/to-static-data.d.ts.map +0 -1
- package/dist/utils/remove-undefined.d.ts +0 -2
- package/dist/utils/remove-undefined.d.ts.map +0 -1
- package/dist/utils/schema-to-string.d.ts +0 -8
- package/dist/utils/schema-to-string.d.ts.map +0 -1
- package/dist/utils/url.d.ts +0 -11
- package/dist/utils/url.d.ts.map +0 -1
- package/dist/utils/use-query.d.ts +0 -8
- package/dist/utils/use-query.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["headNode: ReactNode","bodyNode: ReactNode","authNode: ReactNode","responseNode: ReactNode","callbacksNode: ReactNode","type","selectorNode: ReactNode","ts: string | undefined"],"sources":["../../../src/ui/operation/index.tsx"],"sourcesContent":["import { type ComponentProps, Fragment, type ReactNode } from 'react';\nimport type {\n CallbackObject,\n MethodInformation,\n RenderContext,\n SecuritySchemeObject,\n} from '@/types';\nimport { createMethod, methodKeys, type NoReference, type ResolvedSchema } from '@/utils/schema';\nimport { idToTitle } from '@/utils/id-to-title';\nimport { Schema } from '../schema';\nimport { UsageTabs } from '@/ui/operation/usage-tabs';\nimport { MethodLabel } from '@/ui/components/method-label';\nimport { getTypescriptSchema } from '@/utils/get-typescript-schema';\nimport { CopyResponseTypeScript, SelectTab, SelectTabs, SelectTabTrigger } from './client';\nimport {\n AccordionContent,\n AccordionHeader,\n AccordionItem,\n Accordions,\n AccordionTrigger,\n} from '@/ui/components/accordion';\nimport { isMediaTypeSupported } from '@/requests/media/adapter';\nimport { cn } from '@/utils/cn';\nimport { APIPlayground } from '@/playground';\nimport { getExampleRequests, RequestTabs } from './request-tabs';\nimport { UsageTabsProviderLazy } from './usage-tabs/lazy';\n\nconst ParamTypes = {\n path: 'Path Parameters',\n query: 'Query Parameters',\n header: 'Header Parameters',\n cookie: 'Cookie Parameters',\n};\n\nexport async function Operation({\n type = 'operation',\n path,\n method,\n ctx,\n showTitle,\n showDescription,\n headingLevel = 2,\n}: {\n type?: 'webhook' | 'operation';\n path: string;\n method: MethodInformation;\n ctx: RenderContext;\n\n showTitle?: boolean;\n showDescription?: boolean;\n headingLevel?: number;\n}) {\n const {\n schema: { dereferenced },\n } = ctx;\n const body = method.requestBody;\n let headNode: ReactNode = null;\n const descriptionNode =\n showDescription && method.description && ctx.renderMarkdown(method.description);\n let bodyNode: ReactNode = null;\n let authNode: ReactNode = null;\n let responseNode: ReactNode = null;\n let callbacksNode: ReactNode = null;\n\n if (showTitle) {\n const title = method.summary || (method.operationId ? idToTitle(method.operationId) : path);\n\n headNode = ctx.renderHeading(headingLevel, title);\n headingLevel++;\n }\n\n const contentTypes = body ? Object.entries(body.content) : null;\n\n if (body && contentTypes && contentTypes.length > 0) {\n const items = contentTypes.map(([key]) => ({\n label: <code className=\"text-xs\">{key}</code>,\n value: key,\n }));\n\n bodyNode = (\n <SelectTabs defaultValue={items[0].value}>\n <div className=\"flex gap-2 items-center justify-between mt-10\">\n {ctx.renderHeading(headingLevel, 'Request Body', {\n className: 'my-0!',\n })}\n {contentTypes.length > 1 ? (\n <SelectTabTrigger items={items} className=\"font-medium\" />\n ) : (\n <p className=\"text-fd-muted-foreground not-prose\">{items[0].label}</p>\n )}\n </div>\n {body.description && ctx.renderMarkdown(body.description)}\n {contentTypes.map(([type, content]) => {\n if (!isMediaTypeSupported(type, ctx.mediaAdapters)) {\n throw new Error(`Media type ${type} is not supported (in ${path})`);\n }\n\n return (\n <SelectTab key={type} value={type}>\n <Schema\n client={{\n name: 'body',\n as: 'body',\n required: body.required,\n }}\n root={(content.schema ?? {}) as ResolvedSchema}\n readOnly={method.method === 'GET'}\n writeOnly={method.method !== 'GET'}\n ctx={ctx}\n />\n </SelectTab>\n );\n })}\n </SelectTabs>\n );\n }\n\n if (method.responses && ctx.showResponseSchema !== false) {\n const statuses = Object.keys(method.responses);\n\n responseNode = (\n <>\n {ctx.renderHeading(headingLevel, 'Response Body')}\n\n <Accordions type=\"multiple\">\n {statuses.map((status) => (\n <ResponseAccordion key={status} status={status} operation={method} ctx={ctx} />\n ))}\n </Accordions>\n </>\n );\n }\n\n const parameterNode = Object.entries(ParamTypes).map(([type, title]) => {\n const params = method.parameters?.filter((param) => param.in === type);\n if (!params || params.length === 0) return;\n\n return (\n <Fragment key={type}>\n {ctx.renderHeading(headingLevel, title)}\n <div className=\"flex flex-col\">\n {params.map((param) => (\n <Schema\n key={param.name}\n client={{\n name: param.name,\n required: param.required,\n }}\n root={\n {\n ...param.schema,\n description: param.description ?? param.schema?.description,\n deprecated: (param.deprecated ?? false) || (param.schema?.deprecated ?? false),\n } as ResolvedSchema\n }\n readOnly={method.method === 'GET'}\n writeOnly={method.method !== 'GET'}\n ctx={ctx}\n />\n ))}\n </div>\n </Fragment>\n );\n });\n\n const securities = (method.security ?? dereferenced.security ?? []).filter(\n (v) => Object.keys(v).length > 0,\n );\n\n if (type === 'operation' && securities.length > 0) {\n const securitySchemes = dereferenced.components?.securitySchemes;\n const items = securities.map((security, i) => {\n return {\n value: String(i),\n label: (\n <div className=\"flex flex-col text-xs min-w-0\">\n {Object.entries(security).map(([key, scopes]) => (\n <code key={key} className=\"truncate\">\n <span className=\"font-medium\">{key}</span>{' '}\n {scopes.length > 0 && (\n <span className=\"text-fd-muted-foreground\">{scopes.join(', ')}</span>\n )}\n </code>\n ))}\n </div>\n ),\n };\n });\n\n authNode = (\n <SelectTabs defaultValue={items[0].value}>\n <div className=\"flex items-start justify-between gap-2 mt-10\">\n {ctx.renderHeading(headingLevel, 'Authorization', {\n className: 'my-0!',\n })}\n {items.length > 1 ? (\n <SelectTabTrigger items={items} />\n ) : (\n <div className=\"not-prose\">{items[0].label}</div>\n )}\n </div>\n {securities.map((security, i) => (\n <SelectTab key={i} value={items[i].value}>\n {Object.entries(security).map(([key, scopes]) => {\n const scheme = securitySchemes?.[key];\n if (!scheme) return;\n\n return <AuthScheme key={key} scheme={scheme} scopes={scopes} ctx={ctx} />;\n })}\n </SelectTab>\n ))}\n </SelectTabs>\n );\n }\n\n const callbacks = method.callbacks ? Object.entries(method.callbacks) : null;\n if (callbacks && callbacks.length > 0) {\n const items = callbacks.map(([key]) => ({\n label: <code className=\"text-xs\">{key}</code>,\n value: key,\n }));\n\n callbacksNode = (\n <SelectTabs defaultValue={items[0].value}>\n <div className=\"flex justify-between gap-2 items-end mt-10\">\n {ctx.renderHeading(headingLevel, 'Callbacks', {\n className: 'my-0!',\n })}\n {callbacks.length > 1 ? (\n <SelectTabTrigger items={items} className=\"font-medium\" />\n ) : (\n <p className=\"text-fd-muted-foreground not-prose\">{items[0].label}</p>\n )}\n </div>\n {callbacks.map(([name, callback]) => (\n <SelectTab key={name} value={name}>\n <WebhookCallback callback={callback} ctx={ctx} headingLevel={headingLevel} />\n </SelectTab>\n ))}\n </SelectTabs>\n );\n }\n\n let { renderOperationLayout, renderWebhookLayout } = ctx.content ?? {};\n if (type === 'operation') {\n renderOperationLayout ??= (slots) => {\n return (\n <div className=\"flex flex-col gap-x-6 gap-y-4 @4xl:flex-row @4xl:items-start\">\n <div className=\"min-w-0 flex-1\">\n {slots.header}\n {slots.apiPlayground}\n {slots.description}\n {slots.authSchemes}\n {slots.paremeters}\n {slots.body}\n {slots.responses}\n {slots.callbacks}\n </div>\n <div className=\"@4xl:sticky @4xl:top-[calc(var(--fd-docs-row-1,2rem)+1rem)] @4xl:w-[400px]\">\n {slots.apiExample}\n </div>\n </div>\n );\n };\n\n const playgroundEnabled = ctx.playground?.enabled ?? true;\n const content = await renderOperationLayout(\n {\n header: headNode,\n description: descriptionNode,\n authSchemes: authNode,\n body: bodyNode,\n callbacks: callbacksNode,\n paremeters: parameterNode,\n responses: responseNode,\n apiPlayground: playgroundEnabled ? (\n <APIPlayground path={path} method={method} ctx={ctx} />\n ) : (\n <div className=\"flex flex-row items-center gap-2.5 p-3 rounded-xl border bg-fd-card text-fd-card-foreground not-prose\">\n <MethodLabel className=\"text-xs\">{method.method}</MethodLabel>\n <code className=\"flex-1 overflow-auto text-nowrap text-[0.8125rem] text-fd-muted-foreground\">\n {path}\n </code>\n </div>\n ),\n apiExample: <UsageTabs method={method} ctx={ctx} />,\n },\n ctx,\n method,\n );\n\n return (\n <UsageTabsProviderLazy\n defaultExampleId={method['x-exclusiveCodeSample'] ?? method['x-selectedCodeSample']}\n route={path}\n examples={getExampleRequests(path, method, ctx)}\n >\n {content}\n </UsageTabsProviderLazy>\n );\n } else {\n renderWebhookLayout ??= (slots) => (\n <div className=\"flex flex-col-reverse gap-x-6 gap-y-4 @4xl:flex-row @4xl:items-start\">\n <div className=\"min-w-0 flex-1\">\n {slots.header}\n {slots.description}\n {slots.authSchemes}\n {slots.paremeters}\n {slots.body}\n {slots.responses}\n {slots.callbacks}\n </div>\n <div className=\"@4xl:sticky @4xl:top-[calc(var(--fd-docs-row-1,2rem)+1rem)] @4xl:w-[400px]\">\n {slots.requests}\n </div>\n </div>\n );\n return renderWebhookLayout({\n header: headNode,\n description: descriptionNode,\n authSchemes: authNode,\n body: bodyNode,\n callbacks: callbacksNode,\n paremeters: parameterNode,\n responses: responseNode,\n requests: <RequestTabs path={path} operation={method} ctx={ctx} />,\n });\n }\n}\n\nasync function ResponseAccordion({\n status,\n operation,\n ctx,\n}: {\n status: string;\n operation: MethodInformation;\n ctx: RenderContext;\n}) {\n const response = operation.responses![status];\n const { generateTypeScriptSchema } = ctx;\n const contentTypes = response.content ? Object.entries(response.content) : [];\n let wrapper = (children: ReactNode) => children;\n let selectorNode: ReactNode = null;\n\n if (contentTypes.length > 0) {\n const items = contentTypes.map(([key]) => ({\n label: <code className=\"text-xs\">{key}</code>,\n value: key,\n }));\n\n selectorNode =\n items.length === 1 ? (\n <p className=\"text-fd-muted-foreground not-prose\">{items[0].label}</p>\n ) : (\n <SelectTabTrigger items={items} />\n );\n wrapper = (children) => <SelectTabs defaultValue={items[0].value}>{children}</SelectTabs>;\n }\n\n return wrapper(\n <AccordionItem value={status}>\n <AccordionHeader>\n <AccordionTrigger className=\"font-mono\">{status}</AccordionTrigger>\n {selectorNode}\n </AccordionHeader>\n <AccordionContent className=\"ps-4.5\">\n {response.description && (\n <div className=\"prose-no-margin mb-2\">{ctx.renderMarkdown(response.description)}</div>\n )}\n {contentTypes.map(async ([type, resType]) => {\n const schema = resType.schema;\n let ts: string | undefined;\n\n if (generateTypeScriptSchema) {\n ts = await generateTypeScriptSchema(operation, status);\n } else if (generateTypeScriptSchema === undefined && schema) {\n ts = await getTypescriptSchema(schema, ctx);\n }\n\n return (\n <SelectTab key={type} value={type} className=\"mb-2\">\n {ts && <CopyResponseTypeScript code={ts} />}\n {schema && (\n <div className=\"border px-3 py-2 rounded-lg\">\n <Schema\n client={{\n name: 'response',\n as: 'body',\n }}\n root={schema as ResolvedSchema}\n readOnly\n ctx={ctx}\n />\n </div>\n )}\n </SelectTab>\n );\n })}\n </AccordionContent>\n </AccordionItem>,\n );\n}\n\nfunction WebhookCallback({\n callback,\n ctx,\n headingLevel,\n}: {\n callback: NoReference<CallbackObject>;\n ctx: RenderContext;\n headingLevel: number;\n}) {\n const pathItems = Object.entries(callback);\n\n return (\n <Accordions type=\"single\" collapsible>\n {pathItems.map(([path, pathItem]) => {\n const pathNodes = methodKeys.map((method) => {\n const operation = pathItem[method];\n if (!operation) return null;\n\n return (\n <div key={method} className=\"border p-3 my-2 @container prose-no-margin rounded-lg\">\n <Operation\n type=\"webhook\"\n path={path}\n headingLevel={headingLevel + 1}\n method={createMethod(method, pathItem, operation)}\n ctx={ctx}\n />\n </div>\n );\n });\n\n return (\n <AccordionItem key={path} value={path}>\n <AccordionHeader>\n <AccordionTrigger className=\"font-mono\">{path}</AccordionTrigger>\n </AccordionHeader>\n <AccordionContent>{pathNodes}</AccordionContent>\n </AccordionItem>\n );\n })}\n </Accordions>\n );\n}\n\nfunction AuthScheme({\n scheme: schema,\n scopes,\n ctx,\n}: {\n scheme: SecuritySchemeObject;\n scopes: string[];\n ctx: RenderContext;\n}) {\n if (schema.type === 'http' || schema.type === 'oauth2') {\n return (\n <AuthProperty\n name=\"Authorization\"\n type={\n schema.type === 'http' && schema.scheme === 'basic' ? `Basic <token>` : 'Bearer <token>'\n }\n scopes={scopes}\n >\n {schema.description && ctx.renderMarkdown(schema.description)}\n <p>\n In: <code>header</code>\n </p>\n </AuthProperty>\n );\n }\n\n if (schema.type === 'apiKey') {\n return (\n <AuthProperty name={schema.name} type=\"<token>\" scopes={scopes}>\n {schema.description && ctx.renderMarkdown(schema.description)}\n <p>\n In: <code>{schema.in}</code>\n </p>\n </AuthProperty>\n );\n }\n\n if (schema.type === 'openIdConnect') {\n return (\n <AuthProperty name=\"OpenID Connect\" type=\"<token>\" scopes={scopes}>\n {schema.description && ctx.renderMarkdown(schema.description)}\n </AuthProperty>\n );\n }\n}\n\nfunction AuthProperty({\n name,\n type,\n scopes = [],\n className,\n ...props\n}: ComponentProps<'div'> & {\n name: string;\n type: string;\n scopes?: string[];\n}) {\n return (\n <div className={cn('text-sm border-t my-4 first:border-t-0', className)}>\n <div className=\"flex flex-wrap items-center gap-3 not-prose\">\n <span className=\"font-medium font-mono text-fd-primary\">{name}</span>\n <span className=\"text-sm font-mono text-fd-muted-foreground\">{type}</span>\n </div>\n <div className=\"prose-no-margin pt-2.5 empty:hidden\">\n {props.children}\n {scopes.length > 0 && (\n <p>\n Scope: <code>{scopes.join(', ')}</code>\n </p>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,18 +1,17 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import "../../utils/schema.js";
|
|
2
|
+
import { RawRequestData, RequestData } from "../../requests/types.js";
|
|
3
|
+
import "../../types.js";
|
|
4
|
+
import { ReactNode } from "react";
|
|
5
|
+
import "react/jsx-runtime";
|
|
6
|
+
|
|
7
|
+
//#region src/ui/operation/request-tabs.d.ts
|
|
8
|
+
interface ExampleRequestItem {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
data: RawRequestData;
|
|
13
|
+
encoded: RequestData;
|
|
11
14
|
}
|
|
12
|
-
|
|
13
|
-
export
|
|
14
|
-
path: string;
|
|
15
|
-
operation: NoReference<MethodInformation>;
|
|
16
|
-
ctx: RenderContext;
|
|
17
|
-
}): Promise<string | number | bigint | boolean | import("react/jsx-runtime").JSX.Element | Iterable<ReactNode> | null | undefined>;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { ExampleRequestItem };
|
|
18
17
|
//# sourceMappingURL=request-tabs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-tabs.d.ts","
|
|
1
|
+
{"version":3,"file":"request-tabs.d.ts","names":[],"sources":["../../../src/ui/operation/request-tabs.tsx"],"sourcesContent":[],"mappings":";;;;;;;UAiBiB,kBAAA;;;EAAA,WAAA,CAAA,EAAA,MAAA;QAIT;WACG"}
|
|
@@ -1,137 +1,157 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getPreferredType, pickExample
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
encoded: encodeRequestData(data, ctx.mediaAdapters, operation.parameters ?? []),
|
|
37
|
-
},
|
|
38
|
-
];
|
|
1
|
+
import { resolveRequestData } from "../../utils/url.js";
|
|
2
|
+
import { getPreferredType, pickExample } from "../../utils/schema.js";
|
|
3
|
+
import { MethodLabel } from "../components/method-label.js";
|
|
4
|
+
import { encodeRequestData } from "../../requests/media/encode.js";
|
|
5
|
+
import { AccordionContent, AccordionHeader, AccordionItem, AccordionTrigger, Accordions } from "../components/accordion.js";
|
|
6
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
import { Tabs, TabsContent, TabsList, TabsTrigger } from "fumadocs-ui/components/tabs";
|
|
8
|
+
import { sample } from "openapi-sampler";
|
|
9
|
+
|
|
10
|
+
//#region src/ui/operation/request-tabs.tsx
|
|
11
|
+
function getExampleRequests(path, operation, ctx) {
|
|
12
|
+
const media = operation.requestBody ? getPreferredType(operation.requestBody.content) : null;
|
|
13
|
+
const bodyOfType = media ? operation.requestBody?.content[media] : null;
|
|
14
|
+
if (bodyOfType?.examples) {
|
|
15
|
+
const result = [];
|
|
16
|
+
for (const [key, value] of Object.entries(bodyOfType.examples)) {
|
|
17
|
+
const data$1 = getRequestData(path, operation, key, ctx);
|
|
18
|
+
result.push({
|
|
19
|
+
id: key,
|
|
20
|
+
name: value.summary || key,
|
|
21
|
+
description: value.description,
|
|
22
|
+
data: data$1,
|
|
23
|
+
encoded: encodeRequestData(data$1, ctx.mediaAdapters, operation.parameters ?? [])
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
if (result.length > 0) return result;
|
|
27
|
+
}
|
|
28
|
+
const data = getRequestData(path, operation, null, ctx);
|
|
29
|
+
return [{
|
|
30
|
+
id: "_default",
|
|
31
|
+
name: "Default",
|
|
32
|
+
description: bodyOfType?.schema?.description,
|
|
33
|
+
data,
|
|
34
|
+
encoded: encodeRequestData(data, ctx.mediaAdapters, operation.parameters ?? [])
|
|
35
|
+
}];
|
|
39
36
|
}
|
|
40
37
|
function getRequestData(path, method, sampleKey, _ctx) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
result.body = bodyOfType.example;
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
result.body = sample((bodyOfType?.schema ?? {}), {
|
|
91
|
-
skipReadOnly: method.method !== 'GET',
|
|
92
|
-
skipWriteOnly: method.method === 'GET',
|
|
93
|
-
skipNonRequired: true,
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return result;
|
|
38
|
+
const result = {
|
|
39
|
+
path: {},
|
|
40
|
+
cookie: {},
|
|
41
|
+
header: {},
|
|
42
|
+
query: {},
|
|
43
|
+
method: method.method
|
|
44
|
+
};
|
|
45
|
+
for (const param of method.parameters ?? []) {
|
|
46
|
+
let value = pickExample(param);
|
|
47
|
+
if (value === void 0 && param.required) {
|
|
48
|
+
if (param.schema) value = sample(param.schema);
|
|
49
|
+
else if (param.content) {
|
|
50
|
+
const type = getPreferredType(param.content);
|
|
51
|
+
const content = type ? param.content[type] : void 0;
|
|
52
|
+
if (!content || !content.schema) throw new Error(`Cannot find "${param.name}" parameter info for media type "${type}" in ${path} ${method.method}`);
|
|
53
|
+
value = sample(content.schema);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
switch (param.in) {
|
|
57
|
+
case "cookie":
|
|
58
|
+
result.cookie[param.name] = value;
|
|
59
|
+
break;
|
|
60
|
+
case "header":
|
|
61
|
+
result.header[param.name] = value;
|
|
62
|
+
break;
|
|
63
|
+
case "query":
|
|
64
|
+
result.query[param.name] = value;
|
|
65
|
+
break;
|
|
66
|
+
default: result.path[param.name] = value;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (method.requestBody) {
|
|
70
|
+
const body = method.requestBody.content;
|
|
71
|
+
const type = getPreferredType(body);
|
|
72
|
+
if (!type) throw new Error(`Cannot find body schema for ${path} ${method.method}: missing media type`);
|
|
73
|
+
result.bodyMediaType = type;
|
|
74
|
+
const bodyOfType = body[type];
|
|
75
|
+
if (bodyOfType.examples && sampleKey) result.body = bodyOfType.examples[sampleKey].value;
|
|
76
|
+
else if (bodyOfType.example) result.body = bodyOfType.example;
|
|
77
|
+
else result.body = sample(bodyOfType?.schema ?? {}, {
|
|
78
|
+
skipReadOnly: method.method !== "GET",
|
|
79
|
+
skipWriteOnly: method.method === "GET",
|
|
80
|
+
skipNonRequired: true
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return result;
|
|
98
84
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
});
|
|
85
|
+
async function RequestTabs({ path, operation, ctx }) {
|
|
86
|
+
if (!operation.requestBody) return null;
|
|
87
|
+
const { renderRequestTabs = renderRequestTabsDefault } = ctx.content ?? {};
|
|
88
|
+
return renderRequestTabs(getExampleRequests(path, operation, ctx), {
|
|
89
|
+
...ctx,
|
|
90
|
+
route: path,
|
|
91
|
+
operation
|
|
92
|
+
});
|
|
108
93
|
}
|
|
109
94
|
function renderRequestTabsDefault(items, ctx) {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
95
|
+
function renderItem(item) {
|
|
96
|
+
const requestData = item.data;
|
|
97
|
+
const displayNames = {
|
|
98
|
+
body: /* @__PURE__ */ jsxs(Fragment, { children: ["Body", /* @__PURE__ */ jsx("code", {
|
|
99
|
+
className: "text-xs text-fd-muted-foreground ms-auto",
|
|
100
|
+
children: requestData.bodyMediaType
|
|
101
|
+
})] }),
|
|
102
|
+
cookie: "Cookie",
|
|
103
|
+
header: "Header",
|
|
104
|
+
query: "Query Parameters",
|
|
105
|
+
path: "Path Parameters"
|
|
106
|
+
};
|
|
107
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
108
|
+
item.description && ctx.renderMarkdown(item.description),
|
|
109
|
+
/* @__PURE__ */ jsxs("div", {
|
|
110
|
+
className: "flex flex-row gap-2 items-center justify-between",
|
|
111
|
+
children: [/* @__PURE__ */ jsx(MethodLabel, { children: requestData.method }), /* @__PURE__ */ jsx("code", { children: resolveRequestData(ctx.route, item.encoded) })]
|
|
112
|
+
}),
|
|
113
|
+
/* @__PURE__ */ jsx(Accordions, {
|
|
114
|
+
type: "multiple",
|
|
115
|
+
className: "mt-2",
|
|
116
|
+
children: Object.entries(displayNames).map(([k, v]) => {
|
|
117
|
+
const data = requestData[k];
|
|
118
|
+
if (!data || Object.keys(data).length === 0) return;
|
|
119
|
+
return /* @__PURE__ */ jsxs(AccordionItem, {
|
|
120
|
+
value: k,
|
|
121
|
+
children: [/* @__PURE__ */ jsx(AccordionHeader, { children: /* @__PURE__ */ jsx(AccordionTrigger, { children: v }) }), /* @__PURE__ */ jsx(AccordionContent, {
|
|
122
|
+
className: "prose-no-margin",
|
|
123
|
+
children: ctx.renderCodeBlock("json", JSON.stringify(data, null, 2))
|
|
124
|
+
})]
|
|
125
|
+
}, k);
|
|
126
|
+
})
|
|
127
|
+
})
|
|
128
|
+
] });
|
|
129
|
+
}
|
|
130
|
+
let children;
|
|
131
|
+
if (items.length > 1) children = /* @__PURE__ */ jsxs(Tabs, {
|
|
132
|
+
defaultValue: items[0].id,
|
|
133
|
+
children: [/* @__PURE__ */ jsx(TabsList, { children: items.map((item) => /* @__PURE__ */ jsx(TabsTrigger, {
|
|
134
|
+
value: item.id,
|
|
135
|
+
children: item.name
|
|
136
|
+
}, item.id)) }), items.map((item) => /* @__PURE__ */ jsx(TabsContent, {
|
|
137
|
+
value: item.id,
|
|
138
|
+
children: renderItem(item)
|
|
139
|
+
}, item.id))]
|
|
140
|
+
});
|
|
141
|
+
else if (items.length === 1) children = renderItem(items[0]);
|
|
142
|
+
else children = /* @__PURE__ */ jsx("p", {
|
|
143
|
+
className: "text-fd-muted-foreground text-xs",
|
|
144
|
+
children: "Empty"
|
|
145
|
+
});
|
|
146
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
147
|
+
className: "p-3 rounded-xl border prose-no-margin bg-fd-card text-fd-card-foreground shadow-md",
|
|
148
|
+
children: [/* @__PURE__ */ jsx("p", {
|
|
149
|
+
className: "font-semibold border-b pb-2",
|
|
150
|
+
children: "Example Requests"
|
|
151
|
+
}), children]
|
|
152
|
+
});
|
|
137
153
|
}
|
|
154
|
+
|
|
155
|
+
//#endregion
|
|
156
|
+
export { RequestTabs, getExampleRequests };
|
|
157
|
+
//# sourceMappingURL=request-tabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-tabs.js","names":["result: ExampleRequestItem[]","data","result: RawRequestData","displayNames: Partial<Record<keyof RawRequestData, ReactNode>>","children: ReactNode"],"sources":["../../../src/ui/operation/request-tabs.tsx"],"sourcesContent":["import type { MethodInformation, RenderContext } from '@/types';\nimport { getPreferredType, type NoReference, pickExample } from '@/utils/schema';\nimport {\n AccordionContent,\n AccordionHeader,\n AccordionItem,\n Accordions,\n AccordionTrigger,\n} from '@/ui/components/accordion';\nimport { sample } from 'openapi-sampler';\nimport type { ReactNode } from 'react';\nimport type { RawRequestData, RequestData } from '@/requests/types';\nimport { encodeRequestData } from '@/requests/media/encode';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from 'fumadocs-ui/components/tabs';\nimport { resolveRequestData } from '@/utils/url';\nimport { MethodLabel } from '../components/method-label';\n\nexport interface ExampleRequestItem {\n id: string;\n name: string;\n description?: string;\n data: RawRequestData;\n encoded: RequestData;\n}\n\nexport function getExampleRequests(\n path: string,\n operation: NoReference<MethodInformation>,\n ctx: RenderContext,\n): ExampleRequestItem[] {\n const media = operation.requestBody ? getPreferredType(operation.requestBody.content) : null;\n const bodyOfType = media ? operation.requestBody?.content[media] : null;\n\n if (bodyOfType?.examples) {\n const result: ExampleRequestItem[] = [];\n\n for (const [key, value] of Object.entries(bodyOfType.examples)) {\n const data = getRequestData(path, operation, key, ctx);\n\n result.push({\n id: key,\n name: value.summary || key,\n description: value.description,\n data,\n encoded: encodeRequestData(data, ctx.mediaAdapters, operation.parameters ?? []),\n });\n }\n\n if (result.length > 0) return result;\n }\n\n const data = getRequestData(path, operation, null, ctx);\n return [\n {\n id: '_default',\n name: 'Default',\n description: bodyOfType?.schema?.description,\n data,\n encoded: encodeRequestData(data, ctx.mediaAdapters, operation.parameters ?? []),\n },\n ];\n}\n\nfunction getRequestData(\n path: string,\n method: NoReference<MethodInformation>,\n sampleKey: string | null,\n _ctx: RenderContext,\n): RawRequestData {\n const result: RawRequestData = {\n path: {},\n cookie: {},\n header: {},\n query: {},\n method: method.method,\n };\n\n for (const param of method.parameters ?? []) {\n let value = pickExample(param);\n\n if (value === undefined && param.required) {\n if (param.schema) {\n value = sample(param.schema as object);\n } else if (param.content) {\n const type = getPreferredType(param.content);\n const content = type ? param.content[type] : undefined;\n if (!content || !content.schema)\n throw new Error(\n `Cannot find \"${param.name}\" parameter info for media type \"${type}\" in ${path} ${method.method}`,\n );\n\n value = sample(content.schema as object);\n }\n }\n\n switch (param.in) {\n case 'cookie':\n result.cookie[param.name] = value;\n break;\n case 'header':\n result.header[param.name] = value;\n break;\n case 'query':\n result.query[param.name] = value;\n break;\n default:\n result.path[param.name] = value;\n }\n }\n\n if (method.requestBody) {\n const body = method.requestBody.content;\n const type = getPreferredType(body);\n if (!type)\n throw new Error(`Cannot find body schema for ${path} ${method.method}: missing media type`);\n result.bodyMediaType = type as RawRequestData['bodyMediaType'];\n const bodyOfType = body[type];\n\n if (bodyOfType.examples && sampleKey) {\n result.body = bodyOfType.examples[sampleKey].value;\n } else if (bodyOfType.example) {\n result.body = bodyOfType.example;\n } else {\n result.body = sample((bodyOfType?.schema ?? {}) as object, {\n skipReadOnly: method.method !== 'GET',\n skipWriteOnly: method.method === 'GET',\n skipNonRequired: true,\n });\n }\n }\n\n return result;\n}\n\nexport async function RequestTabs({\n path,\n operation,\n ctx,\n}: {\n path: string;\n operation: NoReference<MethodInformation>;\n ctx: RenderContext;\n}) {\n if (!operation.requestBody) return null;\n const { renderRequestTabs = renderRequestTabsDefault } = ctx.content ?? {};\n\n return renderRequestTabs(getExampleRequests(path, operation, ctx), {\n ...ctx,\n route: path,\n operation,\n });\n}\n\nfunction renderRequestTabsDefault(\n items: ExampleRequestItem[],\n ctx: RenderContext & {\n route: string;\n operation: NoReference<MethodInformation>;\n },\n) {\n function renderItem(item: ExampleRequestItem) {\n const requestData = item.data;\n const displayNames: Partial<Record<keyof RawRequestData, ReactNode>> = {\n body: (\n <>\n Body\n <code className=\"text-xs text-fd-muted-foreground ms-auto\">\n {requestData.bodyMediaType}\n </code>\n </>\n ),\n cookie: 'Cookie',\n header: 'Header',\n query: 'Query Parameters',\n path: 'Path Parameters',\n };\n\n return (\n <>\n {item.description && ctx.renderMarkdown(item.description)}\n <div className=\"flex flex-row gap-2 items-center justify-between\">\n <MethodLabel>{requestData.method}</MethodLabel>\n <code>{resolveRequestData(ctx.route, item.encoded)}</code>\n </div>\n\n <Accordions type=\"multiple\" className=\"mt-2\">\n {Object.entries(displayNames).map(([k, v]) => {\n const data = requestData[k as keyof RawRequestData];\n if (!data || Object.keys(data).length === 0) return;\n\n return (\n <AccordionItem key={k} value={k}>\n <AccordionHeader>\n <AccordionTrigger>{v}</AccordionTrigger>\n </AccordionHeader>\n <AccordionContent className=\"prose-no-margin\">\n {ctx.renderCodeBlock('json', JSON.stringify(data, null, 2))}\n </AccordionContent>\n </AccordionItem>\n );\n })}\n </Accordions>\n </>\n );\n }\n\n let children: ReactNode;\n if (items.length > 1) {\n children = (\n <Tabs defaultValue={items[0].id}>\n <TabsList>\n {items.map((item) => (\n <TabsTrigger key={item.id} value={item.id}>\n {item.name}\n </TabsTrigger>\n ))}\n </TabsList>\n {items.map((item) => (\n <TabsContent key={item.id} value={item.id}>\n {renderItem(item)}\n </TabsContent>\n ))}\n </Tabs>\n );\n } else if (items.length === 1) {\n children = renderItem(items[0]);\n } else {\n children = <p className=\"text-fd-muted-foreground text-xs\">Empty</p>;\n }\n\n return (\n <div className=\"p-3 rounded-xl border prose-no-margin bg-fd-card text-fd-card-foreground shadow-md\">\n <p className=\"font-semibold border-b pb-2\">Example Requests</p>\n {children}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,32 +1,31 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
import { NoReference } from "../../utils/schema.js";
|
|
2
|
+
import { ResponseObject } from "../../types.js";
|
|
3
|
+
import { ReactNode } from "react";
|
|
4
|
+
|
|
5
|
+
//#region src/ui/operation/response-tabs.d.ts
|
|
6
|
+
interface ResponseTab {
|
|
7
|
+
/**
|
|
8
|
+
* HTTP response code
|
|
9
|
+
*/
|
|
10
|
+
code: string;
|
|
11
|
+
response: NoReference<ResponseObject>;
|
|
12
|
+
/**
|
|
13
|
+
* media type of response
|
|
14
|
+
*/
|
|
15
|
+
mediaType: string | null;
|
|
16
|
+
examples?: ResponseExample[];
|
|
15
17
|
}
|
|
16
18
|
interface ResponseExample {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
/**
|
|
20
|
+
* generated/defined example data
|
|
21
|
+
*/
|
|
22
|
+
sample: unknown;
|
|
23
|
+
label: string;
|
|
24
|
+
/**
|
|
25
|
+
* description (in Markdown)
|
|
26
|
+
*/
|
|
27
|
+
description?: string;
|
|
26
28
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
ctx: RenderContext;
|
|
30
|
-
}): ReactNode | Promise<ReactNode>;
|
|
31
|
-
export {};
|
|
29
|
+
//#endregion
|
|
30
|
+
export { ResponseTab };
|
|
32
31
|
//# sourceMappingURL=response-tabs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-tabs.d.ts","
|
|
1
|
+
{"version":3,"file":"response-tabs.d.ts","names":[],"sources":["../../../src/ui/operation/response-tabs.tsx"],"sourcesContent":[],"mappings":";;;;;UAaiB,WAAA;;AAAjB;;EAMY,IAAA,EAAA,MAAA;EAMC,QAAA,EAND,WAMC,CANW,cAMX,CAAA;EAAe;AAC3B;;;aADY;;UAGH,eAAA"}
|
|
@@ -1,59 +1,76 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { Tab, Tabs } from
|
|
5
|
-
import { sample } from
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
1
|
+
import { getPreferredType } from "../../utils/schema.js";
|
|
2
|
+
import { AccordionContent, AccordionHeader, AccordionItem, AccordionTrigger, Accordions } from "../components/accordion.js";
|
|
3
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
import { Tab, Tabs } from "fumadocs-ui/components/tabs";
|
|
5
|
+
import { sample } from "openapi-sampler";
|
|
6
|
+
|
|
7
|
+
//#region src/ui/operation/response-tabs.tsx
|
|
8
|
+
function ResponseTabs({ operation, ctx }) {
|
|
9
|
+
if (!operation.responses) return null;
|
|
10
|
+
const tabs = [];
|
|
11
|
+
for (const [code, response] of Object.entries(operation.responses)) {
|
|
12
|
+
const media = response.content ? getPreferredType(response.content) : null;
|
|
13
|
+
const responseOfType = media ? response.content?.[media] : null;
|
|
14
|
+
const tab = {
|
|
15
|
+
code,
|
|
16
|
+
response,
|
|
17
|
+
mediaType: media
|
|
18
|
+
};
|
|
19
|
+
if (responseOfType?.examples) {
|
|
20
|
+
tab.examples ??= [];
|
|
21
|
+
for (const [key, sample$1] of Object.entries(responseOfType.examples)) {
|
|
22
|
+
const title = sample$1?.summary || `Example ${key}`;
|
|
23
|
+
tab.examples.push({
|
|
24
|
+
label: title,
|
|
25
|
+
sample: sample$1.value,
|
|
26
|
+
description: sample$1?.description
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
} else if (responseOfType?.example || responseOfType?.schema) {
|
|
30
|
+
tab.examples ??= [];
|
|
31
|
+
tab.examples.push({
|
|
32
|
+
label: "Example",
|
|
33
|
+
sample: responseOfType.example ?? sample(responseOfType.schema)
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
tabs.push(tab);
|
|
37
|
+
}
|
|
38
|
+
const { renderResponseTabs = renderResponseTabsDefault } = ctx.content ?? {};
|
|
39
|
+
return renderResponseTabs(tabs, ctx);
|
|
40
40
|
}
|
|
41
41
|
function renderResponseTabsDefault(tabs, ctx) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
42
|
+
function renderExampleContent(example) {
|
|
43
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [example.description && ctx.renderMarkdown(example.description), ctx.renderCodeBlock("json", JSON.stringify(example.sample, null, 2))] });
|
|
44
|
+
}
|
|
45
|
+
async function renderResponse(tab) {
|
|
46
|
+
const { examples = [] } = tab;
|
|
47
|
+
let slot = "Empty";
|
|
48
|
+
if (examples.length > 1) slot = /* @__PURE__ */ jsx(Accordions, {
|
|
49
|
+
type: "single",
|
|
50
|
+
className: "pt-2",
|
|
51
|
+
defaultValue: examples[0].label,
|
|
52
|
+
children: examples.map((example, i) => /* @__PURE__ */ jsxs(AccordionItem, {
|
|
53
|
+
value: example.label,
|
|
54
|
+
children: [/* @__PURE__ */ jsx(AccordionHeader, { children: /* @__PURE__ */ jsx(AccordionTrigger, { children: example.label }) }), /* @__PURE__ */ jsx(AccordionContent, {
|
|
55
|
+
className: "prose-no-margin",
|
|
56
|
+
children: renderExampleContent(example)
|
|
57
|
+
})]
|
|
58
|
+
}, i))
|
|
59
|
+
});
|
|
60
|
+
else if (examples.length === 1) slot = renderExampleContent(examples[0]);
|
|
61
|
+
return /* @__PURE__ */ jsx(Tab, {
|
|
62
|
+
value: tab.code,
|
|
63
|
+
children: slot
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
if (tabs.length === 0) return null;
|
|
67
|
+
return /* @__PURE__ */ jsx(Tabs, {
|
|
68
|
+
groupId: "fumadocs_openapi_responses",
|
|
69
|
+
items: tabs.map((tab) => tab.code),
|
|
70
|
+
children: tabs.map(renderResponse)
|
|
71
|
+
});
|
|
59
72
|
}
|
|
73
|
+
|
|
74
|
+
//#endregion
|
|
75
|
+
export { ResponseTabs };
|
|
76
|
+
//# sourceMappingURL=response-tabs.js.map
|