fumadocs-openapi 10.2.6 → 10.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generate-file.d.ts +1 -2
- package/dist/generate-file.js +1 -2
- package/dist/playground/client.d.ts +1 -2
- package/dist/playground/client.js +1 -2
- package/dist/playground/components/inputs.js +34 -54
- package/dist/playground/components/oauth-dialog.js +1 -2
- package/dist/playground/components/server-select.js +1 -2
- package/dist/playground/fetcher.d.ts +1 -2
- package/dist/playground/fetcher.js +1 -2
- package/dist/playground/get-default-values.js +1 -2
- package/dist/playground/index.d.ts +1 -2
- package/dist/playground/index.js +1 -2
- package/dist/playground/lazy.js +1 -2
- package/dist/playground/schema.d.ts +1 -2
- package/dist/playground/schema.js +1 -2
- package/dist/playground/status-info.js +1 -2
- package/dist/requests/generators/csharp.js +1 -2
- package/dist/requests/generators/curl.js +1 -2
- package/dist/requests/generators/go.js +1 -2
- package/dist/requests/generators/index.js +1 -2
- package/dist/requests/generators/java.js +1 -2
- package/dist/requests/generators/javascript.js +1 -2
- package/dist/requests/generators/python.js +1 -2
- package/dist/requests/media/adapter.d.ts +1 -2
- package/dist/requests/media/adapter.js +1 -2
- package/dist/requests/media/encode.d.ts +1 -2
- package/dist/requests/media/encode.js +1 -2
- package/dist/requests/media/resolve-adapter.js +1 -2
- package/dist/requests/string-utils.js +1 -2
- package/dist/requests/to-python-object.js +1 -2
- package/dist/requests/types.d.ts +1 -2
- package/dist/scalar/client.js +1 -2
- package/dist/scalar/index.d.ts +1 -2
- package/dist/scalar/index.js +1 -2
- package/dist/server/create.d.ts +1 -2
- package/dist/server/create.js +1 -2
- package/dist/server/proxy.d.ts +1 -2
- package/dist/server/proxy.js +1 -2
- package/dist/server/source-api.d.ts +1 -2
- package/dist/server/source-api.js +1 -2
- package/dist/types.d.ts +1 -2
- package/dist/ui/api-page.d.ts +1 -2
- package/dist/ui/api-page.js +1 -2
- package/dist/ui/client/index.d.ts +1 -2
- package/dist/ui/client/index.js +1 -2
- package/dist/ui/client/storage-key.js +1 -2
- package/dist/ui/components/accordion.js +1 -2
- package/dist/ui/components/dialog.js +1 -2
- package/dist/ui/components/input.js +1 -2
- package/dist/ui/components/method-label.js +1 -2
- package/dist/ui/components/select.js +1 -2
- package/dist/ui/contexts/api.js +1 -2
- package/dist/ui/contexts/api.lazy.js +1 -2
- package/dist/ui/operation/client.js +1 -2
- package/dist/ui/operation/index.js +1 -2
- package/dist/ui/operation/request-tabs.d.ts +1 -2
- package/dist/ui/operation/request-tabs.js +1 -2
- package/dist/ui/operation/response-tabs.d.ts +1 -2
- package/dist/ui/operation/response-tabs.js +1 -2
- package/dist/ui/operation/usage-tabs/client.js +1 -2
- package/dist/ui/operation/usage-tabs/index.d.ts +1 -2
- package/dist/ui/operation/usage-tabs/index.js +1 -2
- package/dist/ui/operation/usage-tabs/lazy.js +1 -2
- package/dist/ui/schema/client.d.ts +1 -2
- package/dist/ui/schema/client.js +34 -3
- package/dist/ui/schema/index.d.ts +6 -3
- package/dist/ui/schema/index.js +42 -25
- package/dist/ui/schema/lazy.js +1 -2
- package/dist/utils/deep-equal.js +1 -2
- package/dist/utils/get-typescript-schema.js +1 -2
- package/dist/utils/id-to-title.js +1 -2
- package/dist/utils/lazy.js +1 -2
- package/dist/utils/merge-schema.js +1 -2
- package/dist/utils/pages/builder.d.ts +1 -2
- package/dist/utils/pages/builder.js +1 -2
- package/dist/utils/pages/preset-auto.d.ts +1 -2
- package/dist/utils/pages/preset-auto.js +1 -2
- package/dist/utils/pages/to-body.js +1 -2
- package/dist/utils/pages/to-static-data.js +1 -2
- package/dist/utils/pages/to-text.d.ts +1 -2
- package/dist/utils/pages/to-text.js +1 -2
- package/dist/utils/process-document.d.ts +1 -2
- package/dist/utils/process-document.js +1 -2
- package/dist/utils/remove-undefined.js +1 -2
- package/dist/utils/schema-to-string.js +1 -2
- package/dist/utils/schema.d.ts +1 -2
- package/dist/utils/schema.js +1 -2
- package/dist/utils/url.js +1 -2
- package/dist/utils/use-query.js +1 -2
- package/package.json +10 -10
- package/dist/generate-file.d.ts.map +0 -1
- package/dist/generate-file.js.map +0 -1
- package/dist/playground/client.d.ts.map +0 -1
- package/dist/playground/client.js.map +0 -1
- package/dist/playground/components/inputs.js.map +0 -1
- package/dist/playground/components/oauth-dialog.js.map +0 -1
- package/dist/playground/components/server-select.js.map +0 -1
- package/dist/playground/fetcher.d.ts.map +0 -1
- package/dist/playground/fetcher.js.map +0 -1
- package/dist/playground/get-default-values.js.map +0 -1
- package/dist/playground/index.d.ts.map +0 -1
- package/dist/playground/index.js.map +0 -1
- package/dist/playground/lazy.js.map +0 -1
- package/dist/playground/schema.d.ts.map +0 -1
- package/dist/playground/schema.js.map +0 -1
- package/dist/playground/status-info.js.map +0 -1
- package/dist/requests/generators/csharp.js.map +0 -1
- package/dist/requests/generators/curl.js.map +0 -1
- package/dist/requests/generators/go.js.map +0 -1
- package/dist/requests/generators/index.js.map +0 -1
- package/dist/requests/generators/java.js.map +0 -1
- package/dist/requests/generators/javascript.js.map +0 -1
- package/dist/requests/generators/python.js.map +0 -1
- package/dist/requests/media/adapter.d.ts.map +0 -1
- package/dist/requests/media/adapter.js.map +0 -1
- package/dist/requests/media/encode.d.ts.map +0 -1
- package/dist/requests/media/encode.js.map +0 -1
- package/dist/requests/media/resolve-adapter.js.map +0 -1
- package/dist/requests/string-utils.js.map +0 -1
- package/dist/requests/to-python-object.js.map +0 -1
- package/dist/requests/types.d.ts.map +0 -1
- package/dist/scalar/client.js.map +0 -1
- package/dist/scalar/index.d.ts.map +0 -1
- package/dist/scalar/index.js.map +0 -1
- package/dist/server/create.d.ts.map +0 -1
- package/dist/server/create.js.map +0 -1
- package/dist/server/proxy.d.ts.map +0 -1
- package/dist/server/proxy.js.map +0 -1
- package/dist/server/source-api.d.ts.map +0 -1
- package/dist/server/source-api.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/ui/api-page.d.ts.map +0 -1
- package/dist/ui/api-page.js.map +0 -1
- package/dist/ui/client/index.d.ts.map +0 -1
- package/dist/ui/client/index.js.map +0 -1
- package/dist/ui/client/storage-key.js.map +0 -1
- package/dist/ui/components/accordion.js.map +0 -1
- package/dist/ui/components/dialog.js.map +0 -1
- package/dist/ui/components/input.js.map +0 -1
- package/dist/ui/components/method-label.js.map +0 -1
- package/dist/ui/components/select.js.map +0 -1
- package/dist/ui/contexts/api.js.map +0 -1
- package/dist/ui/contexts/api.lazy.js.map +0 -1
- package/dist/ui/operation/client.js.map +0 -1
- package/dist/ui/operation/index.js.map +0 -1
- package/dist/ui/operation/request-tabs.d.ts.map +0 -1
- package/dist/ui/operation/request-tabs.js.map +0 -1
- package/dist/ui/operation/response-tabs.d.ts.map +0 -1
- package/dist/ui/operation/response-tabs.js.map +0 -1
- package/dist/ui/operation/usage-tabs/client.js.map +0 -1
- package/dist/ui/operation/usage-tabs/index.d.ts.map +0 -1
- package/dist/ui/operation/usage-tabs/index.js.map +0 -1
- package/dist/ui/operation/usage-tabs/lazy.js.map +0 -1
- package/dist/ui/schema/client.d.ts.map +0 -1
- package/dist/ui/schema/client.js.map +0 -1
- package/dist/ui/schema/index.d.ts.map +0 -1
- package/dist/ui/schema/index.js.map +0 -1
- package/dist/ui/schema/lazy.js.map +0 -1
- package/dist/utils/deep-equal.js.map +0 -1
- package/dist/utils/get-typescript-schema.js.map +0 -1
- package/dist/utils/id-to-title.js.map +0 -1
- package/dist/utils/lazy.js.map +0 -1
- package/dist/utils/merge-schema.js.map +0 -1
- package/dist/utils/pages/builder.d.ts.map +0 -1
- package/dist/utils/pages/builder.js.map +0 -1
- package/dist/utils/pages/preset-auto.d.ts.map +0 -1
- package/dist/utils/pages/preset-auto.js.map +0 -1
- package/dist/utils/pages/to-body.js.map +0 -1
- package/dist/utils/pages/to-static-data.js.map +0 -1
- package/dist/utils/pages/to-text.d.ts.map +0 -1
- package/dist/utils/pages/to-text.js.map +0 -1
- package/dist/utils/process-document.d.ts.map +0 -1
- package/dist/utils/process-document.js.map +0 -1
- package/dist/utils/remove-undefined.js.map +0 -1
- package/dist/utils/schema-to-string.js.map +0 -1
- package/dist/utils/schema.d.ts.map +0 -1
- package/dist/utils/schema.js.map +0 -1
- package/dist/utils/url.js.map +0 -1
- package/dist/utils/use-query.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"request-tabs.d.ts","names":[],"sources":["../../../src/ui/operation/request-tabs.tsx"],"sourcesContent":[],"mappings":";;;;;;;UAiBiB,kBAAA;;;EAAA,WAAA,CAAA,EAAA,MAAA;QAIT;WACG"}
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"response-tabs.d.ts","names":[],"sources":["../../../src/ui/operation/response-tabs.tsx"],"sourcesContent":[],"mappings":";;;;;UAaiB,WAAA;;AAAjB;;EAMY,IAAA,EAAA,MAAA;EAMC,QAAA,EAND,WAMC,CANW,cAMX,CAAA;EAAe;AAC3B;;;aADY;;UAGH,eAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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":";;;;;;;;;;AAkBA,MAAM,UAAU,cASN,KAAK;AAEf,SAAgB,kBAAkB,EAChC,OACA,UACA,kBACA,YAMC;CACD,MAAM,CAAC,SAAS,cAAc,eAAe,oBAAoB,SAAS,GAAG,EAAE,EAAE,GAAG;CACpF,MAAM,YAAY,OAAgC,EAAE,CAAC;AAErD,QACE,oBAAC;EACC,OAAO,eACE;GACL;GACA;GACA,aAAa,WAAmB;IAC9B,MAAMA,YAAU,SAAS,MAAM,cAAYA,UAAQ,OAAO,OAAO;AACjE,QAAI,CAACA,UAAS;AAEd,eAAW,OAAO;AAClB,SAAK,MAAM,YAAY,UAAU,QAC/B,UAASA,UAAQ,MAAMA,UAAQ,QAAQ;;GAG3C;GACA,eAAe,MAAM,SAAS;AAC5B,SAAK,MAAM,QAAQ,SACjB,KAAI,KAAK,OAAO,SAAS;AAEvB,UAAK,OAAO;AACZ,UAAK,UAAU;AACf;;AAIJ,SAAK,MAAM,YAAY,UAAU,QAC/B,UAAS,MAAM,QAAQ;;GAG3B,eAAe,UAAU;AACvB,cAAU,UAAU,UAAU,QAAQ,QAAQ,SAAS,SAAS,SAAS;;GAE3E,YAAY,UAAU;IAGpB,MAAM,SAAS,SAAS,MAAM,SAAS,KAAK,OAAO,QAAQ;AAE3D,aAAS,OAAO,MAAM,OAAO,QAAQ;AACrC,cAAU,QAAQ,KAAK,SAAS;;GAEnC,GACD;GAAC;GAAS;GAAO;GAAS,CAC3B;EAEA;GACO;;AAId,SAAgB,qBAAqB;AACnC,QAAO,IAAI,QAAQ;;AAGrB,SAAgB,oBAAoB;CAClC,MAAM,EAAE,SAAS,KAAK,YAAY,QAAQ,aAAa,oBAAoB;CAC3E,MAAM,EAAE,oBAAoB,aAAa,eAAe,CAAC,OAAO,aAAa,EAAE;AAE/E,KAAI,SACF,QAAO,oBAAC;EAAS,OAAO;EAAU,OAAO;EAAK,eAAe;GAAU;CAGzE,SAAS,WAAW,MAA0B;AAC5C,SACE,qBAAC,oBACC,oBAAC;GAAK,WAAU;aAAuB,KAAK;IAAY,EACxD,oBAAC;GAAK,WAAU;aAA4B,KAAK;IAAmB,IAChE;;AAIV,KAAI,SAAS,WAAW,EAAG,QAAO;CAClC,MAAM,WAAW,SAAS,MAAM,SAAS,KAAK,OAAO,IAAI;AACzD,QACE,qBAAC;EAAO,OAAO;EAAK,eAAe;aACjC,oBAAC;GAAc,WAAU;aACtB,YAAY,oBAAC;IAAY;cAAS,WAAW,SAAS;KAAe;IACxD,EAChB,oBAAC,2BACE,SAAS,KAAK,SACb,oBAAC;GAAyB,OAAO,KAAK;aACnC,WAAW,KAAK;KADF,KAAK,GAET,CACb,GACY;GACT;;AAIb,SAAgB,SAAS,QAA4B;CACnD,MAAM,EAAE,cAAc,kBAAkB,eAAe;CACvD,MAAM,EACJ,UACA,SAAS,mBACT,OACA,aACA,mBACE,oBAAoB;CACxB,MAAM,EAAE,WAAW,wBAAwB;CAC3C,MAAM,CAAC,MAAM,WAAW,eAChB,SAAS,MAAM,YAAY,QAAQ,OAAO,kBAAkB,EAAE,QACrE;AAED,iBAAgB;EACd,MAAM,YAAmC,GAAG,YAAY,QAAQ,QAAQ;AAExE,cAAY,SAAS;AACrB,eAAa;AACX,kBAAe,SAAS;;IAEzB,CAAC,aAAa,eAAe,CAAC;CAEjC,MAAM,OAAO,cAAc;AACzB,MAAI,CAAC,OAAO,UAAU,CAAC,KAAM;AAC7B,MAAI,OAAO,OAAO,WAAW,SAAU,QAAO,OAAO;AAErD,SAAO,OAAO,OACZ,QACE,SACE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU,GAAG,KAC1D,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS,kBAC1D,EACD,mBAAmB,OAAO,KAAK,CAChC,EACD,MACA;GACE,QAAQ,OAAO;GACf;GACD,CACF;IACA;EAAC;EAAe;EAAQ;EAAQ;EAAO;EAAK,CAAC;AAEhD,KAAI,CAAC,QAAQ,CAAC,OAAQ,QAAO;AAE7B,QAAO,oBAAC;EAAiB,MAAM,OAAO;EAAY;EAAM,SAAS;GAAgB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../../src/ui/operation/usage-tabs/index.tsx"],"sourcesContent":[],"mappings":";;;;;;;;AAeiB,UAAA,kBAAkB,CAAA,IAAA,OAAA,CAAA,CAAA;EAUC,EAAA,EAAA,MAAA;EAAhB,IAAA,EAAA,MAAA;EAKF,KAAA,CAAA,EAAA,MAAA;EAAC;;;;;;oBALC,gBAAgB;;;;kBAKlB"}
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lazy.js","names":[],"sources":["../../../../src/ui/operation/usage-tabs/lazy.tsx"],"sourcesContent":["'use client';\nimport { wrapLazy } from '../../../utils/lazy';\n\nexport const UsageTabsSelectorLazy = wrapLazy(() =>\n import('./client').then((mod) => ({ default: mod.UsageTabsSelector })),\n);\n\nexport const UsageTabLazy = wrapLazy(() =>\n import('./client').then((mod) => ({ default: mod.UsageTab })),\n);\n\nexport const UsageTabsProviderLazy = wrapLazy(() =>\n import('./client').then((mod) => ({ default: mod.UsageTabsProvider })),\n);\n"],"mappings":";;;;;AAGA,MAAa,wBAAwB,eACnC,OAAO,eAAY,MAAM,SAAS,EAAE,SAAS,IAAI,mBAAmB,EAAE,CACvE;AAED,MAAa,eAAe,eAC1B,OAAO,eAAY,MAAM,SAAS,EAAE,SAAS,IAAI,UAAU,EAAE,CAC9D;AAED,MAAa,wBAAwB,eACnC,OAAO,eAAY,MAAM,SAAS,EAAE,SAAS,IAAI,mBAAmB,EAAE,CACvE"}
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["path"],"sources":["../../../src/ui/schema/client.tsx"],"sourcesContent":["'use client';\nimport {\n createContext,\n Fragment,\n type ReactNode,\n use,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from 'fumadocs-ui/components/tabs';\nimport type { SchemaUIGeneratedData } from '@/ui/schema';\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from 'fumadocs-ui/components/ui/collapsible';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport { ChevronDown } from 'lucide-react';\nimport { Badge } from '@/ui/components/method-label';\nimport { Popover, PopoverContent, PopoverTrigger } from 'fumadocs-ui/components/ui/popover';\nimport { cn } from '@/utils/cn';\nimport { cva } from 'class-variance-authority';\n\ntype DataContextType = SchemaUIGeneratedData;\n\ninterface PopoverContextType {\n renderTrigger: (props: { pathName: ReactNode; $ref: string; children: ReactNode }) => ReactNode;\n}\n\nconst typeVariants = cva('text-sm text-start text-fd-muted-foreground font-mono', {\n variants: {\n variant: {\n trigger:\n 'underline hover:text-fd-accent-foreground data-[state=open]:text-fd-accent-foreground',\n },\n },\n});\n\nconst PopoverContext = createContext<PopoverContextType>({\n renderTrigger: (props) => <RootPopoverTrigger {...props} />,\n});\n\nconst DataContext = createContext<DataContextType | null>(null);\n\nfunction useData() {\n return use(DataContext)!;\n}\n\nfunction usePopover() {\n return use(PopoverContext);\n}\n\nexport interface SchemaUIProps {\n name: string;\n required?: boolean;\n as?: 'property' | 'body';\n\n generated: SchemaUIGeneratedData;\n}\n\nexport function SchemaUI({ name, required = false, as = 'property', generated }: SchemaUIProps) {\n return (\n <DataContext value={generated}>\n <SchemaUIProperty\n name={name}\n $type={generated.$root}\n overrides={{\n required,\n }}\n variant={\n as === 'property' || generated.refs[generated.$root].type === 'primitive'\n ? 'default'\n : 'expand'\n }\n />\n </DataContext>\n );\n}\n\nfunction SchemaUIProperty({\n name,\n $type,\n variant = 'default',\n overrides,\n}: {\n name: ReactNode;\n $type: string;\n variant?: 'default' | 'expand';\n overrides?: Partial<PropertyProps>;\n}) {\n const { refs } = useData();\n const schema = refs[$type];\n const renderRef = useRenderRef();\n let type: ReactNode = schema.typeName;\n\n if ((schema.type === 'or' || schema.type === 'and') && schema.items.length > 0) {\n if (variant === 'expand')\n return (\n <Tabs defaultValue={schema.items[0].$type}>\n <TabsList>\n {schema.items.map((item) => (\n <TabsTrigger key={item.$type} value={item.$type}>\n {item.name}\n </TabsTrigger>\n ))}\n </TabsList>\n {schema.items.map((item) => (\n <TabsContent\n key={item.$type}\n value={item.$type}\n forceMount={undefined}\n className=\"py-0\"\n >\n <SchemaUIProperty {...item} variant=\"expand\" />\n </TabsContent>\n ))}\n </Tabs>\n );\n type = renderRef({\n pathName: name,\n $ref: $type,\n });\n } else if (schema.type === 'object' && schema.props.length > 0) {\n if (variant === 'expand')\n return schema.props.map((prop) => (\n <SchemaUIProperty\n key={prop.name}\n name={prop.name}\n $type={prop.$type}\n overrides={{ required: prop.required }}\n />\n ));\n type = renderRef({\n pathName: name,\n $ref: $type,\n });\n } else if (schema.type === 'array') {\n if (variant === 'expand')\n return (\n <Collapsible className=\"my-2\">\n <CollapsibleTrigger\n className={cn(\n buttonVariants({ color: 'secondary', size: 'sm' }),\n 'group px-3 py-2 data-[state=open]:rounded-b-none',\n )}\n >\n Array Item\n <ChevronDown className=\"size-4 text-fd-muted-foreground group-data-[state=open]:rotate-180\" />\n </CollapsibleTrigger>\n <CollapsibleContent className=\"-mt-px bg-fd-card px-3 rounded-lg rounded-tl-none border shadow-sm\">\n <SchemaUIProperty name=\"\" $type={schema.item.$type} variant=\"expand\" />\n </CollapsibleContent>\n </Collapsible>\n );\n\n type = renderRef({\n pathName: name,\n $ref: $type,\n });\n }\n\n const child = (\n <>\n {schema.description}\n {schema.infoTags && schema.infoTags.length > 0 && (\n <div className=\"flex flex-row gap-2 flex-wrap my-2 not-prose empty:hidden\">\n {schema.infoTags.map((tag, i) => (\n <Fragment key={i}>{tag}</Fragment>\n ))}\n </div>\n )}\n </>\n );\n if (variant === 'expand') return child;\n return (\n <Property name={name} type={type} deprecated={schema.deprecated} {...overrides}>\n {child}\n </Property>\n );\n}\n\nfunction SchemaUIPopover({ initialPath }: { initialPath: { name: ReactNode; $ref?: string }[] }) {\n const [path, setPath] = useState(initialPath);\n const ref = useRef<HTMLDivElement>(null);\n const last = path.findLast((item) => item.$ref !== undefined);\n\n useEffect(() => {\n const element = ref.current;\n if (!element || !element.parentElement) return;\n\n // reset scroll\n element.parentElement.scrollTop = 0;\n }, [last?.$ref]);\n\n const context: PopoverContextType = useMemo(\n () => ({\n renderTrigger: ({ $ref, pathName, children }) => (\n <button\n className={cn(typeVariants({ variant: 'trigger' }))}\n onClick={() => setPath((path) => [...path, { name: pathName, $ref }])}\n >\n {children}\n </button>\n ),\n }),\n [],\n );\n\n if (!last) return;\n\n return (\n <>\n <div className=\"sticky top-0 flex flex-row flex-wrap items-center text-sm font-medium font-mono bg-fd-muted p-2\">\n {path.map((item, i) => {\n const isDuplicated = path.some((other, j) => j < i && other.$ref === item.$ref);\n const className = cn(\n isDuplicated && 'text-orange-400',\n item.$ref && 'hover:underline hover:text-fd-accent-foreground',\n );\n const node = item.$ref ? (\n <button onClick={() => setPath((path) => path.slice(0, i + 1))} className={className}>\n {item.name}\n </button>\n ) : (\n <span className={className}>{item.name}</span>\n );\n\n return (\n <Fragment key={i}>\n {i > 0 && '.'}\n {node}\n </Fragment>\n );\n })}\n </div>\n <PopoverContext value={context}>\n <div ref={ref} className=\"px-2\">\n <SchemaUIProperty name=\"\" $type={last.$ref!} variant=\"expand\" />\n </div>\n </PopoverContext>\n </>\n );\n}\n\nfunction useRenderRef() {\n const { refs } = useData();\n const { renderTrigger } = usePopover();\n return function renderRef({\n pathName,\n $ref,\n text,\n }: {\n pathName: ReactNode;\n $ref: string;\n text?: ReactNode;\n }) {\n const schema = refs[$ref];\n\n if (schema.type === 'and' || schema.type === 'or') {\n const sep = schema.type === 'and' ? '&' : '|';\n return (\n <span className={cn(typeVariants(), 'flex flex-row gap-2 items-center flex-wrap')}>\n {schema.items.map((item, i) => (\n <Fragment key={item.$type}>\n {i > 0 && <span>{sep}</span>}\n {renderRef({ pathName, text: item.name, $ref: item.$type })}\n </Fragment>\n ))}\n </span>\n );\n }\n\n if (schema.type === 'array') {\n return (\n <span className={cn(typeVariants(), 'flex flex-row items-center flex-wrap')}>\n {'array<'}\n {renderRef({ pathName: <>{pathName}[]</>, $ref: schema.item.$type })}\n {'>'}\n </span>\n );\n }\n\n return renderTrigger({ $ref, pathName, children: text ?? schema.aliasName });\n };\n}\n\nfunction RootPopoverTrigger({\n $ref,\n pathName,\n children,\n}: {\n pathName: ReactNode;\n $ref: string;\n children: ReactNode;\n}) {\n const ref = useCallback((element: HTMLDivElement | null) => {\n if (!element || element.style.getPropertyValue('--initial-height')) return;\n\n element.style.setProperty('--initial-height', `${element.clientHeight}px`);\n }, []);\n\n return (\n <Popover>\n <PopoverTrigger className={cn(typeVariants({ variant: 'trigger' }))}>\n {children}\n </PopoverTrigger>\n <PopoverContent ref={ref} className=\"w-[600px] min-h-(--initial-height,0) max-h-[460px] p-0\">\n <SchemaUIPopover\n initialPath={[\n {\n name: pathName,\n $ref: $ref,\n },\n ]}\n />\n </PopoverContent>\n </Popover>\n );\n}\n\ninterface PropertyProps {\n name: ReactNode;\n type: ReactNode;\n required?: boolean;\n deprecated?: boolean;\n nested?: boolean;\n\n children?: ReactNode;\n className?: string;\n}\n\nfunction Property({\n name,\n type,\n required,\n deprecated,\n nested = false,\n className,\n ...props\n}: PropertyProps) {\n return (\n <div\n className={cn(\n 'text-sm border-t',\n nested\n ? 'p-3 border-x bg-fd-card last:rounded-b-xl first:rounded-tr-xl last:border-b'\n : 'py-4 first:border-t-0',\n className,\n )}\n >\n <div className=\"flex flex-wrap items-center gap-3 not-prose\">\n <span className=\"font-medium font-mono text-fd-primary\">\n {name}\n {required ? (\n <span className=\"text-red-400\">*</span>\n ) : (\n <span className=\"text-fd-muted-foreground\">?</span>\n )}\n </span>\n {typeof type === 'string' ? (\n <span className=\"text-sm font-mono text-fd-muted-foreground\">{type}</span>\n ) : (\n type\n )}\n {deprecated && (\n <Badge color=\"yellow\" className=\"ms-auto text-xs\">\n Deprecated\n </Badge>\n )}\n </div>\n <div className=\"prose-no-margin pt-2.5 empty:hidden\">{props.children}</div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/ui/schema/index.tsx"],"sourcesContent":[],"mappings":";;;;;;;UAQiB,SAAA;gBACD;aACH;EAFI,QAAA,EAAA,MAAS;EAUd,SAAA,EAAA,MAAU;EAmCL,UAAA,CAAA,EAAA,OAAe;;AAEjB,KArCH,UAAA,GAAa,SAqCV,GAAA,CAAA;EAAL,IAAA,EAAA,WAAA;CAAI,GAAA;EAYG,IAAA,EAAA,QAAA;;;;;;;;;;;;;;;;;;;;;;;;UAdA,eAAA;QACT;UACE,KAAK;;;;;;;;;;UAYE,qBAAA;;QAET,eAAe"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/ui/schema/index.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { ResolvedSchema } from '@/utils/schema';\nimport type { RenderContext } from '@/types';\nimport { FormatFlags, schemaToString } from '@/utils/schema-to-string';\nimport { mergeAllOf } from '@/utils/merge-schema';\nimport type { SchemaUIProps } from '@/ui/schema/client';\nimport { SchemaUILazy } from '@/ui/schema/lazy';\n\nexport interface FieldBase {\n description?: ReactNode;\n infoTags?: ReactNode[];\n\n typeName: string;\n aliasName: string;\n\n deprecated?: boolean;\n}\n\nexport type SchemaData = FieldBase &\n (\n | {\n type: 'primitive';\n }\n | {\n type: 'object';\n props: {\n name: string;\n $type: string;\n required: boolean;\n }[];\n }\n | {\n type: 'array';\n item: {\n $type: string;\n };\n }\n | {\n type: 'or';\n items: {\n name: string;\n $type: string;\n }[];\n }\n | {\n type: 'and';\n items: {\n name: string;\n $type: string;\n }[];\n }\n );\n\nexport interface SchemaUIOptions {\n root: ResolvedSchema;\n client: Omit<SchemaUIProps, 'generated'>;\n\n /**\n * include read only props\n */\n readOnly?: boolean;\n /**\n * include write only props\n */\n writeOnly?: boolean;\n}\n\nexport interface SchemaUIGeneratedData {\n $root: string;\n refs: Record<string, SchemaData>;\n}\n\nexport function Schema({\n ctx,\n ...options\n}: SchemaUIOptions & {\n ctx: RenderContext;\n}) {\n if (ctx.schemaUI?.render) {\n return ctx.schemaUI.render(options, ctx);\n }\n\n return <SchemaUILazy {...options.client} generated={generateSchemaUI(options, ctx)} />;\n}\n\nexport function generateSchemaUI(\n { root, readOnly, writeOnly }: SchemaUIOptions,\n ctx: RenderContext,\n): SchemaUIGeneratedData {\n const refs: Record<string, SchemaData> = {};\n const { showExample = false } = ctx.schemaUI ?? {};\n\n function generateInfoTags(schema: Exclude<ResolvedSchema, boolean>) {\n const fields: ReactNode[] = [];\n\n function field(key: string, value: ReactNode) {\n return (\n <div className=\"bg-fd-secondary border rounded-lg text-xs p-1.5 shadow-md\">\n <span className=\"font-medium me-2\">{key}</span>\n <code className=\"text-fd-muted-foreground\">{value}</code>\n </div>\n );\n }\n\n if (schema.default !== undefined) {\n fields.push(field('Default', JSON.stringify(schema.default)));\n }\n\n if (schema.pattern) {\n fields.push(field('Match', schema.pattern));\n }\n\n if (schema.format) {\n fields.push(field('Format', schema.format));\n }\n\n if (schema.multipleOf) {\n fields.push(field('Multiple Of', schema.multipleOf));\n }\n\n let range = formatRange(\n 'value',\n schema.minimum,\n schema.exclusiveMinimum,\n schema.maximum,\n schema.exclusiveMaximum,\n );\n if (range) fields.push(field('Range', range));\n\n range = formatRange('length', schema.minLength, undefined, schema.maxLength, undefined);\n if (range) fields.push(field('Length', range));\n\n range = formatRange(\n 'properties',\n schema.minProperties,\n undefined,\n schema.maxProperties,\n undefined,\n );\n if (range) fields.push(field('Properties', range));\n\n range = formatRange('items', schema.minItems, undefined, schema.maxItems, undefined);\n if (range) fields.push(field('Items', range));\n\n if (schema.enum) {\n fields.push(field('Value in', schema.enum.map((value) => JSON.stringify(value)).join(' | ')));\n }\n\n if (showExample && schema.examples) {\n for (const example of schema.examples) {\n fields.push(field('Example', JSON.stringify(example, null, 2)));\n }\n }\n\n return fields;\n }\n\n let _counter = 0;\n const autoIds = new WeakMap();\n function getSchemaId(schema: ResolvedSchema) {\n if (typeof schema === 'boolean') return String(schema);\n const raw = ctx.schema.getRawRef(schema);\n if (raw) return raw;\n\n const prev = autoIds.get(schema);\n if (prev) return prev;\n\n const generated = `__${_counter++}`;\n autoIds.set(schema, generated);\n return generated;\n }\n\n function isVisible(schema: ResolvedSchema): boolean {\n if (typeof schema === 'boolean') return true;\n if (schema.writeOnly) return writeOnly ?? false;\n if (schema.readOnly) return readOnly ?? false;\n return true;\n }\n\n function base(schema: ResolvedSchema): FieldBase {\n if (typeof schema === 'boolean') {\n const name = schema ? 'any' : 'never';\n return {\n typeName: name,\n aliasName: name,\n };\n }\n\n return {\n description: schema.description && ctx.renderMarkdown(schema.description),\n infoTags: generateInfoTags(schema),\n typeName: schemaToString(schema, ctx.schema),\n aliasName: schemaToString(schema, ctx.schema, FormatFlags.UseAlias),\n deprecated: schema.deprecated,\n };\n }\n\n function scanRefs(id: string, schema: ResolvedSchema) {\n if (id in refs) return;\n if (typeof schema === 'boolean') {\n refs[id] = {\n type: 'primitive',\n ...base(schema),\n };\n return;\n }\n\n if (Array.isArray(schema.type)) {\n const out: SchemaData = {\n type: 'or',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n\n for (const type of schema.type) {\n const key = `${id}_type:${type}`;\n scanRefs(key, {\n ...schema,\n type,\n });\n out.items.push({\n name: type,\n $type: key,\n });\n }\n return;\n }\n\n if (schema.oneOf && schema.anyOf) {\n const out: SchemaData = {\n type: 'and',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n for (const omit of ['anyOf', 'oneOf'] as const) {\n const $type = `${id}_omit:${omit}`;\n scanRefs($type, { ...schema, [omit]: undefined });\n\n out.items.push({\n name: refs[$type].aliasName,\n $type,\n });\n }\n return;\n }\n\n // display both `oneOf` & `anyOf` as OR for simplified overview\n const union = schema.oneOf ?? schema.anyOf;\n if (union) {\n const out: SchemaData = {\n type: 'or',\n items: [],\n ...base(schema),\n };\n refs[id] = out;\n\n for (const item of union) {\n if (typeof item !== 'object' || !isVisible(item)) continue;\n const itemId = getSchemaId(item);\n const key = `${id}_extends:${itemId}`;\n\n scanRefs(key, {\n ...schema,\n oneOf: undefined,\n anyOf: undefined,\n ...item,\n properties: {\n ...schema.properties,\n ...item.properties,\n },\n });\n out.items.push({\n $type: key,\n name: refs[itemId]?.aliasName ?? schemaToString(item, ctx.schema, FormatFlags.UseAlias),\n });\n }\n return;\n }\n\n if (schema.allOf) {\n scanRefs(id, mergeAllOf(schema));\n return;\n }\n\n if (schema.type === 'object') {\n const out: SchemaData = {\n type: 'object',\n props: [],\n ...base(schema),\n };\n refs[id] = out;\n\n const { properties = {}, patternProperties, additionalProperties } = schema;\n const props = Object.entries(properties);\n if (patternProperties) props.push(...Object.entries(patternProperties));\n\n for (const [key, prop] of props) {\n if (!isVisible(prop)) continue;\n const $type = getSchemaId(prop);\n scanRefs($type, prop);\n out.props.push({\n $type,\n name: key,\n required: schema.required?.includes(key) ?? false,\n });\n }\n\n if (additionalProperties !== undefined && isVisible(additionalProperties)) {\n const $type = getSchemaId(additionalProperties);\n scanRefs($type, additionalProperties);\n\n out.props.push({\n $type,\n name: '[key: string]',\n required: false,\n });\n }\n return;\n }\n\n if (schema.type === 'array') {\n const items = schema.items ?? true;\n const $type = getSchemaId(items);\n\n refs[id] = {\n type: 'array',\n item: {\n $type,\n },\n ...base(schema),\n };\n scanRefs($type, items);\n return;\n }\n\n refs[id] = {\n type: 'primitive',\n ...base(schema),\n };\n }\n\n const $root = getSchemaId(root);\n scanRefs($root, root);\n return {\n refs,\n $root,\n };\n}\n\nfunction formatRange(\n value: string,\n min: number | undefined,\n exclusiveMin: number | undefined,\n max: number | undefined,\n exclusiveMax: number | undefined,\n) {\n const out: string[] = [];\n if (min !== undefined) {\n out.push(`${min} <=`);\n } else if (exclusiveMin !== undefined) {\n out.push(`${exclusiveMin} <`);\n }\n\n out.push(value);\n if (max !== undefined) {\n out.push(`<= ${max}`);\n } else if (exclusiveMax !== undefined) {\n out.push(`< ${exclusiveMax}`);\n }\n if (out.length > 1) return out.join(' ');\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lazy.js","names":[],"sources":["../../../src/ui/schema/lazy.ts"],"sourcesContent":["'use client';\nimport { wrapLazy } from '../../utils/lazy';\n\nexport const SchemaUILazy = wrapLazy(() =>\n import('./client').then((mod) => ({ default: mod.SchemaUI })),\n);\n"],"mappings":";;;;;AAGA,MAAa,eAAe,eAC1B,OAAO,eAAY,MAAM,SAAS,EAAE,SAAS,IAAI,UAAU,EAAE,CAC9D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deep-equal.js","names":[],"sources":["../../src/utils/deep-equal.ts"],"sourcesContent":["export function deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) {\n return true;\n }\n\n if (a == null || b == null) {\n return false;\n }\n\n if (typeof a !== 'object' || typeof b !== 'object') {\n return false;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n return a.every((item, index) => deepEqual(item, b[index]));\n }\n\n if (Array.isArray(a) || Array.isArray(b)) {\n return false;\n }\n\n const keysA = Object.keys(a as object);\n const keysB = Object.keys(b as object);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n return keysA.every(\n (key) =>\n Object.prototype.hasOwnProperty.call(b, key) &&\n deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key]),\n );\n}\n"],"mappings":";AAAA,SAAgB,UAAU,GAAY,GAAqB;AACzD,KAAI,MAAM,EACR,QAAO;AAGT,KAAI,KAAK,QAAQ,KAAK,KACpB,QAAO;AAGT,KAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SACxC,QAAO;AAGT,KAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,EAAE;AACxC,MAAI,EAAE,WAAW,EAAE,OACjB,QAAO;AAET,SAAO,EAAE,OAAO,MAAM,UAAU,UAAU,MAAM,EAAE,OAAO,CAAC;;AAG5D,KAAI,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,CACtC,QAAO;CAGT,MAAM,QAAQ,OAAO,KAAK,EAAY;CACtC,MAAM,QAAQ,OAAO,KAAK,EAAY;AAEtC,KAAI,MAAM,WAAW,MAAM,OACzB,QAAO;AAGT,QAAO,MAAM,OACV,QACC,OAAO,UAAU,eAAe,KAAK,GAAG,IAAI,IAC5C,UAAW,EAA8B,MAAO,EAA8B,KAAK,CACtF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-typescript-schema.js","names":[],"sources":["../../src/utils/get-typescript-schema.ts"],"sourcesContent":["import type { SchemaObject } from 'ajv';\nimport type { RenderContext } from '@/types';\n\nexport async function getTypescriptSchema(\n schema: SchemaObject,\n ctx: RenderContext,\n): Promise<string | undefined> {\n const { compile } = await import('@fumari/json-schema-to-typescript');\n\n try {\n const input = structuredClone({\n schema,\n idToSchema: ctx.schema._internal_idToSchema(),\n });\n\n const schemaToId = new WeakMap<object, string>();\n\n for (const [k, v] of input.idToSchema) {\n schemaToId.set(v, k);\n }\n\n return await compile(input.schema, 'Response', {\n enableConstEnums: false,\n schemaToId,\n });\n } catch (e) {\n console.warn('Failed to generate typescript schema:', e);\n }\n}\n"],"mappings":";AAGA,eAAsB,oBACpB,QACA,KAC6B;CAC7B,MAAM,EAAE,YAAY,MAAM,OAAO;AAEjC,KAAI;EACF,MAAM,QAAQ,gBAAgB;GAC5B;GACA,YAAY,IAAI,OAAO,sBAAsB;GAC9C,CAAC;EAEF,MAAM,6BAAa,IAAI,SAAyB;AAEhD,OAAK,MAAM,CAAC,GAAG,MAAM,MAAM,WACzB,YAAW,IAAI,GAAG,EAAE;AAGtB,SAAO,MAAM,QAAQ,MAAM,QAAQ,YAAY;GAC7C,kBAAkB;GAClB;GACD,CAAC;UACK,GAAG;AACV,UAAQ,KAAK,yCAAyC,EAAE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"id-to-title.js","names":[],"sources":["../../src/utils/id-to-title.ts"],"sourcesContent":["export function idToTitle(id: string): string {\n let result: string[] = [];\n\n for (const c of id) {\n if (result.length === 0) result.push(c.toLocaleUpperCase());\n // ignore the other parts surrounded with '.', like 'migrations.dev' -> 'dev'\n else if (c === '.') result = [];\n else if (/^[A-Z]$/.test(c) && result.at(-1) !== ' ') result.push(' ', c);\n else if (c === '-') result.push(' ');\n else result.push(c);\n }\n\n return result.join('');\n}\n"],"mappings":";AAAA,SAAgB,UAAU,IAAoB;CAC5C,IAAI,SAAmB,EAAE;AAEzB,MAAK,MAAM,KAAK,GACd,KAAI,OAAO,WAAW,EAAG,QAAO,KAAK,EAAE,mBAAmB,CAAC;UAElD,MAAM,IAAK,UAAS,EAAE;UACtB,UAAU,KAAK,EAAE,IAAI,OAAO,GAAG,GAAG,KAAK,IAAK,QAAO,KAAK,KAAK,EAAE;UAC/D,MAAM,IAAK,QAAO,KAAK,IAAI;KAC/B,QAAO,KAAK,EAAE;AAGrB,QAAO,OAAO,KAAK,GAAG"}
|
package/dist/utils/lazy.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lazy.js","names":[],"sources":["../../src/utils/lazy.tsx"],"sourcesContent":["import { type ComponentType, lazy } from 'react';\n\n// Waku wraps all export functions of a \"use client\" file in `React.lazy`, but `lazy(lazy(() => ...))` causes error.\n// we wrap another layer of component such that it is valid\n// TODO: perhaps we can remove it once Waku migrated to vite-rsc\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- type infer\nexport function wrapLazy<T extends ComponentType<any>>(load: () => Promise<{ default: T }>): T {\n const V = lazy(load);\n\n return function wrapper(props) {\n return <V {...props} />;\n } as T;\n}\n"],"mappings":";;;;AAMA,SAAgB,SAAuC,MAAwC;CAC7F,MAAM,IAAI,KAAK,KAAK;AAEpB,QAAO,SAAS,QAAQ,OAAO;AAC7B,SAAO,oBAAC,KAAE,GAAI,QAAS"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"merge-schema.js","names":[],"sources":["../../src/utils/merge-schema.ts"],"sourcesContent":["import { type ParsedSchema } from '@/utils/schema';\nimport { deepEqual } from './deep-equal';\n\n/**\n * Merge `allOf` object schema\n */\nexport function mergeAllOf(schema: ParsedSchema): ParsedSchema {\n if (typeof schema === 'boolean' || !schema.allOf) return schema;\n\n const { allOf, ...rest } = schema;\n let result: ParsedSchema = rest;\n for (const item of allOf) {\n result = intersection(result, item);\n }\n return result;\n}\n\nexport function intersection(a: ParsedSchema, b: ParsedSchema): ParsedSchema {\n a = mergeAllOf(a);\n b = mergeAllOf(b);\n if (typeof a === 'boolean' && typeof b === 'boolean') return a && b;\n if (typeof a === 'boolean') return a;\n if (typeof b === 'boolean') return b;\n\n const result: ParsedSchema = { ...a };\n for (const _k in b) {\n const key = _k as keyof typeof b;\n\n switch (key) {\n case '$id':\n case '$comment':\n case 'description':\n case 'additionalItems':\n case 'examples':\n case 'allOf':\n case 'writeOnly':\n case 'readOnly':\n // ignored\n break;\n case 'title': {\n const value = b[key];\n if (value === undefined) break;\n if (result[key]) {\n result[key] = `${result[key]} & ${value}`;\n } else {\n result[key] = value;\n }\n break;\n }\n case 'minItems':\n case 'minimum':\n case 'exclusiveMinimum':\n case 'minProperties':\n case 'minContains':\n case 'minLength': {\n const value = b[key];\n if (value === undefined) break;\n result[key] = result[key] === undefined ? value : Math.max(result[key], value);\n break;\n }\n case 'maxContains':\n case 'maxItems':\n case 'maxLength':\n case 'maxProperties':\n case 'maximum':\n case 'exclusiveMaximum': {\n const value = b[key];\n if (value === undefined) break;\n result[key] = result[key] === undefined ? value : Math.min(result[key], value);\n break;\n }\n // intersection\n case 'enum':\n case 'anyOf':\n case 'oneOf': {\n const value = b[key];\n if (value === undefined) break;\n\n result[key] = result[key] === undefined ? value : intersectArray(result[key], value);\n break;\n }\n // require same\n case 'format':\n case 'const':\n case 'type': {\n const value = b[key];\n if (value === undefined) break;\n result[key] ??= value;\n\n if (!deepEqual(result[key], value)) return false;\n break;\n }\n // add\n case 'required': {\n const value = b[key];\n if (value === undefined) break;\n result[key] = [...(result[key] ?? []), ...value];\n break;\n }\n case 'properties':\n case 'patternProperties': {\n const value = b[key];\n if (value === undefined) break;\n\n if (result[key] === undefined) {\n result[key] = value;\n break;\n }\n\n const out: Record<string, ParsedSchema> = {};\n const allProps = new Set<string>();\n for (const k in result[key]) allProps.add(k);\n for (const k in value) allProps.add(k);\n\n for (const prop of allProps) {\n const aProp = result[key][prop];\n const bProp = value[prop];\n if (aProp === undefined) {\n out[prop] = bProp;\n } else if (bProp === undefined) {\n out[prop] = aProp;\n } else {\n out[prop] = intersection(aProp, bProp);\n }\n }\n\n result[key] = out;\n break;\n }\n case 'additionalProperties':\n case 'contains':\n case 'items': {\n const value = b[key];\n if (value === undefined) break;\n\n result[key] = result[key] === undefined ? value : intersection(result[key], value);\n break;\n }\n case 'not': {\n const value = b[key];\n if (value === undefined) break;\n\n if (result[key] && value) {\n result.not = { anyOf: [result[key], value] };\n } else if (value) {\n result.not = value;\n }\n break;\n }\n default:\n result[key] = b[key];\n }\n }\n\n return result;\n}\n\nfunction intersectArray<T>(a: readonly T[], b: readonly T[]): T[] {\n const out = new Set<T>();\n for (const item of a) {\n if (b.includes(item)) out.add(item);\n }\n for (const item of b) {\n if (a.includes(item)) out.add(item);\n }\n return Array.from(out);\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","names":[],"sources":["../../../src/utils/pages/builder.ts"],"sourcesContent":[],"mappings":";;;;;;;;UAQU,SAAA;;;EAAA,IAAA,EAAA;IASO,KAAA,EAAA,MAAA;IAKA,WAAA,CAAc,EAAA,MAAA;EAKd,CAAA;;AAIH,UAdG,eAAA,SAAwB,SAc3B,CAAA;EACF,IAAA,EAAA,WAAA;EALuB,IAAA,EAR3B,aAQ2B;;AAQlB,UAbA,aAAA,SAAsB,SAaV,CAAA;EAEf,IAAA,EAAA,SAAA;EACF,IAAA,EAdJ,WAcI;;AAHkC,UAR7B,SAAA,SAAkB,SAQW,CAAA;EAMlC,IAAA,EAAA,KAAA;EAAc,GAAA,EAAA,MAAA;EAAY,MAAA,EAX5B,SAW4B;EAAkB,UAAA,EAV1C,aAU0C,EAAA;EAAgB,QAAA,EAT5D,WAS4D,EAAA;;AAEvD,UARA,WAAA,SAAoB,SAShB,CAAA;EAGJ,IAAA,EAAA,OAAA;EAKL,UAAA,EAfE,aAeF,EAAA;EAMM,QAAA,EApBN,WAoBM,EAAA;;AAWa,KA5BnB,WAAA,GAAc,SA4BK,GA5BO,eA4BP,GA5ByB,aA4BzB,GA5ByC,WA4BzC;AAGD,UA7Bb,kBAAA,CA6Ba;EAAZ,OAAA,EAAA,CAAA,OAAA,EA5BG,YA4BH,EAAA,GAAA,IAAA;;AACC,UA1BF,YAAA,CA0BE;EAGc;;;EAIF,EAAA,EAAA,MAAA;EAAZ,QAAA,EA5BP,iBA4BO;EAGF;;;AAShB;AASD;EACU,MAAA,EAAA,CAAA,KAAA,EA5CQ,WA4CR,EAAA,GAAA,IAAA;EACA;;;EACP,mBAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,GAAA,MAAA;EAAO;AAgBV;;EAGU,OAAA,EAAA,GAAA,GAvDO,aAuDP;EACP,oBAAA,EAAA,CAAA,IAAA,EAvD4B,WAuD5B,EAAA,GAAA;IAAW,IAAA,WAAA,EAAA,EAAA,MAAA;cApDI,YAAY;eACX,YAAY;;iCAGE;;cAGf,YAAY;eACX,YAAY;;iBAGd;;;;UAKH;;;;UAMJ,aAAA;aACG;;;eACE;;;;iBAKO,UAAA,SACZ,uBACA,qBACP,QAAQ,eAAe;iBAgBV,UAAA,8BAEH,2BACH,qBACP"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"builder.js","names":[],"sources":["../../../src/utils/pages/builder.ts"],"sourcesContent":["import type { ProcessedDocument } from '@/utils/process-document';\nimport type { OpenAPIServer } from '@/server';\nimport type { OperationItem, WebhookItem } from '@/ui/api-page';\nimport type { Document, OperationObject, PathItemObject, TagObject } from '@/types';\nimport { getTagDisplayName, methodKeys, type NoReference } from '@/utils/schema';\nimport type { OpenAPIV3_1 } from 'openapi-types';\nimport { idToTitle } from '@/utils/id-to-title';\n\ninterface BaseEntry {\n path: string;\n schemaId: string;\n info: {\n title: string;\n description?: string;\n };\n}\n\nexport interface OperationOutput extends BaseEntry {\n type: 'operation';\n item: OperationItem;\n}\n\nexport interface WebhookOutput extends BaseEntry {\n type: 'webhook';\n item: WebhookItem;\n}\n\nexport interface TagOutput extends BaseEntry {\n type: 'tag';\n tag: string;\n rawTag: TagObject;\n operations: OperationItem[];\n webhooks: WebhookItem[];\n}\n\nexport interface OutputGroup extends BaseEntry {\n type: 'group';\n operations: OperationItem[];\n webhooks: WebhookItem[];\n}\n\nexport type OutputEntry = TagOutput | OperationOutput | WebhookOutput | OutputGroup;\n\nexport interface PagesBuilderConfig {\n toPages: (builder: PagesBuilder) => void;\n}\n\nexport interface PagesBuilder {\n /**\n * the input ID in OpenAPI server\n */\n id: string;\n document: ProcessedDocument;\n /**\n * add output entry.\n *\n * When the `path` property is unspecified, it will generate one.\n */\n create: (entry: OutputEntry) => void;\n\n /**\n * get file path from operation path, useful for generating output paths.\n */\n routePathToFilePath: (path: string) => string;\n\n /**\n * Extract useful info for rendering\n */\n extract: () => ExtractedInfo;\n fromExtractedWebhook: (item: WebhookItem) =>\n | {\n get displayName(): string;\n pathItem: NoReference<PathItemObject>;\n operation: NoReference<OperationObject>;\n }\n | undefined;\n fromExtractedOperation: (item: OperationItem) =>\n | {\n get displayName(): string;\n pathItem: NoReference<PathItemObject>;\n operation: NoReference<OperationObject>;\n }\n | undefined;\n fromTag: (tag: TagObject) => {\n get displayName(): string;\n };\n fromTagName: (tag: string) =>\n | {\n info: TagObject;\n get displayName(): string;\n }\n | undefined;\n}\n\ninterface ExtractedInfo {\n webhooks: (WebhookItem & { tags?: string[] })[];\n operations: (OperationItem & {\n tags?: string[];\n })[];\n}\n\nexport async function fromServer(\n server: OpenAPIServer,\n config: PagesBuilderConfig,\n): Promise<Record<string, OutputEntry[]>> {\n const schemas = await server.getSchemas();\n const generated: Record<string, OutputEntry[]> = {};\n\n const entries = Object.entries(schemas);\n if (entries.length === 0) {\n throw new Error('No input files found.');\n }\n\n for (const [id, schema] of entries) {\n generated[id] = fromSchema(id, schema, config);\n }\n\n return generated;\n}\n\nexport function fromSchema(\n schemaId: string,\n processed: ProcessedDocument,\n config: PagesBuilderConfig,\n): OutputEntry[] {\n const files: OutputEntry[] = [];\n const { toPages } = config;\n const { dereferenced } = processed;\n\n toPages({\n id: schemaId,\n document: processed,\n create(entry) {\n files.push(entry);\n },\n extract: () => extractInfo(dereferenced),\n routePathToFilePath(path) {\n return path\n .toLowerCase()\n .replaceAll('.', '-')\n .split('/')\n .flatMap((v) => {\n if (v.startsWith('{') && v.endsWith('}')) return v.slice(1, -1);\n if (v.length === 0) return [];\n return v;\n })\n .join('/');\n },\n fromExtractedWebhook(item) {\n const pathItem = dereferenced.webhooks?.[item.name];\n if (!pathItem) return;\n const operation = pathItem?.[item.method];\n if (!operation) return;\n return {\n pathItem,\n operation,\n get displayName() {\n return operation.summary || pathItem.summary || idToTitle(item.name);\n },\n };\n },\n fromExtractedOperation(item) {\n const pathItem = dereferenced.paths?.[item.path];\n if (!pathItem) return;\n const operation = pathItem?.[item.method];\n if (!operation) return;\n return {\n pathItem,\n operation,\n get displayName() {\n return (\n operation.summary ||\n pathItem.summary ||\n (operation.operationId ? idToTitle(operation.operationId) : item.path)\n );\n },\n };\n },\n fromTag(tag) {\n return {\n get displayName() {\n return getTagDisplayName(tag);\n },\n };\n },\n fromTagName(name) {\n const tag = dereferenced.tags?.find((item) => item.name === name);\n if (!tag) return;\n\n return {\n info: tag,\n ...this.fromTag(tag),\n };\n },\n });\n\n return files;\n}\n\nfunction extractInfo(document: NoReference<Document>): ExtractedInfo {\n const result: ExtractedInfo = { webhooks: [], operations: [] };\n\n for (const [path, pathItem] of Object.entries(document.paths ?? {})) {\n if (!pathItem) continue;\n\n for (const methodKey of methodKeys) {\n if (!pathItem[methodKey]) continue;\n\n result.operations.push({\n method: methodKey as OpenAPIV3_1.HttpMethods,\n path,\n tags: pathItem[methodKey]?.tags,\n });\n }\n }\n\n for (const [name, pathItem] of Object.entries(document.webhooks ?? {})) {\n if (!pathItem) continue;\n\n for (const methodKey of methodKeys) {\n if (!pathItem[methodKey]) continue;\n\n result.webhooks.push({\n method: methodKey as OpenAPIV3_1.HttpMethods,\n name,\n tags: pathItem[methodKey]?.tags,\n });\n }\n }\n\n return result;\n}\n"],"mappings":";;;;AAqGA,eAAsB,WACpB,QACA,QACwC;CACxC,MAAM,UAAU,MAAM,OAAO,YAAY;CACzC,MAAM,YAA2C,EAAE;CAEnD,MAAM,UAAU,OAAO,QAAQ,QAAQ;AACvC,KAAI,QAAQ,WAAW,EACrB,OAAM,IAAI,MAAM,wBAAwB;AAG1C,MAAK,MAAM,CAAC,IAAI,WAAW,QACzB,WAAU,MAAM,WAAW,IAAI,QAAQ,OAAO;AAGhD,QAAO;;AAGT,SAAgB,WACd,UACA,WACA,QACe;CACf,MAAM,QAAuB,EAAE;CAC/B,MAAM,EAAE,YAAY;CACpB,MAAM,EAAE,iBAAiB;AAEzB,SAAQ;EACN,IAAI;EACJ,UAAU;EACV,OAAO,OAAO;AACZ,SAAM,KAAK,MAAM;;EAEnB,eAAe,YAAY,aAAa;EACxC,oBAAoB,MAAM;AACxB,UAAO,KACJ,aAAa,CACb,WAAW,KAAK,IAAI,CACpB,MAAM,IAAI,CACV,SAAS,MAAM;AACd,QAAI,EAAE,WAAW,IAAI,IAAI,EAAE,SAAS,IAAI,CAAE,QAAO,EAAE,MAAM,GAAG,GAAG;AAC/D,QAAI,EAAE,WAAW,EAAG,QAAO,EAAE;AAC7B,WAAO;KACP,CACD,KAAK,IAAI;;EAEd,qBAAqB,MAAM;GACzB,MAAM,WAAW,aAAa,WAAW,KAAK;AAC9C,OAAI,CAAC,SAAU;GACf,MAAM,YAAY,WAAW,KAAK;AAClC,OAAI,CAAC,UAAW;AAChB,UAAO;IACL;IACA;IACA,IAAI,cAAc;AAChB,YAAO,UAAU,WAAW,SAAS,WAAW,UAAU,KAAK,KAAK;;IAEvE;;EAEH,uBAAuB,MAAM;GAC3B,MAAM,WAAW,aAAa,QAAQ,KAAK;AAC3C,OAAI,CAAC,SAAU;GACf,MAAM,YAAY,WAAW,KAAK;AAClC,OAAI,CAAC,UAAW;AAChB,UAAO;IACL;IACA;IACA,IAAI,cAAc;AAChB,YACE,UAAU,WACV,SAAS,YACR,UAAU,cAAc,UAAU,UAAU,YAAY,GAAG,KAAK;;IAGtE;;EAEH,QAAQ,KAAK;AACX,UAAO,EACL,IAAI,cAAc;AAChB,WAAO,kBAAkB,IAAI;MAEhC;;EAEH,YAAY,MAAM;GAChB,MAAM,MAAM,aAAa,MAAM,MAAM,SAAS,KAAK,SAAS,KAAK;AACjE,OAAI,CAAC,IAAK;AAEV,UAAO;IACL,MAAM;IACN,GAAG,KAAK,QAAQ,IAAI;IACrB;;EAEJ,CAAC;AAEF,QAAO;;AAGT,SAAS,YAAY,UAAgD;CACnE,MAAM,SAAwB;EAAE,UAAU,EAAE;EAAE,YAAY,EAAE;EAAE;AAE9D,MAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,SAAS,SAAS,EAAE,CAAC,EAAE;AACnE,MAAI,CAAC,SAAU;AAEf,OAAK,MAAM,aAAa,YAAY;AAClC,OAAI,CAAC,SAAS,WAAY;AAE1B,UAAO,WAAW,KAAK;IACrB,QAAQ;IACR;IACA,MAAM,SAAS,YAAY;IAC5B,CAAC;;;AAIN,MAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,SAAS,YAAY,EAAE,CAAC,EAAE;AACtE,MAAI,CAAC,SAAU;AAEf,OAAK,MAAM,aAAa,YAAY;AAClC,OAAI,CAAC,SAAS,WAAY;AAE1B,UAAO,SAAS,KAAK;IACnB,QAAQ;IACR;IACA,MAAM,SAAS,YAAY;IAC5B,CAAC;;;AAIN,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preset-auto.d.ts","names":[],"sources":["../../../src/utils/pages/preset-auto.ts"],"sourcesContent":[],"mappings":";;;;UAaU,eAAA,SAAwB;;AAHH;;EAkBmC,GAAA,CAAA,EAAA,WAAA;EAKlD;;;;;;AApB4B;;;EAgCf,OAAA,CAAA,EAAA,KAAA,GAAA,OAAA,GAAA,MAAA,GAAA,CAAA,CAAA,KAAA,EAjBmB,eAiBnB,GAjBqC,aAiBrC,EAAA,GAAA,MAAA,CAAA;EATD;;AAAU;EAqBtB,IAAA,CAAA,EAxBP,MAwBO,CAxBA,eAwBA,GAxBkB,aAwBlB,CAAA,GAxBmC,aAwBnC;;UArBN,SAAA,SAAkB,UAqBG,CAAA;EATA;;AAY/B;EACI,GAAA,EAAA,KAAA;EACA;;;EAIsB,IAAA,CAAA,EArBjB,MAqBiB,CArBV,SAqBU,CAAA,GArBG,aAqBH;AAAE;UAlBlB,YAAA,SAAqB,UAqBvB,CAAA;EACE;;;EAIA,GAAA,EAAA,MAAA;EAYA;AASV;;SAtCS,OAAO,eAAe;;KAGnB,oBAAA,GACR,eACA,YACA;;IAGI;KAEH,uBACG,sBACE,iBACE;UAGF,aAAA;;;;;;;;;;;UAYA,UAAA;;;;;;;;iBASM,gBAAA,UAA0B,uBAAuB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preset-auto.js","names":[],"sources":["../../../src/utils/pages/preset-auto.ts"],"sourcesContent":["import * as path from 'node:path';\nimport type { ProcessedDocument } from '@/utils/process-document';\nimport type {\n OperationOutput,\n OutputEntry,\n OutputGroup,\n PagesBuilder,\n PagesBuilderConfig,\n TagOutput,\n WebhookOutput,\n} from '@/utils/pages/builder';\nimport { isUrl } from '@/utils/url';\n\ninterface OperationConfig extends BaseConfig {\n /**\n * Generate a page for each API endpoint/operation (default).\n */\n per?: 'operation';\n\n /**\n * Group output using folders (Only works on `operation` mode)\n * - tag: `{tag}/{file}`\n * - route: `{endpoint}/{method}` (it will ignore the `name` option)\n * - none: `{file}` (default)\n * - a function that aligns group name (folder path) to each entry\n *\n * @defaultValue 'none'\n */\n groupBy?: 'tag' | 'route' | 'none' | ((entry: OperationOutput | WebhookOutput) => string);\n\n /**\n * Specify name for output file\n */\n name?: NameFn<OperationOutput | WebhookOutput> | NameFnOptions;\n}\n\ninterface TagConfig extends BaseConfig {\n /**\n * Generate a page for each tag.\n */\n per: 'tag';\n\n /**\n * Specify name for output file\n */\n name?: NameFn<TagOutput> | NameFnOptions;\n}\n\ninterface SchemaConfig extends BaseConfig {\n /**\n * Generate a page for each schema file.\n */\n per: 'file';\n\n /**\n * Specify name for output file\n */\n name?: NameFn<OutputGroup> | NameFnOptions;\n}\n\nexport type SchemaToPagesOptions =\n | SchemaConfig\n | TagConfig\n | OperationConfig\n | ({\n per: 'custom';\n } & PagesBuilderConfig);\n\ntype NameFn<Entry> = (\n this: PagesBuilder,\n output: Entry,\n document: ProcessedDocument['dereferenced'],\n) => string;\n\ninterface NameFnOptions {\n /**\n * The version of algorithm used to generate file paths.\n *\n * v1: Fumadocs OpenAPI v8\n * v2: Fumadocs OpenAPI v9\n *\n * @defaultValue v2\n */\n algorithm?: 'v2' | 'v1';\n}\n\ninterface BaseConfig {\n /**\n * Custom function to convert names into file names.\n *\n * By default, it only escapes whitespaces and upper case (English) characters\n */\n slugify?: (name: string) => string;\n}\n\nexport function createAutoPreset(options: SchemaToPagesOptions): PagesBuilderConfig {\n if (options.per === 'custom') return options;\n const {\n slugify = (s) => {\n return s.replace(/\\s+/g, '-').toLowerCase();\n },\n } = options;\n let nameFn: NameFn<OutputEntry>;\n\n if (typeof options.name === 'function') {\n nameFn = options.name as NameFn<OutputEntry>;\n } else {\n const { algorithm = 'v2' } = options.name ?? {};\n\n nameFn = function (result, document) {\n if (result.type === 'tag') {\n return slugify(result.tag);\n }\n\n if (result.type === 'group') {\n const schemaId = result.schemaId;\n\n return isUrl(schemaId) ? 'index' : path.basename(schemaId, path.extname(schemaId));\n }\n\n if (result.type === 'operation') {\n const operation = document.paths![result.item.path]![result.item.method]!;\n\n if (algorithm === 'v2' && operation.operationId) {\n return operation.operationId;\n }\n\n return path.join(\n this.routePathToFilePath(result.item.path),\n result.item.method.toLowerCase(),\n );\n }\n\n const hook = document.webhooks![result.item.name][result.item.method]!;\n\n if (algorithm === 'v2' && hook.operationId) {\n return hook.operationId;\n }\n\n return slugify(result.item.name);\n };\n }\n\n function groupOutput(builder: PagesBuilder, entry: OperationOutput | WebhookOutput): string[] {\n const { dereferenced } = builder.document;\n const { groupBy = 'none' } = options as OperationConfig;\n\n if (groupBy === 'route') {\n return [\n path.join(\n builder.routePathToFilePath(\n entry.type === 'operation' ? entry.item.path : entry.item.name,\n ),\n `${entry.item.method.toLowerCase()}.mdx`,\n ),\n ];\n }\n\n const file = nameFn.call(builder, entry, dereferenced);\n if (groupBy === 'tag') {\n let tags =\n entry.type === 'operation'\n ? dereferenced.paths![entry.item.path]![entry.item.method]!.tags\n : dereferenced.webhooks![entry.item.name][entry.item.method]!.tags;\n\n if (!tags || tags.length === 0) {\n console.warn(\n 'When `groupBy` is set to `tag`, make sure a `tags` is defined for every operation schema.',\n );\n\n tags = ['unknown'];\n }\n\n return tags.map((tag) => path.join(slugify(tag), `${file}.mdx`));\n }\n\n if (typeof groupBy === 'function') {\n return [path.join(slugify(groupBy(entry)), `${file}.mdx`)];\n }\n\n return [`${file}.mdx`];\n }\n\n return {\n toPages(builder) {\n const { dereferenced } = builder.document;\n const items = builder.extract();\n\n if (options.per === 'file') {\n const entry: OutputGroup = {\n type: 'group',\n schemaId: builder.id,\n path: '',\n info: {\n title: dereferenced.info.title,\n description: dereferenced.info.description,\n },\n ...items,\n };\n entry.path = nameFn.call(builder, entry, dereferenced) + '.mdx';\n builder.create(entry);\n return;\n }\n\n if (options.per === 'tag') {\n const tags = dereferenced.tags ?? [];\n for (const tag of tags) {\n const { displayName } = builder.fromTag(tag);\n const entry: TagOutput = {\n type: 'tag',\n path: '',\n schemaId: builder.id,\n info: {\n title: displayName,\n description: tag.description,\n },\n webhooks: items.webhooks.filter((webhook) => webhook.tags?.includes(tag.name)),\n operations: items.operations.filter((op) => op.tags?.includes(tag.name)),\n tag: tag.name,\n rawTag: tag,\n };\n\n entry.path = nameFn.call(builder, entry, dereferenced) + '.mdx';\n builder.create(entry);\n }\n\n return;\n }\n\n for (const op of items.operations) {\n const { pathItem, operation, displayName } = builder.fromExtractedOperation(op)!;\n\n const entry: OperationOutput = {\n type: 'operation',\n schemaId: builder.id,\n item: op,\n path: '',\n info: {\n title: displayName,\n description: operation.description ?? pathItem.description,\n },\n };\n\n for (const outputPath of groupOutput(builder, entry)) {\n builder.create({ ...entry, path: outputPath });\n }\n }\n\n for (const webhook of items.webhooks) {\n const { pathItem, operation, displayName } = builder.fromExtractedWebhook(webhook)!;\n\n const entry: WebhookOutput = {\n type: 'webhook',\n schemaId: builder.id,\n info: {\n title: displayName,\n description: operation.description ?? pathItem.description,\n },\n item: webhook,\n path: '',\n };\n\n for (const outputPath of groupOutput(builder, entry)) {\n builder.create({ ...entry, path: outputPath });\n }\n }\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"to-body.js","names":[],"sources":["../../../src/utils/pages/to-body.tsx"],"sourcesContent":["import type { ApiPageProps } from '@/ui/api-page';\nimport type { OutputEntry } from '@/utils/pages/builder';\n\nexport function toBody(entry: OutputEntry): ApiPageProps {\n if (entry.type === 'operation')\n return {\n document: entry.schemaId,\n operations: [entry.item],\n };\n if (entry.type === 'webhook')\n return {\n document: entry.schemaId,\n webhooks: [entry.item],\n };\n\n return {\n showTitle: true,\n showDescription: true,\n document: entry.schemaId,\n operations: entry.operations,\n webhooks: entry.webhooks,\n };\n}\n"],"mappings":";AAGA,SAAgB,OAAO,OAAkC;AACvD,KAAI,MAAM,SAAS,YACjB,QAAO;EACL,UAAU,MAAM;EAChB,YAAY,CAAC,MAAM,KAAK;EACzB;AACH,KAAI,MAAM,SAAS,UACjB,QAAO;EACL,UAAU,MAAM;EAChB,UAAU,CAAC,MAAM,KAAK;EACvB;AAEH,QAAO;EACL,WAAW;EACX,iBAAiB;EACjB,UAAU,MAAM;EAChB,YAAY,MAAM;EAClB,UAAU,MAAM;EACjB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"to-static-data.js","names":[],"sources":["../../../src/utils/pages/to-static-data.ts"],"sourcesContent":["import type { NoReference } from '@/utils/schema';\nimport type { Document, OperationObject } from '@/types';\nimport Slugger from 'github-slugger';\nimport { idToTitle } from '@/utils/id-to-title';\nimport type { TOCItemType } from 'fumadocs-core/toc';\nimport type { StructuredData } from 'fumadocs-core/mdx-plugins';\nimport type { ApiPageProps } from '@/ui';\n\nexport function toStaticData(\n page: ApiPageProps,\n dereferenced: NoReference<Document>,\n): {\n toc: TOCItemType[];\n structuredData: StructuredData;\n} {\n const slugger = new Slugger();\n const toc: TOCItemType[] = [];\n const structuredData: StructuredData = { headings: [], contents: [] };\n\n function pathItem(item: NoReference<OperationObject>, defaultTitle: string) {\n if (page.showTitle && item.operationId) {\n const title = item.summary || (item.operationId ? idToTitle(item.operationId) : defaultTitle);\n const id = slugger.slug(title);\n\n toc.push({\n depth: 2,\n title,\n url: `#${id}`,\n });\n structuredData.headings.push({\n content: title,\n id,\n });\n }\n\n if (item.description)\n structuredData.contents.push({\n content: item.description,\n heading: structuredData.headings.at(-1)?.id,\n });\n }\n\n for (const item of page.operations ?? []) {\n const operation = dereferenced.paths?.[item.path]?.[item.method];\n if (!operation) continue;\n\n pathItem(operation, item.path);\n }\n\n for (const item of page.webhooks ?? []) {\n const webhook = dereferenced.webhooks?.[item.name]?.[item.method];\n if (!webhook) continue;\n\n pathItem(webhook, item.name);\n }\n\n return { toc, structuredData };\n}\n"],"mappings":";;;;AAQA,SAAgB,aACd,MACA,cAIA;CACA,MAAM,UAAU,IAAI,SAAS;CAC7B,MAAM,MAAqB,EAAE;CAC7B,MAAM,iBAAiC;EAAE,UAAU,EAAE;EAAE,UAAU,EAAE;EAAE;CAErE,SAAS,SAAS,MAAoC,cAAsB;AAC1E,MAAI,KAAK,aAAa,KAAK,aAAa;GACtC,MAAM,QAAQ,KAAK,YAAY,KAAK,cAAc,UAAU,KAAK,YAAY,GAAG;GAChF,MAAM,KAAK,QAAQ,KAAK,MAAM;AAE9B,OAAI,KAAK;IACP,OAAO;IACP;IACA,KAAK,IAAI;IACV,CAAC;AACF,kBAAe,SAAS,KAAK;IAC3B,SAAS;IACT;IACD,CAAC;;AAGJ,MAAI,KAAK,YACP,gBAAe,SAAS,KAAK;GAC3B,SAAS,KAAK;GACd,SAAS,eAAe,SAAS,GAAG,GAAG,EAAE;GAC1C,CAAC;;AAGN,MAAK,MAAM,QAAQ,KAAK,cAAc,EAAE,EAAE;EACxC,MAAM,YAAY,aAAa,QAAQ,KAAK,QAAQ,KAAK;AACzD,MAAI,CAAC,UAAW;AAEhB,WAAS,WAAW,KAAK,KAAK;;AAGhC,MAAK,MAAM,QAAQ,KAAK,YAAY,EAAE,EAAE;EACtC,MAAM,UAAU,aAAa,WAAW,KAAK,QAAQ,KAAK;AAC1D,MAAI,CAAC,QAAS;AAEd,WAAS,SAAS,KAAK,KAAK;;AAG9B,QAAO;EAAE;EAAK;EAAgB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"to-text.d.ts","names":[],"sources":["../../../src/utils/pages/to-text.ts"],"sourcesContent":[],"mappings":";;;;;UASiB,kBAAA;;AAAjB;AAoJA;;;;;;;;;;0EAnIa,oBACN;;;;;;;;;;;;;;;;;;;KAkIK,eAAA;;OAGD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"to-text.js","names":[],"sources":["../../../src/utils/pages/to-text.ts"],"sourcesContent":["import type { ApiPageProps, OperationItem, WebhookItem } from '@/ui/api-page';\nimport type { ProcessedDocument } from '@/utils/process-document';\nimport type { TagObject } from '@/types';\nimport { dump } from 'js-yaml';\nimport { removeUndefined } from '@/utils/remove-undefined';\nimport type { OutputEntry } from '@/utils/pages/builder';\nimport type { InternalOpenAPIMeta } from '@/server/source-api';\nimport { toStaticData } from '@/utils/pages/to-static-data';\n\nexport interface PagesToTextOptions {\n /**\n * Additional imports of your MDX components.\n */\n imports?: {\n names: string[];\n from: string;\n }[];\n\n /**\n * Customise frontmatter.\n *\n * A `full: true` property will be added by default.\n */\n frontmatter?: (\n title: string,\n description: string | undefined,\n context: DocumentContext,\n ) => Record<string, unknown>;\n\n /**\n * Add description to document body.\n *\n * We recommend but don't enable it by default because some OpenAPI schemas have invalid description that breaks MDX syntax.\n *\n * @defaultValue false\n */\n includeDescription?: boolean;\n\n /**\n * Add a comment to the top of generated files indicating they are auto-generated.\n * - `true`: Adds a standardized comment\n * - `false`: No comment is added\n * - `string`: Adds the provided custom comment\n *\n * @defaultValue true\n */\n addGeneratedComment?: boolean | string;\n}\n\nexport function toText(\n entry: OutputEntry,\n processed: ProcessedDocument,\n options: PagesToTextOptions = {},\n) {\n switch (entry.type) {\n case 'operation':\n return generatePage(\n entry.schemaId,\n processed,\n {\n operations: [entry.item],\n },\n {\n ...options,\n ...entry.info,\n },\n {\n type: 'operation',\n },\n );\n case 'group':\n return generatePage(\n entry.schemaId,\n processed,\n {\n operations: entry.operations,\n webhooks: entry.webhooks,\n showTitle: true,\n },\n {\n ...options,\n ...entry.info,\n },\n {\n type: 'file',\n },\n );\n case 'tag':\n return generatePage(\n entry.schemaId,\n processed,\n {\n operations: entry.operations,\n webhooks: entry.webhooks,\n showTitle: true,\n },\n {\n ...options,\n ...entry.info,\n },\n {\n type: 'tag',\n tag: entry.rawTag,\n },\n );\n case 'webhook':\n return generatePage(\n entry.schemaId,\n processed,\n {\n webhooks: [entry.item],\n },\n {\n ...options,\n ...entry.info,\n },\n {\n type: 'operation',\n },\n );\n }\n}\n\nexport function generateDocument(\n frontmatter: unknown,\n content: string,\n options: PagesToTextOptions,\n): string {\n const { addGeneratedComment = true, imports } = options;\n const out: string[] = [];\n const banner = dump(removeUndefined(frontmatter as object)).trimEnd();\n if (banner.length > 0) out.push(`---\\n${banner}\\n---`);\n\n if (addGeneratedComment) {\n let commentContent =\n 'This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again.';\n\n if (typeof addGeneratedComment === 'string') {\n commentContent = addGeneratedComment;\n }\n\n commentContent = commentContent.replaceAll('/', '\\\\/');\n out.push(`{/* ${commentContent} */}`);\n }\n\n if (imports) {\n out.push(\n ...imports\n .map((item) => `import { ${item.names.join(', ')} } from ${JSON.stringify(item.from)};`)\n .join('\\n'),\n );\n }\n\n out.push(content);\n return out.join('\\n\\n');\n}\n\nexport type DocumentContext =\n | {\n type: 'tag';\n tag: TagObject | undefined;\n }\n | {\n type: 'operation';\n }\n | {\n type: 'file';\n };\n\nfunction generatePage(\n schemaId: string,\n processed: ProcessedDocument,\n pageProps: Omit<ApiPageProps, 'document'>,\n options: PagesToTextOptions & {\n title: string;\n description?: string;\n },\n context: DocumentContext,\n): string {\n const { frontmatter, includeDescription = false } = options;\n const extend = frontmatter?.(options.title, options.description, context);\n const page: ApiPageProps = {\n ...pageProps,\n document: schemaId,\n };\n\n let meta: InternalOpenAPIMeta | undefined;\n if (page.operations?.length === 1) {\n const operation = page.operations[0];\n\n meta = {\n method: operation.method.toUpperCase(),\n };\n } else if (page.webhooks?.length === 1) {\n const webhook = page.webhooks[0];\n\n meta = {\n method: webhook.method.toUpperCase(),\n webhook: true,\n };\n }\n\n const data = toStaticData(page, processed.dereferenced);\n const content: string[] = [];\n\n if (options.description && includeDescription) content.push(options.description);\n content.push(pageContent(page));\n\n return generateDocument(\n {\n title: options.title,\n description: !includeDescription ? options.description : undefined,\n full: true,\n ...extend,\n _openapi: {\n ...meta,\n ...data,\n ...(extend?._openapi as object | undefined),\n },\n },\n content.join('\\n\\n'),\n options,\n );\n}\n\nfunction pageContent({\n showTitle,\n showDescription,\n document,\n webhooks,\n operations,\n}: ApiPageProps): string {\n const propStrs: string[] = [`document={${JSON.stringify(document)}}`];\n\n // filter extra properties in props\n if (webhooks) {\n propStrs.push(\n `webhooks={${JSON.stringify(\n webhooks.map(\n (item) =>\n ({\n name: item.name,\n method: item.method,\n }) satisfies WebhookItem,\n ),\n )}}`,\n );\n }\n if (operations) {\n propStrs.push(\n `operations={${JSON.stringify(\n operations.map(\n (item) =>\n ({\n path: item.path,\n method: item.method,\n }) satisfies OperationItem,\n ),\n )}}`,\n );\n }\n if (showTitle) {\n propStrs.push(`showTitle={${JSON.stringify(showTitle)}}`);\n }\n if (showDescription) {\n propStrs.push(`showDescription={${JSON.stringify(showDescription)}}`);\n }\n\n return `<APIPage ${propStrs.join(' ')} />`;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"process-document.d.ts","names":[],"sources":["../../src/utils/process-document.ts"],"sourcesContent":[],"mappings":";;;;;KAOY,iBAAA;;AAAZ;;EAIgB,YAAA,EAAA,WAAA,CAAY,QAAZ,CAAA;EAEc,oBAAA,EAAA,GAAA,GAAA,GAAA,CAAA,MAAA,EAAA,MAAA,CAAA;EAOnB;;;;WAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"process-document.js","names":[],"sources":["../../src/utils/process-document.ts"],"sourcesContent":["import type { Document } from '@/types';\nimport type { NoReference } from '@/utils/schema';\nimport type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types';\nimport { dereference, upgrade } from '@scalar/openapi-parser';\nimport { bundle } from '@scalar/json-magic/bundle';\nimport { fetchUrls, readFiles } from '@scalar/json-magic/bundle/plugins/node';\n\nexport type ProcessedDocument = {\n /**\n * dereferenced document\n */\n dereferenced: NoReference<Document>;\n\n _internal_idToSchema: () => Map<string, object>;\n\n /**\n * Get raw object from dereferenced object\n */\n getRawRef: (obj: object) => string | undefined;\n\n bundled: Document;\n};\n\nconst cache = new Map<string, ProcessedDocument>();\n\nexport async function processDocumentCached(\n input: string | OpenAPIV3_1.Document | OpenAPIV3.Document,\n): Promise<ProcessedDocument> {\n if (typeof input !== 'string') return processDocument(input);\n\n const cached = cache.get(input);\n if (cached) return cached;\n const processed = await processDocument(input);\n\n cache.set(input, processed);\n return processed;\n}\n\n/**\n * process & reference input document to a Fumadocs OpenAPI compatible format\n */\nexport async function processDocument(\n input: string | OpenAPIV3_1.Document | OpenAPIV3.Document,\n): Promise<ProcessedDocument> {\n const document = await bundle(input as string, {\n plugins: [fetchUrls(), readFiles()],\n treeShake: true,\n urlMap: true,\n hooks: {\n onResolveError(node) {\n throw new Error(`Failed to resolve ${node.$ref}`);\n },\n },\n })\n .then((v) => upgrade(v).specification)\n .catch((e) => {\n throw new Error(`[OpenAPI] Failed to resolve input: ${input}`, {\n cause: e,\n });\n });\n\n /**\n * Dereferenced value and its original `$ref` value\n */\n const dereferenceMap = new WeakMap<object, string>();\n const serializable = new Map<string, object>();\n\n return {\n dereferenced: dereference(document, {\n throwOnError: true,\n onDereference({ schema, ref }) {\n serializable.set(ref, schema);\n dereferenceMap.set(schema, ref);\n },\n }).schema as NoReference<Document>,\n getRawRef(obj) {\n return dereferenceMap.get(obj);\n },\n\n _internal_idToSchema() {\n return serializable;\n },\n bundled: document as Document,\n };\n}\n"],"mappings":";;;;;;;;AAyCA,eAAsB,gBACpB,OAC4B;CAC5B,MAAM,WAAW,MAAM,OAAO,OAAiB;EAC7C,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC;EACnC,WAAW;EACX,QAAQ;EACR,OAAO,EACL,eAAe,MAAM;AACnB,SAAM,IAAI,MAAM,qBAAqB,KAAK,OAAO;KAEpD;EACF,CAAC,CACC,MAAM,MAAM,QAAQ,EAAE,CAAC,cAAc,CACrC,OAAO,MAAM;AACZ,QAAM,IAAI,MAAM,sCAAsC,SAAS,EAC7D,OAAO,GACR,CAAC;GACF;;;;CAKJ,MAAM,iCAAiB,IAAI,SAAyB;CACpD,MAAM,+BAAe,IAAI,KAAqB;AAE9C,QAAO;EACL,cAAc,YAAY,UAAU;GAClC,cAAc;GACd,cAAc,EAAE,QAAQ,OAAO;AAC7B,iBAAa,IAAI,KAAK,OAAO;AAC7B,mBAAe,IAAI,QAAQ,IAAI;;GAElC,CAAC,CAAC;EACH,UAAU,KAAK;AACb,UAAO,eAAe,IAAI,IAAI;;EAGhC,uBAAuB;AACrB,UAAO;;EAET,SAAS;EACV"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"remove-undefined.js","names":[],"sources":["../../src/utils/remove-undefined.ts"],"sourcesContent":["export function removeUndefined<T extends object>(value: T, deep = false): T {\n const obj = value as Record<string, unknown>;\n\n for (const key in obj) {\n if (obj[key] === undefined) delete obj[key];\n if (!deep) continue;\n\n const entry = obj[key];\n\n if (typeof entry === 'object' && entry !== null) {\n removeUndefined(entry, deep);\n continue;\n }\n\n if (Array.isArray(entry)) {\n for (const item of entry) removeUndefined(item, deep);\n }\n }\n\n return value;\n}\n"],"mappings":";AAAA,SAAgB,gBAAkC,OAAU,OAAO,OAAU;CAC3E,MAAM,MAAM;AAEZ,MAAK,MAAM,OAAO,KAAK;AACrB,MAAI,IAAI,SAAS,OAAW,QAAO,IAAI;AACvC,MAAI,CAAC,KAAM;EAEX,MAAM,QAAQ,IAAI;AAElB,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,mBAAgB,OAAO,KAAK;AAC5B;;AAGF,MAAI,MAAM,QAAQ,MAAM,CACtB,MAAK,MAAM,QAAQ,MAAO,iBAAgB,MAAM,KAAK;;AAIzD,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema-to-string.js","names":["union","result","flags"],"sources":["../../src/utils/schema-to-string.ts"],"sourcesContent":["import { type ResolvedSchema } from '@/utils/schema';\nimport type { ProcessedDocument } from '@/utils/process-document';\n\nexport enum FormatFlags {\n None = 0,\n UseAlias = 1 << 0,\n}\n\nexport function schemaToString(\n value: ResolvedSchema,\n ctx?: ProcessedDocument,\n flags: FormatFlags = FormatFlags.None,\n): string {\n function union(union: readonly ResolvedSchema[], sep: string, flags: FormatFlags) {\n const members = new Set();\n let nullable = false;\n\n for (const item of union) {\n const result = run(item, flags | FormatFlags.UseAlias);\n\n if (result === 'null') {\n nullable = true;\n } else if (result !== 'unknown') {\n members.add(result);\n }\n }\n\n const result = Array.from(members).join(sep);\n return nullable ? `${result} | null` : result;\n }\n\n function run(schema: ResolvedSchema, flags: FormatFlags): string {\n if (schema === true) return 'any';\n else if (schema === false) return 'never';\n\n if ((flags & FormatFlags.UseAlias) === FormatFlags.UseAlias) {\n if (schema.title) return schema.title;\n\n const ref = ctx?.getRawRef(schema)?.split('/');\n if (ref && ref.length > 0) return ref[ref.length - 1];\n }\n\n if (Array.isArray(schema.type)) {\n return union(\n schema.type.map((type) => ({\n ...schema,\n type,\n })),\n ' | ',\n flags,\n );\n }\n\n if (schema.type === 'array')\n return `array<${schema.items ? run(schema.items, flags | FormatFlags.UseAlias) : 'unknown'}>`;\n\n const or = schema.oneOf ?? schema.anyOf;\n if (schema.oneOf && schema.anyOf) {\n return `(${union(schema.oneOf, ' | ', flags)}) & (${union(schema.anyOf, ' | ', flags)})`;\n } else if (or) {\n return union(or, ' | ', flags);\n }\n\n if (schema.allOf) {\n return union(schema.allOf, ' & ', flags);\n }\n\n if (schema.not) return `not ${run(schema.not, flags)}`;\n if (schema.type === 'string' && schema.format === 'binary') return 'file';\n\n if (schema.type && Array.isArray(schema.type)) {\n return schema.type.filter((v) => v !== 'null').join(' | ');\n }\n\n if (schema.type) {\n return schema.type as string;\n }\n\n return 'unknown';\n }\n\n return run(value, flags);\n}\n"],"mappings":";AAGA,IAAY,sDAAL;AACL;AACA;;;AAGF,SAAgB,eACd,OACA,KACA,QAAqB,YAAY,MACzB;CACR,SAAS,MAAM,SAAkC,KAAa,SAAoB;EAChF,MAAM,0BAAU,IAAI,KAAK;EACzB,IAAI,WAAW;AAEf,OAAK,MAAM,QAAQA,SAAO;GACxB,MAAMC,WAAS,IAAI,MAAMC,UAAQ,YAAY,SAAS;AAEtD,OAAID,aAAW,OACb,YAAW;YACFA,aAAW,UACpB,SAAQ,IAAIA,SAAO;;EAIvB,MAAM,SAAS,MAAM,KAAK,QAAQ,CAAC,KAAK,IAAI;AAC5C,SAAO,WAAW,GAAG,OAAO,WAAW;;CAGzC,SAAS,IAAI,QAAwB,SAA4B;AAC/D,MAAI,WAAW,KAAM,QAAO;WACnB,WAAW,MAAO,QAAO;AAElC,OAAKC,UAAQ,YAAY,cAAc,YAAY,UAAU;AAC3D,OAAI,OAAO,MAAO,QAAO,OAAO;GAEhC,MAAM,MAAM,KAAK,UAAU,OAAO,EAAE,MAAM,IAAI;AAC9C,OAAI,OAAO,IAAI,SAAS,EAAG,QAAO,IAAI,IAAI,SAAS;;AAGrD,MAAI,MAAM,QAAQ,OAAO,KAAK,CAC5B,QAAO,MACL,OAAO,KAAK,KAAK,UAAU;GACzB,GAAG;GACH;GACD,EAAE,EACH,OACAA,QACD;AAGH,MAAI,OAAO,SAAS,QAClB,QAAO,SAAS,OAAO,QAAQ,IAAI,OAAO,OAAOA,UAAQ,YAAY,SAAS,GAAG,UAAU;EAE7F,MAAM,KAAK,OAAO,SAAS,OAAO;AAClC,MAAI,OAAO,SAAS,OAAO,MACzB,QAAO,IAAI,MAAM,OAAO,OAAO,OAAOA,QAAM,CAAC,OAAO,MAAM,OAAO,OAAO,OAAOA,QAAM,CAAC;WAC7E,GACT,QAAO,MAAM,IAAI,OAAOA,QAAM;AAGhC,MAAI,OAAO,MACT,QAAO,MAAM,OAAO,OAAO,OAAOA,QAAM;AAG1C,MAAI,OAAO,IAAK,QAAO,OAAO,IAAI,OAAO,KAAKA,QAAM;AACpD,MAAI,OAAO,SAAS,YAAY,OAAO,WAAW,SAAU,QAAO;AAEnE,MAAI,OAAO,QAAQ,MAAM,QAAQ,OAAO,KAAK,CAC3C,QAAO,OAAO,KAAK,QAAQ,MAAM,MAAM,OAAO,CAAC,KAAK,MAAM;AAG5D,MAAI,OAAO,KACT,QAAO,OAAO;AAGhB,SAAO;;AAGT,QAAO,IAAI,OAAO,MAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","names":[],"sources":["../../src/utils/schema.ts"],"sourcesContent":[],"mappings":";;;;;KAaY,iBAAiB,wBACzB,YAAY,OACZ,UAAU,kBACR,QAAQ,GAAG,mBACX,2BAJM,MAMU,CANV,GAMc,WANH,CAMe,CANf,CAMiB,CANjB,CAAA,CAAA,EAAM,GAQrB,CARqB;KAUxB,qBATW,CAAA,CAAA,CAAA,GASgB,CAThB,SAAA,CAAA,KAAA,EAAA,CAAA,EAAA,GAUZ,WAVY,CAUA,CAVA,CAAA,EAAA,GAWZ,CAXY,SAAA;EAAZ,IAAA,CAAA,EAAA,MAAA;CACA,GAWE,IAXF,CAWO,CAXP,EAAA,MAAA,CAAA,GAYE,CAZF;AAAU,KAcF,YAAA,GAAe,UAdb;AACA,KAcF,cAAA,GAAiB,qBAdf,CAcqC,YAdrC,CAAA"}
|
package/dist/utils/schema.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","names":[],"sources":["../../src/utils/schema.ts"],"sourcesContent":["import type { JSONSchema } from 'json-schema-typed/draft-2020-12';\nimport type {\n MethodInformation,\n OperationObject,\n PathItemObject,\n ReferenceObject,\n TagObject,\n} from '@/types';\nimport { idToTitle } from '@/utils/id-to-title';\nimport { OpenAPIV3_1 } from 'openapi-types';\n\nexport const methodKeys = ['get', 'post', 'patch', 'delete', 'head', 'put'] as const;\n\nexport type NoReference<T> = T extends (infer I)[]\n ? NoReference<I>[]\n : T extends ReferenceObject\n ? Exclude<T, ReferenceObject>\n : T extends object\n ? {\n [K in keyof T]: NoReference<T[K]>;\n }\n : T;\n\ntype NoReferenceJSONSchema<T> = T extends (infer I)[]\n ? NoReference<I>[]\n : T extends { $ref?: string }\n ? Omit<T, '$ref'>\n : T;\n\nexport type ParsedSchema = JSONSchema;\nexport type ResolvedSchema = NoReferenceJSONSchema<ParsedSchema>;\n\nexport function getPreferredType(body: Record<string, unknown>): string | undefined {\n if ('application/json' in body) return 'application/json';\n\n return Object.keys(body)[0];\n}\n\nexport function getTagDisplayName(tag: TagObject): string {\n return 'x-displayName' in tag && typeof tag['x-displayName'] === 'string'\n ? tag['x-displayName']\n : idToTitle(tag.name);\n}\n\n/**\n * Summarize method endpoint information\n */\nexport function createMethod(\n method: string,\n path: NoReference<PathItemObject>,\n operation: NoReference<OperationObject>,\n): MethodInformation {\n return {\n description: path.description,\n summary: path.summary,\n ...operation,\n parameters: [...(operation.parameters ?? []), ...(path.parameters ?? [])],\n method: method.toUpperCase(),\n };\n}\n\ninterface ExampleLike {\n example?: unknown;\n examples?: {\n [media: string]: OpenAPIV3_1.ExampleObject;\n };\n content?: {\n [media: string]: OpenAPIV3_1.MediaTypeObject;\n };\n}\n\nexport function pickExample(value: ExampleLike): unknown | undefined {\n if (value.example !== undefined) {\n return value.example;\n }\n\n if (value.content) {\n const type = getPreferredType(value.content);\n const content = type ? value.content[type] : undefined;\n\n if (type && content) {\n const out = value.examples?.[type].value ?? pickExample(content);\n if (out !== undefined) return out;\n }\n }\n\n if (value.examples) {\n const examples = Object.values(value.examples);\n if (examples.length > 0) return examples[0].value;\n }\n}\n"],"mappings":";;;AAWA,MAAa,aAAa;CAAC;CAAO;CAAQ;CAAS;CAAU;CAAQ;CAAM;AAqB3E,SAAgB,iBAAiB,MAAmD;AAClF,KAAI,sBAAsB,KAAM,QAAO;AAEvC,QAAO,OAAO,KAAK,KAAK,CAAC;;AAG3B,SAAgB,kBAAkB,KAAwB;AACxD,QAAO,mBAAmB,OAAO,OAAO,IAAI,qBAAqB,WAC7D,IAAI,mBACJ,UAAU,IAAI,KAAK;;;;;AAMzB,SAAgB,aACd,QACA,MACA,WACmB;AACnB,QAAO;EACL,aAAa,KAAK;EAClB,SAAS,KAAK;EACd,GAAG;EACH,YAAY,CAAC,GAAI,UAAU,cAAc,EAAE,EAAG,GAAI,KAAK,cAAc,EAAE,CAAE;EACzE,QAAQ,OAAO,aAAa;EAC7B;;AAaH,SAAgB,YAAY,OAAyC;AACnE,KAAI,MAAM,YAAY,OACpB,QAAO,MAAM;AAGf,KAAI,MAAM,SAAS;EACjB,MAAM,OAAO,iBAAiB,MAAM,QAAQ;EAC5C,MAAM,UAAU,OAAO,MAAM,QAAQ,QAAQ;AAE7C,MAAI,QAAQ,SAAS;GACnB,MAAM,MAAM,MAAM,WAAW,MAAM,SAAS,YAAY,QAAQ;AAChE,OAAI,QAAQ,OAAW,QAAO;;;AAIlC,KAAI,MAAM,UAAU;EAClB,MAAM,WAAW,OAAO,OAAO,MAAM,SAAS;AAC9C,MAAI,SAAS,SAAS,EAAG,QAAO,SAAS,GAAG"}
|
package/dist/utils/url.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"url.js","names":[],"sources":["../../src/utils/url.ts"],"sourcesContent":["import type { RequestData } from '@/requests/types';\n\nexport function isUrl(schemaId: string): boolean {\n return schemaId.startsWith('https://') || schemaId.startsWith('http://');\n}\n\nexport function joinURL(base: string, pathname: string): string {\n if (pathname.startsWith('/')) pathname = pathname.slice(1);\n if (base.endsWith('/')) base = base.slice(0, -1);\n\n if (pathname.length > 0) return base + '/' + pathname;\n else return base;\n}\n\n/**\n * @param url - URL (can be relative)\n * @param base - the base URL (must be absolute)\n */\nexport function withBase(url: string, base: string): string {\n if (!url.startsWith('https://') && !url.startsWith('http://')) {\n return joinURL(base, url);\n }\n\n return url;\n}\n\nexport function resolveServerUrl(template: string, variables: Record<string, string>): string {\n for (const [key, value] of Object.entries(variables)) {\n template = template.replaceAll(`{${key}}`, value);\n }\n\n return template;\n}\n\nexport function resolveRequestData(pathname: string, { path, query }: RequestData): string {\n // First, resolve path parameters in the pathname\n for (const key in path) {\n const param = path[key];\n\n pathname = pathname.replace(`{${key}}`, param.value);\n }\n\n // Check if pathname already contains query parameters (legacy API support)\n const [pathPart, existingQueryString] = pathname.split('?', 2);\n\n // Parse existing query parameters from the pathname if they exist\n const searchParams = new URLSearchParams(existingQueryString || '');\n\n // Add new query parameters from the RequestData\n for (const key in query) {\n const param = query[key];\n if (param.values.length === 0) continue;\n\n // Remove existing parameter first to avoid duplicates\n searchParams.delete(key);\n for (const item of param.values) {\n searchParams.append(key, item);\n }\n }\n\n // Return the reconstructed URL\n return searchParams.size > 0 ? `${pathPart}?${searchParams}` : pathPart;\n}\n"],"mappings":";AAEA,SAAgB,MAAM,UAA2B;AAC/C,QAAO,SAAS,WAAW,WAAW,IAAI,SAAS,WAAW,UAAU;;AAG1E,SAAgB,QAAQ,MAAc,UAA0B;AAC9D,KAAI,SAAS,WAAW,IAAI,CAAE,YAAW,SAAS,MAAM,EAAE;AAC1D,KAAI,KAAK,SAAS,IAAI,CAAE,QAAO,KAAK,MAAM,GAAG,GAAG;AAEhD,KAAI,SAAS,SAAS,EAAG,QAAO,OAAO,MAAM;KACxC,QAAO;;;;;;AAOd,SAAgB,SAAS,KAAa,MAAsB;AAC1D,KAAI,CAAC,IAAI,WAAW,WAAW,IAAI,CAAC,IAAI,WAAW,UAAU,CAC3D,QAAO,QAAQ,MAAM,IAAI;AAG3B,QAAO;;AAGT,SAAgB,iBAAiB,UAAkB,WAA2C;AAC5F,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,UAAU,CAClD,YAAW,SAAS,WAAW,IAAI,IAAI,IAAI,MAAM;AAGnD,QAAO;;AAGT,SAAgB,mBAAmB,UAAkB,EAAE,MAAM,SAA8B;AAEzF,MAAK,MAAM,OAAO,MAAM;EACtB,MAAM,QAAQ,KAAK;AAEnB,aAAW,SAAS,QAAQ,IAAI,IAAI,IAAI,MAAM,MAAM;;CAItD,MAAM,CAAC,UAAU,uBAAuB,SAAS,MAAM,KAAK,EAAE;CAG9D,MAAM,eAAe,IAAI,gBAAgB,uBAAuB,GAAG;AAGnE,MAAK,MAAM,OAAO,OAAO;EACvB,MAAM,QAAQ,MAAM;AACpB,MAAI,MAAM,OAAO,WAAW,EAAG;AAG/B,eAAa,OAAO,IAAI;AACxB,OAAK,MAAM,QAAQ,MAAM,OACvB,cAAa,OAAO,KAAK,KAAK;;AAKlC,QAAO,aAAa,OAAO,IAAI,GAAG,SAAS,GAAG,iBAAiB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-query.js","names":[],"sources":["../../src/utils/use-query.ts"],"sourcesContent":["import { useMemo, useRef, useState } from 'react';\n\nexport function useQuery<I extends unknown[], T>(\n fn: (...input: I) => Promise<T>,\n): {\n start: (...input: I) => void;\n reset: () => void;\n data?: T;\n error?: unknown;\n isLoading: boolean;\n} {\n const [loading, setLoading] = useState(false);\n const [data, setData] = useState<T>();\n const [error, setError] = useState<T>();\n const fnRef = useRef(fn);\n fnRef.current = fn;\n\n return useMemo(\n () => ({\n isLoading: loading,\n data,\n error,\n start(...input) {\n setLoading(true);\n\n void fnRef\n .current(...input)\n .then((res) => {\n setData(res);\n setError(undefined);\n })\n .catch((err) => {\n setData(undefined);\n setError(err);\n })\n .finally(() => {\n setLoading(false);\n });\n },\n reset() {\n setData(undefined);\n setError(undefined);\n setLoading(false);\n },\n }),\n [error, data, loading],\n );\n}\n"],"mappings":";;;AAEA,SAAgB,SACd,IAOA;CACA,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAC7C,MAAM,CAAC,MAAM,WAAW,UAAa;CACrC,MAAM,CAAC,OAAO,YAAY,UAAa;CACvC,MAAM,QAAQ,OAAO,GAAG;AACxB,OAAM,UAAU;AAEhB,QAAO,eACE;EACL,WAAW;EACX;EACA;EACA,MAAM,GAAG,OAAO;AACd,cAAW,KAAK;AAEhB,GAAK,MACF,QAAQ,GAAG,MAAM,CACjB,MAAM,QAAQ;AACb,YAAQ,IAAI;AACZ,aAAS,OAAU;KACnB,CACD,OAAO,QAAQ;AACd,YAAQ,OAAU;AAClB,aAAS,IAAI;KACb,CACD,cAAc;AACb,eAAW,MAAM;KACjB;;EAEN,QAAQ;AACN,WAAQ,OAAU;AAClB,YAAS,OAAU;AACnB,cAAW,MAAM;;EAEpB,GACD;EAAC;EAAO;EAAM;EAAQ,CACvB"}
|