zudoku 0.0.0-feat-openapi-docs-redesign.dab3fc6a → 0.0.0-feat-navigation-at-property.z8cd07fa5

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 (656) hide show
  1. package/dist/app/main.d.ts +6 -6
  2. package/dist/app/main.js +1 -1
  3. package/dist/app/main.js.map +1 -1
  4. package/dist/app/sentry.js +1 -1
  5. package/dist/cli/common/version-check.js +12 -3
  6. package/dist/cli/common/version-check.js.map +1 -1
  7. package/dist/config/create-plugin.d.ts +2 -0
  8. package/dist/config/create-plugin.js +55 -0
  9. package/dist/config/create-plugin.js.map +1 -0
  10. package/dist/config/loader.js +3 -1
  11. package/dist/config/loader.js.map +1 -1
  12. package/dist/config/validators/BuildSchema.js +18 -3
  13. package/dist/config/validators/BuildSchema.js.map +1 -1
  14. package/dist/config/validators/InputNavigationSchema.d.ts +133 -45
  15. package/dist/config/validators/InputNavigationSchema.js +30 -0
  16. package/dist/config/validators/InputNavigationSchema.js.map +1 -1
  17. package/dist/config/validators/NavigationSchema.d.ts +18 -4
  18. package/dist/config/validators/NavigationSchema.js +15 -5
  19. package/dist/config/validators/NavigationSchema.js.map +1 -1
  20. package/dist/config/validators/ProtectedRoutesSchema.d.ts +1 -1
  21. package/dist/config/validators/validate.d.ts +104 -14
  22. package/dist/config/validators/validate.js +15 -4
  23. package/dist/config/validators/validate.js.map +1 -1
  24. package/dist/config/validators/validate.test.js +43 -0
  25. package/dist/config/validators/validate.test.js.map +1 -1
  26. package/dist/flat-config.d.ts +68 -32
  27. package/dist/index.d.ts +4 -2
  28. package/dist/index.js +3 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/lib/auth/issuer.js +1 -1
  31. package/dist/lib/auth/issuer.js.map +1 -1
  32. package/dist/lib/authentication/authentication.d.ts +3 -2
  33. package/dist/lib/authentication/components/CallbackHandler.js +1 -1
  34. package/dist/lib/authentication/components/CallbackHandler.js.map +1 -1
  35. package/dist/lib/authentication/components/SignIn.js +4 -2
  36. package/dist/lib/authentication/components/SignIn.js.map +1 -1
  37. package/dist/lib/authentication/components/SignUp.js +4 -2
  38. package/dist/lib/authentication/components/SignUp.js.map +1 -1
  39. package/dist/lib/authentication/hook.d.ts +2 -0
  40. package/dist/lib/authentication/hook.js +10 -0
  41. package/dist/lib/authentication/hook.js.map +1 -1
  42. package/dist/lib/authentication/providers/auth0.js +17 -8
  43. package/dist/lib/authentication/providers/auth0.js.map +1 -1
  44. package/dist/lib/authentication/providers/clerk.js +0 -22
  45. package/dist/lib/authentication/providers/clerk.js.map +1 -1
  46. package/dist/lib/authentication/providers/firebase.js +67 -9
  47. package/dist/lib/authentication/providers/firebase.js.map +1 -1
  48. package/dist/lib/authentication/providers/supabase.js +6 -15
  49. package/dist/lib/authentication/providers/supabase.js.map +1 -1
  50. package/dist/lib/authentication/ui/EmailVerificationUi.d.ts +4 -0
  51. package/dist/lib/authentication/ui/EmailVerificationUi.js +34 -0
  52. package/dist/lib/authentication/ui/EmailVerificationUi.js.map +1 -0
  53. package/dist/lib/authentication/ui/ZudokuAuthUi.d.ts +7 -2
  54. package/dist/lib/authentication/ui/ZudokuAuthUi.js +48 -12
  55. package/dist/lib/authentication/ui/ZudokuAuthUi.js.map +1 -1
  56. package/dist/lib/authentication/utils/relativeRedirectUrl.d.ts +1 -0
  57. package/dist/lib/authentication/utils/relativeRedirectUrl.js +8 -0
  58. package/dist/lib/authentication/utils/relativeRedirectUrl.js.map +1 -0
  59. package/dist/lib/components/Bootstrap.js +1 -2
  60. package/dist/lib/components/Bootstrap.js.map +1 -1
  61. package/dist/lib/components/Heading.d.ts +1 -1
  62. package/dist/lib/components/Mermaid.d.ts +7 -0
  63. package/dist/lib/components/Mermaid.js +42 -0
  64. package/dist/lib/components/Mermaid.js.map +1 -0
  65. package/dist/lib/components/MobileTopNavigation.js +3 -2
  66. package/dist/lib/components/MobileTopNavigation.js.map +1 -1
  67. package/dist/lib/components/PagefindSearchMeta.d.ts +8 -0
  68. package/dist/lib/components/PagefindSearchMeta.js +7 -0
  69. package/dist/lib/components/PagefindSearchMeta.js.map +1 -0
  70. package/dist/lib/components/Pagination.js +2 -2
  71. package/dist/lib/components/Pagination.js.map +1 -1
  72. package/dist/lib/components/Slot.test.js +1 -1
  73. package/dist/lib/components/Slot.test.js.map +1 -1
  74. package/dist/lib/components/TopNavigation.d.ts +7 -1
  75. package/dist/lib/components/TopNavigation.js +8 -3
  76. package/dist/lib/components/TopNavigation.js.map +1 -1
  77. package/dist/lib/components/Zudoku.d.ts +4 -1
  78. package/dist/lib/components/Zudoku.js +5 -11
  79. package/dist/lib/components/Zudoku.js.map +1 -1
  80. package/dist/lib/components/context/ZudokuContext.d.ts +9 -4
  81. package/dist/lib/components/context/ZudokuContext.js +26 -8
  82. package/dist/lib/components/context/ZudokuContext.js.map +1 -1
  83. package/dist/lib/components/context/ZudokuProvider.js +1 -1
  84. package/dist/lib/components/context/ZudokuProvider.js.map +1 -1
  85. package/dist/lib/components/context/ZudokuReactContext.d.ts +11 -0
  86. package/dist/lib/components/context/ZudokuReactContext.js +4 -0
  87. package/dist/lib/components/context/ZudokuReactContext.js.map +1 -0
  88. package/dist/lib/components/index.d.ts +18 -69
  89. package/dist/lib/components/index.js +19 -32
  90. package/dist/lib/components/index.js.map +1 -1
  91. package/dist/lib/components/navigation/Navigation.js +4 -3
  92. package/dist/lib/components/navigation/Navigation.js.map +1 -1
  93. package/dist/lib/components/navigation/NavigationCategory.js +8 -0
  94. package/dist/lib/components/navigation/NavigationCategory.js.map +1 -1
  95. package/dist/lib/components/navigation/NavigationFilterContext.d.ts +8 -0
  96. package/dist/lib/components/navigation/NavigationFilterContext.js +12 -0
  97. package/dist/lib/components/navigation/NavigationFilterContext.js.map +1 -0
  98. package/dist/lib/components/navigation/NavigationFilterInput.d.ts +3 -0
  99. package/dist/lib/components/navigation/NavigationFilterInput.js +9 -0
  100. package/dist/lib/components/navigation/NavigationFilterInput.js.map +1 -0
  101. package/dist/lib/components/navigation/NavigationItem.js +13 -3
  102. package/dist/lib/components/navigation/NavigationItem.js.map +1 -1
  103. package/dist/lib/components/navigation/NavigationWrapper.js +1 -1
  104. package/dist/lib/components/navigation/NavigationWrapper.js.map +1 -1
  105. package/dist/lib/components/navigation/utils.d.ts +6 -1
  106. package/dist/lib/components/navigation/utils.js +26 -2
  107. package/dist/lib/components/navigation/utils.js.map +1 -1
  108. package/dist/lib/core/RouteGuard.js +12 -7
  109. package/dist/lib/core/RouteGuard.js.map +1 -1
  110. package/dist/lib/core/ZudokuContext.d.ts +2 -1
  111. package/dist/lib/core/ZudokuContext.js +3 -1
  112. package/dist/lib/core/ZudokuContext.js.map +1 -1
  113. package/dist/lib/core/__internal.d.ts +1 -0
  114. package/dist/lib/core/__internal.js +2 -0
  115. package/dist/lib/core/__internal.js.map +1 -1
  116. package/dist/lib/core/plugins.d.ts +18 -4
  117. package/dist/lib/core/plugins.js +1 -0
  118. package/dist/lib/core/plugins.js.map +1 -1
  119. package/dist/lib/core/react-query.d.ts +1 -0
  120. package/dist/lib/core/react-query.js +2 -0
  121. package/dist/lib/core/react-query.js.map +1 -0
  122. package/dist/lib/core/transform-config.d.ts +4 -0
  123. package/dist/lib/core/transform-config.js +42 -0
  124. package/dist/lib/core/transform-config.js.map +1 -0
  125. package/dist/lib/core/transform-config.test.d.ts +1 -0
  126. package/dist/lib/core/transform-config.test.js +83 -0
  127. package/dist/lib/core/transform-config.test.js.map +1 -0
  128. package/dist/lib/errors/ErrorAlert.js +1 -2
  129. package/dist/lib/errors/ErrorAlert.js.map +1 -1
  130. package/dist/lib/errors/ErrorMessage.d.ts +3 -0
  131. package/dist/lib/errors/ErrorMessage.js +16 -0
  132. package/dist/lib/errors/ErrorMessage.js.map +1 -0
  133. package/dist/lib/hooks/index.d.ts +7 -28
  134. package/dist/lib/hooks/index.js +7 -15
  135. package/dist/lib/hooks/index.js.map +1 -1
  136. package/dist/lib/hooks/useEvent.test.js +1 -1
  137. package/dist/lib/hooks/useEvent.test.js.map +1 -1
  138. package/dist/lib/navigation/pathMatcher.d.ts +8 -0
  139. package/dist/lib/navigation/pathMatcher.js +62 -0
  140. package/dist/lib/navigation/pathMatcher.js.map +1 -0
  141. package/dist/lib/navigation/pathMatcher.test.d.ts +1 -0
  142. package/dist/lib/navigation/pathMatcher.test.js +115 -0
  143. package/dist/lib/navigation/pathMatcher.test.js.map +1 -0
  144. package/dist/lib/navigation/positionItems.d.ts +10 -0
  145. package/dist/lib/navigation/positionItems.js +54 -0
  146. package/dist/lib/navigation/positionItems.js.map +1 -0
  147. package/dist/lib/navigation/positionItems.test.d.ts +1 -0
  148. package/dist/lib/navigation/positionItems.test.js +229 -0
  149. package/dist/lib/navigation/positionItems.test.js.map +1 -0
  150. package/dist/lib/oas/graphql/circular.d.ts +2 -0
  151. package/dist/lib/oas/graphql/circular.js +21 -16
  152. package/dist/lib/oas/graphql/circular.js.map +1 -1
  153. package/dist/lib/oas/graphql/circular.test.d.ts +1 -0
  154. package/dist/lib/oas/graphql/circular.test.js +183 -0
  155. package/dist/lib/oas/graphql/circular.test.js.map +1 -0
  156. package/dist/lib/oas/graphql/index.js +7 -3
  157. package/dist/lib/oas/graphql/index.js.map +1 -1
  158. package/dist/lib/oas/parser/index.d.ts +1 -0
  159. package/dist/lib/oas/parser/index.js +14 -5
  160. package/dist/lib/oas/parser/index.js.map +1 -1
  161. package/dist/lib/plugins/api-keys/SettingsApiKeys.js +9 -172
  162. package/dist/lib/plugins/api-keys/SettingsApiKeys.js.map +1 -1
  163. package/dist/lib/plugins/api-keys/index.d.ts +11 -4
  164. package/dist/lib/plugins/api-keys/index.js +36 -22
  165. package/dist/lib/plugins/api-keys/index.js.map +1 -1
  166. package/dist/lib/plugins/api-keys/settings/ApiKeyItem.d.ts +12 -0
  167. package/dist/lib/plugins/api-keys/settings/ApiKeyItem.js +133 -0
  168. package/dist/lib/plugins/api-keys/settings/ApiKeyItem.js.map +1 -0
  169. package/dist/lib/plugins/api-keys/settings/ApiKeyList.d.ts +4 -0
  170. package/dist/lib/plugins/api-keys/settings/ApiKeyList.js +33 -0
  171. package/dist/lib/plugins/api-keys/settings/ApiKeyList.js.map +1 -0
  172. package/dist/lib/plugins/api-keys/settings/RevealApiKey.d.ts +6 -0
  173. package/dist/lib/plugins/api-keys/settings/RevealApiKey.js +39 -0
  174. package/dist/lib/plugins/api-keys/settings/RevealApiKey.js.map +1 -0
  175. package/dist/lib/plugins/openapi/DownloadSchemaButton.d.ts +3 -0
  176. package/dist/lib/plugins/openapi/DownloadSchemaButton.js +47 -0
  177. package/dist/lib/plugins/openapi/DownloadSchemaButton.js.map +1 -0
  178. package/dist/lib/plugins/openapi/Endpoint.js +3 -6
  179. package/dist/lib/plugins/openapi/Endpoint.js.map +1 -1
  180. package/dist/lib/plugins/openapi/GeneratedExampleSidecarBox.js +1 -1
  181. package/dist/lib/plugins/openapi/OasProvider.js +26 -13
  182. package/dist/lib/plugins/openapi/OasProvider.js.map +1 -1
  183. package/dist/lib/plugins/openapi/OperationList.js +20 -10
  184. package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
  185. package/dist/lib/plugins/openapi/OperationListItem.js +2 -2
  186. package/dist/lib/plugins/openapi/OperationListItem.js.map +1 -1
  187. package/dist/lib/plugins/openapi/ParamInfos.js +1 -0
  188. package/dist/lib/plugins/openapi/ParamInfos.js.map +1 -1
  189. package/dist/lib/plugins/openapi/ParameterList.js +1 -1
  190. package/dist/lib/plugins/openapi/ParameterList.js.map +1 -1
  191. package/dist/lib/plugins/openapi/ResponsesSidecarBox.d.ts +2 -1
  192. package/dist/lib/plugins/openapi/ResponsesSidecarBox.js +4 -3
  193. package/dist/lib/plugins/openapi/ResponsesSidecarBox.js.map +1 -1
  194. package/dist/lib/plugins/openapi/SchemaList.js +2 -1
  195. package/dist/lib/plugins/openapi/SchemaList.js.map +1 -1
  196. package/dist/lib/plugins/openapi/Sidecar.js +12 -3
  197. package/dist/lib/plugins/openapi/Sidecar.js.map +1 -1
  198. package/dist/lib/plugins/openapi/index.js +11 -5
  199. package/dist/lib/plugins/openapi/index.js.map +1 -1
  200. package/dist/lib/plugins/openapi/interfaces.d.ts +19 -13
  201. package/dist/lib/plugins/openapi/playground/Playground.js +8 -4
  202. package/dist/lib/plugins/openapi/playground/Playground.js.map +1 -1
  203. package/dist/lib/plugins/openapi/playground/fileUtils.d.ts +1 -0
  204. package/dist/lib/plugins/openapi/playground/fileUtils.js +3 -0
  205. package/dist/lib/plugins/openapi/playground/fileUtils.js.map +1 -1
  206. package/dist/lib/plugins/openapi/playground/result-panel/AudioPlayer.d.ts +6 -0
  207. package/dist/lib/plugins/openapi/playground/result-panel/AudioPlayer.js +20 -0
  208. package/dist/lib/plugins/openapi/playground/result-panel/AudioPlayer.js.map +1 -0
  209. package/dist/lib/plugins/openapi/playground/result-panel/ResponseTab.js +7 -2
  210. package/dist/lib/plugins/openapi/playground/result-panel/ResponseTab.js.map +1 -1
  211. package/dist/lib/plugins/openapi/schema/SchemaView.d.ts +1 -1
  212. package/dist/lib/plugins/openapi/schema/SchemaView.js +16 -7
  213. package/dist/lib/plugins/openapi/schema/SchemaView.js.map +1 -1
  214. package/dist/lib/plugins/openapi/schema/utils.d.ts +2 -2
  215. package/dist/lib/plugins/openapi/schema/utils.js +11 -3
  216. package/dist/lib/plugins/openapi/schema/utils.js.map +1 -1
  217. package/dist/lib/plugins/openapi/util/createHttpSnippet.js +24 -1
  218. package/dist/lib/plugins/openapi/util/createHttpSnippet.js.map +1 -1
  219. package/dist/lib/plugins/openapi/util/getRoutes.d.ts +9 -1
  220. package/dist/lib/plugins/openapi/util/getRoutes.js +30 -2
  221. package/dist/lib/plugins/openapi/util/getRoutes.js.map +1 -1
  222. package/dist/lib/plugins/search-pagefind/IndexingDialog.d.ts +3 -0
  223. package/dist/lib/plugins/search-pagefind/IndexingDialog.js +64 -0
  224. package/dist/lib/plugins/search-pagefind/IndexingDialog.js.map +1 -0
  225. package/dist/lib/plugins/search-pagefind/PagefindSearch.js +22 -5
  226. package/dist/lib/plugins/search-pagefind/PagefindSearch.js.map +1 -1
  227. package/dist/lib/plugins/search-pagefind/ResultList.js +5 -4
  228. package/dist/lib/plugins/search-pagefind/ResultList.js.map +1 -1
  229. package/dist/lib/shiki.d.ts +1 -1
  230. package/dist/lib/shiki.js +18 -12
  231. package/dist/lib/shiki.js.map +1 -1
  232. package/dist/lib/ui/Alert.d.ts +3 -2
  233. package/dist/lib/ui/Alert.js +9 -5
  234. package/dist/lib/ui/Alert.js.map +1 -1
  235. package/dist/lib/ui/Button.d.ts +2 -2
  236. package/dist/lib/ui/Button.js +10 -9
  237. package/dist/lib/ui/Button.js.map +1 -1
  238. package/dist/lib/ui/ButtonGroup.d.ts +11 -0
  239. package/dist/lib/ui/ButtonGroup.js +28 -0
  240. package/dist/lib/ui/ButtonGroup.js.map +1 -0
  241. package/dist/lib/ui/Command.d.ts +3 -3
  242. package/dist/lib/ui/Command.js +2 -2
  243. package/dist/lib/ui/Command.js.map +1 -1
  244. package/dist/lib/ui/DropdownMenu.d.ts +21 -23
  245. package/dist/lib/ui/DropdownMenu.js +47 -32
  246. package/dist/lib/ui/DropdownMenu.js.map +1 -1
  247. package/dist/lib/ui/InputGroup.d.ts +16 -0
  248. package/dist/lib/ui/InputGroup.js +65 -0
  249. package/dist/lib/ui/InputGroup.js.map +1 -0
  250. package/dist/lib/ui/Kbd.d.ts +3 -0
  251. package/dist/lib/ui/Kbd.js +10 -0
  252. package/dist/lib/ui/Kbd.js.map +1 -0
  253. package/dist/lib/ui/Secret.js +2 -2
  254. package/dist/lib/ui/Secret.js.map +1 -1
  255. package/dist/lib/util/MdxComponents.d.ts +1 -0
  256. package/dist/lib/util/MdxComponents.js +2 -0
  257. package/dist/lib/util/MdxComponents.js.map +1 -1
  258. package/dist/lib/util/flattenAllOf.d.ts +0 -2
  259. package/dist/lib/util/flattenAllOf.js +0 -23
  260. package/dist/lib/util/flattenAllOf.js.map +1 -1
  261. package/dist/lib/util/flattenAllOf.test.js +69 -13
  262. package/dist/lib/util/flattenAllOf.test.js.map +1 -1
  263. package/dist/lib/util/flattenAllOfProcessor.d.ts +2 -0
  264. package/dist/lib/util/flattenAllOfProcessor.js +48 -0
  265. package/dist/lib/util/flattenAllOfProcessor.js.map +1 -0
  266. package/dist/lib/util/invariant.d.ts +1 -1
  267. package/dist/lib/util/invariant.js +2 -2
  268. package/dist/lib/util/invariant.js.map +1 -1
  269. package/dist/lib/util/readFrontmatter.d.ts +6 -0
  270. package/dist/lib/util/readFrontmatter.js +13 -0
  271. package/dist/lib/util/readFrontmatter.js.map +1 -0
  272. package/dist/vite/api/SchemaManager.d.ts +17 -1
  273. package/dist/vite/api/SchemaManager.js +52 -11
  274. package/dist/vite/api/SchemaManager.js.map +1 -1
  275. package/dist/vite/api/SchemaManager.test.js +111 -0
  276. package/dist/vite/api/SchemaManager.test.js.map +1 -1
  277. package/dist/vite/build.js +91 -73
  278. package/dist/vite/build.js.map +1 -1
  279. package/dist/vite/config.js +16 -1
  280. package/dist/vite/config.js.map +1 -1
  281. package/dist/vite/dev-server.js +25 -0
  282. package/dist/vite/dev-server.js.map +1 -1
  283. package/dist/vite/error-handler.js +1 -5
  284. package/dist/vite/error-handler.js.map +1 -1
  285. package/dist/vite/mdx/remark-inject-filepath.js +5 -1
  286. package/dist/vite/mdx/remark-inject-filepath.js.map +1 -1
  287. package/dist/vite/mdx/remark-last-modified.js +57 -3
  288. package/dist/vite/mdx/remark-last-modified.js.map +1 -1
  289. package/dist/vite/mdx/remark-link-rewrite.js +4 -3
  290. package/dist/vite/mdx/remark-link-rewrite.js.map +1 -1
  291. package/dist/vite/pagefind-dev-index.d.ts +16 -0
  292. package/dist/vite/pagefind-dev-index.js +68 -0
  293. package/dist/vite/pagefind-dev-index.js.map +1 -0
  294. package/dist/vite/plugin-api-keys.js +5 -1
  295. package/dist/vite/plugin-api-keys.js.map +1 -1
  296. package/dist/vite/plugin-api.js +44 -4
  297. package/dist/vite/plugin-api.js.map +1 -1
  298. package/dist/vite/plugin-config.js +16 -4
  299. package/dist/vite/plugin-config.js.map +1 -1
  300. package/dist/vite/plugin-docs.js +9 -7
  301. package/dist/vite/plugin-docs.js.map +1 -1
  302. package/dist/vite/plugin-frontmatter.js +3 -5
  303. package/dist/vite/plugin-frontmatter.js.map +1 -1
  304. package/dist/vite/plugin-markdown-export.js +8 -7
  305. package/dist/vite/plugin-markdown-export.js.map +1 -1
  306. package/dist/vite/plugin-theme.js +2 -1
  307. package/dist/vite/plugin-theme.js.map +1 -1
  308. package/dist/vite/prerender/prerender.js +4 -20
  309. package/dist/vite/prerender/prerender.js.map +1 -1
  310. package/dist/vite/prerender/utils.d.ts +2 -0
  311. package/dist/vite/prerender/utils.js +30 -0
  312. package/dist/vite/prerender/utils.js.map +1 -0
  313. package/dist/vite/prerender/worker.js +6 -1
  314. package/dist/vite/prerender/worker.js.map +1 -1
  315. package/dist/vite/zuplo.d.ts +13 -0
  316. package/dist/vite/zuplo.js +15 -0
  317. package/dist/vite/zuplo.js.map +1 -0
  318. package/lib/ActionButton-B0CXL1Lq.js +25 -0
  319. package/lib/ActionButton-B0CXL1Lq.js.map +1 -0
  320. package/lib/Button-GUVe7pmt.js +54 -0
  321. package/lib/Button-GUVe7pmt.js.map +1 -0
  322. package/lib/{Card-KFniaZn5.js → Card-DCdq37aA.js} +2 -2
  323. package/lib/{Card-KFniaZn5.js.map → Card-DCdq37aA.js.map} +1 -1
  324. package/lib/ClaudeLogo-DoZ7fHHk.js +73 -0
  325. package/lib/ClaudeLogo-DoZ7fHHk.js.map +1 -0
  326. package/lib/{Command-CUcrW3qs.js → Command-N6VujV30.js} +26 -26
  327. package/lib/Command-N6VujV30.js.map +1 -0
  328. package/lib/{Dialog-BQciPiHN.js → Dialog-hlvmmQ_c.js} +2 -2
  329. package/lib/{Dialog-BQciPiHN.js.map → Dialog-hlvmmQ_c.js.map} +1 -1
  330. package/lib/{Drawer-Ci7XwhqT.js → Drawer-Ch7927PF.js} +7 -7
  331. package/lib/{Drawer-Ci7XwhqT.js.map → Drawer-Ch7927PF.js.map} +1 -1
  332. package/lib/DropdownMenu-DN0jNrjj.js +104 -0
  333. package/lib/DropdownMenu-DN0jNrjj.js.map +1 -0
  334. package/lib/Frame-DKlOmSkU.js +205 -0
  335. package/lib/Frame-DKlOmSkU.js.map +1 -0
  336. package/lib/HydrationBoundary-CJu4vUlG.js +601 -0
  337. package/lib/HydrationBoundary-CJu4vUlG.js.map +1 -0
  338. package/lib/IndexingDialog-D0YdGfbn.js +100 -0
  339. package/lib/IndexingDialog-D0YdGfbn.js.map +1 -0
  340. package/lib/Input-Cx-GeKoF.js +22 -0
  341. package/lib/Input-Cx-GeKoF.js.map +1 -0
  342. package/lib/MdxPage-Bc_5OsQ5.js +210 -0
  343. package/lib/MdxPage-Bc_5OsQ5.js.map +1 -0
  344. package/lib/Mermaid-Chx5BPHn.js +104 -0
  345. package/lib/Mermaid-Chx5BPHn.js.map +1 -0
  346. package/lib/{OAuthErrorPage-DnKnq4xK.js → OAuthErrorPage-D-VcZ5cO.js} +26 -23
  347. package/lib/OAuthErrorPage-D-VcZ5cO.js.map +1 -0
  348. package/lib/OasProvider-CZqLHoRo.js +48 -0
  349. package/lib/OasProvider-CZqLHoRo.js.map +1 -0
  350. package/lib/{OperationList-D8EDc9v7.js → OperationList-BmV1XvEY.js} +2136 -2002
  351. package/lib/OperationList-BmV1XvEY.js.map +1 -0
  352. package/lib/RouteGuard-Dns7HD7C.js +77 -0
  353. package/lib/RouteGuard-Dns7HD7C.js.map +1 -0
  354. package/lib/{SchemaList-E6lF7dID.js → SchemaList-D23IyrX5.js} +28 -27
  355. package/lib/SchemaList-D23IyrX5.js.map +1 -0
  356. package/lib/SchemaView-DVbiGPo3.js +438 -0
  357. package/lib/SchemaView-DVbiGPo3.js.map +1 -0
  358. package/lib/Secret-CyhXSA8i.js +263 -0
  359. package/lib/Secret-CyhXSA8i.js.map +1 -0
  360. package/lib/SignUp-DfEe1w5X.js +55 -0
  361. package/lib/SignUp-DfEe1w5X.js.map +1 -0
  362. package/lib/{SyntaxHighlight-C19vH0V_.js → SyntaxHighlight-N2RffYNz.js} +1469 -1411
  363. package/lib/SyntaxHighlight-N2RffYNz.js.map +1 -0
  364. package/lib/{Toc-DbWS75JZ.js → Toc-Cpo_HSYx.js} +3 -3
  365. package/lib/{Toc-DbWS75JZ.js.map → Toc-Cpo_HSYx.js.map} +1 -1
  366. package/lib/{ErrorAlert-_1Zmhr68.js → Zudoku-GbutmWzP.js} +5663 -4482
  367. package/lib/Zudoku-GbutmWzP.js.map +1 -0
  368. package/lib/ZudokuContext-LPkD2SQs.js +250 -0
  369. package/lib/ZudokuContext-LPkD2SQs.js.map +1 -0
  370. package/lib/ZudokuReactContext-DGJAP1sN.js +222 -0
  371. package/lib/ZudokuReactContext-DGJAP1sN.js.map +1 -0
  372. package/lib/chunk-EPOLDU6W-C6C8jAwd.js +8558 -0
  373. package/lib/chunk-EPOLDU6W-C6C8jAwd.js.map +1 -0
  374. package/lib/{circular-BoYo7au5.js → circular-DfSpMuY7.js} +6429 -6019
  375. package/lib/circular-DfSpMuY7.js.map +1 -0
  376. package/lib/{cn-dYga0KKN.js → cn-5-Gd1Dss.js} +531 -498
  377. package/lib/cn-5-Gd1Dss.js.map +1 -0
  378. package/lib/{createServer-B_BZ7xX8.js → createServer-4kaAMuIM.js} +2790 -2737
  379. package/lib/createServer-4kaAMuIM.js.map +1 -0
  380. package/lib/createVariantComponent-Dc0vtOvr.js +18 -0
  381. package/lib/createVariantComponent-Dc0vtOvr.js.map +1 -0
  382. package/lib/{errors-CD873hrG.js → errors-CtZTDEB6.js} +3 -3
  383. package/lib/{errors-CD873hrG.js.map → errors-CtZTDEB6.js.map} +1 -1
  384. package/lib/firebase-D286uF4e.js +7615 -0
  385. package/lib/firebase-D286uF4e.js.map +1 -0
  386. package/lib/hook-DyEn6D2Q.js +53 -0
  387. package/lib/hook-DyEn6D2Q.js.map +1 -0
  388. package/lib/{index-HNVs5cgX.js → index-B7bvsQHg.js} +853 -802
  389. package/lib/index-B7bvsQHg.js.map +1 -0
  390. package/lib/{index-BK0jKRrX.js → index-CVumYRba.js} +2 -2
  391. package/lib/{index-BK0jKRrX.js.map → index-CVumYRba.js.map} +1 -1
  392. package/lib/index-CrcNWbel.js.map +1 -1
  393. package/lib/index-DAWHN3cH.js +86 -0
  394. package/lib/index-DAWHN3cH.js.map +1 -0
  395. package/lib/index.esm-BYObtETB.js.map +1 -1
  396. package/lib/index.esm-BkpWrvLZ.js +34 -0
  397. package/lib/index.esm-BkpWrvLZ.js.map +1 -0
  398. package/lib/{index.esm-BnYHxCYC.js → index.esm-Ca5zvoff.js} +2 -2
  399. package/lib/{index.esm-BnYHxCYC.js.map → index.esm-Ca5zvoff.js.map} +1 -1
  400. package/lib/{invariant-Bm-FVUQE.js → invariant-B_t_F2s_.js} +4 -4
  401. package/lib/invariant-B_t_F2s_.js.map +1 -0
  402. package/lib/jsx-runtime-BzflLqGi.js.map +1 -1
  403. package/lib/{mutation-BSU0xu4m.js → mutation-B7eFBLZY.js} +70 -44
  404. package/lib/mutation-B7eFBLZY.js.map +1 -0
  405. package/lib/ui/Accordion.js +1 -1
  406. package/lib/ui/ActionButton.js +2 -2
  407. package/lib/ui/Alert.js +32 -20
  408. package/lib/ui/Alert.js.map +1 -1
  409. package/lib/ui/AlertDialog.js +1 -1
  410. package/lib/ui/Badge.js +1 -1
  411. package/lib/ui/Breadcrumb.js +1 -1
  412. package/lib/ui/Button.js +27 -25
  413. package/lib/ui/Button.js.map +1 -1
  414. package/lib/ui/ButtonGroup.js +77 -0
  415. package/lib/ui/ButtonGroup.js.map +1 -0
  416. package/lib/ui/Callout.js +1 -1
  417. package/lib/ui/Card.js +1 -1
  418. package/lib/ui/Carousel.js +1 -1
  419. package/lib/ui/Carousel.js.map +1 -1
  420. package/lib/ui/Checkbox.js +1 -1
  421. package/lib/ui/CodeBlock.js +1 -1
  422. package/lib/ui/Command.js +5 -5
  423. package/lib/ui/Command.js.map +1 -1
  424. package/lib/ui/Dialog.js +1 -1
  425. package/lib/ui/Drawer.js +3 -3
  426. package/lib/ui/DropdownMenu.js +227 -140
  427. package/lib/ui/DropdownMenu.js.map +1 -1
  428. package/lib/ui/EmbeddedCodeBlock.js +1 -1
  429. package/lib/ui/Form.js +1 -1
  430. package/lib/ui/Frame.js +1 -1
  431. package/lib/ui/HoverCard.js +1 -1
  432. package/lib/ui/Input.js +1 -1
  433. package/lib/ui/InputGroup.js +155 -0
  434. package/lib/ui/InputGroup.js.map +1 -0
  435. package/lib/ui/Item.js +1 -1
  436. package/lib/ui/Kbd.js +32 -0
  437. package/lib/ui/Kbd.js.map +1 -0
  438. package/lib/ui/Label.js +1 -1
  439. package/lib/ui/NativeSelect.js +1 -1
  440. package/lib/ui/Pagination.js +1 -1
  441. package/lib/ui/Popover.js +1 -1
  442. package/lib/ui/Progress.js +1 -1
  443. package/lib/ui/RadioGroup.js +1 -1
  444. package/lib/ui/ScrollArea.js +1 -1
  445. package/lib/ui/Secret.js +3 -3
  446. package/lib/ui/Secret.js.map +1 -1
  447. package/lib/ui/Separator.js +1 -1
  448. package/lib/ui/Skeleton.js +1 -1
  449. package/lib/ui/Slider.js +1 -1
  450. package/lib/ui/Switch.js +1 -1
  451. package/lib/ui/SyntaxHighlight.js +3 -3
  452. package/lib/ui/Tabs.js +1 -1
  453. package/lib/ui/Textarea.js +1 -1
  454. package/lib/ui/Toggle.js +1 -1
  455. package/lib/ui/ToggleGroup.js +1 -1
  456. package/lib/ui/Value.js +1 -1
  457. package/lib/ui/util.js +1 -1
  458. package/lib/useExposedProps-CzTDfXfq.js +30 -0
  459. package/lib/useExposedProps-CzTDfXfq.js.map +1 -0
  460. package/lib/useMutation-CErliDZ9.js +119 -0
  461. package/lib/useMutation-CErliDZ9.js.map +1 -0
  462. package/lib/useQuery-ht7aWJ3S.js +1212 -0
  463. package/lib/useQuery-ht7aWJ3S.js.map +1 -0
  464. package/lib/useSuspenseQuery-DQH4Bmc2.js +18 -0
  465. package/lib/useSuspenseQuery-DQH4Bmc2.js.map +1 -0
  466. package/lib/zudoku.__internal.js +1540 -1553
  467. package/lib/zudoku.__internal.js.map +1 -1
  468. package/lib/zudoku.auth-auth0.js +19 -18
  469. package/lib/zudoku.auth-auth0.js.map +1 -1
  470. package/lib/zudoku.auth-azureb2c.js +14 -13
  471. package/lib/zudoku.auth-azureb2c.js.map +1 -1
  472. package/lib/zudoku.auth-clerk.js +52 -75
  473. package/lib/zudoku.auth-clerk.js.map +1 -1
  474. package/lib/zudoku.auth-firebase.js +10 -0
  475. package/lib/zudoku.auth-firebase.js.map +1 -0
  476. package/lib/zudoku.auth-openid.js +8 -7
  477. package/lib/zudoku.auth-openid.js.map +1 -1
  478. package/lib/zudoku.auth-supabase.js +31 -40
  479. package/lib/zudoku.auth-supabase.js.map +1 -1
  480. package/lib/zudoku.components.js +29 -25
  481. package/lib/zudoku.components.js.map +1 -1
  482. package/lib/zudoku.hooks.js +20 -20
  483. package/lib/zudoku.hooks.js.map +1 -1
  484. package/lib/zudoku.mermaid.js +11 -0
  485. package/lib/zudoku.mermaid.js.map +1 -0
  486. package/lib/zudoku.plugin-api-catalog.js +42 -37
  487. package/lib/zudoku.plugin-api-catalog.js.map +1 -1
  488. package/lib/zudoku.plugin-api-keys.js +617 -550
  489. package/lib/zudoku.plugin-api-keys.js.map +1 -1
  490. package/lib/zudoku.plugin-custom-pages.js +1 -1
  491. package/lib/zudoku.plugin-markdown.js +1 -1
  492. package/lib/zudoku.plugin-openapi.js +3 -3
  493. package/lib/zudoku.plugin-redirect.js +1 -1
  494. package/lib/zudoku.plugin-search-pagefind.js +186 -226
  495. package/lib/zudoku.plugin-search-pagefind.js.map +1 -1
  496. package/lib/zudoku.plugins.js +9 -8
  497. package/lib/zudoku.plugins.js.map +1 -1
  498. package/lib/zudoku.react-query.js +441 -0
  499. package/lib/zudoku.react-query.js.map +1 -0
  500. package/lib/zudoku.router.js +1130 -1404
  501. package/lib/zudoku.router.js.map +1 -1
  502. package/package.json +63 -37
  503. package/src/app/defaultTheme.css +4 -0
  504. package/src/app/main.css +2 -0
  505. package/src/app/main.tsx +1 -1
  506. package/src/app/sentry.ts +1 -1
  507. package/src/lib/auth/issuer.ts +1 -1
  508. package/src/lib/authentication/authentication.ts +8 -2
  509. package/src/lib/authentication/components/CallbackHandler.tsx +1 -1
  510. package/src/lib/authentication/components/SignIn.tsx +5 -2
  511. package/src/lib/authentication/components/SignUp.tsx +5 -2
  512. package/src/lib/authentication/hook.ts +16 -0
  513. package/src/lib/authentication/providers/auth0.tsx +21 -10
  514. package/src/lib/authentication/providers/clerk.tsx +0 -26
  515. package/src/lib/authentication/providers/firebase.tsx +98 -6
  516. package/src/lib/authentication/providers/supabase.tsx +6 -15
  517. package/src/lib/authentication/ui/EmailVerificationUi.tsx +129 -0
  518. package/src/lib/authentication/ui/ZudokuAuthUi.tsx +181 -39
  519. package/src/lib/authentication/utils/relativeRedirectUrl.ts +12 -0
  520. package/src/lib/components/Bootstrap.tsx +1 -4
  521. package/src/lib/components/Mermaid.tsx +68 -0
  522. package/src/lib/components/MobileTopNavigation.tsx +16 -9
  523. package/src/lib/components/PagefindSearchMeta.tsx +14 -0
  524. package/src/lib/components/Pagination.tsx +4 -5
  525. package/src/lib/components/Slot.test.tsx +1 -1
  526. package/src/lib/components/TopNavigation.tsx +26 -8
  527. package/src/lib/components/Zudoku.tsx +22 -21
  528. package/src/lib/components/context/ZudokuContext.ts +33 -12
  529. package/src/lib/components/context/ZudokuProvider.tsx +1 -1
  530. package/src/lib/components/context/ZudokuReactContext.tsx +17 -0
  531. package/src/lib/components/index.ts +19 -35
  532. package/src/lib/components/navigation/Navigation.tsx +4 -3
  533. package/src/lib/components/navigation/NavigationCategory.tsx +9 -0
  534. package/src/lib/components/navigation/NavigationFilterContext.tsx +28 -0
  535. package/src/lib/components/navigation/NavigationFilterInput.tsx +35 -0
  536. package/src/lib/components/navigation/NavigationItem.tsx +26 -4
  537. package/src/lib/components/navigation/NavigationWrapper.tsx +1 -1
  538. package/src/lib/components/navigation/utils.ts +44 -2
  539. package/src/lib/core/RouteGuard.tsx +30 -24
  540. package/src/lib/core/ZudokuContext.ts +7 -1
  541. package/src/lib/core/__internal.tsx +2 -0
  542. package/src/lib/core/plugins.ts +27 -3
  543. package/src/lib/core/react-query.ts +1 -0
  544. package/src/lib/core/transform-config.test.tsx +99 -0
  545. package/src/lib/core/transform-config.ts +67 -0
  546. package/src/lib/errors/ErrorAlert.tsx +1 -6
  547. package/src/lib/errors/ErrorMessage.tsx +38 -0
  548. package/src/lib/hooks/index.ts +7 -16
  549. package/src/lib/hooks/useEvent.test.tsx +1 -1
  550. package/src/lib/navigation/pathMatcher.test.ts +136 -0
  551. package/src/lib/navigation/pathMatcher.ts +93 -0
  552. package/src/lib/navigation/positionItems.test.ts +265 -0
  553. package/src/lib/navigation/positionItems.ts +111 -0
  554. package/src/lib/oas/graphql/circular.test.ts +221 -0
  555. package/src/lib/oas/graphql/circular.ts +31 -18
  556. package/src/lib/oas/graphql/index.ts +7 -3
  557. package/src/lib/oas/parser/index.ts +19 -6
  558. package/src/lib/plugins/api-keys/SettingsApiKeys.tsx +36 -476
  559. package/src/lib/plugins/api-keys/index.tsx +76 -32
  560. package/src/lib/plugins/api-keys/settings/ApiKeyItem.tsx +342 -0
  561. package/src/lib/plugins/api-keys/settings/ApiKeyList.tsx +67 -0
  562. package/src/lib/plugins/api-keys/settings/RevealApiKey.tsx +124 -0
  563. package/src/lib/plugins/openapi/DownloadSchemaButton.tsx +115 -0
  564. package/src/lib/plugins/openapi/Endpoint.tsx +20 -27
  565. package/src/lib/plugins/openapi/GeneratedExampleSidecarBox.tsx +1 -1
  566. package/src/lib/plugins/openapi/OasProvider.tsx +38 -17
  567. package/src/lib/plugins/openapi/OperationList.tsx +48 -28
  568. package/src/lib/plugins/openapi/OperationListItem.tsx +5 -5
  569. package/src/lib/plugins/openapi/ParamInfos.tsx +1 -0
  570. package/src/lib/plugins/openapi/ParameterList.tsx +2 -2
  571. package/src/lib/plugins/openapi/ResponsesSidecarBox.tsx +37 -15
  572. package/src/lib/plugins/openapi/SchemaList.tsx +4 -0
  573. package/src/lib/plugins/openapi/Sidecar.tsx +20 -3
  574. package/src/lib/plugins/openapi/index.tsx +16 -7
  575. package/src/lib/plugins/openapi/interfaces.ts +21 -7
  576. package/src/lib/plugins/openapi/playground/Playground.tsx +8 -4
  577. package/src/lib/plugins/openapi/playground/fileUtils.ts +4 -0
  578. package/src/lib/plugins/openapi/playground/result-panel/AudioPlayer.tsx +50 -0
  579. package/src/lib/plugins/openapi/playground/result-panel/ResponseTab.tsx +33 -17
  580. package/src/lib/plugins/openapi/schema/SchemaView.tsx +56 -43
  581. package/src/lib/plugins/openapi/schema/utils.ts +20 -6
  582. package/src/lib/plugins/openapi/util/createHttpSnippet.ts +29 -1
  583. package/src/lib/plugins/openapi/util/getRoutes.tsx +38 -3
  584. package/src/lib/plugins/search-pagefind/IndexingDialog.tsx +163 -0
  585. package/src/lib/plugins/search-pagefind/PagefindSearch.tsx +61 -22
  586. package/src/lib/plugins/search-pagefind/ResultList.tsx +8 -3
  587. package/src/lib/shiki.ts +21 -12
  588. package/src/lib/ui/Alert.tsx +17 -5
  589. package/src/lib/ui/Button.tsx +11 -10
  590. package/src/lib/ui/ButtonGroup.tsx +82 -0
  591. package/src/lib/ui/Command.tsx +3 -3
  592. package/src/lib/ui/DropdownMenu.tsx +226 -170
  593. package/src/lib/ui/InputGroup.tsx +168 -0
  594. package/src/lib/ui/Kbd.tsx +28 -0
  595. package/src/lib/ui/Secret.tsx +2 -2
  596. package/src/lib/util/MdxComponents.tsx +2 -0
  597. package/src/lib/util/flattenAllOf.test.ts +73 -20
  598. package/src/lib/util/flattenAllOf.ts +0 -36
  599. package/src/lib/util/flattenAllOfProcessor.ts +58 -0
  600. package/src/lib/util/invariant.ts +2 -1
  601. package/src/lib/util/readFrontmatter.ts +14 -0
  602. package/src/shiki/langs/c3.js +1 -0
  603. package/src/shiki/langs/gn.js +1 -0
  604. package/src/shiki/langs/markdown-nix.js +1 -0
  605. package/src/shiki/langs/moonbit.js +1 -0
  606. package/src/shiki/langs/openscad.js +1 -0
  607. package/src/zuplo/enrich-with-zuplo-mcp.ts +168 -0
  608. package/src/zuplo/enrich-with-zuplo.ts +254 -0
  609. package/src/zuplo/policy-types.ts +46 -0
  610. package/src/zuplo/with-zuplo-processors.ts +35 -0
  611. package/src/zuplo/with-zuplo.ts +14 -0
  612. package/dist/vite/create-pagefind-index.d.ts +0 -4
  613. package/dist/vite/create-pagefind-index.js +0 -12
  614. package/dist/vite/create-pagefind-index.js.map +0 -1
  615. package/lib/Button-B3ucvvQw.js +0 -52
  616. package/lib/Button-B3ucvvQw.js.map +0 -1
  617. package/lib/Command-CUcrW3qs.js.map +0 -1
  618. package/lib/DropdownMenu-BZ2NKQ3K.js +0 -126
  619. package/lib/DropdownMenu-BZ2NKQ3K.js.map +0 -1
  620. package/lib/ErrorAlert-_1Zmhr68.js.map +0 -1
  621. package/lib/MdxPage-B2t1EShN.js +0 -240
  622. package/lib/MdxPage-B2t1EShN.js.map +0 -1
  623. package/lib/OAuthErrorPage-DnKnq4xK.js.map +0 -1
  624. package/lib/OasProvider-BhuIkD4Z.js +0 -36
  625. package/lib/OasProvider-BhuIkD4Z.js.map +0 -1
  626. package/lib/OperationList-D8EDc9v7.js.map +0 -1
  627. package/lib/Pagination-hk-llhpw.js +0 -37
  628. package/lib/Pagination-hk-llhpw.js.map +0 -1
  629. package/lib/RouteGuard-Brz95MSt.js +0 -77
  630. package/lib/RouteGuard-Brz95MSt.js.map +0 -1
  631. package/lib/RouterError-CMaIfdjb.js +0 -42
  632. package/lib/RouterError-CMaIfdjb.js.map +0 -1
  633. package/lib/SchemaList-E6lF7dID.js.map +0 -1
  634. package/lib/SchemaView-CIv-OXgv.js +0 -572
  635. package/lib/SchemaView-CIv-OXgv.js.map +0 -1
  636. package/lib/Select-DFRCS31-.js +0 -399
  637. package/lib/Select-DFRCS31-.js.map +0 -1
  638. package/lib/SignUp-sGYAsj2K.js +0 -50
  639. package/lib/SignUp-sGYAsj2K.js.map +0 -1
  640. package/lib/SyntaxHighlight-C19vH0V_.js.map +0 -1
  641. package/lib/ZudokuContext-BUZ5hkWB.js +0 -1508
  642. package/lib/ZudokuContext-BUZ5hkWB.js.map +0 -1
  643. package/lib/chunk-PVWAREVJ-BMhpCH5D.js +0 -7965
  644. package/lib/chunk-PVWAREVJ-BMhpCH5D.js.map +0 -1
  645. package/lib/circular-BoYo7au5.js.map +0 -1
  646. package/lib/cn-dYga0KKN.js.map +0 -1
  647. package/lib/createServer-B_BZ7xX8.js.map +0 -1
  648. package/lib/hook-CMeoxziF.js +0 -40
  649. package/lib/hook-CMeoxziF.js.map +0 -1
  650. package/lib/index-HNVs5cgX.js.map +0 -1
  651. package/lib/index-pMMX55GH.js +0 -1059
  652. package/lib/index-pMMX55GH.js.map +0 -1
  653. package/lib/invariant-Bm-FVUQE.js.map +0 -1
  654. package/lib/mutation-BSU0xu4m.js.map +0 -1
  655. package/lib/useExposedProps-U3pmsHaG.js +0 -113
  656. package/lib/useExposedProps-U3pmsHaG.js.map +0 -1
