fumadocs-openapi 10.3.14 → 10.3.15

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 (214) hide show
  1. package/css/generated/shared.css +3 -4
  2. package/dist/_openapi/types.d.ts +2 -1
  3. package/dist/_openapi/types.d.ts.map +1 -0
  4. package/dist/generate-file.d.ts +2 -1
  5. package/dist/generate-file.d.ts.map +1 -0
  6. package/dist/generate-file.js +2 -1
  7. package/dist/generate-file.js.map +1 -0
  8. package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/dereference.js +2 -1
  9. package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/dereference.js.map +1 -0
  10. package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/index.js +2 -1
  11. package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/index.js.map +1 -0
  12. package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/klona.js +2 -1
  13. package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/klona.js.map +1 -0
  14. package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/resolveRef.js +2 -1
  15. package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/resolveRef.js.map +1 -0
  16. package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/types.js +2 -1
  17. package/dist/node_modules/.pnpm/dereference-json-schema@0.2.1/node_modules/dereference-json-schema/types.js.map +1 -0
  18. package/dist/playground/client.d.ts +2 -1
  19. package/dist/playground/client.d.ts.map +1 -0
  20. package/dist/playground/client.js +4 -3
  21. package/dist/playground/client.js.map +1 -0
  22. package/dist/playground/components/inputs.js +25 -27
  23. package/dist/playground/components/inputs.js.map +1 -0
  24. package/dist/playground/components/oauth-dialog.js +2 -1
  25. package/dist/playground/components/oauth-dialog.js.map +1 -0
  26. package/dist/playground/components/server-select.js +2 -1
  27. package/dist/playground/components/server-select.js.map +1 -0
  28. package/dist/playground/fetcher.d.ts +2 -1
  29. package/dist/playground/fetcher.d.ts.map +1 -0
  30. package/dist/playground/fetcher.js +2 -1
  31. package/dist/playground/fetcher.js.map +1 -0
  32. package/dist/playground/index.d.ts +2 -1
  33. package/dist/playground/index.d.ts.map +1 -0
  34. package/dist/playground/index.js +2 -1
  35. package/dist/playground/index.js.map +1 -0
  36. package/dist/playground/lazy.js +2 -1
  37. package/dist/playground/lazy.js.map +1 -0
  38. package/dist/playground/schema.d.ts +2 -1
  39. package/dist/playground/schema.d.ts.map +1 -0
  40. package/dist/playground/schema.js +18 -11
  41. package/dist/playground/schema.js.map +1 -0
  42. package/dist/playground/status-info.js +2 -1
  43. package/dist/playground/status-info.js.map +1 -0
  44. package/dist/requests/generators/all.d.ts +2 -1
  45. package/dist/requests/generators/all.d.ts.map +1 -0
  46. package/dist/requests/generators/all.js +2 -1
  47. package/dist/requests/generators/all.js.map +1 -0
  48. package/dist/requests/generators/csharp.d.ts +2 -1
  49. package/dist/requests/generators/csharp.d.ts.map +1 -0
  50. package/dist/requests/generators/csharp.js +2 -1
  51. package/dist/requests/generators/csharp.js.map +1 -0
  52. package/dist/requests/generators/curl.d.ts +2 -1
  53. package/dist/requests/generators/curl.d.ts.map +1 -0
  54. package/dist/requests/generators/curl.js +2 -1
  55. package/dist/requests/generators/curl.js.map +1 -0
  56. package/dist/requests/generators/go.d.ts +2 -1
  57. package/dist/requests/generators/go.d.ts.map +1 -0
  58. package/dist/requests/generators/go.js +2 -1
  59. package/dist/requests/generators/go.js.map +1 -0
  60. package/dist/requests/generators/index.d.ts +2 -1
  61. package/dist/requests/generators/index.d.ts.map +1 -0
  62. package/dist/requests/generators/index.js +2 -1
  63. package/dist/requests/generators/index.js.map +1 -0
  64. package/dist/requests/generators/java.d.ts +2 -1
  65. package/dist/requests/generators/java.d.ts.map +1 -0
  66. package/dist/requests/generators/java.js +2 -1
  67. package/dist/requests/generators/java.js.map +1 -0
  68. package/dist/requests/generators/javascript.d.ts +2 -1
  69. package/dist/requests/generators/javascript.d.ts.map +1 -0
  70. package/dist/requests/generators/javascript.js +2 -1
  71. package/dist/requests/generators/javascript.js.map +1 -0
  72. package/dist/requests/generators/python.d.ts +2 -1
  73. package/dist/requests/generators/python.d.ts.map +1 -0
  74. package/dist/requests/generators/python.js +2 -1
  75. package/dist/requests/generators/python.js.map +1 -0
  76. package/dist/requests/media/adapter.d.ts +2 -1
  77. package/dist/requests/media/adapter.d.ts.map +1 -0
  78. package/dist/requests/media/adapter.js +2 -1
  79. package/dist/requests/media/adapter.js.map +1 -0
  80. package/dist/requests/media/encode.d.ts +2 -1
  81. package/dist/requests/media/encode.d.ts.map +1 -0
  82. package/dist/requests/media/encode.js +4 -2
  83. package/dist/requests/media/encode.js.map +1 -0
  84. package/dist/requests/media/resolve-adapter.js +2 -1
  85. package/dist/requests/media/resolve-adapter.js.map +1 -0
  86. package/dist/requests/string-utils.js +2 -1
  87. package/dist/requests/string-utils.js.map +1 -0
  88. package/dist/requests/to-python-object.js +2 -1
  89. package/dist/requests/to-python-object.js.map +1 -0
  90. package/dist/requests/types.d.ts +2 -1
  91. package/dist/requests/types.d.ts.map +1 -0
  92. package/dist/scalar/client.js +2 -1
  93. package/dist/scalar/client.js.map +1 -0
  94. package/dist/scalar/index.d.ts +2 -1
  95. package/dist/scalar/index.d.ts.map +1 -0
  96. package/dist/scalar/index.js +2 -1
  97. package/dist/scalar/index.js.map +1 -0
  98. package/dist/server/create.d.ts +2 -1
  99. package/dist/server/create.d.ts.map +1 -0
  100. package/dist/server/create.js +2 -1
  101. package/dist/server/create.js.map +1 -0
  102. package/dist/server/proxy.d.ts +2 -1
  103. package/dist/server/proxy.d.ts.map +1 -0
  104. package/dist/server/proxy.js +2 -1
  105. package/dist/server/proxy.js.map +1 -0
  106. package/dist/server/source-api.d.ts +2 -1
  107. package/dist/server/source-api.d.ts.map +1 -0
  108. package/dist/server/source-api.js +2 -1
  109. package/dist/server/source-api.js.map +1 -0
  110. package/dist/types.d.ts +2 -1
  111. package/dist/types.d.ts.map +1 -0
  112. package/dist/ui/api-page.d.ts +2 -1
  113. package/dist/ui/api-page.d.ts.map +1 -0
  114. package/dist/ui/api-page.js +2 -1
  115. package/dist/ui/api-page.js.map +1 -0
  116. package/dist/ui/base.d.ts +2 -1
  117. package/dist/ui/base.d.ts.map +1 -0
  118. package/dist/ui/base.js +2 -1
  119. package/dist/ui/base.js.map +1 -0
  120. package/dist/ui/client/index.d.ts +2 -1
  121. package/dist/ui/client/index.d.ts.map +1 -0
  122. package/dist/ui/client/index.js +2 -1
  123. package/dist/ui/client/index.js.map +1 -0
  124. package/dist/ui/client/storage-key.js +2 -1
  125. package/dist/ui/client/storage-key.js.map +1 -0
  126. package/dist/ui/components/accordion.js +2 -1
  127. package/dist/ui/components/accordion.js.map +1 -0
  128. package/dist/ui/components/dialog.js +2 -1
  129. package/dist/ui/components/dialog.js.map +1 -0
  130. package/dist/ui/components/input.js +2 -1
  131. package/dist/ui/components/input.js.map +1 -0
  132. package/dist/ui/components/method-label.js +2 -1
  133. package/dist/ui/components/method-label.js.map +1 -0
  134. package/dist/ui/components/select.js +2 -1
  135. package/dist/ui/components/select.js.map +1 -0
  136. package/dist/ui/contexts/api.js +2 -1
  137. package/dist/ui/contexts/api.js.map +1 -0
  138. package/dist/ui/contexts/api.lazy.js +2 -1
  139. package/dist/ui/contexts/api.lazy.js.map +1 -0
  140. package/dist/ui/full.client.js +2 -1
  141. package/dist/ui/full.client.js.map +1 -0
  142. package/dist/ui/full.d.ts +2 -1
  143. package/dist/ui/full.d.ts.map +1 -0
  144. package/dist/ui/full.js +2 -1
  145. package/dist/ui/full.js.map +1 -0
  146. package/dist/ui/operation/client.js +2 -1
  147. package/dist/ui/operation/client.js.map +1 -0
  148. package/dist/ui/operation/index.js +2 -1
  149. package/dist/ui/operation/index.js.map +1 -0
  150. package/dist/ui/operation/request-tabs.d.ts +2 -1
  151. package/dist/ui/operation/request-tabs.d.ts.map +1 -0
  152. package/dist/ui/operation/request-tabs.js +2 -1
  153. package/dist/ui/operation/request-tabs.js.map +1 -0
  154. package/dist/ui/operation/response-tabs.d.ts +2 -1
  155. package/dist/ui/operation/response-tabs.d.ts.map +1 -0
  156. package/dist/ui/operation/response-tabs.js +2 -1
  157. package/dist/ui/operation/response-tabs.js.map +1 -0
  158. package/dist/ui/operation/usage-tabs/client.js +2 -1
  159. package/dist/ui/operation/usage-tabs/client.js.map +1 -0
  160. package/dist/ui/operation/usage-tabs/index.js +2 -1
  161. package/dist/ui/operation/usage-tabs/index.js.map +1 -0
  162. package/dist/ui/operation/usage-tabs/lazy.js +2 -1
  163. package/dist/ui/operation/usage-tabs/lazy.js.map +1 -0
  164. package/dist/ui/schema/client.d.ts +2 -1
  165. package/dist/ui/schema/client.d.ts.map +1 -0
  166. package/dist/ui/schema/client.js +2 -1
  167. package/dist/ui/schema/client.js.map +1 -0
  168. package/dist/ui/schema/index.d.ts +2 -1
  169. package/dist/ui/schema/index.d.ts.map +1 -0
  170. package/dist/ui/schema/index.js +2 -1
  171. package/dist/ui/schema/index.js.map +1 -0
  172. package/dist/ui/schema/lazy.js +2 -1
  173. package/dist/ui/schema/lazy.js.map +1 -0
  174. package/dist/utils/deep-equal.js +2 -1
  175. package/dist/utils/deep-equal.js.map +1 -0
  176. package/dist/utils/id-to-title.js +2 -1
  177. package/dist/utils/id-to-title.js.map +1 -0
  178. package/dist/utils/lazy.js +2 -1
  179. package/dist/utils/lazy.js.map +1 -0
  180. package/dist/utils/merge-schema.js +20 -5
  181. package/dist/utils/merge-schema.js.map +1 -0
  182. package/dist/utils/pages/builder.d.ts +2 -1
  183. package/dist/utils/pages/builder.d.ts.map +1 -0
  184. package/dist/utils/pages/builder.js +2 -1
  185. package/dist/utils/pages/builder.js.map +1 -0
  186. package/dist/utils/pages/preset-auto.d.ts +2 -1
  187. package/dist/utils/pages/preset-auto.d.ts.map +1 -0
  188. package/dist/utils/pages/preset-auto.js +2 -1
  189. package/dist/utils/pages/preset-auto.js.map +1 -0
  190. package/dist/utils/pages/to-body.js +2 -1
  191. package/dist/utils/pages/to-body.js.map +1 -0
  192. package/dist/utils/pages/to-static-data.js +2 -1
  193. package/dist/utils/pages/to-static-data.js.map +1 -0
  194. package/dist/utils/pages/to-text.d.ts +2 -1
  195. package/dist/utils/pages/to-text.d.ts.map +1 -0
  196. package/dist/utils/pages/to-text.js +2 -1
  197. package/dist/utils/pages/to-text.js.map +1 -0
  198. package/dist/utils/process-document.d.ts +2 -1
  199. package/dist/utils/process-document.d.ts.map +1 -0
  200. package/dist/utils/process-document.js +2 -1
  201. package/dist/utils/process-document.js.map +1 -0
  202. package/dist/utils/remove-undefined.js +2 -1
  203. package/dist/utils/remove-undefined.js.map +1 -0
  204. package/dist/utils/schema-to-string.js +2 -1
  205. package/dist/utils/schema-to-string.js.map +1 -0
  206. package/dist/utils/schema.d.ts +2 -1
  207. package/dist/utils/schema.d.ts.map +1 -0
  208. package/dist/utils/schema.js +2 -1
  209. package/dist/utils/schema.js.map +1 -0
  210. package/dist/utils/url.js +3 -2
  211. package/dist/utils/url.js.map +1 -0
  212. package/dist/utils/use-query.js +2 -1
  213. package/dist/utils/use-query.js.map +1 -0
  214. package/package.json +5 -5
