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.
Files changed (278) hide show
  1. package/dist/generate-file.d.ts +53 -49
  2. package/dist/generate-file.d.ts.map +1 -1
  3. package/dist/generate-file.js +88 -102
  4. package/dist/generate-file.js.map +1 -0
  5. package/dist/index.d.ts +6 -6
  6. package/dist/index.js +3 -1
  7. package/dist/playground/client.d.ts +88 -72
  8. package/dist/playground/client.d.ts.map +1 -1
  9. package/dist/playground/client.js +446 -296
  10. package/dist/playground/client.js.map +1 -0
  11. package/dist/playground/components/inputs.js +395 -172
  12. package/dist/playground/components/inputs.js.map +1 -0
  13. package/dist/playground/components/oauth-dialog.js +270 -174
  14. package/dist/playground/components/oauth-dialog.js.map +1 -0
  15. package/dist/playground/components/server-select.js +115 -55
  16. package/dist/playground/components/server-select.js.map +1 -0
  17. package/dist/playground/fetcher.d.ts +10 -18
  18. package/dist/playground/fetcher.d.ts.map +1 -1
  19. package/dist/playground/fetcher.js +67 -75
  20. package/dist/playground/fetcher.js.map +1 -0
  21. package/dist/playground/get-default-values.js +23 -26
  22. package/dist/playground/get-default-values.js.map +1 -0
  23. package/dist/playground/index.d.ts +23 -13
  24. package/dist/playground/index.d.ts.map +1 -1
  25. package/dist/playground/index.js +87 -91
  26. package/dist/playground/index.js.map +1 -0
  27. package/dist/playground/lazy.js +9 -2
  28. package/dist/playground/lazy.js.map +1 -0
  29. package/dist/playground/schema.d.ts +18 -55
  30. package/dist/playground/schema.d.ts.map +1 -1
  31. package/dist/playground/schema.js +117 -106
  32. package/dist/playground/schema.js.map +1 -0
  33. package/dist/playground/status-info.js +49 -37
  34. package/dist/playground/status-info.js.map +1 -0
  35. package/dist/requests/generators/csharp.js +40 -50
  36. package/dist/requests/generators/csharp.js.map +1 -0
  37. package/dist/requests/generators/curl.js +28 -27
  38. package/dist/requests/generators/curl.js.map +1 -0
  39. package/dist/requests/generators/go.js +39 -35
  40. package/dist/requests/generators/go.js.map +1 -0
  41. package/dist/requests/generators/index.js +49 -43
  42. package/dist/requests/generators/index.js.map +1 -0
  43. package/dist/requests/generators/java.js +56 -67
  44. package/dist/requests/generators/java.js.map +1 -0
  45. package/dist/requests/generators/javascript.js +38 -45
  46. package/dist/requests/generators/javascript.js.map +1 -0
  47. package/dist/requests/generators/python.js +33 -37
  48. package/dist/requests/generators/python.js.map +1 -0
  49. package/dist/requests/media/adapter.d.ts +38 -84
  50. package/dist/requests/media/adapter.d.ts.map +1 -1
  51. package/dist/requests/media/adapter.js +122 -169
  52. package/dist/requests/media/adapter.js.map +1 -0
  53. package/dist/requests/media/encode.d.ts +12 -7
  54. package/dist/requests/media/encode.d.ts.map +1 -1
  55. package/dist/requests/media/encode.js +131 -109
  56. package/dist/requests/media/encode.js.map +1 -0
  57. package/dist/requests/media/resolve-adapter.js +28 -28
  58. package/dist/requests/media/resolve-adapter.js.map +1 -0
  59. package/dist/requests/string-utils.js +28 -35
  60. package/dist/requests/string-utils.js.map +1 -0
  61. package/dist/requests/to-python-object.js +16 -28
  62. package/dist/requests/to-python-object.js.map +1 -0
  63. package/dist/requests/types.d.ts +25 -21
  64. package/dist/requests/types.d.ts.map +1 -1
  65. package/dist/scalar/client.js +57 -20
  66. package/dist/scalar/client.js.map +1 -0
  67. package/dist/scalar/index.d.ts +8 -2
  68. package/dist/scalar/index.d.ts.map +1 -1
  69. package/dist/scalar/index.js +29 -19
  70. package/dist/scalar/index.js.map +1 -0
  71. package/dist/server/create.d.ts +29 -25
  72. package/dist/server/create.d.ts.map +1 -1
  73. package/dist/server/create.js +42 -39
  74. package/dist/server/create.js.map +1 -0
  75. package/dist/server/index.d.ts +3 -3
  76. package/dist/server/index.js +4 -2
  77. package/dist/server/proxy.d.ts +28 -28
  78. package/dist/server/proxy.d.ts.map +1 -1
  79. package/dist/server/proxy.js +58 -75
  80. package/dist/server/proxy.js.map +1 -0
  81. package/dist/server/source-api.d.ts +32 -29
  82. package/dist/server/source-api.d.ts.map +1 -1
  83. package/dist/server/source-api.js +82 -75
  84. package/dist/server/source-api.js.map +1 -0
  85. package/dist/types.d.ts +41 -36
  86. package/dist/types.d.ts.map +1 -1
  87. package/dist/ui/api-page.d.ts +140 -136
  88. package/dist/ui/api-page.d.ts.map +1 -1
  89. package/dist/ui/api-page.js +134 -118
  90. package/dist/ui/api-page.js.map +1 -0
  91. package/dist/ui/client/index.d.ts +30 -26
  92. package/dist/ui/client/index.d.ts.map +1 -1
  93. package/dist/ui/client/index.js +8 -2
  94. package/dist/ui/client/index.js.map +1 -0
  95. package/dist/ui/client/storage-key.js +16 -10
  96. package/dist/ui/client/storage-key.js.map +1 -0
  97. package/dist/ui/components/accordion.js +40 -14
  98. package/dist/ui/components/accordion.js.map +1 -0
  99. package/dist/ui/components/dialog.js +51 -15
  100. package/dist/ui/components/dialog.js.map +1 -0
  101. package/dist/ui/components/input.js +18 -8
  102. package/dist/ui/components/input.js.map +1 -0
  103. package/dist/ui/components/method-label.js +38 -33
  104. package/dist/ui/components/method-label.js.map +1 -0
  105. package/dist/ui/components/select.js +66 -15
  106. package/dist/ui/components/select.js.map +1 -0
  107. package/dist/ui/contexts/api.js +96 -85
  108. package/dist/ui/contexts/api.js.map +1 -0
  109. package/dist/ui/contexts/api.lazy.js +9 -2
  110. package/dist/ui/contexts/api.lazy.js.map +1 -0
  111. package/dist/ui/index.d.ts +2 -2
  112. package/dist/ui/index.js +3 -1
  113. package/dist/ui/operation/client.js +65 -27
  114. package/dist/ui/operation/client.js.map +1 -0
  115. package/dist/ui/operation/index.js +403 -186
  116. package/dist/ui/operation/index.js.map +1 -0
  117. package/dist/ui/operation/request-tabs.d.ts +15 -16
  118. package/dist/ui/operation/request-tabs.d.ts.map +1 -1
  119. package/dist/ui/operation/request-tabs.js +151 -131
  120. package/dist/ui/operation/request-tabs.js.map +1 -0
  121. package/dist/ui/operation/response-tabs.d.ts +27 -28
  122. package/dist/ui/operation/response-tabs.d.ts.map +1 -1
  123. package/dist/ui/operation/response-tabs.js +73 -56
  124. package/dist/ui/operation/response-tabs.js.map +1 -0
  125. package/dist/ui/operation/usage-tabs/client.js +117 -88
  126. package/dist/ui/operation/usage-tabs/client.js.map +1 -0
  127. package/dist/ui/operation/usage-tabs/index.d.ts +22 -21
  128. package/dist/ui/operation/usage-tabs/index.d.ts.map +1 -1
  129. package/dist/ui/operation/usage-tabs/index.js +63 -48
  130. package/dist/ui/operation/usage-tabs/index.js.map +1 -0
  131. package/dist/ui/operation/usage-tabs/lazy.js +11 -4
  132. package/dist/ui/operation/usage-tabs/lazy.js.map +1 -0
  133. package/dist/ui/schema/client.d.ts +11 -7
  134. package/dist/ui/schema/client.d.ts.map +1 -1
  135. package/dist/ui/schema/client.js +213 -127
  136. package/dist/ui/schema/client.js.map +1 -0
  137. package/dist/ui/schema/index.d.ts +51 -50
  138. package/dist/ui/schema/index.d.ts.map +1 -1
  139. package/dist/ui/schema/index.js +225 -248
  140. package/dist/ui/schema/index.js.map +1 -0
  141. package/dist/ui/schema/lazy.js +9 -2
  142. package/dist/ui/schema/lazy.js.map +1 -0
  143. package/dist/utils/cn.js +3 -1
  144. package/dist/utils/deep-equal.js +18 -26
  145. package/dist/utils/deep-equal.js.map +1 -0
  146. package/dist/utils/get-typescript-schema.js +21 -19
  147. package/dist/utils/get-typescript-schema.js.map +1 -0
  148. package/dist/utils/id-to-title.js +13 -16
  149. package/dist/utils/id-to-title.js.map +1 -0
  150. package/dist/utils/lazy.js +13 -11
  151. package/dist/utils/lazy.js.map +1 -0
  152. package/dist/utils/merge-schema.js +130 -174
  153. package/dist/utils/merge-schema.js.map +1 -0
  154. package/dist/utils/pages/builder.d.ts +80 -76
  155. package/dist/utils/pages/builder.d.ts.map +1 -1
  156. package/dist/utils/pages/builder.js +101 -118
  157. package/dist/utils/pages/builder.js.map +1 -0
  158. package/dist/utils/pages/preset-auto.d.ts +58 -55
  159. package/dist/utils/pages/preset-auto.d.ts.map +1 -1
  160. package/dist/utils/pages/preset-auto.js +124 -137
  161. package/dist/utils/pages/preset-auto.js.map +1 -0
  162. package/dist/utils/pages/to-body.js +21 -18
  163. package/dist/utils/pages/to-body.js.map +1 -0
  164. package/dist/utils/pages/to-static-data.js +48 -40
  165. package/dist/utils/pages/to-static-data.js.map +1 -0
  166. package/dist/utils/pages/to-text.d.ts +43 -41
  167. package/dist/utils/pages/to-text.d.ts.map +1 -1
  168. package/dist/utils/pages/to-text.js +93 -126
  169. package/dist/utils/pages/to-text.js.map +1 -0
  170. package/dist/utils/process-document.d.ts +18 -19
  171. package/dist/utils/process-document.d.ts.map +1 -1
  172. package/dist/utils/process-document.js +43 -54
  173. package/dist/utils/process-document.js.map +1 -0
  174. package/dist/utils/remove-undefined.js +18 -18
  175. package/dist/utils/remove-undefined.js.map +1 -0
  176. package/dist/utils/schema-to-string.js +46 -64
  177. package/dist/utils/schema-to-string.js.map +1 -0
  178. package/dist/utils/schema.d.ts +11 -27
  179. package/dist/utils/schema.d.ts.map +1 -1
  180. package/dist/utils/schema.js +43 -44
  181. package/dist/utils/schema.js.map +1 -0
  182. package/dist/utils/url.js +35 -56
  183. package/dist/utils/url.js.map +1 -0
  184. package/dist/utils/use-query.js +39 -33
  185. package/dist/utils/use-query.js.map +1 -0
  186. package/package.json +34 -33
  187. package/dist/index.d.ts.map +0 -1
  188. package/dist/playground/components/inputs.d.ts +0 -25
  189. package/dist/playground/components/inputs.d.ts.map +0 -1
  190. package/dist/playground/components/oauth-dialog.d.ts +0 -13
  191. package/dist/playground/components/oauth-dialog.d.ts.map +0 -1
  192. package/dist/playground/components/server-select.d.ts +0 -3
  193. package/dist/playground/components/server-select.d.ts.map +0 -1
  194. package/dist/playground/get-default-values.d.ts +0 -3
  195. package/dist/playground/get-default-values.d.ts.map +0 -1
  196. package/dist/playground/lazy.d.ts +0 -2
  197. package/dist/playground/lazy.d.ts.map +0 -1
  198. package/dist/playground/status-info.d.ts +0 -8
  199. package/dist/playground/status-info.d.ts.map +0 -1
  200. package/dist/requests/generators/csharp.d.ts +0 -3
  201. package/dist/requests/generators/csharp.d.ts.map +0 -1
  202. package/dist/requests/generators/curl.d.ts +0 -3
  203. package/dist/requests/generators/curl.d.ts.map +0 -1
  204. package/dist/requests/generators/go.d.ts +0 -3
  205. package/dist/requests/generators/go.d.ts.map +0 -1
  206. package/dist/requests/generators/index.d.ts +0 -3
  207. package/dist/requests/generators/index.d.ts.map +0 -1
  208. package/dist/requests/generators/java.d.ts +0 -3
  209. package/dist/requests/generators/java.d.ts.map +0 -1
  210. package/dist/requests/generators/javascript.d.ts +0 -3
  211. package/dist/requests/generators/javascript.d.ts.map +0 -1
  212. package/dist/requests/generators/python.d.ts +0 -3
  213. package/dist/requests/generators/python.d.ts.map +0 -1
  214. package/dist/requests/media/resolve-adapter.d.ts +0 -19
  215. package/dist/requests/media/resolve-adapter.d.ts.map +0 -1
  216. package/dist/requests/string-utils.d.ts +0 -7
  217. package/dist/requests/string-utils.d.ts.map +0 -1
  218. package/dist/requests/to-python-object.d.ts +0 -2
  219. package/dist/requests/to-python-object.d.ts.map +0 -1
  220. package/dist/requests/types.js +0 -1
  221. package/dist/scalar/client.d.ts +0 -7
  222. package/dist/scalar/client.d.ts.map +0 -1
  223. package/dist/server/index.d.ts.map +0 -1
  224. package/dist/types.js +0 -1
  225. package/dist/ui/client/storage-key.d.ts +0 -9
  226. package/dist/ui/client/storage-key.d.ts.map +0 -1
  227. package/dist/ui/components/accordion.d.ts +0 -8
  228. package/dist/ui/components/accordion.d.ts.map +0 -1
  229. package/dist/ui/components/dialog.d.ts +0 -20
  230. package/dist/ui/components/dialog.d.ts.map +0 -1
  231. package/dist/ui/components/input.d.ts +0 -6
  232. package/dist/ui/components/input.d.ts.map +0 -1
  233. package/dist/ui/components/method-label.d.ts +0 -10
  234. package/dist/ui/components/method-label.d.ts.map +0 -1
  235. package/dist/ui/components/select.d.ts +0 -14
  236. package/dist/ui/components/select.d.ts.map +0 -1
  237. package/dist/ui/contexts/api.d.ts +0 -33
  238. package/dist/ui/contexts/api.d.ts.map +0 -1
  239. package/dist/ui/contexts/api.lazy.d.ts +0 -2
  240. package/dist/ui/contexts/api.lazy.d.ts.map +0 -1
  241. package/dist/ui/icons.d.ts +0 -49
  242. package/dist/ui/icons.d.ts.map +0 -1
  243. package/dist/ui/icons.js +0 -281
  244. package/dist/ui/index.d.ts.map +0 -1
  245. package/dist/ui/operation/client.d.ts +0 -19
  246. package/dist/ui/operation/client.d.ts.map +0 -1
  247. package/dist/ui/operation/index.d.ts +0 -12
  248. package/dist/ui/operation/index.d.ts.map +0 -1
  249. package/dist/ui/operation/usage-tabs/client.d.ts +0 -23
  250. package/dist/ui/operation/usage-tabs/client.d.ts.map +0 -1
  251. package/dist/ui/operation/usage-tabs/lazy.d.ts +0 -4
  252. package/dist/ui/operation/usage-tabs/lazy.d.ts.map +0 -1
  253. package/dist/ui/schema/lazy.d.ts +0 -2
  254. package/dist/ui/schema/lazy.d.ts.map +0 -1
  255. package/dist/utils/cn.d.ts +0 -2
  256. package/dist/utils/cn.d.ts.map +0 -1
  257. package/dist/utils/deep-equal.d.ts +0 -2
  258. package/dist/utils/deep-equal.d.ts.map +0 -1
  259. package/dist/utils/get-typescript-schema.d.ts +0 -4
  260. package/dist/utils/get-typescript-schema.d.ts.map +0 -1
  261. package/dist/utils/id-to-title.d.ts +0 -2
  262. package/dist/utils/id-to-title.d.ts.map +0 -1
  263. package/dist/utils/lazy.d.ts +0 -5
  264. package/dist/utils/lazy.d.ts.map +0 -1
  265. package/dist/utils/merge-schema.d.ts +0 -7
  266. package/dist/utils/merge-schema.d.ts.map +0 -1
  267. package/dist/utils/pages/to-body.d.ts +0 -4
  268. package/dist/utils/pages/to-body.d.ts.map +0 -1
  269. package/dist/utils/pages/to-static-data.d.ts +0 -10
  270. package/dist/utils/pages/to-static-data.d.ts.map +0 -1
  271. package/dist/utils/remove-undefined.d.ts +0 -2
  272. package/dist/utils/remove-undefined.d.ts.map +0 -1
  273. package/dist/utils/schema-to-string.d.ts +0 -8
  274. package/dist/utils/schema-to-string.d.ts.map +0 -1
  275. package/dist/utils/url.d.ts +0 -11
  276. package/dist/utils/url.d.ts.map +0 -1
  277. package/dist/utils/use-query.d.ts +0 -8
  278. 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
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useApiContext, useServerSelectContext } from '../../../ui/contexts/api.js';
4
- import { joinURL, withBase, resolveServerUrl, resolveRequestData, } from '../../../utils/url.js';
5
- import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem, } from '../../../ui/components/select.js';
6
- import { DynamicCodeBlock } from 'fumadocs-ui/components/dynamic-codeblock';
7
- import { useState, useEffect, useMemo, createContext, useRef, use, } from 'react';
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
- export function UsageTabsProvider({ route, examples, defaultExampleId, children, }) {
10
- const [example, setExample] = useState(() => defaultExampleId ?? examples.at(0)?.id);
11
- const listeners = useRef([]);
12
- return (_jsx(Context, { value: useMemo(() => ({
13
- example,
14
- route,
15
- setExample: (newKey) => {
16
- const example = examples.find((example) => example.id === newKey);
17
- if (!example)
18
- return;
19
- setExample(newKey);
20
- for (const listener of listeners.current) {
21
- listener(example.data, example.encoded);
22
- }
23
- },
24
- examples,
25
- setExampleData(data, encoded) {
26
- for (const item of examples) {
27
- if (item.id === example) {
28
- // persistent changes
29
- item.data = data;
30
- item.encoded = encoded;
31
- break;
32
- }
33
- }
34
- for (const listener of listeners.current) {
35
- listener(data, encoded);
36
- }
37
- },
38
- removeListener(listener) {
39
- listeners.current = listeners.current.filter((item) => item !== listener);
40
- },
41
- addListener(listener) {
42
- // initial call to listeners to ensure their data is the latest
43
- // this is necessary to avoid race conditions between `useEffect()`
44
- const active = examples.find((item) => item.id === example);
45
- listener(active.data, active.encoded);
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
- export function useExampleRequests() {
51
- return use(Context);
50
+ function useExampleRequests() {
51
+ return use(Context);
52
52
  }
53
- export function UsageTabsSelector() {
54
- const { example: key, setExample: setKey, examples } = useExampleRequests();
55
- const { APIExampleSelector: Override } = useApiContext().client.operation ?? {};
56
- if (Override) {
57
- return _jsx(Override, { items: examples, value: key, onValueChange: setKey });
58
- }
59
- function renderItem(item) {
60
- return (_jsxs("div", { children: [_jsx("span", { className: "font-medium text-sm", children: item.name }), _jsx("span", { className: "text-fd-muted-foreground", children: item.description })] }));
61
- }
62
- if (examples.length === 1)
63
- return null;
64
- const selected = examples.find((item) => item.id === key);
65
- return (_jsxs(Select, { value: key, onValueChange: setKey, children: [_jsx(SelectTrigger, { className: "not-prose mb-2", children: selected && _jsx(SelectValue, { asChild: true, children: renderItem(selected) }) }), _jsx(SelectContent, { children: examples.map((item) => (_jsx(SelectItem, { value: item.id, children: renderItem(item) }, item.id))) })] }));
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
- export function UsageTab(sample) {
68
- const { shikiOptions, mediaAdapters } = useApiContext();
69
- const { examples, example: selectedExampleId, route, addListener, removeListener, } = useExampleRequests();
70
- const { server } = useServerSelectContext();
71
- const [data, setData] = useState(() => examples.find((example) => example.id === selectedExampleId)?.encoded);
72
- useEffect(() => {
73
- const listener = (_, encoded) => setData(encoded);
74
- addListener(listener);
75
- return () => {
76
- removeListener(listener);
77
- };
78
- }, [addListener, removeListener]);
79
- const code = useMemo(() => {
80
- if (!sample.source || !data)
81
- return;
82
- if (typeof sample.source === 'string')
83
- return sample.source;
84
- return sample.source(joinURL(withBase(server ? resolveServerUrl(server.url, server.variables) : '/', typeof window !== 'undefined'
85
- ? window.location.origin
86
- : 'https://loading'), resolveRequestData(route, data)), data, {
87
- server: sample.serverContext,
88
- mediaAdapters,
89
- });
90
- }, [mediaAdapters, sample, server, route, data]);
91
- if (!code || !sample)
92
- return null;
93
- return (_jsx(DynamicCodeBlock, { lang: sample.lang, code: code, options: shikiOptions }));
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 type { MethodInformation, RenderContext } from '../../../types.js';
2
- import type { SampleGenerator } from '../../../requests/types.js';
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
- export interface CodeUsageGenerator<T = unknown> {
7
- id: string;
8
- lang: string;
9
- label?: string;
10
- /**
11
- * either:
12
- * - code
13
- * - a function imported from a file with "use client" directive
14
- * - false (disabled)
15
- */
16
- source?: string | SampleGenerator<T> | false;
17
- /**
18
- * Pass extra context to client-side source generator
19
- */
20
- serverContext?: T;
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
- export declare function UsageTabs({ method, ctx, }: {
23
- method: MethodInformation;
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","sourceRoot":"","sources":["../../../../src/ui/operation/usage-tabs/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAWxD;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,OAAO;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IAE7C;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,CAAC;CACnB;AAED,wBAAsB,SAAS,CAAC,EAC9B,MAAM,EACN,GAAG,GACJ,EAAE;IACD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,GAAG,EAAE,aAAa,CAAC;CACpB,wWAmEA"}
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 { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
- import { defaultSamples } from '../../../requests/generators/index.js';
3
- import { CodeBlockTab, CodeBlockTabs, CodeBlockTabsList, CodeBlockTabsTrigger, } from 'fumadocs-ui/components/codeblock';
4
- import { UsageTabsSelectorLazy, UsageTabLazy } from './lazy.js';
5
- import { ResponseTabs } from '../response-tabs.js';
6
- export async function UsageTabs({ method, ctx, }) {
7
- let { renderAPIExampleUsageTabs, renderAPIExampleLayout } = ctx.content ?? {};
8
- renderAPIExampleLayout ?? (renderAPIExampleLayout = (slots) => {
9
- return (_jsxs("div", { className: "prose-no-margin", children: [slots.selector, slots.usageTabs, slots.responseTabs] }));
10
- });
11
- renderAPIExampleUsageTabs ?? (renderAPIExampleUsageTabs = (generators) => {
12
- if (generators.length === 0)
13
- return null;
14
- return (_jsxs(CodeBlockTabs, { groupId: "fumadocs_openapi_requests", defaultValue: generators[0].id, children: [_jsx(CodeBlockTabsList, { children: generators.map((item) => (_jsx(CodeBlockTabsTrigger, { value: item.id, children: item.label ?? item.lang }, item.id))) }), generators.map((item) => (_jsx(CodeBlockTab, { value: item.id, children: _jsx(UsageTabLazy, { ...item }) }, item.id)))] }));
15
- });
16
- let generators = [...defaultSamples];
17
- if (ctx.generateCodeSamples) {
18
- generators.push(...(await ctx.generateCodeSamples(method)));
19
- }
20
- if (method['x-codeSamples']) {
21
- for (const sample of method['x-codeSamples']) {
22
- generators.push('id' in sample && typeof sample.id === 'string'
23
- ? sample
24
- : {
25
- id: sample.lang,
26
- ...sample,
27
- });
28
- }
29
- }
30
- generators = dedupe(generators);
31
- return renderAPIExampleLayout({
32
- selector: method['x-exclusiveCodeSample'] ? null : (_jsx(UsageTabsSelectorLazy, {})),
33
- usageTabs: await renderAPIExampleUsageTabs(generators, ctx),
34
- responseTabs: _jsx(ResponseTabs, { operation: method, ctx: ctx }),
35
- }, ctx);
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
- * Remove duplicated ids
39
- */
51
+ * Remove duplicated ids
52
+ */
40
53
  function dedupe(samples) {
41
- const set = new Set();
42
- const out = [];
43
- for (let i = samples.length - 1; i >= 0; i--) {
44
- const item = samples[i];
45
- if (set.has(item.id))
46
- continue;
47
- set.add(item.id);
48
- if (item.source !== false)
49
- out.unshift(item);
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
- import { wrapLazy } from '../../../utils/lazy.js';
3
- export const UsageTabsSelectorLazy = wrapLazy(() => import('./client.js').then((mod) => ({ default: mod.UsageTabsSelector })));
4
- export const UsageTabLazy = wrapLazy(() => import('./client.js').then((mod) => ({ default: mod.UsageTab })));
5
- export const UsageTabsProviderLazy = wrapLazy(() => import('./client.js').then((mod) => ({ default: mod.UsageTabsProvider })));
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 type { SchemaUIGeneratedData } from '../../ui/schema/index.js';
2
- export interface SchemaUIProps {
3
- name: string;
4
- required?: boolean;
5
- as?: 'property' | 'body';
6
- generated: SchemaUIGeneratedData;
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
- export declare function SchemaUI({ name, required, as, generated, }: SchemaUIProps): import("react/jsx-runtime").JSX.Element;
11
+ //#endregion
12
+ export { SchemaUIProps };
9
13
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/ui/schema/client.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAc,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAyDrE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,EAAE,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IAEzB,SAAS,EAAE,qBAAqB,CAAC;CAClC;AAED,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,QAAgB,EAChB,EAAe,EACf,SAAS,GACV,EAAE,aAAa,2CAoBf"}
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"}