zudoku 0.0.0-fix-firebase-export.f8270825 → 0.0.0-fix-warnings.z053d4e27

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 (424) 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 +121 -119
  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/ProtectedRoutesSchema.d.ts +1 -1
  12. package/dist/config/validators/validate.d.ts +60 -13
  13. package/dist/config/validators/validate.js +7 -4
  14. package/dist/config/validators/validate.js.map +1 -1
  15. package/dist/flat-config.d.ts +28 -26
  16. package/dist/index.d.ts +2 -1
  17. package/dist/index.js +2 -1
  18. package/dist/index.js.map +1 -1
  19. package/dist/lib/auth/issuer.js +1 -1
  20. package/dist/lib/auth/issuer.js.map +1 -1
  21. package/dist/lib/authentication/authentication.d.ts +3 -2
  22. package/dist/lib/authentication/components/CallbackHandler.js +1 -1
  23. package/dist/lib/authentication/components/CallbackHandler.js.map +1 -1
  24. package/dist/lib/authentication/components/SignIn.js +4 -2
  25. package/dist/lib/authentication/components/SignIn.js.map +1 -1
  26. package/dist/lib/authentication/components/SignUp.js +4 -2
  27. package/dist/lib/authentication/components/SignUp.js.map +1 -1
  28. package/dist/lib/authentication/hook.d.ts +2 -0
  29. package/dist/lib/authentication/hook.js +10 -0
  30. package/dist/lib/authentication/hook.js.map +1 -1
  31. package/dist/lib/authentication/providers/auth0.js +11 -7
  32. package/dist/lib/authentication/providers/auth0.js.map +1 -1
  33. package/dist/lib/authentication/providers/clerk.js +0 -22
  34. package/dist/lib/authentication/providers/clerk.js.map +1 -1
  35. package/dist/lib/authentication/providers/firebase.js +67 -9
  36. package/dist/lib/authentication/providers/firebase.js.map +1 -1
  37. package/dist/lib/authentication/providers/supabase.js +6 -15
  38. package/dist/lib/authentication/providers/supabase.js.map +1 -1
  39. package/dist/lib/authentication/ui/EmailVerificationUi.d.ts +4 -0
  40. package/dist/lib/authentication/ui/EmailVerificationUi.js +34 -0
  41. package/dist/lib/authentication/ui/EmailVerificationUi.js.map +1 -0
  42. package/dist/lib/authentication/ui/ZudokuAuthUi.d.ts +7 -2
  43. package/dist/lib/authentication/ui/ZudokuAuthUi.js +43 -11
  44. package/dist/lib/authentication/ui/ZudokuAuthUi.js.map +1 -1
  45. package/dist/lib/authentication/utils/relativeRedirectUrl.d.ts +1 -0
  46. package/dist/lib/authentication/utils/relativeRedirectUrl.js +8 -0
  47. package/dist/lib/authentication/utils/relativeRedirectUrl.js.map +1 -0
  48. package/dist/lib/components/Heading.d.ts +1 -1
  49. package/dist/lib/components/Pagination.js +2 -2
  50. package/dist/lib/components/Pagination.js.map +1 -1
  51. package/dist/lib/components/index.d.ts +18 -69
  52. package/dist/lib/components/index.js +19 -32
  53. package/dist/lib/components/index.js.map +1 -1
  54. package/dist/lib/components/navigation/NavigationItem.js +2 -2
  55. package/dist/lib/components/navigation/NavigationItem.js.map +1 -1
  56. package/dist/lib/core/RouteGuard.js +12 -7
  57. package/dist/lib/core/RouteGuard.js.map +1 -1
  58. package/dist/lib/core/plugins.d.ts +11 -1
  59. package/dist/lib/core/plugins.js +1 -0
  60. package/dist/lib/core/plugins.js.map +1 -1
  61. package/dist/lib/core/react-query.d.ts +1 -0
  62. package/dist/lib/core/react-query.js +2 -0
  63. package/dist/lib/core/react-query.js.map +1 -0
  64. package/dist/lib/core/transform-config.d.ts +2 -0
  65. package/dist/lib/core/transform-config.js +22 -0
  66. package/dist/lib/core/transform-config.js.map +1 -0
  67. package/dist/lib/errors/ErrorMessage.d.ts +3 -0
  68. package/dist/lib/errors/ErrorMessage.js +16 -0
  69. package/dist/lib/errors/ErrorMessage.js.map +1 -0
  70. package/dist/lib/hooks/index.d.ts +7 -28
  71. package/dist/lib/hooks/index.js +7 -15
  72. package/dist/lib/hooks/index.js.map +1 -1
  73. package/dist/lib/oas/graphql/circular.d.ts +2 -0
  74. package/dist/lib/oas/graphql/circular.js +32 -10
  75. package/dist/lib/oas/graphql/circular.js.map +1 -1
  76. package/dist/lib/oas/graphql/circular.test.d.ts +1 -0
  77. package/dist/lib/oas/graphql/circular.test.js +152 -0
  78. package/dist/lib/oas/graphql/circular.test.js.map +1 -0
  79. package/dist/lib/oas/graphql/index.js +7 -3
  80. package/dist/lib/oas/graphql/index.js.map +1 -1
  81. package/dist/lib/oas/parser/index.js +14 -5
  82. package/dist/lib/oas/parser/index.js.map +1 -1
  83. package/dist/lib/plugins/api-keys/SettingsApiKeys.js +9 -172
  84. package/dist/lib/plugins/api-keys/SettingsApiKeys.js.map +1 -1
  85. package/dist/lib/plugins/api-keys/index.d.ts +11 -4
  86. package/dist/lib/plugins/api-keys/index.js +36 -22
  87. package/dist/lib/plugins/api-keys/index.js.map +1 -1
  88. package/dist/lib/plugins/api-keys/settings/ApiKeyItem.d.ts +12 -0
  89. package/dist/lib/plugins/api-keys/settings/ApiKeyItem.js +133 -0
  90. package/dist/lib/plugins/api-keys/settings/ApiKeyItem.js.map +1 -0
  91. package/dist/lib/plugins/api-keys/settings/ApiKeyList.d.ts +4 -0
  92. package/dist/lib/plugins/api-keys/settings/ApiKeyList.js +33 -0
  93. package/dist/lib/plugins/api-keys/settings/ApiKeyList.js.map +1 -0
  94. package/dist/lib/plugins/api-keys/settings/RevealApiKey.d.ts +6 -0
  95. package/dist/lib/plugins/api-keys/settings/RevealApiKey.js +39 -0
  96. package/dist/lib/plugins/api-keys/settings/RevealApiKey.js.map +1 -0
  97. package/dist/lib/plugins/openapi/OasProvider.js +6 -2
  98. package/dist/lib/plugins/openapi/OasProvider.js.map +1 -1
  99. package/dist/lib/plugins/openapi/OperationList.js +4 -4
  100. package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
  101. package/dist/lib/plugins/openapi/ParamInfos.js +1 -0
  102. package/dist/lib/plugins/openapi/ParamInfos.js.map +1 -1
  103. package/dist/lib/plugins/openapi/Sidecar.js +3 -2
  104. package/dist/lib/plugins/openapi/Sidecar.js.map +1 -1
  105. package/dist/lib/plugins/openapi/interfaces.d.ts +3 -0
  106. package/dist/lib/plugins/openapi/schema/SchemaView.js +1 -1
  107. package/dist/lib/plugins/openapi/schema/SchemaView.js.map +1 -1
  108. package/dist/lib/plugins/openapi/schema/utils.js +11 -3
  109. package/dist/lib/plugins/openapi/schema/utils.js.map +1 -1
  110. package/dist/lib/plugins/openapi/util/createHttpSnippet.js +24 -1
  111. package/dist/lib/plugins/openapi/util/createHttpSnippet.js.map +1 -1
  112. package/dist/lib/plugins/openapi/util/getRoutes.d.ts +3 -0
  113. package/dist/lib/plugins/openapi/util/getRoutes.js +2 -1
  114. package/dist/lib/plugins/openapi/util/getRoutes.js.map +1 -1
  115. package/dist/lib/ui/Button.js +1 -1
  116. package/dist/lib/ui/Button.js.map +1 -1
  117. package/dist/lib/ui/Command.d.ts +3 -3
  118. package/dist/lib/util/flattenAllOf.d.ts +0 -2
  119. package/dist/lib/util/flattenAllOf.js +0 -46
  120. package/dist/lib/util/flattenAllOf.js.map +1 -1
  121. package/dist/lib/util/flattenAllOf.test.js +2 -1
  122. package/dist/lib/util/flattenAllOf.test.js.map +1 -1
  123. package/dist/lib/util/flattenAllOfProcessor.d.ts +2 -0
  124. package/dist/lib/util/flattenAllOfProcessor.js +48 -0
  125. package/dist/lib/util/flattenAllOfProcessor.js.map +1 -0
  126. package/dist/lib/util/invariant.d.ts +1 -1
  127. package/dist/lib/util/invariant.js +2 -2
  128. package/dist/lib/util/invariant.js.map +1 -1
  129. package/dist/lib/util/readFrontmatter.js +2 -1
  130. package/dist/lib/util/readFrontmatter.js.map +1 -1
  131. package/dist/vite/api/SchemaManager.d.ts +12 -1
  132. package/dist/vite/api/SchemaManager.js +32 -15
  133. package/dist/vite/api/SchemaManager.js.map +1 -1
  134. package/dist/vite/api/SchemaManager.test.js +45 -1
  135. package/dist/vite/api/SchemaManager.test.js.map +1 -1
  136. package/dist/vite/build.js +91 -73
  137. package/dist/vite/build.js.map +1 -1
  138. package/dist/vite/config.js +10 -4
  139. package/dist/vite/config.js.map +1 -1
  140. package/dist/vite/error-handler.js +1 -5
  141. package/dist/vite/error-handler.js.map +1 -1
  142. package/dist/vite/mdx/remark-inject-filepath.js +5 -1
  143. package/dist/vite/mdx/remark-inject-filepath.js.map +1 -1
  144. package/dist/vite/mdx/remark-link-rewrite.js +4 -3
  145. package/dist/vite/mdx/remark-link-rewrite.js.map +1 -1
  146. package/dist/vite/plugin-api-keys.js +5 -1
  147. package/dist/vite/plugin-api-keys.js.map +1 -1
  148. package/dist/vite/plugin-api.js +5 -3
  149. package/dist/vite/plugin-api.js.map +1 -1
  150. package/dist/vite/plugin-docs.js +9 -7
  151. package/dist/vite/plugin-docs.js.map +1 -1
  152. package/dist/vite/plugin-markdown-export.js +5 -3
  153. package/dist/vite/plugin-markdown-export.js.map +1 -1
  154. package/dist/vite/prerender/utils.js +9 -3
  155. package/dist/vite/prerender/utils.js.map +1 -1
  156. package/dist/vite/prerender/worker.js +3 -0
  157. package/dist/vite/prerender/worker.js.map +1 -1
  158. package/dist/vite/zuplo.d.ts +13 -0
  159. package/dist/vite/zuplo.js +15 -0
  160. package/dist/vite/zuplo.js.map +1 -0
  161. package/lib/{ActionButton-DUgvSylL.js → ActionButton-B0CXL1Lq.js} +3 -3
  162. package/lib/{ActionButton-DUgvSylL.js.map → ActionButton-B0CXL1Lq.js.map} +1 -1
  163. package/lib/{Button-CynVW1JV.js → Button-GUVe7pmt.js} +8 -7
  164. package/lib/{Button-CynVW1JV.js.map → Button-GUVe7pmt.js.map} +1 -1
  165. package/lib/{Card-KFniaZn5.js → Card-DCdq37aA.js} +2 -2
  166. package/lib/{Card-KFniaZn5.js.map → Card-DCdq37aA.js.map} +1 -1
  167. package/lib/{ClaudeLogo-B4Xxt-x_.js → ClaudeLogo-C6q-Xn_l.js} +21 -17
  168. package/lib/ClaudeLogo-C6q-Xn_l.js.map +1 -0
  169. package/lib/{Command-BpT1iBE6.js → Command-N6VujV30.js} +3 -3
  170. package/lib/{Command-BpT1iBE6.js.map → Command-N6VujV30.js.map} +1 -1
  171. package/lib/{Dialog-BQciPiHN.js → Dialog-hlvmmQ_c.js} +2 -2
  172. package/lib/{Dialog-BQciPiHN.js.map → Dialog-hlvmmQ_c.js.map} +1 -1
  173. package/lib/{Drawer-Ci7XwhqT.js → Drawer-Ch7927PF.js} +7 -7
  174. package/lib/{Drawer-Ci7XwhqT.js.map → Drawer-Ch7927PF.js.map} +1 -1
  175. package/lib/{DropdownMenu-C8SX_-S_.js → DropdownMenu-DN0jNrjj.js} +2 -2
  176. package/lib/{DropdownMenu-C8SX_-S_.js.map → DropdownMenu-DN0jNrjj.js.map} +1 -1
  177. package/lib/Frame-DKlOmSkU.js +205 -0
  178. package/lib/Frame-DKlOmSkU.js.map +1 -0
  179. package/lib/HydrationBoundary-CNF2ZV3E.js +601 -0
  180. package/lib/HydrationBoundary-CNF2ZV3E.js.map +1 -0
  181. package/lib/{IndexingDialog-B5zCiUKr.js → IndexingDialog-D0YdGfbn.js} +3 -3
  182. package/lib/{IndexingDialog-B5zCiUKr.js.map → IndexingDialog-D0YdGfbn.js.map} +1 -1
  183. package/lib/Input-Cx-GeKoF.js +22 -0
  184. package/lib/Input-Cx-GeKoF.js.map +1 -0
  185. package/lib/{MdxPage-BagO2c-n.js → MdxPage-B1G4W1TK.js} +11 -11
  186. package/lib/{MdxPage-BagO2c-n.js.map → MdxPage-B1G4W1TK.js.map} +1 -1
  187. package/lib/{Mermaid-D_VSX7_Q.js → Mermaid-B1xNo-pf.js} +5 -4
  188. package/lib/{Mermaid-D_VSX7_Q.js.map → Mermaid-B1xNo-pf.js.map} +1 -1
  189. package/lib/{OAuthErrorPage-Fq54RLgt.js → OAuthErrorPage-01Ke086W.js} +25 -23
  190. package/lib/OAuthErrorPage-01Ke086W.js.map +1 -0
  191. package/lib/OasProvider-BG-FWDIq.js +48 -0
  192. package/lib/OasProvider-BG-FWDIq.js.map +1 -0
  193. package/lib/{OperationList-C0jiEaG5.js → OperationList-GGkJ1vac.js} +1983 -1965
  194. package/lib/OperationList-GGkJ1vac.js.map +1 -0
  195. package/lib/RouteGuard-B1lCR0C_.js +77 -0
  196. package/lib/RouteGuard-B1lCR0C_.js.map +1 -0
  197. package/lib/{SchemaList-BU0zCHn9.js → SchemaList-CNVdC9f-.js} +9 -9
  198. package/lib/{SchemaList-BU0zCHn9.js.map → SchemaList-CNVdC9f-.js.map} +1 -1
  199. package/lib/SchemaView-CrV0yIwR.js +438 -0
  200. package/lib/SchemaView-CrV0yIwR.js.map +1 -0
  201. package/lib/{Select-CkxXP5I7.js → Secret-BDBqq4p3.js} +122 -122
  202. package/lib/Secret-BDBqq4p3.js.map +1 -0
  203. package/lib/{Separator-CTPSeW1S.js → Separator-BXt1LYnm.js} +2 -2
  204. package/lib/{Separator-CTPSeW1S.js.map → Separator-BXt1LYnm.js.map} +1 -1
  205. package/lib/SignUp-8kDBaLbO.js +55 -0
  206. package/lib/SignUp-8kDBaLbO.js.map +1 -0
  207. package/lib/{SyntaxHighlight-Kdyskw3C.js → SyntaxHighlight-hZOFnYl0.js} +1749 -1723
  208. package/lib/SyntaxHighlight-hZOFnYl0.js.map +1 -0
  209. package/lib/{Toc-DJxFPfcS.js → Toc-qEIii_-W.js} +3 -3
  210. package/lib/{Toc-DJxFPfcS.js.map → Toc-qEIii_-W.js.map} +1 -1
  211. package/lib/{ErrorAlert-DrOR8w3f.js → Zudoku-DUsdmPME.js} +5449 -4427
  212. package/lib/Zudoku-DUsdmPME.js.map +1 -0
  213. package/lib/ZudokuContext-BBI06sOx.js +387 -0
  214. package/lib/ZudokuContext-BBI06sOx.js.map +1 -0
  215. package/lib/chunk-EPOLDU6W-C6C8jAwd.js +8558 -0
  216. package/lib/chunk-EPOLDU6W-C6C8jAwd.js.map +1 -0
  217. package/lib/{circular-CzWF1hj5.js → circular-bbWO95zs.js} +771 -749
  218. package/lib/{circular-CzWF1hj5.js.map → circular-bbWO95zs.js.map} +1 -1
  219. package/lib/{cn-dYga0KKN.js → cn-5-Gd1Dss.js} +531 -498
  220. package/lib/cn-5-Gd1Dss.js.map +1 -0
  221. package/lib/createServer-B7POuwZp.js +13036 -0
  222. package/lib/createServer-B7POuwZp.js.map +1 -0
  223. package/lib/createVariantComponent-Dc0vtOvr.js +18 -0
  224. package/lib/createVariantComponent-Dc0vtOvr.js.map +1 -0
  225. package/lib/{errors-Bs4duWDy.js → errors-7hgPDs1h.js} +3 -3
  226. package/lib/{errors-Bs4duWDy.js.map → errors-7hgPDs1h.js.map} +1 -1
  227. package/lib/{firebase-qUdSEL1p.js → firebase-Dwn-2ju-.js} +1590 -1342
  228. package/lib/firebase-Dwn-2ju-.js.map +1 -0
  229. package/lib/hook-ZEd1Es7D.js +52 -0
  230. package/lib/hook-ZEd1Es7D.js.map +1 -0
  231. package/lib/{index-0oT9beQN.js → index-CTCT4jlW.js} +499 -493
  232. package/lib/{index-0oT9beQN.js.map → index-CTCT4jlW.js.map} +1 -1
  233. package/lib/index-CrcNWbel.js.map +1 -1
  234. package/lib/index-DAWHN3cH.js +86 -0
  235. package/lib/index-DAWHN3cH.js.map +1 -0
  236. package/lib/{index-Bh-MffiL.js → index-Dxdhrp-I.js} +2 -2
  237. package/lib/{index-Bh-MffiL.js.map → index-Dxdhrp-I.js.map} +1 -1
  238. package/lib/index.esm-BYObtETB.js.map +1 -1
  239. package/lib/{index.esm-DtzT_KoE.js → index.esm-Ca5zvoff.js} +20 -20
  240. package/lib/{index.esm-DtzT_KoE.js.map → index.esm-Ca5zvoff.js.map} +1 -1
  241. package/lib/{index.esm-kW-Utcsi.js → index.esm-DG4KaDKR.js} +16 -14
  242. package/lib/index.esm-DG4KaDKR.js.map +1 -0
  243. package/lib/{invariant-CGOLuIIz.js → invariant-B_t_F2s_.js} +6 -6
  244. package/lib/invariant-B_t_F2s_.js.map +1 -0
  245. package/lib/jsx-runtime-BzflLqGi.js.map +1 -1
  246. package/lib/{mutation-BoVlx8yA.js → mutation-BISOc7OM.js} +70 -44
  247. package/lib/mutation-BISOc7OM.js.map +1 -0
  248. package/lib/ui/Accordion.js +1 -1
  249. package/lib/ui/ActionButton.js +2 -2
  250. package/lib/ui/Alert.js +1 -1
  251. package/lib/ui/AlertDialog.js +1 -1
  252. package/lib/ui/Badge.js +1 -1
  253. package/lib/ui/Breadcrumb.js +1 -1
  254. package/lib/ui/Button.js +7 -6
  255. package/lib/ui/Button.js.map +1 -1
  256. package/lib/ui/ButtonGroup.js +1 -1
  257. package/lib/ui/Callout.js +1 -1
  258. package/lib/ui/Card.js +1 -1
  259. package/lib/ui/Carousel.js +1 -1
  260. package/lib/ui/Carousel.js.map +1 -1
  261. package/lib/ui/Checkbox.js +1 -1
  262. package/lib/ui/CodeBlock.js +1 -1
  263. package/lib/ui/Command.js +2 -2
  264. package/lib/ui/Dialog.js +1 -1
  265. package/lib/ui/Drawer.js +3 -3
  266. package/lib/ui/DropdownMenu.js +1 -1
  267. package/lib/ui/EmbeddedCodeBlock.js +1 -1
  268. package/lib/ui/Form.js +1 -1
  269. package/lib/ui/Frame.js +1 -1
  270. package/lib/ui/HoverCard.js +1 -1
  271. package/lib/ui/Input.js +1 -1
  272. package/lib/ui/Item.js +1 -1
  273. package/lib/ui/Label.js +1 -1
  274. package/lib/ui/NativeSelect.js +1 -1
  275. package/lib/ui/Pagination.js +1 -1
  276. package/lib/ui/Popover.js +1 -1
  277. package/lib/ui/Progress.js +1 -1
  278. package/lib/ui/RadioGroup.js +1 -1
  279. package/lib/ui/ScrollArea.js +1 -1
  280. package/lib/ui/Secret.js +1 -1
  281. package/lib/ui/Separator.js +1 -1
  282. package/lib/ui/Skeleton.js +1 -1
  283. package/lib/ui/Slider.js +1 -1
  284. package/lib/ui/Switch.js +1 -1
  285. package/lib/ui/SyntaxHighlight.js +3 -3
  286. package/lib/ui/Tabs.js +1 -1
  287. package/lib/ui/Textarea.js +1 -1
  288. package/lib/ui/Toggle.js +1 -1
  289. package/lib/ui/ToggleGroup.js +1 -1
  290. package/lib/ui/Value.js +1 -1
  291. package/lib/ui/util.js +1 -1
  292. package/lib/useExposedProps-CzTDfXfq.js +30 -0
  293. package/lib/useExposedProps-CzTDfXfq.js.map +1 -0
  294. package/lib/{useMutation-C6RqWmTS.js → useMutation-CFMGlAMW.js} +39 -17
  295. package/lib/useMutation-CFMGlAMW.js.map +1 -0
  296. package/lib/useSuspenseQuery-CSB_rVek.js +1226 -0
  297. package/lib/useSuspenseQuery-CSB_rVek.js.map +1 -0
  298. package/lib/zudoku.__internal.js +827 -1325
  299. package/lib/zudoku.__internal.js.map +1 -1
  300. package/lib/zudoku.auth-auth0.js +16 -16
  301. package/lib/zudoku.auth-auth0.js.map +1 -1
  302. package/lib/zudoku.auth-azureb2c.js +4 -4
  303. package/lib/zudoku.auth-clerk.js +52 -75
  304. package/lib/zudoku.auth-clerk.js.map +1 -1
  305. package/lib/zudoku.auth-firebase.js +6 -5
  306. package/lib/zudoku.auth-firebase.js.map +1 -1
  307. package/lib/zudoku.auth-openid.js +5 -5
  308. package/lib/zudoku.auth-supabase.js +31 -40
  309. package/lib/zudoku.auth-supabase.js.map +1 -1
  310. package/lib/zudoku.components.js +29 -25
  311. package/lib/zudoku.components.js.map +1 -1
  312. package/lib/zudoku.hooks.js +24 -11
  313. package/lib/zudoku.hooks.js.map +1 -1
  314. package/lib/zudoku.mermaid.js +5 -4
  315. package/lib/zudoku.mermaid.js.map +1 -1
  316. package/lib/zudoku.plugin-api-catalog.js +35 -31
  317. package/lib/zudoku.plugin-api-catalog.js.map +1 -1
  318. package/lib/zudoku.plugin-api-keys.js +607 -551
  319. package/lib/zudoku.plugin-api-keys.js.map +1 -1
  320. package/lib/zudoku.plugin-custom-pages.js +1 -1
  321. package/lib/zudoku.plugin-markdown.js +1 -1
  322. package/lib/zudoku.plugin-openapi.js +3 -3
  323. package/lib/zudoku.plugin-redirect.js +1 -1
  324. package/lib/zudoku.plugin-search-pagefind.js +30 -29
  325. package/lib/zudoku.plugin-search-pagefind.js.map +1 -1
  326. package/lib/zudoku.plugins.js +9 -8
  327. package/lib/zudoku.plugins.js.map +1 -1
  328. package/lib/zudoku.react-query.js +440 -0
  329. package/lib/zudoku.react-query.js.map +1 -0
  330. package/lib/zudoku.router.js +1130 -1404
  331. package/lib/zudoku.router.js.map +1 -1
  332. package/package.json +30 -22
  333. package/src/lib/auth/issuer.ts +1 -1
  334. package/src/lib/authentication/authentication.ts +8 -2
  335. package/src/lib/authentication/components/CallbackHandler.tsx +1 -1
  336. package/src/lib/authentication/components/SignIn.tsx +5 -2
  337. package/src/lib/authentication/components/SignUp.tsx +5 -2
  338. package/src/lib/authentication/hook.ts +16 -0
  339. package/src/lib/authentication/providers/auth0.tsx +15 -9
  340. package/src/lib/authentication/providers/clerk.tsx +0 -26
  341. package/src/lib/authentication/providers/firebase.tsx +98 -6
  342. package/src/lib/authentication/providers/supabase.tsx +6 -15
  343. package/src/lib/authentication/ui/EmailVerificationUi.tsx +129 -0
  344. package/src/lib/authentication/ui/ZudokuAuthUi.tsx +170 -38
  345. package/src/lib/authentication/utils/relativeRedirectUrl.ts +12 -0
  346. package/src/lib/components/Pagination.tsx +4 -5
  347. package/src/lib/components/index.ts +19 -35
  348. package/src/lib/components/navigation/NavigationItem.tsx +9 -3
  349. package/src/lib/core/RouteGuard.tsx +30 -24
  350. package/src/lib/core/plugins.ts +21 -1
  351. package/src/lib/core/react-query.ts +1 -0
  352. package/src/lib/core/transform-config.ts +29 -0
  353. package/src/lib/errors/ErrorMessage.tsx +38 -0
  354. package/src/lib/hooks/index.ts +7 -16
  355. package/src/lib/oas/graphql/circular.test.ts +186 -0
  356. package/src/lib/oas/graphql/circular.ts +49 -10
  357. package/src/lib/oas/graphql/index.ts +7 -3
  358. package/src/lib/oas/parser/index.ts +17 -6
  359. package/src/lib/plugins/api-keys/SettingsApiKeys.tsx +36 -476
  360. package/src/lib/plugins/api-keys/index.tsx +76 -32
  361. package/src/lib/plugins/api-keys/settings/ApiKeyItem.tsx +342 -0
  362. package/src/lib/plugins/api-keys/settings/ApiKeyList.tsx +67 -0
  363. package/src/lib/plugins/api-keys/settings/RevealApiKey.tsx +124 -0
  364. package/src/lib/plugins/openapi/OasProvider.tsx +10 -2
  365. package/src/lib/plugins/openapi/OperationList.tsx +4 -4
  366. package/src/lib/plugins/openapi/ParamInfos.tsx +1 -0
  367. package/src/lib/plugins/openapi/Sidecar.tsx +3 -2
  368. package/src/lib/plugins/openapi/interfaces.ts +6 -1
  369. package/src/lib/plugins/openapi/schema/SchemaView.tsx +6 -4
  370. package/src/lib/plugins/openapi/schema/utils.ts +15 -4
  371. package/src/lib/plugins/openapi/util/createHttpSnippet.ts +29 -1
  372. package/src/lib/plugins/openapi/util/getRoutes.tsx +4 -1
  373. package/src/lib/ui/Button.tsx +1 -0
  374. package/src/lib/util/flattenAllOf.test.ts +2 -1
  375. package/src/lib/util/flattenAllOf.ts +0 -57
  376. package/src/lib/util/flattenAllOfProcessor.ts +58 -0
  377. package/src/lib/util/invariant.ts +2 -1
  378. package/src/lib/util/readFrontmatter.ts +2 -1
  379. package/src/shiki/langs/c3.js +1 -0
  380. package/src/shiki/langs/gn.js +1 -0
  381. package/src/shiki/langs/moonbit.js +1 -0
  382. package/src/zuplo/enrich-with-zuplo-mcp.ts +168 -0
  383. package/src/zuplo/enrich-with-zuplo.ts +254 -0
  384. package/src/zuplo/policy-types.ts +46 -0
  385. package/src/zuplo/with-zuplo-processors.ts +35 -0
  386. package/src/zuplo/with-zuplo.ts +14 -0
  387. package/lib/ClaudeLogo-B4Xxt-x_.js.map +0 -1
  388. package/lib/ErrorAlert-DrOR8w3f.js.map +0 -1
  389. package/lib/OAuthErrorPage-Fq54RLgt.js.map +0 -1
  390. package/lib/OasProvider-DPH8mwDa.js +0 -40
  391. package/lib/OasProvider-DPH8mwDa.js.map +0 -1
  392. package/lib/OperationList-C0jiEaG5.js.map +0 -1
  393. package/lib/RouteGuard-9wjejsKm.js +0 -77
  394. package/lib/RouteGuard-9wjejsKm.js.map +0 -1
  395. package/lib/RouterError-DSLXagd5.js +0 -42
  396. package/lib/RouterError-DSLXagd5.js.map +0 -1
  397. package/lib/SchemaView-DVae4RO2.js +0 -597
  398. package/lib/SchemaView-DVae4RO2.js.map +0 -1
  399. package/lib/Select-CkxXP5I7.js.map +0 -1
  400. package/lib/SignUp-BjS4ozA7.js +0 -50
  401. package/lib/SignUp-BjS4ozA7.js.map +0 -1
  402. package/lib/SyntaxHighlight-Kdyskw3C.js.map +0 -1
  403. package/lib/ZudokuContext-BXldanA8.js +0 -1508
  404. package/lib/ZudokuContext-BXldanA8.js.map +0 -1
  405. package/lib/___vite-browser-external_commonjs-proxy-Cga3HsWk.js +0 -9
  406. package/lib/___vite-browser-external_commonjs-proxy-Cga3HsWk.js.map +0 -1
  407. package/lib/chunk-PVWAREVJ-dLIqswPy.js +0 -7965
  408. package/lib/chunk-PVWAREVJ-dLIqswPy.js.map +0 -1
  409. package/lib/cn-dYga0KKN.js.map +0 -1
  410. package/lib/createServer-BIr2_tGn.js +0 -16693
  411. package/lib/createServer-BIr2_tGn.js.map +0 -1
  412. package/lib/createVariantComponent-B9_dVBvu.js +0 -35
  413. package/lib/createVariantComponent-B9_dVBvu.js.map +0 -1
  414. package/lib/firebase-qUdSEL1p.js.map +0 -1
  415. package/lib/hook-BNxidGQq.js +0 -40
  416. package/lib/hook-BNxidGQq.js.map +0 -1
  417. package/lib/index-CCmMJp02.js +0 -1059
  418. package/lib/index-CCmMJp02.js.map +0 -1
  419. package/lib/index-Css56y3F.js +0 -133
  420. package/lib/index-Css56y3F.js.map +0 -1
  421. package/lib/index.esm-kW-Utcsi.js.map +0 -1
  422. package/lib/invariant-CGOLuIIz.js.map +0 -1
  423. package/lib/mutation-BoVlx8yA.js.map +0 -1
  424. package/lib/useMutation-C6RqWmTS.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zudoku",
