fumadocs-openapi 10.2.4 → 10.2.5
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.js.map +1 -1
- package/dist/playground/client.d.ts +11 -12
- package/dist/playground/client.d.ts.map +1 -1
- package/dist/playground/client.js +70 -74
- package/dist/playground/client.js.map +1 -1
- package/dist/playground/components/inputs.js +198 -187
- package/dist/playground/components/inputs.js.map +1 -1
- package/dist/playground/components/oauth-dialog.js +2 -2
- package/dist/playground/components/server-select.js +24 -25
- package/dist/playground/components/server-select.js.map +1 -1
- package/dist/playground/fetcher.js.map +1 -1
- package/dist/playground/index.js.map +1 -1
- package/dist/playground/schema.d.ts +1 -0
- package/dist/playground/schema.d.ts.map +1 -1
- package/dist/playground/schema.js +10 -12
- package/dist/playground/schema.js.map +1 -1
- package/dist/playground/status-info.js.map +1 -1
- package/dist/requests/generators/csharp.js.map +1 -1
- package/dist/requests/generators/curl.js.map +1 -1
- package/dist/requests/generators/go.js.map +1 -1
- package/dist/requests/generators/index.js.map +1 -1
- package/dist/requests/generators/java.js.map +1 -1
- package/dist/requests/generators/javascript.js.map +1 -1
- package/dist/requests/generators/python.js.map +1 -1
- package/dist/requests/media/adapter.js.map +1 -1
- package/dist/requests/media/encode.js.map +1 -1
- package/dist/requests/media/resolve-adapter.js +4 -0
- package/dist/requests/media/resolve-adapter.js.map +1 -1
- package/dist/server/create.js.map +1 -1
- package/dist/server/proxy.js.map +1 -1
- package/dist/server/source-api.js.map +1 -1
- package/dist/ui/api-page.js.map +1 -1
- package/dist/ui/contexts/api.js.map +1 -1
- package/dist/ui/operation/index.js.map +1 -1
- package/dist/ui/operation/request-tabs.js.map +1 -1
- package/dist/ui/operation/response-tabs.js.map +1 -1
- package/dist/ui/operation/usage-tabs/client.js.map +1 -1
- package/dist/ui/operation/usage-tabs/index.js.map +1 -1
- package/dist/ui/schema/client.d.ts.map +1 -1
- package/dist/ui/schema/client.js +120 -114
- package/dist/ui/schema/client.js.map +1 -1
- package/dist/ui/schema/index.js +1 -1
- package/dist/ui/schema/index.js.map +1 -1
- package/dist/utils/id-to-title.js.map +1 -1
- package/dist/utils/merge-schema.js.map +1 -1
- package/dist/utils/pages/builder.js.map +1 -1
- package/dist/utils/pages/preset-auto.js.map +1 -1
- package/dist/utils/pages/to-static-data.js.map +1 -1
- package/dist/utils/pages/to-text.js.map +1 -1
- package/package.json +13 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","names":["schemas
|
|
1
|
+
{"version":3,"file":"create.js","names":["schemas"],"sources":["../../src/server/create.tsx"],"sourcesContent":["import { createProxy } from '@/server/proxy';\nimport type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types';\nimport { processDocument, type ProcessedDocument } from '@/utils/process-document';\nimport type { CodeUsageGenerator } from '@/ui/operation/usage-tabs';\n\n/**\n * schema id -> file path, URL, or downloaded schema object\n */\ntype SchemaMap = Record<string, string | OpenAPIV3_1.Document | OpenAPIV3.Document>;\ntype ProcessedSchemaMap = Record<string, ProcessedDocument>;\n\nexport interface OpenAPIOptions {\n /**\n * Schema files, can be:\n * - URL\n * - file path\n * - a function returning records of downloaded schemas.\n */\n input?: string[] | (() => SchemaMap | Promise<SchemaMap>);\n\n disableCache?: boolean;\n\n /**\n * The url of proxy to avoid CORS issues\n */\n proxyUrl?: string;\n}\n\nexport interface OpenAPIServer {\n createProxy: typeof createProxy;\n getSchemas: () => Promise<ProcessedSchemaMap>;\n getSchema: (document: string) => Promise<ProcessedDocument>;\n readonly options: OpenAPIOptions;\n}\n\nexport function createOpenAPI(options: OpenAPIOptions = {}): OpenAPIServer {\n const { input = [], disableCache = false } = options;\n let schemas: Promise<ProcessedSchemaMap> | undefined;\n\n async function getSchemas() {\n const out: ProcessedSchemaMap = {};\n\n if (Array.isArray(input)) {\n await Promise.all(\n input.map(async (item) => {\n out[item] = await processDocument(item);\n }),\n );\n } else {\n await Promise.all(\n Object.entries(await input()).map(async ([k, v]) => {\n out[k] = await processDocument(v);\n }),\n );\n }\n\n return out;\n }\n\n return {\n options,\n createProxy,\n async getSchema(document) {\n const schemas = await getSchemas();\n if (document in schemas) return schemas[document];\n\n console.warn(\n `[Fumadocs OpenAPI] the document \"${document}\" is not listed in the input array, this may not be expected.`,\n );\n // do not cache unlisted documents\n return processDocument(document);\n },\n async getSchemas() {\n if (disableCache) return getSchemas();\n\n return (schemas ??= getSchemas());\n },\n };\n}\n\nexport function createCodeSample<T>(options: Partial<CodeUsageGenerator<T>>): CodeUsageGenerator {\n const { lang = 'unknown', id = lang, ...rest } = options as Partial<CodeUsageGenerator>;\n\n return { id, lang, ...rest };\n}\n"],"mappings":";;;;AAmCA,SAAgB,cAAc,UAA0B,EAAE,EAAiB;CACzE,MAAM,EAAE,QAAQ,EAAE,EAAE,eAAe,UAAU;CAC7C,IAAI;CAEJ,eAAe,aAAa;EAC1B,MAAM,MAA0B,EAAE;AAElC,MAAI,MAAM,QAAQ,MAAM,CACtB,OAAM,QAAQ,IACZ,MAAM,IAAI,OAAO,SAAS;AACxB,OAAI,QAAQ,MAAM,gBAAgB,KAAK;IACvC,CACH;MAED,OAAM,QAAQ,IACZ,OAAO,QAAQ,MAAM,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,OAAO;AAClD,OAAI,KAAK,MAAM,gBAAgB,EAAE;IACjC,CACH;AAGH,SAAO;;AAGT,QAAO;EACL;EACA;EACA,MAAM,UAAU,UAAU;GACxB,MAAMA,YAAU,MAAM,YAAY;AAClC,OAAI,YAAYA,UAAS,QAAOA,UAAQ;AAExC,WAAQ,KACN,oCAAoC,SAAS,+DAC9C;AAED,UAAO,gBAAgB,SAAS;;EAElC,MAAM,aAAa;AACjB,OAAI,aAAc,QAAO,YAAY;AAErC,UAAQ,YAAY,YAAY;;EAEnC;;AAGH,SAAgB,iBAAoB,SAA6D;CAC/F,MAAM,EAAE,OAAO,WAAW,KAAK,MAAM,GAAG,SAAS;AAEjD,QAAO;EAAE;EAAI;EAAM,GAAG;EAAM"}
|
package/dist/server/proxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","names":[
|
|
1
|
+
{"version":3,"file":"proxy.js","names":[],"sources":["../../src/server/proxy.ts"],"sourcesContent":["const keys = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD'] as const;\n\ntype Proxy = {\n [K in (typeof keys)[number]]: (req: Request) => Promise<Response>;\n};\n\ninterface CreateProxyOptions {\n /**\n * Filter by prefixes of request url\n *\n * @deprecated Use `allowedOrigins` for filtering origins, or `filterRequest` for more detailed rules.\n */\n allowedUrls?: string[];\n\n /**\n * List of allowed origins to proxy to.\n */\n allowedOrigins?: string[];\n\n /**\n * Determine if the proxied request is allowed.\n *\n * @returns true if allowed, otherwise forbidden.\n */\n filterRequest?: (request: Request) => boolean;\n\n /**\n * Override proxied request/response with yours\n */\n overrides?: {\n request?: (request: Request) => Request;\n response?: (response: Response) => Response;\n };\n}\n\nexport function createProxy(options: CreateProxyOptions = {}): Proxy {\n const {\n allowedOrigins,\n allowedUrls,\n filterRequest = (req) => {\n return !allowedUrls || allowedUrls.some((item) => req.url.startsWith(item));\n },\n overrides,\n } = options;\n const handlers: Partial<Proxy> = {};\n\n async function handler(req: Request): Promise<Response> {\n const searchParams = new URL(req.url).searchParams;\n const url = searchParams.get('url');\n\n if (!url)\n return Response.json('[Proxy] A `url` query parameter is required for proxy url', {\n status: 400,\n });\n\n const parsedUrl = URL.parse(url);\n if (!parsedUrl)\n return Response.json('[Proxy] Invalid `url` parameter value.', {\n status: 400,\n });\n\n if (allowedOrigins && !allowedOrigins.includes(parsedUrl.origin)) {\n return Response.json(`[Proxy] The origin \"${parsedUrl.origin}\" is not allowed.`, {\n status: 400,\n });\n }\n\n const contentLength = req.headers.get('content-length');\n const hasBody = contentLength && parseInt(contentLength) > 0;\n\n let proxied = new Request(parsedUrl, {\n method: req.method,\n cache: 'no-cache',\n headers: req.headers,\n body:\n hasBody && ['POST', 'PUT', 'PATCH', 'DELETE'].includes(req.method.toUpperCase())\n ? await req.arrayBuffer()\n : undefined,\n });\n\n if (overrides?.request) {\n proxied = overrides.request(proxied);\n }\n\n if (!filterRequest(proxied)) {\n return Response.json('[Proxy] The proxied request is not allowed', {\n status: 403,\n });\n }\n\n proxied.headers.forEach((_value, originalKey) => {\n const key = originalKey.toLowerCase();\n\n if (key === 'origin') {\n proxied.headers.delete(originalKey);\n }\n });\n\n let res = await fetch(proxied).catch((e) => new Error(e.toString()));\n if (res instanceof Error) {\n return Response.json(`[Proxy] Failed to proxy request: ${res.message}`, {\n status: 500,\n });\n }\n\n if (overrides?.response) {\n res = overrides.response(res);\n }\n\n const headers = new Headers(res.headers);\n headers.forEach((_value, originalKey) => {\n const key = originalKey.toLowerCase();\n\n if (key.startsWith('access-control-')) {\n headers.delete(originalKey);\n }\n });\n headers.set('X-Forwarded-Host', res.url);\n\n return new Response(res.body, {\n status: res.status,\n statusText: res.statusText,\n headers,\n });\n }\n\n for (const key of keys) {\n handlers[key] = handler;\n }\n\n return handlers as Proxy;\n}\n"],"mappings":";AAAA,MAAM,OAAO;CAAC;CAAO;CAAQ;CAAO;CAAU;CAAS;CAAO;AAmC9D,SAAgB,YAAY,UAA8B,EAAE,EAAS;CACnE,MAAM,EACJ,gBACA,aACA,iBAAiB,QAAQ;AACvB,SAAO,CAAC,eAAe,YAAY,MAAM,SAAS,IAAI,IAAI,WAAW,KAAK,CAAC;IAE7E,cACE;CACJ,MAAM,WAA2B,EAAE;CAEnC,eAAe,QAAQ,KAAiC;EAEtD,MAAM,MADe,IAAI,IAAI,IAAI,IAAI,CAAC,aACb,IAAI,MAAM;AAEnC,MAAI,CAAC,IACH,QAAO,SAAS,KAAK,6DAA6D,EAChF,QAAQ,KACT,CAAC;EAEJ,MAAM,YAAY,IAAI,MAAM,IAAI;AAChC,MAAI,CAAC,UACH,QAAO,SAAS,KAAK,0CAA0C,EAC7D,QAAQ,KACT,CAAC;AAEJ,MAAI,kBAAkB,CAAC,eAAe,SAAS,UAAU,OAAO,CAC9D,QAAO,SAAS,KAAK,uBAAuB,UAAU,OAAO,oBAAoB,EAC/E,QAAQ,KACT,CAAC;EAGJ,MAAM,gBAAgB,IAAI,QAAQ,IAAI,iBAAiB;EACvD,MAAM,UAAU,iBAAiB,SAAS,cAAc,GAAG;EAE3D,IAAI,UAAU,IAAI,QAAQ,WAAW;GACnC,QAAQ,IAAI;GACZ,OAAO;GACP,SAAS,IAAI;GACb,MACE,WAAW;IAAC;IAAQ;IAAO;IAAS;IAAS,CAAC,SAAS,IAAI,OAAO,aAAa,CAAC,GAC5E,MAAM,IAAI,aAAa,GACvB;GACP,CAAC;AAEF,MAAI,WAAW,QACb,WAAU,UAAU,QAAQ,QAAQ;AAGtC,MAAI,CAAC,cAAc,QAAQ,CACzB,QAAO,SAAS,KAAK,8CAA8C,EACjE,QAAQ,KACT,CAAC;AAGJ,UAAQ,QAAQ,SAAS,QAAQ,gBAAgB;AAG/C,OAFY,YAAY,aAAa,KAEzB,SACV,SAAQ,QAAQ,OAAO,YAAY;IAErC;EAEF,IAAI,MAAM,MAAM,MAAM,QAAQ,CAAC,OAAO,MAAM,IAAI,MAAM,EAAE,UAAU,CAAC,CAAC;AACpE,MAAI,eAAe,MACjB,QAAO,SAAS,KAAK,oCAAoC,IAAI,WAAW,EACtE,QAAQ,KACT,CAAC;AAGJ,MAAI,WAAW,SACb,OAAM,UAAU,SAAS,IAAI;EAG/B,MAAM,UAAU,IAAI,QAAQ,IAAI,QAAQ;AACxC,UAAQ,SAAS,QAAQ,gBAAgB;AAGvC,OAFY,YAAY,aAAa,CAE7B,WAAW,kBAAkB,CACnC,SAAQ,OAAO,YAAY;IAE7B;AACF,UAAQ,IAAI,oBAAoB,IAAI,IAAI;AAExC,SAAO,IAAI,SAAS,IAAI,MAAM;GAC5B,QAAQ,IAAI;GACZ,YAAY,IAAI;GAChB;GACD,CAAC;;AAGJ,MAAK,MAAM,OAAO,KAChB,UAAS,OAAO;AAGlB,QAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-api.js","names":[
|
|
1
|
+
{"version":3,"file":"source-api.js","names":[],"sources":["../../src/server/source-api.tsx"],"sourcesContent":["import { MethodLabel } from '@/ui/components/method-label';\nimport type {\n LoaderPlugin,\n PageData,\n PageTreeTransformer,\n Source,\n VirtualFile,\n} from 'fumadocs-core/source';\nimport type { OpenAPIServer } from '@/server/create';\nimport type { SchemaToPagesOptions } from '@/utils/pages/preset-auto';\nimport type { ApiPageProps } from '@/ui/api-page';\nimport type { StructuredData } from 'fumadocs-core/mdx-plugins';\nimport type { TOCItemType } from 'fumadocs-core/toc';\nimport type { ProcessedDocument } from '@/utils/process-document';\n\ndeclare module 'fumadocs-core/source' {\n export interface PageData {\n /**\n * Added by Fumadocs OpenAPI\n */\n _openapi?: InternalOpenAPIMeta;\n }\n}\n\nexport interface InternalOpenAPIMeta {\n method?: string;\n webhook?: boolean;\n}\n\n/**\n * Fumadocs Source API integration, pass this to `plugins` array in `loader()`.\n */\nexport function openapiPlugin(): LoaderPlugin {\n return {\n name: 'fumadocs:openapi',\n enforce: 'pre',\n transformPageTree: {\n file(node, filePath) {\n if (!filePath) return node;\n const file = this.storage.read(filePath);\n if (!file || file.format !== 'page') return node;\n\n const openApiData = file.data._openapi;\n if (!openApiData || typeof openApiData !== 'object') return node;\n\n if (openApiData.webhook) {\n node.name = (\n <>\n {node.name}{' '}\n <span className=\"ms-auto border border-current px-1 rounded-lg text-xs text-nowrap font-mono\">\n Webhook\n </span>\n </>\n );\n } else if (openApiData.method) {\n node.name = (\n <>\n {node.name}{' '}\n <MethodLabel className=\"ms-auto text-xs text-nowrap\">\n {openApiData.method}\n </MethodLabel>\n </>\n );\n }\n\n return node;\n },\n },\n };\n}\n\ninterface OpenAPIPageData extends PageData {\n getAPIPageProps: () => ApiPageProps;\n getSchema: () => { id: string } & ProcessedDocument;\n structuredData: StructuredData;\n toc: TOCItemType[];\n}\n\n/**\n * Generate virtual pages for Fumadocs Source API\n */\nexport async function openapiSource(\n server: OpenAPIServer,\n options: SchemaToPagesOptions & {\n baseDir?: string;\n } = {},\n): Promise<\n Source<{\n metaData: never;\n pageData: OpenAPIPageData;\n }>\n> {\n const { baseDir = '' } = options;\n const { createAutoPreset } = await import('@/utils/pages/preset-auto');\n const { fromServer } = await import('@/utils/pages/builder');\n const { toBody } = await import('@/utils/pages/to-body');\n const { toStaticData } = await import('@/utils/pages/to-static-data');\n const files: VirtualFile<{\n pageData: OpenAPIPageData;\n metaData: never;\n }>[] = [];\n\n const entries = await fromServer(server, createAutoPreset(options));\n for (const [schemaId, list] of Object.entries(entries)) {\n const processed = await server.getSchema(schemaId);\n for (const entry of list) {\n const props = toBody(entry);\n props.showDescription ??= true;\n\n files.push({\n type: 'page',\n path: `${baseDir}/${entry.path}`,\n data: {\n ...entry.info,\n getAPIPageProps() {\n return props;\n },\n getSchema() {\n return {\n id: schemaId,\n ...processed,\n };\n },\n ...toStaticData(props, processed.dereferenced),\n _openapi: {\n method:\n entry.type === 'operation' || entry.type === 'webhook'\n ? entry.item.method\n : undefined,\n webhook: entry.type === 'webhook',\n },\n },\n });\n }\n }\n\n return {\n files,\n };\n}\n\n/**\n * @deprecated use `openapiPlugin()`\n */\nexport function transformerOpenAPI(): PageTreeTransformer {\n return openapiPlugin().transformPageTree!;\n}\n"],"mappings":";;;;;;;AAgCA,SAAgB,gBAA8B;AAC5C,QAAO;EACL,MAAM;EACN,SAAS;EACT,mBAAmB,EACjB,KAAK,MAAM,UAAU;AACnB,OAAI,CAAC,SAAU,QAAO;GACtB,MAAM,OAAO,KAAK,QAAQ,KAAK,SAAS;AACxC,OAAI,CAAC,QAAQ,KAAK,WAAW,OAAQ,QAAO;GAE5C,MAAM,cAAc,KAAK,KAAK;AAC9B,OAAI,CAAC,eAAe,OAAO,gBAAgB,SAAU,QAAO;AAE5D,OAAI,YAAY,QACd,MAAK,OACH;IACG,KAAK;IAAM;IACZ,oBAAC;KAAK,WAAU;eAA8E;MAEvF;OACN;YAEI,YAAY,OACrB,MAAK,OACH;IACG,KAAK;IAAM;IACZ,oBAAC;KAAY,WAAU;eACpB,YAAY;MACD;OACb;AAIP,UAAO;KAEV;EACF;;;;;AAaH,eAAsB,cACpB,QACA,UAEI,EAAE,EAMN;CACA,MAAM,EAAE,UAAU,OAAO;CACzB,MAAM,EAAE,qBAAqB,MAAM,OAAO;CAC1C,MAAM,EAAE,eAAe,MAAM,OAAO;CACpC,MAAM,EAAE,WAAW,MAAM,OAAO;CAChC,MAAM,EAAE,iBAAiB,MAAM,OAAO;CACtC,MAAM,QAGC,EAAE;CAET,MAAM,UAAU,MAAM,WAAW,QAAQ,iBAAiB,QAAQ,CAAC;AACnE,MAAK,MAAM,CAAC,UAAU,SAAS,OAAO,QAAQ,QAAQ,EAAE;EACtD,MAAM,YAAY,MAAM,OAAO,UAAU,SAAS;AAClD,OAAK,MAAM,SAAS,MAAM;GACxB,MAAM,QAAQ,OAAO,MAAM;AAC3B,SAAM,oBAAoB;AAE1B,SAAM,KAAK;IACT,MAAM;IACN,MAAM,GAAG,QAAQ,GAAG,MAAM;IAC1B,MAAM;KACJ,GAAG,MAAM;KACT,kBAAkB;AAChB,aAAO;;KAET,YAAY;AACV,aAAO;OACL,IAAI;OACJ,GAAG;OACJ;;KAEH,GAAG,aAAa,OAAO,UAAU,aAAa;KAC9C,UAAU;MACR,QACE,MAAM,SAAS,eAAe,MAAM,SAAS,YACzC,MAAM,KAAK,SACX;MACN,SAAS,MAAM,SAAS;MACzB;KACF;IACF,CAAC;;;AAIN,QAAO,EACL,OACD;;;;;AAMH,SAAgB,qBAA0C;AACxD,QAAO,eAAe,CAAC"}
|
package/dist/ui/api-page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-page.js","names":["processor: ReturnType<typeof createMarkdownProcessor>","processed: ProcessedDocument","ctx: RenderContext","props"],"sources":["../../src/ui/api-page.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any -- rehype-react without types */\nimport Slugger from 'github-slugger';\nimport { Operation } from '@/ui/operation';\nimport type { MethodInformation, RenderContext } from '@/types';\nimport { createMethod, type NoReference } from '@/utils/schema';\nimport type { OpenAPIV3_1 } from 'openapi-types';\nimport type { ProcessedDocument } from '@/utils/process-document';\nimport { defaultAdapters, MediaAdapter } from '@/requests/media/adapter';\nimport type { FC, ReactNode } from 'react';\nimport {\n highlight,\n type HighlightOptionsCommon,\n type HighlightOptionsThemes,\n} from 'fumadocs-core/highlight';\nimport type { OpenAPIServer } from '@/server';\nimport type { APIPageClientOptions } from './client';\nimport type { CodeUsageGenerator } from './operation/usage-tabs';\nimport { ApiProviderLazy } from './contexts/api.lazy';\nimport { Heading } from 'fumadocs-ui/components/heading';\nimport { rehypeCode, type RehypeCodeOptions } from 'fumadocs-core/mdx-plugins/rehype-code';\nimport { remarkGfm } from 'fumadocs-core/mdx-plugins/remark-gfm';\nimport defaultMdxComponents from 'fumadocs-ui/mdx';\nimport { remark } from 'remark';\nimport remarkRehype from 'remark-rehype';\nimport { toJsxRuntime } from 'hast-util-to-jsx-runtime';\nimport * as JsxRuntime from 'react/jsx-runtime';\nimport { CodeBlock, Pre } from 'fumadocs-ui/components/codeblock';\nimport type { SchemaUIOptions } from './schema';\nimport type { ResponseTab } from './operation/response-tabs';\nimport type { ExampleRequestItem } from './operation/request-tabs';\n\ntype Awaitable<T> = T | Promise<T>;\n\nexport interface CreateAPIPageOptions {\n /**\n * Generate TypeScript definitions from response schema.\n *\n * Pass `false` to disable it.\n *\n * @param method - the operation object\n * @param statusCode - status code\n */\n generateTypeScriptSchema?:\n | ((method: NoReference<MethodInformation>, statusCode: string) => Awaitable<string>)\n | false;\n\n /**\n * Generate example code usage for endpoints.\n */\n generateCodeSamples?: (method: MethodInformation) => Awaitable<CodeUsageGenerator[]>;\n\n shikiOptions?: Omit<HighlightOptionsCommon, 'lang' | 'components'> & HighlightOptionsThemes;\n\n /**\n * Show full response schema instead of only example response & Typescript definitions.\n *\n * @default true\n */\n showResponseSchema?: boolean;\n\n /**\n * Support other media types (for server-side generation).\n */\n mediaAdapters?: Record<string, MediaAdapter>;\n\n /**\n * Customise page content\n */\n content?: {\n renderResponseTabs?: (tabs: ResponseTab[], ctx: RenderContext) => Awaitable<ReactNode>;\n\n renderRequestTabs?: (\n items: ExampleRequestItem[],\n ctx: RenderContext & {\n route: string;\n operation: NoReference<MethodInformation>;\n },\n ) => Awaitable<ReactNode>;\n\n renderAPIExampleLayout?: (\n slots: {\n selector: ReactNode;\n usageTabs: ReactNode;\n responseTabs: ReactNode;\n },\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n /**\n * @param generators - codegens for API example usages\n */\n renderAPIExampleUsageTabs?: (\n generators: CodeUsageGenerator[],\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n /**\n * renderer of the entire page's layout (containing all operations & webhooks UI)\n */\n renderPageLayout?: (\n slots: {\n operations?: {\n item: OperationItem;\n children: ReactNode;\n }[];\n webhooks?: {\n item: WebhookItem;\n children: ReactNode;\n }[];\n },\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n renderOperationLayout?: (\n slots: {\n header: ReactNode;\n description: ReactNode;\n apiExample: ReactNode;\n apiPlayground: ReactNode;\n\n authSchemes: ReactNode;\n paremeters: ReactNode;\n body: ReactNode;\n responses: ReactNode;\n callbacks: ReactNode;\n },\n ctx: RenderContext,\n method: NoReference<MethodInformation>,\n ) => Awaitable<ReactNode>;\n\n renderWebhookLayout?: (slots: {\n header: ReactNode;\n description: ReactNode;\n authSchemes: ReactNode;\n paremeters: ReactNode;\n body: ReactNode;\n requests: ReactNode;\n responses: ReactNode;\n callbacks: ReactNode;\n }) => Awaitable<ReactNode>;\n };\n\n /**\n * Info UI for JSON schemas\n */\n schemaUI?: {\n render?: (options: SchemaUIOptions, ctx: RenderContext) => Awaitable<ReactNode>;\n\n /**\n * Show examples under the generated content of JSON schemas.\n *\n * @defaultValue false\n */\n showExample?: boolean;\n };\n\n /**\n * Customise API playground\n */\n playground?: {\n /**\n * @defaultValue true\n */\n enabled?: boolean;\n /**\n * replace the server-side renderer\n */\n render?: (props: {\n path: string;\n method: MethodInformation;\n ctx: RenderContext;\n }) => Awaitable<ReactNode>;\n };\n\n client?: APIPageClientOptions;\n}\n\nexport interface ApiPageProps {\n document: Promise<ProcessedDocument> | string | ProcessedDocument;\n showTitle?: boolean;\n showDescription?: boolean;\n\n /**\n * An array of operations\n */\n operations?: OperationItem[];\n\n webhooks?: WebhookItem[];\n}\n\nexport interface WebhookItem {\n /**\n * webhook name in `webhooks`\n */\n name: string;\n method: OpenAPIV3_1.HttpMethods;\n}\n\nexport interface OperationItem {\n /**\n * the path of operation in `paths`\n */\n path: string;\n /**\n * the HTTP method of operation\n */\n method: OpenAPIV3_1.HttpMethods;\n}\n\nexport function createAPIPage(\n server: OpenAPIServer,\n options: CreateAPIPageOptions = {},\n): FC<ApiPageProps> {\n let processor: ReturnType<typeof createMarkdownProcessor>;\n\n function createMarkdownProcessor() {\n function rehypeReact(this: any) {\n this.compiler = (tree: any, file: any) => {\n return toJsxRuntime(tree, {\n development: false,\n filePath: file.path,\n ...JsxRuntime,\n components: defaultMdxComponents,\n });\n };\n }\n\n return remark()\n .use(remarkGfm)\n .use(remarkRehype)\n .use(rehypeCode, {\n langs: [],\n lazy: true,\n } satisfies Partial<RehypeCodeOptions>)\n .use(rehypeReact);\n }\n\n return async function APIPageWrapper({ document, ...props }) {\n let processed: ProcessedDocument;\n if (typeof document === 'string') {\n processed = await server.getSchema(document);\n } else {\n processed = await document;\n }\n\n const { dereferenced } = processed;\n const servers =\n dereferenced.servers && dereferenced.servers.length > 0\n ? dereferenced.servers\n : [{ url: '/' }];\n\n const slugger = new Slugger();\n\n const ctx: RenderContext = {\n schema: processed,\n proxyUrl: server.options.proxyUrl,\n ...options,\n servers,\n mediaAdapters: {\n ...defaultAdapters,\n ...options.mediaAdapters,\n },\n slugger,\n renderHeading(depth, text, props) {\n const id = slugger.slug(text);\n\n return (\n <Heading id={id} key={id} as={`h${depth}` as `h1`} {...props}>\n {text}\n </Heading>\n );\n },\n async renderMarkdown(text) {\n processor ??= createMarkdownProcessor();\n\n const out = await processor.process({\n value: text,\n });\n\n return out.result as ReactNode;\n },\n async renderCodeBlock(lang, code) {\n const rendered = await highlight(code, {\n lang,\n ...options.shikiOptions,\n components: {\n pre: (props) => <Pre {...props} />,\n },\n });\n\n return <CodeBlock className=\"my-0\">{rendered}</CodeBlock>;\n },\n };\n\n return <APIPage {...props} ctx={ctx} />;\n };\n}\n\nasync function APIPage({\n showTitle: hasHead = false,\n showDescription,\n operations,\n webhooks,\n ctx,\n}: Omit<ApiPageProps, 'document'> & {\n ctx: RenderContext;\n}) {\n const { dereferenced } = ctx.schema;\n let { renderPageLayout } = ctx.content ?? {};\n renderPageLayout ??= (slots) => (\n <div className=\"flex flex-col gap-24 text-sm @container\">\n {slots.operations?.map((op) => op.children)}\n {slots.webhooks?.map((op) => op.children)}\n </div>\n );\n\n const content = await renderPageLayout(\n {\n operations: operations?.map((item) => {\n const pathItem = dereferenced.paths?.[item.path];\n if (!pathItem)\n throw new Error(`[Fumadocs OpenAPI] Path not found in OpenAPI schema: ${item.path}`);\n\n const operation = pathItem[item.method];\n if (!operation)\n throw new Error(\n `[Fumadocs OpenAPI] Method ${item.method} not found in operation: ${item.path}`,\n );\n\n const method = createMethod(item.method, pathItem, operation);\n\n return {\n item,\n children: (\n <Operation\n key={`${item.path}:${item.method}`}\n method={method}\n path={item.path}\n ctx={ctx}\n showTitle={hasHead}\n showDescription={showDescription}\n />\n ),\n };\n }),\n webhooks: webhooks?.map((item) => {\n const webhook = dereferenced.webhooks?.[item.name];\n if (!webhook)\n throw new Error(`[Fumadocs OpenAPI] Webhook not found in OpenAPI schema: ${item.name}`);\n\n const hook = webhook[item.method];\n if (!hook)\n throw new Error(\n `[Fumadocs OpenAPI] Method ${item.method} not found in webhook: ${item.name}`,\n );\n\n return {\n item,\n children: (\n <Operation\n type=\"webhook\"\n key={`${item.name}:${item.method}`}\n method={createMethod(item.method, webhook, hook)}\n ctx={ctx}\n path={`/${item.name}`}\n showTitle={hasHead}\n showDescription={showDescription}\n />\n ),\n };\n }),\n },\n ctx,\n );\n\n return (\n <ApiProviderLazy\n servers={ctx.servers}\n shikiOptions={ctx.shikiOptions}\n client={ctx.client ?? {}}\n >\n {content}\n </ApiProviderLazy>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api-page.js","names":["props"],"sources":["../../src/ui/api-page.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any -- rehype-react without types */\nimport Slugger from 'github-slugger';\nimport { Operation } from '@/ui/operation';\nimport type { MethodInformation, RenderContext } from '@/types';\nimport { createMethod, type NoReference } from '@/utils/schema';\nimport type { OpenAPIV3_1 } from 'openapi-types';\nimport type { ProcessedDocument } from '@/utils/process-document';\nimport { defaultAdapters, MediaAdapter } from '@/requests/media/adapter';\nimport type { FC, ReactNode } from 'react';\nimport {\n highlight,\n type HighlightOptionsCommon,\n type HighlightOptionsThemes,\n} from 'fumadocs-core/highlight';\nimport type { OpenAPIServer } from '@/server';\nimport type { APIPageClientOptions } from './client';\nimport type { CodeUsageGenerator } from './operation/usage-tabs';\nimport { ApiProviderLazy } from './contexts/api.lazy';\nimport { Heading } from 'fumadocs-ui/components/heading';\nimport { rehypeCode, type RehypeCodeOptions } from 'fumadocs-core/mdx-plugins/rehype-code';\nimport { remarkGfm } from 'fumadocs-core/mdx-plugins/remark-gfm';\nimport defaultMdxComponents from 'fumadocs-ui/mdx';\nimport { remark } from 'remark';\nimport remarkRehype from 'remark-rehype';\nimport { toJsxRuntime } from 'hast-util-to-jsx-runtime';\nimport * as JsxRuntime from 'react/jsx-runtime';\nimport { CodeBlock, Pre } from 'fumadocs-ui/components/codeblock';\nimport type { SchemaUIOptions } from './schema';\nimport type { ResponseTab } from './operation/response-tabs';\nimport type { ExampleRequestItem } from './operation/request-tabs';\n\ntype Awaitable<T> = T | Promise<T>;\n\nexport interface CreateAPIPageOptions {\n /**\n * Generate TypeScript definitions from response schema.\n *\n * Pass `false` to disable it.\n *\n * @param method - the operation object\n * @param statusCode - status code\n */\n generateTypeScriptSchema?:\n | ((method: NoReference<MethodInformation>, statusCode: string) => Awaitable<string>)\n | false;\n\n /**\n * Generate example code usage for endpoints.\n */\n generateCodeSamples?: (method: MethodInformation) => Awaitable<CodeUsageGenerator[]>;\n\n shikiOptions?: Omit<HighlightOptionsCommon, 'lang' | 'components'> & HighlightOptionsThemes;\n\n /**\n * Show full response schema instead of only example response & Typescript definitions.\n *\n * @default true\n */\n showResponseSchema?: boolean;\n\n /**\n * Support other media types (for server-side generation).\n */\n mediaAdapters?: Record<string, MediaAdapter>;\n\n /**\n * Customise page content\n */\n content?: {\n renderResponseTabs?: (tabs: ResponseTab[], ctx: RenderContext) => Awaitable<ReactNode>;\n\n renderRequestTabs?: (\n items: ExampleRequestItem[],\n ctx: RenderContext & {\n route: string;\n operation: NoReference<MethodInformation>;\n },\n ) => Awaitable<ReactNode>;\n\n renderAPIExampleLayout?: (\n slots: {\n selector: ReactNode;\n usageTabs: ReactNode;\n responseTabs: ReactNode;\n },\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n /**\n * @param generators - codegens for API example usages\n */\n renderAPIExampleUsageTabs?: (\n generators: CodeUsageGenerator[],\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n /**\n * renderer of the entire page's layout (containing all operations & webhooks UI)\n */\n renderPageLayout?: (\n slots: {\n operations?: {\n item: OperationItem;\n children: ReactNode;\n }[];\n webhooks?: {\n item: WebhookItem;\n children: ReactNode;\n }[];\n },\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n renderOperationLayout?: (\n slots: {\n header: ReactNode;\n description: ReactNode;\n apiExample: ReactNode;\n apiPlayground: ReactNode;\n\n authSchemes: ReactNode;\n paremeters: ReactNode;\n body: ReactNode;\n responses: ReactNode;\n callbacks: ReactNode;\n },\n ctx: RenderContext,\n method: NoReference<MethodInformation>,\n ) => Awaitable<ReactNode>;\n\n renderWebhookLayout?: (slots: {\n header: ReactNode;\n description: ReactNode;\n authSchemes: ReactNode;\n paremeters: ReactNode;\n body: ReactNode;\n requests: ReactNode;\n responses: ReactNode;\n callbacks: ReactNode;\n }) => Awaitable<ReactNode>;\n };\n\n /**\n * Info UI for JSON schemas\n */\n schemaUI?: {\n render?: (options: SchemaUIOptions, ctx: RenderContext) => Awaitable<ReactNode>;\n\n /**\n * Show examples under the generated content of JSON schemas.\n *\n * @defaultValue false\n */\n showExample?: boolean;\n };\n\n /**\n * Customise API playground\n */\n playground?: {\n /**\n * @defaultValue true\n */\n enabled?: boolean;\n /**\n * replace the server-side renderer\n */\n render?: (props: {\n path: string;\n method: MethodInformation;\n ctx: RenderContext;\n }) => Awaitable<ReactNode>;\n };\n\n client?: APIPageClientOptions;\n}\n\nexport interface ApiPageProps {\n document: Promise<ProcessedDocument> | string | ProcessedDocument;\n showTitle?: boolean;\n showDescription?: boolean;\n\n /**\n * An array of operations\n */\n operations?: OperationItem[];\n\n webhooks?: WebhookItem[];\n}\n\nexport interface WebhookItem {\n /**\n * webhook name in `webhooks`\n */\n name: string;\n method: OpenAPIV3_1.HttpMethods;\n}\n\nexport interface OperationItem {\n /**\n * the path of operation in `paths`\n */\n path: string;\n /**\n * the HTTP method of operation\n */\n method: OpenAPIV3_1.HttpMethods;\n}\n\nexport function createAPIPage(\n server: OpenAPIServer,\n options: CreateAPIPageOptions = {},\n): FC<ApiPageProps> {\n let processor: ReturnType<typeof createMarkdownProcessor>;\n\n function createMarkdownProcessor() {\n function rehypeReact(this: any) {\n this.compiler = (tree: any, file: any) => {\n return toJsxRuntime(tree, {\n development: false,\n filePath: file.path,\n ...JsxRuntime,\n components: defaultMdxComponents,\n });\n };\n }\n\n return remark()\n .use(remarkGfm)\n .use(remarkRehype)\n .use(rehypeCode, {\n langs: [],\n lazy: true,\n } satisfies Partial<RehypeCodeOptions>)\n .use(rehypeReact);\n }\n\n return async function APIPageWrapper({ document, ...props }) {\n let processed: ProcessedDocument;\n if (typeof document === 'string') {\n processed = await server.getSchema(document);\n } else {\n processed = await document;\n }\n\n const { dereferenced } = processed;\n const servers =\n dereferenced.servers && dereferenced.servers.length > 0\n ? dereferenced.servers\n : [{ url: '/' }];\n\n const slugger = new Slugger();\n\n const ctx: RenderContext = {\n schema: processed,\n proxyUrl: server.options.proxyUrl,\n ...options,\n servers,\n mediaAdapters: {\n ...defaultAdapters,\n ...options.mediaAdapters,\n },\n slugger,\n renderHeading(depth, text, props) {\n const id = slugger.slug(text);\n\n return (\n <Heading id={id} key={id} as={`h${depth}` as `h1`} {...props}>\n {text}\n </Heading>\n );\n },\n async renderMarkdown(text) {\n processor ??= createMarkdownProcessor();\n\n const out = await processor.process({\n value: text,\n });\n\n return out.result as ReactNode;\n },\n async renderCodeBlock(lang, code) {\n const rendered = await highlight(code, {\n lang,\n ...options.shikiOptions,\n components: {\n pre: (props) => <Pre {...props} />,\n },\n });\n\n return <CodeBlock className=\"my-0\">{rendered}</CodeBlock>;\n },\n };\n\n return <APIPage {...props} ctx={ctx} />;\n };\n}\n\nasync function APIPage({\n showTitle: hasHead = false,\n showDescription,\n operations,\n webhooks,\n ctx,\n}: Omit<ApiPageProps, 'document'> & {\n ctx: RenderContext;\n}) {\n const { dereferenced } = ctx.schema;\n let { renderPageLayout } = ctx.content ?? {};\n renderPageLayout ??= (slots) => (\n <div className=\"flex flex-col gap-24 text-sm @container\">\n {slots.operations?.map((op) => op.children)}\n {slots.webhooks?.map((op) => op.children)}\n </div>\n );\n\n const content = await renderPageLayout(\n {\n operations: operations?.map((item) => {\n const pathItem = dereferenced.paths?.[item.path];\n if (!pathItem)\n throw new Error(`[Fumadocs OpenAPI] Path not found in OpenAPI schema: ${item.path}`);\n\n const operation = pathItem[item.method];\n if (!operation)\n throw new Error(\n `[Fumadocs OpenAPI] Method ${item.method} not found in operation: ${item.path}`,\n );\n\n const method = createMethod(item.method, pathItem, operation);\n\n return {\n item,\n children: (\n <Operation\n key={`${item.path}:${item.method}`}\n method={method}\n path={item.path}\n ctx={ctx}\n showTitle={hasHead}\n showDescription={showDescription}\n />\n ),\n };\n }),\n webhooks: webhooks?.map((item) => {\n const webhook = dereferenced.webhooks?.[item.name];\n if (!webhook)\n throw new Error(`[Fumadocs OpenAPI] Webhook not found in OpenAPI schema: ${item.name}`);\n\n const hook = webhook[item.method];\n if (!hook)\n throw new Error(\n `[Fumadocs OpenAPI] Method ${item.method} not found in webhook: ${item.name}`,\n );\n\n return {\n item,\n children: (\n <Operation\n type=\"webhook\"\n key={`${item.name}:${item.method}`}\n method={createMethod(item.method, webhook, hook)}\n ctx={ctx}\n path={`/${item.name}`}\n showTitle={hasHead}\n showDescription={showDescription}\n />\n ),\n };\n }),\n },\n ctx,\n );\n\n return (\n <ApiProviderLazy\n servers={ctx.servers}\n shikiOptions={ctx.shikiOptions}\n client={ctx.client ?? {}}\n >\n {content}\n </ApiProviderLazy>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","names":[
|
|
1
|
+
{"version":3,"file":"api.js","names":[],"sources":["../../../src/ui/contexts/api.tsx"],"sourcesContent":["'use client';\nimport {\n createContext,\n type ReactNode,\n type RefObject,\n use,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { RenderContext, ServerObject } from '@/types';\nimport { defaultAdapters, type MediaAdapter } from '@/requests/media/adapter';\nimport type { NoReference } from '@/utils/schema';\nimport { useStorageKey } from '../client/storage-key';\n\ntype InheritFromContext = Pick<Required<RenderContext>, 'servers' | 'client'> &\n Pick<RenderContext, 'shikiOptions'>;\n\nexport interface ApiProviderProps extends InheritFromContext {\n /**\n * Base URL for API requests\n */\n defaultBaseUrl?: string;\n}\n\nexport interface SelectedServer {\n url: string;\n variables: Record<string, string>;\n}\n\ninterface ApiContextType extends InheritFromContext {\n /**\n * ref to selected API server (to query)\n */\n serverRef: RefObject<SelectedServer | null>;\n\n mediaAdapters: Record<string, MediaAdapter>;\n}\n\ninterface ServerSelectType {\n server: SelectedServer | null;\n setServer: (value: string) => void;\n setServerVariables: (value: Record<string, string>) => void;\n}\n\nconst ApiContext = createContext<ApiContextType | null>(null);\nconst ServerSelectContext = createContext<ServerSelectType | null>(null);\n\nexport function useApiContext(): ApiContextType {\n const ctx = use(ApiContext);\n if (!ctx) throw new Error('Component must be used under <ApiProvider />');\n\n return ctx;\n}\n\nexport function useServerSelectContext(): ServerSelectType {\n const ctx = use(ServerSelectContext);\n if (!ctx) throw new Error('Component must be used under <ApiProvider />');\n\n return ctx;\n}\n\nexport function ApiProvider({\n defaultBaseUrl,\n children,\n servers,\n shikiOptions,\n client,\n}: ApiProviderProps & { children: ReactNode }) {\n const serverRef = useRef<SelectedServer | null>(null);\n\n return (\n <ApiContext\n value={useMemo(\n () => ({\n serverRef,\n shikiOptions,\n client,\n mediaAdapters: {\n ...defaultAdapters,\n ...client.mediaAdapters,\n },\n servers,\n }),\n [servers, client, shikiOptions],\n )}\n >\n <ServerSelectProvider defaultBaseUrl={defaultBaseUrl}>{children}</ServerSelectProvider>\n </ApiContext>\n );\n}\n\nfunction ServerSelectProvider({\n defaultBaseUrl,\n children,\n}: Pick<ApiProviderProps, 'defaultBaseUrl'> & {\n children: ReactNode;\n}) {\n const { servers, serverRef } = useApiContext();\n const storageKeys = useStorageKey();\n const [server, setServer] = useState<SelectedServer | null>(() => {\n const defaultItem = defaultBaseUrl\n ? servers.find((item) => item.url === defaultBaseUrl)\n : servers[0];\n\n return defaultItem\n ? {\n url: defaultItem.url,\n variables: getDefaultValues(defaultItem),\n }\n : null;\n });\n serverRef.current = server;\n\n useEffect(() => {\n const cached = localStorage.getItem(storageKeys.of('server-url'));\n if (!cached) return;\n\n try {\n const obj = JSON.parse(cached);\n if (!obj || typeof obj !== 'object') return;\n\n setServer(obj);\n } catch {\n // ignore\n }\n }, [storageKeys]);\n\n return (\n <ServerSelectContext\n value={useMemo(\n () => ({\n server,\n setServerVariables(variables) {\n setServer((prev) => {\n if (!prev) return null;\n\n const updated = { ...prev, variables };\n localStorage.setItem(storageKeys.of('server-url'), JSON.stringify(updated));\n return updated;\n });\n },\n setServer(value) {\n const obj = servers.find((item) => item.url === value);\n if (!obj) return;\n\n const result: SelectedServer = {\n url: value,\n variables: getDefaultValues(obj),\n };\n\n localStorage.setItem(storageKeys.of('server-url'), JSON.stringify(result));\n setServer(result);\n },\n }),\n [server, servers, storageKeys],\n )}\n >\n {children}\n </ServerSelectContext>\n );\n}\n\nfunction getDefaultValues(server: NoReference<ServerObject>): Record<string, string> {\n const out: Record<string, string> = {};\n if (!server.variables) return out;\n\n for (const [k, v] of Object.entries(server.variables)) {\n out[k] = v.default;\n }\n\n return out;\n}\n"],"mappings":";;;;;;;;AA8CA,MAAM,aAAa,cAAqC,KAAK;AAC7D,MAAM,sBAAsB,cAAuC,KAAK;AAExE,SAAgB,gBAAgC;CAC9C,MAAM,MAAM,IAAI,WAAW;AAC3B,KAAI,CAAC,IAAK,OAAM,IAAI,MAAM,+CAA+C;AAEzE,QAAO;;AAGT,SAAgB,yBAA2C;CACzD,MAAM,MAAM,IAAI,oBAAoB;AACpC,KAAI,CAAC,IAAK,OAAM,IAAI,MAAM,+CAA+C;AAEzE,QAAO;;AAGT,SAAgB,YAAY,EAC1B,gBACA,UACA,SACA,cACA,UAC6C;CAC7C,MAAM,YAAY,OAA8B,KAAK;AAErD,QACE,oBAAC;EACC,OAAO,eACE;GACL;GACA;GACA;GACA,eAAe;IACb,GAAG;IACH,GAAG,OAAO;IACX;GACD;GACD,GACD;GAAC;GAAS;GAAQ;GAAa,CAChC;YAED,oBAAC;GAAqC;GAAiB;IAAgC;GAC5E;;AAIjB,SAAS,qBAAqB,EAC5B,gBACA,YAGC;CACD,MAAM,EAAE,SAAS,cAAc,eAAe;CAC9C,MAAM,cAAc,eAAe;CACnC,MAAM,CAAC,QAAQ,aAAa,eAAsC;EAChE,MAAM,cAAc,iBAChB,QAAQ,MAAM,SAAS,KAAK,QAAQ,eAAe,GACnD,QAAQ;AAEZ,SAAO,cACH;GACE,KAAK,YAAY;GACjB,WAAW,iBAAiB,YAAY;GACzC,GACD;GACJ;AACF,WAAU,UAAU;AAEpB,iBAAgB;EACd,MAAM,SAAS,aAAa,QAAQ,YAAY,GAAG,aAAa,CAAC;AACjE,MAAI,CAAC,OAAQ;AAEb,MAAI;GACF,MAAM,MAAM,KAAK,MAAM,OAAO;AAC9B,OAAI,CAAC,OAAO,OAAO,QAAQ,SAAU;AAErC,aAAU,IAAI;UACR;IAGP,CAAC,YAAY,CAAC;AAEjB,QACE,oBAAC;EACC,OAAO,eACE;GACL;GACA,mBAAmB,WAAW;AAC5B,eAAW,SAAS;AAClB,SAAI,CAAC,KAAM,QAAO;KAElB,MAAM,UAAU;MAAE,GAAG;MAAM;MAAW;AACtC,kBAAa,QAAQ,YAAY,GAAG,aAAa,EAAE,KAAK,UAAU,QAAQ,CAAC;AAC3E,YAAO;MACP;;GAEJ,UAAU,OAAO;IACf,MAAM,MAAM,QAAQ,MAAM,SAAS,KAAK,QAAQ,MAAM;AACtD,QAAI,CAAC,IAAK;IAEV,MAAM,SAAyB;KAC7B,KAAK;KACL,WAAW,iBAAiB,IAAI;KACjC;AAED,iBAAa,QAAQ,YAAY,GAAG,aAAa,EAAE,KAAK,UAAU,OAAO,CAAC;AAC1E,cAAU,OAAO;;GAEpB,GACD;GAAC;GAAQ;GAAS;GAAY,CAC/B;EAEA;GACmB;;AAI1B,SAAS,iBAAiB,QAA2D;CACnF,MAAM,MAA8B,EAAE;AACtC,KAAI,CAAC,OAAO,UAAW,QAAO;AAE9B,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,OAAO,UAAU,CACnD,KAAI,KAAK,EAAE;AAGb,QAAO"}
|
|
@@ -1 +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
|
+
{"version":3,"file":"index.js","names":["type"],"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 +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
|
+
{"version":3,"file":"request-tabs.js","names":["data"],"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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-tabs.js","names":["
|
|
1
|
+
{"version":3,"file":"response-tabs.js","names":["sample"],"sources":["../../../src/ui/operation/response-tabs.tsx"],"sourcesContent":["import type { MethodInformation, RenderContext, ResponseObject } from '@/types';\nimport { getPreferredType, type NoReference } from '@/utils/schema';\nimport {\n AccordionContent,\n AccordionHeader,\n AccordionItem,\n Accordions,\n AccordionTrigger,\n} from '@/ui/components/accordion';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\nimport { sample } from 'openapi-sampler';\nimport type { ReactNode } from 'react';\n\nexport interface ResponseTab {\n /**\n * HTTP response code\n */\n code: string;\n\n response: NoReference<ResponseObject>;\n /**\n * media type of response\n */\n mediaType: string | null;\n\n examples?: ResponseExample[];\n}\n\ninterface ResponseExample {\n /**\n * generated/defined example data\n */\n sample: unknown;\n\n label: string;\n\n /**\n * description (in Markdown)\n */\n description?: string;\n}\n\nexport function ResponseTabs({\n operation,\n ctx,\n}: {\n operation: NoReference<MethodInformation>;\n ctx: RenderContext;\n}) {\n if (!operation.responses) return null;\n const tabs: ResponseTab[] = [];\n\n for (const [code, response] of Object.entries(operation.responses)) {\n const media = response.content ? getPreferredType(response.content) : null;\n const responseOfType = media ? response.content?.[media] : null;\n\n const tab: ResponseTab = {\n code,\n response,\n mediaType: media as string | null,\n };\n\n if (responseOfType?.examples) {\n tab.examples ??= [];\n\n for (const [key, sample] of Object.entries(responseOfType.examples)) {\n const title = sample?.summary || `Example ${key}`;\n\n tab.examples.push({\n label: title,\n sample: sample.value,\n description: sample?.description,\n });\n }\n } else if (responseOfType?.example || responseOfType?.schema) {\n tab.examples ??= [];\n tab.examples.push({\n label: 'Example',\n sample: responseOfType.example ?? sample(responseOfType.schema as object),\n });\n }\n\n tabs.push(tab);\n }\n const { renderResponseTabs = renderResponseTabsDefault } = ctx.content ?? {};\n\n return renderResponseTabs(tabs, ctx);\n}\n\nfunction renderResponseTabsDefault(\n tabs: ResponseTab[],\n ctx: RenderContext,\n): ReactNode | Promise<ReactNode> {\n function renderExampleContent(example: ResponseExample) {\n return (\n <>\n {example.description && ctx.renderMarkdown(example.description)}\n {ctx.renderCodeBlock('json', JSON.stringify(example.sample, null, 2))}\n </>\n );\n }\n\n async function renderResponse(tab: ResponseTab) {\n const { examples = [] } = tab;\n\n let slot: ReactNode = 'Empty';\n if (examples.length > 1) {\n slot = (\n <Accordions type=\"single\" className=\"pt-2\" defaultValue={examples[0].label}>\n {examples.map((example, i) => (\n <AccordionItem key={i} value={example.label}>\n <AccordionHeader>\n <AccordionTrigger>{example.label}</AccordionTrigger>\n </AccordionHeader>\n <AccordionContent className=\"prose-no-margin\">\n {renderExampleContent(example)}\n </AccordionContent>\n </AccordionItem>\n ))}\n </Accordions>\n );\n } else if (examples.length === 1) {\n slot = renderExampleContent(examples[0]);\n }\n\n return <Tab value={tab.code}>{slot}</Tab>;\n }\n\n if (tabs.length === 0) return null;\n\n return (\n <Tabs groupId=\"fumadocs_openapi_responses\" items={tabs.map((tab) => tab.code)}>\n {tabs.map(renderResponse)}\n </Tabs>\n );\n}\n"],"mappings":";;;;;;;AA0CA,SAAgB,aAAa,EAC3B,WACA,OAIC;AACD,KAAI,CAAC,UAAU,UAAW,QAAO;CACjC,MAAM,OAAsB,EAAE;AAE9B,MAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,UAAU,UAAU,EAAE;EAClE,MAAM,QAAQ,SAAS,UAAU,iBAAiB,SAAS,QAAQ,GAAG;EACtE,MAAM,iBAAiB,QAAQ,SAAS,UAAU,SAAS;EAE3D,MAAM,MAAmB;GACvB;GACA;GACA,WAAW;GACZ;AAED,MAAI,gBAAgB,UAAU;AAC5B,OAAI,aAAa,EAAE;AAEnB,QAAK,MAAM,CAAC,KAAKA,aAAW,OAAO,QAAQ,eAAe,SAAS,EAAE;IACnE,MAAM,QAAQA,UAAQ,WAAW,WAAW;AAE5C,QAAI,SAAS,KAAK;KAChB,OAAO;KACP,QAAQA,SAAO;KACf,aAAaA,UAAQ;KACtB,CAAC;;aAEK,gBAAgB,WAAW,gBAAgB,QAAQ;AAC5D,OAAI,aAAa,EAAE;AACnB,OAAI,SAAS,KAAK;IAChB,OAAO;IACP,QAAQ,eAAe,WAAW,OAAO,eAAe,OAAiB;IAC1E,CAAC;;AAGJ,OAAK,KAAK,IAAI;;CAEhB,MAAM,EAAE,qBAAqB,8BAA8B,IAAI,WAAW,EAAE;AAE5E,QAAO,mBAAmB,MAAM,IAAI;;AAGtC,SAAS,0BACP,MACA,KACgC;CAChC,SAAS,qBAAqB,SAA0B;AACtD,SACE,4CACG,QAAQ,eAAe,IAAI,eAAe,QAAQ,YAAY,EAC9D,IAAI,gBAAgB,QAAQ,KAAK,UAAU,QAAQ,QAAQ,MAAM,EAAE,CAAC,IACpE;;CAIP,eAAe,eAAe,KAAkB;EAC9C,MAAM,EAAE,WAAW,EAAE,KAAK;EAE1B,IAAI,OAAkB;AACtB,MAAI,SAAS,SAAS,EACpB,QACE,oBAAC;GAAW,MAAK;GAAS,WAAU;GAAO,cAAc,SAAS,GAAG;aAClE,SAAS,KAAK,SAAS,MACtB,qBAAC;IAAsB,OAAO,QAAQ;eACpC,oBAAC,6BACC,oBAAC,8BAAkB,QAAQ,QAAyB,GACpC,EAClB,oBAAC;KAAiB,WAAU;eACzB,qBAAqB,QAAQ;MACb;MAND,EAOJ,CAChB;IACS;WAEN,SAAS,WAAW,EAC7B,QAAO,qBAAqB,SAAS,GAAG;AAG1C,SAAO,oBAAC;GAAI,OAAO,IAAI;aAAO;IAAW;;AAG3C,KAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,QACE,oBAAC;EAAK,SAAQ;EAA6B,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK;YAC1E,KAAK,IAAI,eAAe;GACpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["example"
|
|
1
|
+
{"version":3,"file":"client.js","names":["example"],"sources":["../../../../src/ui/operation/usage-tabs/client.tsx"],"sourcesContent":["'use client';\nimport { useApiContext, useServerSelectContext } from '@/ui/contexts/api';\nimport { joinURL, withBase, resolveServerUrl, resolveRequestData } from '@/utils/url';\nimport {\n Select,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n} from '@/ui/components/select';\nimport { DynamicCodeBlock } from 'fumadocs-ui/components/dynamic-codeblock';\nimport { useState, useEffect, useMemo, createContext, ReactNode, useRef, use } from 'react';\nimport type { CodeUsageGenerator } from '.';\nimport type { ExampleRequestItem } from '../request-tabs';\nimport type { RawRequestData, RequestData } from '@/requests/types';\n\nexport type ExampleUpdateListener = (data: RawRequestData, encoded: RequestData) => void;\n\nconst Context = createContext<{\n route: string;\n examples: ExampleRequestItem[];\n example: string | undefined;\n setExample: (id: string) => void;\n setExampleData: (data: RawRequestData, encoded: RequestData) => void;\n\n addListener: (listener: ExampleUpdateListener) => void;\n removeListener: (listener: ExampleUpdateListener) => void;\n} | null>(null);\n\nexport function UsageTabsProvider({\n route,\n examples,\n defaultExampleId,\n children,\n}: {\n route: string;\n examples: ExampleRequestItem[];\n defaultExampleId?: string;\n children: ReactNode;\n}) {\n const [example, setExample] = useState(() => defaultExampleId ?? examples.at(0)?.id);\n const listeners = useRef<ExampleUpdateListener[]>([]);\n\n return (\n <Context\n value={useMemo(\n () => ({\n example,\n route,\n setExample: (newKey: string) => {\n const example = examples.find((example) => example.id === newKey);\n if (!example) return;\n\n setExample(newKey);\n for (const listener of listeners.current) {\n listener(example.data, example.encoded);\n }\n },\n examples,\n setExampleData(data, encoded) {\n for (const item of examples) {\n if (item.id === example) {\n // persistent changes\n item.data = data;\n item.encoded = encoded;\n break;\n }\n }\n\n for (const listener of listeners.current) {\n listener(data, encoded);\n }\n },\n removeListener(listener) {\n listeners.current = listeners.current.filter((item) => item !== listener);\n },\n addListener(listener) {\n // initial call to listeners to ensure their data is the latest\n // this is necessary to avoid race conditions between `useEffect()`\n const active = examples.find((item) => item.id === example)!;\n\n listener(active.data, active.encoded);\n listeners.current.push(listener);\n },\n }),\n [example, route, examples],\n )}\n >\n {children}\n </Context>\n );\n}\n\nexport function useExampleRequests() {\n return use(Context)!;\n}\n\nexport function UsageTabsSelector() {\n const { example: key, setExample: setKey, examples } = useExampleRequests();\n const { APIExampleSelector: Override } = useApiContext().client.operation ?? {};\n\n if (Override) {\n return <Override items={examples} value={key} onValueChange={setKey} />;\n }\n\n function renderItem(item: ExampleRequestItem) {\n return (\n <div>\n <span className=\"font-medium text-sm\">{item.name}</span>\n <span className=\"text-fd-muted-foreground\">{item.description}</span>\n </div>\n );\n }\n\n if (examples.length === 1) return null;\n const selected = examples.find((item) => item.id === key);\n return (\n <Select value={key} onValueChange={setKey}>\n <SelectTrigger className=\"not-prose mb-2\">\n {selected && <SelectValue asChild>{renderItem(selected)}</SelectValue>}\n </SelectTrigger>\n <SelectContent>\n {examples.map((item) => (\n <SelectItem key={item.id} value={item.id}>\n {renderItem(item)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n\nexport function UsageTab(sample: CodeUsageGenerator) {\n const { shikiOptions, mediaAdapters } = useApiContext();\n const {\n examples,\n example: selectedExampleId,\n route,\n addListener,\n removeListener,\n } = useExampleRequests();\n const { server } = useServerSelectContext();\n const [data, setData] = useState(\n () => examples.find((example) => example.id === selectedExampleId)?.encoded,\n );\n\n useEffect(() => {\n const listener: ExampleUpdateListener = (_, encoded) => setData(encoded);\n\n addListener(listener);\n return () => {\n removeListener(listener);\n };\n }, [addListener, removeListener]);\n\n const code = useMemo(() => {\n if (!sample.source || !data) return;\n if (typeof sample.source === 'string') return sample.source;\n\n return sample.source(\n joinURL(\n withBase(\n server ? resolveServerUrl(server.url, server.variables) : '/',\n typeof window !== 'undefined' ? window.location.origin : 'https://loading',\n ),\n resolveRequestData(route, data),\n ),\n data,\n {\n server: sample.serverContext,\n mediaAdapters,\n },\n );\n }, [mediaAdapters, sample, server, route, data]);\n\n if (!code || !sample) return null;\n\n return <DynamicCodeBlock lang={sample.lang} code={code} options={shikiOptions} />;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["generators"
|
|
1
|
+
{"version":3,"file":"index.js","names":["generators"],"sources":["../../../../src/ui/operation/usage-tabs/index.tsx"],"sourcesContent":["import type { MethodInformation, RenderContext } from '@/types';\nimport type { SampleGenerator } from '@/requests/types';\nimport { defaultSamples } from '@/requests/generators';\nimport {\n CodeBlockTab,\n CodeBlockTabs,\n CodeBlockTabsList,\n CodeBlockTabsTrigger,\n} from 'fumadocs-ui/components/codeblock';\nimport { UsageTabsSelectorLazy, UsageTabLazy } from './lazy';\nimport { ResponseTabs } from '../response-tabs';\n\n/**\n * Generate code example for given programming language\n */\nexport interface CodeUsageGenerator<T = unknown> {\n id: string;\n lang: string;\n label?: string;\n /**\n * either:\n * - code\n * - a function imported from a file with \"use client\" directive\n * - false (disabled)\n */\n source?: string | SampleGenerator<T> | false;\n\n /**\n * Pass extra context to client-side source generator\n */\n serverContext?: T;\n}\n\nexport async function UsageTabs({\n method,\n ctx,\n}: {\n method: MethodInformation;\n ctx: RenderContext;\n}) {\n let { renderAPIExampleUsageTabs, renderAPIExampleLayout } = ctx.content ?? {};\n\n renderAPIExampleLayout ??= (slots) => {\n return (\n <div className=\"prose-no-margin\">\n {slots.selector}\n {slots.usageTabs}\n {slots.responseTabs}\n </div>\n );\n };\n\n renderAPIExampleUsageTabs ??= (generators) => {\n if (generators.length === 0) return null;\n\n return (\n <CodeBlockTabs groupId=\"fumadocs_openapi_requests\" defaultValue={generators[0].id}>\n <CodeBlockTabsList>\n {generators.map((item) => (\n <CodeBlockTabsTrigger key={item.id} value={item.id}>\n {item.label ?? item.lang}\n </CodeBlockTabsTrigger>\n ))}\n </CodeBlockTabsList>\n {generators.map((item) => (\n <CodeBlockTab key={item.id} value={item.id}>\n <UsageTabLazy {...item} />\n </CodeBlockTab>\n ))}\n </CodeBlockTabs>\n );\n };\n\n let generators: CodeUsageGenerator[] = [...defaultSamples];\n if (ctx.generateCodeSamples) {\n generators.push(...(await ctx.generateCodeSamples(method)));\n }\n\n if (method['x-codeSamples']) {\n for (const sample of method['x-codeSamples']) {\n generators.push(\n 'id' in sample && typeof sample.id === 'string'\n ? (sample as CodeUsageGenerator)\n : {\n id: sample.lang,\n ...sample,\n },\n );\n }\n }\n\n generators = dedupe(generators);\n\n return renderAPIExampleLayout(\n {\n selector: method['x-exclusiveCodeSample'] ? null : <UsageTabsSelectorLazy />,\n usageTabs: await renderAPIExampleUsageTabs(generators, ctx),\n responseTabs: <ResponseTabs operation={method} ctx={ctx} />,\n },\n ctx,\n );\n}\n\n/**\n * Remove duplicated ids\n */\nfunction dedupe(samples: CodeUsageGenerator[]): CodeUsageGenerator[] {\n const set = new Set<string>();\n const out: CodeUsageGenerator[] = [];\n\n for (let i = samples.length - 1; i >= 0; i--) {\n const item = samples[i];\n if (set.has(item.id)) continue;\n set.add(item.id);\n if (item.source !== false) out.unshift(item);\n }\n\n return out;\n}\n"],"mappings":";;;;;;;AAiCA,eAAsB,UAAU,EAC9B,QACA,OAIC;CACD,IAAI,EAAE,2BAA2B,2BAA2B,IAAI,WAAW,EAAE;AAE7E,6BAA4B,UAAU;AACpC,SACE,qBAAC;GAAI,WAAU;;IACZ,MAAM;IACN,MAAM;IACN,MAAM;;IACH;;AAIV,gCAA+B,iBAAe;AAC5C,MAAIA,aAAW,WAAW,EAAG,QAAO;AAEpC,SACE,qBAAC;GAAc,SAAQ;GAA4B,cAAcA,aAAW,GAAG;cAC7E,oBAAC,+BACEA,aAAW,KAAK,SACf,oBAAC;IAAmC,OAAO,KAAK;cAC7C,KAAK,SAAS,KAAK;MADK,KAAK,GAET,CACvB,GACgB,EACnBA,aAAW,KAAK,SACf,oBAAC;IAA2B,OAAO,KAAK;cACtC,oBAAC,gBAAa,GAAI,OAAQ;MADT,KAAK,GAET,CACf;IACY;;CAIpB,IAAI,aAAmC,CAAC,GAAG,eAAe;AAC1D,KAAI,IAAI,oBACN,YAAW,KAAK,GAAI,MAAM,IAAI,oBAAoB,OAAO,CAAE;AAG7D,KAAI,OAAO,iBACT,MAAK,MAAM,UAAU,OAAO,iBAC1B,YAAW,KACT,QAAQ,UAAU,OAAO,OAAO,OAAO,WAClC,SACD;EACE,IAAI,OAAO;EACX,GAAG;EACJ,CACN;AAIL,cAAa,OAAO,WAAW;AAE/B,QAAO,uBACL;EACE,UAAU,OAAO,2BAA2B,OAAO,oBAAC,0BAAwB;EAC5E,WAAW,MAAM,0BAA0B,YAAY,IAAI;EAC3D,cAAc,oBAAC;GAAa,WAAW;GAAa;IAAO;EAC5D,EACD,IACD;;;;;AAMH,SAAS,OAAO,SAAqD;CACnE,MAAM,sBAAM,IAAI,KAAa;CAC7B,MAAM,MAA4B,EAAE;AAEpC,MAAK,IAAI,IAAI,QAAQ,SAAS,GAAG,KAAK,GAAG,KAAK;EAC5C,MAAM,OAAO,QAAQ;AACrB,MAAI,IAAI,IAAI,KAAK,GAAG,CAAE;AACtB,MAAI,IAAI,KAAK,GAAG;AAChB,MAAI,KAAK,WAAW,MAAO,KAAI,QAAQ,KAAK;;AAG9C,QAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","names":[],"sources":["../../../src/ui/schema/client.tsx"],"sourcesContent":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"client.d.ts","names":[],"sources":["../../../src/ui/schema/client.tsx"],"sourcesContent":[],"mappings":";;;;UAuDiB,aAAA;;;EAAA,EAAA,CAAA,EAAA,UAAA,GAAa,MAAA;aAKjB"}
|