@@ -0,0 +1,124 @@
1
+ import { TrashIcon } from "lucide-react";
2
+ import { useState } from "react";
3
+ import { Button } from "zudoku/ui/Button.js";
4
+ import {
5
+ Dialog,
6
+ DialogClose,
7
+ DialogContent,
8
+ DialogDescription,
9
+ DialogFooter,
10
+ DialogHeader,
11
+ DialogTitle,
12
+ DialogTrigger,
13
+ } from "zudoku/ui/Dialog.js";
14
+ import { Secret } from "zudoku/ui/Secret.js";
15
+ import { cn } from "../../../util/cn.js";
16
+ import type { ApiKey } from "../index.js";
17
+
18
+ export const RevealApiKey = ({
19
+ apiKey,
20
+ onDeleteKey,
21
+ className,
22
+ }: {
23
+ apiKey: ApiKey;
24
+ onDeleteKey: () => void;
25
+ className?: string;
26
+ }) => {
27
+ const [revealed, setRevealed] = useState(false);
28
+
29
+ const { key, createdOn, expiresOn } = apiKey;
30
+ const isExpired = expiresOn && new Date(expiresOn) < new Date();
31
+ const daysUntilExpiry = expiresOn
32
+ ? Math.ceil(
33
+ (new Date(expiresOn).getTime() - Date.now()) / (1000 * 60 * 60 * 24),
34
+ )
35
+ : Infinity;
36
+ const expiresSoon = daysUntilExpiry <= 7 && !isExpired;
37
+
38
+ return (
39
+ <div className={cn("grid col-span-full grid-cols-subgrid p-6", className)}>
40
+ <div className="flex flex-col gap-1">
41
+ <Secret
42
+ className="max-w-fit w-full"
43
+ secret={key}
44
+ status={isExpired ? "expired" : expiresSoon ? "expiring" : "active"}
45
+ revealed={revealed}
46
+ onReveal={setRevealed}
47
+ />
48
+ <div className="flex gap-1 mt-0.5 text-nowrap">
49
+ {createdOn && (
50
+ <span className="text-xs text-muted-foreground">
51
+ Created {getTimeAgo(createdOn)}.
52
+ </span>
53
+ )}{" "}
54
+ {expiresOn && expiresSoon && (
55
+ <span className="text-xs text-primary">
56
+ Expires in {daysUntilExpiry}{" "}
57
+ {daysUntilExpiry === 1 ? "day" : "days"}.
58
+ </span>
59
+ )}
60
+ {expiresOn && isExpired && (
61
+ <span className="text-xs text-primary">
62
+ Expired{" "}
63
+ {daysUntilExpiry === 0
64
+ ? "today."
65
+ : `${daysUntilExpiry * -1} days ago.`}
66
+ </span>
67
+ )}
68
+ </div>
69
+ </div>
70
+ <div className="flex justify-end">
71
+ {expiresOn && onDeleteKey && (
72
+ <Dialog>
73
+ <DialogTrigger asChild>
74
+ <Button variant="ghost" size="icon">
75
+ <TrashIcon size={16} />
76
+ </Button>
77
+ </DialogTrigger>
78
+ <DialogContent>
79
+ <DialogHeader>
80
+ <DialogTitle>Delete API Key</DialogTitle>
81
+ <DialogDescription>
82
+ Are you sure you want to delete this API key?
83
+ </DialogDescription>
84
+ </DialogHeader>
85
+ <DialogFooter>
86
+ <DialogClose asChild>
87
+ <Button variant="outline">Cancel</Button>
88
+ </DialogClose>
89
+ <DialogClose asChild>
90
+ <Button
91
+ onClick={() => {
92
+ onDeleteKey();
93
+ }}
94
+ >
95
+ Delete
96
+ </Button>
97
+ </DialogClose>
98
+ </DialogFooter>
99
+ </DialogContent>
100
+ </Dialog>
101
+ )}
102
+ </div>
103
+ </div>
104
+ );
105
+ };
106
+
107
+ const getTimeAgo = (date: string) => {
108
+ const now = new Date();
109
+ const created = new Date(date);
110
+ const diffInSeconds = Math.floor((now.getTime() - created.getTime()) / 1000);
111
+
112
+ const rtf = new Intl.RelativeTimeFormat("en", { numeric: "auto" });
113
+
114
+ if (diffInSeconds < 60) return rtf.format(-diffInSeconds, "second");
115
+ if (diffInSeconds < 3600)
116
+ return rtf.format(-Math.floor(diffInSeconds / 60), "minute");
117
+ if (diffInSeconds < 86400)
118
+ return rtf.format(-Math.floor(diffInSeconds / 3600), "hour");
119
+ if (diffInSeconds < 2592000)
120
+ return rtf.format(-Math.floor(diffInSeconds / 86400), "day");
121
+ if (diffInSeconds < 31536000)
122
+ return rtf.format(-Math.floor(diffInSeconds / 2592000), "month");
123
+ return rtf.format(-Math.floor(diffInSeconds / 31536000), "year");
124
+ };
@@ -0,0 +1,115 @@
1
+ import {
2
+ ChevronDownIcon,
3
+ CopyIcon,
4
+ DownloadIcon,
5
+ ExternalLinkIcon,
6
+ } from "lucide-react";
7
+ import type { MouseEventHandler } from "react";
8
+ import { Button } from "zudoku/components";
9
+ import { ButtonGroup } from "zudoku/ui/ButtonGroup.js";
10
+ import {
11
+ DropdownMenu,
12
+ DropdownMenuContent,
13
+ DropdownMenuItem,
14
+ DropdownMenuTrigger,
15
+ } from "zudoku/ui/DropdownMenu.js";
16
+ import { useCopyToClipboard } from "../../util/useCopyToClipboard.js";
17
+ import { ChatGPTLogo } from "../markdown/assets/ChatGPTLogo.js";
18
+ import { ClaudeLogo } from "../markdown/assets/ClaudeLogo.js";
19
+
20
+ export const DownloadSchemaButton = ({
21
+ downloadUrl,
22
+ }: {
23
+ downloadUrl: string;
24
+ }) => {
25
+ const [, copyToClipboard] = useCopyToClipboard();
26
+
27
+ const handleDownload: MouseEventHandler<HTMLAnchorElement> = async (e) => {
28
+ const isExternal = downloadUrl.includes("://");
29
+
30
+ if (!isExternal) return;
31
+
32
+ e.preventDefault();
33
+ try {
34
+ const response = await fetch(downloadUrl);
35
+ if (!response.ok)
36
+ throw new Error(`Failed to fetch: ${response.statusText}`);
37
+
38
+ const blob = await response.blob();
39
+ const url = window.URL.createObjectURL(blob);
40
+ const a = document.createElement("a");
41
+ a.href = url;
42
+ a.download = downloadUrl.split("/").pop() || "schema.json";
43
+ document.body.appendChild(a);
44
+ a.click();
45
+ document.body.removeChild(a);
46
+ window.URL.revokeObjectURL(url);
47
+ } catch (error) {
48
+ // biome-ignore lint/suspicious/noConsole: Logging error
49
+ console.error("Failed to download schema:", error);
50
+ }
51
+ };
52
+
53
+ return (
54
+ <ButtonGroup>
55
+ <Button
56
+ variant="outline"
57
+ size="sm"
58
+ className="flex items-center gap-1.5"
59
+ asChild
60
+ >
61
+ <a href={downloadUrl} download onClick={handleDownload}>
62
+ <DownloadIcon size={14} />
63
+ Download schema
64
+ </a>
65
+ </Button>
66
+ <DropdownMenu>
67
+ <DropdownMenuTrigger asChild>
68
+ <Button size="sm" variant="outline" className="px-1.5">
69
+ <ChevronDownIcon size={14} />
70
+ </Button>
71
+ </DropdownMenuTrigger>
72
+ <DropdownMenuContent align="end">
73
+ <DropdownMenuItem asChild>
74
+ <a href={downloadUrl} target="_blank" rel="noopener noreferrer">
75
+ <ExternalLinkIcon size={14} />
76
+ Open in new tab
77
+ </a>
78
+ </DropdownMenuItem>
79
+ <DropdownMenuItem
80
+ onClick={async () => {
81
+ const response = await fetch(downloadUrl);
82
+ const schema = await response.text();
83
+ copyToClipboard(schema);
84
+ }}
85
+ >
86
+ <CopyIcon size={14} />
87
+ Copy to clipboard
88
+ </DropdownMenuItem>
89
+ <DropdownMenuItem
90
+ onClick={() => {
91
+ const prompt = encodeURIComponent(
92
+ `Help me understand this API: ${new URL(downloadUrl, window.location.href).href}`,
93
+ );
94
+ window.open(`https://claude.ai/new?q=${prompt}`, "_blank");
95
+ }}
96
+ >
97
+ <ClaudeLogo className="size-4" />
98
+ Use in Claude
99
+ </DropdownMenuItem>
100
+ <DropdownMenuItem
101
+ onClick={() => {
102
+ const prompt = encodeURIComponent(
103
+ `Help me understand this API: ${new URL(downloadUrl, window.location.href).href}`,
104
+ );
105
+ window.open(`https://chatgpt.com/?q=${prompt}`, "_blank");
106
+ }}
107
+ >
108
+ <ChatGPTLogo className="size-4" />
109
+ Use in ChatGPT
110
+ </DropdownMenuItem>
111
+ </DropdownMenuContent>
112
+ </DropdownMenu>
113
+ </ButtonGroup>
114
+ );
115
+ };
@@ -32,7 +32,7 @@ const CopyButton = ({ url }: { url: string }) => {
32
32
  });