3
- "version": "0.0.0-fix-firebase-export.f8270825",
3
+ "version": "0.0.0-fix-warnings.z053d4e27",
4
4
  "type": "module",
5
5
  "homepage": "https://zudoku.dev",
6
6
  "repository": {
@@ -18,6 +18,7 @@
18
18
  "src/lib",
19
19
  "src/app",
20
20
  "src/shiki",
21
+ "src/zuplo",
21
22
  "client.d.ts"
22
23
  ],
23
24
  "bin": {
@@ -119,6 +120,10 @@
119
120
  "import": "./lib/zudoku.router.js",
120
121
  "types": "./dist/lib/core/router.d.ts"
121
122
  },
123
+ "./react-query": {
124
+ "import": "./lib/zudoku.react-query.js",
125
+ "types": "./dist/lib/core/react-query.d.ts"
126
+ },
122
127
  "./processors/*": {
123
128
  "import": "./lib/processors/*.js",
124
129
  "types": "./dist/lib/plugins/openapi/processors/*.d.ts"
@@ -150,6 +155,7 @@
150
155
  "dependencies": {
151
156
  "@apidevtools/json-schema-ref-parser": "14.1.1",
152
157
  "@envelop/core": "5.3.2",
158
+ "@fastify/deepmerge": "3.1.0",
153
159
  "@graphql-typed-document-node/core": "3.2.0",
154
160
  "@lekoarts/rehype-meta-as-attributes": "3.0.3",
155
161
  "@mdx-js/react": "3.1.1",
@@ -180,30 +186,32 @@
180
186
  "@radix-ui/react-visually-hidden": "1.2.4",
181
187
  "@scalar/openapi-parser": "0.23.2",
182
188
  "@sentry/node": "10.27.0",
183
- "@shikijs/engine-javascript": "3.17.0",
184
- "@shikijs/langs": "3.17.0",
185
- "@shikijs/rehype": "3.17.0",
186
- "@shikijs/themes": "3.17.0",
187
- "@shikijs/transformers": "3.17.0",
189
+ "@shikijs/engine-javascript": "3.21.0",
190
+ "@shikijs/langs": "3.21.0",
191
+ "@shikijs/rehype": "3.21.0",
192
+ "@shikijs/themes": "3.21.0",
193
+ "@shikijs/transformers": "3.21.0",
188
194
  "@sindresorhus/slugify": "3.0.0",
189
195
  "@stefanprobst/rehype-extract-toc": "3.0.0",
190
196
  "@tailwindcss/typography": "0.5.19",
191
197
  "@tailwindcss/vite": "4.1.16",
192
198
  "@tanem/react-nprogress": "5.0.56",
193
- "@tanstack/react-query": "5.85.5",
199
+ "@tanstack/react-query": "5.90.12",
194
200
  "@types/react": "19.2.7",
195
- "@types/react-dom": "19.2.0",
201
+ "@types/react-dom": "19.2.3",
196
202
  "@vitejs/plugin-react": "5.1.0",
197
203
  "@x0k/json-schema-merge": "1.0.2",
198
204
  "@zudoku/httpsnippet": "10.0.9",
199
205
  "@zudoku/react-helmet-async": "2.0.5",
200
206
  "@zuplo/mcp": "^0.0.22",
207
+ "bs58": "^6.0.0",
201
208
  "class-variance-authority": "0.7.1",
202
209
  "clsx": "2.1.1",
203
210
  "cmdk": "1.1.1",
211
+ "dotenv": "^17.2.3",
204
212
  "embla-carousel-react": "8.6.0",
205
213
  "estree-util-value-to-estree": "3.4.1",
206
- "express": "5.2.0",
214
+ "express": "5.2.1",
207
215
  "fast-equals": "5.2.2",
208
216
  "glob": "13.0.0",
209
217
  "glob-parent": "6.0.2",
@@ -223,15 +231,15 @@
223
231
  "next-themes": "0.4.6",
224
232
  "oauth4webapi": "2.17.0",
225
233
  "openapi-types": "12.1.3",
226
- "pagefind": "1.4.0",
234
+ "pagefind": "1.5.0-beta.1",
227
235
  "picocolors": "1.1.1",
228
236
  "piscina": "5.1.4",
229
- "posthog-node": "5.14.1",
237
+ "posthog-node": "5.21.2",
230
238
  "react-error-boundary": "6.0.0",
231
239
  "react-hook-form": "7.66.0",
232
- "react-is": "19.2.0",
240
+ "react-is": "19.2.3",
233
241
  "react-markdown": "10.1.0",
234
- "react-router": "7.8.2",
242
+ "react-router": "7.12.0",
235
243
  "rehype-mdx-import-media": "1.2.0",
236
244
  "rehype-raw": "7.0.0",
237
245
  "rehype-slug": "6.0.0",
@@ -243,11 +251,11 @@
243
251
  "remark-mdx-frontmatter": "5.2.0",
244
252
  "rollup": "4.52.5",
245
253
  "semver": "7.7.2",
246
- "shiki": "3.17.0",
254
+ "shiki": "3.21.0",
247
255
  "sitemap": "9.0.0",
248
256
  "strip-ansi": "7.1.2",
249
- "tailwind-merge": "3.3.1",
250
- "tailwindcss": "4.1.16",
257
+ "tailwind-merge": "3.4.0",
258
+ "tailwindcss": "4.1.18",
251
259
  "tw-animate-css": "1.4.0",
252
260
  "unified": "^11.0.5",
253
261
  "unist-util-visit": "5.0.0",
@@ -266,28 +274,28 @@
266
274
  "@testing-library/jest-dom": "6.9.1",
267
275
  "@testing-library/react": "16.3.0",
268
276
  "@types/estree": "1.0.8",
269
- "@types/express": "5.0.5",
277
+ "@types/express": "5.0.6",
270
278
  "@types/glob-parent": "5.1.3",
271
279
  "@types/har-format": "1.2.16",
272
280
  "@types/hast": "^3.0.4",
273
281
  "@types/json-schema": "7.0.15",
274
282
  "@types/mdast": "4.0.4",
275
283
  "@types/mdx": "2.0.13",
276
- "@types/node": "22.13.5",
284
+ "@types/node": "22.19.1",
277
285
  "@types/react-is": "19.2.0",
278
286
  "@types/semver": "7.7.0",
279
287
  "@types/unist": "^3.0.3",
280
288
  "@types/yargs": "17.0.35",
281
- "@vitest/coverage-v8": "3.2.4",
289
+ "@vitest/coverage-v8": "4.0.16",
282
290
  "esbuild": "0.27.0",
283
291
  "happy-dom": "20.0.10",
284
292
  "mdast-util-mdx": "3.0.0",
285
- "react": "19.2.0",
286
- "react-dom": "19.2.0",
293
+ "react": "19.2.3",
294
+ "react-dom": "19.2.3",
287
295
  "rollup-plugin-visualizer": "6.0.5",
288
296
  "tsx": "4.20.6",
289
297
  "typescript": "5.9.3",
290
- "vitest": "4.0.6"
298
+ "vitest": "4.0.15"
291
299
  },
292
300
  "peerDependencies": {
293
301
  "@azure/msal-browser": "^4.13.0",
@@ -32,7 +32,7 @@ export const getIssuer = async (config: ZudokuConfig) => {
32
32
  return config.authentication.issuer;
33
33
  }
34
34
  case "firebase": {
35
- return config.authentication.authDomain;
35
+ return `https://securetoken.google.com/${config.authentication.projectId}`;
36
36
  }
37
37
  case undefined: {
38
38
  return undefined;
@@ -6,6 +6,7 @@ export type AuthActionOptions = { redirectTo?: string; replace?: boolean };
6
6
 
7
7
  export interface AuthenticationPlugin {
8
8
  initialize?(context: ZudokuContext): Promise<void>;
9
+ onPageLoad?(): void;
9
10
  setNavigate?(navigate: NavigateFunction): void;
10
11
 
11
12
  signUp(
@@ -18,12 +19,17 @@ export interface AuthenticationPlugin {
18
19
  ): Promise<void>;
19
20
 
20
21
  signOut({ navigate }: AuthActionContext): Promise<void>;
22
+
23
+ signRequest(request: Request): Promise<Request>;
24
+ requestEmailVerification?(
25
+ { navigate }: AuthActionContext,
26
+ options?: AuthActionOptions,
27
+ ): Promise<void>;
28
+
21
29
  /**
22
30
  * @deprecated use signRequest instead
23
31
  */
24
32
  getAccessToken?(): Promise<string>;
25
- onPageLoad?(): void;
26
- signRequest(request: Request): Promise<Request>;
27
33
  }
28
34
 
29
35
  export type AuthenticationProviderInitializer<TConfig> = (
@@ -13,7 +13,7 @@ export function CallbackHandler({
13
13
  const { options } = useZudoku();
14
14
  const executeCallback = useSuspenseQuery({
15
15
  retry: false,
16
- queryKey: ["oauth-callback"],
16
+ queryKey: ["oauth-callback", window.location.search],
17
17
  queryFn: async () => {
18
18
  const url = new URL(window.location.href);
19
19
 
@@ -8,6 +8,7 @@ import {
8
8
  CardHeader,
9
9
  CardTitle,
10
10
  } from "zudoku/ui/Card.js";
11
+ import { useLatest } from "../../util/useLatest.js";
11
12
  import { useAuth } from "../hook.js";
12
13
 
13
14
  export const SignIn = () => {
@@ -15,12 +16,14 @@ export const SignIn = () => {
15
16
  const [search] = useSearchParams();
16
17
  const redirectTo = search.get("redirect") ?? undefined;
17
18
 
19
+ const login = useLatest(auth.login);
20
+
18
21
  useEffect(() => {
19
- void auth.login({
22
+ void login.current({
20
23
  redirectTo,
21
24
  replace: true,
22
25
  });
23
- }, [auth, redirectTo]);
26
+ }, [login, redirectTo]);
24
27
 
25
28
  return (
26
29
  <div className="flex items-center justify-center mt-8">
@@ -7,14 +7,17 @@ import {
7
7
  CardHeader,
8
8
  CardTitle,
9
9
  } from "zudoku/ui/Card.js";
10
+ import { useLatest } from "../../util/useLatest.js";
10
11
  import { useAuth } from "../hook.js";
11
12
 
12
13
  export const SignUp = () => {
13
14
  const auth = useAuth();
14
15
 
16
+ const signup = useLatest(auth.signup);
17
+
15
18
  useEffect(() => {
16
- void auth.signup();
17
- }, [auth]);
19
+ void signup.current();
20
+ }, [signup]);
18
21
 
19
22
  return (
20
23
  <div className="flex items-center justify-center mt-8">
@@ -52,5 +52,21 @@ export const useAuth = () => {
52
52
  },
53
53
  );
54
54
  },
55
+ supportsEmailVerification:
56
+ typeof authentication?.requestEmailVerification === "function",
57
+
58
+ requestEmailVerification: async (options?: AuthActionOptions) => {
59
+ if (!isAuthEnabled) {
60
+ throw new Error("Authentication is not enabled.");
61
+ }
62
+
63
+ await authentication.requestEmailVerification?.(
64
+ { navigate },
65
+ {
66
+ ...options,
67
+ redirectTo: options?.redirectTo ?? window.location.href,
68
+ },
69
+ );
70
+ },
55
71
  };
56
72
  };
@@ -1,4 +1,5 @@
1
1
  import type { Auth0AuthenticationConfig } from "../../../config/config.js";
2
+ import { joinUrl } from "../../util/joinUrl.js";
2
3
  import type {
3
4
  AuthActionContext,
4
5
  AuthenticationPlugin,
@@ -43,7 +44,10 @@ class Auth0AuthenticationProvider
43
44
 
44
45
  signOut = async (_: AuthActionContext): Promise<void> => {
45
46
  const as = await this.getAuthServer();
46
- const idToken = await this.getAccessToken();
47
+
48
+ // biome-ignore lint/suspicious/noExplicitAny: We don't have a good way for typing provider-data yet.
49
+ const providerData = useAuthState.getState().providerData as any;
50
+ const idToken = providerData?.idToken;
47
51
 
48
52
  useAuthState.setState({
49
53
  isAuthenticated: false,
@@ -53,15 +57,18 @@ class Auth0AuthenticationProvider
53
57
  });
54
58
 
55
59
  const redirectUrl = new URL(window.location.origin);
56
- redirectUrl.pathname = this.redirectToAfterSignOut;
60
+ redirectUrl.pathname = joinUrl(
61
+ import.meta.env.BASE_URL,
62
+ this.redirectToAfterSignOut,
63
+ );
57
64
 
58
65
  // SEE: https://auth0.com/docs/authenticate/login/logout/log-users-out-of-auth0
59
66
  // For Auth0 tenants created on or after 14 November 2023, RP-Initiated
60
67
  // Logout End Session Endpoint Discovery is enabled by default.
61
68
  // Otherwise we fallback to the old non-compliant logout
62
69
 
63
- // The endSessionEndpoint is set, the IdP supports some form of logout,
64
- // so we use the IdP logout. Otherwise, just redirect the user to home
70
+ // The end_session_endpoint is set, the IdP supports some form of logout,
71
+ // so we use auth0 logout. Otherwise, just redirect the user to home
65
72
  if (as.end_session_endpoint) {
66
73
  const logoutUrl = new URL(as.end_session_endpoint);
67
74
  if (idToken) {
@@ -72,12 +79,11 @@ class Auth0AuthenticationProvider
72
79
  redirectUrl.toString(),
73
80
  );
74
81
 
75
- // window.location.href = logoutUrl.toString();
82
+ window.location.href = logoutUrl.toString();
76
83
  } else {
77
- const _logoutUrl = new URL(
78
- `${this.issuer.replace(/\/$/, "")}/oidc/logout`,
79
- );
80
- // window.location.href = logoutUrl.toString();
84
+ // const logoutUrl = new URL(`${this.issuer.replace(/\/$/, "")}/v2/logout`);
85
+ // logoutUrl.searchParams.set("returnTo", redirectUrl.toString());
86
+ // don't support the deprecated logout today
81
87
  }
82
88
  };
83
89
  }
@@ -29,32 +29,6 @@ const clerkAuth: AuthenticationProviderInitializer<
29
29
 
30
30
  await clerkApi.load();
31
31
 
32
- if (clerkApi.user) {
33
- const verifiedEmail = clerkApi.user.emailAddresses.find(
34
- (email) => email.verification.status === "verified",
35
- );
36
- useAuthState.getState().setLoggedIn({
37
- profile: {
38
- sub: clerkApi.user.id,
39
- name: clerkApi.user.fullName ?? undefined,
40
- email:
41
- verifiedEmail?.emailAddress ??
42
- clerkApi.user.emailAddresses[0]?.emailAddress,
43
- emailVerified: verifiedEmail !== undefined,
44
- pictureUrl: clerkApi.user.imageUrl,
45
- },
46
- providerData: {
47
- user: {
48
- publicMetadata: clerkApi.user.publicMetadata,
49
- id: clerkApi.user.id,
50
- emailAddresses: clerkApi.user.emailAddresses,
51
- imageUrl: clerkApi.user.imageUrl,
52
- fullName: clerkApi.user.fullName,
53
- },
54
- },
55
- });
56
- }
57
-
58
32
  return clerkApi;
59
33
  })();
60
34
 
@@ -3,12 +3,15 @@ import {
3
3
  type Auth,
4
4
  createUserWithEmailAndPassword,
5
5
  getAuth,
6
+ sendEmailVerification,
7
+ sendPasswordResetEmail,
6
8
  signInWithEmailAndPassword,
7
9
  signInWithPopup,
8
10
  signOut,
9
11
  type User,
10
12
  } from "firebase/auth";
11
13
  import type { FirebaseAuthenticationConfig } from "../../../config/config.js";
14
+ import { ZudokuError } from "../../util/invariant.js";
12
15
  import { CoreAuthenticationPlugin } from "../AuthenticationPlugin.js";
13
16
  import type {
14
17
  AuthActionContext,
@@ -19,7 +22,12 @@ import type {
19
22
  import { SignOut } from "../components/SignOut.js";
20
23
  import { AuthorizationError } from "../errors.js";
21
24
  import { useAuthState } from "../state.js";
22
- import { ZudokuSignInUi, ZudokuSignUpUi } from "../ui/ZudokuAuthUi.js";
25
+ import { EmailVerificationUi } from "../ui/EmailVerificationUi.js";
26
+ import {
27
+ ZudokuPasswordResetUi,
28
+ ZudokuSignInUi,
29
+ ZudokuSignUpUi,
30
+ } from "../ui/ZudokuAuthUi.js";
23
31
 
24
32
  class FirebaseAuthenticationProvider
25
33
  extends CoreAuthenticationPlugin
@@ -28,6 +36,7 @@ class FirebaseAuthenticationProvider
28
36
  private readonly app: FirebaseApp;
29
37
  private readonly auth: Auth;
30
38
  private readonly providers: string[];
39
+ private readonly enableUsernamePassword: boolean;
31
40
 
32
41
  constructor(config: FirebaseAuthenticationConfig) {
33
42
  super();
@@ -42,7 +51,13 @@ class FirebaseAuthenticationProvider
42
51
  measurementId: config.measurementId,
43
52
  });
44
53
  this.auth = getAuth(this.app);
45
- this.providers = config.providers ?? [];
54
+ this.providers = config.providers?.filter((p) => p !== "password") ?? [];
55
+ this.enableUsernamePassword =
56
+ config.providers?.includes("password") ?? false;
57
+ }
58
+
59
+ async initialize() {
60
+ await this.auth.authStateReady();
46
61
  }
47
62
 
48
63
  async signRequest(request: Request): Promise<Request> {
@@ -76,13 +91,77 @@ class FirebaseAuthenticationProvider
76
91
  );
77
92
  };
78
93
 
94
+ requestEmailVerification = async (
95
+ { navigate }: AuthActionContext,
96
+ { redirectTo }: AuthActionOptions,
97
+ ) => {
98
+ if (!this.auth.currentUser) {
99
+ throw new ZudokuError("User is not authenticated", {
100
+ title: "User not authenticated",
101
+ });
102
+ }
103
+
104
+ await sendEmailVerification(this.auth.currentUser);
105
+ void navigate(
106
+ redirectTo
107
+ ? `/verify-email?redirectTo=${encodeURIComponent(redirectTo)}`
108
+ : `/verify-email`,
109
+ );
110
+ };
111
+
79
112
  getRoutes = () => {
80
113
  return [
114
+ {
115
+ path: "/verify-email",
116
+ element: (
117
+ <EmailVerificationUi
118
+ onResendVerification={async () => {
119
+ if (!this.auth.currentUser) {
120
+ throw new ZudokuError("User is not authenticated", {
121
+ title: "User not authenticated",
122
+ });
123
+ }
124
+ await sendEmailVerification(this.auth.currentUser);
125
+ }}
126
+ onCheckVerification={async () => {
127
+ if (!this.auth.currentUser) {
128
+ throw new ZudokuError("User is not authenticated", {
129
+ title: "User not authenticated",
130
+ });
131
+ }
132
+ await this.auth.currentUser.reload();
133
+ const isVerified = this.auth.currentUser.emailVerified;
134
+
135
+ if (isVerified) {
136
+ await this.auth.currentUser.getIdToken(true);
137
+ await this.setUserLoggedIn(this.auth.currentUser);
138
+ }
139
+
140
+ return isVerified;
141
+ }}
142
+ />
143
+ ),
144
+ },
145
+ {
146
+ path: "/reset-password",
147
+ element: (
148
+ <ZudokuPasswordResetUi
149
+ onPasswordReset={async (email: string) => {
150
+ try {
151
+ await sendPasswordResetEmail(this.auth, email);
152
+ } catch (error) {
153
+ throw Error(getFirebaseErrorMessage(error), { cause: error });
154
+ }
155
+ }}
156
+ />
157
+ ),
158
+ },
81
159
  {
82
160
  path: "/signin",
83
161
  element: (
84
162
  <ZudokuSignInUi
85
163
  providers={this.providers}
164
+ enableUsernamePassword={this.enableUsernamePassword}
86
165
  onOAuthSignIn={async (providerId: string) => {
87
166
  useAuthState.setState({ isPending: true });
88
167
  const provider = await getProviderForId(providerId);
@@ -109,7 +188,13 @@ class FirebaseAuthenticationProvider
109
188
  password: string,
110
189
  ) => {
111
190
  try {
112
- await signInWithEmailAndPassword(this.auth, email, password);
191
+ useAuthState.setState({ isPending: false });
192
+ const result = await signInWithEmailAndPassword(
193
+ this.auth,
194
+ email,
195
+ password,
196
+ );
197
+ await this.setUserLoggedIn(result.user);
113
198
  } catch (error) {
114
199
  throw Error(getFirebaseErrorMessage(error), { cause: error });
115
200
  }
@@ -122,6 +207,7 @@ class FirebaseAuthenticationProvider
122
207
  element: (
123
208
  <ZudokuSignUpUi
124
209
  providers={this.providers}
210
+ enableUsernamePassword={this.enableUsernamePassword}
125
211
  onOAuthSignUp={async (providerId: string) => {
126
212
  const provider = await getProviderForId(providerId);
127
213
  if (!provider) {
@@ -135,7 +221,13 @@ class FirebaseAuthenticationProvider
135
221
  email: string,
136
222
  password: string,
137
223
  ) => {
138
- await createUserWithEmailAndPassword(this.auth, email, password);
224
+ useAuthState.setState({ isPending: true });
225
+ const createUser = await createUserWithEmailAndPassword(
226
+ this.auth,
227
+ email,
228
+ password,
229
+ );
230
+ await this.setUserLoggedIn(createUser.user);
139
231
  }}
140
232
  />
141
233
  ),
@@ -162,13 +254,13 @@ class FirebaseAuthenticationProvider
162
254
  const user = this.auth.currentUser;
163
255
 
164
256
  if (user) {
165
- await this.updateUserState(user);
257
+ await this.setUserLoggedIn(user);
166
258
  } else {
167
259
  useAuthState.setState({ isPending: false });
168
260
  }
169
261
  };
170
262
 
171
- private async updateUserState(user: User) {
263
+ private async setUserLoggedIn(user: User) {
172
264
  useAuthState.getState().setLoggedIn({
173
265
  profile: {
174
266
  sub: user.uid,
@@ -129,21 +129,12 @@ class SupabaseAuthenticationProvider
129
129
  };
130
130
 
131
131
  signOut = async () => {
132
- await new Promise<void>((resolve) => {
133
- const { data } = this.client.auth.onAuthStateChange(async (event) => {
134
- if (event !== "SIGNED_OUT") return;
135
- data.subscription.unsubscribe();
136
- resolve();
137
- });
138
- void this.client.auth.signOut();
139
- });
140
-
141
- useAuthState.setState({
142
- isAuthenticated: false,
143
- isPending: false,
144
- profile: undefined,
145
- providerData: undefined,
146
- });
132
+ const { error } = await this.client.auth.signOut({ scope: "local" });
133
+ if (error) {
134
+ // biome-ignore lint/suspicious: Logging is better than not doing anything
135
+ console.error("Error signing out", error);
136
+ }
137
+ useAuthState.getState().setLoggedOut();
147
138
  };
148
139
 
149
140
  onPageLoad = async () => {