fumadocs-openapi 10.6.4 → 10.6.6
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/css/generated/shared.css +34 -7
- package/dist/_openapi/types.d.ts +1 -2
- package/dist/generate-file.d.ts +1 -2
- package/dist/generate-file.js +3 -4
- package/dist/i18n.d.ts +2 -2
- package/dist/i18n.js +1 -2
- package/dist/playground/auth.js +92 -0
- package/dist/playground/client.d.ts +5 -10
- package/dist/playground/client.js +280 -199
- package/dist/playground/components/inputs.js +0 -2
- package/dist/playground/components/oauth-dialog.js +125 -164
- package/dist/playground/components/server-select.js +0 -2
- package/dist/playground/components/spinner.js +14 -0
- package/dist/playground/fetcher.d.ts +1 -2
- package/dist/playground/fetcher.js +0 -2
- package/dist/playground/schema.d.ts +1 -2
- package/dist/playground/schema.js +24 -15
- package/dist/playground/status-info.js +0 -2
- package/dist/requests/generators/all.d.ts +1 -2
- package/dist/requests/generators/all.js +0 -2
- package/dist/requests/generators/csharp.d.ts +1 -2
- package/dist/requests/generators/csharp.js +2 -3
- package/dist/requests/generators/curl.d.ts +1 -2
- package/dist/requests/generators/curl.js +5 -7
- package/dist/requests/generators/go.d.ts +1 -2
- package/dist/requests/generators/go.js +5 -7
- package/dist/requests/generators/index.d.ts +1 -2
- package/dist/requests/generators/index.js +0 -2
- package/dist/requests/generators/java.d.ts +1 -2
- package/dist/requests/generators/java.js +4 -6
- package/dist/requests/generators/javascript.d.ts +1 -2
- package/dist/requests/generators/javascript.js +3 -5
- package/dist/requests/generators/python.d.ts +1 -2
- package/dist/requests/generators/python.js +5 -6
- package/dist/requests/media/adapter.d.ts +1 -2
- package/dist/requests/media/adapter.js +7 -9
- package/dist/requests/media/encode.d.ts +1 -2
- package/dist/requests/media/encode.js +0 -2
- package/dist/requests/media/resolve-adapter.js +0 -2
- package/dist/requests/string-utils.js +25 -6
- package/dist/requests/types.d.ts +4 -4
- package/dist/scalar/client.js +0 -2
- package/dist/scalar/index.d.ts +1 -2
- package/dist/scalar/index.js +0 -2
- package/dist/server/create.d.ts +2 -3
- package/dist/server/create.js +0 -2
- package/dist/server/proxy.d.ts +1 -2
- package/dist/server/proxy.js +0 -2
- package/dist/server/source-api.d.ts +1 -2
- package/dist/server/source-api.js +0 -2
- package/dist/types.d.ts +1 -2
- package/dist/ui/api-page.d.ts +1 -2
- package/dist/ui/api-page.js +3 -3
- package/dist/ui/base.d.ts +9 -6
- package/dist/ui/base.js +8 -5
- package/dist/ui/client/boundary.d.ts +1 -2
- package/dist/ui/client/boundary.js +0 -2
- package/dist/ui/client/boundary.lazy.js +2 -3
- package/dist/ui/client/full.js +0 -2
- package/dist/ui/client/i18n.js +0 -2
- package/dist/ui/client/index.d.ts +1 -2
- package/dist/ui/client/index.js +0 -2
- package/dist/ui/client/storage-key.js +1 -3
- package/dist/ui/components/accordion.js +0 -2
- package/dist/ui/components/codeblock.d.ts +1 -2
- package/dist/ui/components/codeblock.js +0 -2
- package/dist/ui/components/dialog.js +0 -2
- package/dist/ui/components/input.js +0 -2
- package/dist/ui/components/method-label.js +0 -2
- package/dist/ui/components/select-tab.js +0 -2
- package/dist/ui/components/select.js +0 -2
- package/dist/ui/contexts/api.d.ts +7 -5
- package/dist/ui/contexts/api.js +7 -4
- package/dist/ui/create-client.d.ts +1 -2
- package/dist/ui/create-client.js +6 -3
- package/dist/ui/index.d.ts +1 -2
- package/dist/ui/index.js +0 -2
- package/dist/ui/operation/client.js +0 -2
- package/dist/ui/operation/get-example-requests.d.ts +1 -2
- package/dist/ui/operation/get-example-requests.js +0 -2
- package/dist/ui/operation/index.js +0 -2
- package/dist/ui/operation/request-tabs.d.ts +10 -0
- package/dist/ui/operation/request-tabs.js +43 -39
- package/dist/ui/operation/response-tabs.d.ts +1 -2
- package/dist/ui/operation/response-tabs.js +0 -2
- package/dist/ui/operation/usage-tabs/client.d.ts +1 -2
- package/dist/ui/operation/usage-tabs/client.js +0 -2
- package/dist/ui/operation/usage-tabs/index.js +0 -2
- package/dist/ui/schema/client.d.ts +1 -2
- package/dist/ui/schema/client.js +0 -2
- package/dist/ui/schema/index.d.ts +3 -4
- package/dist/ui/schema/index.js +1 -3
- package/dist/utils/deep-equal.js +0 -2
- package/dist/utils/document/dereference.d.ts +1 -2
- package/dist/utils/document/dereference.js +0 -2
- package/dist/utils/document/process.d.ts +1 -2
- package/dist/utils/document/process.js +0 -2
- package/dist/utils/id-to-title.js +0 -2
- package/dist/utils/is-plain-object.js +0 -2
- package/dist/utils/pages/builder.d.ts +1 -2
- package/dist/utils/pages/builder.js +0 -2
- package/dist/utils/pages/preset-auto.d.ts +1 -2
- package/dist/utils/pages/preset-auto.js +0 -2
- package/dist/utils/pages/to-static-data.js +0 -2
- package/dist/utils/pages/to-text.d.ts +1 -2
- package/dist/utils/pages/to-text.js +5 -6
- package/dist/utils/remove-undefined.js +0 -2
- package/dist/utils/schema/dereference.js +22 -14
- package/dist/utils/schema/index.d.ts +4 -10
- package/dist/utils/schema/index.js +4 -11
- package/dist/utils/{merge-schema.js → schema/merge.js} +2 -4
- package/dist/utils/schema/pick.js +0 -2
- package/dist/utils/schema/ref.js +0 -2
- package/dist/utils/schema/resolve-ref.js +0 -2
- package/dist/utils/schema/to-string.js +4 -7
- package/dist/utils/url.js +0 -2
- package/dist/utils/use-query.js +2 -3
- package/package.json +2 -2
- package/dist/_openapi/types.d.ts.map +0 -1
- package/dist/generate-file.d.ts.map +0 -1
- package/dist/generate-file.js.map +0 -1
- package/dist/i18n.d.ts.map +0 -1
- package/dist/i18n.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/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/all.d.ts.map +0 -1
- package/dist/requests/generators/all.js.map +0 -1
- package/dist/requests/generators/csharp.d.ts.map +0 -1
- package/dist/requests/generators/csharp.js.map +0 -1
- package/dist/requests/generators/curl.d.ts.map +0 -1
- package/dist/requests/generators/curl.js.map +0 -1
- package/dist/requests/generators/go.d.ts.map +0 -1
- package/dist/requests/generators/go.js.map +0 -1
- package/dist/requests/generators/index.d.ts.map +0 -1
- package/dist/requests/generators/index.js.map +0 -1
- package/dist/requests/generators/java.d.ts.map +0 -1
- package/dist/requests/generators/java.js.map +0 -1
- package/dist/requests/generators/javascript.d.ts.map +0 -1
- package/dist/requests/generators/javascript.js.map +0 -1
- package/dist/requests/generators/python.d.ts.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/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/base.d.ts.map +0 -1
- package/dist/ui/base.js.map +0 -1
- package/dist/ui/client/boundary.d.ts.map +0 -1
- package/dist/ui/client/boundary.js.map +0 -1
- package/dist/ui/client/boundary.lazy.js.map +0 -1
- package/dist/ui/client/full.js.map +0 -1
- package/dist/ui/client/i18n.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/codeblock.d.ts.map +0 -1
- package/dist/ui/components/codeblock.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-tab.js.map +0 -1
- package/dist/ui/components/select.js.map +0 -1
- package/dist/ui/contexts/api.d.ts.map +0 -1
- package/dist/ui/contexts/api.js.map +0 -1
- package/dist/ui/create-client.d.ts.map +0 -1
- package/dist/ui/create-client.js.map +0 -1
- package/dist/ui/index.d.ts.map +0 -1
- package/dist/ui/index.js.map +0 -1
- package/dist/ui/operation/client.js.map +0 -1
- package/dist/ui/operation/get-example-requests.d.ts.map +0 -1
- package/dist/ui/operation/get-example-requests.js.map +0 -1
- package/dist/ui/operation/index.js.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.d.ts.map +0 -1
- package/dist/ui/operation/usage-tabs/client.js.map +0 -1
- package/dist/ui/operation/usage-tabs/index.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/utils/deep-equal.js.map +0 -1
- package/dist/utils/document/dereference.d.ts.map +0 -1
- package/dist/utils/document/dereference.js.map +0 -1
- package/dist/utils/document/process.d.ts.map +0 -1
- package/dist/utils/document/process.js.map +0 -1
- package/dist/utils/id-to-title.js.map +0 -1
- package/dist/utils/is-plain-object.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-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/remove-undefined.js.map +0 -1
- package/dist/utils/schema/dereference.js.map +0 -1
- package/dist/utils/schema/index.d.ts.map +0 -1
- package/dist/utils/schema/index.js.map +0 -1
- package/dist/utils/schema/pick.js.map +0 -1
- package/dist/utils/schema/ref.js.map +0 -1
- package/dist/utils/schema/resolve-ref.js.map +0 -1
- package/dist/utils/schema/to-string.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":"adapter.js","names":[],"sources":["../../../src/requests/media/adapter.ts"],"sourcesContent":["import { escapeString, inputToString } from '@/requests/string-utils';\nexport { resolveMediaAdapter, isMediaTypeSupported } from './resolve-adapter';\n// @ts-expect-error -- untyped\nimport js2xml from 'xml-js/lib/js2xml';\n\ninterface BaseContext {\n /**\n * Passed by your custom example generator, for your custom media adapter to receive.\n */\n customData?: Record<string, unknown>;\n}\n\ninterface GoContext extends BaseContext {\n lang: 'go';\n addImport: (name: string) => void;\n}\n\ninterface JavaScriptContext extends BaseContext {\n lang: 'js';\n addImport: (pkg: string, name: string) => void;\n}\n\ninterface JavaContext extends BaseContext {\n lang: 'java';\n addImport: (specifier: string) => void;\n}\n\ninterface CSharpContext extends BaseContext {\n lang: 'csharp';\n addImport: (specifier: string) => void;\n}\n\nexport type MediaContext =\n | JavaContext\n | GoContext\n | JavaScriptContext\n | CSharpContext\n | (BaseContext & { lang: string });\n\nexport interface MediaAdapter {\n /**\n * encode data into specified media type for `fetch()`.\n *\n * Return the encoded form of `data.body` property.\n */\n encode: (data: { body: unknown }) => BodyInit;\n\n /**\n * generate code example for creating the body in a given programming language.\n *\n * @param data - request data.\n * @param lang - name of programming language.\n * @param ctx - context passed from the generator of programming language.\n *\n * @returns code that inits a `body` variable, or undefined if not supported (skip example for that language).\n */\n generateExample: (data: { body: unknown }, ctx: MediaContext) => string | undefined;\n}\n\nexport const defaultAdapters = {\n 'application/json': {\n encode(data) {\n return JSON.stringify(data.body);\n },\n generateExample(data, ctx) {\n return str(data.body, 'application/json', ctx);\n },\n },\n 'application/xml': {\n encode(data) {\n return js2xml(data.body as Record<string, unknown>, {\n compact: true,\n spaces: 2,\n });\n },\n generateExample(data, ctx) {\n return str(data.body, 'application/xml', ctx);\n },\n },\n 'application/x-ndjson': {\n encode(data) {\n if (Array.isArray(data.body)) {\n return data.body.map((v) => JSON.stringify(v)).join('\\n');\n }\n\n return JSON.stringify(data.body);\n },\n generateExample(data, ctx) {\n return str(data.body, 'application/x-ndjson', ctx);\n },\n },\n 'application/x-www-form-urlencoded': {\n encode(data) {\n if (typeof data.body !== 'object')\n throw new Error(`Input value must be object, received: ${typeof data.body}`);\n\n const params = new URLSearchParams();\n for (const key in data.body) {\n params.set(key, String(data.body[key as keyof object]));\n }\n\n return params;\n },\n generateExample(data, ctx) {\n if (ctx.lang === 'js') {\n return `const body = new URLSearchParams(${JSON.stringify(data.body, null, 2)})`;\n }\n\n return str(data.body, 'application/x-www-form-urlencoded', ctx);\n },\n },\n 'multipart/form-data': {\n encode(data) {\n const formData = new FormData();\n const body = data.body as Record<string, unknown>;\n\n if (typeof body !== 'object' || !body) {\n throw new Error(`Unsupported body type: ${typeof body}, expected: object`);\n }\n\n for (const key in body) {\n const prop = body[key];\n\n if (prop === null || prop === undefined || Number.isNaN(prop)) continue;\n\n // Arrays (multi-value field)\n if (Array.isArray(prop)) {\n for (const item of prop) {\n if (item === null || item === undefined) continue;\n if (item instanceof File) {\n formData.append(key, item, item.name);\n } else if (item instanceof Blob) {\n formData.append(key, item, 'blob');\n } else if (typeof item === 'object') {\n formData.append(key, JSON.stringify(item));\n } else {\n formData.append(key, String(item));\n }\n }\n }\n\n // Single File\n else if (prop instanceof File) {\n formData.set(key, prop, prop.name);\n }\n\n // Single Blob\n else if (prop instanceof Blob) {\n formData.set(key, prop, 'blob');\n }\n\n // Any other object (stringify)\n else if (typeof prop === 'object') {\n formData.set(key, JSON.stringify(prop));\n }\n\n // Primitive types\n else {\n formData.set(key, String(prop));\n }\n }\n\n return formData;\n },\n generateExample(data, ctx) {\n if (ctx.lang === 'python') {\n return `body = ${JSON.stringify(data.body, null, 2)}`;\n }\n\n const s: string[] = [];\n if (ctx.lang === 'js') {\n s.push(`const body = new FormData();`);\n\n for (const [key, value] of Object.entries(data.body as object)) {\n s.push(`body.set(${key}, ${JSON.stringify(inputToString(value))})`);\n }\n }\n\n if (ctx.lang === 'go') {\n const { addImport } = ctx as GoContext;\n addImport('mime/multipart');\n addImport('bytes');\n\n s.push('body := new(bytes.Buffer)');\n s.push('mp := multipart.NewWriter(payload)');\n\n for (const [key, value] of Object.entries(data.body as object)) {\n if (!value) continue;\n\n const escaped = escapeString(inputToString(value, 'application/json'), '`');\n\n s.push(`mp.WriteField(\"${key}\", ${escaped})`);\n }\n }\n\n if (ctx.lang === 'java') {\n const { addImport } = ctx as JavaContext;\n addImport('java.net.http.HttpRequest.BodyPublishers');\n\n s.push(`var body = BodyPublishers.ofByteArray(new byte[] { ... });`);\n }\n\n if (ctx.lang === 'csharp') {\n s.push(`var body = new MultipartFormDataContent();`);\n }\n\n if (s.length > 0) return s.join('\\n');\n },\n },\n 'application/octet-stream': {\n encode(data) {\n return data.body as BodyInit;\n },\n generateExample() {\n // not supported\n return undefined;\n },\n },\n} satisfies Record<string, MediaAdapter>;\n\nfunction str(\n init: unknown,\n mediaType:\n | 'application/x-www-form-urlencoded'\n | 'application/x-ndjson'\n | 'application/json'\n | 'application/xml',\n ctx: MediaContext,\n) {\n if (ctx.lang === 'js') {\n if (mediaType === 'application/json') {\n return `const body = JSON.stringify(${JSON.stringify(init, null, 2)})`;\n }\n return `const body = ${escapeString(inputToString(init, mediaType), '`')}`;\n }\n\n if (ctx.lang === 'python') {\n return `body = ${escapeString(inputToString(init, mediaType), '\"\"\"')}`;\n }\n\n if (ctx.lang === 'go') {\n const { addImport } = ctx as GoContext;\n addImport('strings');\n return `body := strings.NewReader(${escapeString(inputToString(init, mediaType), '`')})`;\n }\n\n if (ctx.lang === 'java') {\n const { addImport } = ctx as JavaContext;\n addImport('java.net.http.HttpRequest.BodyPublishers');\n return `var body = BodyPublishers.ofString(${escapeString(inputToString(init, mediaType), '\"\"\"')});`;\n }\n\n if (ctx.lang === 'csharp') {\n const input = `\\n${inputToString(init, mediaType)}\\n`;\n\n return `var body = new StringContent(${escapeString(input, '\"\"\"')}, Encoding.UTF8, \"${mediaType}\");`;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"encode.d.ts","names":[],"sources":["../../../src/requests/media/encode.ts"],"mappings":";UAKiB,gBAAA;EAAA,SACN,KAAA;AAAA;AAAA,UAGM,wBAAA;EAAA,SACN,MAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"encode.js","names":[],"sources":["../../../src/requests/media/encode.ts"],"sourcesContent":["import type { MediaAdapter } from '@/requests/media/adapter';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\nimport type { ParameterObject } from '@/types';\nimport type { RawRequestData, RequestData } from '@/requests/types';\n\nexport interface EncodedParameter {\n readonly value: string;\n}\n\nexport interface EncodedParameterMultiple {\n readonly values: string[];\n}\n\n/**\n * serialize parameters, see https://swagger.io/docs/specification/v3_0/serialization.\n */\nexport function encodeRequestData(\n from: RawRequestData,\n adapters: Record<string, MediaAdapter>,\n parameters: ParameterObject[] = [],\n): RequestData {\n const result: RequestData = {\n method: from.method,\n body: from.body,\n bodyMediaType: from.bodyMediaType,\n cookie: {},\n header: {},\n path: {},\n query: {},\n };\n\n for (const type of ['cookie', 'query', 'header', 'path'] as const) {\n for (const key in from[type]) {\n const value = from[type][key];\n if (value == null) continue;\n\n const field: ParameterObject = parameters.find((p) => p.name === key && p.in === type) ?? {\n name: key,\n in: type,\n };\n\n const encoder = getMediaEncoder(field, adapters);\n if (encoder) {\n if (type === 'query') result[type][key] = { values: [encoder(value)] };\n else result[type][key] = { value: encoder(value) };\n continue;\n }\n\n switch (type) {\n case 'path':\n serializePathParameter(field, value, result.path);\n break;\n case 'query':\n serializeQueryParameter(field, value, result.query);\n break;\n case 'header': {\n result.header[key] = {\n value: serializeSimple(value, field.explode ?? false),\n };\n break;\n }\n case 'cookie':\n serializeCookieParameter(field, value, result.cookie);\n break;\n }\n }\n }\n\n return result;\n}\n\nfunction getMediaEncoder(field: ParameterObject, adapters: Record<string, MediaAdapter>) {\n if (!field.content) return;\n\n for (const k in field.content) {\n const adapter = resolveMediaAdapter(k, adapters);\n if (adapter) {\n return (v: unknown) => String(adapter.encode({ body: v }));\n }\n }\n}\n\nfunction serializeSimple(value: NonNullable<unknown>, explode: boolean): string {\n if (Array.isArray(value)) {\n return value.join(',');\n }\n if (typeof value === 'object') {\n return explode\n ? Object.entries(value)\n .map(([k, v]) => `${k}=${v}`)\n .join(',')\n : Object.entries(value).flat().join(',');\n }\n return String(value);\n}\n\nfunction serializePathParameter(\n field: ParameterObject,\n value: NonNullable<unknown>,\n // write output\n output: Record<string, EncodedParameter>,\n): void {\n const { explode = false, name } = field;\n\n switch (field.style) {\n case 'label':\n if (Array.isArray(value)) {\n output[field.name!] = {\n value: '.' + value.join(explode ? '.' : ','),\n };\n break;\n }\n if (typeof value === 'object') {\n output[field.name!] = {\n value:\n '.' +\n (explode\n ? Object.entries(value)\n .map(([k, v]) => `${k}=${v}`)\n .join('.')\n : Object.entries(value).flat().join(',')),\n };\n break;\n }\n output[field.name!] = {\n value: `.${value}`,\n };\n break;\n case 'matrix': {\n const specifier = `;${name}=`;\n\n if (Array.isArray(value)) {\n output[field.name!] = {\n value: explode\n ? `${specifier}${value.join(',')}`\n : `${specifier}${value.join(specifier)}`,\n };\n break;\n }\n if (typeof value === 'object') {\n output[field.name!] = {\n value: explode\n ? Object.entries(value)\n .map(([k, v]) => `;${k}=${v}`)\n .join('')\n : specifier + Object.entries(value).flat().join(','),\n };\n break;\n }\n\n output[field.name!] = {\n value: `${specifier}${value}`,\n };\n break;\n }\n // simple\n default:\n output[field.name!] = {\n value: serializeSimple(value, explode),\n };\n }\n}\n\nfunction serializeQueryParameter(\n field: ParameterObject,\n value: NonNullable<unknown>,\n // write output\n output: Record<string, EncodedParameterMultiple>,\n): void {\n const { style, explode = true } = field;\n\n if (style === 'spaceDelimited' && !explode && Array.isArray(value)) {\n output[field.name!] = {\n values: [value.join(' ')],\n };\n return;\n }\n\n if (style === 'pipeDelimited' && !explode && Array.isArray(value)) {\n output[field.name!] = {\n values: [value.join('|')],\n };\n return;\n }\n\n if (style === 'deepObject' && !Array.isArray(value) && typeof value === 'object') {\n for (const [k, v] of Object.entries(value)) {\n output[`${field.name}[${k}]`] = {\n // note: the behaviour of nested array is undefined, we do this to avoid edge cases\n values: Array.isArray(v) ? v : [String(v)],\n };\n }\n return;\n }\n\n if (Array.isArray(value)) {\n output[field.name!] = {\n values: explode ? value : [value.join(',')],\n };\n return;\n }\n\n if (typeof value === 'object' && explode) {\n for (const [k, v] of Object.entries(value)) {\n output[k] = {\n values: [String(v)],\n };\n }\n return;\n }\n\n if (typeof value === 'object') {\n output[field.name!] = {\n values: [Object.entries(value).flat().join(',')],\n };\n return;\n }\n\n output[field.name!] = {\n values: [String(value)],\n };\n}\n\nfunction serializeCookieParameter(\n field: ParameterObject,\n value: NonNullable<unknown>,\n // write output\n output: Record<string, EncodedParameter>,\n) {\n const { explode = true } = field;\n\n // form\n if (Array.isArray(value)) {\n output[field.name!] = {\n value: explode ? value.map((v) => `${field.name}=${v}`).join('&') : value.join(','),\n };\n } else if (typeof value === 'object' && explode) {\n for (const [k, v] of Object.entries(value)) {\n output[k] = {\n value: String(v),\n };\n }\n } else if (typeof value === 'object') {\n output[field.name!] = {\n value: Object.entries(value).flat().join(','),\n };\n } else {\n output[field.name!] = {\n value: String(value),\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-adapter.js","names":[],"sources":["../../../src/requests/media/resolve-adapter.ts"],"sourcesContent":["import type { MediaAdapter } from './adapter';\n\nconst VariantMediaTypeRegex =\n /^(?<dir>[a-zA-Z0-9._-]+)\\/(?<content>[a-zA-Z0-9._-]+)\\+(?<variant>[a-zA-Z0-9._-]+)$/;\n\n/**\n * Resolve a media adapter for a given media type.\n * Supports exact matches and pattern matching (e.g., +json suffix).\n *\n * @param mediaType - The media type to resolve (e.g., \"application/json\", \"application/json-patch+json\")\n * @param adapters - Record of media adapters\n * @returns The resolved adapter or undefined if not found\n */\nexport function resolveMediaAdapter(\n mediaType: string,\n adapters: Record<string, MediaAdapter>,\n): MediaAdapter | undefined {\n // Normalize media type (remove parameters like charset)\n const normalized = mediaType.split(';', 2)[0].trim().toLowerCase();\n\n if (normalized in adapters) {\n return adapters[normalized];\n }\n\n const match = VariantMediaTypeRegex.exec(normalized);\n if (match?.groups) {\n const baseType = `${match.groups.dir}/${match.groups.variant}`;\n\n if (baseType in adapters) {\n return adapters[baseType];\n }\n }\n\n if (mediaType === 'text/plain') {\n console.warn(\n 'there is no defined behaviour for encoding form values into \"text/plain\", using JSON encoder for now.',\n );\n return adapters['application/json'];\n }\n}\n\n/**\n * Check if a media type is supported by the given adapters.\n *\n * @param mediaType - The media type to check\n * @param adapters - Record of media adapters\n * @returns true if the media type is supported\n */\nexport function isMediaTypeSupported(\n mediaType: string,\n adapters: Record<string, MediaAdapter>,\n): boolean {\n return resolveMediaAdapter(mediaType, adapters) !== undefined;\n}\n"],"mappings":";AAEA,MAAM,wBACJ;;;;;;;;;AAUF,SAAgB,oBACd,WACA,UAC0B;CAE1B,MAAM,aAAa,UAAU,MAAM,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,aAAa;AAElE,KAAI,cAAc,SAChB,QAAO,SAAS;CAGlB,MAAM,QAAQ,sBAAsB,KAAK,WAAW;AACpD,KAAI,OAAO,QAAQ;EACjB,MAAM,WAAW,GAAG,MAAM,OAAO,IAAI,GAAG,MAAM,OAAO;AAErD,MAAI,YAAY,SACd,QAAO,SAAS;;AAIpB,KAAI,cAAc,cAAc;AAC9B,UAAQ,KACN,0GACD;AACD,SAAO,SAAS;;;;;;;;;;AAWpB,SAAgB,qBACd,WACA,UACS;AACT,QAAO,oBAAoB,WAAW,SAAS,KAAK,KAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"string-utils.js","names":[],"sources":["../../src/requests/string-utils.ts"],"sourcesContent":["// @ts-expect-error -- nothing\nimport js2xml from 'xml-js/lib/js2xml';\n\n/**\n * Convert input value to hardcoded string (with quotes)\n */\nexport function inputToString(\n value: unknown,\n format:\n | 'application/x-www-form-urlencoded'\n | 'application/x-ndjson'\n | 'application/json'\n | 'application/xml' = 'application/json',\n): string {\n if (typeof value === 'string') return value;\n\n if (format === 'application/json') {\n return JSON.stringify(value, null, 2);\n }\n\n if (format === 'application/x-ndjson') {\n return Array.isArray(value)\n ? value.map((v) => JSON.stringify(v)).join('\\n')\n : JSON.stringify(value, null, 2);\n }\n\n if (format === 'application/x-www-form-urlencoded') {\n const params = new URLSearchParams();\n if (typeof value !== 'object')\n throw new Error(\n `For url encoded data, \\`value\\` must be an object, but received: ${typeof value}`,\n );\n\n for (const key in value) {\n if (value[key as keyof object]) params.set(key, String(value[key as keyof object]));\n }\n\n return params.toString();\n }\n\n return js2xml(value, { compact: true, spaces: 2 });\n}\n\nexport function escapeString(str: string, delimit?: string): string {\n if (!delimit) return JSON.stringify(str);\n\n return `${delimit}${str.replaceAll(delimit, `\\\\${delimit}`)}${delimit}`;\n}\n\nexport function indent(code: string, tab: number = 1) {\n const p = ' '.repeat(tab);\n return code\n .split('\\n')\n .map((v) => (v.length === 0 ? v : p + v))\n .join('\\n');\n}\n"],"mappings":";;;;;AAMA,SAAgB,cACd,OACA,SAIwB,oBAChB;AACR,KAAI,OAAO,UAAU,SAAU,QAAO;AAEtC,KAAI,WAAW,mBACb,QAAO,KAAK,UAAU,OAAO,MAAM,EAAE;AAGvC,KAAI,WAAW,uBACb,QAAO,MAAM,QAAQ,MAAM,GACvB,MAAM,KAAK,MAAM,KAAK,UAAU,EAAE,CAAC,CAAC,KAAK,KAAK,GAC9C,KAAK,UAAU,OAAO,MAAM,EAAE;AAGpC,KAAI,WAAW,qCAAqC;EAClD,MAAM,SAAS,IAAI,iBAAiB;AACpC,MAAI,OAAO,UAAU,SACnB,OAAM,IAAI,MACR,oEAAoE,OAAO,QAC5E;AAEH,OAAK,MAAM,OAAO,MAChB,KAAI,MAAM,KAAsB,QAAO,IAAI,KAAK,OAAO,MAAM,KAAqB,CAAC;AAGrF,SAAO,OAAO,UAAU;;AAG1B,QAAO,OAAO,OAAO;EAAE,SAAS;EAAM,QAAQ;EAAG,CAAC;;AAGpD,SAAgB,aAAa,KAAa,SAA0B;AAClE,KAAI,CAAC,QAAS,QAAO,KAAK,UAAU,IAAI;AAExC,QAAO,GAAG,UAAU,IAAI,WAAW,SAAS,KAAK,UAAU,GAAG;;AAGhE,SAAgB,OAAO,MAAc,MAAc,GAAG;CACpD,MAAM,IAAI,KAAK,OAAO,IAAI;AAC1B,QAAO,KACJ,MAAM,KAAK,CACX,KAAK,MAAO,EAAE,WAAW,IAAI,IAAI,IAAI,EAAG,CACxC,KAAK,KAAK"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../../src/requests/types.ts"],"mappings":";;;UAEiB,cAAA;EACf,MAAA;EAEA,IAAA,EAAM,MAAA;EACN,KAAA,EAAO,MAAA;EACP,MAAA,EAAQ,MAAA;EACR,MAAA,EAAQ,MAAA;EAER,IAAA;EACA,aAAA;AAAA;AAAA,UAGe,WAAA;EACf,MAAA;EAEA,IAAA,EAAM,MAAA,SAAe,gBAAA;EACrB,KAAA,EAAO,MAAA,SAAe,wBAAA;EACtB,MAAA,EAAQ,MAAA,SAAe,gBAAA;EACvB,MAAA,EAAQ,MAAA,SAAe,gBAAA;EAEvB,IAAA;EACA,aAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":[],"sources":["../../src/scalar/client.tsx"],"sourcesContent":["'use client';\nimport { cn } from '@/utils/cn';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport { ApiClientModalProvider, useApiClientModal } from '@scalar/api-client-react';\nimport { MethodLabel } from '@/ui/components/method-label';\nimport { useTheme } from 'next-themes';\nimport { useEffect, useState } from 'react';\nimport '@scalar/api-client-react/style.css';\nimport type { HttpMethods } from '@/types';\n\nexport default function ScalarPlayground({\n path,\n method,\n spec,\n}: {\n spec: object;\n path: string;\n method: string;\n}) {\n const { resolvedTheme } = useTheme();\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n return (\n <div\n className={cn(\n 'flex flex-row items-center gap-2.5 p-3 rounded-xl border bg-fd-card text-fd-card-foreground not-prose',\n mounted ? `${resolvedTheme}-mode` : null,\n )}\n >\n <MethodLabel className=\"text-xs\">{method}</MethodLabel>\n <code className=\"flex-1 overflow-auto text-nowrap text-[0.8125rem] text-fd-muted-foreground\">\n {path}\n </code>\n <ApiClientModalProvider\n configuration={{\n theme: 'moon',\n content: spec,\n }}\n >\n <Trigger path={path} method={method} />\n </ApiClientModalProvider>\n </div>\n );\n}\n\nfunction Trigger({ path, method }: { path: string; method: string }) {\n const client = useApiClientModal();\n\n return (\n <button\n type=\"submit\"\n className={cn(buttonVariants({ color: 'primary', size: 'sm' }), 'px-3 py-1.5')}\n onClick={() => client?.open({ path, method: method as HttpMethods })}\n >\n Test\n </button>\n );\n}\n"],"mappings":";;;;;;;;;;AAUA,SAAwB,iBAAiB,EACvC,MACA,QACA,QAKC;CACD,MAAM,EAAE,kBAAkB,UAAU;CACpC,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;AAE7C,iBAAgB;AACd,aAAW,KAAK;IACf,EAAE,CAAC;AAEN,QACE,qBAAC,OAAD;EACE,WAAW,GACT,yGACA,UAAU,GAAG,cAAc,SAAS,KACrC;YAJH;GAME,oBAAC,aAAD;IAAa,WAAU;cAAW;IAAqB,CAAA;GACvD,oBAAC,QAAD;IAAM,WAAU;cACb;IACI,CAAA;GACP,oBAAC,wBAAD;IACE,eAAe;KACb,OAAO;KACP,SAAS;KACV;cAED,oBAAC,SAAD;KAAe;KAAc;KAAU,CAAA;IAChB,CAAA;GACrB;;;AAIV,SAAS,QAAQ,EAAE,MAAM,UAA4C;CACnE,MAAM,SAAS,mBAAmB;AAElC,QACE,oBAAC,UAAD;EACE,MAAK;EACL,WAAW,GAAG,eAAe;GAAE,OAAO;GAAW,MAAM;GAAM,CAAC,EAAE,cAAc;EAC9E,eAAe,QAAQ,KAAK;GAAE;GAAc;GAAuB,CAAC;YACrE;EAEQ,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/scalar/index.tsx"],"mappings":";;;;;AAuBA;;;iBAAgB,UAAA,CAAW,OAAA,GAAS,oBAAA,GAA4B,oBAAA"}
|
package/dist/scalar/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/scalar/index.tsx"],"sourcesContent":["import type { MethodInformation, RenderContext } from '@/types';\nimport type { CreateAPIPageOptions } from '@/ui';\nimport { lazy } from 'react';\n\nconst Client = lazy(() => import('./client'));\n\nfunction APIPlayground({\n path,\n method,\n ctx,\n}: {\n path: string;\n method: MethodInformation;\n ctx: RenderContext;\n}) {\n return <Client method={method.method} path={path} spec={ctx.schema.bundled} />;\n}\n\n/**\n * Enable Scalar for API playgrounds by wrapping your options inside.\n *\n * Requires `@scalar/api-client-react` to be installed, it imports the styles automatically.\n */\nexport function withScalar(options: CreateAPIPageOptions = {}): CreateAPIPageOptions {\n return {\n ...options,\n playground: {\n ...options.playground,\n render(props) {\n return <APIPlayground {...props} />;\n },\n },\n };\n}\n"],"mappings":";;;AAIA,MAAM,SAAS,WAAW,OAAO,eAAY;AAE7C,SAAS,cAAc,EACrB,MACA,QACA,OAKC;AACD,QAAO,oBAAC,QAAD;EAAQ,QAAQ,OAAO;EAAc;EAAM,MAAM,IAAI,OAAO;EAAW,CAAA;;;;;;;AAQhF,SAAgB,WAAW,UAAgC,EAAE,EAAwB;AACnF,QAAO;EACL,GAAG;EACH,YAAY;GACV,GAAG,QAAQ;GACX,OAAO,OAAO;AACZ,WAAO,oBAAC,eAAD,EAAe,GAAI,OAAS,CAAA;;GAEtC;EACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","names":[],"sources":["../../src/server/create.ts"],"mappings":";;;;;;;;AAGsE;KAMjE,SAAA,GAAY,MAAA,kBAAwB,QAAA;AAAA,KACpC,kBAAA,GAAqB,MAAA,SAAe,iBAAA;AAAA,UAExB,cAAA;EAHgC;AAAA;;;;;EAU/C,KAAA,qBAA0B,SAAA,GAAY,OAAA,CAAQ,SAAA;EAE9C,YAAA;;;;EAKA,QAAA;AAAA;AAAA,UAGe,aAAA;EACf,WAAA,SAAoB,WAAA;EACpB,UAAA,QAAkB,OAAA,CAAQ,kBAAA;EAC1B,SAAA,GAAY,QAAA,aAAqB,OAAA,CAAQ,iBAAA;EAbK;EAe9C,cAAA;EAAA,SACS,OAAA,EAAS,cAAA;AAAA;AAAA,iBAGJ,aAAA,CAAc,OAAA,GAAS,cAAA,GAAsB,aAAA;AAT7D;;;AAAA,iBAuDgB,gBAAA,GAAA,CACd,OAAA,EAAS,wBAAA,CAAyB,CAAA,IACjC,wBAAA,CAAyB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","names":[],"sources":["../../src/server/create.ts"],"sourcesContent":["import { createProxy } from '@/server/proxy';\nimport { processDocument, type ProcessedDocument } from '@/utils/document/process';\nimport type { Document } from '@/types';\nimport type { InlineCodeUsageGenerator } from '@/requests/generators';\nimport fs from 'node:fs';\n\n/**\n * schema id -> file path, URL, or downloaded schema object\n */\ntype SchemaMap = Record<string, string | Document>;\ntype ProcessedSchemaMap = Record<string, ProcessedDocument>;\n\nexport interface OpenAPIOptions {\n /**\n * Schema files, can be:\n * - URL\n * - file path\n * - a function returning records of downloaded schemas.\n */\n input?: string[] | (() => SchemaMap | Promise<SchemaMap>);\n\n disableCache?: boolean;\n\n /**\n * The url of proxy to avoid CORS issues\n */\n proxyUrl?: string;\n}\n\nexport interface OpenAPIServer {\n createProxy: typeof createProxy;\n getSchemas: () => Promise<ProcessedSchemaMap>;\n getSchema: (document: string) => Promise<ProcessedDocument>;\n /** @private internal API */\n _getWatchPaths: () => string[];\n readonly options: OpenAPIOptions;\n}\n\nexport function createOpenAPI(options: OpenAPIOptions = {}): OpenAPIServer {\n const { input = [], disableCache = false } = options;\n let schemas: Promise<ProcessedSchemaMap> | undefined;\n\n async function getSchemas(): Promise<ProcessedSchemaMap> {\n if (Array.isArray(input)) {\n const entries = await Promise.all(\n input.map(async (item) => [item, await processDocument(item)]),\n );\n return Object.fromEntries(entries);\n } else {\n const entries = await Promise.all(\n Object.entries(await input()).map(async ([k, v]) => [k, await processDocument(v)]),\n );\n return Object.fromEntries(entries);\n }\n }\n\n return {\n options,\n createProxy,\n _getWatchPaths() {\n const keys = Array.isArray(input) ? input : Object.keys(input);\n return keys.filter((key) => !URL.canParse(key) && fs.existsSync(key));\n },\n async getSchema(document) {\n const schemas = await this.getSchemas();\n if (document in schemas) return schemas[document];\n\n console.warn(\n `[Fumadocs OpenAPI] the document \"${document}\" is not listed in the input array, this may not be expected.`,\n );\n // do not cache unlisted documents\n return processDocument(document);\n },\n async getSchemas() {\n if (disableCache) return getSchemas();\n\n return (schemas ??= getSchemas());\n },\n };\n}\n\n/**\n * @deprecated\n */\nexport function createCodeSample<T>(\n options: InlineCodeUsageGenerator<T>,\n): InlineCodeUsageGenerator<T> {\n return options;\n}\n"],"mappings":";;;;AAsCA,SAAgB,cAAc,UAA0B,EAAE,EAAiB;CACzE,MAAM,EAAE,QAAQ,EAAE,EAAE,eAAe,UAAU;CAC7C,IAAI;CAEJ,eAAe,aAA0C;AACvD,MAAI,MAAM,QAAQ,MAAM,EAAE;GACxB,MAAM,UAAU,MAAM,QAAQ,IAC5B,MAAM,IAAI,OAAO,SAAS,CAAC,MAAM,MAAM,gBAAgB,KAAK,CAAC,CAAC,CAC/D;AACD,UAAO,OAAO,YAAY,QAAQ;SAC7B;GACL,MAAM,UAAU,MAAM,QAAQ,IAC5B,OAAO,QAAQ,MAAM,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,OAAO,CAAC,GAAG,MAAM,gBAAgB,EAAE,CAAC,CAAC,CACnF;AACD,UAAO,OAAO,YAAY,QAAQ;;;AAItC,QAAO;EACL;EACA;EACA,iBAAiB;AAEf,WADa,MAAM,QAAQ,MAAM,GAAG,QAAQ,OAAO,KAAK,MAAM,EAClD,QAAQ,QAAQ,CAAC,IAAI,SAAS,IAAI,IAAI,GAAG,WAAW,IAAI,CAAC;;EAEvE,MAAM,UAAU,UAAU;GACxB,MAAM,UAAU,MAAM,KAAK,YAAY;AACvC,OAAI,YAAY,QAAS,QAAO,QAAQ;AAExC,WAAQ,KACN,oCAAoC,SAAS,+DAC9C;AAED,UAAO,gBAAgB,SAAS;;EAElC,MAAM,aAAa;AACjB,OAAI,aAAc,QAAO,YAAY;AAErC,UAAQ,YAAY,YAAY;;EAEnC;;;;;AAMH,SAAgB,iBACd,SAC6B;AAC7B,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","names":[],"sources":["../../src/server/proxy.ts"],"mappings":";cAAM,OAAA;AAAA,KAGD,OAAA,IAAW,GAAA,EAAK,OAAA,KAAY,OAAA,CAAQ,QAAA;AAAA,UAExB,KAAA,SAAc,MAAA,SAAe,OAAA,WAAkB,OAAA;EAC9D,MAAA,EAAQ,OAAA;AAAA;AAAA,UAGO,kBAAA;EANZ;;;;;EAYH,WAAA;EAZsC;;;EAiBtC,cAAA;EAjB+B;;;;AAEjC;EAsBE,aAAA,IAAiB,OAAA,EAAS,OAAA;;;;EAK1B,SAAA;IACE,OAAA,IAAW,OAAA,EAAS,OAAA,KAAY,OAAA;IAChC,QAAA,IAAY,QAAA,EAAU,QAAA,KAAa,QAAA;EAAA;AAAA;AAAA,iBAIvB,WAAA,CAAY,OAAA,GAAS,kBAAA,GAA0B,KAAA"}
|
package/dist/server/proxy.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","names":[],"sources":["../../src/server/proxy.ts"],"sourcesContent":["const methods = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD'] as const;\nconst methodsWithBody = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);\n\ntype Handler = (req: Request) => Promise<Response>;\n\nexport interface Proxy extends Record<(typeof methods)[number], Handler> {\n handle: Handler;\n}\n\nexport interface CreateProxyOptions {\n /**\n * Filter by prefixes of request url\n *\n * @deprecated Use `allowedOrigins` for filtering origins, or `filterRequest` for more detailed rules.\n */\n allowedUrls?: string[];\n\n /**\n * List of allowed origins to proxy to.\n */\n allowedOrigins?: string[];\n\n /**\n * Determine if the proxied request is allowed.\n *\n * @returns true if allowed, otherwise forbidden.\n */\n filterRequest?: (request: Request) => boolean;\n\n /**\n * Override proxied request/response with yours\n */\n overrides?: {\n request?: (request: Request) => Request;\n response?: (response: Response) => Response;\n };\n}\n\nexport function createProxy(options: CreateProxyOptions = {}): Proxy {\n const {\n allowedOrigins,\n allowedUrls,\n filterRequest = (req) => {\n return !allowedUrls || allowedUrls.some((item) => req.url.startsWith(item));\n },\n overrides,\n } = options;\n const handlers: Partial<Proxy> = {\n handle: handler,\n };\n\n async function handler(req: Request): Promise<Response> {\n const searchParams = new URL(req.url).searchParams;\n const rawUrl = searchParams.get('url');\n\n if (!rawUrl)\n return Response.json('[Proxy] A `url` query parameter is required for proxy url', {\n status: 400,\n });\n\n const targetUrl = URL.parse(rawUrl);\n if (!targetUrl)\n return Response.json('[Proxy] Invalid `url` parameter value.', {\n status: 400,\n });\n\n if (allowedOrigins && !allowedOrigins.includes(targetUrl.origin)) {\n return Response.json(`[Proxy] The origin \"${targetUrl.origin}\" is not allowed.`, {\n status: 400,\n });\n }\n\n const proxied = await rewriteRequest(req, targetUrl, searchParams.get('cookie'));\n\n if (!filterRequest(proxied)) {\n return Response.json('[Proxy] The proxied request is not allowed', {\n status: 403,\n });\n }\n\n try {\n return rewriteResponse(await fetch(proxied));\n } catch (err) {\n return Response.json(\n `[Proxy] Failed to proxy request: ${err instanceof Error ? err.message : 'unknown reason'}`,\n {\n status: 500,\n },\n );\n }\n }\n\n async function rewriteRequest(\n request: Request,\n url: URL,\n cookie: string | null,\n ): Promise<Request> {\n const headers = new Headers(request.headers);\n headers.delete('origin');\n if (cookie) {\n headers.set('Cookie', cookie);\n }\n\n const contentLength = headers.get('content-length');\n const hasBody = contentLength && parseInt(contentLength) > 0;\n\n const proxied = new Request(url, {\n method: request.method,\n cache: 'no-cache',\n headers,\n body:\n hasBody && methodsWithBody.has(request.method.toUpperCase())\n ? await request.arrayBuffer()\n : undefined,\n });\n\n return overrides?.request ? overrides.request(proxied) : proxied;\n }\n\n async function rewriteResponse(response: Response): Promise<Response> {\n if (overrides?.response) {\n response = overrides.response(response);\n }\n\n const headers = new Headers(response.headers);\n headers.forEach((_value, originalKey) => {\n const key = originalKey.toLowerCase();\n\n if (key.startsWith('access-control-')) {\n headers.delete(originalKey);\n }\n });\n headers.set('X-Forwarded-Host', response.url);\n\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n }\n\n for (const key of methods) {\n handlers[key] = handler;\n }\n\n return handlers as Proxy;\n}\n"],"mappings":";AAAA,MAAM,UAAU;CAAC;CAAO;CAAQ;CAAO;CAAU;CAAS;CAAO;AACjE,MAAM,kBAAkB,IAAI,IAAI;CAAC;CAAQ;CAAO;CAAS;CAAS,CAAC;AAqCnE,SAAgB,YAAY,UAA8B,EAAE,EAAS;CACnE,MAAM,EACJ,gBACA,aACA,iBAAiB,QAAQ;AACvB,SAAO,CAAC,eAAe,YAAY,MAAM,SAAS,IAAI,IAAI,WAAW,KAAK,CAAC;IAE7E,cACE;CACJ,MAAM,WAA2B,EAC/B,QAAQ,SACT;CAED,eAAe,QAAQ,KAAiC;EACtD,MAAM,eAAe,IAAI,IAAI,IAAI,IAAI,CAAC;EACtC,MAAM,SAAS,aAAa,IAAI,MAAM;AAEtC,MAAI,CAAC,OACH,QAAO,SAAS,KAAK,6DAA6D,EAChF,QAAQ,KACT,CAAC;EAEJ,MAAM,YAAY,IAAI,MAAM,OAAO;AACnC,MAAI,CAAC,UACH,QAAO,SAAS,KAAK,0CAA0C,EAC7D,QAAQ,KACT,CAAC;AAEJ,MAAI,kBAAkB,CAAC,eAAe,SAAS,UAAU,OAAO,CAC9D,QAAO,SAAS,KAAK,uBAAuB,UAAU,OAAO,oBAAoB,EAC/E,QAAQ,KACT,CAAC;EAGJ,MAAM,UAAU,MAAM,eAAe,KAAK,WAAW,aAAa,IAAI,SAAS,CAAC;AAEhF,MAAI,CAAC,cAAc,QAAQ,CACzB,QAAO,SAAS,KAAK,8CAA8C,EACjE,QAAQ,KACT,CAAC;AAGJ,MAAI;AACF,UAAO,gBAAgB,MAAM,MAAM,QAAQ,CAAC;WACrC,KAAK;AACZ,UAAO,SAAS,KACd,oCAAoC,eAAe,QAAQ,IAAI,UAAU,oBACzE,EACE,QAAQ,KACT,CACF;;;CAIL,eAAe,eACb,SACA,KACA,QACkB;EAClB,MAAM,UAAU,IAAI,QAAQ,QAAQ,QAAQ;AAC5C,UAAQ,OAAO,SAAS;AACxB,MAAI,OACF,SAAQ,IAAI,UAAU,OAAO;EAG/B,MAAM,gBAAgB,QAAQ,IAAI,iBAAiB;EACnD,MAAM,UAAU,iBAAiB,SAAS,cAAc,GAAG;EAE3D,MAAM,UAAU,IAAI,QAAQ,KAAK;GAC/B,QAAQ,QAAQ;GAChB,OAAO;GACP;GACA,MACE,WAAW,gBAAgB,IAAI,QAAQ,OAAO,aAAa,CAAC,GACxD,MAAM,QAAQ,aAAa,GAC3B,KAAA;GACP,CAAC;AAEF,SAAO,WAAW,UAAU,UAAU,QAAQ,QAAQ,GAAG;;CAG3D,eAAe,gBAAgB,UAAuC;AACpE,MAAI,WAAW,SACb,YAAW,UAAU,SAAS,SAAS;EAGzC,MAAM,UAAU,IAAI,QAAQ,SAAS,QAAQ;AAC7C,UAAQ,SAAS,QAAQ,gBAAgB;AAGvC,OAFY,YAAY,aAAa,CAE7B,WAAW,kBAAkB,CACnC,SAAQ,OAAO,YAAY;IAE7B;AACF,UAAQ,IAAI,oBAAoB,SAAS,IAAI;AAE7C,SAAO,IAAI,SAAS,SAAS,MAAM;GACjC,QAAQ,SAAS;GACjB,YAAY,SAAS;GACrB;GACD,CAAC;;AAGJ,MAAK,MAAM,OAAO,QAChB,UAAS,OAAO;AAGlB,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"source-api.d.ts","names":[],"sources":["../../src/server/source-api.tsx"],"mappings":";;;;;;;;;;;YA2BmB,QAAA;IAJ0C;;;IAQzD,QAAA,GAAW,mBAAA;EAAA;AAAA;AAAA,UAIE,mBAAA;EACf,MAAA;EACA,OAAA;AAAA;AAFF;;;AAAA,iBAQgB,aAAA,CAAA,GAAiB,YAAA;AAAA,UAuCvB,eAAA,SAAwB,QAAA;EAChC,eAAA,QAAuB,YAAA;EACvB,SAAA;IAAmB,EAAA;EAAA,IAAe,oBAAA;EAClC,qBAAA,QAA6B,OAAA,CAAQ,kBAAA;EACrC,cAAA,EAAgB,cAAA;EAChB,GAAA,EAAK,WAAA;AAAA;AAAA,UAGG,WAAA;EACR,WAAA;AAAA;;;;iBAMoB,aAAA,CACpB,MAAA,EAAQ,aAAA,EACR,OAAA,GAAS,oBAAA;EACP,OAAA,WAlBsC;EAoBtC,IAAA,aAAiB,WAAA;AAAA,IAElB,OAAA,CACD,MAAA;EACE,QAAA,EAAU,QAAA;EACV,QAAA,EAAU,eAAA;AAAA;;;;iBAqIE,kBAAA,CAAA,GAAsB,mBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"source-api.js","names":[],"sources":["../../src/server/source-api.tsx"],"sourcesContent":["import { MethodLabel } from '@/ui/components/method-label';\nimport {\n PathUtils,\n type LoaderPlugin,\n type MetaData,\n type PageData,\n type PageTreeTransformer,\n type Source,\n type VirtualFile,\n} from 'fumadocs-core/source';\nimport type { OpenAPIServer } from '@/server/create';\nimport type { SchemaToPagesOptions } from '@/utils/pages/preset-auto';\nimport type { ApiPageProps } from '@/ui/api-page';\nimport type { StructuredData } from 'fumadocs-core/mdx-plugins';\nimport type { TOCItemType } from 'fumadocs-core/toc';\nimport type { DereferencedDocument } from '@/utils/document/dereference';\nimport type {\n OperationOutput,\n OutputEntry,\n PageOutput,\n WebhookOutput,\n} from '@/utils/pages/builder';\nimport path from 'node:path';\nimport type { ClientApiPageProps } from '@/ui/create-client';\nimport { toStaticData } from '@/utils/pages/to-static-data';\n\ndeclare module 'fumadocs-core/source' {\n export interface PageData {\n /**\n * Added by Fumadocs OpenAPI\n */\n _openapi?: InternalOpenAPIMeta;\n }\n}\n\nexport interface InternalOpenAPIMeta {\n method?: string;\n webhook?: boolean;\n}\n\n/**\n * Fumadocs Source API integration, pass this to `plugins` array in `loader()`.\n */\nexport function openapiPlugin(): LoaderPlugin {\n return {\n name: 'fumadocs:openapi',\n enforce: 'pre',\n transformPageTree: {\n file(node, filePath) {\n if (!filePath) return node;\n const file = this.storage.read(filePath);\n if (!file || file.format !== 'page') return node;\n\n const openApiData = file.data._openapi;\n if (!openApiData || typeof openApiData !== 'object') return node;\n\n if (openApiData.webhook) {\n node.name = (\n <>\n {node.name}{' '}\n <span className=\"ms-auto border border-current px-1 rounded-lg text-xs text-nowrap font-mono\">\n Webhook\n </span>\n </>\n );\n } else if (openApiData.method) {\n node.name = (\n <>\n {node.name}{' '}\n <MethodLabel className=\"ms-auto text-xs text-nowrap\">\n {openApiData.method}\n </MethodLabel>\n </>\n );\n }\n\n return node;\n },\n },\n };\n}\n\ninterface OpenAPIPageData extends PageData {\n getAPIPageProps: () => ApiPageProps;\n getSchema: () => { id: string } & DereferencedDocument;\n getClientAPIPageProps: () => Promise<ClientApiPageProps>;\n structuredData: StructuredData;\n toc: TOCItemType[];\n}\n\ninterface MetaOptions {\n folderStyle?: 'folder' | 'separator';\n}\n\n/**\n * Generate virtual pages for Fumadocs Source API\n */\nexport async function openapiSource(\n server: OpenAPIServer,\n options: SchemaToPagesOptions & {\n baseDir?: string;\n /** Generate `meta.json` files */\n meta?: boolean | MetaOptions;\n } = {},\n): Promise<\n Source<{\n metaData: MetaData;\n pageData: OpenAPIPageData;\n }>\n> {\n const { baseDir = '', meta = false } = options;\n const { createAutoPreset } = await import('@/utils/pages/preset-auto');\n const { fromServer } = await import('@/utils/pages/builder');\n const files: VirtualFile<{\n pageData: OpenAPIPageData;\n metaData: MetaData;\n }>[] = [];\n\n const entries = await fromServer(server, createAutoPreset(options));\n for (const [schemaId, list] of Object.entries(entries)) {\n const processed = await server.getSchema(schemaId);\n\n function onEntry(entry: PageOutput | OperationOutput | WebhookOutput) {\n const props = getProps(entry);\n\n files.push({\n type: 'page',\n path: `${baseDir}/${entry.path}`,\n data: {\n ...entry.info,\n getAPIPageProps() {\n return props;\n },\n async getClientAPIPageProps() {\n return {\n payload: {\n bundled: processed.bundled,\n proxyUrl: server.options.proxyUrl,\n },\n ...props,\n };\n },\n getSchema() {\n return {\n id: schemaId,\n ...processed,\n };\n },\n ...toStaticData(props, processed.dereferenced),\n _openapi: {\n method:\n entry.type === 'operation' || entry.type === 'webhook'\n ? entry.item.method\n : undefined,\n webhook: entry.type === 'webhook',\n },\n },\n });\n }\n\n function onEntries(entries: OutputEntry[], parent?: OutputEntry) {\n if (!meta) {\n for (const entry of entries) {\n if (entry.type === 'group') {\n onEntries(entry.entries, entry);\n } else {\n onEntry(entry);\n }\n }\n\n return;\n }\n\n const { folderStyle = 'folder' } = meta === true ? {} : meta;\n const pages: string[] = [];\n\n for (const entry of entries) {\n const relativePath = PathUtils.slash(\n parent ? path.relative(parent.path, entry.path) : entry.path,\n );\n\n if (entry.type === 'group') {\n onEntries(entry.entries, entry);\n if (folderStyle === 'folder') {\n pages.push(relativePath);\n } else {\n pages.push(`---${entry.info.title}---`, `...${relativePath}`);\n }\n } else {\n onEntry(entry);\n pages.push(relativePath.slice(0, -path.extname(entry.path).length));\n }\n }\n\n if (pages.length === 0) return;\n files.push({\n type: 'meta',\n path: path.join(baseDir, parent?.path ?? '', 'meta.json'),\n data: {\n title: parent?.info.title,\n description: parent?.info.description,\n pages,\n },\n });\n }\n\n onEntries(list);\n }\n\n return {\n files,\n };\n}\n\nfunction getProps(entry: PageOutput | OperationOutput | WebhookOutput): ApiPageProps {\n if (entry.type === 'operation')\n return {\n document: entry.schemaId,\n operations: [entry.item],\n showDescription: true,\n };\n if (entry.type === 'webhook')\n return {\n document: entry.schemaId,\n webhooks: [entry.item],\n showDescription: true,\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\n/**\n * @deprecated use `openapiPlugin()`\n */\nexport function transformerOpenAPI(): PageTreeTransformer {\n return openapiPlugin().transformPageTree!;\n}\n"],"mappings":"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"}
|
package/dist/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;;;;;;;KASY,QAAA,GAAW,WAAA,CAAY,QAAA;AAAA,KACvB,eAAA,GAAkB,WAAA,CAAY,eAAA;AAAA,KAC9B,eAAA,GAAkB,WAAA,CAAY,eAAA;AAAA,KAC9B,oBAAA,GAAuB,WAAA,CAAY,oBAAA;AAAA,KACnC,eAAA,GAAkB,WAAA,CAAY,eAAA;AAAA,KAC9B,cAAA,GAAiB,WAAA,CAAY,cAAA;AAAA,KAC7B,SAAA,GAAY,WAAA,CAAY,SAAA;AAAA,KACxB,YAAA,GAAe,WAAA,CAAY,YAAA;AAAA,KAC3B,cAAA,GAAiB,WAAA,CAAY,cAAA;AAAA,KAC7B,oBAAA,GAAuB,SAAA,CAAU,oBAAA;AAAA,KACjC,cAAA,GAAiB,WAAA,CAAY,cAAA;AAAA,KAC7B,oBAAA,GAAuB,WAAA,CAAY,oBAAA;AAAA,KACnC,WAAA,GAAc,WAAA,CAAY,WAAA;AAAA,KAC1B,aAAA,GAAgB,WAAA,CAAY,aAAA;AAAA,KAC5B,eAAA,GAAkB,WAAA,CAAY,eAAA;AAAA,KAC9B,iBAAA,GAAoB,WAAA,CAAY,iBAAA;AAAA,KAEhC,iBAAA,GAAoB,WAAA,CAAY,eAAA;EAC1C,MAAA,EAAQ,WAAA;EACR,eAAA,GAAkB,wBAAA;EAClB,sBAAA;EACA,uBAAA;AAAA;AAAA,KAGG,WAAA,oBAA+B,CAAA,IAAK,IAAA,CAAK,CAAA,EAAG,CAAA,IAAK,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,CAAA;AAAA,UAEtD,aAAA,SAEb,IAAA,CAAK,cAAA,eACL,IAAA,CACE,WAAA,CAAY,oBAAA;EA1BN;;;EAgCV,MAAA,EAAQ,oBAAA;EACR,cAAA,SAD4B,kBAAA;EAG5B,aAAA,EAAe,MAAA,SAAe,YAAA;EAE9B,aAAA,GACE,KAAA,UACA,IAAA,WAAe,SAAA,EACf,KAAA,GAAQ,cAAA,CAAe,kBAAA;IAAwB,EAAA;EAAA,MAC5C,SAAA;EACL,eAAA,GAAkB,IAAA,UAAc,IAAA,aAAiB,SAAA;AAAA;AAAA,KAGvC,gBAAA,cAA8B,WAAA,IAAe,CAAA,mBAAoB,IAAA,CAAK,CAAA,EAAG,CAAA;AAAA,KACzE,SAAA,MAAe,CAAA,GAAI,OAAA,CAAQ,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api-page.d.ts","names":[],"sources":["../../src/ui/api-page.tsx"],"mappings":";;UAIiB,YAAA;EACf,QAAA;EACA,SAAA;EACA,eAAA;EAH2B;;;EAQ3B,UAAA,GAAa,aAAA;EAEb,QAAA,GAAW,WAAA;AAAA;AAAA,UAGI,WAAA;EALF;;;EASb,IAAA;EACA,MAAA,EAAQ,WAAA;AAAA;AAAA,UAGO,aAAA;;;;EAIf,IAAA;EAPQ;;;EAWR,MAAA,EAAQ,WAAA;AAAA"}
|
package/dist/ui/api-page.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api-page.js","names":[],"sources":["../../src/ui/api-page.tsx"],"sourcesContent":["import { Operation } from '@/ui/operation';\nimport type { HttpMethods, RenderContext, ServerObject } from '@/types';\nimport { createMethod } from '@/utils/schema';\n\nexport interface ApiPageProps {\n document: string;\n showTitle?: boolean;\n showDescription?: boolean;\n\n /**\n * An array of operations\n */\n operations?: OperationItem[];\n\n webhooks?: WebhookItem[];\n}\n\nexport interface WebhookItem {\n /**\n * webhook name in `webhooks`\n */\n name: string;\n method: HttpMethods;\n}\n\nexport interface OperationItem {\n /**\n * the path of operation in `paths`\n */\n path: string;\n /**\n * the HTTP method of operation\n */\n method: HttpMethods;\n}\n\nexport function APIPage({\n showTitle: hasHead = false,\n showDescription,\n operations,\n webhooks,\n ctx,\n}: Omit<ApiPageProps, 'document'> & {\n ctx: RenderContext;\n}) {\n const { dereferenced } = ctx.schema;\n let { renderPageLayout } = ctx.content ?? {};\n renderPageLayout ??= (slots) => (\n <div className=\"flex flex-col gap-24 text-sm @container\">\n {slots.operations?.map((op) => op.children)}\n {slots.webhooks?.map((op) => op.children)}\n </div>\n );\n\n const content = renderPageLayout(\n {\n operations: operations?.map((item) => {\n const pathItem = dereferenced.paths?.[item.path];\n if (!pathItem)\n throw new Error(`[Fumadocs OpenAPI] Path not found in OpenAPI schema: ${item.path}`);\n\n const operation = pathItem[item.method];\n if (!operation)\n throw new Error(\n `[Fumadocs OpenAPI] Method ${item.method} not found in operation: ${item.path}`,\n );\n\n const method = createMethod(item.method, pathItem, operation);\n\n return {\n item,\n children: (\n <Operation\n key={`${item.path}:${item.method}`}\n method={method}\n path={item.path}\n ctx={ctx}\n showTitle={hasHead}\n showDescription={showDescription}\n />\n ),\n };\n }),\n webhooks: webhooks?.map((item) => {\n const webhook = dereferenced.webhooks?.[item.name];\n if (!webhook)\n throw new Error(`[Fumadocs OpenAPI] Webhook not found in OpenAPI schema: ${item.name}`);\n\n const hook = webhook[item.method];\n if (!hook)\n throw new Error(\n `[Fumadocs OpenAPI] Method ${item.method} not found in webhook: ${item.name}`,\n );\n\n return {\n item,\n children: (\n <Operation\n type=\"webhook\"\n key={`${item.name}:${item.method}`}\n method={createMethod(item.method, webhook, hook)}\n ctx={ctx}\n path={`/${item.name}`}\n showTitle={hasHead}\n showDescription={showDescription}\n />\n ),\n };\n }),\n },\n ctx,\n );\n\n return (\n <ctx.clientBoundary.ApiProvider shikiOptions={ctx.shikiOptions} client={ctx.client ?? {}}>\n <ctx.clientBoundary.ServerProvider servers={dereferenced.servers as ServerObject[]}>\n {content}\n </ctx.clientBoundary.ServerProvider>\n </ctx.clientBoundary.ApiProvider>\n );\n}\n"],"mappings":";;;;AAoCA,SAAgB,QAAQ,EACtB,WAAW,UAAU,OACrB,iBACA,YACA,UACA,OAGC;CACD,MAAM,EAAE,iBAAiB,IAAI;CAC7B,IAAI,EAAE,qBAAqB,IAAI,WAAW,EAAE;AAC5C,uBAAsB,UACpB,qBAAC,OAAD;EAAK,WAAU;YAAf,CACG,MAAM,YAAY,KAAK,OAAO,GAAG,SAAS,EAC1C,MAAM,UAAU,KAAK,OAAO,GAAG,SAAS,CACrC;;CAGR,MAAM,UAAU,iBACd;EACE,YAAY,YAAY,KAAK,SAAS;GACpC,MAAM,WAAW,aAAa,QAAQ,KAAK;AAC3C,OAAI,CAAC,SACH,OAAM,IAAI,MAAM,wDAAwD,KAAK,OAAO;GAEtF,MAAM,YAAY,SAAS,KAAK;AAChC,OAAI,CAAC,UACH,OAAM,IAAI,MACR,6BAA6B,KAAK,OAAO,2BAA2B,KAAK,OAC1E;AAIH,UAAO;IACL;IACA,UACE,oBAAC,WAAD;KAEE,QAPS,aAAa,KAAK,QAAQ,UAAU,UAAU;KAQvD,MAAM,KAAK;KACN;KACL,WAAW;KACM;KACjB,EANK,GAAG,KAAK,KAAK,GAAG,KAAK,SAM1B;IAEL;IACD;EACF,UAAU,UAAU,KAAK,SAAS;GAChC,MAAM,UAAU,aAAa,WAAW,KAAK;AAC7C,OAAI,CAAC,QACH,OAAM,IAAI,MAAM,2DAA2D,KAAK,OAAO;GAEzF,MAAM,OAAO,QAAQ,KAAK;AAC1B,OAAI,CAAC,KACH,OAAM,IAAI,MACR,6BAA6B,KAAK,OAAO,yBAAyB,KAAK,OACxE;AAEH,UAAO;IACL;IACA,UACE,oBAAC,WAAD;KACE,MAAK;KAEL,QAAQ,aAAa,KAAK,QAAQ,SAAS,KAAK;KAC3C;KACL,MAAM,IAAI,KAAK;KACf,WAAW;KACM;KACjB,EANK,GAAG,KAAK,KAAK,GAAG,KAAK,SAM1B;IAEL;IACD;EACH,EACD,IACD;AAED,QACE,oBAAC,IAAI,eAAe,aAApB;EAAgC,cAAc,IAAI;EAAc,QAAQ,IAAI,UAAU,EAAE;YACtF,oBAAC,IAAI,eAAe,gBAApB;GAAmC,SAAS,aAAa;aACtD;GACiC,CAAA;EACL,CAAA"}
|
package/dist/ui/base.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","names":[],"sources":["../../src/ui/base.tsx"],"mappings":"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"}
|
package/dist/ui/base.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","names":[],"sources":["../../src/ui/base.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any -- rehype-react without types */\nimport Slugger from 'github-slugger';\nimport type { Awaitable, MethodInformation, RenderContext } from '@/types';\nimport { parseSecurities, type NoReference } from '@/utils/schema';\nimport type { DereferencedDocument } from '@/utils/document/dereference';\nimport { defaultAdapters, MediaAdapter } from '@/requests/media/adapter';\nimport type { FC, HTMLAttributes, ReactNode } from 'react';\nimport type { OpenAPIServer } from '@/server';\nimport type { APIPageClientOptions } from './client';\nimport { Heading } from 'fumadocs-ui/components/heading';\nimport { createRehypeCode } from 'fumadocs-core/mdx-plugins/rehype-code.core';\nimport { remarkGfm } from 'fumadocs-core/mdx-plugins/remark-gfm';\nimport defaultMdxComponents from 'fumadocs-ui/mdx';\nimport { remark } from 'remark';\nimport remarkRehype from 'remark-rehype';\nimport { toJsxRuntime } from 'hast-util-to-jsx-runtime';\nimport * as JsxRuntime from 'react/jsx-runtime';\nimport { CodeBlock, Pre } from 'fumadocs-ui/components/codeblock';\nimport type { SchemaUIOptions } from './schema';\nimport type { ResponseTab } from './operation/response-tabs';\nimport { APIPage, type ApiPageProps, type OperationItem, type WebhookItem } from './api-page';\nimport type { CodeUsageGeneratorRegistry, InlineCodeUsageGenerator } from '@/requests/generators';\nimport type { JSONSchema } from 'json-schema-typed';\nimport type { BundledTheme, CodeOptionsThemes, CodeToHastOptionsCommon } from 'shiki';\nimport { highlightHast, type ShikiFactory } from 'fumadocs-core/highlight/shiki';\nimport type { ExampleRequestItem } from './operation/get-example-requests';\nimport { compile } from '@fumari/json-schema-ts';\nimport { pickSchema } from '@/utils/schema/pick';\nimport { encodeInternalRef } from '@/utils/schema/ref';\n\nexport interface GenerateTypeScriptDefinitionsContext extends RenderContext {\n operation: NoReference<MethodInformation>;\n readOnly: boolean;\n writeOnly: boolean;\n /** @deprecated */\n _internal_legacy?: {\n statusCode: string;\n contentType: string;\n };\n}\n\nexport interface APIPlaygroundProps {\n path: string;\n method: MethodInformation;\n ctx: RenderContext;\n}\n\nexport interface CreateAPIPageOptions {\n /**\n * Generate TypeScript definitions from response schema.\n *\n * Pass `false` to disable it.\n *\n * @param method - the operation object\n * @param statusCode - status code\n * @deprecated use `generateTypeScriptDefinitions` instead.\n */\n generateTypeScriptSchema?:\n | ((\n method: NoReference<MethodInformation>,\n statusCode: string,\n contentType: string,\n ctx: RenderContext,\n ) => Awaitable<string | undefined>)\n | false;\n\n /**\n * Generate TypeScript definitions from JSON schema.\n *\n * Pass `false` to disable it.\n */\n generateTypeScriptDefinitions?:\n | ((\n schema: JSONSchema,\n ctx: GenerateTypeScriptDefinitionsContext,\n ) => Awaitable<string | undefined>)\n | false;\n\n /**\n * Generate example code usage for all endpoints.\n */\n codeUsages?: CodeUsageGeneratorRegistry;\n\n /**\n * Generate example code usage for each endpoint.\n */\n generateCodeSamples?: (method: MethodInformation) => InlineCodeUsageGenerator[];\n\n shiki: ShikiFactory;\n renderMarkdown?: (md: string) => ReactNode;\n shikiOptions: Omit<CodeToHastOptionsCommon, 'lang'> & CodeOptionsThemes<BundledTheme>;\n\n /**\n * Show full response schema instead of only example response & Typescript definitions.\n *\n * @default true\n */\n showResponseSchema?: boolean;\n\n /**\n * Support other media types (for server-side generation).\n */\n mediaAdapters?: Record<string, MediaAdapter>;\n\n /**\n * Customise page content\n */\n content?: {\n renderResponseTabs?: (tabs: ResponseTab[], ctx: RenderContext) => ReactNode;\n\n renderRequestTabs?: (\n items: ExampleRequestItem[],\n ctx: RenderContext & {\n route: string;\n operation: NoReference<MethodInformation>;\n },\n ) => ReactNode;\n\n renderAPIExampleLayout?: (\n slots: {\n selector: ReactNode;\n usageTabs: ReactNode;\n responseTabs: ReactNode;\n },\n ctx: RenderContext,\n ) => ReactNode;\n\n /**\n * @param generators - codegens for API example usages\n */\n renderAPIExampleUsageTabs?: (\n generators: CodeUsageGeneratorRegistry,\n ctx: RenderContext,\n ) => ReactNode;\n\n /**\n * renderer of the entire page's layout (containing all operations & webhooks UI)\n */\n renderPageLayout?: (\n slots: {\n operations?: {\n item: OperationItem;\n children: ReactNode;\n }[];\n webhooks?: {\n item: WebhookItem;\n children: ReactNode;\n }[];\n },\n ctx: RenderContext,\n ) => ReactNode;\n\n renderOperationLayout?: (\n slots: {\n header: ReactNode;\n description: ReactNode;\n apiExample: ReactNode;\n apiPlayground: ReactNode;\n\n authSchemes: ReactNode;\n parameters: ReactNode;\n body: ReactNode;\n responses: ReactNode;\n callbacks: ReactNode;\n },\n ctx: RenderContext,\n method: NoReference<MethodInformation>,\n ) => ReactNode;\n\n renderWebhookLayout?: (slots: {\n header: ReactNode;\n description: ReactNode;\n authSchemes: ReactNode;\n parameters: ReactNode;\n body: ReactNode;\n requests: ReactNode;\n responses: ReactNode;\n callbacks: ReactNode;\n }) => ReactNode;\n };\n\n /**\n * Info UI for JSON schemas\n */\n schemaUI?: {\n render?: (options: SchemaUIOptions, ctx: RenderContext) => ReactNode;\n\n /**\n * Show examples under the generated content of JSON schemas.\n *\n * @defaultValue false\n */\n showExample?: boolean;\n };\n\n /**\n * Customise API playground\n */\n playground?: {\n /**\n * @defaultValue true\n */\n enabled?: boolean;\n /**\n * replace the server-side renderer\n */\n render?: (props: APIPlaygroundProps) => ReactNode;\n };\n\n renderHeading?: (props: HTMLAttributes<HTMLHeadingElement>, depth: number) => ReactNode;\n renderCodeBlock?: (props: { lang: string; code: string }) => ReactNode;\n\n client?: APIPageClientOptions;\n}\n\nexport interface ServerApiPageProps extends Omit<ApiPageProps, 'document'> {\n document: string | DereferencedDocument;\n}\n\nexport function createAPIPage(\n server: OpenAPIServer,\n options: CreateAPIPageOptions,\n): FC<ServerApiPageProps> {\n let processor: ReturnType<typeof createMarkdownProcessor>;\n\n function createMarkdownProcessor() {\n function rehypeReact(this: any) {\n this.compiler = (tree: any, file: any) => {\n return toJsxRuntime(tree, {\n development: false,\n filePath: file.path,\n ...JsxRuntime,\n components: defaultMdxComponents,\n });\n };\n }\n\n return remark()\n .use(remarkGfm)\n .use(remarkRehype)\n .use(createRehypeCode(options.shiki), {\n langs: [],\n lazy: true,\n defaultColor: false,\n ...options.shikiOptions,\n })\n .use(rehypeReact);\n }\n\n function renderPlaygroundDefault({ path, method, ctx }: APIPlaygroundProps) {\n return (\n <ctx.clientBoundary.PlaygroundClient\n route={path}\n securities={parseSecurities(method, ctx.schema.dereferenced)}\n method={method.method}\n doc={{\n bundled: pickSchema(\n ctx.schema.bundled,\n encodeInternalRef(['paths', path, method.method]),\n ),\n }}\n proxyUrl={ctx.proxyUrl}\n writeOnly\n readOnly={false}\n />\n );\n }\n\n return async function APIPageWrapper({ document, ...props }) {\n let processed: DereferencedDocument;\n if (typeof document === 'string') {\n processed = await server.getSchema(document);\n } else {\n processed = document;\n }\n\n const slugger = new Slugger();\n const { ApiProvider, PlaygroundClient, SchemaUI, ServerProvider, UsageTab, UsageTabsSelector } =\n await import('@/ui/client/boundary.lazy');\n\n const ctx: RenderContext = {\n schema: processed,\n proxyUrl: server.options.proxyUrl,\n clientBoundary: {\n ApiProvider,\n PlaygroundClient,\n SchemaUI,\n ServerProvider,\n UsageTab,\n UsageTabsSelector,\n },\n ...options,\n mediaAdapters: {\n ...defaultAdapters,\n ...options.mediaAdapters,\n },\n playground: {\n ...options.playground,\n render: options.playground?.render ?? renderPlaygroundDefault,\n },\n renderHeading(depth, text, props) {\n const id = typeof text === 'string' ? slugger.slug(text) : props?.id;\n if (!id) throw new Error(\"missing 'id' for non-string children\");\n\n if (options.renderHeading) {\n return options.renderHeading({ id, children: text, ...props }, depth);\n }\n\n return (\n <Heading id={id} key={id} as={`h${depth}` as `h1`} {...props}>\n {text}\n </Heading>\n );\n },\n generateTypeScriptDefinitions:\n options.generateTypeScriptDefinitions ??\n ((schema, ctx) => {\n if (options.generateTypeScriptSchema && ctx._internal_legacy) {\n const { statusCode, contentType } = ctx._internal_legacy;\n return options.generateTypeScriptSchema(ctx.operation, statusCode, contentType, ctx);\n }\n\n if (typeof schema !== 'object') return;\n try {\n return compile(schema, {\n name: 'Response',\n readOnly: ctx.readOnly,\n writeOnly: ctx.writeOnly,\n getSchemaId: ctx.schema.getRawRef,\n });\n } catch (e) {\n console.warn('Failed to generate typescript schema:', e);\n }\n }),\n async renderMarkdown(text) {\n if (options.renderMarkdown) return options.renderMarkdown(text);\n processor ??= createMarkdownProcessor();\n\n const out = await processor.process({\n value: text,\n });\n\n return out.result as ReactNode;\n },\n async renderCodeBlock(lang, code) {\n if (options.renderCodeBlock) {\n return options.renderCodeBlock({ lang, code });\n }\n\n const hast = await highlightHast(await options.shiki.getOrInit(), code, {\n lang,\n defaultColor: false,\n ...options.shikiOptions,\n });\n const rendered = toJsxRuntime(hast, {\n ...JsxRuntime,\n components: {\n pre: Pre,\n },\n });\n\n return <CodeBlock className=\"my-0\">{rendered}</CodeBlock>;\n },\n };\n\n return <APIPage {...props} ctx={ctx} />;\n };\n}\n\nexport { ClientCodeBlockProvider } from './components/codeblock';\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"boundary.d.ts","names":[],"sources":["../../../src/ui/client/boundary.tsx"],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"boundary.js","names":[],"sources":["../../../src/ui/client/boundary.tsx"],"sourcesContent":["'use client';\n\nexport { ApiProvider, ServerProvider } from '@/ui/contexts/api';\nexport { UsageTab, UsageTabsSelector } from '@/ui/operation/usage-tabs/client';\nexport { SchemaUI } from '@/ui/schema/client';\nexport { default as PlaygroundClient } from '@/playground/client';\n"],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"boundary.lazy.js","names":[],"sources":["../../../src/ui/client/boundary.lazy.tsx"],"sourcesContent":["'use client';\n\nimport { type ComponentType, lazy } from 'react';\n\n// the boundary between server & lazy client components\n\nexport const ApiProvider = wrapLazy(() =>\n import('@/ui/contexts/api').then((mod) => ({ default: mod.ApiProvider })),\n);\n\nexport const ServerProvider = wrapLazy(() =>\n import('@/ui/contexts/api').then((mod) => ({ default: mod.ServerProvider })),\n);\n\nexport const UsageTabsSelector = wrapLazy(() =>\n import('@/ui/operation/usage-tabs/client').then((mod) => ({ default: mod.UsageTabsSelector })),\n);\n\nexport const UsageTab = wrapLazy(() =>\n import('@/ui/operation/usage-tabs/client').then((mod) => ({ default: mod.UsageTab })),\n);\n\nexport const SchemaUI = wrapLazy(() =>\n import('@/ui/schema/client').then((mod) => ({ default: mod.SchemaUI })),\n);\n\nexport const PlaygroundClient = wrapLazy(() => import('@/playground/client'));\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\nfunction 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,MAAa,cAAc,eACzB,OAAO,sBAAqB,MAAM,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,CAC1E;AAED,MAAa,iBAAiB,eAC5B,OAAO,sBAAqB,MAAM,SAAS,EAAE,SAAS,IAAI,gBAAgB,EAAE,CAC7E;AAED,MAAa,oBAAoB,eAC/B,OAAO,qCAAoC,MAAM,SAAS,EAAE,SAAS,IAAI,mBAAmB,EAAE,CAC/F;AAED,MAAa,WAAW,eACtB,OAAO,qCAAoC,MAAM,SAAS,EAAE,SAAS,IAAI,UAAU,EAAE,CACtF;AAED,MAAa,WAAW,eACtB,OAAO,uBAAsB,MAAM,SAAS,EAAE,SAAS,IAAI,UAAU,EAAE,CACxE;AAED,MAAa,mBAAmB,eAAe,OAAO,8BAAuB;AAM7E,SAAS,SAAuC,MAAwC;CACtF,MAAM,IAAI,KAAK,KAAK;AAEpB,QAAO,SAAS,QAAQ,OAAO;AAC7B,SAAO,oBAAC,GAAD,EAAG,GAAI,OAAS,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"full.js","names":[],"sources":["../../../src/ui/client/full.tsx"],"sourcesContent":["'use client';\nimport type { ReactNode } from 'react';\nimport { ClientCodeBlockProvider } from '../components/codeblock';\nimport { defaultShikiFactory } from 'fumadocs-core/highlight/shiki/full';\n\nexport function FullProvider({ children }: { children: ReactNode }) {\n return (\n <ClientCodeBlockProvider factory={defaultShikiFactory}>{children}</ClientCodeBlockProvider>\n );\n}\n"],"mappings":";;;;;AAKA,SAAgB,aAAa,EAAE,YAAqC;AAClE,QACE,oBAAC,yBAAD;EAAyB,SAAS;EAAsB;EAAmC,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.js","names":[],"sources":["../../../src/ui/client/i18n.ts"],"sourcesContent":["'use client';\nimport { defaultTranslations, type Translations } from '@/i18n';\nimport { useI18n } from 'fumadocs-ui/contexts/i18n';\n\nexport function useTranslations(): Translations {\n return (useI18n().text.openapi ?? defaultTranslations) as unknown as Translations;\n}\n\nexport interface OpenAPII18nLabelProps {\n label: keyof Translations;\n /** Replace {key} placeholders in the translation string */\n replacements?: Record<string, string>;\n}\n\n/**\n * Renders a translated string. Use in server components so the label is resolved on the client from the current locale.\n */\nexport function I18nLabel({ label, replacements = {} }: OpenAPII18nLabelProps): string {\n const text = useTranslations();\n let value = text[label];\n for (const [k, v] of Object.entries(replacements)) {\n value = value.replaceAll(`{${k}}`, v);\n }\n return value;\n}\n"],"mappings":";;;;AAIA,SAAgB,kBAAgC;AAC9C,QAAQ,SAAS,CAAC,KAAK,WAAW;;;;;AAYpC,SAAgB,UAAU,EAAE,OAAO,eAAe,EAAE,IAAmC;CAErF,IAAI,QADS,iBAAiB,CACb;AACjB,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,aAAa,CAC/C,SAAQ,MAAM,WAAW,IAAI,EAAE,IAAI,EAAE;AAEvC,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/ui/client/index.tsx"],"mappings":";;;;;;;UAOiB,oBAAA;EACf,UAAA,GAAa,uBAAA;EACb,SAAA,GAAY,sBAAA;EAFuB;;;;;;;EAWnC,gBAAA;EAUuC;;;EALvC,aAAA,GAAgB,MAAA,SAAe,YAAA;EAdnB;;;EAmBZ,UAAA,GAAa,0BAAA;AAAA;AAAA,UAGE,sBAAA;EACf,kBAAA,GAAqB,EAAA;IACnB,KAAA,EAAO,kBAAA;IAEP,KAAA;IACA,aAAA,GAAgB,EAAA;EAAA;AAAA;AAAA,iBAIJ,kBAAA,CAAmB,OAAA,GAAS,oBAAA,GAA4B,oBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/ui/client/index.tsx"],"sourcesContent":["'use client';\nimport type { PlaygroundClientOptions } from '@/playground/client';\nimport type { MediaAdapter } from '@/requests/media/adapter';\nimport type { FC } from 'react';\nimport type { CodeUsageGeneratorRegistry } from '@/requests/generators';\nimport type { ExampleRequestItem } from '../operation/get-example-requests';\n\nexport interface APIPageClientOptions {\n playground?: PlaygroundClientOptions;\n operation?: OperationClientOptions;\n\n /**\n * Set a prefix for `localStorage` keys.\n *\n * Useful when using multiple OpenAPI instances to prevent state conflicts.\n *\n * @defaultValue `fumadocs-openapi-`\n */\n storageKeyPrefix?: string;\n\n /**\n * Support other media types (for client-side serialization)\n */\n mediaAdapters?: Record<string, MediaAdapter>;\n\n /**\n * generate code usage examples\n */\n codeUsages?: CodeUsageGeneratorRegistry;\n}\n\nexport interface OperationClientOptions {\n APIExampleSelector?: FC<{\n items: ExampleRequestItem[];\n\n value: string | undefined;\n onValueChange: (id: string) => void;\n }>;\n}\n\nexport function defineClientConfig(options: APIPageClientOptions = {}): APIPageClientOptions {\n return options;\n}\n"],"mappings":";;AAwCA,SAAgB,mBAAmB,UAAgC,EAAE,EAAwB;AAC3F,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"storage-key.js","names":[],"sources":["../../../src/ui/client/storage-key.ts"],"sourcesContent":["import type { AuthField } from '@/playground/client';\nimport { useApiContext } from '../contexts/api';\nimport { useMemo } from 'react';\n\ntype KeyName = 'server-url' | `auth-${string}`;\n\nexport function useStorageKey() {\n const { storageKeyPrefix } = useApiContext().client;\n\n return useMemo(\n () => ({\n of: (name: KeyName) => getStorageKey(storageKeyPrefix, name),\n AuthField: (field: AuthField) =>\n getStorageKey(storageKeyPrefix, `auth-${field.original?.id ?? field.fieldName}`),\n }),\n [storageKeyPrefix],\n );\n}\n\nfunction getStorageKey(prefix = 'fumadocs-openapi-', name: KeyName) {\n return prefix + name;\n}\n"],"mappings":";;;AAMA,SAAgB,gBAAgB;CAC9B,MAAM,EAAE,qBAAqB,eAAe,CAAC;AAE7C,QAAO,eACE;EACL,KAAK,SAAkB,cAAc,kBAAkB,KAAK;EAC5D,YAAY,UACV,cAAc,kBAAkB,QAAQ,MAAM,UAAU,MAAM,MAAM,YAAY;EACnF,GACD,CAAC,iBAAiB,CACnB;;AAGH,SAAS,cAAc,SAAS,qBAAqB,MAAe;AAClE,QAAO,SAAS"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"accordion.js","names":[],"sources":["../../../src/ui/components/accordion.tsx"],"sourcesContent":["'use client';\n\nimport * as Primitive from '@radix-ui/react-accordion';\nimport { ChevronRight } from 'lucide-react';\nimport type { ComponentProps } from 'react';\nimport { cn } from '@/utils/cn';\n\nexport function Accordions(props: ComponentProps<typeof Primitive.Root>) {\n return <Primitive.Root {...props} className={cn('divide-y divide-fd-border', props.className)} />;\n}\n\nexport function AccordionItem(props: ComponentProps<typeof Primitive.Item>) {\n return (\n <Primitive.Item {...props} className={cn('scroll-m-20', props.className)}>\n {props.children}\n </Primitive.Item>\n );\n}\n\nexport function AccordionContent(props: ComponentProps<typeof Primitive.Content>) {\n return (\n <Primitive.Content\n {...props}\n className={cn(\n 'overflow-hidden data-[state=closed]:animate-fd-accordion-up data-[state=open]:animate-fd-accordion-down',\n props.className,\n )}\n >\n {props.children}\n </Primitive.Content>\n );\n}\n\nexport function AccordionHeader(props: ComponentProps<typeof Primitive.Header>) {\n return (\n <Primitive.Header\n {...props}\n className={cn('not-prose flex py-2 text-fd-foreground font-medium', props.className)}\n >\n {props.children}\n </Primitive.Header>\n );\n}\n\nexport function AccordionTrigger(props: ComponentProps<typeof Primitive.Trigger>) {\n return (\n <Primitive.Trigger\n {...props}\n className={cn(\n 'flex flex-1 items-center gap-1 text-start group/accordion focus-visible:outline-none',\n props.className,\n )}\n >\n <ChevronRight className=\"size-3.5 text-fd-muted-foreground shrink-0 transition-transform group-focus-visible/accordion:text-fd-primary group-data-[state=open]/accordion:rotate-90\" />\n {props.children}\n </Primitive.Trigger>\n );\n}\n"],"mappings":";;;;;;AAOA,SAAgB,WAAW,OAA8C;AACvE,QAAO,oBAAC,UAAU,MAAX;EAAgB,GAAI;EAAO,WAAW,GAAG,6BAA6B,MAAM,UAAU;EAAI,CAAA;;AAGnG,SAAgB,cAAc,OAA8C;AAC1E,QACE,oBAAC,UAAU,MAAX;EAAgB,GAAI;EAAO,WAAW,GAAG,eAAe,MAAM,UAAU;YACrE,MAAM;EACQ,CAAA;;AAIrB,SAAgB,iBAAiB,OAAiD;AAChF,QACE,oBAAC,UAAU,SAAX;EACE,GAAI;EACJ,WAAW,GACT,2GACA,MAAM,UACP;YAEA,MAAM;EACW,CAAA;;AAIxB,SAAgB,gBAAgB,OAAgD;AAC9E,QACE,oBAAC,UAAU,QAAX;EACE,GAAI;EACJ,WAAW,GAAG,sDAAsD,MAAM,UAAU;YAEnF,MAAM;EACU,CAAA;;AAIvB,SAAgB,iBAAiB,OAAiD;AAChF,QACE,qBAAC,UAAU,SAAX;EACE,GAAI;EACJ,WAAW,GACT,wFACA,MAAM,UACP;YALH,CAOE,oBAAC,cAAD,EAAc,WAAU,6JAA8J,CAAA,EACrL,MAAM,SACW"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codeblock.d.ts","names":[],"sources":["../../../src/ui/components/codeblock.tsx"],"mappings":";;;;;iBAsBgB,uBAAA,CAAA;EACd,OAAA;EACA;AAAA;EAEA,OAAA,EAAS,YAAA;EACT,QAAA,EAAU,SAAA;AAAA,IACX,oBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codeblock.js","names":[],"sources":["../../../src/ui/components/codeblock.tsx"],"sourcesContent":["'use client';\nimport {\n DynamicCodeBlock,\n type DynamicCodeblockProps,\n} from 'fumadocs-ui/components/dynamic-codeblock.core';\nimport { useApiContext } from '../contexts/api';\nimport { createContext, type ReactNode, use } from 'react';\nimport type { ShikiFactory } from 'fumadocs-core/highlight/shiki';\n\nconst CodeBlockContext = createContext<ShikiFactory | null>(null);\n\nexport function ClientCodeBlock(props: Omit<DynamicCodeblockProps, 'highlighter' | 'options'>) {\n const { shikiOptions } = useApiContext();\n const ctx = use(CodeBlockContext);\n if (!ctx)\n throw new Error(\n 'Missing Shiki context, please wrap your <APIPage /> component under <ClientCodeBlockProvider />',\n );\n\n return <DynamicCodeBlock highlighter={() => ctx.getOrInit()} options={shikiOptions} {...props} />;\n}\n\nexport function ClientCodeBlockProvider({\n factory,\n children,\n}: {\n factory: ShikiFactory;\n children: ReactNode;\n}) {\n return <CodeBlockContext value={factory}>{children}</CodeBlockContext>;\n}\n"],"mappings":";;;;;;AASA,MAAM,mBAAmB,cAAmC,KAAK;AAEjE,SAAgB,gBAAgB,OAA+D;CAC7F,MAAM,EAAE,iBAAiB,eAAe;CACxC,MAAM,MAAM,IAAI,iBAAiB;AACjC,KAAI,CAAC,IACH,OAAM,IAAI,MACR,kGACD;AAEH,QAAO,oBAAC,kBAAD;EAAkB,mBAAmB,IAAI,WAAW;EAAE,SAAS;EAAc,GAAI;EAAS,CAAA;;AAGnG,SAAgB,wBAAwB,EACtC,SACA,YAIC;AACD,QAAO,oBAAC,kBAAD;EAAkB,OAAO;EAAU;EAA4B,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dialog.js","names":[],"sources":["../../../src/ui/components/dialog.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\nimport { cn } from '@/utils/cn';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport { useTranslations } from '@/ui/client/i18n';\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 bg-black/30 backdrop-blur-sm data-[state=open]:animate-fd-fade-in data-[state=closed]:animate-fd-fade-out',\n className,\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => {\n const t = useTranslations();\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed left-1/2 top-1/2 z-50 flex flex-col gap-4 w-full max-w-lg -translate-x-1/2 -translate-y-1/2 border bg-fd-popover p-4 shadow-lg rounded-xl duration-200 data-[state=open]:animate-fd-dialog-in data-[state=closed]:animate-fd-dialog-out focus-visible:outline-none',\n className,\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close\n aria-label={t.close}\n className={cn(\n buttonVariants({ size: 'icon-sm', color: 'ghost' }),\n 'absolute end-2 top-2 text-fd-muted-foreground/70',\n )}\n >\n <X />\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n});\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex flex-col gap-1.5 text-center sm:text-start', className)} {...props} />\n);\nDialogHeader.displayName = 'DialogHeader';\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-2', className)}\n {...props}\n />\n);\nDialogFooter.displayName = 'DialogFooter';\n\nconst DialogTitle = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-sm text-fd-muted-foreground', className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n"],"mappings":";;;;;;;;;AASA,MAAM,SAAS,gBAAgB;AAE/B,MAAM,gBAAgB,gBAAgB;AAEtC,MAAM,eAAe,gBAAgB;AAEjB,gBAAgB;AAEpC,MAAM,gBAAgB,MAAM,YAGzB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB,SAAjB;CACO;CACL,WAAW,GACT,gIACA,UACD;CACD,GAAI;CACJ,CAAA,CACF;AACF,cAAc,cAAc,gBAAgB,QAAQ;AAEpD,MAAM,gBAAgB,MAAM,YAGzB,EAAE,WAAW,UAAU,GAAG,SAAS,QAAQ;CAC5C,MAAM,IAAI,iBAAiB;AAC3B,QACE,qBAAC,cAAD,EAAA,UAAA,CACE,oBAAC,eAAD,EAAiB,CAAA,EACjB,qBAAC,gBAAgB,SAAjB;EACO;EACL,WAAW,GACT,4QACA,UACD;EACD,GAAI;YANN,CAQG,UACD,oBAAC,gBAAgB,OAAjB;GACE,cAAY,EAAE;GACd,WAAW,GACT,eAAe;IAAE,MAAM;IAAW,OAAO;IAAS,CAAC,EACnD,mDACD;aAED,oBAAC,GAAD,EAAK,CAAA;GACiB,CAAA,CACA;IACb,EAAA,CAAA;EAEjB;AACF,cAAc,cAAc,gBAAgB,QAAQ;AAEpD,MAAM,gBAAgB,EAAE,WAAW,GAAG,YACpC,oBAAC,OAAD;CAAK,WAAW,GAAG,mDAAmD,UAAU;CAAE,GAAI;CAAS,CAAA;AAEjG,aAAa,cAAc;AAE3B,MAAM,gBAAgB,EAAE,WAAW,GAAG,YACpC,oBAAC,OAAD;CACE,WAAW,GAAG,6DAA6D,UAAU;CACrF,GAAI;CACJ,CAAA;AAEJ,aAAa,cAAc;AAE3B,MAAM,cAAc,MAAM,YAGvB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB,OAAjB;CACO;CACL,WAAW,GAAG,qDAAqD,UAAU;CAC7E,GAAI;CACJ,CAAA,CACF;AACF,YAAY,cAAc,gBAAgB,MAAM;AAEhD,MAAM,oBAAoB,MAAM,YAG7B,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB,aAAjB;CACO;CACL,WAAW,GAAG,oCAAoC,UAAU;CAC5D,GAAI;CACJ,CAAA,CACF;AACF,kBAAkB,cAAc,gBAAgB,YAAY"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"input.js","names":[],"sources":["../../../src/ui/components/input.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cn } from '@/utils/cn';\nimport { cva } from 'class-variance-authority';\n\nexport type InputProps = React.InputHTMLAttributes<HTMLInputElement>;\n\nexport const labelVariants = cva(\n 'text-xs font-medium text-fd-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n);\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n 'flex h-9 w-full rounded-md border bg-fd-secondary px-2 py-1.5 text-[0.8125rem] text-fd-secondary-foreground transition-colors placeholder:text-fd-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-fd-ring disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = 'Input';\n\nexport { Input };\n"],"mappings":";;;;;AAMA,MAAa,gBAAgB,IAC3B,mGACD;AAED,MAAM,QAAQ,MAAM,YACjB,EAAE,WAAW,MAAM,GAAG,SAAS,QAAQ;AACtC,QACE,oBAAC,SAAD;EACQ;EACN,WAAW,GACT,iSACA,UACD;EACI;EACL,GAAI;EACJ,CAAA;EAGP;AACD,MAAM,cAAc"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"method-label.js","names":[],"sources":["../../../src/ui/components/method-label.tsx"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport type { HTMLAttributes } from 'react';\nimport { cn } from '@/utils/cn';\n\nexport const badgeVariants = cva('font-mono font-medium', {\n variants: {\n color: {\n green: 'text-green-600 dark:text-green-400',\n yellow: 'text-yellow-600 dark:text-yellow-400',\n red: 'text-red-600 dark:text-red-400',\n blue: 'text-blue-600 dark:text-blue-400',\n orange: 'text-orange-600 dark:text-orange-400',\n },\n },\n});\n\nfunction getMethodColor(method: string): VariantProps<typeof badgeVariants>['color'] {\n switch (method.toUpperCase()) {\n case 'PUT':\n return 'yellow';\n case 'PATCH':\n return 'orange';\n case 'POST':\n return 'blue';\n case 'DELETE':\n return 'red';\n default:\n return 'green';\n }\n}\n\nexport function Badge({\n className,\n color,\n ...props\n}: Omit<HTMLAttributes<HTMLSpanElement>, 'color'> & VariantProps<typeof badgeVariants>) {\n return (\n <span\n className={cn(\n badgeVariants({\n color,\n className,\n }),\n )}\n {...props}\n >\n {props.children}\n </span>\n );\n}\n\nexport function MethodLabel({\n children,\n ...props\n}: Omit<HTMLAttributes<HTMLSpanElement>, 'children'> & {\n children: string;\n}) {\n return (\n <Badge {...props} color={getMethodColor(children)}>\n {children.toUpperCase()}\n </Badge>\n );\n}\n"],"mappings":";;;;AAIA,MAAa,gBAAgB,IAAI,yBAAyB,EACxD,UAAU,EACR,OAAO;CACL,OAAO;CACP,QAAQ;CACR,KAAK;CACL,MAAM;CACN,QAAQ;CACT,EACF,EACF,CAAC;AAEF,SAAS,eAAe,QAA6D;AACnF,SAAQ,OAAO,aAAa,EAA5B;EACE,KAAK,MACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,QACE,QAAO;;;AAIb,SAAgB,MAAM,EACpB,WACA,OACA,GAAG,SACmF;AACtF,QACE,oBAAC,QAAD;EACE,WAAW,GACT,cAAc;GACZ;GACA;GACD,CAAC,CACH;EACD,GAAI;YAEH,MAAM;EACF,CAAA;;AAIX,SAAgB,YAAY,EAC1B,UACA,GAAG,SAGF;AACD,QACE,oBAAC,OAAD;EAAO,GAAI;EAAO,OAAO,eAAe,SAAS;YAC9C,SAAS,aAAa;EACjB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"select-tab.js","names":[],"sources":["../../../src/ui/components/select-tab.tsx"],"sourcesContent":["'use client';\n\nimport { cn } from '@/utils/cn';\nimport { SelectTrigger, Select, SelectValue, SelectContent, SelectItem } from './select';\nimport { type ReactNode, useState, useMemo, type ComponentProps, createContext, use } from 'react';\n\nconst Context = createContext<{\n value: string | null;\n setValue: (type: string) => void;\n} | null>(null);\n\nexport function SelectTabs({\n defaultValue,\n children,\n}: {\n defaultValue?: string;\n children: ReactNode;\n}) {\n const [value, setValue] = useState<string | null>(defaultValue ?? null);\n\n return <Context value={useMemo(() => ({ value, setValue }), [value])}>{children}</Context>;\n}\n\nexport function SelectTab({\n value,\n ...props\n}: ComponentProps<'div'> & {\n value: string;\n}) {\n const ctx = use(Context);\n if (value !== ctx?.value) return;\n\n return <div {...props}>{props.children}</div>;\n}\n\nexport function SelectTabTrigger({\n items,\n className,\n ...props\n}: ComponentProps<typeof SelectTrigger> & {\n items: {\n label: ReactNode;\n value: string;\n }[];\n}) {\n const { value, setValue } = use(Context)!;\n\n return (\n <Select value={value ?? ''} onValueChange={setValue}>\n <SelectTrigger className={cn('not-prose w-fit min-w-0 *:min-w-0', className)} {...props}>\n <SelectValue>{value && items.find((item) => item.value === value)?.label}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n {items.map(({ label, value }) => (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n"],"mappings":";;;;;;AAMA,MAAM,UAAU,cAGN,KAAK;AAEf,SAAgB,WAAW,EACzB,cACA,YAIC;CACD,MAAM,CAAC,OAAO,YAAY,SAAwB,gBAAgB,KAAK;AAEvE,QAAO,oBAAC,SAAD;EAAS,OAAO,eAAe;GAAE;GAAO;GAAU,GAAG,CAAC,MAAM,CAAC;EAAG;EAAmB,CAAA;;AAG5F,SAAgB,UAAU,EACxB,OACA,GAAG,SAGF;AAED,KAAI,UADQ,IAAI,QAAQ,EACL,MAAO;AAE1B,QAAO,oBAAC,OAAD;EAAK,GAAI;YAAQ,MAAM;EAAe,CAAA;;AAG/C,SAAgB,iBAAiB,EAC/B,OACA,WACA,GAAG,SAMF;CACD,MAAM,EAAE,OAAO,aAAa,IAAI,QAAQ;AAExC,QACE,qBAAC,QAAD;EAAQ,OAAO,SAAS;EAAI,eAAe;YAA3C,CACE,oBAAC,eAAD;GAAe,WAAW,GAAG,qCAAqC,UAAU;GAAE,GAAI;aAChF,oBAAC,aAAD,EAAA,UAAc,SAAS,MAAM,MAAM,SAAS,KAAK,UAAU,MAAM,EAAE,OAAoB,CAAA;GACzE,CAAA,EAChB,oBAAC,eAAD,EAAA,UACG,MAAM,KAAK,EAAE,OAAO,YACnB,oBAAC,YAAD;GAA+B;aAC5B;GACU,EAFI,MAEJ,CACb,EACY,CAAA,CACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"select.js","names":[],"sources":["../../../src/ui/components/select.tsx"],"sourcesContent":["import * as SelectPrimitive from '@radix-ui/react-select';\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react';\nimport React, { forwardRef } from 'react';\nimport { cn } from '@/utils/cn';\n\nconst Select = SelectPrimitive.Root;\n\nconst SelectGroup = SelectPrimitive.Group;\n\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex items-center w-full rounded-md border p-2 gap-2 text-start text-sm text-fd-secondary-foreground bg-fd-secondary hover:bg-fd-accent focus:outline-none focus:ring focus:ring-fd-ring disabled:cursor-not-allowed disabled:opacity-50 data-placeholder:text-fd-muted-foreground',\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"ms-auto size-3.5 text-fd-muted-foreground shrink-0\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectScrollUpButton = forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn('flex items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronUp className=\"size-4\" />\n </SelectPrimitive.ScrollUpButton>\n));\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\n\nconst SelectScrollDownButton = forwardRef<\n React.ComponentRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn('flex items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronDown className=\"size-4\" />\n </SelectPrimitive.ScrollDownButton>\n));\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;\n\nconst SelectContent = forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position, ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'z-50 overflow-hidden rounded-lg border bg-fd-popover text-fd-popover-foreground shadow-md',\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport className=\"p-1\">{children}</SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectLabel = forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn('py-1.5 pe-2 ps-6 text-sm font-semibold', className)}\n {...props}\n />\n));\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nconst SelectItem = forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'flex select-none flex-row items-center rounded-md py-1.5 px-2 text-sm outline-none focus:bg-fd-accent focus:text-fd-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n <SelectPrimitive.ItemIndicator className=\"ms-auto\">\n <Check className=\"size-3.5 text-fd-primary\" />\n </SelectPrimitive.ItemIndicator>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nconst SelectSeparator = forwardRef<\n React.ComponentRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('my-1 h-px bg-fd-muted', className)}\n {...props}\n />\n));\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n};\n"],"mappings":";;;;;;AAKA,MAAM,SAAS,gBAAgB;AAEX,gBAAgB;AAEpC,MAAM,cAAc,gBAAgB;AAEpC,MAAM,gBAAgB,YAGnB,EAAE,WAAW,UAAU,GAAG,SAAS,QACpC,qBAAC,gBAAgB,SAAjB;CACO;CACL,WAAW,GACT,sRACA,UACD;CACD,GAAI;WANN,CAQG,UACD,oBAAC,gBAAgB,MAAjB;EAAsB,SAAA;YACpB,oBAAC,aAAD,EAAa,WAAU,sDAAuD,CAAA;EACzD,CAAA,CACC;GAC1B;AACF,cAAc,cAAc,gBAAgB,QAAQ;AAEpD,MAAM,uBAAuB,YAG1B,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB,gBAAjB;CACO;CACL,WAAW,GAAG,yCAAyC,UAAU;CACjE,GAAI;WAEJ,oBAAC,WAAD,EAAW,WAAU,UAAW,CAAA;CACD,CAAA,CACjC;AACF,qBAAqB,cAAc,gBAAgB,eAAe;AAElE,MAAM,yBAAyB,YAG5B,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB,kBAAjB;CACO;CACL,WAAW,GAAG,yCAAyC,UAAU;CACjE,GAAI;WAEJ,oBAAC,aAAD,EAAa,WAAU,UAAW,CAAA;CACD,CAAA,CACnC;AACF,uBAAuB,cAAc,gBAAgB,iBAAiB;AAEtE,MAAM,gBAAgB,YAGnB,EAAE,WAAW,UAAU,UAAU,GAAG,SAAS,QAC9C,oBAAC,gBAAgB,QAAjB,EAAA,UACE,qBAAC,gBAAgB,SAAjB;CACO;CACL,WAAW,GACT,6FACA,UACD;CACS;CACV,GAAI;WAPN;EASE,oBAAC,sBAAD,EAAwB,CAAA;EACxB,oBAAC,gBAAgB,UAAjB;GAA0B,WAAU;GAAO;GAAoC,CAAA;EAC/E,oBAAC,wBAAD,EAA0B,CAAA;EACF;IACH,CAAA,CACzB;AACF,cAAc,cAAc,gBAAgB,QAAQ;AAEpD,MAAM,cAAc,YAGjB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB,OAAjB;CACO;CACL,WAAW,GAAG,0CAA0C,UAAU;CAClE,GAAI;CACJ,CAAA,CACF;AACF,YAAY,cAAc,gBAAgB,MAAM;AAEhD,MAAM,aAAa,YAGhB,EAAE,WAAW,UAAU,GAAG,SAAS,QACpC,qBAAC,gBAAgB,MAAjB;CACO;CACL,WAAW,GACT,wMACA,UACD;CACD,GAAI;WANN,CAQE,oBAAC,gBAAgB,UAAjB,EAA2B,UAAoC,CAAA,EAC/D,oBAAC,gBAAgB,eAAjB;EAA+B,WAAU;YACvC,oBAAC,OAAD,EAAO,WAAU,4BAA6B,CAAA;EAChB,CAAA,CACX;GACvB;AACF,WAAW,cAAc,gBAAgB,KAAK;AAE9C,MAAM,kBAAkB,YAGrB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB,WAAjB;CACO;CACL,WAAW,GAAG,yBAAyB,UAAU;CACjD,GAAI;CACJ,CAAA,CACF;AACF,gBAAgB,cAAc,gBAAgB,UAAU"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","names":[],"sources":["../../../src/ui/contexts/api.tsx"],"mappings":";;;;;;UAYU,kBAAA,SAA2B,IAAA,CAAK,aAAA;EACxC,MAAA,EAAQ,oBAAA;AAAA;AAAA,KAUE,gBAAA,GAAmB,kBAAA;AAAA,iBA8Bf,WAAA,CAAA;EACd,QAAA;EACA,YAAA;EACA;AAAA,GACC,gBAAA;EAAqB,QAAA,EAAU,SAAA;AAAA,IAAW,oBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBA4B7B,cAAA,CAAA;EACd,OAAA;EACA;AAAA;EAEA,OAAA,GAAU,YAAA;EACV,QAAA,EAAU,SAAA;AAAA,IACX,oBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","names":[],"sources":["../../../src/ui/contexts/api.tsx"],"sourcesContent":["'use client';\nimport { createContext, type ReactNode, use, useEffect, useMemo, useState } from 'react';\nimport type { RenderContext, ServerObject } from '@/types';\nimport { defaultAdapters, type MediaAdapter } from '@/requests/media/adapter';\nimport { useStorageKey } from '../client/storage-key';\nimport type { APIPageClientOptions } from '../client';\nimport {\n type CodeUsageGeneratorRegistry,\n createCodeUsageGeneratorRegistry,\n} from '@/requests/generators';\nimport { registerDefault } from '@/requests/generators/all';\n\ninterface InheritFromContext extends Pick<RenderContext, 'shikiOptions'> {\n client: APIPageClientOptions;\n}\n\ninterface ServerContextType {\n servers?: ServerObject[];\n server: SelectedServer | null;\n setServer: (value: string) => void;\n setServerVariables: (value: Record<string, string>) => void;\n}\n\nexport type ApiProviderProps = InheritFromContext;\n\nexport interface SelectedServer {\n url: string;\n name?: string;\n variables: Record<string, string>;\n}\n\ninterface ApiContextType extends InheritFromContext {\n mediaAdapters: Record<string, MediaAdapter>;\n codeUsages: CodeUsageGeneratorRegistry;\n}\n\nconst ApiContext = createContext<ApiContextType | null>(null);\nconst ServerContext = createContext<ServerContextType | null>(null);\n\nexport function useApiContext(): ApiContextType {\n const ctx = use(ApiContext);\n if (!ctx) throw new Error('Component must be used under <ApiProvider />');\n\n return ctx;\n}\n\nexport function useServerContext() {\n const ctx = use(ServerContext);\n if (!ctx) throw new Error('Component must be used under <ApiProvider />');\n\n return ctx;\n}\n\nexport function ApiProvider({\n children,\n shikiOptions,\n client,\n}: ApiProviderProps & { children: ReactNode }) {\n return (\n <ApiContext\n value={useMemo(() => {\n let codeUsages: CodeUsageGeneratorRegistry;\n if (client.codeUsages) {\n codeUsages = createCodeUsageGeneratorRegistry(client.codeUsages);\n } else {\n codeUsages = createCodeUsageGeneratorRegistry();\n registerDefault(codeUsages);\n }\n\n return {\n shikiOptions,\n client,\n codeUsages,\n mediaAdapters: {\n ...defaultAdapters,\n ...client.mediaAdapters,\n },\n };\n }, [client, shikiOptions])}\n >\n {children}\n </ApiContext>\n );\n}\n\nexport function ServerProvider({\n servers,\n children,\n}: {\n servers?: ServerObject[];\n children: ReactNode;\n}) {\n const storageKey = useStorageKey().of('server-url');\n const [server, setServer] = useState<SelectedServer | null>(() => {\n if (!servers || servers.length === 0) return null;\n const defaultItem = servers[0];\n\n return {\n name: defaultItem.name,\n url: defaultItem.url!,\n variables: getDefaultValues(defaultItem),\n };\n });\n\n useEffect(() => {\n const cached = localStorage.getItem(storageKey);\n if (!cached) return;\n\n try {\n const obj: unknown = JSON.parse(cached);\n if (\n typeof obj === 'object' &&\n obj !== null &&\n 'url' in obj &&\n typeof obj.url === 'string' &&\n 'variables' in obj &&\n typeof obj.variables === 'object' &&\n obj.variables !== null\n ) {\n setServer(obj as SelectedServer);\n }\n } catch {\n // ignore\n }\n }, [storageKey]);\n\n return (\n <ServerContext\n value={useMemo(\n () => ({\n servers,\n server,\n setServerVariables(variables) {\n setServer((prev) => {\n if (!prev) return null;\n\n const updated = { ...prev, variables };\n localStorage.setItem(storageKey, JSON.stringify(updated));\n return updated;\n });\n },\n setServer(value) {\n const obj = servers?.find((item) => item.url === value);\n if (!obj) return;\n\n const result: SelectedServer = {\n name: obj.name,\n url: value,\n variables: getDefaultValues(obj),\n };\n\n localStorage.setItem(storageKey, JSON.stringify(result));\n setServer(result);\n },\n }),\n [server, servers, storageKey],\n )}\n >\n {children}\n </ServerContext>\n );\n}\n\nfunction getDefaultValues(server: ServerObject): Record<string, string> {\n const out: Record<string, string> = {};\n if (!server.variables) return out;\n\n for (const [k, v] of Object.entries(server.variables)) {\n if (v.default !== undefined) out[k] = String(v.default);\n }\n\n return out;\n}\n"],"mappings":";;;;;;;;AAoCA,MAAM,aAAa,cAAqC,KAAK;AAC7D,MAAM,gBAAgB,cAAwC,KAAK;AAEnE,SAAgB,gBAAgC;CAC9C,MAAM,MAAM,IAAI,WAAW;AAC3B,KAAI,CAAC,IAAK,OAAM,IAAI,MAAM,+CAA+C;AAEzE,QAAO;;AAGT,SAAgB,mBAAmB;CACjC,MAAM,MAAM,IAAI,cAAc;AAC9B,KAAI,CAAC,IAAK,OAAM,IAAI,MAAM,+CAA+C;AAEzE,QAAO;;AAGT,SAAgB,YAAY,EAC1B,UACA,cACA,UAC6C;AAC7C,QACE,oBAAC,YAAD;EACE,OAAO,cAAc;GACnB,IAAI;AACJ,OAAI,OAAO,WACT,cAAa,iCAAiC,OAAO,WAAW;QAC3D;AACL,iBAAa,kCAAkC;AAC/C,oBAAgB,WAAW;;AAG7B,UAAO;IACL;IACA;IACA;IACA,eAAe;KACb,GAAG;KACH,GAAG,OAAO;KACX;IACF;KACA,CAAC,QAAQ,aAAa,CAAC;EAEzB;EACU,CAAA;;AAIjB,SAAgB,eAAe,EAC7B,SACA,YAIC;CACD,MAAM,aAAa,eAAe,CAAC,GAAG,aAAa;CACnD,MAAM,CAAC,QAAQ,aAAa,eAAsC;AAChE,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;EAC7C,MAAM,cAAc,QAAQ;AAE5B,SAAO;GACL,MAAM,YAAY;GAClB,KAAK,YAAY;GACjB,WAAW,iBAAiB,YAAY;GACzC;GACD;AAEF,iBAAgB;EACd,MAAM,SAAS,aAAa,QAAQ,WAAW;AAC/C,MAAI,CAAC,OAAQ;AAEb,MAAI;GACF,MAAM,MAAe,KAAK,MAAM,OAAO;AACvC,OACE,OAAO,QAAQ,YACf,QAAQ,QACR,SAAS,OACT,OAAO,IAAI,QAAQ,YACnB,eAAe,OACf,OAAO,IAAI,cAAc,YACzB,IAAI,cAAc,KAElB,WAAU,IAAsB;UAE5B;IAGP,CAAC,WAAW,CAAC;AAEhB,QACE,oBAAC,eAAD;EACE,OAAO,eACE;GACL;GACA;GACA,mBAAmB,WAAW;AAC5B,eAAW,SAAS;AAClB,SAAI,CAAC,KAAM,QAAO;KAElB,MAAM,UAAU;MAAE,GAAG;MAAM;MAAW;AACtC,kBAAa,QAAQ,YAAY,KAAK,UAAU,QAAQ,CAAC;AACzD,YAAO;MACP;;GAEJ,UAAU,OAAO;IACf,MAAM,MAAM,SAAS,MAAM,SAAS,KAAK,QAAQ,MAAM;AACvD,QAAI,CAAC,IAAK;IAEV,MAAM,SAAyB;KAC7B,MAAM,IAAI;KACV,KAAK;KACL,WAAW,iBAAiB,IAAI;KACjC;AAED,iBAAa,QAAQ,YAAY,KAAK,UAAU,OAAO,CAAC;AACxD,cAAU,OAAO;;GAEpB,GACD;GAAC;GAAQ;GAAS;GAAW,CAC9B;EAEA;EACa,CAAA;;AAIpB,SAAS,iBAAiB,QAA8C;CACtE,MAAM,MAA8B,EAAE;AACtC,KAAI,CAAC,OAAO,UAAW,QAAO;AAE9B,MAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,OAAO,UAAU,CACnD,KAAI,EAAE,YAAY,KAAA,EAAW,KAAI,KAAK,OAAO,EAAE,QAAQ;AAGzD,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-client.d.ts","names":[],"sources":["../../src/ui/create-client.tsx"],"mappings":";;;;;;UA4BiB,kBAAA,SAA2B,IAAA,CAAK,YAAA;EAC/C,OAAA,EAAS,oBAAA;AAAA;AAAA,UAGM,oBAAA;EACf,OAAA,EAAS,QAAA;EACT,QAAA;AAAA;AAAA,KAGU,0BAAA,GAA6B,IAAA,CACvC,OAAA,CAAQ,oBAAA;;;;iBAOM,mBAAA,CAAA;EACd,KAAA;EACA,YAAA;EACA,6BAAA;EAAA,GAcG;AAAA,IACF,0BAAA,GAAkC,EAAA,CAAG,kBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-client.js","names":["ClientBoundary"],"sources":["../../src/ui/create-client.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any -- rehype-react without types */\nimport type { Document, RenderContext } from '@/types';\nimport { defaultAdapters } from '@/requests/media/adapter';\nimport {\n Children,\n type ComponentProps,\n type ReactElement,\n useMemo,\n type FC,\n type ReactNode,\n} from 'react';\nimport { Heading } from 'fumadocs-ui/components/heading';\nimport { remarkGfm } from 'fumadocs-core/mdx-plugins/remark-gfm';\nimport defaultMdxComponents from 'fumadocs-ui/mdx';\nimport { remark } from 'remark';\nimport remarkRehype from 'remark-rehype';\nimport { toJsxRuntime } from 'hast-util-to-jsx-runtime';\nimport * as JsxRuntime from 'react/jsx-runtime';\nimport { APIPage, type ApiPageProps } from './api-page';\nimport type { APIPlaygroundProps, CreateAPIPageOptions } from './base';\nimport { defaultShikiFactory } from 'fumadocs-core/highlight/shiki/full';\nimport { compile } from '@fumari/json-schema-ts';\nimport { ClientCodeBlock, ClientCodeBlockProvider } from './components/codeblock';\nimport { slug } from 'github-slugger';\nimport * as ClientBoundary from '@/ui/client/boundary';\nimport { dereferenceDocument } from '@/utils/document/dereference';\nimport { parseSecurities } from '@/utils/schema';\n\nexport interface ClientApiPageProps extends Omit<ApiPageProps, 'document'> {\n payload: ClientApiPagePayload;\n}\n\nexport interface ClientApiPagePayload {\n bundled: Document;\n proxyUrl?: string;\n}\n\nexport type CreateClientAPIPageOptions = Omit<\n Partial<CreateAPIPageOptions>,\n 'generateTypeScriptSchema'\n>;\n\n/**\n * Create `<APIPage />` for non-RSC environment, note that this may be unstable, and doesn't support the full set of features.\n */\nexport function createClientAPIPage({\n shiki = defaultShikiFactory,\n shikiOptions = { themes: { light: 'github-light', dark: 'github-dark' } },\n generateTypeScriptDefinitions = (schema, ctx) => {\n if (typeof schema !== 'object') return;\n\n try {\n return compile(schema, {\n name: 'Response',\n readOnly: ctx.readOnly,\n writeOnly: ctx.writeOnly,\n getSchemaId: ctx.schema.getRawRef,\n });\n } catch (e) {\n console.warn('Failed to generate typescript schema:', e);\n }\n },\n ...options\n}: CreateClientAPIPageOptions = {}): FC<ClientApiPageProps> {\n let processor: ReturnType<typeof createMarkdownProcessor>;\n const mdxComponents = {\n ...defaultMdxComponents,\n img: undefined,\n pre: MarkdownPre,\n };\n\n function createMarkdownProcessor() {\n function rehypeReact(this: any) {\n this.compiler = (tree: any, file: any) => {\n return toJsxRuntime(tree, {\n development: false,\n filePath: file.path,\n ...JsxRuntime,\n components: mdxComponents,\n });\n };\n }\n\n return remark().use(remarkGfm).use(remarkRehype).use(rehypeReact);\n }\n\n function renderPlaygroundDefault({ method, path, ctx }: APIPlaygroundProps) {\n return (\n <ctx.clientBoundary.PlaygroundClient\n route={path}\n securities={parseSecurities(method, ctx.schema.dereferenced)}\n method={method.method}\n doc={{ processed: ctx.schema }}\n proxyUrl={ctx.proxyUrl}\n writeOnly\n readOnly={false}\n />\n );\n }\n\n return function ClientAPIPage({ payload, ...props }) {\n const processed = useMemo(() => dereferenceDocument(payload.bundled), [payload.bundled]);\n\n const ctx: RenderContext = useMemo(\n () => ({\n schema: processed,\n proxyUrl: payload.proxyUrl,\n shiki,\n shikiOptions,\n generateTypeScriptDefinitions,\n clientBoundary: ClientBoundary,\n ...options,\n mediaAdapters: {\n ...defaultAdapters,\n ...options.mediaAdapters,\n },\n playground: {\n ...options.playground,\n render: options.playground?.render ?? renderPlaygroundDefault,\n },\n renderHeading(depth, text, props) {\n const id = typeof text === 'string' ? slug(text) : props?.id;\n if (!id) throw new Error(\"missing 'id' for non-string children\");\n\n if (options.renderHeading) {\n return options.renderHeading({ id, children: text, ...props }, depth);\n }\n\n return (\n <Heading id={id} key={id} as={`h${depth}` as `h1`} {...props}>\n {text}\n </Heading>\n );\n },\n renderMarkdown(text) {\n if (options.renderMarkdown) return options.renderMarkdown(text);\n processor ??= createMarkdownProcessor();\n\n return processor.processSync({\n value: text,\n }).result as ReactNode;\n },\n renderCodeBlock(lang, code) {\n if (options.renderCodeBlock) {\n return options.renderCodeBlock({ lang, code });\n }\n\n return <ClientCodeBlock lang={lang} code={code} />;\n },\n }),\n [payload.proxyUrl, processed],\n );\n\n return (\n <ClientCodeBlockProvider factory={shiki}>\n <APIPage {...props} ctx={ctx} />\n </ClientCodeBlockProvider>\n );\n };\n}\n\nfunction MarkdownPre(props: ComponentProps<'pre'>) {\n const code = Children.only(props.children) as ReactElement;\n const codeProps = code.props as ComponentProps<'code'>;\n const content = codeProps.children;\n if (typeof content !== 'string') return null;\n\n const lang =\n codeProps.className\n ?.split(' ')\n .find((v) => v.startsWith('language-'))\n ?.slice('language-'.length) ?? 'text';\n\n return <ClientCodeBlock lang={lang} code={content.trimEnd()} />;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA6CA,SAAgB,oBAAoB,EAClC,QAAQ,qBACR,eAAe,EAAE,QAAQ;CAAE,OAAO;CAAgB,MAAM;CAAe,EAAE,EACzE,iCAAiC,QAAQ,QAAQ;AAC/C,KAAI,OAAO,WAAW,SAAU;AAEhC,KAAI;AACF,SAAO,QAAQ,QAAQ;GACrB,MAAM;GACN,UAAU,IAAI;GACd,WAAW,IAAI;GACf,aAAa,IAAI,OAAO;GACzB,CAAC;UACK,GAAG;AACV,UAAQ,KAAK,yCAAyC,EAAE;;GAG5D,GAAG,YAC2B,EAAE,EAA0B;CAC1D,IAAI;CACJ,MAAM,gBAAgB;EACpB,GAAG;EACH,KAAK,KAAA;EACL,KAAK;EACN;CAED,SAAS,0BAA0B;EACjC,SAAS,cAAuB;AAC9B,QAAK,YAAY,MAAW,SAAc;AACxC,WAAO,aAAa,MAAM;KACxB,aAAa;KACb,UAAU,KAAK;KACf,GAAG;KACH,YAAY;KACb,CAAC;;;AAIN,SAAO,QAAQ,CAAC,IAAI,UAAU,CAAC,IAAI,aAAa,CAAC,IAAI,YAAY;;CAGnE,SAAS,wBAAwB,EAAE,QAAQ,MAAM,OAA2B;AAC1E,SACE,oBAAC,IAAI,eAAe,kBAApB;GACE,OAAO;GACP,YAAY,gBAAgB,QAAQ,IAAI,OAAO,aAAa;GAC5D,QAAQ,OAAO;GACf,KAAK,EAAE,WAAW,IAAI,QAAQ;GAC9B,UAAU,IAAI;GACd,WAAA;GACA,UAAU;GACV,CAAA;;AAIN,QAAO,SAAS,cAAc,EAAE,SAAS,GAAG,SAAS;EACnD,MAAM,YAAY,cAAc,oBAAoB,QAAQ,QAAQ,EAAE,CAAC,QAAQ,QAAQ,CAAC;EAExF,MAAM,MAAqB,eAClB;GACL,QAAQ;GACR,UAAU,QAAQ;GAClB;GACA;GACA;GACA,gBAAgBA;GAChB,GAAG;GACH,eAAe;IACb,GAAG;IACH,GAAG,QAAQ;IACZ;GACD,YAAY;IACV,GAAG,QAAQ;IACX,QAAQ,QAAQ,YAAY,UAAU;IACvC;GACD,cAAc,OAAO,MAAM,OAAO;IAChC,MAAM,KAAK,OAAO,SAAS,WAAW,KAAK,KAAK,GAAG,OAAO;AAC1D,QAAI,CAAC,GAAI,OAAM,IAAI,MAAM,uCAAuC;AAEhE,QAAI,QAAQ,cACV,QAAO,QAAQ,cAAc;KAAE;KAAI,UAAU;KAAM,GAAG;KAAO,EAAE,MAAM;AAGvE,WACE,oBAAC,SAAD;KAAa;KAAa,IAAI,IAAI;KAAiB,GAAI;eACpD;KACO,EAFY,GAEZ;;GAGd,eAAe,MAAM;AACnB,QAAI,QAAQ,eAAgB,QAAO,QAAQ,eAAe,KAAK;AAC/D,kBAAc,yBAAyB;AAEvC,WAAO,UAAU,YAAY,EAC3B,OAAO,MACR,CAAC,CAAC;;GAEL,gBAAgB,MAAM,MAAM;AAC1B,QAAI,QAAQ,gBACV,QAAO,QAAQ,gBAAgB;KAAE;KAAM;KAAM,CAAC;AAGhD,WAAO,oBAAC,iBAAD;KAAuB;KAAY;KAAQ,CAAA;;GAErD,GACD,CAAC,QAAQ,UAAU,UAAU,CAC9B;AAED,SACE,oBAAC,yBAAD;GAAyB,SAAS;aAChC,oBAAC,SAAD;IAAS,GAAI;IAAY;IAAO,CAAA;GACR,CAAA;;;AAKhC,SAAS,YAAY,OAA8B;CAEjD,MAAM,YADO,SAAS,KAAK,MAAM,SAAS,CACnB;CACvB,MAAM,UAAU,UAAU;AAC1B,KAAI,OAAO,YAAY,SAAU,QAAO;AAQxC,QAAO,oBAAC,iBAAD;EAAiB,MALtB,UAAU,WACN,MAAM,IAAI,CACX,MAAM,MAAM,EAAE,WAAW,YAAY,CAAC,EACrC,MAAM,EAAmB,IAAI;EAEC,MAAM,QAAQ,SAAS;EAAI,CAAA"}
|
package/dist/ui/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/ui/index.tsx"],"mappings":";;;;;;KAKY,oBAAA,GAAuB,OAAA,CAAQ,sBAAA;AAAA,iBAE3B,aAAA,CAAc,MAAA,EAAQ,aAAA,EAAe,OAAA,GAAS,oBAAA,IAOhC,KAAA,EAAO,kBAAA,KAAuB,oBAAA,CAAA,GAAA,CAAA,OAAA"}
|
package/dist/ui/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["base.createAPIPage"],"sources":["../../src/ui/index.tsx"],"sourcesContent":["import type { OpenAPIServer } from '@/server';\nimport * as base from './base';\nimport { defaultShikiFactory } from 'fumadocs-core/highlight/shiki/full';\nimport { FullProvider } from './client/full';\n\nexport type CreateAPIPageOptions = Partial<base.CreateAPIPageOptions>;\n\nexport function createAPIPage(server: OpenAPIServer, options: CreateAPIPageOptions = {}) {\n const APIPage = base.createAPIPage(server, {\n shiki: defaultShikiFactory,\n shikiOptions: { themes: { light: 'github-light', dark: 'github-dark' } },\n ...options,\n });\n\n return function APIPageFull(props: base.ServerApiPageProps) {\n return (\n <FullProvider>\n <APIPage {...props} />\n </FullProvider>\n );\n };\n}\n\nexport type { ApiPageProps, OperationItem, WebhookItem } from './api-page';\n"],"mappings":";;;;;AAOA,SAAgB,cAAc,QAAuB,UAAgC,EAAE,EAAE;CACvF,MAAM,UAAUA,gBAAmB,QAAQ;EACzC,OAAO;EACP,cAAc,EAAE,QAAQ;GAAE,OAAO;GAAgB,MAAM;GAAe,EAAE;EACxE,GAAG;EACJ,CAAC;AAEF,QAAO,SAAS,YAAY,OAAgC;AAC1D,SACE,oBAAC,cAAD,EAAA,UACE,oBAAC,SAAD,EAAS,GAAI,OAAS,CAAA,EACT,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":[],"sources":["../../../src/ui/operation/client.tsx"],"sourcesContent":["'use client';\n\nimport { useCopyButton } from 'fumadocs-ui/utils/use-copy-button';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport { cn } from '@/utils/cn';\nimport { Check, Copy } from 'lucide-react';\nimport { createContext, type ReactNode, use, useMemo, useRef, useState } from 'react';\nimport { useTranslations } from '@/ui/client/i18n';\nimport type { ExampleRequestItem } from './get-example-requests';\nimport type { RawRequestData, RequestData } from '@/requests/types';\n\nexport type ExampleUpdateListener = (data: RawRequestData, encoded: RequestData) => void;\n\nconst OperationContext = 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 OperationProvider({\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 <OperationContext\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 </OperationContext>\n );\n}\n\nexport function useOperationContext() {\n return use(OperationContext)!;\n}\n\nexport function CopyTypeScriptPanel({\n name,\n code,\n className,\n}: {\n code: string;\n name: 'response body' | 'request body';\n className?: string;\n}) {\n const [isChecked, onCopy] = useCopyButton(() => {\n void navigator.clipboard.writeText(code);\n });\n const t = useTranslations();\n const useTypeText = t.useTypeInTypeScript.replace('{name}', name);\n\n return (\n <div\n className={cn(\n 'flex items-start justify-between gap-2 bg-fd-card text-fd-card-foreground border rounded-xl p-3 not-prose mb-4 last:mb-0',\n className,\n )}\n >\n <div>\n <p className=\"font-medium text-sm mb-2\">{t.typeScriptDefinitions}</p>\n <p className=\"text-xs text-fd-muted-foreground\">{useTypeText}</p>\n </div>\n <button\n onClick={onCopy}\n className={cn(\n buttonVariants({\n color: 'secondary',\n className: 'p-2 gap-2',\n size: 'sm',\n }),\n )}\n >\n {isChecked ? <Check className=\"size-3.5\" /> : <Copy className=\"size-3.5\" />}\n {t.copy}\n </button>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAaA,MAAM,mBAAmB,cASf,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,kBAAD;EACE,OAAO,eACE;GACL;GACA;GACA,WAAW,QAAgB;IACzB,MAAM,UAAU,SAAS,MAAM,YAAY,QAAQ,OAAO,OAAO;AACjE,QAAI,CAAC,QAAS;AAEd,eAAW,OAAO;AAClB,SAAK,MAAM,YAAY,UAAU,QAC/B,UAAS,QAAQ,MAAM,QAAQ,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;EACgB,CAAA;;AAIvB,SAAgB,sBAAsB;AACpC,QAAO,IAAI,iBAAiB;;AAG9B,SAAgB,oBAAoB,EAClC,MACA,MACA,aAKC;CACD,MAAM,CAAC,WAAW,UAAU,oBAAoB;AACzC,YAAU,UAAU,UAAU,KAAK;GACxC;CACF,MAAM,IAAI,iBAAiB;CAC3B,MAAM,cAAc,EAAE,oBAAoB,QAAQ,UAAU,KAAK;AAEjE,QACE,qBAAC,OAAD;EACE,WAAW,GACT,4HACA,UACD;YAJH,CAME,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,KAAD;GAAG,WAAU;aAA4B,EAAE;GAA0B,CAAA,EACrE,oBAAC,KAAD;GAAG,WAAU;aAAoC;GAAgB,CAAA,CAC7D,EAAA,CAAA,EACN,qBAAC,UAAD;GACE,SAAS;GACT,WAAW,GACT,eAAe;IACb,OAAO;IACP,WAAW;IACX,MAAM;IACP,CAAC,CACH;aARH,CAUG,YAAY,oBAAC,OAAD,EAAO,WAAU,YAAa,CAAA,GAAG,oBAAC,MAAD,EAAM,WAAU,YAAa,CAAA,EAC1E,EAAE,KACI;KACL"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-example-requests.d.ts","names":[],"sources":["../../../src/ui/operation/get-example-requests.ts"],"mappings":";;UAMiB,kBAAA;EACf,EAAA;EACA,IAAA;EACA,WAAA;EACA,IAAA,EAAM,cAAA;EACN,OAAA,EAAS,WAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-example-requests.js","names":[],"sources":["../../../src/ui/operation/get-example-requests.ts"],"sourcesContent":["import { encodeRequestData } from '@/requests/media/encode';\nimport type { RawRequestData, RequestData } from '@/requests/types';\nimport type { MethodInformation, RenderContext } from '@/types';\nimport { type NoReference, getPreferredType, pickExample } from '@/utils/schema';\nimport { sample } from 'openapi-sampler';\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 requestBody = operation.requestBody;\n const media = requestBody?.content ? getPreferredType(requestBody.content) : null;\n const bodyOfType = media ? 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:\n typeof bodyOfType?.schema === 'object' ? bodyOfType.schema.description : undefined,\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 as never);\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?.content) {\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"],"mappings":";;;;AAcA,SAAgB,mBACd,MACA,WACA,KACsB;CACtB,MAAM,cAAc,UAAU;CAC9B,MAAM,QAAQ,aAAa,UAAU,iBAAiB,YAAY,QAAQ,GAAG;CAC7E,MAAM,aAAa,QAAQ,YAAa,QAAS,SAAS;AAE1D,KAAI,YAAY,UAAU;EACxB,MAAM,SAA+B,EAAE;AAEvC,OAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,WAAW,SAAS,EAAE;GAC9D,MAAM,OAAO,eAAe,MAAM,WAAW,KAAK,IAAI;AAEtD,UAAO,KAAK;IACV,IAAI;IACJ,MAAM,MAAM,WAAW;IACvB,aAAa,MAAM;IACnB;IACA,SAAS,kBAAkB,MAAM,IAAI,eAAe,UAAU,cAAc,EAAE,CAAC;IAChF,CAAC;;AAGJ,MAAI,OAAO,SAAS,EAAG,QAAO;;CAGhC,MAAM,OAAO,eAAe,MAAM,WAAW,MAAM,IAAI;AACvD,QAAO,CACL;EACE,IAAI;EACJ,MAAM;EACN,aACE,OAAO,YAAY,WAAW,WAAW,WAAW,OAAO,cAAc,KAAA;EAC3E;EACA,SAAS,kBAAkB,MAAM,IAAI,eAAe,UAAU,cAAc,EAAE,CAAC;EAChF,CACF;;AAGH,SAAS,eACP,MACA,QACA,WACA,MACgB;CAChB,MAAM,SAAyB;EAC7B,MAAM,EAAE;EACR,QAAQ,EAAE;EACV,QAAQ,EAAE;EACV,OAAO,EAAE;EACT,QAAQ,OAAO;EAChB;AAED,MAAK,MAAM,SAAS,OAAO,cAAc,EAAE,EAAE;EAC3C,IAAI,QAAQ,YAAY,MAAe;AAEvC,MAAI,UAAU,KAAA,KAAa,MAAM;OAC3B,MAAM,OACR,SAAQ,OAAO,MAAM,OAAiB;YAC7B,MAAM,SAAS;IACxB,MAAM,OAAO,iBAAiB,MAAM,QAAQ;IAC5C,MAAM,UAAU,OAAO,MAAM,QAAQ,QAAQ,KAAA;AAC7C,QAAI,CAAC,WAAW,CAAC,QAAQ,OACvB,OAAM,IAAI,MACR,gBAAgB,MAAM,KAAK,mCAAmC,KAAK,OAAO,KAAK,GAAG,OAAO,SAC1F;AAEH,YAAQ,OAAO,QAAQ,OAAiB;;;AAI5C,UAAQ,MAAM,IAAd;GACE,KAAK;AACH,WAAO,OAAO,MAAM,QAAS;AAC7B;GACF,KAAK;AACH,WAAO,OAAO,MAAM,QAAS;AAC7B;GACF,KAAK;AACH,WAAO,MAAM,MAAM,QAAS;AAC5B;GACF,QACE,QAAO,KAAK,MAAM,QAAS;;;AAIjC,KAAI,OAAO,aAAa,SAAS;EAC/B,MAAM,OAAO,OAAO,YAAY;EAChC,MAAM,OAAO,iBAAiB,KAAK;AACnC,MAAI,CAAC,KACH,OAAM,IAAI,MAAM,+BAA+B,KAAK,GAAG,OAAO,OAAO,sBAAsB;AAC7F,SAAO,gBAAgB;EACvB,MAAM,aAAa,KAAK;AAExB,MAAI,WAAW,YAAY,UACzB,QAAO,OAAO,WAAW,SAAS,WAAW;WACpC,WAAW,QACpB,QAAO,OAAO,WAAW;MAEzB,QAAO,OAAO,OAAQ,YAAY,UAAU,EAAE,EAAa;GACzD,cAAc,OAAO,WAAW;GAChC,eAAe,OAAO,WAAW;GACjC,iBAAiB;GAClB,CAAC;;AAIN,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/ui/operation/index.tsx"],"sourcesContent":["import { type ComponentProps, Fragment, use, useMemo, type ReactNode } from 'react';\nimport type {\n CallbackObject,\n MediaTypeObject,\n MethodInformation,\n RenderContext,\n SecuritySchemeObject,\n ServerObject,\n} from '@/types';\nimport { createMethod, methodKeys, type NoReference } from '@/utils/schema';\nimport { idToTitle } from '@/utils/id-to-title';\nimport { Schema } from '../schema';\nimport { UsageTabs } from '@/ui/operation/usage-tabs';\nimport { Badge, MethodLabel } from '@/ui/components/method-label';\nimport { CopyTypeScriptPanel, OperationProvider } from './client';\nimport { I18nLabel } from '@/ui/client/i18n';\nimport {\n AccordionContent,\n AccordionHeader,\n AccordionItem,\n Accordions,\n AccordionTrigger,\n} from '@/ui/components/accordion';\nimport { isMediaTypeSupported } from '@/requests/media/adapter';\nimport { RequestTabs } from './request-tabs';\nimport { cn } from '@/utils/cn';\nimport { getExampleRequests } from './get-example-requests';\nimport { SelectTabs, SelectTabTrigger, SelectTab } from '../components/select-tab';\n\nconst paramTypeKeys = ['path', 'query', 'header', 'cookie'] as const;\n\nexport 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 const exampleRequests = useMemo(() => getExampleRequests(path, method, ctx), [ctx, method, path]);\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?.content ? 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, <I18nLabel label=\"titleRequestBody\" />, {\n id: '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 <RequestBodyContentItem content={content} method={method} ctx={ctx} />\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, <I18nLabel label=\"titleResponseBody\" />, {\n id: 'response-body',\n })}\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 = paramTypeKeys.map((type) => {\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, <I18nLabel label={`${type}Parameters`} />, {\n id: `parameters-${type}`,\n })}\n <div className=\"flex flex-col\">\n {params.map(\n (param) =>\n param.schema != null && (\n <Schema\n key={param.name}\n client={{\n name: param.name!,\n required: param.required,\n }}\n root={\n typeof param.schema === 'object'\n ? {\n ...param.schema,\n description: param.description ?? param.schema?.description,\n deprecated:\n (param.deprecated ?? false) || (param.schema?.deprecated ?? false),\n }\n : param.schema\n }\n readOnly={method.method === 'get'}\n writeOnly={method.method !== 'get'}\n ctx={ctx}\n />\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, <I18nLabel label=\"authorization\" />, {\n id: '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, <I18nLabel label=\"titleCallbacks\" />, {\n id: '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\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.parameters}\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 let content = renderOperationLayout(\n {\n header: headNode,\n description: descriptionNode,\n authSchemes: authNode,\n body: bodyNode,\n callbacks: callbacksNode,\n parameters: parameterNode,\n responses: responseNode,\n apiPlayground: playgroundEnabled ? (\n ctx.playground?.render?.({ path, method, 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 content = (\n <OperationProvider\n defaultExampleId={method['x-exclusiveCodeSample'] ?? method['x-selectedCodeSample']}\n route={path}\n examples={exampleRequests}\n >\n {content}\n </OperationProvider>\n );\n if (method.servers) {\n content = (\n <ctx.clientBoundary.ServerProvider servers={method.servers as ServerObject[]}>\n {content}\n </ctx.clientBoundary.ServerProvider>\n );\n }\n\n return content;\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.parameters}\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 parameters: parameterNode,\n responses: responseNode,\n requests: <RequestTabs examples={exampleRequests} path={path} operation={method} ctx={ctx} />,\n });\n }\n}\n\nfunction RequestBodyContentItem({\n content,\n method,\n ctx,\n}: {\n content: NoReference<MediaTypeObject>;\n method: MethodInformation;\n ctx: RenderContext;\n}) {\n let ts = useMemo(() => {\n if (!content.schema || !ctx.generateTypeScriptDefinitions) return;\n return ctx.generateTypeScriptDefinitions(content.schema, {\n operation: method,\n readOnly: false,\n writeOnly: true,\n ...ctx,\n });\n }, [content.schema, ctx, method]);\n if (ts instanceof Promise) ts = use(ts);\n\n return (\n <>\n {ts && <CopyTypeScriptPanel name=\"request body\" code={ts} className=\"mt-4\" />}\n {content.schema && (\n <Schema\n client={{\n name: 'body',\n as: 'body',\n required: method.requestBody?.required,\n }}\n root={content.schema}\n readOnly={method.method === 'get'}\n writeOnly={method.method !== 'get'}\n ctx={ctx}\n />\n )}\n </>\n );\n}\n\nfunction 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 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(([type, item]) => (\n <SelectTab key={type} value={type} className=\"mb-2\">\n <RepsonseAccordionItem\n type={type}\n status={status}\n item={item}\n operation={operation}\n ctx={ctx}\n />\n </SelectTab>\n ))}\n </AccordionContent>\n </AccordionItem>,\n );\n}\n\nfunction RepsonseAccordionItem({\n type,\n status,\n operation,\n item: { schema },\n ctx,\n}: {\n type: string;\n status: string;\n operation: MethodInformation;\n item: NoReference<MediaTypeObject>;\n ctx: RenderContext;\n}) {\n let ts = useMemo(() => {\n if (!schema || !ctx.generateTypeScriptDefinitions) return;\n return ctx.generateTypeScriptDefinitions(schema, {\n readOnly: true,\n writeOnly: false,\n operation,\n _internal_legacy: {\n statusCode: status,\n contentType: type,\n },\n ...ctx,\n });\n }, [ctx, operation, schema, status, type]);\n // assume it is on server component when returned async\n if (ts instanceof Promise) ts = use(ts);\n\n return (\n <>\n {ts && <CopyTypeScriptPanel name=\"response body\" 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}\n readOnly\n ctx={ctx}\n />\n </div>\n )}\n </>\n );\n}\n\nfunction WebhookCallback({\n callback,\n ctx,\n headingLevel,\n}: {\n callback: NoReference<CallbackObject>;\n ctx: RenderContext;\n headingLevel: number;\n}) {\n return (\n <Accordions type=\"single\" collapsible>\n {Object.entries(callback).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,\n scopes,\n ctx,\n}: {\n scheme: SecuritySchemeObject;\n scopes: string[];\n ctx: RenderContext;\n}) {\n if (scheme.type === 'http' || scheme.type === 'oauth2') {\n return (\n <AuthProperty\n name={<I18nLabel label=\"authorization\" />}\n type={\n scheme.type === 'http' && scheme.scheme === 'basic' ? (\n <I18nLabel label=\"authBasicTokenExample\" />\n ) : (\n <I18nLabel label=\"authBearerTokenExample\" />\n )\n }\n deprecated={scheme.deprecated}\n scopes={scopes}\n >\n {scheme.description && ctx.renderMarkdown(scheme.description)}\n <p>\n <I18nLabel label=\"authTokenIn\" />: <code>header</code>\n </p>\n </AuthProperty>\n );\n }\n\n if (scheme.type === 'apiKey') {\n return (\n <AuthProperty\n name={scheme.name!}\n type=\"<token>\"\n deprecated={scheme.deprecated}\n scopes={scopes}\n >\n {scheme.description && ctx.renderMarkdown(scheme.description)}\n <p>\n <I18nLabel label=\"authTokenIn\" />: <code>{scheme.in}</code>\n </p>\n </AuthProperty>\n );\n }\n\n if (scheme.type === 'openIdConnect') {\n return (\n <AuthProperty\n name={<I18nLabel label=\"openIdConnect\" />}\n type=\"<token>\"\n deprecated={scheme.deprecated}\n scopes={scopes}\n >\n {scheme.description && ctx.renderMarkdown(scheme.description)}\n </AuthProperty>\n );\n }\n}\n\nfunction AuthProperty({\n name,\n type,\n deprecated = false,\n scopes = [],\n className,\n ...props\n}: ComponentProps<'div'> & {\n name: ReactNode;\n type: ReactNode;\n deprecated?: boolean;\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 {deprecated && (\n <Badge color=\"red\" className=\"text-xs\">\n <I18nLabel label=\"deprecated\" />\n </Badge>\n )}\n </div>\n <div className=\"prose-no-margin pt-2.5 empty:hidden\">\n {props.children}\n {scopes.length > 0 && (\n <p>\n <I18nLabel label=\"authScope\" />: <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.js","names":[],"sources":["../../../src/ui/operation/request-tabs.tsx"],"sourcesContent":["import type { MethodInformation, RenderContext } from '@/types';\nimport type { NoReference } from '@/utils/schema';\nimport { I18nLabel } from '@/ui/client/i18n';\nimport {\n AccordionContent,\n AccordionHeader,\n AccordionItem,\n Accordions,\n AccordionTrigger,\n} from '@/ui/components/accordion';\nimport type { ReactNode } from 'react';\nimport type { RawRequestData } from '@/requests/types';\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from 'fumadocs-ui/components/tabs';\nimport { resolveRequestData } from '@/utils/url';\nimport { MethodLabel } from '../components/method-label';\nimport type { ExampleRequestItem } from './get-example-requests';\n\nexport function RequestTabs({\n path,\n operation,\n examples,\n ctx,\n}: {\n path: string;\n examples: ExampleRequestItem[];\n operation: NoReference<MethodInformation>;\n ctx: RenderContext;\n}) {\n if (!operation.requestBody) return null;\n const { renderRequestTabs = renderRequestTabsDefault } = ctx.content ?? {};\n\n return renderRequestTabs(examples, {\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 <I18nLabel label=\"titleRequestBody\" />\n <code className=\"text-xs text-fd-muted-foreground ms-auto\">\n {requestData.bodyMediaType}\n </code>\n </>\n ),\n cookie: <I18nLabel label=\"cookieParameters\" />,\n header: <I18nLabel label=\"headerParameters\" />,\n query: <I18nLabel label=\"queryParameters\" />,\n path: <I18nLabel label=\"pathParameters\" />,\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.id === '_default' ? <I18nLabel label=\"requestTabNameDefault\" /> : 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 = (\n <p className=\"text-fd-muted-foreground text-xs\">\n <I18nLabel label=\"empty\" />\n </p>\n );\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\">\n <I18nLabel label=\"titleRequestTabs\" />\n </p>\n {children}\n </div>\n );\n}\n"],"mappings":";;;;;;;AAiBA,SAAgB,YAAY,EAC1B,MACA,WACA,UACA,OAMC;AACD,KAAI,CAAC,UAAU,YAAa,QAAO;CACnC,MAAM,EAAE,oBAAoB,6BAA6B,IAAI,WAAW,EAAE;AAE1E,QAAO,kBAAkB,UAAU;EACjC,GAAG;EACH,OAAO;EACP;EACD,CAAC;;AAGJ,SAAS,yBACP,OACA,KAIA;CACA,SAAS,WAAW,MAA0B;EAC5C,MAAM,cAAc,KAAK;EACzB,MAAM,eAAiE;GACrE,MACE,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,WAAD,EAAW,OAAM,oBAAqB,CAAA,EACtC,oBAAC,QAAD;IAAM,WAAU;cACb,YAAY;IACR,CAAA,CACN,EAAA,CAAA;GAEL,QAAQ,oBAAC,WAAD,EAAW,OAAM,oBAAqB,CAAA;GAC9C,QAAQ,oBAAC,WAAD,EAAW,OAAM,oBAAqB,CAAA;GAC9C,OAAO,oBAAC,WAAD,EAAW,OAAM,mBAAoB,CAAA;GAC5C,MAAM,oBAAC,WAAD,EAAW,OAAM,kBAAmB,CAAA;GAC3C;AAED,SACE,qBAAA,UAAA,EAAA,UAAA;GACG,KAAK,eAAe,IAAI,eAAe,KAAK,YAAY;GACzD,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,aAAD,EAAA,UAAc,YAAY,QAAqB,CAAA,EAC/C,oBAAC,QAAD,EAAA,UAAO,mBAAmB,IAAI,OAAO,KAAK,QAAQ,EAAQ,CAAA,CACtD;;GAEN,oBAAC,YAAD;IAAY,MAAK;IAAW,WAAU;cACnC,OAAO,QAAQ,aAAa,CAAC,KAAK,CAAC,GAAG,OAAO;KAC5C,MAAM,OAAO,YAAY;AACzB,SAAI,CAAC,QAAQ,OAAO,KAAK,KAAK,CAAC,WAAW,EAAG;AAE7C,YACE,qBAAC,eAAD;MAAuB,OAAO;gBAA9B,CACE,oBAAC,iBAAD,EAAA,UACE,oBAAC,kBAAD,EAAA,UAAmB,GAAqB,CAAA,EACxB,CAAA,EAClB,oBAAC,kBAAD;OAAkB,WAAU;iBACzB,IAAI,gBAAgB,QAAQ,KAAK,UAAU,MAAM,MAAM,EAAE,CAAC;OAC1C,CAAA,CACL;QAPI,EAOJ;MAElB;IACS,CAAA;GACZ,EAAA,CAAA;;CAIP,IAAI;AACJ,KAAI,MAAM,SAAS,EACjB,YACE,qBAAC,MAAD;EAAM,cAAc,MAAM,GAAG;YAA7B,CACE,oBAAC,UAAD,EAAA,UACG,MAAM,KAAK,SACV,oBAAC,aAAD;GAA2B,OAAO,KAAK;aACpC,KAAK,OAAO,aAAa,oBAAC,WAAD,EAAW,OAAM,yBAA0B,CAAA,GAAG,KAAK;GACjE,EAFI,KAAK,GAET,CACd,EACO,CAAA,EACV,MAAM,KAAK,SACV,oBAAC,aAAD;GAA2B,OAAO,KAAK;aACpC,WAAW,KAAK;GACL,EAFI,KAAK,GAET,CACd,CACG;;UAEA,MAAM,WAAW,EAC1B,YAAW,WAAW,MAAM,GAAG;KAE/B,YACE,oBAAC,KAAD;EAAG,WAAU;YACX,oBAAC,WAAD,EAAW,OAAM,SAAU,CAAA;EACzB,CAAA;AAIR,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,KAAD;GAAG,WAAU;aACX,oBAAC,WAAD,EAAW,OAAM,oBAAqB,CAAA;GACpC,CAAA,EACH,SACG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"response-tabs.d.ts","names":[],"sources":["../../../src/ui/operation/response-tabs.tsx"],"mappings":";;;;;UAciB,WAAA;;AAAjB;;EAIE,IAAA;EAEA,QAAA,EAAU,WAAA,CAAY,cAAA;EAAZ;;;EAIV,SAAA;EAEA,QAAA,GAAW,eAAA;AAAA;AAAA,UAGH,eAAA;EATc;;;EAatB,MAAA;EAEA,KAAA,EAAO,SAAA;EATmB;AAC3B;;EAaC,WAAA;AAAA"}
|