@@ -0,0 +1 @@
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;EACC,WAAW,GACT,yGACA,UAAU,GAAG,cAAc,SAAS,KACrC;;GAED,oBAAC;IAAY,WAAU;cAAW;KAAqB;GACvD,oBAAC;IAAK,WAAU;cACb;KACI;GACP,oBAAC;IACC,eAAe;KACb,OAAO;KACP,SAAS;KACV;cAED,oBAAC;KAAc;KAAc;MAAU;KAChB;;GACrB;;AAIV,SAAS,QAAQ,EAAE,MAAM,UAA4C;CACnE,MAAM,SAAS,mBAAmB;AAElC,QACE,oBAAC;EACC,MAAK;EACL,WAAW,GAAG,eAAe;GAAE,OAAO;GAAW,MAAM;GAAM,CAAC,EAAE,cAAc;EAC9E,eAAe,QAAQ,KAAK;GAAE;GAAc;GAAuB,CAAC;YACrE;GAEQ"}
@@ -9,4 +9,5 @@ import "../ui/index.js";
9
9
  */
10
10
  declare function withScalar(options?: CreateAPIPageOptions): CreateAPIPageOptions;
11
11
  //#endregion
12
- export { withScalar };
12
+ export { withScalar };
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/scalar/index.tsx"],"mappings":";;;;;;;AAuBA;;iBAAgB,UAAA,CAAW,OAAA,GAAS,oBAAA,GAA4B,oBAAA"}
@@ -28,4 +28,5 @@ function withScalar(options = {}) {
28
28
  }
29
29
 
30
30
  //#endregion
31
- export { withScalar };
31
+ export { withScalar };
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
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;EAAO,QAAQ,OAAO;EAAc;EAAM,MAAM,IAAI,OAAO;GAAW;;;;;;;AAQhF,SAAgB,WAAW,UAAgC,EAAE,EAAwB;AACnF,QAAO;EACL,GAAG;EACH,YAAY;GACV,GAAG,QAAQ;GACX,OAAO,OAAO;AACZ,WAAO,oBAAC,iBAAc,GAAI,QAAS;;GAEtC;EACF"}
@@ -35,4 +35,5 @@ declare function createOpenAPI(options?: OpenAPIOptions): OpenAPIServer;
35
35
  */
36
36
  declare function createCodeSample<T>(options: InlineCodeUsageGenerator<T>): InlineCodeUsageGenerator<T>;
37
37
  //#endregion
38
- export { OpenAPIOptions, OpenAPIServer, createCodeSample, createOpenAPI };
38
+ export { OpenAPIOptions, OpenAPIServer, createCodeSample, createOpenAPI };
39
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","names":[],"sources":["../../src/server/create.ts"],"mappings":";;;;;;;;AAGsE;KAKjE,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;EAAA,SAChC,OAAA,EAAS,cAAA;AAAA;AAAA,iBAGJ,aAAA,CAAc,OAAA,GAAS,cAAA,GAAsB,aAAA;;;AAP7D;iBAuDgB,gBAAA,GAAA,CACd,OAAA,EAAS,wBAAA,CAAyB,CAAA,IACjC,wBAAA,CAAyB,CAAA"}
@@ -38,4 +38,5 @@ function createCodeSample(options) {
38
38
  }
39
39
 
40
40
  //#endregion