33
33
  }}
34
34
  variant="ghost"
35
- size="icon"
35
+ size="icon-xs"
36
36
  >
37
37
  {isCopied ? (
38
38
  <CheckIcon className="text-green-600" size={14} />
@@ -53,40 +53,33 @@ export const Endpoint = () => {
53
53
  );
54
54
 
55
55
  const { servers } = result.data.schema;
56
-
57
56
  const firstServer = servers.at(0);
58
57
 
59
58
  if (!firstServer) return null;
60
59
 
61
- if (servers.length === 1) {
62
- return (
63
- <div className="flex items-center gap-2">
64
- <span className="font-medium text-sm">Endpoint:</span>
60
+ return (
61
+ <div className="flex items-center gap-1.5 flex-nowrap">
62
+ <span className="font-medium text-sm">Endpoint</span>
63
+ {servers.length > 1 ? (
64
+ <SimpleSelect
65
+ className="font-mono text-xs border-input bg-transparent dark:bg-input/30 dark:hover:bg-input/50 py-1.5 max-w-[450px] truncate"
66
+ onChange={(e) =>
67
+ startTransition(() => setSelectedServer(e.target.value))
68
+ }
69
+ value={selectedServer}
70
+ showChevrons={servers.length > 1}
71
+ options={servers.map((server) => ({
72
+ value: server.url,
73
+ label: server.url,
74
+ }))}
75
+ />
76
+ ) : (
65
77
  <InlineCode className="text-xs px-2 py-1.5" selectOnClick>
66
78
  {firstServer.url}
67
79
  </InlineCode>
68
- <CopyButton url={firstServer.url} />
69
- </div>
70
- );
71
- }
72
-
73
- return (
74
- <div className="flex flex-wrap items-center gap-2">
75
- <span className="font-medium text-sm">Endpoint</span>
80
+ )}
76
81
 
77
- <SimpleSelect
78
- className="font-mono text-xs bg-border/50 dark:bg-border/70 py-1.5 max-w-[450px] truncate"
79
- onChange={(e) =>
80
- startTransition(() => setSelectedServer(e.target.value))
81
- }
82
- value={selectedServer}
83
- showChevrons={servers.length > 1}
84
- options={servers.map((server) => ({
85
- value: server.url,
86
- label: server.url,
87
- }))}
88
- />
89
- <CopyButton url={selectedServer} />
82
+ <CopyButton url={servers.length > 1 ? selectedServer : firstServer.url} />
90
83
  </div>
91
84
  );
92
85
  };
@@ -22,7 +22,7 @@ export const GeneratedExampleSidecarBox = ({
22
22
  <SidecarBox.Root>
23
23
  <SidecarBox.Head className="text-xs flex justify-between items-center">
24
24
  <div className="flex items-center gap-1.5">
25
- <span className="font-medium">Request Body Example</span>
25
+ <span className="font-medium">Example Request Body</span>
26
26
  <TooltipProvider>
27
27
  <Tooltip>
28
28
  <TooltipTrigger asChild>
@@ -1,11 +1,11 @@
1
1
  import { useMemo } from "react";
2
2
  import { Outlet } from "react-router";
3
- import { joinPath } from "../../util/joinPath.js";
3
+ import { joinUrl } from "../../util/joinUrl.js";
4
4
  import type { GraphQLClient } from "./client/GraphQLClient.js";
5
5
  import { GraphQLProvider } from "./client/GraphQLContext.js";
6
6
  import { OasConfigProvider } from "./context.js";
7
7
  import type { OasPluginConfig } from "./interfaces.js";
8
- import { getVersions } from "./util/getRoutes.js";
8
+ import { getVersionMetadata } from "./util/getRoutes.js";
9
9
 
10
10
  export const OasProvider = ({
11
11
  basePath,
@@ -19,25 +19,46 @@ export const OasProvider = ({
19
19
  client: GraphQLClient;
20
20
  }) => {
21
21
  const value = useMemo(() => {
22
- const versions = getVersions(config);
23
- const firstVersion = Object.values(config.input).at(0);
24
- const input =
25
- config.type === "file"
26
- ? {
27
- type: config.type,
28
- // biome-ignore lint/style/noNonNullAssertion: is guaranteed to be defined
29
- input: version ? config.input[version]! : firstVersion!,
30
- }
31
- : { type: config.type, input: config.input };
22
+ const {
23
+ versions: availableVersions,
24
+ labels,
25
+ downloadUrls,
26
+ } = getVersionMetadata(config);
27
+ const currentVersion = version ?? availableVersions.at(0);
28
+
29
+ const versionLinks = Object.fromEntries(
30
+ availableVersions.map((id) => [
31
+ id,
32
+ {
33
+ path: joinUrl(basePath, id),
34
+ label: labels[id] ?? id,
35
+ downloadUrl: downloadUrls[id],
36
+ },
37
+ ]),
38
+ );
39
+
40
+ const resolveInput = (): string | (() => Promise<unknown>) => {
41
+ if (!Array.isArray(config.input)) {
42
+ return config.input;
43
+ }
44
+
45
+ const versionConfig = currentVersion
46
+ ? config.input.find((v) => v.path === currentVersion)
47
+ : config.input[0];
48
+
49
+ if (!versionConfig) {
50
+ throw new Error(`No input found for version: ${currentVersion}`);
51
+ }
52
+
53
+ return versionConfig.input;
54
+ };
32
55
 
33
56
  return {
34
57
  config: {
35
58
  ...config,
36
- version: version ?? versions.at(0),
37
- versions: Object.fromEntries(
38
- versions.map((version) => [version, joinPath(basePath, version)]),
39
- ),
40
- ...input,
59
+ version: currentVersion,
60
+ versions: versionLinks,
61
+ input: resolveInput(),
41
62
  },
42
63
  };
43
64
  }, [config, basePath, version]);
@@ -18,9 +18,12 @@ import { CategoryHeading } from "../../components/CategoryHeading.js";
18
18
  import { useApiIdentities } from "../../components/context/ZudokuContext.js";
19
19
  import { Heading } from "../../components/Heading.js";
20
20
  import { Markdown } from "../../components/Markdown.js";
21
+ import { usePrevNext } from "../../components/navigation/utils.js";
22
+ import { PagefindSearchMeta } from "../../components/PagefindSearchMeta.js";
21
23
  import { Pagination } from "../../components/Pagination.js";
22
24
  import { useCreateQuery } from "./client/useCreateQuery.js";
23
25
  import { useOasConfig } from "./context.js";
26
+ import { DownloadSchemaButton } from "./DownloadSchemaButton.js";
24
27
  import { Endpoint } from "./Endpoint.js";
25
28
  import { graphql } from "./graphql/index.js";
26
29
  import { UNTAGGED_PATH } from "./index.js";
@@ -163,11 +166,7 @@ export const OperationList = ({
163
166
  tag: tag ?? tagFromParams,
164
167
  untagged,
165
168
  });
166
- const result = useSuspenseQuery(query);
167
- const {
168
- data: { schema },
169
- } = result;
170
- // Global server selection for the dropdown UI
169
+ const schema = useSuspenseQuery(query).data.schema;
171
170
  const { selectedServer: globalSelectedServer } = useSelectedServer(
172
171
  schema.servers,
173
172
  );
@@ -175,6 +174,7 @@ export const OperationList = ({
175
174
  const summary = schema.summary;
176
175
  const description = schema.description;
177
176
  const navigate = useNavigate();
177
+ const { prev: navPrev, next: navNext } = usePrevNext();
178
178
 
179
179
  // This is to warmup (i.e. load the schema in the background) the schema on the client, if the page has been rendered on the server
180
180
  const warmupQuery = useCreateQuery(SchemaWarmupQuery, { input, type });
@@ -229,7 +229,9 @@ export const OperationList = ({
229
229
  to: `../${prev.slug}`,
230
230
  label: prev.extensions?.["x-displayName"] ?? prev.name,
231
231
  }
232
- : undefined,
232
+ : navPrev
233
+ ? { to: navPrev.id, label: navPrev.label }
234
+ : undefined,
233
235
  next: next
234
236
  ? {
235
237
  to: `../${next.slug ?? UNTAGGED_PATH}`,
@@ -238,18 +240,29 @@ export const OperationList = ({
238
240
  next.name ??
239
241
  "Other endpoints",
240
242
  }
241
- : undefined,
243
+ : navNext
244
+ ? { to: navNext.id, label: navNext.label }
245
+ : undefined,
242
246
  };
243
247
 
244
248
  const tagTitle = schema.tag.extensions?.["x-displayName"] ?? schema.tag.name;
245
249
  const helmetTitle = [tagTitle, title].filter(Boolean).join(" - ");
246
250
 
251
+ const currentVersion = version != null ? versions[version] : undefined;
252
+ const downloadUrl =
253
+ typeof input === "string"
254
+ ? type === "url"
255
+ ? input
256
+ : currentVersion?.downloadUrl
257
+ : undefined;
258
+
247
259
  return (
248
260
  <div
249
261
  className="pt-(--padding-content-top)"
250
262
  data-pagefind-filter="section:openapi"
251
263
  data-pagefind-meta="section:openapi"
252
264
  >
265
+ <PagefindSearchMeta name="category">{title}</PagefindSearchMeta>
253
266
  <Helmet>
254
267
  {helmetTitle && <title>{helmetTitle}</title>}
255
268
  {metaDescription && (
@@ -262,7 +275,7 @@ export const OperationList = ({
262
275
  className="w-full"
263
276
  defaultOpen={options?.expandApiInformation}
264
277
  >
265
- <div className="flex flex-col gap-y-4 sm:flex-row justify-around items-start sm:items-end">
278
+ <div className="flex flex-col gap-4 sm:flex-row justify-around items-start sm:items-end">
266
279
  <div className="flex flex-col flex-1 gap-2">
267
280
  <CategoryHeading>{title}</CategoryHeading>
268
281
  <Heading
@@ -275,32 +288,39 @@ export const OperationList = ({
275
288
  {showVersions && (
276
289
  <span className="text-xl text-muted-foreground ms-1.5">
277
290
  {" "}
278
- ({version})
291
+ ({schema.version})
279
292
  </span>
280
293
  )}
281
294
  </Heading>
282
295
  <Endpoint />
283
296
  </div>
284
297
  <div className="flex flex-col gap-4 sm:items-end">
285
- {showVersions && (
286
- <Select
287
- // biome-ignore lint/style/noNonNullAssertion: is guaranteed to be defined
288
- onValueChange={(version) => navigate(versions[version]!)}
289
- defaultValue={version}
290
- disabled={!hasMultipleVersions}
291
- >
292
- <SelectTrigger className="w-[180px]">
293
- <SelectValue placeholder="Select version" />
294
- </SelectTrigger>
295
- <SelectContent>
296
- {Object.entries(versions).map(([version]) => (
297
- <SelectItem key={version} value={version}>
298
- {version}
299
- </SelectItem>
300
- ))}
301
- </SelectContent>
302
- </Select>
303
- )}
298
+ <div className="flex gap-2 items-center">
299
+ {showVersions && (
300
+ <Select
301
+ onValueChange={(version) =>
302
+ // biome-ignore lint/style/noNonNullAssertion: is guaranteed to be defined
303
+ navigate(versions[version]!.path)
304
+ }
305
+ defaultValue={version}
306
+ disabled={!hasMultipleVersions}
307
+ >
308
+ <SelectTrigger className="w-[180px]" size="sm">
309
+ <SelectValue placeholder="Select version" />
310
+ </SelectTrigger>
311
+ <SelectContent>
312
+ {Object.entries(versions).map(([version, { label }]) => (
313
+ <SelectItem key={version} value={version}>
314
+ {label}
315
+ </SelectItem>
316
+ ))}
317
+ </SelectContent>
318
+ </Select>
319
+ )}
320
+ {options?.schemaDownload?.enabled && downloadUrl && (
321
+ <DownloadSchemaButton downloadUrl={downloadUrl} />
322
+ )}
323
+ </div>
304
324
  {schema.description && (
305
325
  <CollapsibleTrigger className="flex items-center gap-1 text-sm font-medium text-muted-foreground group">
306
326
  <span>API information</span>
@@ -1,9 +1,9 @@
1
- import { VisuallyHidden } from "@radix-ui/react-visually-hidden";
2
1
  import { useState } from "react";
3
2
  import { Badge } from "zudoku/ui/Badge.js";
4
3
  import { Separator } from "zudoku/ui/Separator.js";
5
4
  import { Heading } from "../../components/Heading.js";
6
5
  import { Markdown } from "../../components/Markdown.js";
6
+ import { PagefindSearchMeta } from "../../components/PagefindSearchMeta.js";
7
7
  import { cn } from "../../util/cn.js";
8
8
  import { groupBy } from "../../util/groupBy.js";
9
9
  import { renderIf } from "../../util/renderIf.js";
@@ -134,9 +134,9 @@ export const OperationListItem = ({
134
134
  id={`${operation.slug}/request-body`}
135
135
  >
136
136
  {operation.summary && (
137
- <VisuallyHidden>
137
+ <PagefindSearchMeta>
138
138
  {operation.summary} &rsaquo;{" "}
139
- </VisuallyHidden>
139
+ </PagefindSearchMeta>
140
140
  )}
141
141
  Request Body{" "}
142
142
  {operation.requestBody?.required === false ? (
@@ -154,9 +154,9 @@ export const OperationListItem = ({
154
154
  <>
155
155
  <Heading level={3} id={`${operation.slug}/responses`}>
156
156
  {operation.summary && (
157
- <VisuallyHidden>
157
+ <PagefindSearchMeta>
158
158
  {operation.summary} &rsaquo;{" "}
159
- </VisuallyHidden>
159
+ </PagefindSearchMeta>
160
160
  )}
161
161
  Responses
162
162
  </Heading>
@@ -40,6 +40,7 @@ const getSchemaInfos = (schema?: SchemaObject) => {
40
40
  schema.enum && "enum",
41
41
  schema.const && "const",
42
42
  schema.format,
43
+ schema.type === "array" && schema.items?.contentMediaType,
43
44
  schema.minimum !== undefined && `min: ${schema.minimum}`,
44
45
  schema.maximum !== undefined && `max: ${schema.maximum}`,
45
46
  schema.minLength !== undefined && `minLength: ${schema.minLength}`,
@@ -35,14 +35,14 @@ export const ParameterList = ({
35
35
  <Frame>
36
36
  <FramePanel className="p-0!">
37
37
  <ItemGroup className="overflow-clip">
38
- {sortedParameters.map((parameter) => (
38
+ {sortedParameters.map((parameter, index) => (
39
39
  <Fragment key={`${parameter.name}-${parameter.in}`}>
40
+ {index > 0 && <ItemSeparator />}
40
41
  <ParameterListItem
41
42
  parameter={parameter}
42
43
  id={id}
43
44
  group={group}
44
45
  />
45
- <ItemSeparator />
46
46
  </Fragment>
47
47
  ))}
48
48
  </ItemGroup>