fumadocs-openapi 10.2.2 → 10.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. package/dist/generate-file.d.ts +53 -49
  2. package/dist/generate-file.d.ts.map +1 -1
  3. package/dist/generate-file.js +88 -102
  4. package/dist/generate-file.js.map +1 -0
  5. package/dist/index.d.ts +6 -6
  6. package/dist/index.js +3 -1
  7. package/dist/playground/client.d.ts +88 -72
  8. package/dist/playground/client.d.ts.map +1 -1
  9. package/dist/playground/client.js +446 -296
  10. package/dist/playground/client.js.map +1 -0
  11. package/dist/playground/components/inputs.js +395 -172
  12. package/dist/playground/components/inputs.js.map +1 -0
  13. package/dist/playground/components/oauth-dialog.js +270 -174
  14. package/dist/playground/components/oauth-dialog.js.map +1 -0
  15. package/dist/playground/components/server-select.js +115 -55
  16. package/dist/playground/components/server-select.js.map +1 -0
  17. package/dist/playground/fetcher.d.ts +10 -18
  18. package/dist/playground/fetcher.d.ts.map +1 -1
  19. package/dist/playground/fetcher.js +67 -75
  20. package/dist/playground/fetcher.js.map +1 -0
  21. package/dist/playground/get-default-values.js +23 -26
  22. package/dist/playground/get-default-values.js.map +1 -0
  23. package/dist/playground/index.d.ts +23 -13
  24. package/dist/playground/index.d.ts.map +1 -1
  25. package/dist/playground/index.js +87 -91
  26. package/dist/playground/index.js.map +1 -0
  27. package/dist/playground/lazy.js +9 -2
  28. package/dist/playground/lazy.js.map +1 -0
  29. package/dist/playground/schema.d.ts +18 -55
  30. package/dist/playground/schema.d.ts.map +1 -1
  31. package/dist/playground/schema.js +117 -106
  32. package/dist/playground/schema.js.map +1 -0
  33. package/dist/playground/status-info.js +49 -37
  34. package/dist/playground/status-info.js.map +1 -0
  35. package/dist/requests/generators/csharp.js +40 -50
  36. package/dist/requests/generators/csharp.js.map +1 -0
  37. package/dist/requests/generators/curl.js +28 -27
  38. package/dist/requests/generators/curl.js.map +1 -0
  39. package/dist/requests/generators/go.js +39 -35
  40. package/dist/requests/generators/go.js.map +1 -0
  41. package/dist/requests/generators/index.js +49 -43
  42. package/dist/requests/generators/index.js.map +1 -0
  43. package/dist/requests/generators/java.js +56 -67
  44. package/dist/requests/generators/java.js.map +1 -0
  45. package/dist/requests/generators/javascript.js +38 -45
  46. package/dist/requests/generators/javascript.js.map +1 -0
  47. package/dist/requests/generators/python.js +33 -37
  48. package/dist/requests/generators/python.js.map +1 -0
  49. package/dist/requests/media/adapter.d.ts +38 -84
  50. package/dist/requests/media/adapter.d.ts.map +1 -1
  51. package/dist/requests/media/adapter.js +122 -169
  52. package/dist/requests/media/adapter.js.map +1 -0
  53. package/dist/requests/media/encode.d.ts +12 -7
  54. package/dist/requests/media/encode.d.ts.map +1 -1
  55. package/dist/requests/media/encode.js +129 -109
  56. package/dist/requests/media/encode.js.map +1 -0
  57. package/dist/requests/media/resolve-adapter.js +28 -28
  58. package/dist/requests/media/resolve-adapter.js.map +1 -0
  59. package/dist/requests/string-utils.js +28 -35
  60. package/dist/requests/string-utils.js.map +1 -0
  61. package/dist/requests/to-python-object.js +16 -28
  62. package/dist/requests/to-python-object.js.map +1 -0
  63. package/dist/requests/types.d.ts +25 -21
  64. package/dist/requests/types.d.ts.map +1 -1
  65. package/dist/scalar/client.js +57 -20
  66. package/dist/scalar/client.js.map +1 -0
  67. package/dist/scalar/index.d.ts +8 -2
  68. package/dist/scalar/index.d.ts.map +1 -1
  69. package/dist/scalar/index.js +29 -19
  70. package/dist/scalar/index.js.map +1 -0
  71. package/dist/server/create.d.ts +29 -25
  72. package/dist/server/create.d.ts.map +1 -1
  73. package/dist/server/create.js +42 -39
  74. package/dist/server/create.js.map +1 -0
  75. package/dist/server/index.d.ts +3 -3
  76. package/dist/server/index.js +4 -2
  77. package/dist/server/proxy.d.ts +28 -28
  78. package/dist/server/proxy.d.ts.map +1 -1
  79. package/dist/server/proxy.js +58 -75
  80. package/dist/server/proxy.js.map +1 -0
  81. package/dist/server/source-api.d.ts +32 -29
  82. package/dist/server/source-api.d.ts.map +1 -1
  83. package/dist/server/source-api.js +82 -75
  84. package/dist/server/source-api.js.map +1 -0
  85. package/dist/types.d.ts +41 -36
  86. package/dist/types.d.ts.map +1 -1
  87. package/dist/ui/api-page.d.ts +140 -136
  88. package/dist/ui/api-page.d.ts.map +1 -1
  89. package/dist/ui/api-page.js +134 -118
  90. package/dist/ui/api-page.js.map +1 -0
  91. package/dist/ui/client/index.d.ts +30 -26
  92. package/dist/ui/client/index.d.ts.map +1 -1
  93. package/dist/ui/client/index.js +8 -2
  94. package/dist/ui/client/index.js.map +1 -0
  95. package/dist/ui/client/storage-key.js +16 -10
  96. package/dist/ui/client/storage-key.js.map +1 -0
  97. package/dist/ui/components/accordion.js +40 -14
  98. package/dist/ui/components/accordion.js.map +1 -0
  99. package/dist/ui/components/dialog.js +51 -15
  100. package/dist/ui/components/dialog.js.map +1 -0
  101. package/dist/ui/components/input.js +18 -8
  102. package/dist/ui/components/input.js.map +1 -0
  103. package/dist/ui/components/method-label.js +38 -33
  104. package/dist/ui/components/method-label.js.map +1 -0
  105. package/dist/ui/components/select.js +66 -15
  106. package/dist/ui/components/select.js.map +1 -0
  107. package/dist/ui/contexts/api.js +96 -85
  108. package/dist/ui/contexts/api.js.map +1 -0
  109. package/dist/ui/contexts/api.lazy.js +9 -2
  110. package/dist/ui/contexts/api.lazy.js.map +1 -0
  111. package/dist/ui/index.d.ts +2 -2
  112. package/dist/ui/index.js +3 -1
  113. package/dist/ui/operation/client.js +65 -27
  114. package/dist/ui/operation/client.js.map +1 -0
  115. package/dist/ui/operation/index.js +403 -186
  116. package/dist/ui/operation/index.js.map +1 -0
  117. package/dist/ui/operation/request-tabs.d.ts +15 -16
  118. package/dist/ui/operation/request-tabs.d.ts.map +1 -1
  119. package/dist/ui/operation/request-tabs.js +151 -131
  120. package/dist/ui/operation/request-tabs.js.map +1 -0
  121. package/dist/ui/operation/response-tabs.d.ts +27 -28
  122. package/dist/ui/operation/response-tabs.d.ts.map +1 -1
  123. package/dist/ui/operation/response-tabs.js +73 -56
  124. package/dist/ui/operation/response-tabs.js.map +1 -0
  125. package/dist/ui/operation/usage-tabs/client.js +117 -88
  126. package/dist/ui/operation/usage-tabs/client.js.map +1 -0
  127. package/dist/ui/operation/usage-tabs/index.d.ts +22 -21
  128. package/dist/ui/operation/usage-tabs/index.d.ts.map +1 -1
  129. package/dist/ui/operation/usage-tabs/index.js +63 -48
  130. package/dist/ui/operation/usage-tabs/index.js.map +1 -0
  131. package/dist/ui/operation/usage-tabs/lazy.js +11 -4
  132. package/dist/ui/operation/usage-tabs/lazy.js.map +1 -0
  133. package/dist/ui/schema/client.d.ts +11 -7
  134. package/dist/ui/schema/client.d.ts.map +1 -1
  135. package/dist/ui/schema/client.js +213 -127
  136. package/dist/ui/schema/client.js.map +1 -0
  137. package/dist/ui/schema/index.d.ts +51 -50
  138. package/dist/ui/schema/index.d.ts.map +1 -1
  139. package/dist/ui/schema/index.js +225 -248
  140. package/dist/ui/schema/index.js.map +1 -0
  141. package/dist/ui/schema/lazy.js +9 -2
  142. package/dist/ui/schema/lazy.js.map +1 -0
  143. package/dist/utils/cn.js +3 -1
  144. package/dist/utils/deep-equal.js +18 -26
  145. package/dist/utils/deep-equal.js.map +1 -0
  146. package/dist/utils/get-typescript-schema.js +21 -19
  147. package/dist/utils/get-typescript-schema.js.map +1 -0
  148. package/dist/utils/id-to-title.js +13 -16
  149. package/dist/utils/id-to-title.js.map +1 -0
  150. package/dist/utils/lazy.js +13 -11
  151. package/dist/utils/lazy.js.map +1 -0
  152. package/dist/utils/merge-schema.js +130 -174
  153. package/dist/utils/merge-schema.js.map +1 -0
  154. package/dist/utils/pages/builder.d.ts +80 -76
  155. package/dist/utils/pages/builder.d.ts.map +1 -1
  156. package/dist/utils/pages/builder.js +101 -118
  157. package/dist/utils/pages/builder.js.map +1 -0
  158. package/dist/utils/pages/preset-auto.d.ts +58 -55
  159. package/dist/utils/pages/preset-auto.d.ts.map +1 -1
  160. package/dist/utils/pages/preset-auto.js +124 -137
  161. package/dist/utils/pages/preset-auto.js.map +1 -0
  162. package/dist/utils/pages/to-body.js +21 -18
  163. package/dist/utils/pages/to-body.js.map +1 -0
  164. package/dist/utils/pages/to-static-data.js +48 -40
  165. package/dist/utils/pages/to-static-data.js.map +1 -0
  166. package/dist/utils/pages/to-text.d.ts +43 -41
  167. package/dist/utils/pages/to-text.d.ts.map +1 -1
  168. package/dist/utils/pages/to-text.js +93 -126
  169. package/dist/utils/pages/to-text.js.map +1 -0
  170. package/dist/utils/process-document.d.ts +18 -19
  171. package/dist/utils/process-document.d.ts.map +1 -1
  172. package/dist/utils/process-document.js +43 -54
  173. package/dist/utils/process-document.js.map +1 -0
  174. package/dist/utils/remove-undefined.js +18 -18
  175. package/dist/utils/remove-undefined.js.map +1 -0
  176. package/dist/utils/schema-to-string.js +46 -64
  177. package/dist/utils/schema-to-string.js.map +1 -0
  178. package/dist/utils/schema.d.ts +11 -27
  179. package/dist/utils/schema.d.ts.map +1 -1
  180. package/dist/utils/schema.js +43 -44
  181. package/dist/utils/schema.js.map +1 -0
  182. package/dist/utils/url.js +35 -56
  183. package/dist/utils/url.js.map +1 -0
  184. package/dist/utils/use-query.js +39 -33
  185. package/dist/utils/use-query.js.map +1 -0
  186. package/package.json +33 -32
  187. package/dist/index.d.ts.map +0 -1
  188. package/dist/playground/components/inputs.d.ts +0 -25
  189. package/dist/playground/components/inputs.d.ts.map +0 -1
  190. package/dist/playground/components/oauth-dialog.d.ts +0 -13
  191. package/dist/playground/components/oauth-dialog.d.ts.map +0 -1
  192. package/dist/playground/components/server-select.d.ts +0 -3
  193. package/dist/playground/components/server-select.d.ts.map +0 -1
  194. package/dist/playground/get-default-values.d.ts +0 -3
  195. package/dist/playground/get-default-values.d.ts.map +0 -1
  196. package/dist/playground/lazy.d.ts +0 -2
  197. package/dist/playground/lazy.d.ts.map +0 -1
  198. package/dist/playground/status-info.d.ts +0 -8
  199. package/dist/playground/status-info.d.ts.map +0 -1
  200. package/dist/requests/generators/csharp.d.ts +0 -3
  201. package/dist/requests/generators/csharp.d.ts.map +0 -1
  202. package/dist/requests/generators/curl.d.ts +0 -3
  203. package/dist/requests/generators/curl.d.ts.map +0 -1
  204. package/dist/requests/generators/go.d.ts +0 -3
  205. package/dist/requests/generators/go.d.ts.map +0 -1
  206. package/dist/requests/generators/index.d.ts +0 -3
  207. package/dist/requests/generators/index.d.ts.map +0 -1
  208. package/dist/requests/generators/java.d.ts +0 -3
  209. package/dist/requests/generators/java.d.ts.map +0 -1
  210. package/dist/requests/generators/javascript.d.ts +0 -3
  211. package/dist/requests/generators/javascript.d.ts.map +0 -1
  212. package/dist/requests/generators/python.d.ts +0 -3
  213. package/dist/requests/generators/python.d.ts.map +0 -1
  214. package/dist/requests/media/resolve-adapter.d.ts +0 -19
  215. package/dist/requests/media/resolve-adapter.d.ts.map +0 -1
  216. package/dist/requests/string-utils.d.ts +0 -7
  217. package/dist/requests/string-utils.d.ts.map +0 -1
  218. package/dist/requests/to-python-object.d.ts +0 -2
  219. package/dist/requests/to-python-object.d.ts.map +0 -1
  220. package/dist/requests/types.js +0 -1
  221. package/dist/scalar/client.d.ts +0 -7
  222. package/dist/scalar/client.d.ts.map +0 -1
  223. package/dist/server/index.d.ts.map +0 -1
  224. package/dist/types.js +0 -1
  225. package/dist/ui/client/storage-key.d.ts +0 -9
  226. package/dist/ui/client/storage-key.d.ts.map +0 -1
  227. package/dist/ui/components/accordion.d.ts +0 -8
  228. package/dist/ui/components/accordion.d.ts.map +0 -1
  229. package/dist/ui/components/dialog.d.ts +0 -20
  230. package/dist/ui/components/dialog.d.ts.map +0 -1
  231. package/dist/ui/components/input.d.ts +0 -6
  232. package/dist/ui/components/input.d.ts.map +0 -1
  233. package/dist/ui/components/method-label.d.ts +0 -10
  234. package/dist/ui/components/method-label.d.ts.map +0 -1
  235. package/dist/ui/components/select.d.ts +0 -14
  236. package/dist/ui/components/select.d.ts.map +0 -1
  237. package/dist/ui/contexts/api.d.ts +0 -33
  238. package/dist/ui/contexts/api.d.ts.map +0 -1
  239. package/dist/ui/contexts/api.lazy.d.ts +0 -2
  240. package/dist/ui/contexts/api.lazy.d.ts.map +0 -1
  241. package/dist/ui/icons.d.ts +0 -49
  242. package/dist/ui/icons.d.ts.map +0 -1
  243. package/dist/ui/icons.js +0 -281
  244. package/dist/ui/index.d.ts.map +0 -1
  245. package/dist/ui/operation/client.d.ts +0 -19
  246. package/dist/ui/operation/client.d.ts.map +0 -1
  247. package/dist/ui/operation/index.d.ts +0 -12
  248. package/dist/ui/operation/index.d.ts.map +0 -1
  249. package/dist/ui/operation/usage-tabs/client.d.ts +0 -23
  250. package/dist/ui/operation/usage-tabs/client.d.ts.map +0 -1
  251. package/dist/ui/operation/usage-tabs/lazy.d.ts +0 -4
  252. package/dist/ui/operation/usage-tabs/lazy.d.ts.map +0 -1
  253. package/dist/ui/schema/lazy.d.ts +0 -2
  254. package/dist/ui/schema/lazy.d.ts.map +0 -1
  255. package/dist/utils/cn.d.ts +0 -2
  256. package/dist/utils/cn.d.ts.map +0 -1
  257. package/dist/utils/deep-equal.d.ts +0 -2
  258. package/dist/utils/deep-equal.d.ts.map +0 -1
  259. package/dist/utils/get-typescript-schema.d.ts +0 -4
  260. package/dist/utils/get-typescript-schema.d.ts.map +0 -1
  261. package/dist/utils/id-to-title.d.ts +0 -2
  262. package/dist/utils/id-to-title.d.ts.map +0 -1
  263. package/dist/utils/lazy.d.ts +0 -5
  264. package/dist/utils/lazy.d.ts.map +0 -1
  265. package/dist/utils/merge-schema.d.ts +0 -7
  266. package/dist/utils/merge-schema.d.ts.map +0 -1
  267. package/dist/utils/pages/to-body.d.ts +0 -4
  268. package/dist/utils/pages/to-body.d.ts.map +0 -1
  269. package/dist/utils/pages/to-static-data.d.ts +0 -10
  270. package/dist/utils/pages/to-static-data.d.ts.map +0 -1
  271. package/dist/utils/remove-undefined.d.ts +0 -2
  272. package/dist/utils/remove-undefined.d.ts.map +0 -1
  273. package/dist/utils/schema-to-string.d.ts +0 -8
  274. package/dist/utils/schema-to-string.d.ts.map +0 -1
  275. package/dist/utils/url.d.ts +0 -11
  276. package/dist/utils/url.d.ts.map +0 -1
  277. package/dist/utils/use-query.d.ts +0 -8
  278. package/dist/utils/use-query.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputs.js","names":["value"],"sources":["../../../src/playground/components/inputs.tsx"],"sourcesContent":["'use client';\nimport { type ComponentProps, type HTMLAttributes, type ReactNode, useState } from 'react';\nimport { ChevronDown, Plus, Trash2, X } from 'lucide-react';\nimport { useController, useFieldArray, useFormContext } from 'react-hook-form';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/ui/components/select';\nimport { Input, labelVariants } from '@/ui/components/input';\nimport { getDefaultValue } from '../get-default-values';\nimport { cn } from '@/utils/cn';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport { FormatFlags, schemaToString } from '@/utils/schema-to-string';\nimport { anyFields, useFieldInfo, useResolvedSchema, useSchemaScope } from '@/playground/schema';\nimport type { ParsedSchema } from '@/utils/schema';\n\nfunction FieldLabel(props: ComponentProps<'label'>) {\n return (\n <label {...props} className={cn('w-full inline-flex items-center gap-0.5', props.className)}>\n {props.children}\n </label>\n );\n}\n\nfunction FieldLabelName({\n required = false,\n ...props\n}: ComponentProps<'span'> & { required?: boolean }) {\n return (\n <span {...props} className={cn(labelVariants(), 'font-mono me-auto', props.className)}>\n {props.children}\n {required && <span className=\"text-red-400/80 mx-1\">*</span>}\n </span>\n );\n}\n\nfunction FieldLabelType(props: ComponentProps<'code'>) {\n return (\n <code {...props} className={cn('text-xs text-fd-muted-foreground', props.className)}>\n {props.children}\n </code>\n );\n}\n\nexport function ObjectInput({\n field: _field,\n fieldName,\n ...props\n}: {\n field: Exclude<ParsedSchema, boolean>;\n fieldName: string;\n} & ComponentProps<'div'>) {\n const field = useResolvedSchema(_field);\n\n return (\n <div {...props} className={cn('grid grid-cols-1 gap-4 @md:grid-cols-2', props.className)}>\n {Object.entries(field.properties ?? {}).map(([key, child]) => (\n <FieldSet\n key={key}\n name={key}\n field={child}\n fieldName={`${fieldName}.${key}`}\n isRequired={field.required?.includes(key)}\n />\n ))}\n {(field.additionalProperties || field.patternProperties) && (\n <DynamicProperties\n fieldName={fieldName}\n filterKey={(v) => !field.properties || !Object.keys(field.properties).includes(v)}\n getType={(key) => {\n for (const pattern in field.patternProperties) {\n if (key.match(RegExp(pattern))) {\n return field.patternProperties[pattern];\n }\n }\n\n if (field.additionalProperties) return field.additionalProperties;\n\n return anyFields;\n }}\n />\n )}\n </div>\n );\n}\n\nexport function JsonInput({ fieldName }: { fieldName: string }) {\n const controller = useController({\n name: fieldName,\n });\n const [error, setError] = useState<string | null>(null);\n const [value, setValue] = useState(() => JSON.stringify(controller.field.value, null, 2));\n\n return (\n <div className=\"flex flex-col bg-fd-secondary text-fd-secondary-foreground overflow-hidden border rounded-lg\">\n <textarea\n {...controller.field}\n value={value}\n className=\"p-2 h-[240px] text-sm font-mono resize-none focus-visible:outline-none\"\n onChange={(v) => {\n setValue(v.target.value);\n try {\n controller.field.onChange(JSON.parse(v.target.value));\n setError(null);\n } catch (e) {\n if (e instanceof Error) setError(e.message);\n }\n }}\n />\n <p className=\"p-2 text-xs font-mono border-t text-red-400 empty:hidden\">{error}</p>\n </div>\n );\n}\n\nfunction DynamicProperties({\n fieldName,\n filterKey = () => true,\n getType = () => anyFields,\n}: {\n fieldName: string;\n filterKey?: (key: string) => boolean;\n getType: (key: string) => ParsedSchema;\n}) {\n const { control, setValue, getValues } = useFormContext();\n const [nextName, setNextName] = useState('');\n const [properties, setProperties] = useState<string[]>(() => {\n const value = getValues(fieldName);\n if (value) return Object.keys(value).filter(filterKey);\n\n return [];\n });\n\n const onAppend = () => {\n const name = nextName.trim();\n if (name.length === 0) return;\n\n setProperties((p) => {\n if (p.includes(name) || !filterKey(name)) return p;\n const type = getType(name);\n\n setValue(`${fieldName}.${name}`, getDefaultValue(type));\n setNextName('');\n return [...p, name];\n });\n };\n\n return (\n <>\n {properties.map((item) => {\n const type = getType(item);\n\n return (\n <FieldSet\n key={item}\n name={item}\n field={type}\n fieldName={`${fieldName}.${item}`}\n toolbar={\n <button\n type=\"button\"\n aria-label=\"Remove Item\"\n className={cn(\n buttonVariants({\n color: 'outline',\n size: 'icon-xs',\n }),\n )}\n onClick={() => {\n setProperties((p) => p.filter((prop) => prop !== item));\n control.unregister(`${fieldName}.${item}`);\n }}\n >\n <Trash2 />\n </button>\n }\n />\n );\n })}\n <div className=\"flex gap-2 col-span-full\">\n <Input\n value={nextName}\n placeholder=\"Enter Property Name\"\n onChange={(e) => setNextName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n onAppend();\n e.preventDefault();\n }\n }}\n />\n <button\n type=\"button\"\n className={cn(buttonVariants({ color: 'secondary', size: 'sm' }), 'px-4')}\n onClick={onAppend}\n >\n New\n </button>\n </div>\n </>\n );\n}\n\nexport function FieldInput({\n field,\n fieldName,\n isRequired,\n ...props\n}: HTMLAttributes<HTMLElement> & {\n field: Exclude<ParsedSchema, boolean>;\n isRequired?: boolean;\n fieldName: string;\n}) {\n const form = useFormContext();\n const {\n field: { value, onChange, ...restField },\n fieldState,\n } = useController({\n control: form.control,\n name: fieldName,\n });\n\n if (field.type === 'null') return;\n\n if (field.type === 'string' && field.format === 'binary') {\n return (\n <div {...props}>\n <label\n htmlFor={fieldName}\n className={cn(\n buttonVariants({\n color: 'secondary',\n className: 'w-full h-9 gap-2 truncate',\n }),\n )}\n >\n {value instanceof File ? (\n <>\n <span className=\"text-fd-muted-foreground text-xs\">Selected</span>\n <span className=\"truncate w-0 flex-1 text-end\">{value.name}</span>\n </>\n ) : (\n <span className=\"text-fd-muted-foreground\">Upload</span>\n )}\n </label>\n <input\n id={fieldName}\n type=\"file\"\n multiple={false}\n onChange={(e) => {\n if (!e.target.files) return;\n onChange(e.target.files.item(0));\n }}\n hidden\n {...restField}\n />\n </div>\n );\n }\n\n if (field.type === 'boolean') {\n return (\n <Select\n value={String(value)}\n onValueChange={(value) => onChange(value === 'undefined' ? undefined : value === 'true')}\n disabled={restField.disabled}\n >\n <SelectTrigger id={fieldName} className={props.className} {...restField}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"true\">True</SelectItem>\n <SelectItem value=\"false\">False</SelectItem>\n {!isRequired && <SelectItem value=\"undefined\">Unset</SelectItem>}\n </SelectContent>\n </Select>\n );\n }\n\n const isNumber = field.type === 'integer' || field.type === 'number';\n\n return (\n <div {...props} className={cn('flex flex-row gap-2', props.className)}>\n <Input\n id={fieldName}\n placeholder=\"Enter value\"\n type={isNumber ? 'number' : 'text'}\n step={field.type === 'integer' ? 1 : undefined}\n value={value ?? ''}\n onChange={(e) => {\n if (isNumber && !Number.isNaN(e.target.valueAsNumber)) {\n onChange(e.target.valueAsNumber);\n } else if (!isNumber) {\n onChange(e.target.value);\n }\n }}\n {...restField}\n />\n {fieldState.isDirty && (\n <button\n type=\"button\"\n // TODO: `react-hook-form` doesn't support setting a value to `undefined` (aka remove the value), if there's a default value defined.\n // the default value is kept by `react-hook-form` internally, we cannot manipulate it.\n // hence, we can only support resetting to the default value.\n // perhaps when we migrate to Tanstack Form, we can reconsider this.\n onClick={() => form.resetField(fieldName)}\n className=\"text-fd-muted-foreground\"\n >\n <X className=\"size-4\" />\n </button>\n )}\n </div>\n );\n}\n\nexport function FieldSet({\n field: _field,\n fieldName,\n toolbar,\n name,\n isRequired,\n depth = 0,\n slotType,\n collapsible = true,\n ...props\n}: HTMLAttributes<HTMLElement> & {\n isRequired?: boolean;\n name?: ReactNode;\n field: ParsedSchema;\n fieldName: string;\n depth?: number;\n\n slotType?: ReactNode;\n toolbar?: ReactNode;\n collapsible?: boolean;\n}) {\n const { readOnly, writeOnly } = useSchemaScope();\n const field = useResolvedSchema(_field);\n const [show, setShow] = useState(!collapsible);\n const { info, updateInfo } = useFieldInfo(fieldName, field, depth);\n\n if (_field === false) return;\n if (field.readOnly && !readOnly) return;\n if (field.writeOnly && !writeOnly) return;\n\n if (info.unionField) {\n const union = field[info.unionField]!;\n const showSelect = union.length > 1;\n\n return (\n <FieldSet\n {...props}\n name={name}\n fieldName={fieldName}\n isRequired={isRequired}\n field={union[info.oneOf]}\n depth={depth + 1}\n slotType={showSelect ? false : slotType}\n toolbar={\n <>\n {showSelect && (\n <select\n className=\"text-xs font-mono\"\n value={info.oneOf}\n onChange={(e) => {\n updateInfo({\n oneOf: Number(e.target.value),\n });\n }}\n >\n {union.map((item, i) => (\n <option key={i} value={i} className=\"bg-fd-popover text-fd-popover-foreground\">\n {schemaToString(item, undefined, FormatFlags.UseAlias)}\n </option>\n ))}\n </select>\n )}\n {toolbar}\n </>\n }\n />\n );\n }\n\n if (Array.isArray(field.type)) {\n const showSelect = field.type.length > 1;\n\n return (\n <FieldSet\n {...props}\n name={name}\n fieldName={fieldName}\n isRequired={isRequired}\n field={{\n ...field,\n type: info.selectedType,\n }}\n depth={depth + 1}\n slotType={showSelect ? false : slotType}\n toolbar={\n <>\n {showSelect && (\n <select\n className=\"text-xs font-mono\"\n value={info.selectedType}\n onChange={(e) => {\n updateInfo({\n selectedType: e.target.value,\n });\n }}\n >\n {field.type.map((item) => (\n <option\n key={item}\n value={item}\n className=\"bg-fd-popover text-fd-popover-foreground\"\n >\n {item}\n </option>\n ))}\n </select>\n )}\n {toolbar}\n </>\n }\n />\n );\n }\n\n const showBn = collapsible && (\n <button\n type=\"button\"\n onClick={() => setShow((prev) => !prev)}\n className={cn(\n buttonVariants({\n size: 'icon-xs',\n color: 'ghost',\n className: 'text-fd-muted-foreground -ms-1',\n }),\n )}\n >\n <ChevronDown className={cn(show && 'rotate-180')} />\n </button>\n );\n\n if (field.type === 'object' || info.intersection) {\n return (\n <fieldset\n {...props}\n className={cn('flex flex-col gap-1.5 col-span-full @container', props.className)}\n >\n <FieldLabel htmlFor={fieldName}>\n {showBn}\n <FieldLabelName required={isRequired}>{name}</FieldLabelName>\n {slotType ?? <FieldLabelType>{schemaToString(field)}</FieldLabelType>}\n {toolbar}\n </FieldLabel>\n {show && (\n <ObjectInput\n field={info.intersection?.merged ?? field}\n fieldName={fieldName}\n {...props}\n className={cn(\n 'rounded-lg border border-fd-primary/20 bg-fd-background/50 p-2 shadow-sm',\n props.className,\n )}\n />\n )}\n </fieldset>\n );\n }\n\n if (field.type === 'array') {\n return (\n <fieldset {...props} className={cn('flex flex-col gap-1.5 col-span-full', props.className)}>\n <FieldLabel htmlFor={fieldName}>\n {showBn}\n <FieldLabelName required={isRequired}>{name}</FieldLabelName>\n {slotType ?? <FieldLabelType>{schemaToString(field)}</FieldLabelType>}\n {toolbar}\n </FieldLabel>\n {show && (\n <ArrayInput\n fieldName={fieldName}\n items={field.items ?? anyFields}\n {...props}\n className={cn(\n 'rounded-lg border border-fd-primary/20 bg-fd-background/50 p-2 shadow-sm',\n props.className,\n )}\n />\n )}\n </fieldset>\n );\n }\n return (\n <fieldset {...props} className={cn('flex flex-col gap-1.5', props.className)}>\n <FieldLabel htmlFor={fieldName}>\n <FieldLabelName required={isRequired}>{name}</FieldLabelName>\n {slotType ?? <FieldLabelType>{schemaToString(field)}</FieldLabelType>}\n {toolbar}\n </FieldLabel>\n <FieldInput field={field} fieldName={fieldName} isRequired={isRequired} />\n </fieldset>\n );\n}\n\nfunction ArrayInput({\n fieldName,\n items,\n ...props\n}: {\n fieldName: string;\n items: ParsedSchema;\n} & ComponentProps<'div'>) {\n const name = fieldName.split('.').at(-1) ?? '';\n const { fields, append, remove } = useFieldArray({\n name: fieldName,\n });\n\n return (\n <div {...props} className={cn('flex flex-col gap-2', props.className)}>\n {fields.map((item, index) => (\n <FieldSet\n key={item.id}\n name={\n <span className=\"text-fd-muted-foreground\">\n {name}[{index}]\n </span>\n }\n field={items}\n isRequired\n fieldName={`${fieldName}.${index}`}\n toolbar={\n <button\n type=\"button\"\n aria-label=\"Remove Item\"\n className={cn(\n buttonVariants({\n color: 'outline',\n size: 'icon-xs',\n }),\n )}\n onClick={() => remove(index)}\n >\n <Trash2 />\n </button>\n }\n />\n ))}\n <button\n type=\"button\"\n className={cn(\n buttonVariants({\n color: 'secondary',\n className: 'gap-1.5 py-2',\n size: 'sm',\n }),\n )}\n onClick={() => {\n append(getDefaultValue(items));\n }}\n >\n <Plus className=\"size-4\" />\n New Item\n </button>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,177 +1,273 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from '../../ui/components/dialog.js';
