zudoku 0.0.0-fix-firebase-export.f8270825 → 0.0.0-fix-circular-ref-false-positives.zbe02c6a6

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 (380) hide show
  1. package/dist/app/main.d.ts +6 -6
  2. package/dist/cli/common/version-check.js +12 -3
  3. package/dist/cli/common/version-check.js.map +1 -1
  4. package/dist/config/loader.js +3 -1
  5. package/dist/config/loader.js.map +1 -1
  6. package/dist/config/validators/InputNavigationSchema.d.ts +77 -75
  7. package/dist/config/validators/InputNavigationSchema.js +1 -0
  8. package/dist/config/validators/InputNavigationSchema.js.map +1 -1
  9. package/dist/config/validators/NavigationSchema.js +6 -1
  10. package/dist/config/validators/NavigationSchema.js.map +1 -1
  11. package/dist/config/validators/validate.d.ts +59 -12
  12. package/dist/config/validators/validate.js +7 -4
  13. package/dist/config/validators/validate.js.map +1 -1
  14. package/dist/flat-config.d.ts +28 -26
  15. package/dist/index.d.ts +2 -1
  16. package/dist/index.js +2 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/lib/auth/issuer.js +1 -1
  19. package/dist/lib/auth/issuer.js.map +1 -1
  20. package/dist/lib/authentication/authentication.d.ts +3 -2
  21. package/dist/lib/authentication/components/CallbackHandler.js +1 -1
  22. package/dist/lib/authentication/components/CallbackHandler.js.map +1 -1
  23. package/dist/lib/authentication/components/SignIn.js +4 -2
  24. package/dist/lib/authentication/components/SignIn.js.map +1 -1
  25. package/dist/lib/authentication/components/SignUp.js +4 -2
  26. package/dist/lib/authentication/components/SignUp.js.map +1 -1
  27. package/dist/lib/authentication/hook.d.ts +2 -0
  28. package/dist/lib/authentication/hook.js +10 -0
  29. package/dist/lib/authentication/hook.js.map +1 -1
  30. package/dist/lib/authentication/providers/auth0.js +11 -7
  31. package/dist/lib/authentication/providers/auth0.js.map +1 -1
  32. package/dist/lib/authentication/providers/clerk.js +0 -22
  33. package/dist/lib/authentication/providers/clerk.js.map +1 -1
  34. package/dist/lib/authentication/providers/firebase.js +67 -9
  35. package/dist/lib/authentication/providers/firebase.js.map +1 -1
  36. package/dist/lib/authentication/providers/supabase.js +6 -15
  37. package/dist/lib/authentication/providers/supabase.js.map +1 -1
  38. package/dist/lib/authentication/ui/EmailVerificationUi.d.ts +4 -0
  39. package/dist/lib/authentication/ui/EmailVerificationUi.js +34 -0
  40. package/dist/lib/authentication/ui/EmailVerificationUi.js.map +1 -0
  41. package/dist/lib/authentication/ui/ZudokuAuthUi.d.ts +7 -2
  42. package/dist/lib/authentication/ui/ZudokuAuthUi.js +43 -11
  43. package/dist/lib/authentication/ui/ZudokuAuthUi.js.map +1 -1
  44. package/dist/lib/authentication/utils/relativeRedirectUrl.d.ts +1 -0
  45. package/dist/lib/authentication/utils/relativeRedirectUrl.js +8 -0
  46. package/dist/lib/authentication/utils/relativeRedirectUrl.js.map +1 -0
  47. package/dist/lib/components/Pagination.js +2 -2
  48. package/dist/lib/components/Pagination.js.map +1 -1
  49. package/dist/lib/components/index.d.ts +5 -0
  50. package/dist/lib/components/index.js +4 -0
  51. package/dist/lib/components/index.js.map +1 -1
  52. package/dist/lib/components/navigation/NavigationItem.js +2 -2
  53. package/dist/lib/components/navigation/NavigationItem.js.map +1 -1
  54. package/dist/lib/core/RouteGuard.js +12 -7
  55. package/dist/lib/core/RouteGuard.js.map +1 -1
  56. package/dist/lib/core/plugins.d.ts +11 -1
  57. package/dist/lib/core/plugins.js +1 -0
  58. package/dist/lib/core/plugins.js.map +1 -1
  59. package/dist/lib/core/react-query.d.ts +1 -0
  60. package/dist/lib/core/react-query.js +2 -0
  61. package/dist/lib/core/react-query.js.map +1 -0
  62. package/dist/lib/core/transform-config.d.ts +2 -0
  63. package/dist/lib/core/transform-config.js +22 -0
  64. package/dist/lib/core/transform-config.js.map +1 -0
  65. package/dist/lib/errors/ErrorMessage.d.ts +3 -0
  66. package/dist/lib/errors/ErrorMessage.js +16 -0
  67. package/dist/lib/errors/ErrorMessage.js.map +1 -0
  68. package/dist/lib/hooks/index.d.ts +2 -0
  69. package/dist/lib/oas/graphql/circular.d.ts +2 -0
  70. package/dist/lib/oas/graphql/circular.js +21 -16
  71. package/dist/lib/oas/graphql/circular.js.map +1 -1
  72. package/dist/lib/oas/graphql/circular.test.d.ts +1 -0
  73. package/dist/lib/oas/graphql/circular.test.js +183 -0
  74. package/dist/lib/oas/graphql/circular.test.js.map +1 -0
  75. package/dist/lib/oas/graphql/index.js +7 -3
  76. package/dist/lib/oas/graphql/index.js.map +1 -1
  77. package/dist/lib/plugins/api-keys/SettingsApiKeys.js +9 -172
  78. package/dist/lib/plugins/api-keys/SettingsApiKeys.js.map +1 -1
  79. package/dist/lib/plugins/api-keys/index.d.ts +11 -4
  80. package/dist/lib/plugins/api-keys/index.js +36 -22
  81. package/dist/lib/plugins/api-keys/index.js.map +1 -1
  82. package/dist/lib/plugins/api-keys/settings/ApiKeyItem.d.ts +12 -0
  83. package/dist/lib/plugins/api-keys/settings/ApiKeyItem.js +133 -0
  84. package/dist/lib/plugins/api-keys/settings/ApiKeyItem.js.map +1 -0
  85. package/dist/lib/plugins/api-keys/settings/ApiKeyList.d.ts +4 -0
  86. package/dist/lib/plugins/api-keys/settings/ApiKeyList.js +33 -0
  87. package/dist/lib/plugins/api-keys/settings/ApiKeyList.js.map +1 -0
  88. package/dist/lib/plugins/api-keys/settings/RevealApiKey.d.ts +6 -0
  89. package/dist/lib/plugins/api-keys/settings/RevealApiKey.js +39 -0
  90. package/dist/lib/plugins/api-keys/settings/RevealApiKey.js.map +1 -0
  91. package/dist/lib/plugins/openapi/OasProvider.js +6 -2
  92. package/dist/lib/plugins/openapi/OasProvider.js.map +1 -1
  93. package/dist/lib/plugins/openapi/OperationList.js +4 -4
  94. package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
  95. package/dist/lib/plugins/openapi/ParamInfos.js +1 -0
  96. package/dist/lib/plugins/openapi/ParamInfos.js.map +1 -1
  97. package/dist/lib/plugins/openapi/Sidecar.js +3 -2
  98. package/dist/lib/plugins/openapi/Sidecar.js.map +1 -1
  99. package/dist/lib/plugins/openapi/interfaces.d.ts +3 -0
  100. package/dist/lib/plugins/openapi/schema/SchemaView.js +1 -1
  101. package/dist/lib/plugins/openapi/schema/SchemaView.js.map +1 -1
  102. package/dist/lib/plugins/openapi/schema/utils.js +11 -3
  103. package/dist/lib/plugins/openapi/schema/utils.js.map +1 -1
  104. package/dist/lib/plugins/openapi/util/createHttpSnippet.js +24 -1
  105. package/dist/lib/plugins/openapi/util/createHttpSnippet.js.map +1 -1
  106. package/dist/lib/plugins/openapi/util/getRoutes.d.ts +3 -0
  107. package/dist/lib/plugins/openapi/util/getRoutes.js +2 -1
  108. package/dist/lib/plugins/openapi/util/getRoutes.js.map +1 -1
  109. package/dist/lib/ui/Button.js +1 -1
  110. package/dist/lib/ui/Button.js.map +1 -1
  111. package/dist/lib/ui/Command.d.ts +3 -3
  112. package/dist/lib/util/invariant.d.ts +1 -1
  113. package/dist/lib/util/invariant.js +2 -2
  114. package/dist/lib/util/invariant.js.map +1 -1
  115. package/dist/vite/api/SchemaManager.d.ts +12 -1
  116. package/dist/vite/api/SchemaManager.js +31 -14
  117. package/dist/vite/api/SchemaManager.js.map +1 -1
  118. package/dist/vite/api/SchemaManager.test.js +44 -0
  119. package/dist/vite/api/SchemaManager.test.js.map +1 -1
  120. package/dist/vite/config.js +10 -4
  121. package/dist/vite/config.js.map +1 -1
  122. package/dist/vite/error-handler.js +1 -5
  123. package/dist/vite/error-handler.js.map +1 -1
  124. package/dist/vite/mdx/remark-link-rewrite.js +1 -1
  125. package/dist/vite/plugin-api-keys.js +5 -1
  126. package/dist/vite/plugin-api-keys.js.map +1 -1
  127. package/dist/vite/plugin-api.js +5 -3
  128. package/dist/vite/plugin-api.js.map +1 -1
  129. package/dist/vite/plugin-markdown-export.js +1 -1
  130. package/dist/vite/plugin-markdown-export.js.map +1 -1
  131. package/dist/vite/prerender/utils.js +9 -3
  132. package/dist/vite/prerender/utils.js.map +1 -1
  133. package/dist/vite/prerender/worker.js +3 -0
  134. package/dist/vite/prerender/worker.js.map +1 -1
  135. package/dist/vite/zuplo.d.ts +13 -0
  136. package/dist/vite/zuplo.js +15 -0
  137. package/dist/vite/zuplo.js.map +1 -0
  138. package/lib/{ActionButton-DUgvSylL.js → ActionButton-B0CXL1Lq.js} +3 -3
  139. package/lib/{ActionButton-DUgvSylL.js.map → ActionButton-B0CXL1Lq.js.map} +1 -1
  140. package/lib/{Button-CynVW1JV.js → Button-GUVe7pmt.js} +8 -7
  141. package/lib/{Button-CynVW1JV.js.map → Button-GUVe7pmt.js.map} +1 -1
  142. package/lib/{Card-KFniaZn5.js → Card-DCdq37aA.js} +2 -2
  143. package/lib/{Card-KFniaZn5.js.map → Card-DCdq37aA.js.map} +1 -1
  144. package/lib/{ClaudeLogo-B4Xxt-x_.js → ClaudeLogo-DJ9bU-sO.js} +22 -22
  145. package/lib/ClaudeLogo-DJ9bU-sO.js.map +1 -0
  146. package/lib/{Command-BpT1iBE6.js → Command-N6VujV30.js} +3 -3
  147. package/lib/{Command-BpT1iBE6.js.map → Command-N6VujV30.js.map} +1 -1
  148. package/lib/{Dialog-BQciPiHN.js → Dialog-hlvmmQ_c.js} +2 -2
  149. package/lib/{Dialog-BQciPiHN.js.map → Dialog-hlvmmQ_c.js.map} +1 -1
  150. package/lib/{Drawer-Ci7XwhqT.js → Drawer-Ch7927PF.js} +7 -7
  151. package/lib/{Drawer-Ci7XwhqT.js.map → Drawer-Ch7927PF.js.map} +1 -1
  152. package/lib/{DropdownMenu-C8SX_-S_.js → DropdownMenu-DN0jNrjj.js} +2 -2
  153. package/lib/{DropdownMenu-C8SX_-S_.js.map → DropdownMenu-DN0jNrjj.js.map} +1 -1
  154. package/lib/Frame-DKlOmSkU.js +205 -0
  155. package/lib/Frame-DKlOmSkU.js.map +1 -0
  156. package/lib/HydrationBoundary-CNF2ZV3E.js +601 -0
  157. package/lib/HydrationBoundary-CNF2ZV3E.js.map +1 -0
  158. package/lib/{IndexingDialog-B5zCiUKr.js → IndexingDialog-D0YdGfbn.js} +3 -3
  159. package/lib/{IndexingDialog-B5zCiUKr.js.map → IndexingDialog-D0YdGfbn.js.map} +1 -1
  160. package/lib/Input-Cx-GeKoF.js +22 -0
  161. package/lib/Input-Cx-GeKoF.js.map +1 -0
  162. package/lib/{MdxPage-BagO2c-n.js → MdxPage-stpAoBtx.js} +11 -11
  163. package/lib/{MdxPage-BagO2c-n.js.map → MdxPage-stpAoBtx.js.map} +1 -1
  164. package/lib/{Mermaid-D_VSX7_Q.js → Mermaid-Koc3z8mU.js} +4 -4
  165. package/lib/{Mermaid-D_VSX7_Q.js.map → Mermaid-Koc3z8mU.js.map} +1 -1
  166. package/lib/{OAuthErrorPage-Fq54RLgt.js → OAuthErrorPage-DJ811Bn_.js} +15 -15
  167. package/lib/OAuthErrorPage-DJ811Bn_.js.map +1 -0
  168. package/lib/OasProvider-B2KxIBsI.js +48 -0
  169. package/lib/OasProvider-B2KxIBsI.js.map +1 -0
  170. package/lib/{OperationList-C0jiEaG5.js → OperationList-C2tAfThO.js} +1558 -1543
  171. package/lib/{OperationList-C0jiEaG5.js.map → OperationList-C2tAfThO.js.map} +1 -1
  172. package/lib/RouteGuard--A04ESy8.js +77 -0
  173. package/lib/RouteGuard--A04ESy8.js.map +1 -0
  174. package/lib/{SchemaList-BU0zCHn9.js → SchemaList-Ep8DleP_.js} +9 -9
  175. package/lib/{SchemaList-BU0zCHn9.js.map → SchemaList-Ep8DleP_.js.map} +1 -1
  176. package/lib/SchemaView-BpaEKRYx.js +438 -0
  177. package/lib/SchemaView-BpaEKRYx.js.map +1 -0
  178. package/lib/{Select-CkxXP5I7.js → Secret-BDBqq4p3.js} +122 -122
  179. package/lib/Secret-BDBqq4p3.js.map +1 -0
  180. package/lib/{Separator-CTPSeW1S.js → Separator-BXt1LYnm.js} +2 -2
  181. package/lib/{Separator-CTPSeW1S.js.map → Separator-BXt1LYnm.js.map} +1 -1
  182. package/lib/SignUp-DCBViNUi.js +50 -0
  183. package/lib/SignUp-DCBViNUi.js.map +1 -0
  184. package/lib/{SyntaxHighlight-Kdyskw3C.js → SyntaxHighlight-Dshjn3Zf.js} +1749 -1723
  185. package/lib/SyntaxHighlight-Dshjn3Zf.js.map +1 -0
  186. package/lib/{Toc-DJxFPfcS.js → Toc-Cgz6CPiE.js} +3 -3
  187. package/lib/{Toc-DJxFPfcS.js.map → Toc-Cgz6CPiE.js.map} +1 -1
  188. package/lib/ZudokuContext-BZB1TWdT.js +387 -0
  189. package/lib/ZudokuContext-BZB1TWdT.js.map +1 -0
  190. package/lib/{___vite-browser-external_commonjs-proxy-Cga3HsWk.js → ___vite-browser-external_commonjs-proxy-BttVsNON.js} +2 -2
  191. package/lib/___vite-browser-external_commonjs-proxy-BttVsNON.js.map +1 -0
  192. package/lib/chunk-EPOLDU6W-C6C8jAwd.js +8558 -0
  193. package/lib/chunk-EPOLDU6W-C6C8jAwd.js.map +1 -0
  194. package/lib/{circular-CzWF1hj5.js → circular-CG3e0_Uz.js} +1689 -1686
  195. package/lib/{circular-CzWF1hj5.js.map → circular-CG3e0_Uz.js.map} +1 -1
  196. package/lib/{cn-dYga0KKN.js → cn-5-Gd1Dss.js} +531 -498
  197. package/lib/cn-5-Gd1Dss.js.map +1 -0
  198. package/lib/{createServer-BIr2_tGn.js → createServer-CNeRqj98.js} +12 -12
  199. package/lib/{createServer-BIr2_tGn.js.map → createServer-CNeRqj98.js.map} +1 -1
  200. package/lib/createVariantComponent-Dc0vtOvr.js +18 -0
  201. package/lib/createVariantComponent-Dc0vtOvr.js.map +1 -0
  202. package/lib/{errors-Bs4duWDy.js → errors-b9I-fAOY.js} +3 -3
  203. package/lib/{errors-Bs4duWDy.js.map → errors-b9I-fAOY.js.map} +1 -1
  204. package/lib/{firebase-qUdSEL1p.js → firebase-BCXX7Qv5.js} +1590 -1342
  205. package/lib/firebase-BCXX7Qv5.js.map +1 -0
  206. package/lib/hook-BGlHBdET.js +52 -0
  207. package/lib/hook-BGlHBdET.js.map +1 -0
  208. package/lib/{ErrorAlert-DrOR8w3f.js → index-CL8eDnQW.js} +5473 -4433
  209. package/lib/index-CL8eDnQW.js.map +1 -0
  210. package/lib/index-CrcNWbel.js.map +1 -1
  211. package/lib/{index-Css56y3F.js → index-DBjOT2H1.js} +4 -4
  212. package/lib/{index-Css56y3F.js.map → index-DBjOT2H1.js.map} +1 -1
  213. package/lib/{index-0oT9beQN.js → index-I3kmZ7tG.js} +152 -148
  214. package/lib/{index-0oT9beQN.js.map → index-I3kmZ7tG.js.map} +1 -1
  215. package/lib/{index-Bh-MffiL.js → index-UOLtazB8.js} +2 -2
  216. package/lib/{index-Bh-MffiL.js.map → index-UOLtazB8.js.map} +1 -1
  217. package/lib/index.esm-BYObtETB.js.map +1 -1
  218. package/lib/{index.esm-DtzT_KoE.js → index.esm-B_0dvNjB.js} +2 -2
  219. package/lib/{index.esm-DtzT_KoE.js.map → index.esm-B_0dvNjB.js.map} +1 -1
  220. package/lib/{index.esm-kW-Utcsi.js → index.esm-C5CBsVzN.js} +16 -14
  221. package/lib/index.esm-C5CBsVzN.js.map +1 -0
  222. package/lib/{invariant-CGOLuIIz.js → invariant-BJAl77rw.js} +4 -4
  223. package/lib/invariant-BJAl77rw.js.map +1 -0
  224. package/lib/jsx-runtime-BzflLqGi.js.map +1 -1
  225. package/lib/{mutation-BoVlx8yA.js → mutation-BISOc7OM.js} +70 -44
  226. package/lib/mutation-BISOc7OM.js.map +1 -0
  227. package/lib/ui/Accordion.js +1 -1
  228. package/lib/ui/ActionButton.js +2 -2
  229. package/lib/ui/Alert.js +1 -1
  230. package/lib/ui/AlertDialog.js +1 -1
  231. package/lib/ui/Badge.js +1 -1
  232. package/lib/ui/Breadcrumb.js +1 -1
  233. package/lib/ui/Button.js +7 -6
  234. package/lib/ui/Button.js.map +1 -1
  235. package/lib/ui/ButtonGroup.js +1 -1
  236. package/lib/ui/Callout.js +1 -1
  237. package/lib/ui/Card.js +1 -1
  238. package/lib/ui/Carousel.js +1 -1
  239. package/lib/ui/Carousel.js.map +1 -1
  240. package/lib/ui/Checkbox.js +1 -1
  241. package/lib/ui/CodeBlock.js +1 -1
  242. package/lib/ui/Command.js +2 -2
  243. package/lib/ui/Dialog.js +1 -1
  244. package/lib/ui/Drawer.js +3 -3
  245. package/lib/ui/DropdownMenu.js +1 -1
  246. package/lib/ui/EmbeddedCodeBlock.js +1 -1
  247. package/lib/ui/Form.js +1 -1
  248. package/lib/ui/Frame.js +1 -1
  249. package/lib/ui/HoverCard.js +1 -1
  250. package/lib/ui/Input.js +1 -1
  251. package/lib/ui/Item.js +1 -1
  252. package/lib/ui/Label.js +1 -1
  253. package/lib/ui/NativeSelect.js +1 -1
  254. package/lib/ui/Pagination.js +1 -1
  255. package/lib/ui/Popover.js +1 -1
  256. package/lib/ui/Progress.js +1 -1
  257. package/lib/ui/RadioGroup.js +1 -1
  258. package/lib/ui/ScrollArea.js +1 -1
  259. package/lib/ui/Secret.js +1 -1
  260. package/lib/ui/Separator.js +1 -1
  261. package/lib/ui/Skeleton.js +1 -1
  262. package/lib/ui/Slider.js +1 -1
  263. package/lib/ui/Switch.js +1 -1
  264. package/lib/ui/SyntaxHighlight.js +3 -3
  265. package/lib/ui/Tabs.js +1 -1
  266. package/lib/ui/Textarea.js +1 -1
  267. package/lib/ui/Toggle.js +1 -1
  268. package/lib/ui/ToggleGroup.js +1 -1
  269. package/lib/ui/Value.js +1 -1
  270. package/lib/ui/util.js +1 -1
  271. package/lib/{useMutation-C6RqWmTS.js → useMutation-CFMGlAMW.js} +39 -17
  272. package/lib/useMutation-CFMGlAMW.js.map +1 -0
  273. package/lib/useSuspenseQuery-CSB_rVek.js +1226 -0
  274. package/lib/useSuspenseQuery-CSB_rVek.js.map +1 -0
  275. package/lib/zudoku.__internal.js +826 -1325
  276. package/lib/zudoku.__internal.js.map +1 -1
  277. package/lib/zudoku.auth-auth0.js +16 -16
  278. package/lib/zudoku.auth-auth0.js.map +1 -1
  279. package/lib/zudoku.auth-azureb2c.js +4 -4
  280. package/lib/zudoku.auth-clerk.js +52 -75
  281. package/lib/zudoku.auth-clerk.js.map +1 -1
  282. package/lib/zudoku.auth-firebase.js +6 -5
  283. package/lib/zudoku.auth-firebase.js.map +1 -1
  284. package/lib/zudoku.auth-openid.js +5 -5
  285. package/lib/zudoku.auth-supabase.js +31 -40
  286. package/lib/zudoku.auth-supabase.js.map +1 -1
  287. package/lib/zudoku.components.js +23 -21
  288. package/lib/zudoku.hooks.js +3 -3
  289. package/lib/zudoku.mermaid.js +3 -3
  290. package/lib/zudoku.plugin-api-catalog.js +8 -8
  291. package/lib/zudoku.plugin-api-keys.js +607 -552
  292. package/lib/zudoku.plugin-api-keys.js.map +1 -1
  293. package/lib/zudoku.plugin-custom-pages.js +1 -1
  294. package/lib/zudoku.plugin-markdown.js +1 -1
  295. package/lib/zudoku.plugin-openapi.js +3 -3
  296. package/lib/zudoku.plugin-redirect.js +1 -1
  297. package/lib/zudoku.plugin-search-pagefind.js +30 -29
  298. package/lib/zudoku.plugin-search-pagefind.js.map +1 -1
  299. package/lib/zudoku.plugins.js +9 -8
  300. package/lib/zudoku.plugins.js.map +1 -1
  301. package/lib/zudoku.react-query.js +440 -0
  302. package/lib/zudoku.react-query.js.map +1 -0
  303. package/lib/zudoku.router.js +1130 -1404
  304. package/lib/zudoku.router.js.map +1 -1
  305. package/package.json +28 -21
  306. package/src/lib/auth/issuer.ts +1 -1
  307. package/src/lib/authentication/authentication.ts +8 -2
  308. package/src/lib/authentication/components/CallbackHandler.tsx +1 -1
  309. package/src/lib/authentication/components/SignIn.tsx +5 -2
  310. package/src/lib/authentication/components/SignUp.tsx +5 -2
  311. package/src/lib/authentication/hook.ts +16 -0
  312. package/src/lib/authentication/providers/auth0.tsx +15 -9
  313. package/src/lib/authentication/providers/clerk.tsx +0 -26
  314. package/src/lib/authentication/providers/firebase.tsx +98 -6
  315. package/src/lib/authentication/providers/supabase.tsx +6 -15
  316. package/src/lib/authentication/ui/EmailVerificationUi.tsx +129 -0
  317. package/src/lib/authentication/ui/ZudokuAuthUi.tsx +170 -38
  318. package/src/lib/authentication/utils/relativeRedirectUrl.ts +12 -0
  319. package/src/lib/components/Pagination.tsx +4 -5
  320. package/src/lib/components/index.ts +4 -0
  321. package/src/lib/components/navigation/NavigationItem.tsx +9 -3
  322. package/src/lib/core/RouteGuard.tsx +30 -24
  323. package/src/lib/core/plugins.ts +21 -1
  324. package/src/lib/core/react-query.ts +1 -0
  325. package/src/lib/core/transform-config.ts +29 -0
  326. package/src/lib/errors/ErrorMessage.tsx +38 -0
  327. package/src/lib/oas/graphql/circular.test.ts +221 -0
  328. package/src/lib/oas/graphql/circular.ts +31 -18
  329. package/src/lib/oas/graphql/index.ts +7 -3
  330. package/src/lib/plugins/api-keys/SettingsApiKeys.tsx +36 -476
  331. package/src/lib/plugins/api-keys/index.tsx +76 -32
  332. package/src/lib/plugins/api-keys/settings/ApiKeyItem.tsx +342 -0
  333. package/src/lib/plugins/api-keys/settings/ApiKeyList.tsx +67 -0
  334. package/src/lib/plugins/api-keys/settings/RevealApiKey.tsx +124 -0
  335. package/src/lib/plugins/openapi/OasProvider.tsx +10 -2
  336. package/src/lib/plugins/openapi/OperationList.tsx +4 -4
  337. package/src/lib/plugins/openapi/ParamInfos.tsx +1 -0
  338. package/src/lib/plugins/openapi/Sidecar.tsx +3 -2
  339. package/src/lib/plugins/openapi/interfaces.ts +6 -1
  340. package/src/lib/plugins/openapi/schema/SchemaView.tsx +6 -4
  341. package/src/lib/plugins/openapi/schema/utils.ts +15 -4
  342. package/src/lib/plugins/openapi/util/createHttpSnippet.ts +29 -1
  343. package/src/lib/plugins/openapi/util/getRoutes.tsx +4 -1
  344. package/src/lib/ui/Button.tsx +1 -0
  345. package/src/lib/util/invariant.ts +2 -1
  346. package/src/shiki/langs/c3.js +1 -0
  347. package/src/shiki/langs/gn.js +1 -0
  348. package/src/shiki/langs/moonbit.js +1 -0
  349. package/lib/ClaudeLogo-B4Xxt-x_.js.map +0 -1
  350. package/lib/ErrorAlert-DrOR8w3f.js.map +0 -1
  351. package/lib/OAuthErrorPage-Fq54RLgt.js.map +0 -1
  352. package/lib/OasProvider-DPH8mwDa.js +0 -40
  353. package/lib/OasProvider-DPH8mwDa.js.map +0 -1
  354. package/lib/RouteGuard-9wjejsKm.js +0 -77
  355. package/lib/RouteGuard-9wjejsKm.js.map +0 -1
  356. package/lib/RouterError-DSLXagd5.js +0 -42
  357. package/lib/RouterError-DSLXagd5.js.map +0 -1
  358. package/lib/SchemaView-DVae4RO2.js +0 -597
  359. package/lib/SchemaView-DVae4RO2.js.map +0 -1
  360. package/lib/Select-CkxXP5I7.js.map +0 -1
  361. package/lib/SignUp-BjS4ozA7.js +0 -50
  362. package/lib/SignUp-BjS4ozA7.js.map +0 -1
  363. package/lib/SyntaxHighlight-Kdyskw3C.js.map +0 -1
  364. package/lib/ZudokuContext-BXldanA8.js +0 -1508
  365. package/lib/ZudokuContext-BXldanA8.js.map +0 -1
  366. package/lib/___vite-browser-external_commonjs-proxy-Cga3HsWk.js.map +0 -1
  367. package/lib/chunk-PVWAREVJ-dLIqswPy.js +0 -7965
  368. package/lib/chunk-PVWAREVJ-dLIqswPy.js.map +0 -1
  369. package/lib/cn-dYga0KKN.js.map +0 -1
  370. package/lib/createVariantComponent-B9_dVBvu.js +0 -35
  371. package/lib/createVariantComponent-B9_dVBvu.js.map +0 -1
  372. package/lib/firebase-qUdSEL1p.js.map +0 -1
  373. package/lib/hook-BNxidGQq.js +0 -40
  374. package/lib/hook-BNxidGQq.js.map +0 -1
  375. package/lib/index-CCmMJp02.js +0 -1059
  376. package/lib/index-CCmMJp02.js.map +0 -1
  377. package/lib/index.esm-kW-Utcsi.js.map +0 -1
  378. package/lib/invariant-CGOLuIIz.js.map +0 -1
  379. package/lib/mutation-BoVlx8yA.js.map +0 -1
  380. package/lib/useMutation-C6RqWmTS.js.map +0 -1