41
- export { createCodeSample, createOpenAPI };
41
+ export { createCodeSample, createOpenAPI };
42
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","names":[],"sources":["../../src/server/create.ts"],"sourcesContent":["import { createProxy } from '@/server/proxy';\nimport { processDocument, type ProcessedDocument } from '@/utils/process-document';\nimport type { Document } from '@/types';\nimport type { InlineCodeUsageGenerator } from '@/requests/generators';\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 readonly options: OpenAPIOptions;\n}\n\nexport function createOpenAPI(options: OpenAPIOptions = {}): OpenAPIServer {\n const { input = [], disableCache = false } = options;\n let schemas: Promise<ProcessedSchemaMap> | undefined;\n\n async function getSchemas() {\n const out: ProcessedSchemaMap = {};\n\n if (Array.isArray(input)) {\n await Promise.all(\n input.map(async (item) => {\n out[item] = await processDocument(item);\n }),\n );\n } else {\n await Promise.all(\n Object.entries(await input()).map(async ([k, v]) => {\n out[k] = await processDocument(v);\n }),\n );\n }\n\n return out;\n }\n\n return {\n options,\n createProxy,\n async getSchema(document) {\n const schemas = await 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":";;;;AAmCA,SAAgB,cAAc,UAA0B,EAAE,EAAiB;CACzE,MAAM,EAAE,QAAQ,EAAE,EAAE,eAAe,UAAU;CAC7C,IAAI;CAEJ,eAAe,aAAa;EAC1B,MAAM,MAA0B,EAAE;AAElC,MAAI,MAAM,QAAQ,MAAM,CACtB,OAAM,QAAQ,IACZ,MAAM,IAAI,OAAO,SAAS;AACxB,OAAI,QAAQ,MAAM,gBAAgB,KAAK;IACvC,CACH;MAED,OAAM,QAAQ,IACZ,OAAO,QAAQ,MAAM,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,OAAO;AAClD,OAAI,KAAK,MAAM,gBAAgB,EAAE;IACjC,CACH;AAGH,SAAO;;AAGT,QAAO;EACL;EACA;EACA,MAAM,UAAU,UAAU;GACxB,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"}
@@ -28,4 +28,5 @@ interface CreateProxyOptions {
28
28
  }
29
29
  declare function createProxy(options?: CreateProxyOptions): Proxy;
30
30
  //#endregion
31
- export { createProxy };
31
+ export { createProxy };
32
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","names":[],"sources":["../../src/server/proxy.ts"],"mappings":";cAAM,IAAA;AAAA,KAED,KAAA,mBACW,IAAA,aAAiB,GAAA,EAAK,OAAA,KAAY,OAAA,CAAQ,QAAA;AAAA,UAGhD,kBAAA;EAN6D;AAAA;;;;EAYrE,WAAA;EATwD;;;EAcxD,cAAA;EAdC;;;;;EAqBD,aAAA,IAAiB,OAAA,EAAS,OAAA;EArBsC;;AAAA;EA0BhE,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"}
@@ -55,4 +55,5 @@ function createProxy(options = {}) {
55
55
  }
56
56
 
57
57
  //#endregion
58
- export { createProxy };
58
+ export { createProxy };
59
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","names":[],"sources":["../../src/server/proxy.ts"],"sourcesContent":["const keys = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD'] as const;\n\ntype Proxy = {\n [K in (typeof keys)[number]]: (req: Request) => Promise<Response>;\n};\n\ninterface CreateProxyOptions {\n /**\n * Filter by prefixes of request url\n *\n * @deprecated Use `allowedOrigins` for filtering origins, or `filterRequest` for more detailed rules.\n */\n allowedUrls?: string[];\n\n /**\n * List of allowed origins to proxy to.\n */\n allowedOrigins?: string[];\n\n /**\n * Determine if the proxied request is allowed.\n *\n * @returns true if allowed, otherwise forbidden.\n */\n filterRequest?: (request: Request) => boolean;\n\n /**\n * Override proxied request/response with yours\n */\n overrides?: {\n request?: (request: Request) => Request;\n response?: (response: Response) => Response;\n };\n}\n\nexport function createProxy(options: CreateProxyOptions = {}): Proxy {\n const {\n allowedOrigins,\n allowedUrls,\n filterRequest = (req) => {\n return !allowedUrls || allowedUrls.some((item) => req.url.startsWith(item));\n },\n overrides,\n } = options;\n const handlers: Partial<Proxy> = {};\n\n async function handler(req: Request): Promise<Response> {\n const searchParams = new URL(req.url).searchParams;\n const url = searchParams.get('url');\n\n if (!url)\n return Response.json('[Proxy] A `url` query parameter is required for proxy url', {\n status: 400,\n });\n\n const parsedUrl = URL.parse(url);\n if (!parsedUrl)\n return Response.json('[Proxy] Invalid `url` parameter value.', {\n status: 400,\n });\n\n if (allowedOrigins && !allowedOrigins.includes(parsedUrl.origin)) {\n return Response.json(`[Proxy] The origin \"${parsedUrl.origin}\" is not allowed.`, {\n status: 400,\n });\n }\n\n const contentLength = req.headers.get('content-length');\n const hasBody = contentLength && parseInt(contentLength) > 0;\n\n let proxied = new Request(parsedUrl, {\n method: req.method,\n cache: 'no-cache',\n headers: req.headers,\n body:\n hasBody && ['POST', 'PUT', 'PATCH', 'DELETE'].includes(req.method.toUpperCase())\n ? await req.arrayBuffer()\n : undefined,\n });\n\n if (overrides?.request) {\n proxied = overrides.request(proxied);\n }\n\n if (!filterRequest(proxied)) {\n return Response.json('[Proxy] The proxied request is not allowed', {\n status: 403,\n });\n }\n\n proxied.headers.forEach((_value, originalKey) => {\n const key = originalKey.toLowerCase();\n\n if (key === 'origin') {\n proxied.headers.delete(originalKey);\n }\n });\n\n let res = await fetch(proxied).catch((e) => new Error(e.toString()));\n if (res instanceof Error) {\n return Response.json(`[Proxy] Failed to proxy request: ${res.message}`, {\n status: 500,\n });\n }\n\n if (overrides?.response) {\n res = overrides.response(res);\n }\n\n const headers = new Headers(res.headers);\n headers.forEach((_value, originalKey) => {\n const key = originalKey.toLowerCase();\n\n if (key.startsWith('access-control-')) {\n headers.delete(originalKey);\n }\n });\n headers.set('X-Forwarded-Host', res.url);\n\n return new Response(res.body, {\n status: res.status,\n statusText: res.statusText,\n headers,\n });\n }\n\n for (const key of keys) {\n handlers[key] = handler;\n }\n\n return handlers as Proxy;\n}\n"],"mappings":";AAAA,MAAM,OAAO;CAAC;CAAO;CAAQ;CAAO;CAAU;CAAS;CAAO;AAmC9D,SAAgB,YAAY,UAA8B,EAAE,EAAS;CACnE,MAAM,EACJ,gBACA,aACA,iBAAiB,QAAQ;AACvB,SAAO,CAAC,eAAe,YAAY,MAAM,SAAS,IAAI,IAAI,WAAW,KAAK,CAAC;IAE7E,cACE;CACJ,MAAM,WAA2B,EAAE;CAEnC,eAAe,QAAQ,KAAiC;EAEtD,MAAM,MADe,IAAI,IAAI,IAAI,IAAI,CAAC,aACb,IAAI,MAAM;AAEnC,MAAI,CAAC,IACH,QAAO,SAAS,KAAK,6DAA6D,EAChF,QAAQ,KACT,CAAC;EAEJ,MAAM,YAAY,IAAI,MAAM,IAAI;AAChC,MAAI,CAAC,UACH,QAAO,SAAS,KAAK,0CAA0C,EAC7D,QAAQ,KACT,CAAC;AAEJ,MAAI,kBAAkB,CAAC,eAAe,SAAS,UAAU,OAAO,CAC9D,QAAO,SAAS,KAAK,uBAAuB,UAAU,OAAO,oBAAoB,EAC/E,QAAQ,KACT,CAAC;EAGJ,MAAM,gBAAgB,IAAI,QAAQ,IAAI,iBAAiB;EACvD,MAAM,UAAU,iBAAiB,SAAS,cAAc,GAAG;EAE3D,IAAI,UAAU,IAAI,QAAQ,WAAW;GACnC,QAAQ,IAAI;GACZ,OAAO;GACP,SAAS,IAAI;GACb,MACE,WAAW;IAAC;IAAQ;IAAO;IAAS;IAAS,CAAC,SAAS,IAAI,OAAO,aAAa,CAAC,GAC5E,MAAM,IAAI,aAAa,GACvB;GACP,CAAC;AAEF,MAAI,WAAW,QACb,WAAU,UAAU,QAAQ,QAAQ;AAGtC,MAAI,CAAC,cAAc,QAAQ,CACzB,QAAO,SAAS,KAAK,8CAA8C,EACjE,QAAQ,KACT,CAAC;AAGJ,UAAQ,QAAQ,SAAS,QAAQ,gBAAgB;AAG/C,OAFY,YAAY,aAAa,KAEzB,SACV,SAAQ,QAAQ,OAAO,YAAY;IAErC;EAEF,IAAI,MAAM,MAAM,MAAM,QAAQ,CAAC,OAAO,MAAM,IAAI,MAAM,EAAE,UAAU,CAAC,CAAC;AACpE,MAAI,eAAe,MACjB,QAAO,SAAS,KAAK,oCAAoC,IAAI,WAAW,EACtE,QAAQ,KACT,CAAC;AAGJ,MAAI,WAAW,SACb,OAAM,UAAU,SAAS,IAAI;EAG/B,MAAM,UAAU,IAAI,QAAQ,IAAI,QAAQ;AACxC,UAAQ,SAAS,QAAQ,gBAAgB;AAGvC,OAFY,YAAY,aAAa,CAE7B,WAAW,kBAAkB,CACnC,SAAQ,OAAO,YAAY;IAE7B;AACF,UAAQ,IAAI,oBAAoB,IAAI,IAAI;AAExC,SAAO,IAAI,SAAS,IAAI,MAAM;GAC5B,QAAQ,IAAI;GACZ,YAAY,IAAI;GAChB;GACD,CAAC;;AAGJ,MAAK,MAAM,OAAO,KAChB,UAAS,OAAO;AAGlB,QAAO"}
@@ -45,4 +45,5 @@ declare function openapiSource(server: OpenAPIServer, options?: SchemaToPagesOpt
45
45
  */
46
46
  declare function transformerOpenAPI(): PageTreeTransformer;
47
47
  //#endregion
48
- export { InternalOpenAPIMeta, openapiPlugin, openapiSource, transformerOpenAPI };
48
+ export { InternalOpenAPIMeta, openapiPlugin, openapiSource, transformerOpenAPI };
49
+ //# sourceMappingURL=source-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-api.d.ts","names":[],"sources":["../../src/server/source-api.tsx"],"mappings":";;;;;;;;;;YAgBmB,QAAA;IAH+C;;;IAO9D,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,iBAAA;EAClC,cAAA,EAAgB,cAAA;EAChB,GAAA,EAAK,WAAA;AAAA;;;;iBAMe,aAAA,CACpB,MAAA,EAAQ,aAAA,EACR,OAAA,GAAS,oBAAA;EACP,OAAA;AAAA,IAED,OAAA,CACD,MAAA;EACE,QAAA;EACA,QAAA,EAAU,eAAA;AAAA;;;;iBAuDE,kBAAA,CAAA,GAAsB,mBAAA"}
@@ -84,4 +84,5 @@ function transformerOpenAPI() {
84
84
  }
85
85
 
86
86
  //#endregion
87
- export { openapiPlugin, openapiSource, transformerOpenAPI };
87
+ export { openapiPlugin, openapiSource, transformerOpenAPI };
88
+ //# sourceMappingURL=source-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-api.js","names":[],"sources":["../../src/server/source-api.tsx"],"sourcesContent":["import { MethodLabel } from '@/ui/components/method-label';\nimport type {\n LoaderPlugin,\n PageData,\n PageTreeTransformer,\n Source,\n VirtualFile,\n} from 'fumadocs-core/source';\nimport type { OpenAPIServer } from '@/server/create';\nimport type { SchemaToPagesOptions } from '@/utils/pages/preset-auto';\nimport type { ApiPageProps } from '@/ui/api-page';\nimport type { StructuredData } from 'fumadocs-core/mdx-plugins';\nimport type { TOCItemType } from 'fumadocs-core/toc';\nimport type { ProcessedDocument } from '@/utils/process-document';\n\ndeclare module 'fumadocs-core/source' {\n export interface PageData {\n /**\n * Added by Fumadocs OpenAPI\n */\n _openapi?: InternalOpenAPIMeta;\n }\n}\n\nexport interface InternalOpenAPIMeta {\n method?: string;\n webhook?: boolean;\n}\n\n/**\n * Fumadocs Source API integration, pass this to `plugins` array in `loader()`.\n */\nexport function openapiPlugin(): LoaderPlugin {\n return {\n name: 'fumadocs:openapi',\n enforce: 'pre',\n transformPageTree: {\n file(node, filePath) {\n if (!filePath) return node;\n const file = this.storage.read(filePath);\n if (!file || file.format !== 'page') return node;\n\n const openApiData = file.data._openapi;\n if (!openApiData || typeof openApiData !== 'object') return node;\n\n if (openApiData.webhook) {\n node.name = (\n <>\n {node.name}{' '}\n <span className=\"ms-auto border border-current px-1 rounded-lg text-xs text-nowrap font-mono\">\n Webhook\n </span>\n </>\n );\n } else if (openApiData.method) {\n node.name = (\n <>\n {node.name}{' '}\n <MethodLabel className=\"ms-auto text-xs text-nowrap\">\n {openApiData.method}\n </MethodLabel>\n </>\n );\n }\n\n return node;\n },\n },\n };\n}\n\ninterface OpenAPIPageData extends PageData {\n getAPIPageProps: () => ApiPageProps;\n getSchema: () => { id: string } & ProcessedDocument;\n structuredData: StructuredData;\n toc: TOCItemType[];\n}\n\n/**\n * Generate virtual pages for Fumadocs Source API\n */\nexport async function openapiSource(\n server: OpenAPIServer,\n options: SchemaToPagesOptions & {\n baseDir?: string;\n } = {},\n): Promise<\n Source<{\n metaData: never;\n pageData: OpenAPIPageData;\n }>\n> {\n const { baseDir = '' } = options;\n const { createAutoPreset } = await import('@/utils/pages/preset-auto');\n const { fromServer } = await import('@/utils/pages/builder');\n const { toBody } = await import('@/utils/pages/to-body');\n const { toStaticData } = await import('@/utils/pages/to-static-data');\n const files: VirtualFile<{\n pageData: OpenAPIPageData;\n metaData: never;\n }>[] = [];\n\n const entries = await fromServer(server, createAutoPreset(options));\n for (const [schemaId, list] of Object.entries(entries)) {\n const processed = await server.getSchema(schemaId);\n for (const entry of list) {\n const props = toBody(entry);\n props.showDescription ??= true;\n\n files.push({\n type: 'page',\n path: `${baseDir}/${entry.path}`,\n data: {\n ...entry.info,\n getAPIPageProps() {\n return props;\n },\n getSchema() {\n return {\n id: schemaId,\n ...processed,\n };\n },\n ...toStaticData(props, processed.dereferenced),\n _openapi: {\n method:\n entry.type === 'operation' || entry.type === 'webhook'\n ? entry.item.method\n : undefined,\n webhook: entry.type === 'webhook',\n },\n },\n });\n }\n }\n\n return {\n files,\n };\n}\n\n/**\n * @deprecated use `openapiPlugin()`\n */\nexport function transformerOpenAPI(): PageTreeTransformer {\n return openapiPlugin().transformPageTree!;\n}\n"],"mappings":";;;;;;;AAgCA,SAAgB,gBAA8B;AAC5C,QAAO;EACL,MAAM;EACN,SAAS;EACT,mBAAmB,EACjB,KAAK,MAAM,UAAU;AACnB,OAAI,CAAC,SAAU,QAAO;GACtB,MAAM,OAAO,KAAK,QAAQ,KAAK,SAAS;AACxC,OAAI,CAAC,QAAQ,KAAK,WAAW,OAAQ,QAAO;GAE5C,MAAM,cAAc,KAAK,KAAK;AAC9B,OAAI,CAAC,eAAe,OAAO,gBAAgB,SAAU,QAAO;AAE5D,OAAI,YAAY,QACd,MAAK,OACH;IACG,KAAK;IAAM;IACZ,oBAAC;KAAK,WAAU;eAA8E;MAEvF;OACN;YAEI,YAAY,OACrB,MAAK,OACH;IACG,KAAK;IAAM;IACZ,oBAAC;KAAY,WAAU;eACpB,YAAY;MACD;OACb;AAIP,UAAO;KAEV;EACF;;;;;AAaH,eAAsB,cACpB,QACA,UAEI,EAAE,EAMN;CACA,MAAM,EAAE,UAAU,OAAO;CACzB,MAAM,EAAE,qBAAqB,MAAM,OAAO;CAC1C,MAAM,EAAE,eAAe,MAAM,OAAO;CACpC,MAAM,EAAE,WAAW,MAAM,OAAO;CAChC,MAAM,EAAE,iBAAiB,MAAM,OAAO;CACtC,MAAM,QAGC,EAAE;CAET,MAAM,UAAU,MAAM,WAAW,QAAQ,iBAAiB,QAAQ,CAAC;AACnE,MAAK,MAAM,CAAC,UAAU,SAAS,OAAO,QAAQ,QAAQ,EAAE;EACtD,MAAM,YAAY,MAAM,OAAO,UAAU,SAAS;AAClD,OAAK,MAAM,SAAS,MAAM;GACxB,MAAM,QAAQ,OAAO,MAAM;AAC3B,SAAM,oBAAoB;AAE1B,SAAM,KAAK;IACT,MAAM;IACN,MAAM,GAAG,QAAQ,GAAG,MAAM;IAC1B,MAAM;KACJ,GAAG,MAAM;KACT,kBAAkB;AAChB,aAAO;;KAET,YAAY;AACV,aAAO;OACL,IAAI;OACJ,GAAG;OACJ;;KAEH,GAAG,aAAa,OAAO,UAAU,aAAa;KAC9C,UAAU;MACR,QACE,MAAM,SAAS,eAAe,MAAM,SAAS,YACzC,MAAM,KAAK,SACX;MACN,SAAS,MAAM,SAAS;MACzB;KACF;IACF,CAAC;;;AAIN,QAAO,EACL,OACD;;;;;AAMH,SAAgB,qBAA0C;AACxD,QAAO,eAAe,CAAC"}
package/dist/types.d.ts CHANGED
@@ -46,4 +46,5 @@ interface RenderContext extends Pick<OpenAPIOptions, 'proxyUrl'>, RequireKeys<Cr
46
46
  type DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;
47
47
  type Awaitable<T> = T | Promise<T>;
48
48
  //#endregion
49
- export { Awaitable, CallbackObject, DistributiveOmit, Document, ExampleObject, HttpMethods, MediaTypeObject, MethodInformation, OAuth2SecurityScheme, OperationObject, ParameterObject, PathItemObject, ReferenceObject, RenderContext, RequestBodyObject, ResponseObject, SecuritySchemeObject, ServerObject, ServerVariableObject, TagObject };
49
+ export { Awaitable, CallbackObject, DistributiveOmit, Document, ExampleObject, HttpMethods, MediaTypeObject, MethodInformation, OAuth2SecurityScheme, OperationObject, ParameterObject, PathItemObject, ReferenceObject, RenderContext, RequestBodyObject, ResponseObject, SecuritySchemeObject, ServerObject, ServerVariableObject, TagObject };
50
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;;;;;;;;KAUY,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;EACA,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,WAAA,CAAY,oBAAA;EACd,OAAA,EAAS,OAAA;;;;EAKT,MAAA,EAAQ,iBAAA;EAER,aAAA,EAAe,MAAA,SAAe,YAAA;EAE9B,aAAA,GACE,KAAA,UACA,IAAA,UACA,KAAA,GAAQ,cAAA,CAAe,kBAAA,MACpB,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"}
@@ -31,4 +31,5 @@ interface OperationItem {
31
31
  method: HttpMethods;
32
32
  }
33
33
  //#endregion
34
- export { ApiPageProps, OperationItem, WebhookItem };
34
+ export { ApiPageProps, OperationItem, WebhookItem };
35
+ //# sourceMappingURL=api-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-page.d.ts","names":[],"sources":["../../src/ui/api-page.tsx"],"mappings":";;;;;UAMiB,YAAA;EACf,QAAA,EAAU,OAAA,CAAQ,iBAAA,aAA8B,iBAAA;EAChD,SAAA;EACA,eAAA;EAH2B;;;EAQ3B,UAAA,GAAa,aAAA;EAEb,QAAA,GAAW,WAAA;AAAA;AAAA,UAGI,WAAA;EAHO;;;EAOtB,IAAA;EACA,MAAA,EAAQ,WAAA;AAAA;AAAA,UAGO,aAAA;EAlBf;;;EAsBA,IAAA;EAfW;;;EAmBX,MAAA,EAAQ,WAAA;AAAA"}
@@ -59,4 +59,5 @@ async function APIPage({ showTitle: hasHead = false, showDescription, operations
59
59
  }
60
60
 
61
61
  //#endregion
62
- export { APIPage };
62
+ export { APIPage };
63
+ //# sourceMappingURL=api-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-page.js","names":[],"sources":["../../src/ui/api-page.tsx"],"sourcesContent":["import { Operation } from '@/ui/operation';\nimport type { HttpMethods, RenderContext } from '@/types';\nimport { createMethod } from '@/utils/schema';\nimport type { ProcessedDocument } from '@/utils/process-document';\nimport { ApiProviderLazy, ServerProviderLazy } from './contexts/api.lazy';\n\nexport interface ApiPageProps {\n document: Promise<ProcessedDocument> | string | ProcessedDocument;\n showTitle?: boolean;\n showDescription?: boolean;\n\n /**\n * An array of operations\n */\n operations?: OperationItem[];\n\n webhooks?: WebhookItem[];\n}\n\nexport interface WebhookItem {\n /**\n * webhook name in `webhooks`\n */\n name: string;\n method: 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 async function APIPage({\n showTitle: hasHead = false,\n showDescription,\n operations,\n webhooks,\n ctx,\n}: Omit<ApiPageProps, 'document'> & {\n ctx: RenderContext;\n}) {\n const { dereferenced } = ctx.schema;\n let { renderPageLayout } = ctx.content ?? {};\n renderPageLayout ??= (slots) => (\n <div className=\"flex flex-col gap-24 text-sm @container\">\n {slots.operations?.map((op) => op.children)}\n {slots.webhooks?.map((op) => op.children)}\n </div>\n );\n\n const content = await renderPageLayout(\n {\n operations: operations?.map((item) => {\n const pathItem = dereferenced.paths?.[item.path];\n if (!pathItem)\n throw new Error(`[Fumadocs OpenAPI] Path not found in OpenAPI schema: ${item.path}`);\n\n const operation = pathItem[item.method];\n if (!operation)\n throw new Error(\n `[Fumadocs OpenAPI] Method ${item.method} not found in operation: ${item.path}`,\n );\n\n const method = createMethod(item.method, pathItem, operation);\n\n return {\n item,\n children: (\n <Operation\n key={`${item.path}:${item.method}`}\n method={method}\n path={item.path}\n ctx={ctx}\n showTitle={hasHead}\n showDescription={showDescription}\n />\n ),\n };\n }),\n webhooks: webhooks?.map((item) => {\n const webhook = dereferenced.webhooks?.[item.name];\n if (!webhook)\n throw new Error(`[Fumadocs OpenAPI] Webhook not found in OpenAPI schema: ${item.name}`);\n\n const hook = webhook[item.method];\n if (!hook)\n throw new Error(\n `[Fumadocs OpenAPI] Method ${item.method} not found in webhook: ${item.name}`,\n );\n\n return {\n item,\n children: (\n <Operation\n type=\"webhook\"\n key={`${item.name}:${item.method}`}\n method={createMethod(item.method, webhook, hook)}\n ctx={ctx}\n path={`/${item.name}`}\n showTitle={hasHead}\n showDescription={showDescription}\n />\n ),\n };\n }),\n },\n ctx,\n );\n let servers = ctx.schema.dereferenced.servers;\n if (!servers || servers.length === 0) servers = [{ url: '/' }];\n\n return (\n <ApiProviderLazy shikiOptions={ctx.shikiOptions} client={ctx.client ?? {}}>\n <ServerProviderLazy servers={servers}>{content}</ServerProviderLazy>\n </ApiProviderLazy>\n );\n}\n"],"mappings":";;;;;;AAsCA,eAAsB,QAAQ,EAC5B,WAAW,UAAU,OACrB,iBACA,YACA,UACA,OAGC;CACD,MAAM,EAAE,iBAAiB,IAAI;CAC7B,IAAI,EAAE,qBAAqB,IAAI,WAAW,EAAE;AAC5C,uBAAsB,UACpB,qBAAC;EAAI,WAAU;aACZ,MAAM,YAAY,KAAK,OAAO,GAAG,SAAS,EAC1C,MAAM,UAAU,KAAK,OAAO,GAAG,SAAS;GACrC;CAGR,MAAM,UAAU,MAAM,iBACpB;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;KAEC,QAPS,aAAa,KAAK,QAAQ,UAAU,UAAU;KAQvD,MAAM,KAAK;KACN;KACL,WAAW;KACM;OALZ,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;KACC,MAAK;KAEL,QAAQ,aAAa,KAAK,QAAQ,SAAS,KAAK;KAC3C;KACL,MAAM,IAAI,KAAK;KACf,WAAW;KACM;OALZ,GAAG,KAAK,KAAK,GAAG,KAAK,SAM1B;IAEL;IACD;EACH,EACD,IACD;CACD,IAAI,UAAU,IAAI,OAAO,aAAa;AACtC,KAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,WAAU,CAAC,EAAE,KAAK,KAAK,CAAC;AAE9D,QACE,oBAAC;EAAgB,cAAc,IAAI;EAAc,QAAQ,IAAI,UAAU,EAAE;YACvE,oBAAC;GAA4B;aAAU;IAA6B;GACpD"}
package/dist/ui/base.d.ts CHANGED
@@ -149,4 +149,5 @@ interface CreateAPIPageOptions {
149
149
  }
150
150
  declare function createAPIPage(server: OpenAPIServer, options: CreateAPIPageOptions): FC<ApiPageProps>;
151
151
  //#endregion
152
- export { CreateAPIPageOptions, GenerateTypeScriptDefinitionsContext, createAPIPage };
152
+ export { CreateAPIPageOptions, GenerateTypeScriptDefinitionsContext, createAPIPage };
153
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","names":[],"sources":["../../src/ui/base.tsx"],"mappings":"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"}
package/dist/ui/base.js CHANGED
@@ -88,4 +88,5 @@ function createAPIPage(server, options) {
88
88
  }
89
89
 
90
90
  //#endregion
91
- export { createAPIPage };
91
+ export { createAPIPage };
92
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
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, DistributiveOmit, MethodInformation, RenderContext } from '@/types';\nimport type { NoReference } from '@/utils/schema';\nimport type { ProcessedDocument } from '@/utils/process-document';\nimport { defaultAdapters, MediaAdapter } from '@/requests/media/adapter';\nimport type { FC, ReactNode } from 'react';\nimport { highlight, type CoreHighlightOptions } from 'fumadocs-core/highlight/core';\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 type { ExampleRequestItem } from './operation/request-tabs';\nimport type { ResolvedShikiConfig } from 'fumadocs-core/highlight/config';\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';\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 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 schema: JSONSchema,\n ctx: GenerateTypeScriptDefinitionsContext,\n ) => Awaitable<string | undefined>;\n\n /**\n * Generate example code usage for endpoints.\n */\n codeUsages?: CodeUsageGeneratorRegistry;\n\n /**\n * Generate example code usage for endpoints.\n */\n generateCodeSamples?: (method: MethodInformation) => Awaitable<InlineCodeUsageGenerator[]>;\n\n shiki: ResolvedShikiConfig;\n renderMarkdown?: (md: string) => ReactNode;\n shikiOptions?: DistributiveOmit<CoreHighlightOptions, 'config' | 'lang' | 'components'>;\n\n /**\n * Show full response schema instead of only example response & Typescript definitions.\n *\n * @default true\n */\n showResponseSchema?: boolean;\n\n /**\n * Support other media types (for server-side generation).\n */\n mediaAdapters?: Record<string, MediaAdapter>;\n\n /**\n * Customise page content\n */\n content?: {\n renderResponseTabs?: (tabs: ResponseTab[], ctx: RenderContext) => Awaitable<ReactNode>;\n\n renderRequestTabs?: (\n items: ExampleRequestItem[],\n ctx: RenderContext & {\n route: string;\n operation: NoReference<MethodInformation>;\n },\n ) => Awaitable<ReactNode>;\n\n renderAPIExampleLayout?: (\n slots: {\n selector: ReactNode;\n usageTabs: ReactNode;\n responseTabs: ReactNode;\n },\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n /**\n * @param generators - codegens for API example usages\n */\n renderAPIExampleUsageTabs?: (\n generators: CodeUsageGeneratorRegistry,\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n /**\n * renderer of the entire page's layout (containing all operations & webhooks UI)\n */\n renderPageLayout?: (\n slots: {\n operations?: {\n item: OperationItem;\n children: ReactNode;\n }[];\n webhooks?: {\n item: WebhookItem;\n children: ReactNode;\n }[];\n },\n ctx: RenderContext,\n ) => Awaitable<ReactNode>;\n\n renderOperationLayout?: (\n slots: {\n header: ReactNode;\n description: ReactNode;\n apiExample: ReactNode;\n apiPlayground: ReactNode;\n\n authSchemes: ReactNode;\n paremeters: ReactNode;\n body: ReactNode;\n responses: ReactNode;\n callbacks: ReactNode;\n },\n ctx: RenderContext,\n method: NoReference<MethodInformation>,\n ) => Awaitable<ReactNode>;\n\n renderWebhookLayout?: (slots: {\n header: ReactNode;\n description: ReactNode;\n authSchemes: ReactNode;\n paremeters: ReactNode;\n body: ReactNode;\n requests: ReactNode;\n responses: ReactNode;\n callbacks: ReactNode;\n }) => Awaitable<ReactNode>;\n };\n\n /**\n * Info UI for JSON schemas\n */\n schemaUI?: {\n render?: (options: SchemaUIOptions, ctx: RenderContext) => Awaitable<ReactNode>;\n\n /**\n * Show examples under the generated content of JSON schemas.\n *\n * @defaultValue false\n */\n showExample?: boolean;\n };\n\n /**\n * Customise API playground\n */\n playground?: {\n /**\n * @defaultValue true\n */\n enabled?: boolean;\n /**\n * replace the server-side renderer\n */\n render?: (props: {\n path: string;\n method: MethodInformation;\n ctx: RenderContext;\n }) => Awaitable<ReactNode>;\n };\n\n client?: APIPageClientOptions;\n}\n\nexport function createAPIPage(\n server: OpenAPIServer,\n options: CreateAPIPageOptions,\n): FC<ApiPageProps> {\n let processor: ReturnType<typeof createMarkdownProcessor>;\n\n function createMarkdownProcessor() {\n function rehypeReact(this: any) {\n this.compiler = (tree: any, file: any) => {\n return toJsxRuntime(tree, {\n development: false,\n filePath: file.path,\n ...JsxRuntime,\n components: defaultMdxComponents,\n });\n };\n }\n\n return remark()\n .use(remarkGfm)\n .use(remarkRehype)\n .use(createRehypeCode(options.shiki), {\n langs: [],\n lazy: true,\n })\n .use(rehypeReact);\n }\n\n return async function APIPageWrapper({ document, ...props }) {\n let processed: ProcessedDocument;\n if (typeof document === 'string') {\n processed = await server.getSchema(document);\n } else {\n processed = await document;\n }\n\n const slugger = new Slugger();\n\n const ctx: RenderContext = {\n schema: processed,\n proxyUrl: server.options.proxyUrl,\n ...options,\n mediaAdapters: {\n ...defaultAdapters,\n ...options.mediaAdapters,\n },\n slugger,\n renderHeading(depth, text, props) {\n const id = slugger.slug(text);\n\n return (\n <Heading id={id} key={id} as={`h${depth}` as `h1`} {...props}>\n {text}\n </Heading>\n );\n },\n generateTypeScriptDefinitions(schema, ctx) {\n const { generateTypeScriptSchema, generateTypeScriptDefinitions } = options;\n if (generateTypeScriptSchema && ctx._internal_legacy) {\n const { statusCode, contentType } = ctx._internal_legacy;\n return generateTypeScriptSchema(ctx.operation, statusCode, contentType, ctx);\n }\n\n return generateTypeScriptDefinitions?.(schema, ctx);\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 const rendered = await highlight(code, {\n lang,\n ...options.shikiOptions,\n config: options.shiki,\n components: {\n pre: (props) => <Pre {...props} />,\n },\n });\n\n return <CodeBlock className=\"my-0\">{rendered}</CodeBlock>;\n },\n };\n\n return <APIPage {...props} ctx={ctx} />;\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA6MA,SAAgB,cACd,QACA,SACkB;CAClB,IAAI;CAEJ,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,CACZ,IAAI,UAAU,CACd,IAAI,aAAa,CACjB,IAAI,iBAAiB,QAAQ,MAAM,EAAE;GACpC,OAAO,EAAE;GACT,MAAM;GACP,CAAC,CACD,IAAI,YAAY;;AAGrB,QAAO,eAAe,eAAe,EAAE,UAAU,GAAG,SAAS;EAC3D,IAAI;AACJ,MAAI,OAAO,aAAa,SACtB,aAAY,MAAM,OAAO,UAAU,SAAS;MAE5C,aAAY,MAAM;EAGpB,MAAM,UAAU,IAAI,SAAS;EAE7B,MAAM,MAAqB;GACzB,QAAQ;GACR,UAAU,OAAO,QAAQ;GACzB,GAAG;GACH,eAAe;IACb,GAAG;IACH,GAAG,QAAQ;IACZ;GACD;GACA,cAAc,OAAO,MAAM,OAAO;IAChC,MAAM,KAAK,QAAQ,KAAK,KAAK;AAE7B,WACE,oBAAC;KAAY;KAAa,IAAI,IAAI;KAAiB,GAAI;eACpD;OADmB,GAEZ;;GAGd,8BAA8B,QAAQ,KAAK;IACzC,MAAM,EAAE,0BAA0B,kCAAkC;AACpE,QAAI,4BAA4B,IAAI,kBAAkB;KACpD,MAAM,EAAE,YAAY,gBAAgB,IAAI;AACxC,YAAO,yBAAyB,IAAI,WAAW,YAAY,aAAa,IAAI;;AAG9E,WAAO,gCAAgC,QAAQ,IAAI;;GAErD,MAAM,eAAe,MAAM;AACzB,QAAI,QAAQ,eAAgB,QAAO,QAAQ,eAAe,KAAK;AAC/D,kBAAc,yBAAyB;AAMvC,YAJY,MAAM,UAAU,QAAQ,EAClC,OAAO,MACR,CAAC,EAES;;GAEb,MAAM,gBAAgB,MAAM,MAAM;AAUhC,WAAO,oBAAC;KAAU,WAAU;eATX,MAAM,UAAU,MAAM;MACrC;MACA,GAAG,QAAQ;MACX,QAAQ,QAAQ;MAChB,YAAY,EACV,MAAM,UAAU,oBAAC,OAAI,GAAI,QAAS,EACnC;MACF,CAAC;MAEuD;;GAE5D;AAED,SAAO,oBAAC;GAAQ,GAAI;GAAY;IAAO"}
@@ -34,4 +34,5 @@ interface OperationClientOptions {
34
34
  }
35
35
  declare function defineClientConfig(options?: APIPageClientOptions): APIPageClientOptions;
36
36
  //#endregion
37
- export { APIPageClientOptions, OperationClientOptions, defineClientConfig };
37
+ export { APIPageClientOptions, OperationClientOptions, defineClientConfig };
38
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -6,4 +6,5 @@ function defineClientConfig(options = {}) {
6
6
  }
7
7
 
8
8
  //#endregion
9
- export { defineClientConfig };
9
+ export { defineClientConfig };
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
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 { ExampleRequestItem } from '../operation/request-tabs';\nimport type { CodeUsageGeneratorRegistry } from '@/requests/generators';\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"}
@@ -14,4 +14,5 @@ function getStorageKey(prefix = "fumadocs-openapi-", name) {
14
14
  }
15
15
 
16
16
  //#endregion
17
- export { useStorageKey };
17
+ export { useStorageKey };
18
+ //# sourceMappingURL=storage-key.js.map
@@ -0,0 +1 @@
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\nexport function 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,SAAgB,cAAc,SAAS,qBAAqB,MAAe;AACzE,QAAO,SAAS"}
@@ -42,4 +42,5 @@ function AccordionTrigger(props) {
42
42
  }
43
43
 
44
44
  //#endregion
45
- export { AccordionContent, AccordionHeader, AccordionItem, AccordionTrigger, Accordions };
45
+ export { AccordionContent, AccordionHeader, AccordionItem, AccordionTrigger, Accordions };
46
+ //# sourceMappingURL=accordion.js.map
@@ -0,0 +1 @@
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;EAAK,GAAI;EAAO,WAAW,GAAG,6BAA6B,MAAM,UAAU;GAAI;;AAGnG,SAAgB,cAAc,OAA8C;AAC1E,QACE,oBAAC,UAAU;EAAK,GAAI;EAAO,WAAW,GAAG,eAAe,MAAM,UAAU;YACrE,MAAM;GACQ;;AAIrB,SAAgB,iBAAiB,OAAiD;AAChF,QACE,oBAAC,UAAU;EACT,GAAI;EACJ,WAAW,GACT,2GACA,MAAM,UACP;YAEA,MAAM;GACW;;AAIxB,SAAgB,gBAAgB,OAAgD;AAC9E,QACE,oBAAC,UAAU;EACT,GAAI;EACJ,WAAW,GAAG,sDAAsD,MAAM,UAAU;YAEnF,MAAM;GACU;;AAIvB,SAAgB,iBAAiB,OAAiD;AAChF,QACE,qBAAC,UAAU;EACT,GAAI;EACJ,WAAW,GACT,wFACA,MAAM,UACP;aAED,oBAAC,gBAAa,WAAU,8JAA8J,EACrL,MAAM;GACW"}
@@ -56,4 +56,5 @@ const DialogDescription = React.forwardRef(({ className, ...props }, ref) => /*
56
56
  DialogDescription.displayName = DialogPrimitive.Description.displayName;
57
57
 
58
58
  //#endregion
59
- export { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger };
59
+ export { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger };
60
+ //# sourceMappingURL=dialog.js.map
@@ -0,0 +1 @@
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';\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 <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=\"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));\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":";;;;;;;;;;AAQA,MAAM,SAAS,gBAAgB;AAE/B,MAAM,gBAAgB,gBAAgB;AAEtC,MAAM,eAAe,gBAAgB;AAErC,MAAM,cAAc,gBAAgB;AAEpC,MAAM,gBAAgB,MAAM,YAGzB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB;CACV;CACL,WAAW,GACT,gIACA,UACD;CACD,GAAI;EACJ,CACF;AACF,cAAc,cAAc,gBAAgB,QAAQ;AAEpD,MAAM,gBAAgB,MAAM,YAGzB,EAAE,WAAW,UAAU,GAAG,SAAS,QACpC,qBAAC,2BACC,oBAAC,kBAAgB,EACjB,qBAAC,gBAAgB;CACV;CACL,WAAW,GACT,4QACA,UACD;CACD,GAAI;YAEH,UACD,oBAAC,gBAAgB;EACf,cAAW;EACX,WAAW,GACT,eAAe;GAAE,MAAM;GAAW,OAAO;GAAS,CAAC,EACnD,mDACD;YAED,oBAAC,MAAI;GACiB;EACA,IACb,CACf;AACF,cAAc,cAAc,gBAAgB,QAAQ;AAEpD,MAAM,gBAAgB,EAAE,WAAW,GAAG,YACpC,oBAAC;CAAI,WAAW,GAAG,mDAAmD,UAAU;CAAE,GAAI;EAAS;AAEjG,aAAa,cAAc;AAE3B,MAAM,gBAAgB,EAAE,WAAW,GAAG,YACpC,oBAAC;CACC,WAAW,GAAG,6DAA6D,UAAU;CACrF,GAAI;EACJ;AAEJ,aAAa,cAAc;AAE3B,MAAM,cAAc,MAAM,YAGvB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB;CACV;CACL,WAAW,GAAG,qDAAqD,UAAU;CAC7E,GAAI;EACJ,CACF;AACF,YAAY,cAAc,gBAAgB,MAAM;AAEhD,MAAM,oBAAoB,MAAM,YAG7B,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB;CACV;CACL,WAAW,GAAG,oCAAoC,UAAU;CAC5D,GAAI;EACJ,CACF;AACF,kBAAkB,cAAc,gBAAgB,YAAY"}
@@ -16,4 +16,5 @@ const Input = React.forwardRef(({ className, type, ...props }, ref) => {
16
16
  Input.displayName = "Input";
17
17
 
18
18
  //#endregion
19
- export { Input, labelVariants };
19
+ export { Input, labelVariants };
20
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
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;EACO;EACN,WAAW,GACT,iSACA,UACD;EACI;EACL,GAAI;GACJ;EAGP;AACD,MAAM,cAAc"}
@@ -38,4 +38,5 @@ function MethodLabel({ children, ...props }) {
38
38
  }
39
39
 
40
40
  //#endregion
41
- export { Badge, MethodLabel };
41
+ export { Badge, MethodLabel };
42
+ //# sourceMappingURL=method-label.js.map
@@ -0,0 +1 @@
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;EACC,WAAW,GACT,cAAc;GACZ;GACA;GACD,CAAC,CACH;EACD,GAAI;YAEH,MAAM;GACF;;AAIX,SAAgB,YAAY,EAC1B,UACA,GAAG,SAGF;AACD,QACE,oBAAC;EAAM,GAAI;EAAO,OAAO,eAAe,SAAS;YAC9C,SAAS,aAAa;GACjB"}
@@ -71,4 +71,5 @@ const SelectSeparator = forwardRef(({ className, ...props }, ref) => /* @__PURE_
71
71
  SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
72
72
 
73
73
  //#endregion
74
- export { Select, SelectContent, SelectItem, SelectTrigger, SelectValue };
74
+ export { Select, SelectContent, SelectItem, SelectTrigger, SelectValue };
75
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
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;AAE/B,MAAM,cAAc,gBAAgB;AAEpC,MAAM,cAAc,gBAAgB;AAEpC,MAAM,gBAAgB,YAGnB,EAAE,WAAW,UAAU,GAAG,SAAS,QACpC,qBAAC,gBAAgB;CACV;CACL,WAAW,GACT,sRACA,UACD;CACD,GAAI;YAEH,UACD,oBAAC,gBAAgB;EAAK;YACpB,oBAAC,eAAY,WAAU,uDAAuD;GACzD;EACC,CAC1B;AACF,cAAc,cAAc,gBAAgB,QAAQ;AAEpD,MAAM,uBAAuB,YAG1B,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB;CACV;CACL,WAAW,GAAG,yCAAyC,UAAU;CACjE,GAAI;WAEJ,oBAAC,aAAU,WAAU,WAAW;EACD,CACjC;AACF,qBAAqB,cAAc,gBAAgB,eAAe;AAElE,MAAM,yBAAyB,YAG5B,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB;CACV;CACL,WAAW,GAAG,yCAAyC,UAAU;CACjE,GAAI;WAEJ,oBAAC,eAAY,WAAU,WAAW;EACD,CACnC;AACF,uBAAuB,cAAc,gBAAgB,iBAAiB;AAEtE,MAAM,gBAAgB,YAGnB,EAAE,WAAW,UAAU,UAAU,GAAG,SAAS,QAC9C,oBAAC,gBAAgB,oBACf,qBAAC,gBAAgB;CACV;CACL,WAAW,GACT,6FACA,UACD;CACS;CACV,GAAI;;EAEJ,oBAAC,yBAAuB;EACxB,oBAAC,gBAAgB;GAAS,WAAU;GAAO;IAAoC;EAC/E,oBAAC,2BAAyB;;EACF,GACH,CACzB;AACF,cAAc,cAAc,gBAAgB,QAAQ;AAEpD,MAAM,cAAc,YAGjB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB;CACV;CACL,WAAW,GAAG,0CAA0C,UAAU;CAClE,GAAI;EACJ,CACF;AACF,YAAY,cAAc,gBAAgB,MAAM;AAEhD,MAAM,aAAa,YAGhB,EAAE,WAAW,UAAU,GAAG,SAAS,QACpC,qBAAC,gBAAgB;CACV;CACL,WAAW,GACT,wMACA,UACD;CACD,GAAI;YAEJ,oBAAC,gBAAgB,YAAU,WAAoC,EAC/D,oBAAC,gBAAgB;EAAc,WAAU;YACvC,oBAAC,SAAM,WAAU,6BAA6B;GAChB;EACX,CACvB;AACF,WAAW,cAAc,gBAAgB,KAAK;AAE9C,MAAM,kBAAkB,YAGrB,EAAE,WAAW,GAAG,SAAS,QAC1B,oBAAC,gBAAgB;CACV;CACL,WAAW,GAAG,yBAAyB,UAAU;CACjD,GAAI;EACJ,CACF;AACF,gBAAgB,cAAc,gBAAgB,UAAU"}
@@ -120,4 +120,5 @@ function getDefaultValues(server) {
120
120
  }
121
121
 
122
122
  //#endregion
123
- export { ApiProvider, ServerProvider, useApiContext, useServerContext, useServerSelectContext };
123
+ export { ApiProvider, ServerProvider, useApiContext, useServerContext, useServerSelectContext };
124
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","names":[],"sources":["../../../src/ui/contexts/api.tsx"],"sourcesContent":["'use client';\nimport {\n createContext,\n type ReactNode,\n type RefObject,\n use,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { RenderContext, ServerObject } from '@/types';\nimport { defaultAdapters, type MediaAdapter } from '@/requests/media/adapter';\nimport type { NoReference } from '@/utils/schema';\nimport { useStorageKey } from '../client/storage-key';\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\nexport interface ServerProviderProps {\n /**\n * Base URL for API requests\n */\n defaultBaseUrl?: string;\n\n servers: NoReference<ServerObject>[];\n}\n\ninterface ServerContextType extends ServerProviderProps {\n /**\n * ref to selected API server (to query)\n */\n serverRef: RefObject<SelectedServer | null>;\n}\n\nconst ServerContext = createContext<ServerContextType | null>(null);\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\ninterface ServerSelectType {\n server: SelectedServer | null;\n setServer: (value: string) => void;\n setServerVariables: (value: Record<string, string>) => void;\n}\n\nconst ApiContext = createContext<ApiContextType | null>(null);\nconst ServerSelectContext = createContext<ServerSelectType | null>(null);\n\nexport function useApiContext(): ApiContextType {\n const ctx = use(ApiContext);\n if (!ctx) throw new Error('Component must be used under <ApiProvider />');\n\n return ctx;\n}\n\nexport function useServerContext() {\n return use(ServerContext)!;\n}\n\nexport function useServerSelectContext(): ServerSelectType {\n const ctx = use(ServerSelectContext);\n if (!ctx) throw new Error('Component must be used under <ApiProvider />');\n\n return ctx;\n}\n\nexport function ApiProvider({\n 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 defaultBaseUrl,\n children,\n}: ServerProviderProps & { children: ReactNode }) {\n const serverRef = useRef<SelectedServer | null>(null);\n\n return (\n <ServerContext value={useMemo(() => ({ servers, serverRef }), [servers])}>\n <ServerSelectProvider defaultBaseUrl={defaultBaseUrl}>{children}</ServerSelectProvider>\n </ServerContext>\n );\n}\n\nfunction ServerSelectProvider({\n defaultBaseUrl,\n children,\n}: Pick<ServerProviderProps, 'defaultBaseUrl'> & {\n children: ReactNode;\n}) {\n const { servers, serverRef } = use(ServerContext)!;\n const storageKeys = useStorageKey();\n const [server, setServer] = useState<SelectedServer | null>(() => {\n const defaultItem = defaultBaseUrl\n ? servers.find((item) => item.url === defaultBaseUrl)\n : servers[0];\n\n return defaultItem\n ? {\n name: defaultItem.name,\n url: defaultItem.url!,\n variables: getDefaultValues(defaultItem),\n }\n : null;\n });\n serverRef.current = server;\n\n useEffect(() => {\n const cached = localStorage.getItem(storageKeys.of('server-url'));\n if (!cached) return;\n\n try {\n const obj: 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 }, [storageKeys]);\n\n return (\n <ServerSelectContext\n value={useMemo(\n () => ({\n server,\n setServerVariables(variables) {\n setServer((prev) => {\n if (!prev) return null;\n\n const updated = { ...prev, variables };\n localStorage.setItem(storageKeys.of('server-url'), JSON.stringify(updated));\n return updated;\n });\n },\n setServer(value) {\n const obj = servers.find((item) => item.url === value);\n if (!obj) return;\n\n const result: SelectedServer = {\n name: obj.name,\n url: value,\n variables: getDefaultValues(obj),\n };\n\n localStorage.setItem(storageKeys.of('server-url'), JSON.stringify(result));\n setServer(result);\n },\n }),\n [server, servers, storageKeys],\n )}\n >\n {children}\n </ServerSelectContext>\n );\n}\n\nfunction getDefaultValues(server: NoReference<ServerObject>): Record<string, string> {\n const out: Record<string, string> = {};\n if (!server.variables) return out;\n\n for (const [k, v] of Object.entries(server.variables)) {\n if (v.default !== undefined) out[k] = String(v.default);\n }\n\n return out;\n}\n"],"mappings":"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"}
@@ -7,4 +7,5 @@ const ApiProviderLazy = wrapLazy(() => import("./api.js").then((mod) => ({ defau
7
7
  const ServerProviderLazy = wrapLazy(() => import("./api.js").then((mod) => ({ default: mod.ServerProvider })));
8
8
 
9
9
  //#endregion
10
- export { ApiProviderLazy, ServerProviderLazy };
10
+ export { ApiProviderLazy, ServerProviderLazy };
11
+ //# sourceMappingURL=api.lazy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.lazy.js","names":[],"sources":["../../../src/ui/contexts/api.lazy.ts"],"sourcesContent":["'use client';\nimport { wrapLazy } from '../../utils/lazy';\n\nexport const ApiProviderLazy = wrapLazy(() =>\n import('./api').then((mod) => ({ default: mod.ApiProvider })),\n);\n\nexport const ServerProviderLazy = wrapLazy(() =>\n import('./api').then((mod) => ({ default: mod.ServerProvider })),\n);\n"],"mappings":";;;;;AAGA,MAAa,kBAAkB,eAC7B,OAAO,YAAS,MAAM,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,CAC9D;AAED,MAAa,qBAAqB,eAChC,OAAO,YAAS,MAAM,SAAS,EAAE,SAAS,IAAI,gBAAgB,EAAE,CACjE"}
@@ -14,4 +14,5 @@ function ShikiConfigProvider({ children }) {
14
14
  }
15
15
 
16
16
  //#endregion
17
- export { ShikiConfigProvider };
17
+ export { ShikiConfigProvider };
18
+ //# sourceMappingURL=full.client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"full.client.js","names":[],"sources":["../../src/ui/full.client.tsx"],"sourcesContent":["'use client';\nimport * as base from 'fumadocs-core/highlight/core/client';\nimport { configDefault } from 'fumadocs-core/highlight';\nimport type { ReactNode } from 'react';\n\nexport function ShikiConfigProvider({ children }: { children: ReactNode }) {\n const config = base.useShikiConfigOptional() ?? configDefault;\n return <base.ShikiConfigProvider config={config}>{children}</base.ShikiConfigProvider>;\n}\n"],"mappings":";;;;;;;AAKA,SAAgB,oBAAoB,EAAE,YAAqC;CACzE,MAAM,SAAS,KAAK,wBAAwB,IAAI;AAChD,QAAO,oBAAC,KAAK;EAA4B;EAAS;GAAoC"}
package/dist/ui/full.d.ts CHANGED
@@ -8,4 +8,5 @@ import * as react_jsx_runtime0 from "react/jsx-runtime";
8
8
  type CreateAPIPageOptions = Partial<CreateAPIPageOptions$1>;
9
9
  declare function createAPIPage(server: OpenAPIServer, options?: CreateAPIPageOptions): (props: ApiPageProps) => react_jsx_runtime0.JSX.Element;
10
10
  //#endregion
11
- export { CreateAPIPageOptions, createAPIPage };
11
+ export { CreateAPIPageOptions, createAPIPage };
12
+ //# sourceMappingURL=full.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"full.d.ts","names":[],"sources":["../../src/ui/full.tsx"],"mappings":";;;;;;;KAMY,oBAAA,GAAuB,OAAA,CAAQ,sBAAA;AAAA,iBAE3B,aAAA,CAAc,MAAA,EAAQ,aAAA,EAAe,OAAA,GAAS,oBAAA,IAqBhC,KAAA,EAAO,YAAA,KAAY,kBAAA,CAAA,GAAA,CAAA,OAAA"}
package/dist/ui/full.js CHANGED
@@ -29,4 +29,5 @@ function createAPIPage(server, options = {}) {
29
29
  }
30
30
 
31
31
  //#endregion
32
- export { createAPIPage };
32
+ export { createAPIPage };
33
+ //# sourceMappingURL=full.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"full.js","names":["base.createAPIPage"],"sources":["../../src/ui/full.tsx"],"sourcesContent":["import type { OpenAPIServer } from '@/server';\nimport * as base from './base';\nimport { configDefault } from 'fumadocs-core/highlight';\nimport { ApiPageProps } from './api-page';\nimport { ShikiConfigProvider } from './full.client';\n\nexport type CreateAPIPageOptions = Partial<base.CreateAPIPageOptions>;\n\nexport function createAPIPage(server: OpenAPIServer, options: CreateAPIPageOptions = {}) {\n const APIPage = base.createAPIPage(server, {\n shiki: configDefault,\n async generateTypeScriptDefinitions(schema, ctx) {\n if (typeof schema !== 'object') return;\n const { compile } = await import('@fumari/json-schema-ts');\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 });\n\n return function APIPageFull(props: ApiPageProps) {\n return (\n <ShikiConfigProvider>\n <APIPage {...props} />\n </ShikiConfigProvider>\n );\n };\n}\n"],"mappings":";;;;;;AAQA,SAAgB,cAAc,QAAuB,UAAgC,EAAE,EAAE;CACvF,MAAM,UAAUA,gBAAmB,QAAQ;EACzC,OAAO;EACP,MAAM,8BAA8B,QAAQ,KAAK;AAC/C,OAAI,OAAO,WAAW,SAAU;GAChC,MAAM,EAAE,YAAY,MAAM,OAAO;AAEjC,OAAI;AACF,WAAO,QAAQ,QAAQ;KACrB,MAAM;KACN,UAAU,IAAI;KACd,WAAW,IAAI;KACf,aAAa,IAAI,OAAO;KACzB,CAAC;YACK,GAAG;AACV,YAAQ,KAAK,yCAAyC,EAAE;;;EAG5D,GAAG;EACJ,CAAC;AAEF,QAAO,SAAS,YAAY,OAAqB;AAC/C,SACE,oBAAC,iCACC,oBAAC,WAAQ,GAAI,QAAS,GACF"}
@@ -71,4 +71,5 @@ function SelectTabTrigger({ items, className, ...props }) {
71
71
  }
72
72
 
73
73
  //#endregion
74
- export { CopyTypeScriptPanel, SelectTab, SelectTabTrigger, SelectTabs };
74
+ export { CopyTypeScriptPanel, SelectTab, SelectTabTrigger, SelectTabs };
75
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
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 { type ComponentProps, createContext, type ReactNode, use, useMemo, useState } from 'react';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/ui/components/select';\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\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\">TypeScript Definitions</p>\n <p className=\"text-xs text-fd-muted-foreground\">Use the {name} type in TypeScript.</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 Copy\n </button>\n </div>\n );\n}\n\nconst Context = createContext<{\n type: string | null;\n setType: (type: string) => void;\n} | null>(null);\n\nexport function SelectTabs({\n defaultValue,\n children,\n}: {\n defaultValue?: string;\n children: ReactNode;\n}) {\n const [type, setType] = useState<string | null>(defaultValue ?? null);\n\n return <Context value={useMemo(() => ({ type, setType }), [type])}>{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?.type) 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 { type, setType } = use(Context)!;\n\n return (\n <Select value={type ?? ''} onValueChange={setType}>\n <SelectTrigger className={cn('not-prose w-fit min-w-0 *:min-w-0', className)} {...props}>\n <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":";;;;;;;;;;;AAeA,SAAgB,oBAAoB,EAClC,MACA,MACA,aAKC;CACD,MAAM,CAAC,WAAW,UAAU,oBAAoB;AAC9C,EAAK,UAAU,UAAU,UAAU,KAAK;GACxC;AAEF,QACE,qBAAC;EACC,WAAW,GACT,4HACA,UACD;aAED,qBAAC,oBACC,oBAAC;GAAE,WAAU;aAA2B;IAA0B,EAClE,qBAAC;GAAE,WAAU;;IAAmC;IAAS;IAAK;;IAAwB,IAClF,EACN,qBAAC;GACC,SAAS;GACT,WAAW,GACT,eAAe;IACb,OAAO;IACP,WAAW;IACX,MAAM;IACP,CAAC,CACH;cAEA,YAAY,oBAAC,SAAM,WAAU,aAAa,GAAG,oBAAC,QAAK,WAAU,aAAa,EAAC;IAErE;GACL;;AAIV,MAAM,UAAU,cAGN,KAAK;AAEf,SAAgB,WAAW,EACzB,cACA,YAIC;CACD,MAAM,CAAC,MAAM,WAAW,SAAwB,gBAAgB,KAAK;AAErE,QAAO,oBAAC;EAAQ,OAAO,eAAe;GAAE;GAAM;GAAS,GAAG,CAAC,KAAK,CAAC;EAAG;GAAmB;;AAGzF,SAAgB,UAAU,EACxB,OACA,GAAG,SAGF;AAED,KAAI,UADQ,IAAI,QAAQ,EACL,KAAM;AAEzB,QAAO,oBAAC;EAAI,GAAI;YAAQ,MAAM;GAAe;;AAG/C,SAAgB,iBAAiB,EAC/B,OACA,WACA,GAAG,SAMF;CACD,MAAM,EAAE,MAAM,YAAY,IAAI,QAAQ;AAEtC,QACE,qBAAC;EAAO,OAAO,QAAQ;EAAI,eAAe;aACxC,oBAAC;GAAc,WAAW,GAAG,qCAAqC,UAAU;GAAE,GAAI;aAChF,oBAAC,gBAAc;IACD,EAChB,oBAAC,2BACE,MAAM,KAAK,EAAE,OAAO,YACnB,oBAAC;GAA8B;aAC5B;KADc,MAEJ,CACb,GACY;GACT"}
@@ -441,4 +441,5 @@ function AuthProperty({ name, type, deprecated = false, scopes = [], className,
441
441
  }
442
442
 
443
443
  //#endregion
444
- export { Operation };
444
+ export { Operation };
445
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/ui/operation/index.tsx"],"sourcesContent":["import { type ComponentProps, Fragment, type ReactNode } from 'react';\nimport type {\n CallbackObject,\n MethodInformation,\n RenderContext,\n SecuritySchemeObject,\n} from '@/types';\nimport { createMethod, methodKeys, type NoReference, type ResolvedSchema } from '@/utils/schema';\nimport { idToTitle } from '@/utils/id-to-title';\nimport { Schema } from '../schema';\nimport { UsageTabs } from '@/ui/operation/usage-tabs';\nimport { Badge, MethodLabel } from '@/ui/components/method-label';\nimport { CopyTypeScriptPanel, SelectTab, SelectTabs, SelectTabTrigger } from './client';\nimport {\n AccordionContent,\n AccordionHeader,\n AccordionItem,\n Accordions,\n AccordionTrigger,\n} from '@/ui/components/accordion';\nimport { isMediaTypeSupported } from '@/requests/media/adapter';\nimport { cn } from '@/utils/cn';\nimport { APIPlayground } from '@/playground';\nimport { getExampleRequests, RequestTabs } from './request-tabs';\nimport { UsageTabsProviderLazy } from './usage-tabs/lazy';\nimport { ServerProviderLazy } from '../contexts/api.lazy';\n\nconst ParamTypes = {\n path: 'Path Parameters',\n query: 'Query Parameters',\n header: 'Header Parameters',\n cookie: 'Cookie Parameters',\n};\n\nexport async function Operation({\n type = 'operation',\n path,\n method,\n ctx,\n showTitle,\n showDescription,\n headingLevel = 2,\n}: {\n type?: 'webhook' | 'operation';\n path: string;\n method: MethodInformation;\n ctx: RenderContext;\n\n showTitle?: boolean;\n showDescription?: boolean;\n headingLevel?: number;\n}) {\n const {\n schema: { dereferenced },\n } = ctx;\n const body = method.requestBody;\n let headNode: ReactNode = null;\n const descriptionNode =\n showDescription && method.description && ctx.renderMarkdown(method.description);\n let bodyNode: ReactNode = null;\n let authNode: ReactNode = null;\n let responseNode: ReactNode = null;\n let callbacksNode: ReactNode = null;\n\n if (showTitle) {\n const title = method.summary || (method.operationId ? idToTitle(method.operationId) : path);\n\n headNode = ctx.renderHeading(headingLevel, title);\n headingLevel++;\n }\n\n const contentTypes = body?.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, '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(async ([type, content]) => {\n if (!isMediaTypeSupported(type, ctx.mediaAdapters)) {\n throw new Error(`Media type ${type} is not supported (in ${path})`);\n }\n\n const ts = content.schema\n ? await ctx.generateTypeScriptDefinitions(content.schema, {\n operation: method,\n readOnly: false,\n writeOnly: true,\n ...ctx,\n })\n : undefined;\n\n return (\n <SelectTab key={type} value={type}>\n {ts && <CopyTypeScriptPanel name=\"request body\" code={ts} className=\"mt-4\" />}\n <Schema\n client={{\n name: 'body',\n as: 'body',\n required: body.required,\n }}\n root={(content.schema ?? {}) as ResolvedSchema}\n readOnly={method.method === 'GET'}\n writeOnly={method.method !== 'GET'}\n ctx={ctx}\n />\n </SelectTab>\n );\n })}\n </SelectTabs>\n );\n }\n\n if (method.responses && ctx.showResponseSchema !== false) {\n const statuses = Object.keys(method.responses);\n\n responseNode = (\n <>\n {ctx.renderHeading(headingLevel, 'Response Body')}\n\n <Accordions type=\"multiple\">\n {statuses.map((status) => (\n <ResponseAccordion key={status} status={status} operation={method} ctx={ctx} />\n ))}\n </Accordions>\n </>\n );\n }\n\n const parameterNode = Object.entries(ParamTypes).map(([type, title]) => {\n const params = method.parameters?.filter((param) => param.in === type);\n if (!params || params.length === 0) return;\n\n return (\n <Fragment key={type}>\n {ctx.renderHeading(headingLevel, title)}\n <div className=\"flex flex-col\">\n {params.map(\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, 'Authorization', {\n className: 'my-0!',\n })}\n {items.length > 1 ? (\n <SelectTabTrigger items={items} />\n ) : (\n <div className=\"not-prose\">{items[0].label}</div>\n )}\n </div>\n {securities.map((security, i) => (\n <SelectTab key={i} value={items[i].value}>\n {Object.entries(security).map(([key, scopes]) => {\n const scheme = securitySchemes?.[key];\n if (!scheme) return;\n\n return <AuthScheme key={key} scheme={scheme} scopes={scopes} ctx={ctx} />;\n })}\n </SelectTab>\n ))}\n </SelectTabs>\n );\n }\n\n const callbacks = method.callbacks ? Object.entries(method.callbacks) : null;\n if (callbacks && callbacks.length > 0) {\n const items = callbacks.map(([key]) => ({\n label: <code className=\"text-xs\">{key}</code>,\n value: key,\n }));\n\n callbacksNode = (\n <SelectTabs defaultValue={items[0].value}>\n <div className=\"flex justify-between gap-2 items-end mt-10\">\n {ctx.renderHeading(headingLevel, 'Callbacks', {\n className: 'my-0!',\n })}\n {callbacks.length > 1 ? (\n <SelectTabTrigger items={items} className=\"font-medium\" />\n ) : (\n <p className=\"text-fd-muted-foreground not-prose\">{items[0].label}</p>\n )}\n </div>\n {callbacks.map(([name, callback]) => (\n <SelectTab key={name} value={name}>\n <WebhookCallback callback={callback} ctx={ctx} headingLevel={headingLevel} />\n </SelectTab>\n ))}\n </SelectTabs>\n );\n }\n\n let { renderOperationLayout, renderWebhookLayout } = ctx.content ?? {};\n if (type === 'operation') {\n renderOperationLayout ??= (slots) => {\n return (\n <div className=\"flex flex-col gap-x-6 gap-y-4 @4xl:flex-row @4xl:items-start\">\n <div className=\"min-w-0 flex-1\">\n {slots.header}\n {slots.apiPlayground}\n {slots.description}\n {slots.authSchemes}\n {slots.paremeters}\n {slots.body}\n {slots.responses}\n {slots.callbacks}\n </div>\n <div className=\"@4xl:sticky @4xl:top-[calc(var(--fd-docs-row-1,2rem)+1rem)] @4xl:w-[400px]\">\n {slots.apiExample}\n </div>\n </div>\n );\n };\n\n const playgroundEnabled = ctx.playground?.enabled ?? true;\n let content = await renderOperationLayout(\n {\n header: headNode,\n description: descriptionNode,\n authSchemes: authNode,\n body: bodyNode,\n callbacks: callbacksNode,\n paremeters: parameterNode,\n responses: responseNode,\n apiPlayground: playgroundEnabled ? (\n <APIPlayground path={path} method={method} ctx={ctx} />\n ) : (\n <div className=\"flex flex-row items-center gap-2.5 p-3 rounded-xl border bg-fd-card text-fd-card-foreground not-prose\">\n <MethodLabel className=\"text-xs\">{method.method}</MethodLabel>\n <code className=\"flex-1 overflow-auto text-nowrap text-[0.8125rem] text-fd-muted-foreground\">\n {path}\n </code>\n </div>\n ),\n apiExample: <UsageTabs method={method} ctx={ctx} />,\n },\n ctx,\n method,\n );\n\n content = (\n <UsageTabsProviderLazy\n defaultExampleId={method['x-exclusiveCodeSample'] ?? method['x-selectedCodeSample']}\n route={path}\n examples={getExampleRequests(path, method, ctx)}\n >\n {content}\n </UsageTabsProviderLazy>\n );\n if (method.servers) {\n content = <ServerProviderLazy servers={method.servers}>{content}</ServerProviderLazy>;\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.paremeters}\n {slots.body}\n {slots.responses}\n {slots.callbacks}\n </div>\n <div className=\"@4xl:sticky @4xl:top-[calc(var(--fd-docs-row-1,2rem)+1rem)] @4xl:w-[400px]\">\n {slots.requests}\n </div>\n </div>\n );\n return renderWebhookLayout({\n header: headNode,\n description: descriptionNode,\n authSchemes: authNode,\n body: bodyNode,\n callbacks: callbacksNode,\n paremeters: parameterNode,\n responses: responseNode,\n requests: <RequestTabs path={path} operation={method} ctx={ctx} />,\n });\n }\n}\n\nasync function ResponseAccordion({\n status,\n operation,\n ctx,\n}: {\n status: string;\n operation: MethodInformation;\n ctx: RenderContext;\n}) {\n const response = operation.responses![status];\n const contentTypes = response.content ? Object.entries(response.content) : [];\n let wrapper = (children: ReactNode) => children;\n let selectorNode: ReactNode = null;\n\n if (contentTypes.length > 0) {\n const items = contentTypes.map(([key]) => ({\n label: <code className=\"text-xs\">{key}</code>,\n value: key,\n }));\n\n selectorNode =\n items.length === 1 ? (\n <p className=\"text-fd-muted-foreground not-prose\">{items[0].label}</p>\n ) : (\n <SelectTabTrigger items={items} />\n );\n wrapper = (children) => <SelectTabs defaultValue={items[0].value}>{children}</SelectTabs>;\n }\n\n return wrapper(\n <AccordionItem value={status}>\n <AccordionHeader>\n <AccordionTrigger className=\"font-mono\">{status}</AccordionTrigger>\n {selectorNode}\n </AccordionHeader>\n <AccordionContent className=\"ps-4.5\">\n {response.description && (\n <div className=\"prose-no-margin mb-2\">{ctx.renderMarkdown(response.description)}</div>\n )}\n {contentTypes.map(async ([type, resType]) => {\n const schema = resType.schema;\n const ts = schema\n ? await 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 : undefined;\n\n return (\n <SelectTab key={type} value={type} className=\"mb-2\">\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 </SelectTab>\n );\n })}\n </AccordionContent>\n </AccordionItem>,\n );\n}\n\nfunction WebhookCallback({\n callback,\n ctx,\n headingLevel,\n}: {\n callback: NoReference<CallbackObject>;\n ctx: RenderContext;\n headingLevel: number;\n}) {\n const pathItems = Object.entries(callback);\n\n return (\n <Accordions type=\"single\" collapsible>\n {pathItems.map(([path, pathItem]) => {\n const pathNodes = methodKeys.map((method) => {\n const operation = pathItem[method];\n if (!operation) return null;\n\n return (\n <div key={method} className=\"border p-3 my-2 @container prose-no-margin rounded-lg\">\n <Operation\n type=\"webhook\"\n path={path}\n headingLevel={headingLevel + 1}\n method={createMethod(method, pathItem, operation)}\n ctx={ctx}\n />\n </div>\n );\n });\n\n return (\n <AccordionItem key={path} value={path}>\n <AccordionHeader>\n <AccordionTrigger className=\"font-mono\">{path}</AccordionTrigger>\n </AccordionHeader>\n <AccordionContent>{pathNodes}</AccordionContent>\n </AccordionItem>\n );\n })}\n </Accordions>\n );\n}\n\nfunction AuthScheme({\n scheme,\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=\"Authorization\"\n type={\n scheme.type === 'http' && scheme.scheme === 'basic' ? `Basic <token>` : 'Bearer <token>'\n }\n deprecated={scheme.deprecated}\n scopes={scopes}\n >\n {scheme.description && ctx.renderMarkdown(scheme.description)}\n <p>\n In: <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 In: <code>{scheme.in}</code>\n </p>\n </AuthProperty>\n );\n }\n\n if (scheme.type === 'openIdConnect') {\n return (\n <AuthProperty\n name=\"OpenID Connect\"\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: string;\n type: string;\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 && <Badge color=\"red\">Deprecated</Badge>}\n </div>\n <div className=\"prose-no-margin pt-2.5 empty:hidden\">\n {props.children}\n {scopes.length > 0 && (\n <p>\n Scope: <code>{scopes.join(', ')}</code>\n </p>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -13,4 +13,5 @@ interface ExampleRequestItem {
13
13
  encoded: RequestData;
14
14
  }
15
15
  //#endregion
16
- export { ExampleRequestItem };
16
+ export { ExampleRequestItem };
17
+ //# sourceMappingURL=request-tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-tabs.d.ts","names":[],"sources":["../../../src/ui/operation/request-tabs.tsx"],"mappings":";;;;;;;UAiBiB,kBAAA;EACf,EAAA;EACA,IAAA;EACA,WAAA;EACA,IAAA,EAAM,cAAA;EACN,OAAA,EAAS,WAAA;AAAA"}
@@ -154,4 +154,5 @@ function renderRequestTabsDefault(items, ctx) {
154
154
  }
155
155
 
156
156
  //#endregion
157
- export { RequestTabs, getExampleRequests };
157
+ export { RequestTabs, getExampleRequests };
158
+ //# sourceMappingURL=request-tabs.js.map