3
- import { useForm } from 'react-hook-form';
4
- import { Input, labelVariants } from '../../ui/components/input.js';
5
- import { useQuery } from '../../utils/use-query.js';
6
- import { useEffect, useState } from 'react';
7
- import { cn } from '../../utils/cn.js';
8
- import { buttonVariants } from 'fumadocs-ui/components/ui/button';
9
- import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../../ui/components/select.js';
1
+ import { cn } from "../../utils/cn.js";
2
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../../ui/components/select.js";
3
+ import { Input, labelVariants } from "../../ui/components/input.js";
4
+ import { useQuery } from "../../utils/use-query.js";
5
+ import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from "../../ui/components/dialog.js";
6
+ import { useEffect, useState } from "react";
7
+ import { useForm } from "react-hook-form";
8
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
9
+ import { buttonVariants } from "fumadocs-ui/components/ui/button";
10
+
11
+ //#region src/playground/components/oauth-dialog.tsx
10
12
  const FlowTypes = {
11
- password: {
12
- name: 'Resource Owner Password Flow',
13
- description: 'Authenticate using username and password.',
14
- },
15
- clientCredentials: {
16
- name: 'Client Credentials',
17
- description: 'Intended for the server-to-server authentication.',
18
- },
19
- authorizationCode: {
20
- name: 'Authorization code',
21
- description: 'Authenticate with 3rd party services',
22
- },
23
- implicit: {
24
- name: 'Implicit',
25
- description: 'Retrieve the access token directly.',
26
- },
13
+ password: {
14
+ name: "Resource Owner Password Flow",
15
+ description: "Authenticate using username and password."
16
+ },
17
+ clientCredentials: {
18
+ name: "Client Credentials",
19
+ description: "Intended for the server-to-server authentication."
20
+ },
21
+ authorizationCode: {
22
+ name: "Authorization code",
23
+ description: "Authenticate with 3rd party services"
24
+ },
25
+ implicit: {
26
+ name: "Implicit",
27
+ description: "Retrieve the access token directly."
28
+ }
27
29
  };