@@ -1,181 +1,26 @@
1
+ import { useState } from "react";
2
+ import { ErrorBoundary } from "react-error-boundary";
3
+ import { Button } from "zudoku/components";
4
+ import { useAuth } from "zudoku/hooks";
1
5
  import {
2
- useMutation,
3
- useQueryClient,
4
- useSuspenseQuery,
5
- } from "@tanstack/react-query";
6
- import {
7
- CheckIcon,
8
- CircleSlashIcon,
9
- PencilLineIcon,
10
- RefreshCwIcon,
11
- TrashIcon,
12
- XIcon,
13
- } from "lucide-react";
14
- import { AnimatePresence } from "motion/react";
15
- import React, { useState } from "react";
16
- import { Alert, AlertTitle } from "zudoku/ui/Alert.js";
17
- import { Card, CardHeader } from "zudoku/ui/Card.js";
18
- import {
19
- Dialog,
20
- DialogClose,
21
- DialogContent,
22
- DialogDescription,
23
- DialogFooter,
24
- DialogHeader,
25
- DialogTitle,
26
- DialogTrigger,
27
- } from "zudoku/ui/Dialog.js";
28
- import { Secret } from "zudoku/ui/Secret.js";
29
- import { useZudoku } from "../../components/context/ZudokuContext.js";
6
+ Item,
7
+ ItemActions,
8
+ ItemContent,
9
+ ItemDescription,
10
+ ItemTitle,
11
+ } from "zudoku/ui/Item.js";
30
12
  import { Slot } from "../../components/Slot.js";
