fumadocs-openapi 10.2.2 → 10.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generate-file.d.ts +53 -49
- package/dist/generate-file.d.ts.map +1 -1
- package/dist/generate-file.js +88 -102
- package/dist/generate-file.js.map +1 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.js +3 -1
- package/dist/playground/client.d.ts +88 -72
- package/dist/playground/client.d.ts.map +1 -1
- package/dist/playground/client.js +446 -296
- package/dist/playground/client.js.map +1 -0
- package/dist/playground/components/inputs.js +395 -172
- package/dist/playground/components/inputs.js.map +1 -0
- package/dist/playground/components/oauth-dialog.js +270 -174
- package/dist/playground/components/oauth-dialog.js.map +1 -0
- package/dist/playground/components/server-select.js +115 -55
- package/dist/playground/components/server-select.js.map +1 -0
- package/dist/playground/fetcher.d.ts +10 -18
- package/dist/playground/fetcher.d.ts.map +1 -1
- package/dist/playground/fetcher.js +67 -75
- package/dist/playground/fetcher.js.map +1 -0
- package/dist/playground/get-default-values.js +23 -26
- package/dist/playground/get-default-values.js.map +1 -0
- package/dist/playground/index.d.ts +23 -13
- package/dist/playground/index.d.ts.map +1 -1
- package/dist/playground/index.js +87 -91
- package/dist/playground/index.js.map +1 -0
- package/dist/playground/lazy.js +9 -2
- package/dist/playground/lazy.js.map +1 -0
- package/dist/playground/schema.d.ts +18 -55
- package/dist/playground/schema.d.ts.map +1 -1
- package/dist/playground/schema.js +117 -106
- package/dist/playground/schema.js.map +1 -0
- package/dist/playground/status-info.js +49 -37
- package/dist/playground/status-info.js.map +1 -0
- package/dist/requests/generators/csharp.js +40 -50
- package/dist/requests/generators/csharp.js.map +1 -0
- package/dist/requests/generators/curl.js +28 -27
- package/dist/requests/generators/curl.js.map +1 -0
- package/dist/requests/generators/go.js +39 -35
- package/dist/requests/generators/go.js.map +1 -0
- package/dist/requests/generators/index.js +49 -43
- package/dist/requests/generators/index.js.map +1 -0
- package/dist/requests/generators/java.js +56 -67
- package/dist/requests/generators/java.js.map +1 -0
- package/dist/requests/generators/javascript.js +38 -45
- package/dist/requests/generators/javascript.js.map +1 -0
- package/dist/requests/generators/python.js +33 -37
- package/dist/requests/generators/python.js.map +1 -0
- package/dist/requests/media/adapter.d.ts +38 -84
- package/dist/requests/media/adapter.d.ts.map +1 -1
- package/dist/requests/media/adapter.js +122 -169
- package/dist/requests/media/adapter.js.map +1 -0
- package/dist/requests/media/encode.d.ts +12 -7
- package/dist/requests/media/encode.d.ts.map +1 -1
- package/dist/requests/media/encode.js +131 -109
- package/dist/requests/media/encode.js.map +1 -0
- package/dist/requests/media/resolve-adapter.js +28 -28
- package/dist/requests/media/resolve-adapter.js.map +1 -0
- package/dist/requests/string-utils.js +28 -35
- package/dist/requests/string-utils.js.map +1 -0
- package/dist/requests/to-python-object.js +16 -28
- package/dist/requests/to-python-object.js.map +1 -0
- package/dist/requests/types.d.ts +25 -21
- package/dist/requests/types.d.ts.map +1 -1
- package/dist/scalar/client.js +57 -20
- package/dist/scalar/client.js.map +1 -0
- package/dist/scalar/index.d.ts +8 -2
- package/dist/scalar/index.d.ts.map +1 -1
- package/dist/scalar/index.js +29 -19
- package/dist/scalar/index.js.map +1 -0
- package/dist/server/create.d.ts +29 -25
- package/dist/server/create.d.ts.map +1 -1
- package/dist/server/create.js +42 -39
- package/dist/server/create.js.map +1 -0
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.js +4 -2
- package/dist/server/proxy.d.ts +28 -28
- package/dist/server/proxy.d.ts.map +1 -1
- package/dist/server/proxy.js +58 -75
- package/dist/server/proxy.js.map +1 -0
- package/dist/server/source-api.d.ts +32 -29
- package/dist/server/source-api.d.ts.map +1 -1
- package/dist/server/source-api.js +82 -75
- package/dist/server/source-api.js.map +1 -0
- package/dist/types.d.ts +41 -36
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/api-page.d.ts +140 -136
- package/dist/ui/api-page.d.ts.map +1 -1
- package/dist/ui/api-page.js +134 -118
- package/dist/ui/api-page.js.map +1 -0
- package/dist/ui/client/index.d.ts +30 -26
- package/dist/ui/client/index.d.ts.map +1 -1
- package/dist/ui/client/index.js +8 -2
- package/dist/ui/client/index.js.map +1 -0
- package/dist/ui/client/storage-key.js +16 -10
- package/dist/ui/client/storage-key.js.map +1 -0
- package/dist/ui/components/accordion.js +40 -14
- package/dist/ui/components/accordion.js.map +1 -0
- package/dist/ui/components/dialog.js +51 -15
- package/dist/ui/components/dialog.js.map +1 -0
- package/dist/ui/components/input.js +18 -8
- package/dist/ui/components/input.js.map +1 -0
- package/dist/ui/components/method-label.js +38 -33
- package/dist/ui/components/method-label.js.map +1 -0
- package/dist/ui/components/select.js +66 -15
- package/dist/ui/components/select.js.map +1 -0
- package/dist/ui/contexts/api.js +96 -85
- package/dist/ui/contexts/api.js.map +1 -0
- package/dist/ui/contexts/api.lazy.js +9 -2
- package/dist/ui/contexts/api.lazy.js.map +1 -0
- package/dist/ui/index.d.ts +2 -2
- package/dist/ui/index.js +3 -1
- package/dist/ui/operation/client.js +65 -27
- package/dist/ui/operation/client.js.map +1 -0
- package/dist/ui/operation/index.js +403 -186
- package/dist/ui/operation/index.js.map +1 -0
- package/dist/ui/operation/request-tabs.d.ts +15 -16
- package/dist/ui/operation/request-tabs.d.ts.map +1 -1
- package/dist/ui/operation/request-tabs.js +151 -131
- package/dist/ui/operation/request-tabs.js.map +1 -0
- package/dist/ui/operation/response-tabs.d.ts +27 -28
- package/dist/ui/operation/response-tabs.d.ts.map +1 -1
- package/dist/ui/operation/response-tabs.js +73 -56
- package/dist/ui/operation/response-tabs.js.map +1 -0
- package/dist/ui/operation/usage-tabs/client.js +117 -88
- package/dist/ui/operation/usage-tabs/client.js.map +1 -0
- package/dist/ui/operation/usage-tabs/index.d.ts +22 -21
- package/dist/ui/operation/usage-tabs/index.d.ts.map +1 -1
- package/dist/ui/operation/usage-tabs/index.js +63 -48
- package/dist/ui/operation/usage-tabs/index.js.map +1 -0
- package/dist/ui/operation/usage-tabs/lazy.js +11 -4
- package/dist/ui/operation/usage-tabs/lazy.js.map +1 -0
- package/dist/ui/schema/client.d.ts +11 -7
- package/dist/ui/schema/client.d.ts.map +1 -1
- package/dist/ui/schema/client.js +213 -127
- package/dist/ui/schema/client.js.map +1 -0
- package/dist/ui/schema/index.d.ts +51 -50
- package/dist/ui/schema/index.d.ts.map +1 -1
- package/dist/ui/schema/index.js +225 -248
- package/dist/ui/schema/index.js.map +1 -0
- package/dist/ui/schema/lazy.js +9 -2
- package/dist/ui/schema/lazy.js.map +1 -0
- package/dist/utils/cn.js +3 -1
- package/dist/utils/deep-equal.js +18 -26
- package/dist/utils/deep-equal.js.map +1 -0
- package/dist/utils/get-typescript-schema.js +21 -19
- package/dist/utils/get-typescript-schema.js.map +1 -0
- package/dist/utils/id-to-title.js +13 -16
- package/dist/utils/id-to-title.js.map +1 -0
- package/dist/utils/lazy.js +13 -11
- package/dist/utils/lazy.js.map +1 -0
- package/dist/utils/merge-schema.js +130 -174
- package/dist/utils/merge-schema.js.map +1 -0
- package/dist/utils/pages/builder.d.ts +80 -76
- package/dist/utils/pages/builder.d.ts.map +1 -1
- package/dist/utils/pages/builder.js +101 -118
- package/dist/utils/pages/builder.js.map +1 -0
- package/dist/utils/pages/preset-auto.d.ts +58 -55
- package/dist/utils/pages/preset-auto.d.ts.map +1 -1
- package/dist/utils/pages/preset-auto.js +124 -137
- package/dist/utils/pages/preset-auto.js.map +1 -0
- package/dist/utils/pages/to-body.js +21 -18
- package/dist/utils/pages/to-body.js.map +1 -0
- package/dist/utils/pages/to-static-data.js +48 -40
- package/dist/utils/pages/to-static-data.js.map +1 -0
- package/dist/utils/pages/to-text.d.ts +43 -41
- package/dist/utils/pages/to-text.d.ts.map +1 -1
- package/dist/utils/pages/to-text.js +93 -126
- package/dist/utils/pages/to-text.js.map +1 -0
- package/dist/utils/process-document.d.ts +18 -19
- package/dist/utils/process-document.d.ts.map +1 -1
- package/dist/utils/process-document.js +43 -54
- package/dist/utils/process-document.js.map +1 -0
- package/dist/utils/remove-undefined.js +18 -18
- package/dist/utils/remove-undefined.js.map +1 -0
- package/dist/utils/schema-to-string.js +46 -64
- package/dist/utils/schema-to-string.js.map +1 -0
- package/dist/utils/schema.d.ts +11 -27
- package/dist/utils/schema.d.ts.map +1 -1
- package/dist/utils/schema.js +43 -44
- package/dist/utils/schema.js.map +1 -0
- package/dist/utils/url.js +35 -56
- package/dist/utils/url.js.map +1 -0
- package/dist/utils/use-query.js +39 -33
- package/dist/utils/use-query.js.map +1 -0
- package/package.json +34 -33
- package/dist/index.d.ts.map +0 -1
- package/dist/playground/components/inputs.d.ts +0 -25
- package/dist/playground/components/inputs.d.ts.map +0 -1
- package/dist/playground/components/oauth-dialog.d.ts +0 -13
- package/dist/playground/components/oauth-dialog.d.ts.map +0 -1
- package/dist/playground/components/server-select.d.ts +0 -3
- package/dist/playground/components/server-select.d.ts.map +0 -1
- package/dist/playground/get-default-values.d.ts +0 -3
- package/dist/playground/get-default-values.d.ts.map +0 -1
- package/dist/playground/lazy.d.ts +0 -2
- package/dist/playground/lazy.d.ts.map +0 -1
- package/dist/playground/status-info.d.ts +0 -8
- package/dist/playground/status-info.d.ts.map +0 -1
- package/dist/requests/generators/csharp.d.ts +0 -3
- package/dist/requests/generators/csharp.d.ts.map +0 -1
- package/dist/requests/generators/curl.d.ts +0 -3
- package/dist/requests/generators/curl.d.ts.map +0 -1
- package/dist/requests/generators/go.d.ts +0 -3
- package/dist/requests/generators/go.d.ts.map +0 -1
- package/dist/requests/generators/index.d.ts +0 -3
- package/dist/requests/generators/index.d.ts.map +0 -1
- package/dist/requests/generators/java.d.ts +0 -3
- package/dist/requests/generators/java.d.ts.map +0 -1
- package/dist/requests/generators/javascript.d.ts +0 -3
- package/dist/requests/generators/javascript.d.ts.map +0 -1
- package/dist/requests/generators/python.d.ts +0 -3
- package/dist/requests/generators/python.d.ts.map +0 -1
- package/dist/requests/media/resolve-adapter.d.ts +0 -19
- package/dist/requests/media/resolve-adapter.d.ts.map +0 -1
- package/dist/requests/string-utils.d.ts +0 -7
- package/dist/requests/string-utils.d.ts.map +0 -1
- package/dist/requests/to-python-object.d.ts +0 -2
- package/dist/requests/to-python-object.d.ts.map +0 -1
- package/dist/requests/types.js +0 -1
- package/dist/scalar/client.d.ts +0 -7
- package/dist/scalar/client.d.ts.map +0 -1
- package/dist/server/index.d.ts.map +0 -1
- package/dist/types.js +0 -1
- package/dist/ui/client/storage-key.d.ts +0 -9
- package/dist/ui/client/storage-key.d.ts.map +0 -1
- package/dist/ui/components/accordion.d.ts +0 -8
- package/dist/ui/components/accordion.d.ts.map +0 -1
- package/dist/ui/components/dialog.d.ts +0 -20
- package/dist/ui/components/dialog.d.ts.map +0 -1
- package/dist/ui/components/input.d.ts +0 -6
- package/dist/ui/components/input.d.ts.map +0 -1
- package/dist/ui/components/method-label.d.ts +0 -10
- package/dist/ui/components/method-label.d.ts.map +0 -1
- package/dist/ui/components/select.d.ts +0 -14
- package/dist/ui/components/select.d.ts.map +0 -1
- package/dist/ui/contexts/api.d.ts +0 -33
- package/dist/ui/contexts/api.d.ts.map +0 -1
- package/dist/ui/contexts/api.lazy.d.ts +0 -2
- package/dist/ui/contexts/api.lazy.d.ts.map +0 -1
- package/dist/ui/icons.d.ts +0 -49
- package/dist/ui/icons.d.ts.map +0 -1
- package/dist/ui/icons.js +0 -281
- package/dist/ui/index.d.ts.map +0 -1
- package/dist/ui/operation/client.d.ts +0 -19
- package/dist/ui/operation/client.d.ts.map +0 -1
- package/dist/ui/operation/index.d.ts +0 -12
- package/dist/ui/operation/index.d.ts.map +0 -1
- package/dist/ui/operation/usage-tabs/client.d.ts +0 -23
- package/dist/ui/operation/usage-tabs/client.d.ts.map +0 -1
- package/dist/ui/operation/usage-tabs/lazy.d.ts +0 -4
- package/dist/ui/operation/usage-tabs/lazy.d.ts.map +0 -1
- package/dist/ui/schema/lazy.d.ts +0 -2
- package/dist/ui/schema/lazy.d.ts.map +0 -1
- package/dist/utils/cn.d.ts +0 -2
- package/dist/utils/cn.d.ts.map +0 -1
- package/dist/utils/deep-equal.d.ts +0 -2
- package/dist/utils/deep-equal.d.ts.map +0 -1
- package/dist/utils/get-typescript-schema.d.ts +0 -4
- package/dist/utils/get-typescript-schema.d.ts.map +0 -1
- package/dist/utils/id-to-title.d.ts +0 -2
- package/dist/utils/id-to-title.d.ts.map +0 -1
- package/dist/utils/lazy.d.ts +0 -5
- package/dist/utils/lazy.d.ts.map +0 -1
- package/dist/utils/merge-schema.d.ts +0 -7
- package/dist/utils/merge-schema.d.ts.map +0 -1
- package/dist/utils/pages/to-body.d.ts +0 -4
- package/dist/utils/pages/to-body.d.ts.map +0 -1
- package/dist/utils/pages/to-static-data.d.ts +0 -10
- package/dist/utils/pages/to-static-data.d.ts.map +0 -1
- package/dist/utils/remove-undefined.d.ts +0 -2
- package/dist/utils/remove-undefined.d.ts.map +0 -1
- package/dist/utils/schema-to-string.d.ts +0 -8
- package/dist/utils/schema-to-string.d.ts.map +0 -1
- package/dist/utils/url.d.ts +0 -11
- package/dist/utils/url.d.ts.map +0 -1
- package/dist/utils/use-query.d.ts +0 -8
- package/dist/utils/use-query.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-tabs.js","names":["tabs: ResponseTab[]","tab: ResponseTab","sample","slot: ReactNode"],"sources":["../../../src/ui/operation/response-tabs.tsx"],"sourcesContent":["import type { MethodInformation, RenderContext, ResponseObject } from '@/types';\nimport { getPreferredType, type NoReference } from '@/utils/schema';\nimport {\n AccordionContent,\n AccordionHeader,\n AccordionItem,\n Accordions,\n AccordionTrigger,\n} from '@/ui/components/accordion';\nimport { Tab, Tabs } from 'fumadocs-ui/components/tabs';\nimport { sample } from 'openapi-sampler';\nimport type { ReactNode } from 'react';\n\nexport interface ResponseTab {\n /**\n * HTTP response code\n */\n code: string;\n\n response: NoReference<ResponseObject>;\n /**\n * media type of response\n */\n mediaType: string | null;\n\n examples?: ResponseExample[];\n}\n\ninterface ResponseExample {\n /**\n * generated/defined example data\n */\n sample: unknown;\n\n label: string;\n\n /**\n * description (in Markdown)\n */\n description?: string;\n}\n\nexport function ResponseTabs({\n operation,\n ctx,\n}: {\n operation: NoReference<MethodInformation>;\n ctx: RenderContext;\n}) {\n if (!operation.responses) return null;\n const tabs: ResponseTab[] = [];\n\n for (const [code, response] of Object.entries(operation.responses)) {\n const media = response.content ? getPreferredType(response.content) : null;\n const responseOfType = media ? response.content?.[media] : null;\n\n const tab: ResponseTab = {\n code,\n response,\n mediaType: media as string | null,\n };\n\n if (responseOfType?.examples) {\n tab.examples ??= [];\n\n for (const [key, sample] of Object.entries(responseOfType.examples)) {\n const title = sample?.summary || `Example ${key}`;\n\n tab.examples.push({\n label: title,\n sample: sample.value,\n description: sample?.description,\n });\n }\n } else if (responseOfType?.example || responseOfType?.schema) {\n tab.examples ??= [];\n tab.examples.push({\n label: 'Example',\n sample: responseOfType.example ?? sample(responseOfType.schema as object),\n });\n }\n\n tabs.push(tab);\n }\n const { renderResponseTabs = renderResponseTabsDefault } = ctx.content ?? {};\n\n return renderResponseTabs(tabs, ctx);\n}\n\nfunction renderResponseTabsDefault(\n tabs: ResponseTab[],\n ctx: RenderContext,\n): ReactNode | Promise<ReactNode> {\n function renderExampleContent(example: ResponseExample) {\n return (\n <>\n {example.description && ctx.renderMarkdown(example.description)}\n {ctx.renderCodeBlock('json', JSON.stringify(example.sample, null, 2))}\n </>\n );\n }\n\n async function renderResponse(tab: ResponseTab) {\n const { examples = [] } = tab;\n\n let slot: ReactNode = 'Empty';\n if (examples.length > 1) {\n slot = (\n <Accordions type=\"single\" className=\"pt-2\" defaultValue={examples[0].label}>\n {examples.map((example, i) => (\n <AccordionItem key={i} value={example.label}>\n <AccordionHeader>\n <AccordionTrigger>{example.label}</AccordionTrigger>\n </AccordionHeader>\n <AccordionContent className=\"prose-no-margin\">\n {renderExampleContent(example)}\n </AccordionContent>\n </AccordionItem>\n ))}\n </Accordions>\n );\n } else if (examples.length === 1) {\n slot = renderExampleContent(examples[0]);\n }\n\n return <Tab value={tab.code}>{slot}</Tab>;\n }\n\n if (tabs.length === 0) return null;\n\n return (\n <Tabs groupId=\"fumadocs_openapi_responses\" items={tabs.map((tab) => tab.code)}>\n {tabs.map(renderResponse)}\n </Tabs>\n );\n}\n"],"mappings":";;;;;;;AA0CA,SAAgB,aAAa,EAC3B,WACA,OAIC;AACD,KAAI,CAAC,UAAU,UAAW,QAAO;CACjC,MAAMA,OAAsB,EAAE;AAE9B,MAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,UAAU,UAAU,EAAE;EAClE,MAAM,QAAQ,SAAS,UAAU,iBAAiB,SAAS,QAAQ,GAAG;EACtE,MAAM,iBAAiB,QAAQ,SAAS,UAAU,SAAS;EAE3D,MAAMC,MAAmB;GACvB;GACA;GACA,WAAW;GACZ;AAED,MAAI,gBAAgB,UAAU;AAC5B,OAAI,aAAa,EAAE;AAEnB,QAAK,MAAM,CAAC,KAAKC,aAAW,OAAO,QAAQ,eAAe,SAAS,EAAE;IACnE,MAAM,QAAQA,UAAQ,WAAW,WAAW;AAE5C,QAAI,SAAS,KAAK;KAChB,OAAO;KACP,QAAQA,SAAO;KACf,aAAaA,UAAQ;KACtB,CAAC;;aAEK,gBAAgB,WAAW,gBAAgB,QAAQ;AAC5D,OAAI,aAAa,EAAE;AACnB,OAAI,SAAS,KAAK;IAChB,OAAO;IACP,QAAQ,eAAe,WAAW,OAAO,eAAe,OAAiB;IAC1E,CAAC;;AAGJ,OAAK,KAAK,IAAI;;CAEhB,MAAM,EAAE,qBAAqB,8BAA8B,IAAI,WAAW,EAAE;AAE5E,QAAO,mBAAmB,MAAM,IAAI;;AAGtC,SAAS,0BACP,MACA,KACgC;CAChC,SAAS,qBAAqB,SAA0B;AACtD,SACE,4CACG,QAAQ,eAAe,IAAI,eAAe,QAAQ,YAAY,EAC9D,IAAI,gBAAgB,QAAQ,KAAK,UAAU,QAAQ,QAAQ,MAAM,EAAE,CAAC,IACpE;;CAIP,eAAe,eAAe,KAAkB;EAC9C,MAAM,EAAE,WAAW,EAAE,KAAK;EAE1B,IAAIC,OAAkB;AACtB,MAAI,SAAS,SAAS,EACpB,QACE,oBAAC;GAAW,MAAK;GAAS,WAAU;GAAO,cAAc,SAAS,GAAG;aAClE,SAAS,KAAK,SAAS,MACtB,qBAAC;IAAsB,OAAO,QAAQ;eACpC,oBAAC,6BACC,oBAAC,8BAAkB,QAAQ,QAAyB,GACpC,EAClB,oBAAC;KAAiB,WAAU;eACzB,qBAAqB,QAAQ;MACb;MAND,EAOJ,CAChB;IACS;WAEN,SAAS,WAAW,EAC7B,QAAO,qBAAqB,SAAS,GAAG;AAG1C,SAAO,oBAAC;GAAI,OAAO,IAAI;aAAO;IAAW;;AAG3C,KAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,QACE,oBAAC;EAAK,SAAQ;EAA6B,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK;YAC1E,KAAK,IAAI,eAAe;GACpB"}
|
|
@@ -1,94 +1,123 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { Select,
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
2
|
+
|
|
3
|
+
import { joinURL, resolveRequestData, resolveServerUrl, withBase } from "../../../utils/url.js";
|
|
4
|
+
import { useApiContext, useServerSelectContext } from "../../contexts/api.js";
|
|
5
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../../components/select.js";
|
|
6
|
+
import { createContext, use, useEffect, useMemo, useRef, useState } from "react";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import { DynamicCodeBlock } from "fumadocs-ui/components/dynamic-codeblock";
|
|
9
|
+
|
|
10
|
+
//#region src/ui/operation/usage-tabs/client.tsx
|
|
8
11
|
const Context = createContext(null);
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
listeners.current.push(listener);
|
|
47
|
-
},
|
|
48
|
-
}), [example, route, examples]), children: children }));
|
|
12
|
+
function UsageTabsProvider({ route, examples, defaultExampleId, children }) {
|
|
13
|
+
const [example, setExample] = useState(() => defaultExampleId ?? examples.at(0)?.id);
|
|
14
|
+
const listeners = useRef([]);
|
|
15
|
+
return /* @__PURE__ */ jsx(Context, {
|
|
16
|
+
value: useMemo(() => ({
|
|
17
|
+
example,
|
|
18
|
+
route,
|
|
19
|
+
setExample: (newKey) => {
|
|
20
|
+
const example$1 = examples.find((example$2) => example$2.id === newKey);
|
|
21
|
+
if (!example$1) return;
|
|
22
|
+
setExample(newKey);
|
|
23
|
+
for (const listener of listeners.current) listener(example$1.data, example$1.encoded);
|
|
24
|
+
},
|
|
25
|
+
examples,
|
|
26
|
+
setExampleData(data, encoded) {
|
|
27
|
+
for (const item of examples) if (item.id === example) {
|
|
28
|
+
item.data = data;
|
|
29
|
+
item.encoded = encoded;
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
for (const listener of listeners.current) listener(data, encoded);
|
|
33
|
+
},
|
|
34
|
+
removeListener(listener) {
|
|
35
|
+
listeners.current = listeners.current.filter((item) => item !== listener);
|
|
36
|
+
},
|
|
37
|
+
addListener(listener) {
|
|
38
|
+
const active = examples.find((item) => item.id === example);
|
|
39
|
+
listener(active.data, active.encoded);
|
|
40
|
+
listeners.current.push(listener);
|
|
41
|
+
}
|
|
42
|
+
}), [
|
|
43
|
+
example,
|
|
44
|
+
route,
|
|
45
|
+
examples
|
|
46
|
+
]),
|
|
47
|
+
children
|
|
48
|
+
});
|
|
49
49
|
}
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
function useExampleRequests() {
|
|
51
|
+
return use(Context);
|
|
52
52
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
53
|
+
function UsageTabsSelector() {
|
|
54
|
+
const { example: key, setExample: setKey, examples } = useExampleRequests();
|
|
55
|
+
const { APIExampleSelector: Override } = useApiContext().client.operation ?? {};
|
|
56
|
+
if (Override) return /* @__PURE__ */ jsx(Override, {
|
|
57
|
+
items: examples,
|
|
58
|
+
value: key,
|
|
59
|
+
onValueChange: setKey
|
|
60
|
+
});
|
|
61
|
+
function renderItem(item) {
|
|
62
|
+
return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("span", {
|
|
63
|
+
className: "font-medium text-sm",
|
|
64
|
+
children: item.name
|
|
65
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
66
|
+
className: "text-fd-muted-foreground",
|
|
67
|
+
children: item.description
|
|
68
|
+
})] });
|
|
69
|
+
}
|
|
70
|
+
if (examples.length === 1) return null;
|
|
71
|
+
const selected = examples.find((item) => item.id === key);
|
|
72
|
+
return /* @__PURE__ */ jsxs(Select, {
|
|
73
|
+
value: key,
|
|
74
|
+
onValueChange: setKey,
|
|
75
|
+
children: [/* @__PURE__ */ jsx(SelectTrigger, {
|
|
76
|
+
className: "not-prose mb-2",
|
|
77
|
+
children: selected && /* @__PURE__ */ jsx(SelectValue, {
|
|
78
|
+
asChild: true,
|
|
79
|
+
children: renderItem(selected)
|
|
80
|
+
})
|
|
81
|
+
}), /* @__PURE__ */ jsx(SelectContent, { children: examples.map((item) => /* @__PURE__ */ jsx(SelectItem, {
|
|
82
|
+
value: item.id,
|
|
83
|
+
children: renderItem(item)
|
|
84
|
+
}, item.id)) })]
|
|
85
|
+
});
|
|
66
86
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
87
|
+
function UsageTab(sample) {
|
|
88
|
+
const { shikiOptions, mediaAdapters } = useApiContext();
|
|
89
|
+
const { examples, example: selectedExampleId, route, addListener, removeListener } = useExampleRequests();
|
|
90
|
+
const { server } = useServerSelectContext();
|
|
91
|
+
const [data, setData] = useState(() => examples.find((example) => example.id === selectedExampleId)?.encoded);
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
const listener = (_, encoded) => setData(encoded);
|
|
94
|
+
addListener(listener);
|
|
95
|
+
return () => {
|
|
96
|
+
removeListener(listener);
|
|
97
|
+
};
|
|
98
|
+
}, [addListener, removeListener]);
|
|
99
|
+
const code = useMemo(() => {
|
|
100
|
+
if (!sample.source || !data) return;
|
|
101
|
+
if (typeof sample.source === "string") return sample.source;
|
|
102
|
+
return sample.source(joinURL(withBase(server ? resolveServerUrl(server.url, server.variables) : "/", typeof window !== "undefined" ? window.location.origin : "https://loading"), resolveRequestData(route, data)), data, {
|
|
103
|
+
server: sample.serverContext,
|
|
104
|
+
mediaAdapters
|
|
105
|
+
});
|
|
106
|
+
}, [
|
|
107
|
+
mediaAdapters,
|
|
108
|
+
sample,
|
|
109
|
+
server,
|
|
110
|
+
route,
|
|
111
|
+
data
|
|
112
|
+
]);
|
|
113
|
+
if (!code || !sample) return null;
|
|
114
|
+
return /* @__PURE__ */ jsx(DynamicCodeBlock, {
|
|
115
|
+
lang: sample.lang,
|
|
116
|
+
code,
|
|
117
|
+
options: shikiOptions
|
|
118
|
+
});
|
|
94
119
|
}
|
|
120
|
+
|
|
121
|
+
//#endregion
|
|
122
|
+
export { UsageTab, UsageTabsProvider, UsageTabsSelector, useExampleRequests };
|
|
123
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","names":["example","listener: ExampleUpdateListener"],"sources":["../../../../src/ui/operation/usage-tabs/client.tsx"],"sourcesContent":["'use client';\nimport { useApiContext, useServerSelectContext } from '@/ui/contexts/api';\nimport { joinURL, withBase, resolveServerUrl, resolveRequestData } from '@/utils/url';\nimport {\n Select,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n} from '@/ui/components/select';\nimport { DynamicCodeBlock } from 'fumadocs-ui/components/dynamic-codeblock';\nimport { useState, useEffect, useMemo, createContext, ReactNode, useRef, use } from 'react';\nimport type { CodeUsageGenerator } from '.';\nimport type { ExampleRequestItem } from '../request-tabs';\nimport type { RawRequestData, RequestData } from '@/requests/types';\n\nexport type ExampleUpdateListener = (data: RawRequestData, encoded: RequestData) => void;\n\nconst Context = createContext<{\n route: string;\n examples: ExampleRequestItem[];\n example: string | undefined;\n setExample: (id: string) => void;\n setExampleData: (data: RawRequestData, encoded: RequestData) => void;\n\n addListener: (listener: ExampleUpdateListener) => void;\n removeListener: (listener: ExampleUpdateListener) => void;\n} | null>(null);\n\nexport function UsageTabsProvider({\n route,\n examples,\n defaultExampleId,\n children,\n}: {\n route: string;\n examples: ExampleRequestItem[];\n defaultExampleId?: string;\n children: ReactNode;\n}) {\n const [example, setExample] = useState(() => defaultExampleId ?? examples.at(0)?.id);\n const listeners = useRef<ExampleUpdateListener[]>([]);\n\n return (\n <Context\n value={useMemo(\n () => ({\n example,\n route,\n setExample: (newKey: string) => {\n const example = examples.find((example) => example.id === newKey);\n if (!example) return;\n\n setExample(newKey);\n for (const listener of listeners.current) {\n listener(example.data, example.encoded);\n }\n },\n examples,\n setExampleData(data, encoded) {\n for (const item of examples) {\n if (item.id === example) {\n // persistent changes\n item.data = data;\n item.encoded = encoded;\n break;\n }\n }\n\n for (const listener of listeners.current) {\n listener(data, encoded);\n }\n },\n removeListener(listener) {\n listeners.current = listeners.current.filter((item) => item !== listener);\n },\n addListener(listener) {\n // initial call to listeners to ensure their data is the latest\n // this is necessary to avoid race conditions between `useEffect()`\n const active = examples.find((item) => item.id === example)!;\n\n listener(active.data, active.encoded);\n listeners.current.push(listener);\n },\n }),\n [example, route, examples],\n )}\n >\n {children}\n </Context>\n );\n}\n\nexport function useExampleRequests() {\n return use(Context)!;\n}\n\nexport function UsageTabsSelector() {\n const { example: key, setExample: setKey, examples } = useExampleRequests();\n const { APIExampleSelector: Override } = useApiContext().client.operation ?? {};\n\n if (Override) {\n return <Override items={examples} value={key} onValueChange={setKey} />;\n }\n\n function renderItem(item: ExampleRequestItem) {\n return (\n <div>\n <span className=\"font-medium text-sm\">{item.name}</span>\n <span className=\"text-fd-muted-foreground\">{item.description}</span>\n </div>\n );\n }\n\n if (examples.length === 1) return null;\n const selected = examples.find((item) => item.id === key);\n return (\n <Select value={key} onValueChange={setKey}>\n <SelectTrigger className=\"not-prose mb-2\">\n {selected && <SelectValue asChild>{renderItem(selected)}</SelectValue>}\n </SelectTrigger>\n <SelectContent>\n {examples.map((item) => (\n <SelectItem key={item.id} value={item.id}>\n {renderItem(item)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n\nexport function UsageTab(sample: CodeUsageGenerator) {\n const { shikiOptions, mediaAdapters } = useApiContext();\n const {\n examples,\n example: selectedExampleId,\n route,\n addListener,\n removeListener,\n } = useExampleRequests();\n const { server } = useServerSelectContext();\n const [data, setData] = useState(\n () => examples.find((example) => example.id === selectedExampleId)?.encoded,\n );\n\n useEffect(() => {\n const listener: ExampleUpdateListener = (_, encoded) => setData(encoded);\n\n addListener(listener);\n return () => {\n removeListener(listener);\n };\n }, [addListener, removeListener]);\n\n const code = useMemo(() => {\n if (!sample.source || !data) return;\n if (typeof sample.source === 'string') return sample.source;\n\n return sample.source(\n joinURL(\n withBase(\n server ? resolveServerUrl(server.url, server.variables) : '/',\n typeof window !== 'undefined' ? window.location.origin : 'https://loading',\n ),\n resolveRequestData(route, data),\n ),\n data,\n {\n server: sample.serverContext,\n mediaAdapters,\n },\n );\n }, [mediaAdapters, sample, server, route, data]);\n\n if (!code || !sample) return null;\n\n return <DynamicCodeBlock lang={sample.lang} code={code} options={shikiOptions} />;\n}\n"],"mappings":"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"}
|
|
@@ -1,26 +1,27 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import { SampleGenerator } from "../../../requests/types.js";
|
|
2
|
+
import "../../../types.js";
|
|
3
|
+
import "react";
|
|
4
|
+
|
|
5
|
+
//#region src/ui/operation/usage-tabs/index.d.ts
|
|
3
6
|
/**
|
|
4
7
|
* Generate code example for given programming language
|
|
5
8
|
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
9
|
+
interface CodeUsageGenerator<T = unknown> {
|
|
10
|
+
id: string;
|
|
11
|
+
lang: string;
|
|
12
|
+
label?: string;
|
|
13
|
+
/**
|
|
14
|
+
* either:
|
|
15
|
+
* - code
|
|
16
|
+
* - a function imported from a file with "use client" directive
|
|
17
|
+
* - false (disabled)
|
|
18
|
+
*/
|
|
19
|
+
source?: string | SampleGenerator<T> | false;
|
|
20
|
+
/**
|
|
21
|
+
* Pass extra context to client-side source generator
|
|
22
|
+
*/
|
|
23
|
+
serverContext?: T;
|
|
21
24
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
ctx: RenderContext;
|
|
25
|
-
}): Promise<import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<import("react").ReactNode> | (string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<import("react").ReactNode> | null | undefined)>;
|
|
25
|
+
//#endregion
|
|
26
|
+
export { CodeUsageGenerator };
|
|
26
27
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../../src/ui/operation/usage-tabs/index.tsx"],"sourcesContent":[],"mappings":";;;;;;;;AAeiB,UAAA,kBAAkB,CAAA,IAAA,OAAA,CAAA,CAAA;EAUC,EAAA,EAAA,MAAA;EAAhB,IAAA,EAAA,MAAA;EAKF,KAAA,CAAA,EAAA,MAAA;EAAC;;;;;;oBALC,gBAAgB;;;;kBAKlB"}
|
|
@@ -1,52 +1,67 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
1
|
+
import { defaultSamples } from "../../../requests/generators/index.js";
|
|
2
|
+
import { UsageTabLazy, UsageTabsSelectorLazy } from "./lazy.js";
|
|
3
|
+
import { ResponseTabs } from "../response-tabs.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { CodeBlockTab, CodeBlockTabs, CodeBlockTabsList, CodeBlockTabsTrigger } from "fumadocs-ui/components/codeblock";
|
|
6
|
+
|
|
7
|
+
//#region src/ui/operation/usage-tabs/index.tsx
|
|
8
|
+
async function UsageTabs({ method, ctx }) {
|
|
9
|
+
let { renderAPIExampleUsageTabs, renderAPIExampleLayout } = ctx.content ?? {};
|
|
10
|
+
renderAPIExampleLayout ??= (slots) => {
|
|
11
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
12
|
+
className: "prose-no-margin",
|
|
13
|
+
children: [
|
|
14
|
+
slots.selector,
|
|
15
|
+
slots.usageTabs,
|
|
16
|
+
slots.responseTabs
|
|
17
|
+
]
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
renderAPIExampleUsageTabs ??= (generators$1) => {
|
|
21
|
+
if (generators$1.length === 0) return null;
|
|
22
|
+
return /* @__PURE__ */ jsxs(CodeBlockTabs, {
|
|
23
|
+
groupId: "fumadocs_openapi_requests",
|
|
24
|
+
defaultValue: generators$1[0].id,
|
|
25
|
+
children: [/* @__PURE__ */ jsx(CodeBlockTabsList, { children: generators$1.map((item) => /* @__PURE__ */ jsx(CodeBlockTabsTrigger, {
|
|
26
|
+
value: item.id,
|
|
27
|
+
children: item.label ?? item.lang
|
|
28
|
+
}, item.id)) }), generators$1.map((item) => /* @__PURE__ */ jsx(CodeBlockTab, {
|
|
29
|
+
value: item.id,
|
|
30
|
+
children: /* @__PURE__ */ jsx(UsageTabLazy, { ...item })
|
|
31
|
+
}, item.id))]
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
let generators = [...defaultSamples];
|
|
35
|
+
if (ctx.generateCodeSamples) generators.push(...await ctx.generateCodeSamples(method));
|
|
36
|
+
if (method["x-codeSamples"]) for (const sample of method["x-codeSamples"]) generators.push("id" in sample && typeof sample.id === "string" ? sample : {
|
|
37
|
+
id: sample.lang,
|
|
38
|
+
...sample
|
|
39
|
+
});
|
|
40
|
+
generators = dedupe(generators);
|
|
41
|
+
return renderAPIExampleLayout({
|
|
42
|
+
selector: method["x-exclusiveCodeSample"] ? null : /* @__PURE__ */ jsx(UsageTabsSelectorLazy, {}),
|
|
43
|
+
usageTabs: await renderAPIExampleUsageTabs(generators, ctx),
|
|
44
|
+
responseTabs: /* @__PURE__ */ jsx(ResponseTabs, {
|
|
45
|
+
operation: method,
|
|
46
|
+
ctx
|
|
47
|
+
})
|
|
48
|
+
}, ctx);
|
|
36
49
|
}
|
|
37
50
|
/**
|
|
38
|
-
|
|
39
|
-
|
|
51
|
+
* Remove duplicated ids
|
|
52
|
+
*/
|
|
40
53
|
function dedupe(samples) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
return out;
|
|
54
|
+
const set = /* @__PURE__ */ new Set();
|
|
55
|
+
const out = [];
|
|
56
|
+
for (let i = samples.length - 1; i >= 0; i--) {
|
|
57
|
+
const item = samples[i];
|
|
58
|
+
if (set.has(item.id)) continue;
|
|
59
|
+
set.add(item.id);
|
|
60
|
+
if (item.source !== false) out.unshift(item);
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
52
63
|
}
|
|
64
|
+
|
|
65
|
+
//#endregion
|
|
66
|
+
export { UsageTabs };
|
|
67
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["generators","generators: CodeUsageGenerator[]","out: CodeUsageGenerator[]"],"sources":["../../../../src/ui/operation/usage-tabs/index.tsx"],"sourcesContent":["import type { MethodInformation, RenderContext } from '@/types';\nimport type { SampleGenerator } from '@/requests/types';\nimport { defaultSamples } from '@/requests/generators';\nimport {\n CodeBlockTab,\n CodeBlockTabs,\n CodeBlockTabsList,\n CodeBlockTabsTrigger,\n} from 'fumadocs-ui/components/codeblock';\nimport { UsageTabsSelectorLazy, UsageTabLazy } from './lazy';\nimport { ResponseTabs } from '../response-tabs';\n\n/**\n * Generate code example for given programming language\n */\nexport interface CodeUsageGenerator<T = unknown> {\n id: string;\n lang: string;\n label?: string;\n /**\n * either:\n * - code\n * - a function imported from a file with \"use client\" directive\n * - false (disabled)\n */\n source?: string | SampleGenerator<T> | false;\n\n /**\n * Pass extra context to client-side source generator\n */\n serverContext?: T;\n}\n\nexport async function UsageTabs({\n method,\n ctx,\n}: {\n method: MethodInformation;\n ctx: RenderContext;\n}) {\n let { renderAPIExampleUsageTabs, renderAPIExampleLayout } = ctx.content ?? {};\n\n renderAPIExampleLayout ??= (slots) => {\n return (\n <div className=\"prose-no-margin\">\n {slots.selector}\n {slots.usageTabs}\n {slots.responseTabs}\n </div>\n );\n };\n\n renderAPIExampleUsageTabs ??= (generators) => {\n if (generators.length === 0) return null;\n\n return (\n <CodeBlockTabs groupId=\"fumadocs_openapi_requests\" defaultValue={generators[0].id}>\n <CodeBlockTabsList>\n {generators.map((item) => (\n <CodeBlockTabsTrigger key={item.id} value={item.id}>\n {item.label ?? item.lang}\n </CodeBlockTabsTrigger>\n ))}\n </CodeBlockTabsList>\n {generators.map((item) => (\n <CodeBlockTab key={item.id} value={item.id}>\n <UsageTabLazy {...item} />\n </CodeBlockTab>\n ))}\n </CodeBlockTabs>\n );\n };\n\n let generators: CodeUsageGenerator[] = [...defaultSamples];\n if (ctx.generateCodeSamples) {\n generators.push(...(await ctx.generateCodeSamples(method)));\n }\n\n if (method['x-codeSamples']) {\n for (const sample of method['x-codeSamples']) {\n generators.push(\n 'id' in sample && typeof sample.id === 'string'\n ? (sample as CodeUsageGenerator)\n : {\n id: sample.lang,\n ...sample,\n },\n );\n }\n }\n\n generators = dedupe(generators);\n\n return renderAPIExampleLayout(\n {\n selector: method['x-exclusiveCodeSample'] ? null : <UsageTabsSelectorLazy />,\n usageTabs: await renderAPIExampleUsageTabs(generators, ctx),\n responseTabs: <ResponseTabs operation={method} ctx={ctx} />,\n },\n ctx,\n );\n}\n\n/**\n * Remove duplicated ids\n */\nfunction dedupe(samples: CodeUsageGenerator[]): CodeUsageGenerator[] {\n const set = new Set<string>();\n const out: CodeUsageGenerator[] = [];\n\n for (let i = samples.length - 1; i >= 0; i--) {\n const item = samples[i];\n if (set.has(item.id)) continue;\n set.add(item.id);\n if (item.source !== false) out.unshift(item);\n }\n\n return out;\n}\n"],"mappings":";;;;;;;AAiCA,eAAsB,UAAU,EAC9B,QACA,OAIC;CACD,IAAI,EAAE,2BAA2B,2BAA2B,IAAI,WAAW,EAAE;AAE7E,6BAA4B,UAAU;AACpC,SACE,qBAAC;GAAI,WAAU;;IACZ,MAAM;IACN,MAAM;IACN,MAAM;;IACH;;AAIV,gCAA+B,iBAAe;AAC5C,MAAIA,aAAW,WAAW,EAAG,QAAO;AAEpC,SACE,qBAAC;GAAc,SAAQ;GAA4B,cAAcA,aAAW,GAAG;cAC7E,oBAAC,+BACEA,aAAW,KAAK,SACf,oBAAC;IAAmC,OAAO,KAAK;cAC7C,KAAK,SAAS,KAAK;MADK,KAAK,GAET,CACvB,GACgB,EACnBA,aAAW,KAAK,SACf,oBAAC;IAA2B,OAAO,KAAK;cACtC,oBAAC,gBAAa,GAAI,OAAQ;MADT,KAAK,GAET,CACf;IACY;;CAIpB,IAAIC,aAAmC,CAAC,GAAG,eAAe;AAC1D,KAAI,IAAI,oBACN,YAAW,KAAK,GAAI,MAAM,IAAI,oBAAoB,OAAO,CAAE;AAG7D,KAAI,OAAO,iBACT,MAAK,MAAM,UAAU,OAAO,iBAC1B,YAAW,KACT,QAAQ,UAAU,OAAO,OAAO,OAAO,WAClC,SACD;EACE,IAAI,OAAO;EACX,GAAG;EACJ,CACN;AAIL,cAAa,OAAO,WAAW;AAE/B,QAAO,uBACL;EACE,UAAU,OAAO,2BAA2B,OAAO,oBAAC,0BAAwB;EAC5E,WAAW,MAAM,0BAA0B,YAAY,IAAI;EAC3D,cAAc,oBAAC;GAAa,WAAW;GAAa;IAAO;EAC5D,EACD,IACD;;;;;AAMH,SAAS,OAAO,SAAqD;CACnE,MAAM,sBAAM,IAAI,KAAa;CAC7B,MAAMC,MAA4B,EAAE;AAEpC,MAAK,IAAI,IAAI,QAAQ,SAAS,GAAG,KAAK,GAAG,KAAK;EAC5C,MAAM,OAAO,QAAQ;AACrB,MAAI,IAAI,IAAI,KAAK,GAAG,CAAE;AACtB,MAAI,IAAI,KAAK,GAAG;AAChB,MAAI,KAAK,WAAW,MAAO,KAAI,QAAQ,KAAK;;AAG9C,QAAO"}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
|
|
3
|
+
import { wrapLazy } from "../../../utils/lazy.js";
|
|
4
|
+
|
|
5
|
+
//#region src/ui/operation/usage-tabs/lazy.tsx
|
|
6
|
+
const UsageTabsSelectorLazy = wrapLazy(() => import("./client.js").then((mod) => ({ default: mod.UsageTabsSelector })));
|
|
7
|
+
const UsageTabLazy = wrapLazy(() => import("./client.js").then((mod) => ({ default: mod.UsageTab })));
|
|
8
|
+
const UsageTabsProviderLazy = wrapLazy(() => import("./client.js").then((mod) => ({ default: mod.UsageTabsProvider })));
|
|
9
|
+
|
|
10
|
+
//#endregion
|
|
11
|
+
export { UsageTabLazy, UsageTabsProviderLazy, UsageTabsSelectorLazy };
|
|
12
|
+
//# sourceMappingURL=lazy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy.js","names":[],"sources":["../../../../src/ui/operation/usage-tabs/lazy.tsx"],"sourcesContent":["'use client';\nimport { wrapLazy } from '../../../utils/lazy';\n\nexport const UsageTabsSelectorLazy = wrapLazy(() =>\n import('./client').then((mod) => ({ default: mod.UsageTabsSelector })),\n);\n\nexport const UsageTabLazy = wrapLazy(() =>\n import('./client').then((mod) => ({ default: mod.UsageTab })),\n);\n\nexport const UsageTabsProviderLazy = wrapLazy(() =>\n import('./client').then((mod) => ({ default: mod.UsageTabsProvider })),\n);\n"],"mappings":";;;;;AAGA,MAAa,wBAAwB,eACnC,OAAO,eAAY,MAAM,SAAS,EAAE,SAAS,IAAI,mBAAmB,EAAE,CACvE;AAED,MAAa,eAAe,eAC1B,OAAO,eAAY,MAAM,SAAS,EAAE,SAAS,IAAI,UAAU,EAAE,CAC9D;AAED,MAAa,wBAAwB,eACnC,OAAO,eAAY,MAAM,SAAS,EAAE,SAAS,IAAI,mBAAmB,EAAE,CACvE"}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { SchemaUIGeneratedData } from "./index.js";
|
|
2
|
+
import "react/jsx-runtime";
|
|
3
|
+
|
|
4
|
+
//#region src/ui/schema/client.d.ts
|
|
5
|
+
interface SchemaUIProps {
|
|
6
|
+
name: string;
|
|
7
|
+
required?: boolean;
|
|
8
|
+
as?: 'property' | 'body';
|
|
9
|
+
generated: SchemaUIGeneratedData;
|
|
7
10
|
}
|
|
8
|
-
|
|
11
|
+
//#endregion
|
|
12
|
+
export { SchemaUIProps };
|
|
9
13
|
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","
|
|
1
|
+
{"version":3,"file":"client.d.ts","names":[],"sources":["../../../src/ui/schema/client.tsx"],"sourcesContent":[],"mappings":";;;;UA+DiB,aAAA;;;EAAA,EAAA,CAAA,EAAA,UAAA,GAAa,MAAA;aAKjB"}
|