28
- export function OauthDialog({ scheme, scopes, setToken, children, open, setOpen, }) {
29
- const [type, setType] = useState(() => {
30
- return Object.keys(scheme.flows)[0];
31
- });
32
- const form = useForm({
33
- defaultValues: {
34
- clientId: '',
35
- clientSecret: '',
36
- username: '',
37
- password: '',
38
- },
39
- });
40
- const authCodeCallback = useQuery(async (code, state) => {
41
- const value = scheme.flows.authorizationCode;
42
- const res = await fetch(value.tokenUrl, {
43
- method: 'POST',
44
- headers: {
45
- 'Content-Type': 'application/x-www-form-urlencoded',
46
- },
47
- body: new URLSearchParams({
48
- grant_type: 'authorization_code',
49
- code,
50
- // note: `state` could be invalid, but server will check it
51
- redirect_uri: state.redirect_uri,
52
- client_id: state.client_id,
53
- client_secret: state.client_secret,
54
- }),
55
- });
56
- if (!res.ok)
57
- throw new Error(await res.text());
58
- const { access_token, token_type = 'Bearer' } = (await res.json());
59
- setToken(`${token_type} ${access_token}`);
60
- setOpen(false);
61
- });
62
- useEffect(() => {
63
- if (scheme.flows.authorizationCode) {
64
- const params = new URLSearchParams(window.location.search);
65
- const state = params.get('state');
66
- const code = params.get('code');
67
- if (state && code) {
68
- const parsedState = JSON.parse(state);
69
- setOpen(true);
70
- form.setValue('clientId', parsedState.client_id);
71
- form.setValue('clientSecret', parsedState.client_secret);
72
- authCodeCallback.start(code, parsedState);
73
- window.history.replaceState(null, '', window.location.pathname);
74
- return;
75
- }
76
- }
77
- if (scheme.flows.implicit && window.location.hash.length > 1) {
78
- const params = new URLSearchParams(window.location.hash.slice(1));
79
- const state = params.get('state');
80
- const token = params.get('access_token');
81
- const type = params.get('token_type') ?? 'Bearer';
82
- if (state && token) {
83
- const parsedState = JSON.parse(state);
84
- form.setValue('clientId', parsedState.client_id);
85
- setToken(`${type} ${token}`);
86
- window.history.replaceState(null, '', window.location.pathname);
87
- }
88
- }
89
- // eslint-disable-next-line react-hooks/exhaustive-deps -- first page load only
90
- }, []);
91
- const authorize = useQuery(async (values) => {
92
- if (type === 'implicit') {
93
- const value = scheme.flows[type];
94
- const params = new URLSearchParams();
95
- params.set('response_type', 'token');
96
- params.set('client_id', values.clientId);
97
- params.set('redirect_uri', window.location.href);
98
- params.set('scope', scopes.join('+'));
99
- params.set('state', JSON.stringify({
100
- client_id: values.clientId,
101
- redirect_uri: window.location.href,
102
- }));
103
- window.location.replace(`${value.authorizationUrl}?${params.toString()}`);
104
- return;
105
- }
106
- if (type === 'authorizationCode') {
107
- const value = scheme.flows[type];
108
- const params = new URLSearchParams();
109
- params.set('response_type', 'code');
110
- params.set('client_id', values.clientId);
111
- params.set('redirect_uri', window.location.href);
112
- params.set('scope', scopes.join('+'));
113
- params.set('state', JSON.stringify({
114
- client_id: values.clientId,
115
- client_secret: values.clientSecret,
116
- redirect_uri: window.location.href,
117
- }));
118
- window.location.replace(`${value.authorizationUrl}?${params.toString()}`);
119
- return;
120
- }
121
- let res;
122
- if (type === 'password') {
123
- const value = scheme.flows[type];
124
- res = await fetch(value.tokenUrl, {
125
- method: 'POST',
126
- headers: {
127
- 'Content-Type': 'application/x-www-form-urlencoded',
128
- },
129
- body: new URLSearchParams({
130
- grant_type: 'password',
131
- username: values.username,
132
- password: values.password,
133
- scope: scopes.join('+'),
134
- }),
135
- });
136
- }
137
- if (type === 'clientCredentials') {
138
- const value = scheme.flows[type];
139
- res = await fetch(value.tokenUrl, {
140
- method: 'POST',
141
- headers: {
142
- 'Content-Type': 'application/x-www-form-urlencoded',
143
- },
144
- body: new URLSearchParams({
145
- grant_type: 'client_credentials',
146
- client_id: values.clientId,
147
- client_secret: values.clientSecret,
148
- scope: scopes.join('+'),
149
- }),
150
- });
151
- }
152
- if (res) {
153
- if (!res.ok)
154
- throw new Error(await res.text());
155
- const { access_token, token_type = 'Bearer' } = (await res.json());
156
- setToken(`${token_type} ${access_token}`);
157
- setOpen(false);
158
- }
159
- });
160
- const onSubmit = form.handleSubmit((values) => {
161
- return authorize.start(values);
162
- });
163
- const isLoading = authorize.isLoading || authCodeCallback.isLoading;
164
- const error = authCodeCallback.error ?? authorize.error;
165
- return (_jsxs(Dialog, { open: open, onOpenChange: setOpen, children: [children, _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Authorization" }), _jsx(DialogDescription, { children: "Obtain the access token for API." })] }), _jsxs("form", { className: "flex flex-col gap-6", onSubmit: (e) => {
166
- void onSubmit(e);
167
- e.stopPropagation();
168
- }, children: [_jsxs(Select, { value: type, onValueChange: setType, children: [_jsx(SelectTrigger, { children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: Object.keys(scheme.flows).map((key) => {
169
- const { name, description } = FlowTypes[key];
170
- return (_jsxs(SelectItem, { value: key, children: [_jsx("p", { className: "font-medium", children: name }), _jsx("p", { className: "text-fd-muted-foreground", children: description })] }, key));
171
- }) })] }), (type === 'authorizationCode' ||
172
- type === 'clientCredentials' ||
173
- type === 'implicit') && (_jsxs("fieldset", { className: "flex flex-col gap-1.5", children: [_jsx("label", { htmlFor: "client_id", className: cn(labelVariants()), children: "Client ID" }), _jsx("p", { className: "text-fd-muted-foreground text-sm", children: "The client ID of your OAuth application." }), _jsx(Input, { id: "client_id", placeholder: "Enter value", type: "text", autoComplete: "off", disabled: isLoading, ...form.register('clientId', { required: true }) })] })), (type === 'authorizationCode' || type === 'clientCredentials') && (_jsxs("fieldset", { className: "flex flex-col gap-1.5", children: [_jsx("label", { htmlFor: "client_secret", className: cn(labelVariants()), children: "Client Secret" }), _jsx("p", { className: "text-fd-muted-foreground text-sm", children: "The client secret of your OAuth application." }), _jsx(Input, { id: "client_secret", placeholder: "Enter value", type: "password", autoComplete: "off", disabled: isLoading, ...form.register('clientSecret', { required: true }) })] })), type === 'password' && (_jsxs(_Fragment, { children: [_jsxs("fieldset", { className: "flex flex-col gap-1.5", children: [_jsx("label", { htmlFor: "username", className: cn(labelVariants()), children: "Username" }), _jsx(Input, { id: "username", placeholder: "Enter value", type: "text", disabled: isLoading, autoComplete: "off", ...form.register('username', { required: true }) })] }), _jsxs("fieldset", { className: "flex flex-col gap-1.5", children: [_jsx("label", { htmlFor: "password", className: cn(labelVariants()), children: "Client Secret" }), _jsx(Input, { id: "password", placeholder: "Enter value", type: "password", autoComplete: "off", disabled: isLoading, ...form.register('password', { required: true }) })] })] })), error ? (_jsx("p", { className: "text-red-400 font-medium text-sm", children: String(error) })) : null, _jsx("button", { type: "submit", disabled: isLoading, className: cn(buttonVariants({
174
- color: 'primary',
175
- })), children: authCodeCallback.isLoading ? 'Fetching token...' : 'Submit' })] })] })] }));
30
+ function OauthDialog({ scheme, scopes, setToken, children, open, setOpen }) {
31
+ const [type, setType] = useState(() => {
32
+ return Object.keys(scheme.flows)[0];
33
+ });
34
+ const form = useForm({ defaultValues: {
35
+ clientId: "",
36
+ clientSecret: "",
37
+ username: "",
38
+ password: ""
39
+ } });
40
+ const authCodeCallback = useQuery(async (code, state) => {
41
+ const value = scheme.flows.authorizationCode;
42
+ const res = await fetch(value.tokenUrl, {
43
+ method: "POST",
44
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
45
+ body: new URLSearchParams({
46
+ grant_type: "authorization_code",
47
+ code,
48
+ redirect_uri: state.redirect_uri,
49
+ client_id: state.client_id,
50
+ client_secret: state.client_secret
51
+ })
52
+ });
53
+ if (!res.ok) throw new Error(await res.text());
54
+ const { access_token, token_type = "Bearer" } = await res.json();
55
+ setToken(`${token_type} ${access_token}`);
56
+ setOpen(false);
57
+ });
58
+ useEffect(() => {
59
+ if (scheme.flows.authorizationCode) {
60
+ const params = new URLSearchParams(window.location.search);
61
+ const state = params.get("state");
62
+ const code = params.get("code");
63
+ if (state && code) {
64
+ const parsedState = JSON.parse(state);
65
+ setOpen(true);
66
+ form.setValue("clientId", parsedState.client_id);
67
+ form.setValue("clientSecret", parsedState.client_secret);
68
+ authCodeCallback.start(code, parsedState);
69
+ window.history.replaceState(null, "", window.location.pathname);
70
+ return;
71
+ }
72
+ }
73
+ if (scheme.flows.implicit && window.location.hash.length > 1) {
74
+ const params = new URLSearchParams(window.location.hash.slice(1));
75
+ const state = params.get("state");
76
+ const token = params.get("access_token");
77
+ const type$1 = params.get("token_type") ?? "Bearer";
78
+ if (state && token) {
79
+ const parsedState = JSON.parse(state);
80
+ form.setValue("clientId", parsedState.client_id);
81
+ setToken(`${type$1} ${token}`);
82
+ window.history.replaceState(null, "", window.location.pathname);
83
+ }
84
+ }
85
+ }, []);
86
+ const authorize = useQuery(async (values) => {
87
+ if (type === "implicit") {
88
+ const value = scheme.flows[type];
89
+ const params = new URLSearchParams();
90
+ params.set("response_type", "token");
91
+ params.set("client_id", values.clientId);
92
+ params.set("redirect_uri", window.location.href);
93
+ params.set("scope", scopes.join("+"));
94
+ params.set("state", JSON.stringify({
95
+ client_id: values.clientId,
96
+ redirect_uri: window.location.href
97
+ }));
98
+ window.location.replace(`${value.authorizationUrl}?${params.toString()}`);
99
+ return;
100
+ }
101
+ if (type === "authorizationCode") {
102
+ const value = scheme.flows[type];
103
+ const params = new URLSearchParams();
104
+ params.set("response_type", "code");
105
+ params.set("client_id", values.clientId);
106
+ params.set("redirect_uri", window.location.href);
107
+ params.set("scope", scopes.join("+"));
108
+ params.set("state", JSON.stringify({
109
+ client_id: values.clientId,
110
+ client_secret: values.clientSecret,
111
+ redirect_uri: window.location.href
112
+ }));
113
+ window.location.replace(`${value.authorizationUrl}?${params.toString()}`);
114
+ return;
115
+ }
116
+ let res;
117
+ if (type === "password") {
118
+ const value = scheme.flows[type];
119
+ res = await fetch(value.tokenUrl, {
120
+ method: "POST",
121
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
122
+ body: new URLSearchParams({
123
+ grant_type: "password",
124
+ username: values.username,
125
+ password: values.password,
126
+ scope: scopes.join("+")
127
+ })
128
+ });
129
+ }
130
+ if (type === "clientCredentials") {
131
+ const value = scheme.flows[type];
132
+ res = await fetch(value.tokenUrl, {
133
+ method: "POST",
134
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
135
+ body: new URLSearchParams({
136
+ grant_type: "client_credentials",
137
+ client_id: values.clientId,
138
+ client_secret: values.clientSecret,
139
+ scope: scopes.join("+")
140
+ })
141
+ });
142
+ }
143
+ if (res) {
144
+ if (!res.ok) throw new Error(await res.text());
145
+ const { access_token, token_type = "Bearer" } = await res.json();
146
+ setToken(`${token_type} ${access_token}`);
147
+ setOpen(false);
148
+ }
149
+ });
150
+ const onSubmit = form.handleSubmit((values) => {
151
+ return authorize.start(values);
152
+ });
153
+ const isLoading = authorize.isLoading || authCodeCallback.isLoading;
154
+ const error = authCodeCallback.error ?? authorize.error;
155
+ return /* @__PURE__ */ jsxs(Dialog, {
156
+ open,
157
+ onOpenChange: setOpen,
158
+ children: [children, /* @__PURE__ */ jsxs(DialogContent, { children: [/* @__PURE__ */ jsxs(DialogHeader, { children: [/* @__PURE__ */ jsx(DialogTitle, { children: "Authorization" }), /* @__PURE__ */ jsx(DialogDescription, { children: "Obtain the access token for API." })] }), /* @__PURE__ */ jsxs("form", {
159
+ className: "flex flex-col gap-6",
160
+ onSubmit: (e) => {
161
+ onSubmit(e);
162
+ e.stopPropagation();
163
+ },
164
+ children: [
165
+ /* @__PURE__ */ jsxs(Select, {
166
+ value: type,
167
+ onValueChange: setType,
168
+ children: [/* @__PURE__ */ jsx(SelectTrigger, { children: /* @__PURE__ */ jsx(SelectValue, {}) }), /* @__PURE__ */ jsx(SelectContent, { children: Object.keys(scheme.flows).map((key) => {
169
+ const { name, description } = FlowTypes[key];
170
+ return /* @__PURE__ */ jsxs(SelectItem, {
171
+ value: key,
172
+ children: [/* @__PURE__ */ jsx("p", {
173
+ className: "font-medium",
174
+ children: name
175
+ }), /* @__PURE__ */ jsx("p", {
176
+ className: "text-fd-muted-foreground",
177
+ children: description
178
+ })]
179
+ }, key);
180
+ }) })]
181
+ }),
182
+ (type === "authorizationCode" || type === "clientCredentials" || type === "implicit") && /* @__PURE__ */ jsxs("fieldset", {
183
+ className: "flex flex-col gap-1.5",
184
+ children: [
185
+ /* @__PURE__ */ jsx("label", {
186
+ htmlFor: "client_id",
187
+ className: cn(labelVariants()),
188
+ children: "Client ID"
189
+ }),
190
+ /* @__PURE__ */ jsx("p", {
191
+ className: "text-fd-muted-foreground text-sm",
192
+ children: "The client ID of your OAuth application."
193
+ }),
194
+ /* @__PURE__ */ jsx(Input, {
195
+ id: "client_id",
196
+ placeholder: "Enter value",
197
+ type: "text",
198
+ autoComplete: "off",
199
+ disabled: isLoading,
200
+ ...form.register("clientId", { required: true })
201
+ })
202
+ ]
203
+ }),
204
+ (type === "authorizationCode" || type === "clientCredentials") && /* @__PURE__ */ jsxs("fieldset", {
205
+ className: "flex flex-col gap-1.5",
206
+ children: [
207
+ /* @__PURE__ */ jsx("label", {
208
+ htmlFor: "client_secret",
209
+ className: cn(labelVariants()),
210
+ children: "Client Secret"
211
+ }),
212
+ /* @__PURE__ */ jsx("p", {
213
+ className: "text-fd-muted-foreground text-sm",
214
+ children: "The client secret of your OAuth application."
215
+ }),
216
+ /* @__PURE__ */ jsx(Input, {
217
+ id: "client_secret",
218
+ placeholder: "Enter value",
219
+ type: "password",
220
+ autoComplete: "off",
221
+ disabled: isLoading,
222
+ ...form.register("clientSecret", { required: true })
223
+ })
224
+ ]
225
+ }),
226
+ type === "password" && /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs("fieldset", {
227
+ className: "flex flex-col gap-1.5",
228
+ children: [/* @__PURE__ */ jsx("label", {
229
+ htmlFor: "username",
230
+ className: cn(labelVariants()),
231
+ children: "Username"
232
+ }), /* @__PURE__ */ jsx(Input, {
233
+ id: "username",
234
+ placeholder: "Enter value",
235
+ type: "text",
236
+ disabled: isLoading,
237
+ autoComplete: "off",
238
+ ...form.register("username", { required: true })
239
+ })]
240
+ }), /* @__PURE__ */ jsxs("fieldset", {
241
+ className: "flex flex-col gap-1.5",
242
+ children: [/* @__PURE__ */ jsx("label", {
243
+ htmlFor: "password",
244
+ className: cn(labelVariants()),
245
+ children: "Client Secret"
246
+ }), /* @__PURE__ */ jsx(Input, {
247
+ id: "password",
248
+ placeholder: "Enter value",
249
+ type: "password",
250
+ autoComplete: "off",
251
+ disabled: isLoading,
252
+ ...form.register("password", { required: true })
253
+ })]
254
+ })] }),
255
+ error ? /* @__PURE__ */ jsx("p", {
256
+ className: "text-red-400 font-medium text-sm",
257
+ children: String(error)
258
+ }) : null,
259
+ /* @__PURE__ */ jsx("button", {
260
+ type: "submit",
261
+ disabled: isLoading,
262
+ className: cn(buttonVariants({ color: "primary" })),
263
+ children: authCodeCallback.isLoading ? "Fetching token..." : "Submit"
264
+ })
265
+ ]
266
+ })] })]
267
+ });
176
268
  }