31
- import { Button } from "../../ui/Button.js";
32
- import { Input } from "../../ui/Input.js";
33
- import { cn } from "../../util/cn.js";
13
+ import { ErrorMessage } from "../../errors/ErrorMessage.js";
34
14
  import { CreateApiKeyDialog } from "./CreateApiKeyDialog.js";
35
- import type { ApiConsumer, ApiKey, ApiKeyService } from "./index.js";
15
+ import type { ApiKeyService } from "./index.js";
16
+ import { ApiKeyList } from "./settings/ApiKeyList.js";
36
17
 
37
18
  export const SettingsApiKeys = ({ service }: { service: ApiKeyService }) => {
38
- const context = useZudoku();
39
- const queryClient = useQueryClient();
40
- const [editingConsumerId, setEditingConsumerId] = useState<string | null>(
41
- null,
42
- );
43
- const [editingLabel, setEditingLabel] = useState<string>("");
44
- const { data, isFetching } = useSuspenseQuery({
45
- queryFn: () => service.getConsumers(context),
46
- queryKey: ["api-keys"],
47
- retry: false,
48
- });
49
-
50
19
  const [isCreateApiKeyOpen, setIsCreateApiKeyOpen] = useState(false);
51
-
52
- const deleteKeyMutation = useMutation({
53
- mutationFn: ({
54
- consumerId,
55
- keyId,
56
- }: {
57
- consumerId: string;
58
- keyId: string;
59
- }) => {
60
- if (!service.deleteKey) {
61
- throw new Error("deleteKey not implemented");
62
- }
63
-
64
- return service.deleteKey(consumerId, keyId, context);
65
- },
66
- onMutate: async ({ consumerId, keyId }) => {
67
- await queryClient.cancelQueries({ queryKey: ["api-keys"] });
68
- const previousData = queryClient.getQueryData<ApiConsumer[]>([
69
- "api-keys",
70
- ]);
71
- queryClient.setQueryData<ApiConsumer[]>(["api-keys"], (old) => {
72
- if (!old) {
73
- return old;
74
- }
75
-
76
- return old.map((consumer) => {
77
- if (consumer.id === consumerId) {
78
- return {
79
- ...consumer,
80
- apiKeys: consumer.apiKeys.filter((key) => key.id !== keyId),
81
- };
82
- }
83
- return consumer;
84
- });
85
- });
86
-
87
- return { previousData };
88
- },
89
- onError: (_err, _variables, context) => {
90
- if (context?.previousData) {
91
- queryClient.setQueryData(["api-keys"], context.previousData);
92
- }
93
- },
94
- onSuccess: () => {
95
- void queryClient.invalidateQueries({ queryKey: ["api-keys"] });
96
- },
97
- });
98
-
99
- const updateConsumerMutation = useMutation({
100
- mutationFn: ({
101
- consumerId,
102
- label,
103
- }: {
104
- consumerId: string;
105
- label: string;
106
- }) => {
107
- if (!service.updateConsumer) {
108
- throw new Error("updateConsumer not implemented");
109
- }
110
-
111
- return service.updateConsumer({ id: consumerId, label }, context);
112
- },
113
- onMutate: async ({ consumerId, label }) => {
114
- await queryClient.cancelQueries({ queryKey: ["api-keys"] });
115
-
116
- const previousData = queryClient.getQueryData(["api-keys"]);
117
- queryClient.setQueryData<ApiConsumer[]>(["api-keys"], (old) => {
118
- if (!old) {
119
- return old;
120
- }
121
-
122
- return old.map((consumer) => {
123
- if (consumer.id === consumerId) {
124
- return {
125
- ...consumer,
126
- label,
127
- };
128
- }
129
- return consumer;
130
- });
131
- });
132
-
133
- return { previousData };
134
- },
135
- onError: (_err, _variables, context) => {
136
- if (context?.previousData) {
137
- queryClient.setQueryData(["api-keys"], context.previousData);
138
- }
139
- },
140
- onSuccess: () => {
141
- void queryClient.invalidateQueries({ queryKey: ["api-keys"] });
142
- },
143
- });
144
-
145
- const rollKeyMutation = useMutation({
146
- mutationFn: (id: string) => {
147
- if (!service.rollKey) {
148
- throw new Error("rollKey not implemented");
149
- }
150
-
151
- return service.rollKey(id, context);
152
- },
153
- onSuccess: () => queryClient.invalidateQueries({ queryKey: ["api-keys"] }),
154
- });
155
-
156
- const handleStartEdit = (consumerId: string, currentLabel: string) => {
157
- setEditingConsumerId(consumerId);
158
- setEditingLabel(currentLabel);
159
- };
160
-
161
- const handleSaveEdit = (consumerId: string) => {
162
- if (editingLabel.trim()) {
163
- updateConsumerMutation.mutate({
164
- consumerId,
165
- label: editingLabel.trim(),
166
- });
167
- }
168
- setEditingConsumerId(null);
169
- setEditingLabel("");
170
- };
171
-
172
- const handleCancelEdit = () => {
173
- setEditingConsumerId(null);
174
- setEditingLabel("");
175
- };
20
+ const auth = useAuth();
176
21
 
177
22
  return (
178
- <div className="max-w-screen-md h-full pt-(--padding-content-top) pb-(--padding-content-bottom)">
23
+ <div className="max-w-3xl h-full pt-(--padding-content-top) pb-(--padding-content-bottom)">
179
24
  <Slot.Target name="api-keys-list-page" />
180
25
 
181
26
  <div className="flex justify-between pb-3">
@@ -192,313 +37,28 @@ export const SettingsApiKeys = ({ service }: { service: ApiKeyService }) => {
192
37
  <p>Create, manage, and monitor your API keys</p>
193
38
 
194
39
  <Slot.Target name="api-keys-list-page-before-keys" />
195
- <div className="h-8"></div>
196
- {rollKeyMutation.isError && (
197
- <Alert variant="destructive" className="mb-4">
198
- <CircleSlashIcon size={16} />
199
- <AlertTitle>{rollKeyMutation.error.message}</AlertTitle>
200
- </Alert>
201
- )}
202
- {updateConsumerMutation.isError && (
203
- <Alert variant="destructive" className="mb-4">
204
- <CircleSlashIcon size={16} />
205
- <AlertTitle>{updateConsumerMutation.error.message}</AlertTitle>
206
- </Alert>
40
+ {auth.profile?.emailVerified === false ? (
41
+ <Item variant="outline">
42
+ <ItemContent>
43
+ <ItemTitle>Verified email required</ItemTitle>
44
+ <ItemDescription>
45
+ You need to verify your email to access API keys.
46
+ </ItemDescription>
47
+ </ItemContent>
48
+
49
+ <ItemActions>
50
+ <Button onClick={() => auth.requestEmailVerification()}>
51
+ Verify email
52
+ </Button>
53
+ </ItemActions>
54
+ </Item>
55
+ ) : (
56
+ <ErrorBoundary
57
+ fallbackRender={({ error }) => <ErrorMessage error={error} />}
58
+ >
59
+ <ApiKeyList service={service} />
60
+ </ErrorBoundary>
207
61
  )}
208
- {deleteKeyMutation.isError && (
209
- <Alert variant="destructive" className="mb-4">
210
- <CircleSlashIcon size={16} />
211
- <AlertTitle>{deleteKeyMutation.error.message}</AlertTitle>
212
- </Alert>
213
- )}
214
- <div className="">
215
- {data.length === 0 ? (
216
- <div className="flex col-span-full flex-col justify-center gap-4 items-center p-8 border rounded-sm bg-muted/30 text-muted-foreground">
217
- <p className="text-center">
218
- You have no API keys yet.
219
- <br />
220
- {service.createKey && "Get started and create your first key."}
221
- </p>
222
- {service.createKey && (
223
- <CreateApiKeyDialog
224
- service={service}
225
- isOpen={isCreateApiKeyOpen}
226
- onOpenChange={setIsCreateApiKeyOpen}
227
- />
228
- )}
229
- </div>
230
- ) : (
231
- <ul
232
- className={cn(
233
- "grid grid-cols-[1fr_min-content] divide-y divide-border col-span-6",
234
- )}
235
- >
236
- {data.map((consumers) => (
237
- <Card
238
- className="grid grid-cols-subgrid col-span-full items-center mb-4 group"
239
- key={consumers.id}
240
- >
241
- <CardHeader className="border-b col-span-full grid-cols-subgrid grid">
242
- <div className="h-10 flex flex-col text-sm justify-center">
243
- <div className="font-medium text-lg flex items-center gap-2">
244
- {editingConsumerId === consumers.id ? (
245
- <div className="flex items-center gap-2 w-full">
246
- <Input
247
- maxLength={32}
248
- value={editingLabel}
249
- onChange={(e) => setEditingLabel(e.target.value)}
250
- onKeyDown={(e) => {
251
- if (e.key === "Enter") {
252
- handleSaveEdit(consumers.id);
253
- } else if (e.key === "Escape") {
254
- handleCancelEdit();
255
- }
256
- }}
257
- className="text-lg font-medium"
258
- autoFocus
259
- />
260
- <div className="flex items-center">
261
- <Button
262
- size="icon"
263
- variant="ghost"
264
- onClick={() => handleSaveEdit(consumers.id)}
265
- disabled={!editingLabel.trim()}
266
- >
267
- <CheckIcon size={16} />
268
- </Button>
269
- <Button
270
- size="icon"
271
- variant="ghost"
272
- onClick={handleCancelEdit}
273
- >
274
- <XIcon size={16} />
275
- </Button>
276
- </div>
277
- </div>
278
- ) : (
279
- consumers.label
280
- )}
281
- <div className="text-muted-foreground text-xs">
282
- {consumers.createdOn}
283
- </div>
284
- </div>
285
- <div className="text-muted-foreground text-xs">
286
- {consumers.createdOn && (
287
- <div>
288
- Created on{" "}
289
- {new Date(consumers.createdOn).toLocaleDateString()}
290
- </div>
291
- )}
292
- {consumers.expiresOn && (
293
- <div>
294
- Expires on{" "}
295
- {new Date(consumers.expiresOn).toLocaleDateString()}
296
- </div>
297
- )}
298
- </div>
299
- </div>
300
-
301
- <div className="flex justify-end">
302
- {service.updateConsumer && (
303
- <Button
304
- variant="ghost"
305
- onClick={() =>
306
- handleStartEdit(consumers.id, consumers.label)
307
- }
308
- className={cn(
309
- "flex gap-2",
310
- editingConsumerId === consumers.id &&
311
- "opacity-0! pointer-events-none",
312
- )}
313
- disabled={editingConsumerId === consumers.id}
314
- >
315
- <PencilLineIcon size={16} />
316
- <span className="hidden md:block">Edit label</span>
317
- </Button>
318
- )}
319
- {service.rollKey && (
320
- <Dialog>
321
- <DialogTrigger asChild>
322
- <Button
323
- title="Roll this key"
324
- variant="ghost"
325
- disabled={rollKeyMutation.isPending}
326
- className="flex items-center gap-2"
327
- >
328
- <RefreshCwIcon
329
- size={16}
330
- className={
331
- rollKeyMutation.isPending
332
- ? "animate-spin"
333
- : undefined
334
- }
335
- />
336
- <span className="hidden md:block">Roll key</span>
337
- </Button>
338
- </DialogTrigger>
339
- <DialogContent>
340
- <DialogHeader>
341
- <DialogTitle>Roll API Key</DialogTitle>
342
- <DialogDescription>
343
- Are you sure you want to roll this API key?
344
- </DialogDescription>
345
- </DialogHeader>
346
- <DialogFooter>
347
- <DialogClose asChild>
348
- <Button variant="outline">Cancel</Button>
349
- </DialogClose>
350
- <DialogClose asChild>
351
- <Button
352
- onClick={() => {
353
- rollKeyMutation.mutate(consumers.id);
354
- }}
355
- >
356
- Roll Key
357
- </Button>
358
- </DialogClose>
359
- </DialogFooter>
360
- </DialogContent>
361
- </Dialog>
362
- )}
363
- </div>
364
- </CardHeader>
365
- <div className="col-span-full grid-cols-subgrid grid">
366
- <AnimatePresence>
367
- {consumers.apiKeys.map((apiKey) => (
368
- <React.Fragment key={apiKey.id}>
369
- <RevealApiKey
370
- apiKey={apiKey}
371
- onDeleteKey={() => {
372
- deleteKeyMutation.mutate({
373
- consumerId: consumers.id,
374
- keyId: apiKey.id,
375
- });
376
- }}
377
- className={
378
- deleteKeyMutation.variables?.keyId === apiKey.id &&
379
- (deleteKeyMutation.isPending || isFetching)
380
- ? "opacity-10!"
381
- : undefined
382
- }
383
- />
384
- <div className="col-span-full h-px bg-border"></div>
385
- </React.Fragment>
386
- ))}
387
- </AnimatePresence>
388
- </div>
389
- </Card>
390
- ))}
391
- </ul>
392
- )}
393
- </div>
394
- </div>
395
- );
396
- };
397
-
398
- const getTimeAgo = (date: string) => {
399
- const now = new Date();
400
- const created = new Date(date);
401
- const diffInSeconds = Math.floor((now.getTime() - created.getTime()) / 1000);
402
-
403
- const rtf = new Intl.RelativeTimeFormat("en", { numeric: "auto" });
404
-
405
- if (diffInSeconds < 60) return rtf.format(-diffInSeconds, "second");
406
- if (diffInSeconds < 3600)
407
- return rtf.format(-Math.floor(diffInSeconds / 60), "minute");
408
- if (diffInSeconds < 86400)
409
- return rtf.format(-Math.floor(diffInSeconds / 3600), "hour");
410
- if (diffInSeconds < 2592000)
411
- return rtf.format(-Math.floor(diffInSeconds / 86400), "day");
412
- if (diffInSeconds < 31536000)
413
- return rtf.format(-Math.floor(diffInSeconds / 2592000), "month");
414
- return rtf.format(-Math.floor(diffInSeconds / 31536000), "year");
415
- };
416
-
417
- const RevealApiKey = ({
418
- apiKey,
419
- onDeleteKey,
420
- className,
421
- }: {
422
- apiKey: ApiKey;
423
- onDeleteKey: () => void;
424
- className?: string;
425
- }) => {
426
- const [revealed, setRevealed] = useState(false);
427
-
428
- const { key, createdOn, expiresOn } = apiKey;
429
- const isExpired = expiresOn && new Date(expiresOn) < new Date();
430
- const daysUntilExpiry = expiresOn
431
- ? Math.ceil(
432
- (new Date(expiresOn).getTime() - Date.now()) / (1000 * 60 * 60 * 24),
433
- )
434
- : Infinity;
435
- const expiresSoon = daysUntilExpiry <= 7 && !isExpired;
436
-
437
- return (
438
- <div className={cn("grid col-span-full grid-cols-subgrid p-6", className)}>
439
- <div className="flex flex-col gap-1">
440
- <Secret
441
- className="max-w-fit w-full"
442
- secret={key}
443
- status={isExpired ? "expired" : expiresSoon ? "expiring" : "active"}
444
- revealed={revealed}
445
- onReveal={setRevealed}
446
- />
447
- <div className="flex gap-1 mt-0.5 text-nowrap">
448
- {createdOn && (
449
- <span className="text-xs text-muted-foreground">
450
- Created {getTimeAgo(createdOn)}.
451
- </span>
452
- )}{" "}
453
- {expiresOn && expiresSoon && (
454
- <span className="text-xs text-primary">
455
- Expires in {daysUntilExpiry}{" "}
456
- {daysUntilExpiry === 1 ? "day" : "days"}.
457
- </span>
458
- )}
459
- {expiresOn && isExpired && (
460
- <span className="text-xs text-primary">
461
- Expired{" "}
462
- {daysUntilExpiry === 0
463
- ? "today."
464
- : `${daysUntilExpiry * -1} days ago.`}
465
- </span>
466
- )}
467
- </div>
468
- </div>
469
- <div className="flex justify-end">
470
- {expiresOn && onDeleteKey && (
471
- <Dialog>
472
- <DialogTrigger asChild>
473
- <Button variant="ghost" size="icon">
474
- <TrashIcon size={16} />
475
- </Button>
476
- </DialogTrigger>
477
- <DialogContent>
478
- <DialogHeader>
479
- <DialogTitle>Delete API Key</DialogTitle>
480
- <DialogDescription>
481
- Are you sure you want to delete this API key?
482
- </DialogDescription>
483
- </DialogHeader>
484
- <DialogFooter>
485
- <DialogClose asChild>
486
- <Button variant="outline">Cancel</Button>
487
- </DialogClose>
488
- <DialogClose asChild>
489
- <Button
490
- onClick={() => {
491
- onDeleteKey();
492
- }}
493
- >
494
- Delete
495
- </Button>
496
- </DialogClose>
497
- </DialogFooter>
498
- </DialogContent>
499
- </Dialog>
500
- )}
501
- </div>
502
62
  </div>
503
63
  );
504
64
  };