177
- export const OauthDialogTrigger = DialogTrigger;
269
+ const OauthDialogTrigger = DialogTrigger;
270
+
271
+ //#endregion
272
+ export { OauthDialog, OauthDialogTrigger };
273
+ //# sourceMappingURL=oauth-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-dialog.js","names":["type"],"sources":["../../../src/playground/components/oauth-dialog.tsx"],"sourcesContent":["import {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from '@/ui/components/dialog';\nimport type { OpenAPIV3_1 } from 'openapi-types';\nimport { useForm } from 'react-hook-form';\nimport { Input, labelVariants } from '@/ui/components/input';\nimport { useQuery } from '@/utils/use-query';\nimport { type ReactNode, useEffect, useState } from 'react';\nimport { cn } from '@/utils/cn';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/ui/components/select';\n\ntype FlowType = keyof OpenAPIV3_1.OAuth2SecurityScheme['flows'];\n\nexport interface AuthDialogProps {\n scheme: OpenAPIV3_1.OAuth2SecurityScheme;\n scopes: string[];\n\n open: boolean;\n setOpen: (v: boolean) => void;\n setToken: (token: string) => void;\n children: ReactNode;\n}\n\ninterface FormValues {\n clientId: string;\n clientSecret: string;\n username: string;\n password: string;\n}\n\ninterface AuthCodeState {\n redirect_uri: string;\n client_id: string;\n client_secret: string;\n}\n\ninterface ImplicitState {\n redirect_uri: string;\n client_id: string;\n}\n\nconst FlowTypes = {\n password: {\n name: 'Resource Owner Password Flow',\n description: 'Authenticate using username and password.',\n },\n clientCredentials: {\n name: 'Client Credentials',\n description: 'Intended for the server-to-server authentication.',\n },\n authorizationCode: {\n name: 'Authorization code',\n description: 'Authenticate with 3rd party services',\n },\n implicit: {\n name: 'Implicit',\n description: 'Retrieve the access token directly.',\n },\n} as const;\n\nexport function OauthDialog({\n scheme,\n scopes,\n setToken,\n children,\n open,\n setOpen,\n}: AuthDialogProps) {\n const [type, setType] = useState(() => {\n return Object.keys(scheme.flows)[0] as FlowType;\n });\n\n const form = useForm<FormValues>({\n defaultValues: {\n clientId: '',\n clientSecret: '',\n username: '',\n password: '',\n },\n });\n\n const authCodeCallback = useQuery(async (code: string, state: AuthCodeState) => {\n const value = scheme.flows.authorizationCode!;\n\n const res = await fetch(value.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n grant_type: 'authorization_code',\n code,\n // note: `state` could be invalid, but server will check it\n redirect_uri: state.redirect_uri,\n client_id: state.client_id,\n client_secret: state.client_secret,\n }),\n });\n\n if (!res.ok) throw new Error(await res.text());\n const { access_token, token_type = 'Bearer' } = (await res.json()) as {\n access_token: string;\n token_type?: string;\n };\n\n setToken(`${token_type} ${access_token}`);\n setOpen(false);\n });\n\n useEffect(() => {\n if (scheme.flows.authorizationCode) {\n const params = new URLSearchParams(window.location.search);\n const state = params.get('state');\n const code = params.get('code');\n\n if (state && code) {\n const parsedState = JSON.parse(state) as AuthCodeState;\n setOpen(true);\n\n form.setValue('clientId', parsedState.client_id);\n form.setValue('clientSecret', parsedState.client_secret);\n authCodeCallback.start(code, parsedState);\n window.history.replaceState(null, '', window.location.pathname);\n return;\n }\n }\n\n if (scheme.flows.implicit && window.location.hash.length > 1) {\n const params = new URLSearchParams(window.location.hash.slice(1));\n const state = params.get('state');\n const token = params.get('access_token');\n const type = params.get('token_type') ?? 'Bearer';\n\n if (state && token) {\n const parsedState = JSON.parse(state) as ImplicitState;\n\n form.setValue('clientId', parsedState.client_id);\n setToken(`${type} ${token}`);\n window.history.replaceState(null, '', window.location.pathname);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- first page load only\n }, []);\n\n const authorize = useQuery(async (values: FormValues) => {\n if (type === 'implicit') {\n const value = scheme.flows[type]!;\n\n const params = new URLSearchParams();\n params.set('response_type', 'token');\n params.set('client_id', values.clientId);\n params.set('redirect_uri', window.location.href);\n params.set('scope', scopes.join('+'));\n params.set(\n 'state',\n JSON.stringify({\n client_id: values.clientId,\n redirect_uri: window.location.href,\n } satisfies ImplicitState),\n );\n\n window.location.replace(`${value.authorizationUrl}?${params.toString()}`);\n return;\n }\n if (type === 'authorizationCode') {\n const value = scheme.flows[type]!;\n\n const params = new URLSearchParams();\n params.set('response_type', 'code');\n params.set('client_id', values.clientId);\n params.set('redirect_uri', window.location.href);\n params.set('scope', scopes.join('+'));\n params.set(\n 'state',\n JSON.stringify({\n client_id: values.clientId,\n client_secret: values.clientSecret,\n redirect_uri: window.location.href,\n } satisfies AuthCodeState),\n );\n\n window.location.replace(`${value.authorizationUrl}?${params.toString()}`);\n return;\n }\n\n let res;\n if (type === 'password') {\n const value = scheme.flows[type]!;\n\n res = await fetch(value.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n grant_type: 'password',\n username: values.username,\n password: values.password,\n scope: scopes.join('+'),\n }),\n });\n }\n\n if (type === 'clientCredentials') {\n const value = scheme.flows[type]!;\n\n res = await fetch(value.tokenUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: values.clientId,\n client_secret: values.clientSecret,\n scope: scopes.join('+'),\n }),\n });\n }\n\n if (res) {\n if (!res.ok) throw new Error(await res.text());\n\n const { access_token, token_type = 'Bearer' } = (await res.json()) as {\n access_token: string;\n token_type?: string;\n };\n\n setToken(`${token_type} ${access_token}`);\n setOpen(false);\n }\n });\n\n const onSubmit = form.handleSubmit((values) => {\n return authorize.start(values);\n });\n\n const isLoading = authorize.isLoading || authCodeCallback.isLoading;\n const error = authCodeCallback.error ?? authorize.error;\n\n return (\n <Dialog open={open} onOpenChange={setOpen}>\n {children}\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Authorization</DialogTitle>\n <DialogDescription>Obtain the access token for API.</DialogDescription>\n </DialogHeader>\n <form\n className=\"flex flex-col gap-6\"\n onSubmit={(e) => {\n void onSubmit(e);\n e.stopPropagation();\n }}\n >\n <Select value={type} onValueChange={setType as (s: string) => void}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {Object.keys(scheme.flows).map((key) => {\n const { name, description } = FlowTypes[key as FlowType];\n\n return (\n <SelectItem key={key} value={key}>\n <p className=\"font-medium\">{name}</p>\n <p className=\"text-fd-muted-foreground\">{description}</p>\n </SelectItem>\n );\n })}\n </SelectContent>\n </Select>\n\n {(type === 'authorizationCode' ||\n type === 'clientCredentials' ||\n type === 'implicit') && (\n <fieldset className=\"flex flex-col gap-1.5\">\n <label htmlFor=\"client_id\" className={cn(labelVariants())}>\n Client ID\n </label>\n <p className=\"text-fd-muted-foreground text-sm\">\n The client ID of your OAuth application.\n </p>\n <Input\n id=\"client_id\"\n placeholder=\"Enter value\"\n type=\"text\"\n autoComplete=\"off\"\n disabled={isLoading}\n {...form.register('clientId', { required: true })}\n />\n </fieldset>\n )}\n {(type === 'authorizationCode' || type === 'clientCredentials') && (\n <fieldset className=\"flex flex-col gap-1.5\">\n <label htmlFor=\"client_secret\" className={cn(labelVariants())}>\n Client Secret\n </label>\n <p className=\"text-fd-muted-foreground text-sm\">\n The client secret of your OAuth application.\n </p>\n <Input\n id=\"client_secret\"\n placeholder=\"Enter value\"\n type=\"password\"\n autoComplete=\"off\"\n disabled={isLoading}\n {...form.register('clientSecret', { required: true })}\n />\n </fieldset>\n )}\n {type === 'password' && (\n <>\n <fieldset className=\"flex flex-col gap-1.5\">\n <label htmlFor=\"username\" className={cn(labelVariants())}>\n Username\n </label>\n <Input\n id=\"username\"\n placeholder=\"Enter value\"\n type=\"text\"\n disabled={isLoading}\n autoComplete=\"off\"\n {...form.register('username', { required: true })}\n />\n </fieldset>\n <fieldset className=\"flex flex-col gap-1.5\">\n <label htmlFor=\"password\" className={cn(labelVariants())}>\n Client Secret\n </label>\n <Input\n id=\"password\"\n placeholder=\"Enter value\"\n type=\"password\"\n autoComplete=\"off\"\n disabled={isLoading}\n {...form.register('password', { required: true })}\n />\n </fieldset>\n </>\n )}\n {error ? <p className=\"text-red-400 font-medium text-sm\">{String(error)}</p> : null}\n <button\n type=\"submit\"\n disabled={isLoading}\n className={cn(\n buttonVariants({\n color: 'primary',\n }),\n )}\n >\n {authCodeCallback.isLoading ? 'Fetching token...' : 'Submit'}\n </button>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport const OauthDialogTrigger = DialogTrigger;\n"],"mappings":"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"}