@hexclave/tanstack-start 1.0.3 → 1.0.6

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 (860) hide show
  1. package/dist/components/api-key-dialogs.d.ts +1 -1
  2. package/dist/components/api-key-dialogs.js.map +1 -1
  3. package/dist/components/api-key-table.d.ts +1 -1
  4. package/dist/components/api-key-table.js.map +1 -1
  5. package/dist/components/credential-sign-in.js.map +1 -1
  6. package/dist/components/credential-sign-up.js.map +1 -1
  7. package/dist/components/elements/form-warning.js.map +1 -1
  8. package/dist/components/elements/maybe-full-page.js.map +1 -1
  9. package/dist/components/elements/separator-with-text.js.map +1 -1
  10. package/dist/components/elements/sidebar-layout.js.map +1 -1
  11. package/dist/components/elements/ssr-layout-effect.js.map +1 -1
  12. package/dist/components/elements/user-avatar.js.map +1 -1
  13. package/dist/components/link.js.map +1 -1
  14. package/dist/components/magic-link-sign-in.js +2 -2
  15. package/dist/components/magic-link-sign-in.js.map +1 -1
  16. package/dist/components/message-cards/known-error-message-card.js +2 -2
  17. package/dist/components/message-cards/known-error-message-card.js.map +1 -1
  18. package/dist/components/message-cards/message-card.js.map +1 -1
  19. package/dist/components/message-cards/predefined-message-card.js +9 -9
  20. package/dist/components/message-cards/predefined-message-card.js.map +1 -1
  21. package/dist/components/oauth-button-group.js +2 -2
  22. package/dist/components/oauth-button-group.js.map +1 -1
  23. package/dist/components/oauth-button.js +2 -2
  24. package/dist/components/oauth-button.js.map +1 -1
  25. package/dist/components/passkey-button.js +2 -2
  26. package/dist/components/passkey-button.js.map +1 -1
  27. package/dist/components/profile-image-editor.js.map +1 -1
  28. package/dist/components/selected-team-switcher.d.ts +1 -1
  29. package/dist/components/selected-team-switcher.js.map +1 -1
  30. package/dist/components/team-icon.d.ts +1 -1
  31. package/dist/components/team-icon.js.map +1 -1
  32. package/dist/components/team-switcher.d.ts +1 -1
  33. package/dist/components/team-switcher.js.map +1 -1
  34. package/dist/components/use-in-iframe.js.map +1 -1
  35. package/dist/components/user-button.js.map +1 -1
  36. package/dist/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
  37. package/dist/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
  38. package/dist/components-page/account-settings/editable-text.js.map +1 -1
  39. package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
  40. package/dist/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
  41. package/dist/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
  42. package/dist/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
  43. package/dist/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
  44. package/dist/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
  45. package/dist/components-page/account-settings/notifications/notifications-page.js.map +1 -1
  46. package/dist/components-page/account-settings/page-layout.js.map +1 -1
  47. package/dist/components-page/account-settings/payments/payments-page.d.ts +1 -1
  48. package/dist/components-page/account-settings/payments/payments-page.js.map +1 -1
  49. package/dist/components-page/account-settings/payments/payments-panel.d.ts +1 -1
  50. package/dist/components-page/account-settings/payments/payments-panel.js +6 -6
  51. package/dist/components-page/account-settings/payments/payments-panel.js.map +1 -1
  52. package/dist/components-page/account-settings/profile-page/profile-page.js.map +1 -1
  53. package/dist/components-page/account-settings/section.js.map +1 -1
  54. package/dist/components-page/account-settings/settings/delete-account-section.js.map +1 -1
  55. package/dist/components-page/account-settings/settings/settings-page.js.map +1 -1
  56. package/dist/components-page/account-settings/settings/sign-out-section.js.map +1 -1
  57. package/dist/components-page/account-settings/teams/leave-team-section.d.ts +1 -1
  58. package/dist/components-page/account-settings/teams/leave-team-section.js.map +1 -1
  59. package/dist/components-page/account-settings/teams/team-api-keys-section.d.ts +1 -1
  60. package/dist/components-page/account-settings/teams/team-api-keys-section.js +1 -1
  61. package/dist/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
  62. package/dist/components-page/account-settings/teams/team-creation-page.js.map +1 -1
  63. package/dist/components-page/account-settings/teams/team-display-name-section.d.ts +1 -1
  64. package/dist/components-page/account-settings/teams/team-display-name-section.js.map +1 -1
  65. package/dist/components-page/account-settings/teams/team-member-invitation-section.d.ts +1 -1
  66. package/dist/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
  67. package/dist/components-page/account-settings/teams/team-member-list-section.d.ts +1 -1
  68. package/dist/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
  69. package/dist/components-page/account-settings/teams/team-page.d.ts +1 -1
  70. package/dist/components-page/account-settings/teams/team-page.js.map +1 -1
  71. package/dist/components-page/account-settings/teams/team-profile-image-section.d.ts +1 -1
  72. package/dist/components-page/account-settings/teams/team-profile-image-section.js.map +1 -1
  73. package/dist/components-page/account-settings/teams/team-profile-user-section.d.ts +1 -1
  74. package/dist/components-page/account-settings/teams/team-profile-user-section.js.map +1 -1
  75. package/dist/components-page/account-settings.js.map +1 -1
  76. package/dist/components-page/auth-page.d.ts.map +1 -1
  77. package/dist/components-page/auth-page.js +55 -10
  78. package/dist/components-page/auth-page.js.map +1 -1
  79. package/dist/components-page/cli-auth-confirm.js +3 -3
  80. package/dist/components-page/cli-auth-confirm.js.map +1 -1
  81. package/dist/components-page/cli-auth-confirm.test.js +4 -4
  82. package/dist/components-page/cli-auth-confirm.test.js.map +1 -1
  83. package/dist/components-page/email-verification.js +4 -4
  84. package/dist/components-page/email-verification.js.map +1 -1
  85. package/dist/components-page/error-page.js +9 -9
  86. package/dist/components-page/error-page.js.map +1 -1
  87. package/dist/components-page/forgot-password.js +4 -4
  88. package/dist/components-page/forgot-password.js.map +1 -1
  89. package/dist/components-page/{stack-handler-client.d.ts → hexclave-handler-client.d.ts} +16 -4
  90. package/dist/components-page/hexclave-handler-client.d.ts.map +1 -0
  91. package/dist/components-page/{stack-handler-client.js → hexclave-handler-client.js} +64 -28
  92. package/dist/components-page/hexclave-handler-client.js.map +1 -0
  93. package/dist/components-page/hexclave-handler-client.test.js +51 -0
  94. package/dist/components-page/hexclave-handler-client.test.js.map +1 -0
  95. package/dist/components-page/{stack-handler.d.ts → hexclave-handler.d.ts} +5 -5
  96. package/dist/components-page/hexclave-handler.d.ts.map +1 -0
  97. package/dist/components-page/{stack-handler.js → hexclave-handler.js} +4 -4
  98. package/dist/components-page/hexclave-handler.js.map +1 -0
  99. package/dist/components-page/magic-link-callback.js +7 -7
  100. package/dist/components-page/magic-link-callback.js.map +1 -1
  101. package/dist/components-page/mfa.js +4 -4
  102. package/dist/components-page/mfa.js.map +1 -1
  103. package/dist/components-page/oauth-callback.js +3 -3
  104. package/dist/components-page/oauth-callback.js.map +1 -1
  105. package/dist/components-page/onboarding.js +3 -3
  106. package/dist/components-page/onboarding.js.map +1 -1
  107. package/dist/components-page/password-reset.js +8 -8
  108. package/dist/components-page/password-reset.js.map +1 -1
  109. package/dist/components-page/sign-in.js.map +1 -1
  110. package/dist/components-page/sign-out.d.ts +1 -0
  111. package/dist/components-page/sign-out.d.ts.map +1 -1
  112. package/dist/components-page/sign-out.js +11 -5
  113. package/dist/components-page/sign-out.js.map +1 -1
  114. package/dist/components-page/sign-up.js.map +1 -1
  115. package/dist/components-page/team-creation.js.map +1 -1
  116. package/dist/components-page/team-invitation.js +16 -16
  117. package/dist/components-page/team-invitation.js.map +1 -1
  118. package/dist/dev-tool/dev-tool-core.d.ts +1 -1
  119. package/dist/dev-tool/dev-tool-core.js +13 -13
  120. package/dist/dev-tool/dev-tool-core.js.map +1 -1
  121. package/dist/dev-tool/dev-tool-styles.d.ts +1 -1
  122. package/dist/dev-tool/dev-tool-styles.js +371 -371
  123. package/dist/dev-tool/dev-tool-styles.js.map +1 -1
  124. package/dist/dev-tool/dev-tool-trigger-position.js.map +1 -1
  125. package/dist/dev-tool/dev-tool-trigger-position.test.js.map +1 -1
  126. package/dist/dev-tool/index.d.ts +4 -4
  127. package/dist/dev-tool/index.js +4 -4
  128. package/dist/dev-tool/index.js.map +1 -1
  129. package/dist/esm/components/api-key-dialogs.d.ts +1 -1
  130. package/dist/esm/components/api-key-dialogs.js.map +1 -1
  131. package/dist/esm/components/api-key-table.d.ts +1 -1
  132. package/dist/esm/components/api-key-table.js.map +1 -1
  133. package/dist/esm/components/credential-sign-in.js.map +1 -1
  134. package/dist/esm/components/credential-sign-up.js.map +1 -1
  135. package/dist/esm/components/elements/form-warning.js.map +1 -1
  136. package/dist/esm/components/elements/maybe-full-page.js.map +1 -1
  137. package/dist/esm/components/elements/separator-with-text.js.map +1 -1
  138. package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
  139. package/dist/esm/components/elements/ssr-layout-effect.js.map +1 -1
  140. package/dist/esm/components/elements/user-avatar.js.map +1 -1
  141. package/dist/esm/components/link.js.map +1 -1
  142. package/dist/esm/components/magic-link-sign-in.js +2 -2
  143. package/dist/esm/components/magic-link-sign-in.js.map +1 -1
  144. package/dist/esm/components/message-cards/known-error-message-card.js +2 -2
  145. package/dist/esm/components/message-cards/known-error-message-card.js.map +1 -1
  146. package/dist/esm/components/message-cards/message-card.js.map +1 -1
  147. package/dist/esm/components/message-cards/predefined-message-card.js +9 -9
  148. package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -1
  149. package/dist/esm/components/oauth-button-group.js +2 -2
  150. package/dist/esm/components/oauth-button-group.js.map +1 -1
  151. package/dist/esm/components/oauth-button.js +2 -2
  152. package/dist/esm/components/oauth-button.js.map +1 -1
  153. package/dist/esm/components/passkey-button.js +2 -2
  154. package/dist/esm/components/passkey-button.js.map +1 -1
  155. package/dist/esm/components/profile-image-editor.js.map +1 -1
  156. package/dist/esm/components/selected-team-switcher.js.map +1 -1
  157. package/dist/esm/components/team-icon.js.map +1 -1
  158. package/dist/esm/components/team-switcher.js.map +1 -1
  159. package/dist/esm/components/use-in-iframe.js.map +1 -1
  160. package/dist/esm/components/user-button.js.map +1 -1
  161. package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
  162. package/dist/esm/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
  163. package/dist/esm/components-page/account-settings/editable-text.js.map +1 -1
  164. package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
  165. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
  166. package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
  167. package/dist/esm/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
  168. package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
  169. package/dist/esm/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
  170. package/dist/esm/components-page/account-settings/notifications/notifications-page.js.map +1 -1
  171. package/dist/esm/components-page/account-settings/page-layout.js.map +1 -1
  172. package/dist/esm/components-page/account-settings/payments/payments-page.js.map +1 -1
  173. package/dist/esm/components-page/account-settings/payments/payments-panel.d.ts +1 -1
  174. package/dist/esm/components-page/account-settings/payments/payments-panel.js +5 -5
  175. package/dist/esm/components-page/account-settings/payments/payments-panel.js.map +1 -1
  176. package/dist/esm/components-page/account-settings/profile-page/profile-page.js.map +1 -1
  177. package/dist/esm/components-page/account-settings/section.js.map +1 -1
  178. package/dist/esm/components-page/account-settings/settings/delete-account-section.js.map +1 -1
  179. package/dist/esm/components-page/account-settings/settings/settings-page.js.map +1 -1
  180. package/dist/esm/components-page/account-settings/settings/sign-out-section.js.map +1 -1
  181. package/dist/esm/components-page/account-settings/teams/leave-team-section.js.map +1 -1
  182. package/dist/esm/components-page/account-settings/teams/team-api-keys-section.d.ts +1 -1
  183. package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js +1 -1
  184. package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
  185. package/dist/esm/components-page/account-settings/teams/team-creation-page.js.map +1 -1
  186. package/dist/esm/components-page/account-settings/teams/team-display-name-section.js.map +1 -1
  187. package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
  188. package/dist/esm/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
  189. package/dist/esm/components-page/account-settings/teams/team-page.js.map +1 -1
  190. package/dist/esm/components-page/account-settings/teams/team-profile-image-section.js.map +1 -1
  191. package/dist/esm/components-page/account-settings/teams/team-profile-user-section.js.map +1 -1
  192. package/dist/esm/components-page/account-settings.js.map +1 -1
  193. package/dist/esm/components-page/auth-page.d.ts.map +1 -1
  194. package/dist/esm/components-page/auth-page.js +56 -11
  195. package/dist/esm/components-page/auth-page.js.map +1 -1
  196. package/dist/esm/components-page/cli-auth-confirm.js +3 -3
  197. package/dist/esm/components-page/cli-auth-confirm.js.map +1 -1
  198. package/dist/esm/components-page/cli-auth-confirm.test.js +4 -4
  199. package/dist/esm/components-page/cli-auth-confirm.test.js.map +1 -1
  200. package/dist/esm/components-page/email-verification.js +4 -4
  201. package/dist/esm/components-page/email-verification.js.map +1 -1
  202. package/dist/esm/components-page/error-page.js +9 -9
  203. package/dist/esm/components-page/error-page.js.map +1 -1
  204. package/dist/esm/components-page/forgot-password.js +4 -4
  205. package/dist/esm/components-page/forgot-password.js.map +1 -1
  206. package/dist/esm/components-page/{stack-handler-client.d.ts → hexclave-handler-client.d.ts} +15 -4
  207. package/dist/esm/components-page/hexclave-handler-client.d.ts.map +1 -0
  208. package/dist/esm/components-page/{stack-handler-client.js → hexclave-handler-client.js} +63 -28
  209. package/dist/esm/components-page/hexclave-handler-client.js.map +1 -0
  210. package/dist/esm/components-page/hexclave-handler-client.test.js +51 -0
  211. package/dist/esm/components-page/hexclave-handler-client.test.js.map +1 -0
  212. package/dist/esm/components-page/{stack-handler.d.ts → hexclave-handler.d.ts} +5 -5
  213. package/dist/esm/components-page/hexclave-handler.d.ts.map +1 -0
  214. package/dist/esm/components-page/{stack-handler.js → hexclave-handler.js} +4 -4
  215. package/dist/esm/components-page/hexclave-handler.js.map +1 -0
  216. package/dist/esm/components-page/magic-link-callback.js +7 -7
  217. package/dist/esm/components-page/magic-link-callback.js.map +1 -1
  218. package/dist/esm/components-page/mfa.js +4 -4
  219. package/dist/esm/components-page/mfa.js.map +1 -1
  220. package/dist/esm/components-page/oauth-callback.js +3 -3
  221. package/dist/esm/components-page/oauth-callback.js.map +1 -1
  222. package/dist/esm/components-page/onboarding.js +3 -3
  223. package/dist/esm/components-page/onboarding.js.map +1 -1
  224. package/dist/esm/components-page/password-reset.js +8 -8
  225. package/dist/esm/components-page/password-reset.js.map +1 -1
  226. package/dist/esm/components-page/sign-in.js.map +1 -1
  227. package/dist/esm/components-page/sign-out.d.ts +1 -0
  228. package/dist/esm/components-page/sign-out.d.ts.map +1 -1
  229. package/dist/esm/components-page/sign-out.js +11 -5
  230. package/dist/esm/components-page/sign-out.js.map +1 -1
  231. package/dist/esm/components-page/sign-up.js.map +1 -1
  232. package/dist/esm/components-page/team-creation.js.map +1 -1
  233. package/dist/esm/components-page/team-invitation.js +16 -16
  234. package/dist/esm/components-page/team-invitation.js.map +1 -1
  235. package/dist/esm/dev-tool/dev-tool-core.d.ts +1 -1
  236. package/dist/esm/dev-tool/dev-tool-core.js +12 -12
  237. package/dist/esm/dev-tool/dev-tool-core.js.map +1 -1
  238. package/dist/esm/dev-tool/dev-tool-styles.d.ts +1 -1
  239. package/dist/esm/dev-tool/dev-tool-styles.js +371 -371
  240. package/dist/esm/dev-tool/dev-tool-styles.js.map +1 -1
  241. package/dist/esm/dev-tool/dev-tool-trigger-position.js.map +1 -1
  242. package/dist/esm/dev-tool/dev-tool-trigger-position.test.js.map +1 -1
  243. package/dist/esm/dev-tool/index.d.ts +4 -4
  244. package/dist/esm/dev-tool/index.js +4 -4
  245. package/dist/esm/dev-tool/index.js.map +1 -1
  246. package/dist/esm/generated/env.d.ts +26 -0
  247. package/dist/esm/{lib → generated}/env.d.ts.map +1 -1
  248. package/dist/esm/generated/env.js +67 -0
  249. package/dist/esm/generated/env.js.map +1 -0
  250. package/dist/esm/generated/quetzal-translations.js.map +1 -1
  251. package/dist/esm/global.d.ts +8 -1
  252. package/dist/esm/global.d.ts.map +1 -0
  253. package/dist/esm/index.d.ts +4 -4
  254. package/dist/esm/index.js +3 -3
  255. package/dist/esm/integrations/convex/component/convex.config.js.map +1 -1
  256. package/dist/esm/integrations/convex.js +1 -1
  257. package/dist/esm/integrations/convex.js.map +1 -1
  258. package/dist/esm/lib/auth.js.map +1 -1
  259. package/dist/esm/lib/auth.test.js.map +1 -1
  260. package/dist/esm/lib/cookie.d.ts +0 -8
  261. package/dist/esm/lib/cookie.d.ts.map +1 -1
  262. package/dist/esm/lib/cookie.js +2 -2
  263. package/dist/esm/lib/cookie.js.map +1 -1
  264. package/dist/{lib/stack-app → esm/lib/hexclave-app}/api-keys/index.d.ts +2 -2
  265. package/dist/esm/lib/hexclave-app/api-keys/index.d.ts.map +1 -0
  266. package/dist/esm/lib/{stack-app → hexclave-app}/api-keys/index.js +1 -1
  267. package/dist/esm/lib/hexclave-app/api-keys/index.js.map +1 -0
  268. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.d.ts +6 -6
  269. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -0
  270. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.js +7 -7
  271. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -0
  272. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js +381 -0
  273. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -0
  274. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.d.ts +16 -14
  275. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -0
  276. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.js +76 -56
  277. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -0
  278. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.js +1 -1
  279. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +1 -0
  280. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/common.d.ts +11 -11
  281. package/dist/esm/lib/hexclave-app/apps/implementations/common.d.ts.map +1 -0
  282. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/common.js +34 -20
  283. package/dist/esm/lib/hexclave-app/apps/implementations/common.js.map +1 -0
  284. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.d.ts +1 -1
  285. package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.d.ts.map +1 -0
  286. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.js +1 -1
  287. package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.js.map +1 -0
  288. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.js +1 -1
  289. package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.test.js.map +1 -0
  290. package/dist/esm/lib/hexclave-app/apps/implementations/index.d.ts +9 -0
  291. package/dist/esm/lib/hexclave-app/apps/implementations/index.d.ts.map +1 -0
  292. package/dist/esm/lib/hexclave-app/apps/implementations/index.js +27 -0
  293. package/dist/esm/lib/hexclave-app/apps/implementations/index.js.map +1 -0
  294. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.d.ts +1 -1
  295. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.d.ts.map +1 -0
  296. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.js +1 -1
  297. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.js.map +1 -0
  298. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.d.ts +4 -4
  299. package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.d.ts.map +1 -0
  300. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.js +7 -7
  301. package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.js.map +1 -0
  302. package/dist/{lib/stack-app → esm/lib/hexclave-app}/apps/implementations/session-refresh-subscription.d.ts +1 -1
  303. package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.d.ts.map +1 -0
  304. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.js +1 -1
  305. package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.js.map +1 -0
  306. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.js +1 -1
  307. package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js.map +1 -0
  308. package/dist/{lib/stack-app → esm/lib/hexclave-app}/apps/implementations/session-replay.d.ts +1 -1
  309. package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.d.ts.map +1 -0
  310. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.js +1 -1
  311. package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.js.map +1 -0
  312. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.js +1 -1
  313. package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.test.js.map +1 -0
  314. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.d.ts +1 -1
  315. package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.d.ts.map +1 -0
  316. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.js +3 -3
  317. package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -0
  318. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.d.ts +4 -4
  319. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.d.ts.map +1 -0
  320. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.js +3 -3
  321. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -0
  322. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.d.ts +1 -1
  323. package/dist/esm/lib/hexclave-app/apps/interfaces/server-app.d.ts.map +1 -0
  324. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.js +3 -3
  325. package/dist/esm/lib/hexclave-app/apps/interfaces/server-app.js.map +1 -0
  326. package/dist/esm/lib/{stack-app → hexclave-app}/common.d.ts +7 -7
  327. package/dist/esm/lib/hexclave-app/common.d.ts.map +1 -0
  328. package/dist/esm/lib/hexclave-app/common.js +7 -0
  329. package/dist/esm/lib/hexclave-app/common.js.map +1 -0
  330. package/dist/esm/lib/{stack-app → hexclave-app}/connected-accounts/index.d.ts +1 -1
  331. package/dist/esm/lib/hexclave-app/connected-accounts/index.d.ts.map +1 -0
  332. package/dist/esm/lib/{stack-app → hexclave-app}/contact-channels/index.d.ts +1 -1
  333. package/dist/esm/lib/hexclave-app/contact-channels/index.d.ts.map +1 -0
  334. package/dist/esm/lib/{stack-app → hexclave-app}/contact-channels/index.js +1 -1
  335. package/dist/esm/lib/hexclave-app/contact-channels/index.js.map +1 -0
  336. package/dist/esm/lib/{stack-app → hexclave-app}/customers/index.d.ts +1 -1
  337. package/dist/esm/lib/hexclave-app/customers/index.d.ts.map +1 -0
  338. package/dist/esm/lib/{stack-app → hexclave-app}/data-vault/index.d.ts +1 -1
  339. package/dist/esm/lib/hexclave-app/data-vault/index.d.ts.map +1 -0
  340. package/dist/esm/lib/{stack-app → hexclave-app}/email/index.d.ts +1 -1
  341. package/dist/esm/lib/hexclave-app/email/index.d.ts.map +1 -0
  342. package/dist/{lib/stack-app → esm/lib/hexclave-app}/email-templates/index.d.ts +1 -1
  343. package/dist/esm/lib/hexclave-app/email-templates/index.d.ts.map +1 -0
  344. package/dist/esm/lib/{stack-app → hexclave-app}/email-templates/index.js +1 -1
  345. package/dist/esm/lib/hexclave-app/email-templates/index.js.map +1 -0
  346. package/dist/esm/lib/{stack-app → hexclave-app}/index.d.ts +2 -2
  347. package/dist/esm/lib/{stack-app → hexclave-app}/index.js +2 -2
  348. package/dist/{lib/stack-app → esm/lib/hexclave-app}/internal-api-keys/index.d.ts +1 -1
  349. package/dist/esm/lib/hexclave-app/internal-api-keys/index.d.ts.map +1 -0
  350. package/dist/esm/lib/{stack-app → hexclave-app}/internal-api-keys/index.js +1 -1
  351. package/dist/esm/lib/hexclave-app/internal-api-keys/index.js.map +1 -0
  352. package/dist/{lib/stack-app → esm/lib/hexclave-app}/notification-categories/index.d.ts +1 -1
  353. package/dist/esm/lib/hexclave-app/notification-categories/index.d.ts.map +1 -0
  354. package/dist/{lib/stack-app → esm/lib/hexclave-app}/permissions/index.d.ts +1 -1
  355. package/dist/esm/lib/hexclave-app/permissions/index.d.ts.map +1 -0
  356. package/dist/esm/lib/{stack-app → hexclave-app}/permissions/index.js +1 -1
  357. package/dist/esm/lib/hexclave-app/permissions/index.js.map +1 -0
  358. package/dist/esm/lib/{stack-app → hexclave-app}/project-configs/index.d.ts +1 -1
  359. package/dist/esm/lib/hexclave-app/project-configs/index.d.ts.map +1 -0
  360. package/dist/esm/lib/{stack-app → hexclave-app}/projects/index.d.ts +1 -1
  361. package/dist/esm/lib/hexclave-app/projects/index.d.ts.map +1 -0
  362. package/dist/esm/lib/{stack-app → hexclave-app}/projects/index.js +1 -1
  363. package/dist/esm/lib/hexclave-app/projects/index.js.map +1 -0
  364. package/dist/{lib/stack-app → esm/lib/hexclave-app}/session-replays/index.d.ts +1 -1
  365. package/dist/esm/lib/hexclave-app/session-replays/index.d.ts.map +1 -0
  366. package/dist/esm/lib/{stack-app → hexclave-app}/teams/index.d.ts +1 -1
  367. package/dist/esm/lib/hexclave-app/teams/index.d.ts.map +1 -0
  368. package/dist/esm/lib/{stack-app → hexclave-app}/teams/index.js +1 -1
  369. package/dist/esm/lib/hexclave-app/teams/index.js.map +1 -0
  370. package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.d.ts +1 -1
  371. package/dist/esm/lib/hexclave-app/url-targets.d.ts.map +1 -0
  372. package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.js +26 -12
  373. package/dist/esm/lib/hexclave-app/url-targets.js.map +1 -0
  374. package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.test.js +13 -1
  375. package/dist/esm/lib/hexclave-app/url-targets.test.js.map +1 -0
  376. package/dist/esm/lib/{stack-app → hexclave-app}/users/index.d.ts +1 -1
  377. package/dist/esm/lib/hexclave-app/users/index.d.ts.map +1 -0
  378. package/dist/esm/lib/{stack-app → hexclave-app}/users/index.js +1 -1
  379. package/dist/esm/lib/hexclave-app/users/index.js.map +1 -0
  380. package/dist/esm/lib/hooks.d.ts +1 -1
  381. package/dist/esm/lib/hooks.js +9 -9
  382. package/dist/esm/lib/hooks.js.map +1 -1
  383. package/dist/esm/lib/translations.js.map +1 -1
  384. package/dist/esm/providers/hexclave-context.d.ts +11 -0
  385. package/dist/esm/providers/hexclave-context.d.ts.map +1 -0
  386. package/dist/esm/providers/hexclave-context.js +12 -0
  387. package/dist/esm/providers/hexclave-context.js.map +1 -0
  388. package/dist/esm/providers/{stack-provider-client.d.ts → hexclave-provider-client.d.ts} +5 -5
  389. package/dist/esm/providers/hexclave-provider-client.d.ts.map +1 -0
  390. package/dist/esm/providers/hexclave-provider-client.js +30 -0
  391. package/dist/esm/providers/hexclave-provider-client.js.map +1 -0
  392. package/dist/esm/providers/{stack-provider.d.ts → hexclave-provider.d.ts} +3 -3
  393. package/dist/esm/providers/hexclave-provider.d.ts.map +1 -0
  394. package/dist/esm/providers/{stack-provider.js → hexclave-provider.js} +4 -4
  395. package/dist/esm/providers/hexclave-provider.js.map +1 -0
  396. package/dist/esm/providers/theme-provider.js.map +1 -1
  397. package/dist/esm/providers/translation-provider-client.js.map +1 -1
  398. package/dist/esm/providers/translation-provider.js.map +1 -1
  399. package/dist/esm/tanstack-start-server-context.default.js.map +1 -1
  400. package/dist/esm/utils/browser-script.js.map +1 -1
  401. package/dist/esm/utils/constants.js.map +1 -1
  402. package/dist/esm/utils/url.js.map +1 -1
  403. package/dist/generated/env.d.ts +26 -0
  404. package/dist/{lib → generated}/env.d.ts.map +1 -1
  405. package/dist/generated/env.js +69 -0
  406. package/dist/generated/env.js.map +1 -0
  407. package/dist/generated/quetzal-translations.js.map +1 -1
  408. package/dist/global.d.ts +8 -1
  409. package/dist/global.d.ts.map +1 -0
  410. package/dist/index.d.ts +18 -18
  411. package/dist/index.js +9 -9
  412. package/dist/integrations/convex/component/convex.config.js.map +1 -1
  413. package/dist/integrations/convex.js +2 -2
  414. package/dist/integrations/convex.js.map +1 -1
  415. package/dist/lib/auth.js.map +1 -1
  416. package/dist/lib/auth.test.js.map +1 -1
  417. package/dist/lib/cookie.d.ts +0 -8
  418. package/dist/lib/cookie.d.ts.map +1 -1
  419. package/dist/lib/cookie.js +2 -2
  420. package/dist/lib/cookie.js.map +1 -1
  421. package/dist/{esm/lib/stack-app → lib/hexclave-app}/api-keys/index.d.ts +2 -2
  422. package/dist/{esm/lib/stack-app → lib/hexclave-app}/api-keys/index.d.ts.map +1 -1
  423. package/dist/lib/{stack-app → hexclave-app}/api-keys/index.js +1 -1
  424. package/dist/lib/hexclave-app/api-keys/index.js.map +1 -0
  425. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.d.ts +6 -6
  426. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -0
  427. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.js +5 -5
  428. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -0
  429. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js +381 -0
  430. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -0
  431. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.d.ts +16 -14
  432. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -0
  433. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.js +74 -54
  434. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -0
  435. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.js +1 -1
  436. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +1 -0
  437. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/common.d.ts +11 -11
  438. package/dist/lib/hexclave-app/apps/implementations/common.d.ts.map +1 -0
  439. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/common.js +33 -19
  440. package/dist/lib/hexclave-app/apps/implementations/common.js.map +1 -0
  441. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.d.ts +1 -1
  442. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/event-tracker.d.ts.map +1 -1
  443. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.js +1 -1
  444. package/dist/lib/hexclave-app/apps/implementations/event-tracker.js.map +1 -0
  445. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.js +1 -1
  446. package/dist/lib/hexclave-app/apps/implementations/event-tracker.test.js.map +1 -0
  447. package/dist/lib/hexclave-app/apps/implementations/index.d.ts +9 -0
  448. package/dist/lib/hexclave-app/apps/implementations/index.d.ts.map +1 -0
  449. package/dist/lib/hexclave-app/apps/implementations/index.js +31 -0
  450. package/dist/lib/hexclave-app/apps/implementations/index.js.map +1 -0
  451. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.d.ts +1 -1
  452. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/redirect-page-urls.d.ts.map +1 -1
  453. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.js +1 -1
  454. package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.js.map +1 -0
  455. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.d.ts +4 -4
  456. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/server-app-impl.d.ts.map +1 -1
  457. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.js +6 -6
  458. package/dist/lib/hexclave-app/apps/implementations/server-app-impl.js.map +1 -0
  459. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/session-refresh-subscription.d.ts +1 -1
  460. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/session-refresh-subscription.d.ts.map +1 -1
  461. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.js +1 -1
  462. package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.js.map +1 -0
  463. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.js +1 -1
  464. package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js.map +1 -0
  465. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/session-replay.d.ts +1 -1
  466. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/session-replay.d.ts.map +1 -1
  467. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.js +1 -1
  468. package/dist/lib/hexclave-app/apps/implementations/session-replay.js.map +1 -0
  469. package/dist/lib/hexclave-app/apps/implementations/session-replay.test.d.ts +1 -0
  470. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.js +1 -1
  471. package/dist/lib/hexclave-app/apps/implementations/session-replay.test.js.map +1 -0
  472. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.d.ts +1 -1
  473. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/interfaces/admin-app.d.ts.map +1 -1
  474. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.js +2 -2
  475. package/dist/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -0
  476. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.d.ts +4 -4
  477. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/interfaces/client-app.d.ts.map +1 -1
  478. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.js +2 -2
  479. package/dist/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -0
  480. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.d.ts +1 -1
  481. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/interfaces/server-app.d.ts.map +1 -1
  482. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.js +2 -2
  483. package/dist/lib/hexclave-app/apps/interfaces/server-app.js.map +1 -0
  484. package/dist/lib/{stack-app → hexclave-app}/common.d.ts +7 -7
  485. package/dist/{esm/lib/stack-app → lib/hexclave-app}/common.d.ts.map +1 -1
  486. package/dist/lib/hexclave-app/common.js +9 -0
  487. package/dist/lib/hexclave-app/common.js.map +1 -0
  488. package/dist/lib/{stack-app → hexclave-app}/connected-accounts/index.d.ts +1 -1
  489. package/dist/{esm/lib/stack-app → lib/hexclave-app}/connected-accounts/index.d.ts.map +1 -1
  490. package/dist/lib/{stack-app → hexclave-app}/contact-channels/index.d.ts +1 -1
  491. package/dist/{esm/lib/stack-app → lib/hexclave-app}/contact-channels/index.d.ts.map +1 -1
  492. package/dist/lib/{stack-app → hexclave-app}/contact-channels/index.js +1 -1
  493. package/dist/lib/hexclave-app/contact-channels/index.js.map +1 -0
  494. package/dist/lib/{stack-app → hexclave-app}/customers/index.d.ts +1 -1
  495. package/dist/{esm/lib/stack-app → lib/hexclave-app}/customers/index.d.ts.map +1 -1
  496. package/dist/lib/{stack-app → hexclave-app}/data-vault/index.d.ts +1 -1
  497. package/dist/{esm/lib/stack-app → lib/hexclave-app}/data-vault/index.d.ts.map +1 -1
  498. package/dist/lib/{stack-app → hexclave-app}/email/index.d.ts +1 -1
  499. package/dist/{esm/lib/stack-app → lib/hexclave-app}/email/index.d.ts.map +1 -1
  500. package/dist/{esm/lib/stack-app → lib/hexclave-app}/email-templates/index.d.ts +1 -1
  501. package/dist/{esm/lib/stack-app → lib/hexclave-app}/email-templates/index.d.ts.map +1 -1
  502. package/dist/lib/{stack-app → hexclave-app}/email-templates/index.js +1 -1
  503. package/dist/lib/hexclave-app/email-templates/index.js.map +1 -0
  504. package/dist/lib/{stack-app → hexclave-app}/index.d.ts +2 -2
  505. package/dist/lib/{stack-app → hexclave-app}/index.js +2 -2
  506. package/dist/{esm/lib/stack-app → lib/hexclave-app}/internal-api-keys/index.d.ts +1 -1
  507. package/dist/{esm/lib/stack-app → lib/hexclave-app}/internal-api-keys/index.d.ts.map +1 -1
  508. package/dist/lib/{stack-app → hexclave-app}/internal-api-keys/index.js +1 -1
  509. package/dist/lib/hexclave-app/internal-api-keys/index.js.map +1 -0
  510. package/dist/{esm/lib/stack-app → lib/hexclave-app}/notification-categories/index.d.ts +1 -1
  511. package/dist/{esm/lib/stack-app → lib/hexclave-app}/notification-categories/index.d.ts.map +1 -1
  512. package/dist/{esm/lib/stack-app → lib/hexclave-app}/permissions/index.d.ts +1 -1
  513. package/dist/{esm/lib/stack-app → lib/hexclave-app}/permissions/index.d.ts.map +1 -1
  514. package/dist/lib/{stack-app → hexclave-app}/permissions/index.js +1 -1
  515. package/dist/lib/hexclave-app/permissions/index.js.map +1 -0
  516. package/dist/lib/{stack-app → hexclave-app}/project-configs/index.d.ts +1 -1
  517. package/dist/{esm/lib/stack-app → lib/hexclave-app}/project-configs/index.d.ts.map +1 -1
  518. package/dist/lib/{stack-app → hexclave-app}/projects/index.d.ts +1 -1
  519. package/dist/{esm/lib/stack-app → lib/hexclave-app}/projects/index.d.ts.map +1 -1
  520. package/dist/lib/{stack-app → hexclave-app}/projects/index.js +1 -1
  521. package/dist/lib/hexclave-app/projects/index.js.map +1 -0
  522. package/dist/{esm/lib/stack-app → lib/hexclave-app}/session-replays/index.d.ts +1 -1
  523. package/dist/{esm/lib/stack-app → lib/hexclave-app}/session-replays/index.d.ts.map +1 -1
  524. package/dist/lib/{stack-app → hexclave-app}/teams/index.d.ts +1 -1
  525. package/dist/{esm/lib/stack-app → lib/hexclave-app}/teams/index.d.ts.map +1 -1
  526. package/dist/lib/{stack-app → hexclave-app}/teams/index.js +1 -1
  527. package/dist/lib/hexclave-app/teams/index.js.map +1 -0
  528. package/dist/lib/{stack-app → hexclave-app}/url-targets.d.ts +1 -1
  529. package/dist/{esm/lib/stack-app → lib/hexclave-app}/url-targets.d.ts.map +1 -1
  530. package/dist/lib/{stack-app → hexclave-app}/url-targets.js +26 -12
  531. package/dist/lib/hexclave-app/url-targets.js.map +1 -0
  532. package/dist/lib/hexclave-app/url-targets.test.d.ts +1 -0
  533. package/dist/lib/{stack-app → hexclave-app}/url-targets.test.js +13 -1
  534. package/dist/lib/hexclave-app/url-targets.test.js.map +1 -0
  535. package/dist/lib/{stack-app → hexclave-app}/users/index.d.ts +1 -1
  536. package/dist/{esm/lib/stack-app → lib/hexclave-app}/users/index.d.ts.map +1 -1
  537. package/dist/lib/{stack-app → hexclave-app}/users/index.js +1 -1
  538. package/dist/lib/hexclave-app/users/index.js.map +1 -0
  539. package/dist/lib/hooks.d.ts +3 -3
  540. package/dist/lib/hooks.d.ts.map +1 -1
  541. package/dist/lib/hooks.js +9 -9
  542. package/dist/lib/hooks.js.map +1 -1
  543. package/dist/lib/translations.js.map +1 -1
  544. package/dist/providers/hexclave-context.d.ts +11 -0
  545. package/dist/providers/hexclave-context.d.ts.map +1 -0
  546. package/dist/providers/hexclave-context.js +15 -0
  547. package/dist/providers/hexclave-context.js.map +1 -0
  548. package/dist/providers/{stack-provider-client.d.ts → hexclave-provider-client.d.ts} +5 -5
  549. package/dist/providers/hexclave-provider-client.d.ts.map +1 -0
  550. package/dist/providers/{stack-provider-client.js → hexclave-provider-client.js} +9 -9
  551. package/dist/providers/hexclave-provider-client.js.map +1 -0
  552. package/dist/providers/{stack-provider.d.ts → hexclave-provider.d.ts} +3 -3
  553. package/dist/providers/hexclave-provider.d.ts.map +1 -0
  554. package/dist/providers/{stack-provider.js → hexclave-provider.js} +4 -4
  555. package/dist/providers/hexclave-provider.js.map +1 -0
  556. package/dist/providers/theme-provider.js.map +1 -1
  557. package/dist/providers/translation-provider-client.js.map +1 -1
  558. package/dist/providers/translation-provider.js.map +1 -1
  559. package/dist/tanstack-start-server-context.default.js.map +1 -1
  560. package/dist/utils/browser-script.js.map +1 -1
  561. package/dist/utils/constants.js.map +1 -1
  562. package/dist/utils/url.js.map +1 -1
  563. package/package.json +10 -7
  564. package/src/components/api-key-dialogs.tsx +173 -0
  565. package/src/components/api-key-table.tsx +127 -0
  566. package/src/components/credential-sign-in.tsx +83 -0
  567. package/src/components/credential-sign-up.tsx +108 -0
  568. package/src/components/elements/form-warning.tsx +17 -0
  569. package/src/components/elements/maybe-full-page.tsx +60 -0
  570. package/src/components/elements/separator-with-text.tsx +22 -0
  571. package/src/components/elements/sidebar-layout.tsx +136 -0
  572. package/src/components/elements/ssr-layout-effect.tsx +24 -0
  573. package/src/components/elements/user-avatar.tsx +32 -0
  574. package/src/components/link.tsx +38 -0
  575. package/src/components/magic-link-sign-in.tsx +143 -0
  576. package/src/components/message-cards/known-error-message-card.tsx +33 -0
  577. package/src/components/message-cards/message-card.tsx +46 -0
  578. package/src/components/message-cards/predefined-message-card.tsx +88 -0
  579. package/src/components/oauth-button-group.tsx +35 -0
  580. package/src/components/oauth-button.tsx +222 -0
  581. package/src/components/passkey-button.tsx +43 -0
  582. package/src/components/profile-image-editor.tsx +194 -0
  583. package/src/components/selected-team-switcher.tsx +97 -0
  584. package/src/components/team-icon.tsx +30 -0
  585. package/src/components/team-switcher.tsx +191 -0
  586. package/src/components/use-in-iframe.tsx +18 -0
  587. package/src/components/user-button.tsx +157 -0
  588. package/src/components-page/account-settings/active-sessions/active-sessions-page.tsx +238 -0
  589. package/src/components-page/account-settings/api-keys/api-keys-page.tsx +157 -0
  590. package/src/components-page/account-settings/editable-text.tsx +53 -0
  591. package/src/components-page/account-settings/email-and-auth/email-and-auth-page.tsx +24 -0
  592. package/src/components-page/account-settings/email-and-auth/emails-section.tsx +201 -0
  593. package/src/components-page/account-settings/email-and-auth/mfa-section.tsx +139 -0
  594. package/src/components-page/account-settings/email-and-auth/otp-section.tsx +102 -0
  595. package/src/components-page/account-settings/email-and-auth/passkey-section.tsx +112 -0
  596. package/src/components-page/account-settings/email-and-auth/password-section.tsx +174 -0
  597. package/src/components-page/account-settings/notifications/notifications-page.tsx +44 -0
  598. package/src/components-page/account-settings/page-layout.tsx +11 -0
  599. package/src/components-page/account-settings/payments/payments-page.tsx +73 -0
  600. package/src/components-page/account-settings/payments/payments-panel.tsx +543 -0
  601. package/src/components-page/account-settings/profile-page/profile-page.tsx +61 -0
  602. package/src/components-page/account-settings/section.tsx +26 -0
  603. package/src/components-page/account-settings/settings/delete-account-section.tsx +85 -0
  604. package/src/components-page/account-settings/settings/settings-page.tsx +19 -0
  605. package/src/components-page/account-settings/settings/sign-out-section.tsx +40 -0
  606. package/src/components-page/account-settings/teams/leave-team-section.tsx +57 -0
  607. package/src/components-page/account-settings/teams/team-api-keys-section.tsx +74 -0
  608. package/src/components-page/account-settings/teams/team-creation-page.tsx +92 -0
  609. package/src/components-page/account-settings/teams/team-display-name-section.tsx +31 -0
  610. package/src/components-page/account-settings/teams/team-member-invitation-section.tsx +128 -0
  611. package/src/components-page/account-settings/teams/team-member-list-section.tsx +59 -0
  612. package/src/components-page/account-settings/teams/team-page.tsx +28 -0
  613. package/src/components-page/account-settings/teams/team-profile-image-section.tsx +33 -0
  614. package/src/components-page/account-settings/teams/team-profile-user-section.tsx +29 -0
  615. package/src/components-page/account-settings.tsx +343 -0
  616. package/src/components-page/auth-page.tsx +206 -0
  617. package/src/components-page/cli-auth-confirm.test.tsx +204 -0
  618. package/src/components-page/cli-auth-confirm.tsx +278 -0
  619. package/src/components-page/email-verification.tsx +76 -0
  620. package/src/components-page/error-page.tsx +105 -0
  621. package/src/components-page/forgot-password.tsx +105 -0
  622. package/src/components-page/hexclave-handler-client.test.tsx +64 -0
  623. package/src/components-page/hexclave-handler-client.tsx +400 -0
  624. package/src/components-page/hexclave-handler.tsx +48 -0
  625. package/src/components-page/magic-link-callback.tsx +92 -0
  626. package/src/components-page/mfa.tsx +222 -0
  627. package/src/components-page/oauth-callback.tsx +78 -0
  628. package/src/components-page/onboarding.tsx +176 -0
  629. package/src/components-page/password-reset.tsx +185 -0
  630. package/src/components-page/section.tsx +27 -0
  631. package/src/components-page/sign-in.tsx +34 -0
  632. package/src/components-page/sign-out.tsx +37 -0
  633. package/src/components-page/sign-up.tsx +24 -0
  634. package/src/components-page/team-creation.tsx +78 -0
  635. package/src/components-page/team-invitation.tsx +150 -0
  636. package/src/dev-tool/dev-tool-core.ts +2460 -0
  637. package/src/dev-tool/dev-tool-styles.ts +2758 -0
  638. package/src/dev-tool/dev-tool-trigger-position.test.ts +113 -0
  639. package/src/dev-tool/dev-tool-trigger-position.ts +109 -0
  640. package/src/dev-tool/index.ts +149 -0
  641. package/src/generated/.gitignore +3 -0
  642. package/src/generated/quetzal-translations.ts +4312 -0
  643. package/src/global.css +13 -0
  644. package/src/global.d.ts +12 -0
  645. package/src/index.ts +39 -0
  646. package/src/integrations/convex/component/README.md +74 -0
  647. package/src/integrations/convex/component/convex.config.ts +9 -0
  648. package/src/integrations/convex.ts +28 -0
  649. package/src/lib/auth.test.ts +67 -0
  650. package/src/lib/auth.ts +175 -0
  651. package/src/lib/cookie.ts +420 -0
  652. package/src/lib/hexclave-app/api-keys/index.ts +73 -0
  653. package/src/lib/hexclave-app/apps/implementations/admin-app-impl.ts +1261 -0
  654. package/src/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.ts +454 -0
  655. package/src/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.ts +36 -0
  656. package/src/lib/hexclave-app/apps/implementations/client-app-impl.ts +3970 -0
  657. package/src/lib/hexclave-app/apps/implementations/common.ts +270 -0
  658. package/src/lib/hexclave-app/apps/implementations/event-tracker.test.ts +105 -0
  659. package/src/lib/hexclave-app/apps/implementations/event-tracker.ts +306 -0
  660. package/src/lib/hexclave-app/apps/implementations/index.ts +35 -0
  661. package/src/lib/hexclave-app/apps/implementations/redirect-page-urls.ts +342 -0
  662. package/src/lib/hexclave-app/apps/implementations/server-app-impl.ts +1619 -0
  663. package/src/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.ts +106 -0
  664. package/src/lib/hexclave-app/apps/implementations/session-refresh-subscription.ts +52 -0
  665. package/src/lib/hexclave-app/apps/implementations/session-replay.test.ts +33 -0
  666. package/src/lib/hexclave-app/apps/implementations/session-replay.ts +356 -0
  667. package/src/lib/hexclave-app/apps/index.ts +40 -0
  668. package/src/lib/hexclave-app/apps/interfaces/admin-app.ts +192 -0
  669. package/src/lib/hexclave-app/apps/interfaces/client-app.ts +180 -0
  670. package/src/lib/hexclave-app/apps/interfaces/server-app.ts +129 -0
  671. package/src/lib/hexclave-app/common.ts +216 -0
  672. package/src/lib/hexclave-app/connected-accounts/index.ts +49 -0
  673. package/src/lib/hexclave-app/contact-channels/index.ts +80 -0
  674. package/src/lib/hexclave-app/customers/index.ts +158 -0
  675. package/src/lib/hexclave-app/data-vault/index.ts +12 -0
  676. package/src/lib/hexclave-app/email/index.ts +280 -0
  677. package/src/lib/hexclave-app/email-templates/index.ts +24 -0
  678. package/src/lib/hexclave-app/index.ts +146 -0
  679. package/src/lib/hexclave-app/internal-api-keys/index.ts +55 -0
  680. package/src/lib/hexclave-app/notification-categories/index.ts +12 -0
  681. package/src/lib/hexclave-app/permissions/index.ts +75 -0
  682. package/src/lib/hexclave-app/project-configs/index.ts +103 -0
  683. package/src/lib/hexclave-app/projects/index.ts +236 -0
  684. package/src/lib/hexclave-app/session-replays/index.ts +72 -0
  685. package/src/lib/hexclave-app/teams/index.ts +206 -0
  686. package/src/lib/hexclave-app/url-targets.test.ts +270 -0
  687. package/src/lib/hexclave-app/url-targets.ts +413 -0
  688. package/src/lib/hexclave-app/users/index.ts +523 -0
  689. package/src/lib/hooks.tsx +63 -0
  690. package/src/lib/translations.tsx +23 -0
  691. package/src/providers/hexclave-context.tsx +20 -0
  692. package/src/providers/hexclave-provider-client.tsx +39 -0
  693. package/src/providers/hexclave-provider.tsx +49 -0
  694. package/src/providers/theme-provider.tsx +121 -0
  695. package/src/providers/translation-provider-client.tsx +35 -0
  696. package/src/providers/translation-provider.tsx +25 -0
  697. package/src/tanstack-start-server-context.combined.ts +12 -0
  698. package/src/tanstack-start-server-context.default.ts +9 -0
  699. package/src/tanstack-start-server-context.server.ts +11 -0
  700. package/src/utils/browser-script.tsx +135 -0
  701. package/src/utils/constants.tsx +58 -0
  702. package/src/utils/url.ts +24 -0
  703. package/dist/components-page/stack-handler-client.d.ts.map +0 -1
  704. package/dist/components-page/stack-handler-client.js.map +0 -1
  705. package/dist/components-page/stack-handler.d.ts.map +0 -1
  706. package/dist/components-page/stack-handler.js.map +0 -1
  707. package/dist/esm/components-page/stack-handler-client.d.ts.map +0 -1
  708. package/dist/esm/components-page/stack-handler-client.js.map +0 -1
  709. package/dist/esm/components-page/stack-handler.d.ts.map +0 -1
  710. package/dist/esm/components-page/stack-handler.js.map +0 -1
  711. package/dist/esm/lib/env.d.ts +0 -42
  712. package/dist/esm/lib/env.js +0 -93
  713. package/dist/esm/lib/env.js.map +0 -1
  714. package/dist/esm/lib/stack-app/api-keys/index.js.map +0 -1
  715. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +0 -1
  716. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +0 -1
  717. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js +0 -121
  718. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js.map +0 -1
  719. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +0 -1
  720. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +0 -1
  721. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +0 -1
  722. package/dist/esm/lib/stack-app/apps/implementations/common.d.ts.map +0 -1
  723. package/dist/esm/lib/stack-app/apps/implementations/common.js.map +0 -1
  724. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.js.map +0 -1
  725. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.test.js.map +0 -1
  726. package/dist/esm/lib/stack-app/apps/implementations/index.d.ts +0 -9
  727. package/dist/esm/lib/stack-app/apps/implementations/index.d.ts.map +0 -1
  728. package/dist/esm/lib/stack-app/apps/implementations/index.js +0 -27
  729. package/dist/esm/lib/stack-app/apps/implementations/index.js.map +0 -1
  730. package/dist/esm/lib/stack-app/apps/implementations/redirect-page-urls.js.map +0 -1
  731. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +0 -1
  732. package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.js.map +0 -1
  733. package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.test.js.map +0 -1
  734. package/dist/esm/lib/stack-app/apps/implementations/session-replay.js.map +0 -1
  735. package/dist/esm/lib/stack-app/apps/implementations/session-replay.test.js.map +0 -1
  736. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +0 -1
  737. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +0 -1
  738. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +0 -1
  739. package/dist/esm/lib/stack-app/common.js +0 -7
  740. package/dist/esm/lib/stack-app/common.js.map +0 -1
  741. package/dist/esm/lib/stack-app/contact-channels/index.js.map +0 -1
  742. package/dist/esm/lib/stack-app/email-templates/index.js.map +0 -1
  743. package/dist/esm/lib/stack-app/internal-api-keys/index.js.map +0 -1
  744. package/dist/esm/lib/stack-app/permissions/index.js.map +0 -1
  745. package/dist/esm/lib/stack-app/projects/index.js.map +0 -1
  746. package/dist/esm/lib/stack-app/teams/index.js.map +0 -1
  747. package/dist/esm/lib/stack-app/url-targets.js.map +0 -1
  748. package/dist/esm/lib/stack-app/url-targets.test.js.map +0 -1
  749. package/dist/esm/lib/stack-app/users/index.js.map +0 -1
  750. package/dist/esm/providers/stack-context.d.ts +0 -11
  751. package/dist/esm/providers/stack-context.d.ts.map +0 -1
  752. package/dist/esm/providers/stack-context.js +0 -12
  753. package/dist/esm/providers/stack-context.js.map +0 -1
  754. package/dist/esm/providers/stack-provider-client.d.ts.map +0 -1
  755. package/dist/esm/providers/stack-provider-client.js +0 -30
  756. package/dist/esm/providers/stack-provider-client.js.map +0 -1
  757. package/dist/esm/providers/stack-provider.d.ts.map +0 -1
  758. package/dist/esm/providers/stack-provider.js.map +0 -1
  759. package/dist/lib/env.d.ts +0 -42
  760. package/dist/lib/env.js +0 -95
  761. package/dist/lib/env.js.map +0 -1
  762. package/dist/lib/stack-app/api-keys/index.d.ts.map +0 -1
  763. package/dist/lib/stack-app/api-keys/index.js.map +0 -1
  764. package/dist/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +0 -1
  765. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +0 -1
  766. package/dist/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js +0 -121
  767. package/dist/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js.map +0 -1
  768. package/dist/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +0 -1
  769. package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +0 -1
  770. package/dist/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +0 -1
  771. package/dist/lib/stack-app/apps/implementations/common.d.ts.map +0 -1
  772. package/dist/lib/stack-app/apps/implementations/common.js.map +0 -1
  773. package/dist/lib/stack-app/apps/implementations/event-tracker.d.ts.map +0 -1
  774. package/dist/lib/stack-app/apps/implementations/event-tracker.js.map +0 -1
  775. package/dist/lib/stack-app/apps/implementations/event-tracker.test.js.map +0 -1
  776. package/dist/lib/stack-app/apps/implementations/index.d.ts +0 -9
  777. package/dist/lib/stack-app/apps/implementations/index.d.ts.map +0 -1
  778. package/dist/lib/stack-app/apps/implementations/index.js +0 -31
  779. package/dist/lib/stack-app/apps/implementations/index.js.map +0 -1
  780. package/dist/lib/stack-app/apps/implementations/redirect-page-urls.d.ts.map +0 -1
  781. package/dist/lib/stack-app/apps/implementations/redirect-page-urls.js.map +0 -1
  782. package/dist/lib/stack-app/apps/implementations/server-app-impl.d.ts.map +0 -1
  783. package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +0 -1
  784. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.d.ts.map +0 -1
  785. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.js.map +0 -1
  786. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.test.js.map +0 -1
  787. package/dist/lib/stack-app/apps/implementations/session-replay.d.ts.map +0 -1
  788. package/dist/lib/stack-app/apps/implementations/session-replay.js.map +0 -1
  789. package/dist/lib/stack-app/apps/implementations/session-replay.test.js.map +0 -1
  790. package/dist/lib/stack-app/apps/interfaces/admin-app.d.ts.map +0 -1
  791. package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +0 -1
  792. package/dist/lib/stack-app/apps/interfaces/client-app.d.ts.map +0 -1
  793. package/dist/lib/stack-app/apps/interfaces/client-app.js.map +0 -1
  794. package/dist/lib/stack-app/apps/interfaces/server-app.d.ts.map +0 -1
  795. package/dist/lib/stack-app/apps/interfaces/server-app.js.map +0 -1
  796. package/dist/lib/stack-app/common.d.ts.map +0 -1
  797. package/dist/lib/stack-app/common.js +0 -9
  798. package/dist/lib/stack-app/common.js.map +0 -1
  799. package/dist/lib/stack-app/connected-accounts/index.d.ts.map +0 -1
  800. package/dist/lib/stack-app/contact-channels/index.d.ts.map +0 -1
  801. package/dist/lib/stack-app/contact-channels/index.js.map +0 -1
  802. package/dist/lib/stack-app/customers/index.d.ts.map +0 -1
  803. package/dist/lib/stack-app/data-vault/index.d.ts.map +0 -1
  804. package/dist/lib/stack-app/email/index.d.ts.map +0 -1
  805. package/dist/lib/stack-app/email-templates/index.d.ts.map +0 -1
  806. package/dist/lib/stack-app/email-templates/index.js.map +0 -1
  807. package/dist/lib/stack-app/internal-api-keys/index.d.ts.map +0 -1
  808. package/dist/lib/stack-app/internal-api-keys/index.js.map +0 -1
  809. package/dist/lib/stack-app/notification-categories/index.d.ts.map +0 -1
  810. package/dist/lib/stack-app/permissions/index.d.ts.map +0 -1
  811. package/dist/lib/stack-app/permissions/index.js.map +0 -1
  812. package/dist/lib/stack-app/project-configs/index.d.ts.map +0 -1
  813. package/dist/lib/stack-app/projects/index.d.ts.map +0 -1
  814. package/dist/lib/stack-app/projects/index.js.map +0 -1
  815. package/dist/lib/stack-app/session-replays/index.d.ts.map +0 -1
  816. package/dist/lib/stack-app/teams/index.d.ts.map +0 -1
  817. package/dist/lib/stack-app/teams/index.js.map +0 -1
  818. package/dist/lib/stack-app/url-targets.d.ts.map +0 -1
  819. package/dist/lib/stack-app/url-targets.js.map +0 -1
  820. package/dist/lib/stack-app/url-targets.test.js.map +0 -1
  821. package/dist/lib/stack-app/users/index.d.ts.map +0 -1
  822. package/dist/lib/stack-app/users/index.js.map +0 -1
  823. package/dist/providers/stack-context.d.ts +0 -11
  824. package/dist/providers/stack-context.d.ts.map +0 -1
  825. package/dist/providers/stack-context.js +0 -15
  826. package/dist/providers/stack-context.js.map +0 -1
  827. package/dist/providers/stack-provider-client.d.ts.map +0 -1
  828. package/dist/providers/stack-provider-client.js.map +0 -1
  829. package/dist/providers/stack-provider.d.ts.map +0 -1
  830. package/dist/providers/stack-provider.js.map +0 -1
  831. /package/dist/{esm/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.d.ts → components-page/hexclave-handler-client.test.d.ts} +0 -0
  832. /package/dist/esm/{lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.d.ts → components-page/hexclave-handler-client.test.d.ts} +0 -0
  833. /package/dist/{lib/stack-app → esm/lib/hexclave-app}/apps/implementations/client-app-impl.cross-domain.test.d.ts +0 -0
  834. /package/dist/{lib/stack-app → esm/lib/hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.d.ts +0 -0
  835. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.d.ts +0 -0
  836. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.d.ts +0 -0
  837. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.d.ts +0 -0
  838. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/index.d.ts +0 -0
  839. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/index.js +0 -0
  840. /package/dist/esm/lib/{stack-app → hexclave-app}/connected-accounts/index.js +0 -0
  841. /package/dist/esm/lib/{stack-app → hexclave-app}/customers/index.js +0 -0
  842. /package/dist/esm/lib/{stack-app → hexclave-app}/data-vault/index.js +0 -0
  843. /package/dist/esm/lib/{stack-app → hexclave-app}/email/index.js +0 -0
  844. /package/dist/esm/lib/{stack-app → hexclave-app}/notification-categories/index.js +0 -0
  845. /package/dist/esm/lib/{stack-app → hexclave-app}/project-configs/index.js +0 -0
  846. /package/dist/esm/lib/{stack-app → hexclave-app}/session-replays/index.js +0 -0
  847. /package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.test.d.ts +0 -0
  848. /package/dist/lib/{stack-app/apps/implementations/event-tracker.test.d.ts → hexclave-app/apps/implementations/client-app-impl.cross-domain.test.d.ts} +0 -0
  849. /package/dist/lib/{stack-app/apps/implementations/session-refresh-subscription.test.d.ts → hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.d.ts} +0 -0
  850. /package/dist/lib/{stack-app/apps/implementations/session-replay.test.d.ts → hexclave-app/apps/implementations/event-tracker.test.d.ts} +0 -0
  851. /package/dist/lib/{stack-app/url-targets.test.d.ts → hexclave-app/apps/implementations/session-refresh-subscription.test.d.ts} +0 -0
  852. /package/dist/lib/{stack-app → hexclave-app}/apps/index.d.ts +0 -0
  853. /package/dist/lib/{stack-app → hexclave-app}/apps/index.js +0 -0
  854. /package/dist/lib/{stack-app → hexclave-app}/connected-accounts/index.js +0 -0
  855. /package/dist/lib/{stack-app → hexclave-app}/customers/index.js +0 -0
  856. /package/dist/lib/{stack-app → hexclave-app}/data-vault/index.js +0 -0
  857. /package/dist/lib/{stack-app → hexclave-app}/email/index.js +0 -0
  858. /package/dist/lib/{stack-app → hexclave-app}/notification-categories/index.js +0 -0
  859. /package/dist/lib/{stack-app → hexclave-app}/project-configs/index.js +0 -0
  860. /package/dist/lib/{stack-app → hexclave-app}/session-replays/index.js +0 -0
@@ -1,17 +1,20 @@
1
1
  "use client";
2
2
 
3
- import { HexclaveAssertionError } from "@hexclave/shared/dist/utils/errors";
4
- import { runAsynchronouslyWithAlert } from "@hexclave/shared/dist/utils/promises";
5
- import { useEffect, useMemo, useRef, useSyncExternalStore } from "react";
3
+ import { HexclaveAssertionError, captureError } from "@hexclave/shared/dist/utils/errors";
4
+ import { Suspense, useEffect, useMemo, useRef, useSyncExternalStore } from "react";
6
5
  import { SignIn, SignUp } from "../index.js";
7
6
  import { jsx } from "react/jsx-runtime";
8
7
  import { useStackApp as useStackApp$1 } from "../lib/hooks.js";
9
- import { CliAuthConfirmation } from "./cli-auth-confirm.js";
8
+ import { KnownError } from "@hexclave/shared";
9
+ import { use } from "@hexclave/shared/dist/utils/react";
10
+ import { KnownErrorMessageCard } from "../components/message-cards/known-error-message-card.js";
10
11
  import { MessageCard as MessageCard$1 } from "../components/message-cards/message-card.js";
11
- import { stackAppInternalsSymbol } from "../lib/stack-app/index.js";
12
+ import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card.js";
13
+ import { CliAuthConfirmation } from "./cli-auth-confirm.js";
14
+ import { hexclaveAppInternalsSymbol } from "../lib/hexclave-app/index.js";
12
15
  import { filterUndefined } from "@hexclave/shared/dist/utils/objects";
13
16
  import { getRelativePart } from "@hexclave/shared/dist/utils/urls";
14
- import { isLocalHandlerUrlTarget, resolveUnknownHandlerPathFallbackUrl } from "../lib/stack-app/url-targets.js";
17
+ import { isLocalHandlerUrlTarget, resolveUnknownHandlerPathFallbackUrl } from "../lib/hexclave-app/url-targets.js";
15
18
  import { AccountSettings } from "./account-settings.js";
16
19
  import { EmailVerification } from "./email-verification.js";
17
20
  import { ErrorPage } from "./error-page.js";
@@ -24,7 +27,7 @@ import { PasswordReset } from "./password-reset.js";
24
27
  import { SignOut } from "./sign-out.js";
25
28
  import { TeamInvitation } from "./team-invitation.js";
26
29
 
27
- //#region src/components-page/stack-handler-client.tsx
30
+ //#region src/components-page/hexclave-handler-client.tsx
28
31
  const availablePaths = {
29
32
  signIn: "sign-in",
30
33
  signUp: "sign-up",
@@ -87,6 +90,7 @@ function renderComponent(props) {
87
90
  case availablePaths.signOut:
88
91
  if (shouldRedirectToPage?.("signOut")) return { redirectToPage: "signOut" };
89
92
  return /* @__PURE__ */ jsx(SignOut, {
93
+ searchParams,
90
94
  fullPage,
91
95
  ...filterUndefinedINU(componentProps?.SignOut)
92
96
  });
@@ -150,17 +154,45 @@ function renderComponent(props) {
150
154
  }
151
155
  }
152
156
  }
153
- function StackHandlerClient(props) {
154
- const stackApp = useStackApp$1();
157
+ async function getRedirectToPageResult(app, redirectToPage) {
158
+ try {
159
+ await app[hexclaveAppInternalsSymbol].redirectToHandler(redirectToPage, { replace: true });
160
+ return { status: "success" };
161
+ } catch (e) {
162
+ if (KnownError.isKnownError(e)) return {
163
+ status: "known-error",
164
+ error: e
165
+ };
166
+ captureError("<HexclaveHandlerClient redirectToPage />", e);
167
+ return { status: "unknown-error" };
168
+ }
169
+ }
170
+ function RedirectToPage(props) {
171
+ const redirectResult = use(useMemo(() => getRedirectToPageResult(props.app, props.redirectToPage), [props.app, props.redirectToPage]));
172
+ if (redirectResult.status === "known-error") return /* @__PURE__ */ jsx(KnownErrorMessageCard, {
173
+ error: redirectResult.error,
174
+ fullPage: props.fullPage
175
+ });
176
+ if (redirectResult.status === "unknown-error") return /* @__PURE__ */ jsx(PredefinedMessageCard, {
177
+ type: "unknownError",
178
+ fullPage: props.fullPage
179
+ });
180
+ return /* @__PURE__ */ jsx(MessageCard$1, {
181
+ title: "Redirecting...",
182
+ fullPage: props.fullPage
183
+ });
184
+ }
185
+ function HexclaveHandlerClient(props) {
186
+ const hexclaveApp = useStackApp$1();
155
187
  const clientOrigin = useClientOriginAfterHydration();
156
- const navigate = stackApp.useNavigate();
188
+ const navigate = hexclaveApp.useNavigate();
157
189
  const navigateRef = useRef(navigate);
158
190
  navigateRef.current = navigate;
159
- const currentLocation = props.location ?? (typeof window === "undefined" ? new URL(stackApp.urls.handler, placeholderOrigin).pathname : window.location.pathname);
191
+ const currentLocation = props.location ?? (typeof window === "undefined" ? new URL(hexclaveApp.urls.handler, placeholderOrigin).pathname : window.location.pathname);
160
192
  const searchParamsSource = new URLSearchParams(typeof window === "undefined" ? "" : window.location.search);
161
193
  const redirectTargets = [];
162
194
  const { path, searchParams, handlerPath } = useMemo(() => {
163
- const handlerPath = new URL(stackApp.urls.handler, "http://example.com").pathname;
195
+ const handlerPath = new URL(hexclaveApp.urls.handler, "http://example.com").pathname;
164
196
  return {
165
197
  path: currentLocation.startsWith(handlerPath) ? currentLocation.slice(handlerPath.length).replace(/^\/+/, "") : currentLocation.replace(/^\/+/, ""),
166
198
  searchParams: Object.fromEntries(searchParamsSource.entries()),
@@ -169,17 +201,17 @@ function StackHandlerClient(props) {
169
201
  }, [
170
202
  currentLocation,
171
203
  searchParamsSource,
172
- stackApp.urls.handler
204
+ hexclaveApp.urls.handler
173
205
  ]);
174
206
  const getDefaultUnknownPathUrl = (unknownPath) => {
175
207
  return resolveUnknownHandlerPathFallbackUrl({
176
- defaultTarget: stackApp[stackAppInternalsSymbol].getConstructorOptions().urls?.default,
177
- projectId: stackApp.projectId,
208
+ defaultTarget: hexclaveApp[hexclaveAppInternalsSymbol].getConstructorOptions().urls?.default,
209
+ projectId: hexclaveApp.projectId,
178
210
  unknownPath
179
211
  });
180
212
  };
181
213
  const shouldRedirectToPage = (name) => {
182
- const url = stackApp.urls[name];
214
+ const url = hexclaveApp.urls[name];
183
215
  if (name === "oauthCallback" && searchParams.hexclave_cross_domain_auth === "1") return false;
184
216
  return !isLocalHandlerUrlTarget({
185
217
  targetUrl: url,
@@ -198,23 +230,26 @@ function StackHandlerClient(props) {
198
230
  title: "Page does not exist",
199
231
  fullPage: props.fullPage,
200
232
  primaryButtonText: "Go to Home",
201
- primaryAction: () => stackApp.redirectToHome(),
233
+ primaryAction: () => hexclaveApp.redirectToHome(),
202
234
  children: "The page you are looking for could not be found. Please check the URL and try again."
203
235
  }),
204
- app: stackApp
236
+ app: hexclaveApp
205
237
  });
206
238
  const redirectToPage = result != null && typeof result === "object" && "redirectToPage" in result ? result.redirectToPage : void 0;
207
- useEffect(() => {
208
- if (redirectToPage == null) return;
209
- runAsynchronouslyWithAlert(stackApp[stackAppInternalsSymbol].redirectToHandler(redirectToPage, { replace: true }));
210
- }, [redirectToPage, stackApp]);
211
- if (redirectToPage != null) return /* @__PURE__ */ jsx(MessageCard$1, {
212
- title: "Redirecting...",
213
- fullPage: props.fullPage
239
+ if (redirectToPage != null) return /* @__PURE__ */ jsx(Suspense, {
240
+ fallback: /* @__PURE__ */ jsx(MessageCard$1, {
241
+ title: "Redirecting...",
242
+ fullPage: props.fullPage
243
+ }),
244
+ children: /* @__PURE__ */ jsx(RedirectToPage, {
245
+ app: hexclaveApp,
246
+ redirectToPage,
247
+ fullPage: props.fullPage
248
+ })
214
249
  });
215
250
  if (result && "redirect" in result) redirectTargets.push(result.redirect);
216
251
  const redirectTarget = redirectTargets[0];
217
- const shouldRenderRedirectFallback = redirectTarget != null && stackApp[stackAppInternalsSymbol].getRedirectMethod() === "none";
252
+ const shouldRenderRedirectFallback = redirectTarget != null && hexclaveApp[hexclaveAppInternalsSymbol].getRedirectMethod() === "none";
218
253
  useEffect(() => {
219
254
  if (redirectTarget == null || shouldRenderRedirectFallback) return;
220
255
  navigateRef.current(redirectTarget);
@@ -240,5 +275,5 @@ function useClientOriginAfterHydration() {
240
275
  }
241
276
 
242
277
  //#endregion
243
- export { StackHandlerClient };
244
- //# sourceMappingURL=stack-handler-client.js.map
278
+ export { HexclaveHandlerClient, getRedirectToPageResult };
279
+ //# sourceMappingURL=hexclave-handler-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hexclave-handler-client.js","names":["MessageCard","useStackApp"],"sources":["../../../src/components-page/hexclave-handler-client.tsx"],"sourcesContent":["\"use client\";\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { KnownError } from \"@hexclave/shared\";\nimport { captureError, HexclaveAssertionError } from \"@hexclave/shared/dist/utils/errors\";\nimport { FilterUndefined, filterUndefined } from \"@hexclave/shared/dist/utils/objects\";\nimport { use } from \"@hexclave/shared/dist/utils/react\";\nimport { getRelativePart } from \"@hexclave/shared/dist/utils/urls\";\nimport { Suspense, useMemo, useSyncExternalStore } from 'react';\nimport { useEffect, useRef } from 'react';\nimport { SignIn, SignUp, StackServerApp } from \"..\";\nimport { useStackApp } from \"../lib/hooks\";\nimport { HandlerUrls, StackClientApp, hexclaveAppInternalsSymbol } from \"../lib/hexclave-app\";\nimport { isLocalHandlerUrlTarget, resolveUnknownHandlerPathFallbackUrl } from \"../lib/hexclave-app/url-targets\";\nimport { AccountSettings } from \"./account-settings\";\nimport { CliAuthConfirmation } from \"./cli-auth-confirm\";\nimport { EmailVerification } from \"./email-verification\";\nimport { ErrorPage } from \"./error-page\";\nimport { ForgotPassword } from \"./forgot-password\";\nimport { MagicLinkCallback } from \"./magic-link-callback\";\nimport { MFA } from \"./mfa\";\nimport { OAuthCallback } from \"./oauth-callback\";\nimport { Onboarding } from \"./onboarding\";\nimport { PasswordReset } from \"./password-reset\";\nimport { SignOut } from \"./sign-out\";\nimport { TeamInvitation } from \"./team-invitation\";\n\nimport { KnownErrorMessageCard } from \"../components/message-cards/known-error-message-card\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { PredefinedMessageCard } from \"../components/message-cards/predefined-message-card\";\n\ntype Components = {\n SignIn: typeof SignIn,\n SignUp: typeof SignUp,\n EmailVerification: typeof EmailVerification,\n PasswordReset: typeof PasswordReset,\n ForgotPassword: typeof ForgotPassword,\n SignOut: typeof SignOut,\n OAuthCallback: typeof OAuthCallback,\n MagicLinkCallback: typeof MagicLinkCallback,\n TeamInvitation: typeof TeamInvitation,\n ErrorPage: typeof ErrorPage,\n AccountSettings: typeof AccountSettings,\n CliAuthConfirmation: typeof CliAuthConfirmation,\n MFA: typeof MFA,\n Onboarding: typeof Onboarding,\n};\n\ntype RouteProps = {\n params: Promise<{ stack?: string[] }> | { stack?: string[] },\n searchParams: Promise<Record<string, string>> | Record<string, string>,\n};\n\ntype RedirectToPageResult =\n | { status: \"success\" }\n | { status: \"known-error\", error: KnownError }\n | { status: \"unknown-error\" };\n\nconst availablePaths = {\n signIn: 'sign-in',\n signUp: 'sign-up',\n emailVerification: 'email-verification',\n passwordReset: 'password-reset',\n forgotPassword: 'forgot-password',\n signOut: 'sign-out',\n oauthCallback: 'oauth-callback',\n magicLinkCallback: 'magic-link-callback',\n teamInvitation: 'team-invitation',\n accountSettings: 'account-settings',\n cliAuthConfirm: 'cli-auth-confirm',\n mfa: 'mfa',\n error: 'error',\n onboarding: 'onboarding',\n} as const;\n\nconst placeholderOrigin = \"http://example.com\";\n\nconst pathAliases = {\n // also includes the uppercase and non-dashed versions\n ...Object.fromEntries(Object.entries(availablePaths).map(([key, value]) => [value, value])),\n \"log-in\": availablePaths.signIn,\n \"register\": availablePaths.signUp,\n} as const;\n\nexport type BaseHandlerProps = {\n fullPage: boolean,\n componentProps?: {\n [K in keyof Components]?: Parameters<Components[K]>[0];\n },\n};\n\nfunction renderComponent(props: {\n path: string,\n searchParams: Record<string, string>,\n fullPage: boolean,\n componentProps?: BaseHandlerProps['componentProps'],\n shouldRedirectToPage?: (name: keyof HandlerUrls) => boolean,\n getDefaultUnknownPathUrl?: (path: string) => string | null,\n onNotFound: () => any,\n app: StackClientApp<any> | StackServerApp<any>,\n}) {\n const { path, searchParams, fullPage, componentProps, shouldRedirectToPage, getDefaultUnknownPathUrl, onNotFound, app } = props;\n\n switch (path) {\n case availablePaths.signIn: {\n if (shouldRedirectToPage?.('signIn')) return { redirectToPage: 'signIn' as const };\n return <SignIn\n fullPage={fullPage}\n automaticRedirect\n {...filterUndefinedINU(componentProps?.SignIn)}\n />;\n }\n case availablePaths.signUp: {\n if (shouldRedirectToPage?.('signUp')) return { redirectToPage: 'signUp' as const };\n return <SignUp\n fullPage={fullPage}\n automaticRedirect\n {...filterUndefinedINU(componentProps?.SignUp)}\n />;\n }\n case availablePaths.emailVerification: {\n if (shouldRedirectToPage?.('emailVerification')) return { redirectToPage: 'emailVerification' as const };\n return <EmailVerification\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.EmailVerification)}\n />;\n }\n case availablePaths.passwordReset: {\n if (shouldRedirectToPage?.('passwordReset')) return { redirectToPage: 'passwordReset' as const };\n return <PasswordReset\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.PasswordReset)}\n />;\n }\n case availablePaths.forgotPassword: {\n if (shouldRedirectToPage?.('forgotPassword')) return { redirectToPage: 'forgotPassword' as const };\n return <ForgotPassword\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.ForgotPassword)}\n />;\n }\n case availablePaths.signOut: {\n if (shouldRedirectToPage?.('signOut')) return { redirectToPage: 'signOut' as const };\n return <SignOut\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.SignOut)}\n />;\n }\n case availablePaths.oauthCallback: {\n if (shouldRedirectToPage?.('oauthCallback')) return { redirectToPage: 'oauthCallback' as const };\n return <OAuthCallback\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.OAuthCallback)}\n />;\n }\n case availablePaths.magicLinkCallback: {\n if (shouldRedirectToPage?.('magicLinkCallback')) return { redirectToPage: 'magicLinkCallback' as const };\n return <MagicLinkCallback\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.MagicLinkCallback)}\n />;\n }\n case availablePaths.teamInvitation: {\n if (shouldRedirectToPage?.('teamInvitation')) return { redirectToPage: 'teamInvitation' as const };\n return <TeamInvitation\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.TeamInvitation)}\n />;\n }\n case availablePaths.accountSettings: {\n return <AccountSettings\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.AccountSettings)}\n />;\n }\n case availablePaths.error: {\n return <ErrorPage\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.ErrorPage)}\n />;\n }\n case availablePaths.cliAuthConfirm: {\n if (shouldRedirectToPage?.('cliAuthConfirm')) return { redirectToPage: 'cliAuthConfirm' as const };\n return <CliAuthConfirmation\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.CliAuthConfirmation)}\n />;\n }\n case availablePaths.mfa: {\n if (shouldRedirectToPage?.('mfa')) return { redirectToPage: 'mfa' as const };\n return <MFA\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.MFA)}\n />;\n }\n case availablePaths.onboarding: {\n if (shouldRedirectToPage?.('onboarding')) return { redirectToPage: 'onboarding' as const };\n return <Onboarding\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.Onboarding)}\n />;\n }\n default: {\n if (Object.values(availablePaths).includes(path as any)) {\n throw new HexclaveAssertionError(`Path alias ${path} not included in switch statement, but in availablePaths?`, { availablePaths });\n }\n for (const [key, value] of Object.entries(pathAliases)) {\n if (path.toLowerCase().replaceAll('-', '') === key.toLowerCase().replaceAll('-', '')) {\n const redirectUrl = `${app.urls.handler}/${value}?${new URLSearchParams(searchParams).toString()}`;\n return { redirect: redirectUrl };\n }\n }\n const defaultUnknownPathUrl = getDefaultUnknownPathUrl?.(path);\n if (defaultUnknownPathUrl != null) {\n const defaultUnknownPathUrlObject = new URL(defaultUnknownPathUrl, \"http://example.com\");\n for (const [key, value] of Object.entries(searchParams)) {\n defaultUnknownPathUrlObject.searchParams.set(key, value);\n }\n return { redirect: toAbsoluteOrRelativeRedirectTarget(defaultUnknownPathUrlObject) };\n }\n return onNotFound();\n }\n }\n}\n\nexport async function getRedirectToPageResult(\n app: StackClientApp,\n redirectToPage: keyof HandlerUrls,\n): Promise<RedirectToPageResult> {\n try {\n await app[hexclaveAppInternalsSymbol].redirectToHandler(redirectToPage, { replace: true });\n return { status: \"success\" };\n } catch (e) {\n if (KnownError.isKnownError(e)) {\n return { status: \"known-error\", error: e };\n }\n captureError(\"<HexclaveHandlerClient redirectToPage />\", e);\n return { status: \"unknown-error\" };\n }\n}\n\nfunction RedirectToPage(props: {\n app: StackClientApp,\n fullPage?: boolean,\n redirectToPage: keyof HandlerUrls,\n}) {\n const redirectResultPromise = useMemo(\n () => getRedirectToPageResult(props.app, props.redirectToPage),\n [props.app, props.redirectToPage],\n );\n\n const redirectResult = use(redirectResultPromise);\n if (redirectResult.status === \"known-error\") {\n return <KnownErrorMessageCard error={redirectResult.error} fullPage={props.fullPage} />;\n }\n if (redirectResult.status === \"unknown-error\") {\n return <PredefinedMessageCard type=\"unknownError\" fullPage={props.fullPage} />;\n }\n return <MessageCard title=\"Redirecting...\" fullPage={props.fullPage} />;\n}\n\nexport function HexclaveHandlerClient(props: BaseHandlerProps & Partial<RouteProps> & { location?: string }) {\n // Use hooks to get app\n const hexclaveApp = useStackApp();\n const clientOrigin = useClientOriginAfterHydration();\n\n const navigate = hexclaveApp.useNavigate();\n const navigateRef = useRef(navigate);\n navigateRef.current = navigate;\n const currentLocation = props.location ?? (typeof window === \"undefined\" ? new URL(hexclaveApp.urls.handler, placeholderOrigin).pathname : window.location.pathname);\n const searchParamsSource = new URLSearchParams(typeof window === \"undefined\" ? \"\" : window.location.search);\n const redirectTargets: (string | undefined)[] = [];\n\n const { path, searchParams, handlerPath } = useMemo(() => {\n const handlerPath = new URL(hexclaveApp.urls.handler, 'http://example.com').pathname;\n const relativePath = currentLocation.startsWith(handlerPath)\n ? currentLocation.slice(handlerPath.length).replace(/^\\/+/, '')\n : currentLocation.replace(/^\\/+/, '');\n\n return {\n path: relativePath,\n searchParams: Object.fromEntries(searchParamsSource.entries()),\n handlerPath,\n };\n }, [currentLocation, searchParamsSource, hexclaveApp.urls.handler]);\n\n const getDefaultUnknownPathUrl = (unknownPath: string): string | null => {\n return resolveUnknownHandlerPathFallbackUrl({\n defaultTarget: hexclaveApp[hexclaveAppInternalsSymbol].getConstructorOptions().urls?.default,\n projectId: hexclaveApp.projectId,\n unknownPath,\n });\n };\n\n const shouldRedirectToPage = (name: keyof HandlerUrls): boolean => {\n const url = hexclaveApp.urls[name];\n const isCrossDomainLocalOauthCallback = name === \"oauthCallback\" && searchParams.hexclave_cross_domain_auth === \"1\";\n if (isCrossDomainLocalOauthCallback) {\n return false;\n }\n return !isLocalHandlerUrlTarget({\n targetUrl: url,\n handlerPath,\n currentOrigin: clientOrigin,\n });\n };\n\n const result = renderComponent({\n path,\n searchParams,\n fullPage: props.fullPage,\n componentProps: props.componentProps,\n shouldRedirectToPage,\n getDefaultUnknownPathUrl,\n onNotFound: () =>\n (\n <MessageCard\n title=\"Page does not exist\"\n fullPage={props.fullPage}\n primaryButtonText=\"Go to Home\"\n primaryAction={() => hexclaveApp.redirectToHome()}\n >\n The page you are looking for could not be found. Please check the URL and try again.\n </MessageCard>\n )\n ,\n app: hexclaveApp,\n });\n\n const redirectToPage = (result != null && typeof result === 'object' && 'redirectToPage' in result) ? result.redirectToPage : undefined;\n\n if (redirectToPage != null) {\n return (\n <Suspense fallback={<MessageCard title=\"Redirecting...\" fullPage={props.fullPage} />}>\n <RedirectToPage app={hexclaveApp} redirectToPage={redirectToPage} fullPage={props.fullPage} />\n </Suspense>\n );\n }\n\n if (result && 'redirect' in result) {\n redirectTargets.push(result.redirect);\n }\n\n const redirectTarget = redirectTargets[0];\n const shouldRenderRedirectFallback = redirectTarget != null && hexclaveApp[hexclaveAppInternalsSymbol].getRedirectMethod() === \"none\";\n useEffect(() => {\n if (redirectTarget == null || shouldRenderRedirectFallback) {\n return;\n }\n navigateRef.current(redirectTarget);\n }, [redirectTarget, shouldRenderRedirectFallback]);\n\n if (redirectTarget != null && shouldRenderRedirectFallback) {\n return (\n <MessageCard\n title=\"Continue\"\n fullPage={props.fullPage}\n primaryButtonText=\"Continue\"\n primaryAction={() => window.location.assign(redirectTarget)}\n >\n Continue to the next page.\n </MessageCard>\n );\n }\n\n if (redirectTarget != null) {\n return null;\n }\n\n return result;\n}\n\n// filter undefined values in object. if object itself is undefined, return undefined\nfunction filterUndefinedINU<T extends {}>(value: T | undefined): FilterUndefined<T> | undefined {\n return value === undefined ? value : filterUndefined(value);\n}\n\nfunction toAbsoluteOrRelativeRedirectTarget(url: URL): string {\n return url.origin === \"http://example.com\" ? getRelativePart(url) : url.toString();\n}\n\nfunction useClientOriginAfterHydration(): string | undefined {\n // The first hydrated render must match SSR. After hydration, React re-checks\n // the snapshot and lets us distinguish same-path cross-origin handler URLs.\n return useSyncExternalStore(\n () => () => {},\n () => window.location.origin,\n () => undefined,\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { KnownErrors } from "@hexclave/shared";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { hexclaveAppInternalsSymbol } from "../lib/hexclave-app/index.js";
4
+ import { getRedirectToPageResult } from "./hexclave-handler-client.js";
5
+
6
+ //#region src/components-page/hexclave-handler-client.test.tsx
7
+ vi.mock("next/navigation", () => ({
8
+ RedirectType: { replace: "replace" },
9
+ notFound: () => {
10
+ throw new Error("notFound");
11
+ },
12
+ redirect: (url) => {
13
+ throw new Error(`redirect:${url}`);
14
+ },
15
+ usePathname: () => window.location.pathname,
16
+ useSearchParams: () => new URLSearchParams(window.location.search)
17
+ }));
18
+ function createAppTestDouble(options) {
19
+ const projectId = "00000000-0000-4000-8000-000000000000";
20
+ return {
21
+ projectId,
22
+ urls: {
23
+ handler: "http://localhost/handler",
24
+ signIn: `https://${projectId}.example-stack-hosted.test/handler/sign-in`,
25
+ home: "http://localhost"
26
+ },
27
+ redirectToHome: vi.fn(async () => {}),
28
+ [hexclaveAppInternalsSymbol]: {
29
+ getConstructorOptions: () => ({ urls: {} }),
30
+ redirectToHandler: options.redirectToHandler
31
+ }
32
+ };
33
+ }
34
+ describe("HexclaveHandlerClient", () => {
35
+ it("returns known cross-domain redirect errors instead of treating them as unhandled async failures", async () => {
36
+ const redirectToHandler = vi.fn(async () => {
37
+ throw new KnownErrors.RedirectUrlNotWhitelisted();
38
+ });
39
+ const result = await getRedirectToPageResult(createAppTestDouble({ redirectToHandler }), "signIn");
40
+ expect(redirectToHandler).toHaveBeenCalledWith("signIn", { replace: true });
41
+ expect(result.status).toBe("known-error");
42
+ if (result.status === "known-error") {
43
+ expect(result.error.errorCode).toBe("REDIRECT_URL_NOT_WHITELISTED");
44
+ expect(result.error.message).toContain("Redirect URL not whitelisted");
45
+ }
46
+ });
47
+ });
48
+
49
+ //#endregion
50
+ export { };
51
+ //# sourceMappingURL=hexclave-handler-client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hexclave-handler-client.test.js","names":[],"sources":["../../../src/components-page/hexclave-handler-client.test.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { KnownErrors } from \"@hexclave/shared\";\nimport { describe, expect, it, vi } from \"vitest\";\nimport { hexclaveAppInternalsSymbol } from \"../lib/hexclave-app\";\nimport type { StackClientApp } from \"../lib/hexclave-app/apps/interfaces/client-app\";\nimport { getRedirectToPageResult } from \"./hexclave-handler-client\";\n\nvi.mock(\"next/navigation\", () => ({\n RedirectType: {\n replace: \"replace\",\n },\n notFound: () => {\n throw new Error(\"notFound\");\n },\n redirect: (url: string) => {\n throw new Error(`redirect:${url}`);\n },\n usePathname: () => window.location.pathname,\n useSearchParams: () => new URLSearchParams(window.location.search),\n}));\n\nfunction createAppTestDouble(options: {\n redirectToHandler: (name: string, options: { replace: true }) => Promise<void>,\n}) {\n const projectId = \"00000000-0000-4000-8000-000000000000\";\n const app = {\n projectId,\n urls: {\n handler: \"http://localhost/handler\",\n signIn: `https://${projectId}.example-stack-hosted.test/handler/sign-in`,\n home: \"http://localhost\",\n },\n redirectToHome: vi.fn(async () => {}),\n [hexclaveAppInternalsSymbol]: {\n getConstructorOptions: () => ({ urls: {} }),\n redirectToHandler: options.redirectToHandler,\n },\n };\n\n // This test double intentionally implements only the StackClientApp surface\n // that HexclaveHandlerClient touches in this redirect path.\n return app as unknown as StackClientApp<true>;\n}\n\ndescribe(\"HexclaveHandlerClient\", () => {\n it(\"returns known cross-domain redirect errors instead of treating them as unhandled async failures\", async () => {\n const redirectToHandler = vi.fn(async () => {\n throw new KnownErrors.RedirectUrlNotWhitelisted();\n });\n const app = createAppTestDouble({ redirectToHandler });\n\n const result = await getRedirectToPageResult(app, \"signIn\");\n\n expect(redirectToHandler).toHaveBeenCalledWith(\"signIn\", { replace: true });\n expect(result.status).toBe(\"known-error\");\n if (result.status === \"known-error\") {\n expect(result.error.errorCode).toBe(\"REDIRECT_URL_NOT_WHITELISTED\");\n expect(result.error.message).toContain(\"Redirect URL not whitelisted\");\n }\n });\n});\n"],"mappings":";;;;;;AAUA,GAAG,KAAK,0BAA0B;CAChC,cAAc,EACZ,SAAS,WACV;CACD,gBAAgB;AACd,QAAM,IAAI,MAAM,WAAW;;CAE7B,WAAW,QAAgB;AACzB,QAAM,IAAI,MAAM,YAAY,MAAM;;CAEpC,mBAAmB,OAAO,SAAS;CACnC,uBAAuB,IAAI,gBAAgB,OAAO,SAAS,OAAO;CACnE,EAAE;AAEH,SAAS,oBAAoB,SAE1B;CACD,MAAM,YAAY;AAiBlB,QAhBY;EACV;EACA,MAAM;GACJ,SAAS;GACT,QAAQ,WAAW,UAAU;GAC7B,MAAM;GACP;EACD,gBAAgB,GAAG,GAAG,YAAY,GAAG;GACpC,6BAA6B;GAC5B,8BAA8B,EAAE,MAAM,EAAE,EAAE;GAC1C,mBAAmB,QAAQ;GAC5B;EACF;;AAOH,SAAS,+BAA+B;AACtC,IAAG,mGAAmG,YAAY;EAChH,MAAM,oBAAoB,GAAG,GAAG,YAAY;AAC1C,SAAM,IAAI,YAAY,2BAA2B;IACjD;EAGF,MAAM,SAAS,MAAM,wBAFT,oBAAoB,EAAE,mBAAmB,CAAC,EAEJ,SAAS;AAE3D,SAAO,kBAAkB,CAAC,qBAAqB,UAAU,EAAE,SAAS,MAAM,CAAC;AAC3E,SAAO,OAAO,OAAO,CAAC,KAAK,cAAc;AACzC,MAAI,OAAO,WAAW,eAAe;AACnC,UAAO,OAAO,MAAM,UAAU,CAAC,KAAK,+BAA+B;AACnE,UAAO,OAAO,MAAM,QAAQ,CAAC,UAAU,+BAA+B;;GAExE;EACF"}
@@ -1,8 +1,8 @@
1
1
  import * as react_jsx_runtime0 from "react/jsx-runtime";
2
- import { BaseHandlerProps } from "./stack-handler-client";
2
+ import { BaseHandlerProps } from "./hexclave-handler-client";
3
3
 
4
- //#region src/components-page/stack-handler.d.ts
5
- type StackHandlerProps = BaseHandlerProps & {
4
+ //#region src/components-page/hexclave-handler.d.ts
5
+ type HexclaveHandlerProps = BaseHandlerProps & {
6
6
  location?: string;
7
7
  } & {
8
8
  /**
@@ -28,10 +28,10 @@ declare function HandlerImpl({
28
28
  params,
29
29
  searchParams,
30
30
  ...props
31
- }: StackHandlerProps): react_jsx_runtime0.JSX.Element;
31
+ }: HexclaveHandlerProps): react_jsx_runtime0.JSX.Element;
32
32
  declare const HexclaveHandler: typeof HandlerImpl;
33
33
  /** @deprecated Use `HexclaveHandler` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */
34
34
  declare const StackHandler: typeof HandlerImpl;
35
35
  //#endregion
36
36
  export { HexclaveHandler, StackHandler, StackHandler as default };
37
- //# sourceMappingURL=stack-handler.d.ts.map
37
+ //# sourceMappingURL=hexclave-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hexclave-handler.d.ts","names":[],"sources":["../../../src/components-page/hexclave-handler.tsx"],"mappings":";;;;KAYK,oBAAA,GAAuB,gBAAA;EAAqB,QAAA;AAAA;EAA5C;;;EAIH,GAAA;EAJ0B;;;EAS1B,UAAA;EAKA;;;EAAA,MAAA;EAQO;;;EAHP,YAAA;AAAA;AAAA,iBAGO,WAAA,CAAA;EAAc,GAAA;EAAK,UAAA;EAAY,MAAA;EAAQ,YAAA;EAAA,GAAiB;AAAA,GAAS,oBAAA,GAAoB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,cAKjF,eAAA,SAAe,WAAA;;cAGf,YAAA,SAAY,WAAA"}
@@ -1,9 +1,9 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
- import { StackHandlerClient } from "./stack-handler-client.js";
2
+ import { HexclaveHandlerClient } from "./hexclave-handler-client.js";
3
3
 
4
- //#region src/components-page/stack-handler.tsx
4
+ //#region src/components-page/hexclave-handler.tsx
5
5
  function HandlerImpl({ app, routeProps, params, searchParams, ...props }) {
6
- return /* @__PURE__ */ jsx(StackHandlerClient, { ...props });
6
+ return /* @__PURE__ */ jsx(HexclaveHandlerClient, { ...props });
7
7
  }
8
8
  const HexclaveHandler = HandlerImpl;
9
9
  /** @deprecated Use `HexclaveHandler` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */
@@ -11,4 +11,4 @@ const StackHandler = HandlerImpl;
11
11
 
12
12
  //#endregion
13
13
  export { HexclaveHandler, StackHandler, StackHandler as default };
14
- //# sourceMappingURL=stack-handler.js.map
14
+ //# sourceMappingURL=hexclave-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hexclave-handler.js","names":[],"sources":["../../../src/components-page/hexclave-handler.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n// This file exists solely so the following old, deprecated code from when StackHandler used to still take props:\n// <StackHandler app={hexclaveServerApp} routeProps={props} />\n// does not throw the following error:\n// Only plain objects, and a few built-ins, can be passed to Client Components from Server Components. Classes or null prototypes are not supported.\n// This file exists as a component that can be both client and server, ignores the non-serializable props, and returns <HexclaveHandlerClient />\n\nimport { BaseHandlerProps, HexclaveHandlerClient } from \"./hexclave-handler-client\";\n\ntype HexclaveHandlerProps = BaseHandlerProps & { location?: string } & {\n /**\n * @deprecated The app parameter is no longer necessary. You can safely remove it.\n */\n app?: any,\n\n /**\n * @deprecated The routeProps parameter is no longer necessary. You can safely remove it.\n */\n routeProps?: any,\n\n /**\n * @deprecated The params parameter is no longer necessary. You can safely remove it.\n */\n params?: any,\n\n /**\n * @deprecated The searchParams parameter is no longer necessary. You can safely remove it.\n */\n searchParams?: any,\n};\n\nfunction HandlerImpl({ app, routeProps, params, searchParams, ...props }: HexclaveHandlerProps) {\n return <HexclaveHandlerClient {...props} />;\n}\n\n// Non-deprecated Hexclave-branded export.\nexport const HexclaveHandler = HandlerImpl;\n\n/** @deprecated Use `HexclaveHandler` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */\nexport const StackHandler = HandlerImpl;\n\n// Default export preserved for backwards compatibility (legacy `as`-rename re-exports).\n// Points at the deprecated alias so that `import StackHandler from \".../hexclave-handler\"` still\n// surfaces the deprecation. Internal re-exports in template/src/index.ts use the named exports.\nexport default StackHandler;\n"],"mappings":";;;;AAkCA,SAAS,YAAY,EAAE,KAAK,YAAY,QAAQ,cAAc,GAAG,SAA+B;AAC9F,QAAO,oBAAC,yBAAsB,GAAI,QAAS;;AAI7C,MAAa,kBAAkB;;AAG/B,MAAa,eAAe"}
@@ -6,17 +6,17 @@ import { useStackApp, useUser } from "../index.js";
6
6
  import { useTranslation } from "../lib/translations.js";
7
7
  import { jsx } from "react/jsx-runtime";
8
8
  import { KnownErrors } from "@hexclave/shared";
9
- import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card.js";
10
9
  import { MessageCard as MessageCard$1 } from "../components/message-cards/message-card.js";
10
+ import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card.js";
11
11
  import { cacheFunction } from "@hexclave/shared/dist/utils/caches";
12
12
 
13
13
  //#region src/components-page/magic-link-callback.tsx
14
- cacheFunction(async (stackApp, code) => {
15
- return await stackApp.signInWithMagicLink(code);
14
+ cacheFunction(async (hexclaveApp, code) => {
15
+ return await hexclaveApp.signInWithMagicLink(code);
16
16
  });
17
17
  function MagicLinkCallback(props) {
18
18
  const { t } = useTranslation();
19
- const stackApp = useStackApp();
19
+ const hexclaveApp = useStackApp();
20
20
  const user = useUser();
21
21
  const [result, setResult] = React.useState(null);
22
22
  if (user) return /* @__PURE__ */ jsx(PredefinedMessageCard, {
@@ -44,11 +44,11 @@ function MagicLinkCallback(props) {
44
44
  fullPage: !!props.fullPage,
45
45
  primaryButtonText: t("Sign in"),
46
46
  primaryAction: async () => {
47
- setResult(await stackApp.signInWithMagicLink(props.searchParams?.code || throwErr("No magic link provided")));
47
+ setResult(await hexclaveApp.signInWithMagicLink(props.searchParams?.code || throwErr("No magic link provided")));
48
48
  },
49
49
  secondaryButtonText: t("Cancel"),
50
50
  secondaryAction: async () => {
51
- await stackApp.redirectToHome();
51
+ await hexclaveApp.redirectToHome();
52
52
  }
53
53
  });
54
54
  else {
@@ -61,7 +61,7 @@ function MagicLinkCallback(props) {
61
61
  fullPage: !!props.fullPage,
62
62
  primaryButtonText: t("Go home"),
63
63
  primaryAction: async () => {
64
- await stackApp.redirectToHome();
64
+ await hexclaveApp.redirectToHome();
65
65
  }
66
66
  });
67
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"magic-link-callback.js","names":["MessageCard"],"sources":["../../../src/components-page/magic-link-callback.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { KnownErrors } from \"@hexclave/shared\";\nimport { cacheFunction } from \"@hexclave/shared/dist/utils/caches\";\nimport { throwErr } from \"@hexclave/shared/dist/utils/errors\";\nimport React from \"react\";\nimport { StackClientApp, useStackApp, useUser } from \"..\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { PredefinedMessageCard } from \"../components/message-cards/predefined-message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\nconst cacheSignInWithMagicLink = cacheFunction(async (stackApp: StackClientApp<true>, code: string) => {\n return await stackApp.signInWithMagicLink(code);\n});\n\nexport function MagicLinkCallback(props: {\n searchParams?: Record<string, string>,\n fullPage?: boolean,\n}) {\n const { t } = useTranslation();\n const stackApp = useStackApp();\n const user = useUser();\n const [result, setResult] = React.useState<Awaited<ReturnType<typeof stackApp.signInWithMagicLink>> | null>(null);\n\n if (user) {\n return <PredefinedMessageCard type='signedIn' fullPage={!!props.fullPage} />;\n }\n\n const invalidJsx = (\n <MessageCard title={t(\"Invalid Magic Link\")} fullPage={!!props.fullPage}>\n <p>{t(\"Please check if you have the correct link. If you continue to have issues, please contact support.\")}</p>\n </MessageCard>\n );\n\n const expiredJsx = (\n <MessageCard title={t(\"Expired Magic Link\")} fullPage={!!props.fullPage}>\n <p>{t(\"Your magic link has expired. Please request a new magic link if you need to sign-in.\")}</p>\n </MessageCard>\n );\n\n const alreadyUsedJsx = (\n <MessageCard title={t(\"Magic Link Already Used\")} fullPage={!!props.fullPage}>\n <p>{t(\"The magic link has already been used. The link can only be used once. Please request a new magic link if you need to sign-in again.\")}</p>\n </MessageCard>\n );\n\n if (!props.searchParams?.code) {\n return invalidJsx;\n }\n\n if (!result) {\n return <MessageCard\n title={t(\"Do you want to sign in?\")}\n fullPage={!!props.fullPage}\n primaryButtonText={t(\"Sign in\")}\n primaryAction={async () => {\n const result = await stackApp.signInWithMagicLink(props.searchParams?.code || throwErr(\"No magic link provided\"));\n setResult(result);\n }}\n secondaryButtonText={t(\"Cancel\")}\n secondaryAction={async () => {\n await stackApp.redirectToHome();\n }}\n />;\n } else {\n if (result.status === 'error') {\n if (KnownErrors.VerificationCodeNotFound.isInstance(result.error)) {\n return invalidJsx;\n } else if (KnownErrors.VerificationCodeExpired.isInstance(result.error)) {\n return expiredJsx;\n } else if (KnownErrors.VerificationCodeAlreadyUsed.isInstance(result.error)) {\n return alreadyUsedJsx;\n } else {\n throw result.error;\n }\n }\n\n return <MessageCard\n title={t(\"Signed in successfully!\")}\n fullPage={!!props.fullPage}\n primaryButtonText={t(\"Go home\")}\n primaryAction={async () => {\n await stackApp.redirectToHome();\n }}\n />;\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAgBiC,cAAc,OAAO,UAAgC,SAAiB;AACrG,QAAO,MAAM,SAAS,oBAAoB,KAAK;EAC/C;AAEF,SAAgB,kBAAkB,OAG/B;CACD,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,WAAW,aAAa;CAC9B,MAAM,OAAO,SAAS;CACtB,MAAM,CAAC,QAAQ,aAAa,MAAM,SAA0E,KAAK;AAEjH,KAAI,KACF,QAAO,oBAAC;EAAsB,MAAK;EAAW,UAAU,CAAC,CAAC,MAAM;GAAY;CAG9E,MAAM,aACJ,oBAACA;EAAY,OAAO,EAAE,qBAAqB;EAAE,UAAU,CAAC,CAAC,MAAM;YAC7D,oBAAC,iBAAG,EAAE,qGAAqG,GAAK;GACpG;CAGhB,MAAM,aACJ,oBAACA;EAAY,OAAO,EAAE,qBAAqB;EAAE,UAAU,CAAC,CAAC,MAAM;YAC7D,oBAAC,iBAAG,EAAE,uFAAuF,GAAK;GACtF;CAGhB,MAAM,iBACJ,oBAACA;EAAY,OAAO,EAAE,0BAA0B;EAAE,UAAU,CAAC,CAAC,MAAM;YAClE,oBAAC,iBAAG,EAAE,sIAAsI,GAAK;GACrI;AAGhB,KAAI,CAAC,MAAM,cAAc,KACvB,QAAO;AAGT,KAAI,CAAC,OACH,QAAO,oBAACA;EACN,OAAO,EAAE,0BAA0B;EACnC,UAAU,CAAC,CAAC,MAAM;EAClB,mBAAmB,EAAE,UAAU;EAC/B,eAAe,YAAY;AAEzB,aADe,MAAM,SAAS,oBAAoB,MAAM,cAAc,QAAQ,SAAS,yBAAyB,CAAC,CAChG;;EAEnB,qBAAqB,EAAE,SAAS;EAChC,iBAAiB,YAAY;AAC3B,SAAM,SAAS,gBAAgB;;GAEjC;MACG;AACL,MAAI,OAAO,WAAW,QACpB,KAAI,YAAY,yBAAyB,WAAW,OAAO,MAAM,CAC/D,QAAO;WACE,YAAY,wBAAwB,WAAW,OAAO,MAAM,CACrE,QAAO;WACE,YAAY,4BAA4B,WAAW,OAAO,MAAM,CACzE,QAAO;MAEP,OAAM,OAAO;AAIjB,SAAO,oBAACA;GACN,OAAO,EAAE,0BAA0B;GACnC,UAAU,CAAC,CAAC,MAAM;GAClB,mBAAmB,EAAE,UAAU;GAC/B,eAAe,YAAY;AACzB,UAAM,SAAS,gBAAgB;;IAEjC"}
1
+ {"version":3,"file":"magic-link-callback.js","names":["MessageCard"],"sources":["../../../src/components-page/magic-link-callback.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { KnownErrors } from \"@hexclave/shared\";\nimport { cacheFunction } from \"@hexclave/shared/dist/utils/caches\";\nimport { throwErr } from \"@hexclave/shared/dist/utils/errors\";\nimport React from \"react\";\nimport { StackClientApp, useStackApp, useUser } from \"..\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { PredefinedMessageCard } from \"../components/message-cards/predefined-message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\nconst cacheSignInWithMagicLink = cacheFunction(async (hexclaveApp: StackClientApp<true>, code: string) => {\n return await hexclaveApp.signInWithMagicLink(code);\n});\n\nexport function MagicLinkCallback(props: {\n searchParams?: Record<string, string>,\n fullPage?: boolean,\n}) {\n const { t } = useTranslation();\n const hexclaveApp = useStackApp();\n const user = useUser();\n const [result, setResult] = React.useState<Awaited<ReturnType<typeof hexclaveApp.signInWithMagicLink>> | null>(null);\n\n if (user) {\n return <PredefinedMessageCard type='signedIn' fullPage={!!props.fullPage} />;\n }\n\n const invalidJsx = (\n <MessageCard title={t(\"Invalid Magic Link\")} fullPage={!!props.fullPage}>\n <p>{t(\"Please check if you have the correct link. If you continue to have issues, please contact support.\")}</p>\n </MessageCard>\n );\n\n const expiredJsx = (\n <MessageCard title={t(\"Expired Magic Link\")} fullPage={!!props.fullPage}>\n <p>{t(\"Your magic link has expired. Please request a new magic link if you need to sign-in.\")}</p>\n </MessageCard>\n );\n\n const alreadyUsedJsx = (\n <MessageCard title={t(\"Magic Link Already Used\")} fullPage={!!props.fullPage}>\n <p>{t(\"The magic link has already been used. The link can only be used once. Please request a new magic link if you need to sign-in again.\")}</p>\n </MessageCard>\n );\n\n if (!props.searchParams?.code) {\n return invalidJsx;\n }\n\n if (!result) {\n return <MessageCard\n title={t(\"Do you want to sign in?\")}\n fullPage={!!props.fullPage}\n primaryButtonText={t(\"Sign in\")}\n primaryAction={async () => {\n const result = await hexclaveApp.signInWithMagicLink(props.searchParams?.code || throwErr(\"No magic link provided\"));\n setResult(result);\n }}\n secondaryButtonText={t(\"Cancel\")}\n secondaryAction={async () => {\n await hexclaveApp.redirectToHome();\n }}\n />;\n } else {\n if (result.status === 'error') {\n if (KnownErrors.VerificationCodeNotFound.isInstance(result.error)) {\n return invalidJsx;\n } else if (KnownErrors.VerificationCodeExpired.isInstance(result.error)) {\n return expiredJsx;\n } else if (KnownErrors.VerificationCodeAlreadyUsed.isInstance(result.error)) {\n return alreadyUsedJsx;\n } else {\n throw result.error;\n }\n }\n\n return <MessageCard\n title={t(\"Signed in successfully!\")}\n fullPage={!!props.fullPage}\n primaryButtonText={t(\"Go home\")}\n primaryAction={async () => {\n await hexclaveApp.redirectToHome();\n }}\n />;\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAgBiC,cAAc,OAAO,aAAmC,SAAiB;AACxG,QAAO,MAAM,YAAY,oBAAoB,KAAK;EAClD;AAEF,SAAgB,kBAAkB,OAG/B;CACD,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,cAAc,aAAa;CACjC,MAAM,OAAO,SAAS;CACtB,MAAM,CAAC,QAAQ,aAAa,MAAM,SAA6E,KAAK;AAEpH,KAAI,KACF,QAAO,oBAAC;EAAsB,MAAK;EAAW,UAAU,CAAC,CAAC,MAAM;GAAY;CAG9E,MAAM,aACJ,oBAACA;EAAY,OAAO,EAAE,qBAAqB;EAAE,UAAU,CAAC,CAAC,MAAM;YAC7D,oBAAC,iBAAG,EAAE,qGAAqG,GAAK;GACpG;CAGhB,MAAM,aACJ,oBAACA;EAAY,OAAO,EAAE,qBAAqB;EAAE,UAAU,CAAC,CAAC,MAAM;YAC7D,oBAAC,iBAAG,EAAE,uFAAuF,GAAK;GACtF;CAGhB,MAAM,iBACJ,oBAACA;EAAY,OAAO,EAAE,0BAA0B;EAAE,UAAU,CAAC,CAAC,MAAM;YAClE,oBAAC,iBAAG,EAAE,sIAAsI,GAAK;GACrI;AAGhB,KAAI,CAAC,MAAM,cAAc,KACvB,QAAO;AAGT,KAAI,CAAC,OACH,QAAO,oBAACA;EACN,OAAO,EAAE,0BAA0B;EACnC,UAAU,CAAC,CAAC,MAAM;EAClB,mBAAmB,EAAE,UAAU;EAC/B,eAAe,YAAY;AAEzB,aADe,MAAM,YAAY,oBAAoB,MAAM,cAAc,QAAQ,SAAS,yBAAyB,CAAC,CACnG;;EAEnB,qBAAqB,EAAE,SAAS;EAChC,iBAAiB,YAAY;AAC3B,SAAM,YAAY,gBAAgB;;GAEpC;MACG;AACL,MAAI,OAAO,WAAW,QACpB,KAAI,YAAY,yBAAyB,WAAW,OAAO,MAAM,CAC/D,QAAO;WACE,YAAY,wBAAwB,WAAW,OAAO,MAAM,CACrE,QAAO;WACE,YAAY,4BAA4B,WAAW,OAAO,MAAM,CACzE,QAAO;MAEP,OAAM,OAAO;AAIjB,SAAO,oBAACA;GACN,OAAO,EAAE,0BAA0B;GACnC,UAAU,CAAC,CAAC,MAAM;GAClB,mBAAmB,EAAE,UAAU;GAC/B,eAAe,YAAY;AACzB,UAAM,YAAY,gBAAgB;;IAEpC"}
@@ -12,7 +12,7 @@ import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
12
12
 
13
13
  //#region src/components-page/mfa.tsx
14
14
  function MfaForm({ onSuccess, onCancel }) {
15
- const stackApp = useStackApp();
15
+ const hexclaveApp = useStackApp();
16
16
  const { t } = useTranslation();
17
17
  const [otp, setOtp] = useState("");
18
18
  const formRef = useRef(null);
@@ -35,7 +35,7 @@ function MfaForm({ onSuccess, onCancel }) {
35
35
  }
36
36
  setSubmitting(true);
37
37
  setError(null);
38
- if (attemptCode) stackApp.signInWithMfa(otp, attemptCode, { noRedirect: true }).then(async (result) => {
38
+ if (attemptCode) hexclaveApp.signInWithMfa(otp, attemptCode, { noRedirect: true }).then(async (result) => {
39
39
  if (result.status === "ok") {
40
40
  setVerified(true);
41
41
  if (typeof window !== "undefined") {
@@ -43,7 +43,7 @@ function MfaForm({ onSuccess, onCancel }) {
43
43
  window.sessionStorage.removeItem("stack_mfa_attempt_code");
44
44
  }
45
45
  if (onSuccess) onSuccess();
46
- else await stackApp.redirectToAfterSignIn();
46
+ else await hexclaveApp.redirectToAfterSignIn();
47
47
  } else throw result.error;
48
48
  }).catch((e) => {
49
49
  if (e instanceof KnownErrors.InvalidTotpCode) setError(t("Invalid TOTP code"));
@@ -63,7 +63,7 @@ function MfaForm({ onSuccess, onCancel }) {
63
63
  submitting,
64
64
  onSuccess,
65
65
  attemptCode,
66
- stackApp,
66
+ hexclaveApp,
67
67
  t,
68
68
  verified
69
69
  ]);
@@ -1 +1 @@
1
- {"version":3,"file":"mfa.js","names":[],"sources":["../../../src/components-page/mfa.tsx"],"sourcesContent":["\"use client\";\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { KnownErrors } from \"@hexclave/shared\";\nimport {\n Button,\n InputOTP,\n InputOTPGroup,\n InputOTPSlot,\n Spinner,\n Typography,\n cn,\n} from \"@hexclave/ui\";\nimport { CheckIcon } from \"lucide-react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useStackApp } from \"..\";\nimport { FormWarningText } from \"../components/elements/form-warning\";\nimport { MaybeFullPage } from \"../components/elements/maybe-full-page\";\nimport { useTranslation } from \"../lib/translations\";\n\nfunction MfaForm({ onSuccess, onCancel }: {\n onSuccess?: () => void,\n onCancel?: () => void,\n}) {\n const stackApp = useStackApp();\n const { t } = useTranslation();\n const [otp, setOtp] = useState<string>(\"\");\n const formRef = useRef<HTMLFormElement>(null);\n\n const [submitting, setSubmitting] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [verified, setVerified] = useState<boolean>(false);\n\n const [attemptCode, setAttemptCode] = useState<string | null>(null);\n\n useEffect(() => {\n if (!attemptCode && typeof window !== \"undefined\") {\n // Hexclave rebrand: prefer the new MFA attempt code key, fall back to the legacy key.\n const code = window.sessionStorage.getItem(\"hexclave_mfa_attempt_code\") ?? window.sessionStorage.getItem(\"stack_mfa_attempt_code\");\n if (code) {\n setAttemptCode(code);\n }\n }\n }, [ attemptCode]);\n\n // Handle OTP verification when code is complete\n useEffect(() => {\n if (otp.length === 6 && !submitting) {\n // Blur any focused inputs\n if (document.activeElement instanceof HTMLElement) {\n document.activeElement.blur();\n }\n if (formRef.current) {\n const inputs = formRef.current.querySelectorAll('input');\n for (const input of inputs) {\n input.blur();\n }\n }\n\n setSubmitting(true);\n setError(null);\n\n if (attemptCode) {\n stackApp\n .signInWithMfa(otp, attemptCode, { noRedirect: true })\n .then(async (result) => {\n if (result.status === \"ok\") {\n setVerified(true);\n\n // Cleanup session storage\n if (typeof window !== \"undefined\") {\n // Hexclave rebrand: remove both the new and legacy MFA attempt code keys.\n window.sessionStorage.removeItem(\"hexclave_mfa_attempt_code\");\n window.sessionStorage.removeItem(\"stack_mfa_attempt_code\");\n }\n\n if (onSuccess) {\n onSuccess();\n } else {\n await stackApp.redirectToAfterSignIn();\n }\n } else {\n throw result.error;\n }\n })\n .catch((e) => {\n if (e instanceof KnownErrors.InvalidTotpCode) {\n setError(t(\"Invalid TOTP code\"));\n } else {\n setError(t(\"Verification failed\"));\n }\n })\n .finally(() => {\n setSubmitting(false);\n if (!verified) {\n setOtp(\"\");\n }\n });\n } else {\n setSubmitting(false);\n setError(t(\"Missing verification information\"));\n }\n }\n\n // Clear error when user is typing\n if (otp.length !== 0 && otp.length !== 6) {\n setError(null);\n }\n }, [otp, submitting, onSuccess, attemptCode, stackApp, t, verified]);\n\n\n const inputStyleClass = useMemo(() => {\n if (verified) {\n return \"opacity-85 transition-all duration-300\";\n }\n\n if (error) {\n return \"ring-red-500 border-red-500\";\n }\n\n return \"focus:ring-primary/50\";\n }, [error, verified]);\n\n return (\n <div className=\"flex flex-col items-stretch stack-scope\">\n <form ref={formRef} className=\"w-full flex flex-col items-center gap-4\">\n <InputOTP\n maxLength={6}\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"······\"\n value={otp}\n onChange={(value) => setOtp(value.toUpperCase())}\n disabled={submitting || verified}\n >\n <InputOTPGroup>\n {[0, 1, 2, 3, 4, 5].map((index) => (\n <InputOTPSlot\n key={index}\n index={index}\n size=\"lg\"\n className={cn(\n \"border focus:ring-2 transition-all\",\n inputStyleClass,\n )}\n />\n ))}\n </InputOTPGroup>\n </InputOTP>\n\n {/* Verification Status */}\n <div className=\"h-8 flex flex-col gap-4 items-center justify-center w-full\">\n {verified ? (\n <div className=\"flex items-center gap-2 animate-in fade-in duration-300 slide-in-from-bottom-2\">\n <CheckIcon className=\"w-5 h-5 text-green-600 animate-in zoom-in duration-300\" />\n <Typography className=\"text-sm font-medium\">{t(\"Verified! Redirecting...\")}</Typography>\n </div>\n ) : submitting ? (\n <div className=\"flex items-center gap-2\">\n <Spinner className=\"text-primary h-4 w-4\" />\n <Typography className=\"text-sm\">{t(\"Verifying...\")}</Typography>\n </div>\n ) : null}\n\n {/* Error reporting */}\n {error !== null && !submitting && !verified ? <FormWarningText text={error} /> : null}\n </div>\n </form>\n\n {/* Cancel Button */}\n {onCancel && !verified && (\n <Button\n variant=\"link\"\n onClick={onCancel}\n className=\"underline mt-4 self-center\"\n disabled={submitting || verified}\n >\n {t(\"Cancel\")}\n </Button>\n )}\n </div>\n );\n}\n\nexport function MFA(props: {\n fullPage?: boolean,\n onSuccess?: () => void,\n onCancel?: () => void,\n}) {\n const { t } = useTranslation();\n\n const headerText = t(\"Multi-Factor Authentication\");\n const instructionText = t(\"Enter the six-digit code from your authenticator app\");\n\n if (props.fullPage) {\n return (\n <MaybeFullPage fullPage={true}>\n <div\n className=\"stack-scope flex flex-col items-stretch\"\n style={{ maxWidth: \"380px\", flexBasis: \"380px\", padding: \"1rem\" }}\n >\n <div className=\"text-center mb-6\">\n <Typography type=\"h2\">{headerText}</Typography>\n <Typography className=\"mt-2\">{instructionText}</Typography>\n </div>\n <MfaForm onSuccess={props.onSuccess} onCancel={props.onCancel} />\n </div>\n </MaybeFullPage>\n );\n }\n\n return (\n <div className=\"flex flex-col items-stretch stack-scope\">\n <Typography className=\"mb-4 text-center\">{instructionText}</Typography>\n <MfaForm onSuccess={props.onSuccess} onCancel={props.onCancel} />\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"mfa.js","names":[],"sources":["../../../src/components-page/mfa.tsx"],"sourcesContent":["\"use client\";\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { KnownErrors } from \"@hexclave/shared\";\nimport {\n Button,\n InputOTP,\n InputOTPGroup,\n InputOTPSlot,\n Spinner,\n Typography,\n cn,\n} from \"@hexclave/ui\";\nimport { CheckIcon } from \"lucide-react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useStackApp } from \"..\";\nimport { FormWarningText } from \"../components/elements/form-warning\";\nimport { MaybeFullPage } from \"../components/elements/maybe-full-page\";\nimport { useTranslation } from \"../lib/translations\";\n\nfunction MfaForm({ onSuccess, onCancel }: {\n onSuccess?: () => void,\n onCancel?: () => void,\n}) {\n const hexclaveApp = useStackApp();\n const { t } = useTranslation();\n const [otp, setOtp] = useState<string>(\"\");\n const formRef = useRef<HTMLFormElement>(null);\n\n const [submitting, setSubmitting] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [verified, setVerified] = useState<boolean>(false);\n\n const [attemptCode, setAttemptCode] = useState<string | null>(null);\n\n useEffect(() => {\n if (!attemptCode && typeof window !== \"undefined\") {\n // Hexclave rebrand: prefer the new MFA attempt code key, fall back to the legacy key.\n const code = window.sessionStorage.getItem(\"hexclave_mfa_attempt_code\") ?? window.sessionStorage.getItem(\"stack_mfa_attempt_code\");\n if (code) {\n setAttemptCode(code);\n }\n }\n }, [ attemptCode]);\n\n // Handle OTP verification when code is complete\n useEffect(() => {\n if (otp.length === 6 && !submitting) {\n // Blur any focused inputs\n if (document.activeElement instanceof HTMLElement) {\n document.activeElement.blur();\n }\n if (formRef.current) {\n const inputs = formRef.current.querySelectorAll('input');\n for (const input of inputs) {\n input.blur();\n }\n }\n\n setSubmitting(true);\n setError(null);\n\n if (attemptCode) {\n hexclaveApp\n .signInWithMfa(otp, attemptCode, { noRedirect: true })\n .then(async (result) => {\n if (result.status === \"ok\") {\n setVerified(true);\n\n // Cleanup session storage\n if (typeof window !== \"undefined\") {\n // Hexclave rebrand: remove both the new and legacy MFA attempt code keys.\n window.sessionStorage.removeItem(\"hexclave_mfa_attempt_code\");\n window.sessionStorage.removeItem(\"stack_mfa_attempt_code\");\n }\n\n if (onSuccess) {\n onSuccess();\n } else {\n await hexclaveApp.redirectToAfterSignIn();\n }\n } else {\n throw result.error;\n }\n })\n .catch((e) => {\n if (e instanceof KnownErrors.InvalidTotpCode) {\n setError(t(\"Invalid TOTP code\"));\n } else {\n setError(t(\"Verification failed\"));\n }\n })\n .finally(() => {\n setSubmitting(false);\n if (!verified) {\n setOtp(\"\");\n }\n });\n } else {\n setSubmitting(false);\n setError(t(\"Missing verification information\"));\n }\n }\n\n // Clear error when user is typing\n if (otp.length !== 0 && otp.length !== 6) {\n setError(null);\n }\n }, [otp, submitting, onSuccess, attemptCode, hexclaveApp, t, verified]);\n\n\n const inputStyleClass = useMemo(() => {\n if (verified) {\n return \"opacity-85 transition-all duration-300\";\n }\n\n if (error) {\n return \"ring-red-500 border-red-500\";\n }\n\n return \"focus:ring-primary/50\";\n }, [error, verified]);\n\n return (\n <div className=\"flex flex-col items-stretch stack-scope\">\n <form ref={formRef} className=\"w-full flex flex-col items-center gap-4\">\n <InputOTP\n maxLength={6}\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"······\"\n value={otp}\n onChange={(value) => setOtp(value.toUpperCase())}\n disabled={submitting || verified}\n >\n <InputOTPGroup>\n {[0, 1, 2, 3, 4, 5].map((index) => (\n <InputOTPSlot\n key={index}\n index={index}\n size=\"lg\"\n className={cn(\n \"border focus:ring-2 transition-all\",\n inputStyleClass,\n )}\n />\n ))}\n </InputOTPGroup>\n </InputOTP>\n\n {/* Verification Status */}\n <div className=\"h-8 flex flex-col gap-4 items-center justify-center w-full\">\n {verified ? (\n <div className=\"flex items-center gap-2 animate-in fade-in duration-300 slide-in-from-bottom-2\">\n <CheckIcon className=\"w-5 h-5 text-green-600 animate-in zoom-in duration-300\" />\n <Typography className=\"text-sm font-medium\">{t(\"Verified! Redirecting...\")}</Typography>\n </div>\n ) : submitting ? (\n <div className=\"flex items-center gap-2\">\n <Spinner className=\"text-primary h-4 w-4\" />\n <Typography className=\"text-sm\">{t(\"Verifying...\")}</Typography>\n </div>\n ) : null}\n\n {/* Error reporting */}\n {error !== null && !submitting && !verified ? <FormWarningText text={error} /> : null}\n </div>\n </form>\n\n {/* Cancel Button */}\n {onCancel && !verified && (\n <Button\n variant=\"link\"\n onClick={onCancel}\n className=\"underline mt-4 self-center\"\n disabled={submitting || verified}\n >\n {t(\"Cancel\")}\n </Button>\n )}\n </div>\n );\n}\n\nexport function MFA(props: {\n fullPage?: boolean,\n onSuccess?: () => void,\n onCancel?: () => void,\n}) {\n const { t } = useTranslation();\n\n const headerText = t(\"Multi-Factor Authentication\");\n const instructionText = t(\"Enter the six-digit code from your authenticator app\");\n\n if (props.fullPage) {\n return (\n <MaybeFullPage fullPage={true}>\n <div\n className=\"stack-scope flex flex-col items-stretch\"\n style={{ maxWidth: \"380px\", flexBasis: \"380px\", padding: \"1rem\" }}\n >\n <div className=\"text-center mb-6\">\n <Typography type=\"h2\">{headerText}</Typography>\n <Typography className=\"mt-2\">{instructionText}</Typography>\n </div>\n <MfaForm onSuccess={props.onSuccess} onCancel={props.onCancel} />\n </div>\n </MaybeFullPage>\n );\n }\n\n return (\n <div className=\"flex flex-col items-stretch stack-scope\">\n <Typography className=\"mb-4 text-center\">{instructionText}</Typography>\n <MfaForm onSuccess={props.onSuccess} onCancel={props.onCancel} />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -10,7 +10,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
10
10
  import { KnownError } from "@hexclave/shared";
11
11
  import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
12
12
  import { StyledLink } from "../components/link.js";
13
- import { stackAppInternalsSymbol } from "../lib/stack-app/index.js";
13
+ import { hexclaveAppInternalsSymbol } from "../lib/hexclave-app/index.js";
14
14
 
15
15
  //#region src/components-page/oauth-callback.tsx
16
16
  function OAuthCallback({ fullPage }) {
@@ -24,11 +24,11 @@ function OAuthCallback({ fullPage }) {
24
24
  called.current = true;
25
25
  const redirectToError = async (url) => {
26
26
  const urlString = url.toString();
27
- if (app[stackAppInternalsSymbol].getRedirectMethod() === "none") {
27
+ if (app[hexclaveAppInternalsSymbol].getRedirectMethod() === "none") {
28
28
  setRedirectUrl(urlString);
29
29
  return;
30
30
  }
31
- await app[stackAppInternalsSymbol].redirectToUrl(urlString, { replace: true });
31
+ await app[hexclaveAppInternalsSymbol].redirectToUrl(urlString, { replace: true });
32
32
  };
33
33
  try {
34
34
  if (!await app.callOAuthCallback()) await app.redirectToSignIn({ noRedirectBack: true });
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-callback.js","names":[],"sources":["../../../src/components-page/oauth-callback.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { KnownError } from \"@hexclave/shared\";\nimport { captureError } from \"@hexclave/shared/dist/utils/errors\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { Spinner, cn } from \"@hexclave/ui\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useStackApp } from \"..\";\nimport { MaybeFullPage } from \"../components/elements/maybe-full-page\";\nimport { StyledLink } from \"../components/link\";\nimport { stackAppInternalsSymbol } from \"../lib/stack-app\";\nimport { useTranslation } from \"../lib/translations\";\n\nexport function OAuthCallback({ fullPage }: { fullPage?: boolean }) {\n const { t } = useTranslation();\n const app = useStackApp();\n const called = useRef(false);\n const [showRedirectLink, setShowRedirectLink] = useState(false);\n const [redirectUrl, setRedirectUrl] = useState<string | null>(null);\n\n useEffect(() => runAsynchronously(async () => {\n if (called.current) return;\n called.current = true;\n const redirectToError = async (url: URL) => {\n const urlString = url.toString();\n if (app[stackAppInternalsSymbol].getRedirectMethod() === \"none\") {\n setRedirectUrl(urlString);\n return;\n }\n await app[stackAppInternalsSymbol].redirectToUrl(urlString, { replace: true });\n };\n try {\n const hasRedirected = await app.callOAuthCallback();\n if (!hasRedirected) {\n await app.redirectToSignIn({ noRedirectBack: true });\n }\n } catch (e) {\n if (KnownError.isKnownError(e)) {\n const errorUrl = new URL(app.urls.error, window.location.href);\n errorUrl.searchParams.set(\"errorCode\", e.errorCode);\n errorUrl.searchParams.set(\"message\", e.message);\n errorUrl.searchParams.set(\"details\", JSON.stringify(e.details ?? {}));\n await redirectToError(errorUrl);\n return;\n }\n captureError(\"<OAuthCallback />\", e);\n await redirectToError(new URL(app.urls.error, window.location.href));\n }\n }), [app]);\n\n useEffect(() => {\n setTimeout(() => setShowRedirectLink(true), 3000);\n }, []);\n\n return (\n <MaybeFullPage\n fullPage={fullPage ?? false}\n containerClassName=\"flex items-center justify-center\"\n >\n <div\n className={cn(\n \"text-center justify-center items-center stack-scope flex flex-col gap-4 max-w-[380px]\",\n fullPage ? \"p-4\" : \"p-0\"\n )}\n >\n <div className=\"flex flex-col justify-center items-center gap-4\">\n <Spinner size={20} />\n </div>\n {showRedirectLink || redirectUrl != null ? <p>{t('If you are not redirected automatically, ')}<StyledLink className=\"whitespace-nowrap\" href={redirectUrl ?? app.urls.home}>{t(\"click here\")}</StyledLink></p> : null}\n </div>\n </MaybeFullPage>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,SAAgB,cAAc,EAAE,YAAoC;CAClE,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,MAAM,aAAa;CACzB,MAAM,SAAS,OAAO,MAAM;CAC5B,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,MAAM;CAC/D,MAAM,CAAC,aAAa,kBAAkB,SAAwB,KAAK;AAEnE,iBAAgB,kBAAkB,YAAY;AAC5C,MAAI,OAAO,QAAS;AACpB,SAAO,UAAU;EACjB,MAAM,kBAAkB,OAAO,QAAa;GAC1C,MAAM,YAAY,IAAI,UAAU;AAChC,OAAI,IAAI,yBAAyB,mBAAmB,KAAK,QAAQ;AAC/D,mBAAe,UAAU;AACzB;;AAEF,SAAM,IAAI,yBAAyB,cAAc,WAAW,EAAE,SAAS,MAAM,CAAC;;AAEhF,MAAI;AAEF,OAAI,CADkB,MAAM,IAAI,mBAAmB,CAEjD,OAAM,IAAI,iBAAiB,EAAE,gBAAgB,MAAM,CAAC;WAE/C,GAAG;AACV,OAAI,WAAW,aAAa,EAAE,EAAE;IAC9B,MAAM,WAAW,IAAI,IAAI,IAAI,KAAK,OAAO,OAAO,SAAS,KAAK;AAC9D,aAAS,aAAa,IAAI,aAAa,EAAE,UAAU;AACnD,aAAS,aAAa,IAAI,WAAW,EAAE,QAAQ;AAC/C,aAAS,aAAa,IAAI,WAAW,KAAK,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;AACrE,UAAM,gBAAgB,SAAS;AAC/B;;AAEF,gBAAa,qBAAqB,EAAE;AACpC,SAAM,gBAAgB,IAAI,IAAI,IAAI,KAAK,OAAO,OAAO,SAAS,KAAK,CAAC;;GAEtE,EAAE,CAAC,IAAI,CAAC;AAEV,iBAAgB;AACd,mBAAiB,oBAAoB,KAAK,EAAE,IAAK;IAChD,EAAE,CAAC;AAEN,QACE,oBAAC;EACC,UAAU,YAAY;EACtB,oBAAmB;YAEnB,qBAAC;GACC,WAAW,GACT,yFACA,WAAW,QAAQ,MACpB;cAED,oBAAC;IAAI,WAAU;cACb,oBAAC,WAAQ,MAAM,KAAM;KACjB,EACL,oBAAoB,eAAe,OAAO,qBAAC,kBAAG,EAAE,4CAA4C,EAAC,oBAAC;IAAW,WAAU;IAAoB,MAAM,eAAe,IAAI,KAAK;cAAO,EAAE,aAAa;KAAc,IAAI,GAAG;IAC7M;GACQ"}
1
+ {"version":3,"file":"oauth-callback.js","names":[],"sources":["../../../src/components-page/oauth-callback.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { KnownError } from \"@hexclave/shared\";\nimport { captureError } from \"@hexclave/shared/dist/utils/errors\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { Spinner, cn } from \"@hexclave/ui\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useStackApp } from \"..\";\nimport { MaybeFullPage } from \"../components/elements/maybe-full-page\";\nimport { StyledLink } from \"../components/link\";\nimport { hexclaveAppInternalsSymbol } from \"../lib/hexclave-app\";\nimport { useTranslation } from \"../lib/translations\";\n\nexport function OAuthCallback({ fullPage }: { fullPage?: boolean }) {\n const { t } = useTranslation();\n const app = useStackApp();\n const called = useRef(false);\n const [showRedirectLink, setShowRedirectLink] = useState(false);\n const [redirectUrl, setRedirectUrl] = useState<string | null>(null);\n\n useEffect(() => runAsynchronously(async () => {\n if (called.current) return;\n called.current = true;\n const redirectToError = async (url: URL) => {\n const urlString = url.toString();\n if (app[hexclaveAppInternalsSymbol].getRedirectMethod() === \"none\") {\n setRedirectUrl(urlString);\n return;\n }\n await app[hexclaveAppInternalsSymbol].redirectToUrl(urlString, { replace: true });\n };\n try {\n const hasRedirected = await app.callOAuthCallback();\n if (!hasRedirected) {\n await app.redirectToSignIn({ noRedirectBack: true });\n }\n } catch (e) {\n if (KnownError.isKnownError(e)) {\n const errorUrl = new URL(app.urls.error, window.location.href);\n errorUrl.searchParams.set(\"errorCode\", e.errorCode);\n errorUrl.searchParams.set(\"message\", e.message);\n errorUrl.searchParams.set(\"details\", JSON.stringify(e.details ?? {}));\n await redirectToError(errorUrl);\n return;\n }\n captureError(\"<OAuthCallback />\", e);\n await redirectToError(new URL(app.urls.error, window.location.href));\n }\n }), [app]);\n\n useEffect(() => {\n setTimeout(() => setShowRedirectLink(true), 3000);\n }, []);\n\n return (\n <MaybeFullPage\n fullPage={fullPage ?? false}\n containerClassName=\"flex items-center justify-center\"\n >\n <div\n className={cn(\n \"text-center justify-center items-center stack-scope flex flex-col gap-4 max-w-[380px]\",\n fullPage ? \"p-4\" : \"p-0\"\n )}\n >\n <div className=\"flex flex-col justify-center items-center gap-4\">\n <Spinner size={20} />\n </div>\n {showRedirectLink || redirectUrl != null ? <p>{t('If you are not redirected automatically, ')}<StyledLink className=\"whitespace-nowrap\" href={redirectUrl ?? app.urls.home}>{t(\"click here\")}</StyledLink></p> : null}\n </div>\n </MaybeFullPage>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,SAAgB,cAAc,EAAE,YAAoC;CAClE,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,MAAM,aAAa;CACzB,MAAM,SAAS,OAAO,MAAM;CAC5B,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,MAAM;CAC/D,MAAM,CAAC,aAAa,kBAAkB,SAAwB,KAAK;AAEnE,iBAAgB,kBAAkB,YAAY;AAC5C,MAAI,OAAO,QAAS;AACpB,SAAO,UAAU;EACjB,MAAM,kBAAkB,OAAO,QAAa;GAC1C,MAAM,YAAY,IAAI,UAAU;AAChC,OAAI,IAAI,4BAA4B,mBAAmB,KAAK,QAAQ;AAClE,mBAAe,UAAU;AACzB;;AAEF,SAAM,IAAI,4BAA4B,cAAc,WAAW,EAAE,SAAS,MAAM,CAAC;;AAEnF,MAAI;AAEF,OAAI,CADkB,MAAM,IAAI,mBAAmB,CAEjD,OAAM,IAAI,iBAAiB,EAAE,gBAAgB,MAAM,CAAC;WAE/C,GAAG;AACV,OAAI,WAAW,aAAa,EAAE,EAAE;IAC9B,MAAM,WAAW,IAAI,IAAI,IAAI,KAAK,OAAO,OAAO,SAAS,KAAK;AAC9D,aAAS,aAAa,IAAI,aAAa,EAAE,UAAU;AACnD,aAAS,aAAa,IAAI,WAAW,EAAE,QAAQ;AAC/C,aAAS,aAAa,IAAI,WAAW,KAAK,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;AACrE,UAAM,gBAAgB,SAAS;AAC/B;;AAEF,gBAAa,qBAAqB,EAAE;AACpC,SAAM,gBAAgB,IAAI,IAAI,IAAI,KAAK,OAAO,OAAO,SAAS,KAAK,CAAC;;GAEtE,EAAE,CAAC,IAAI,CAAC;AAEV,iBAAgB;AACd,mBAAiB,oBAAoB,KAAK,EAAE,IAAK;IAChD,EAAE,CAAC;AAEN,QACE,oBAAC;EACC,UAAU,YAAY;EACtB,oBAAmB;YAEnB,qBAAC;GACC,WAAW,GACT,yFACA,WAAW,QAAQ,MACpB;cAED,oBAAC;IAAI,WAAU;cACb,oBAAC,WAAQ,MAAM,KAAM;KACjB,EACL,oBAAoB,eAAe,OAAO,qBAAC,kBAAG,EAAE,4CAA4C,EAAC,oBAAC;IAAW,WAAU;IAAoB,MAAM,eAAe,IAAI,KAAK;cAAO,EAAE,aAAa;KAAc,IAAI,GAAG;IAC7M;GACQ"}
@@ -15,17 +15,17 @@ import { MessageCard as MessageCard$1 } from "../components/message-cards/messag
15
15
  //#region src/components-page/onboarding.tsx
16
16
  function Onboarding(props) {
17
17
  const { t } = useTranslation();
18
- const stackApp = useStackApp();
18
+ const hexclaveApp = useStackApp();
19
19
  const user = useUser({
20
20
  or: "return-null",
21
21
  includeRestricted: true
22
22
  });
23
23
  if (user && !user.isRestricted) {
24
- runAsynchronously(stackApp.redirectToAfterSignIn());
24
+ runAsynchronously(hexclaveApp.redirectToAfterSignIn());
25
25
  return null;
26
26
  }
27
27
  if (!user || user.isAnonymous) {
28
- runAsynchronously(stackApp.redirectToSignIn());
28
+ runAsynchronously(hexclaveApp.redirectToSignIn());
29
29
  return null;
30
30
  }
31
31
  if (user.restrictedReason?.type === "email_not_verified") {
@@ -1 +1 @@
1
- {"version":3,"file":"onboarding.js","names":["MessageCard"],"sources":["../../../src/components-page/onboarding.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { strictEmailSchema, yupObject } from \"@hexclave/shared/dist/schema-fields\";\nimport { runAsynchronously, runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { Button, Input, Typography } from \"@hexclave/ui\";\nimport { useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { useStackApp, useUser } from \"..\";\nimport { FormWarningText } from \"../components/elements/form-warning\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\nexport function Onboarding(props: {\n fullPage?: boolean,\n}) {\n const { t } = useTranslation();\n const stackApp = useStackApp();\n const user = useUser({ or: \"return-null\", includeRestricted: true });\n\n // If user is not restricted anymore, redirect to the intended destination\n // redirectToAfterSignIn automatically checks for after_auth_return_to in the URL\n if (user && !user.isRestricted) {\n runAsynchronously(stackApp.redirectToAfterSignIn());\n // TODO: This should return a loading indicator, not just null\n return null;\n }\n\n // If user is anonymous or not logged in, redirect to sign-in\n if (!user || user.isAnonymous) {\n runAsynchronously(stackApp.redirectToSignIn());\n // TODO: This should return a loading indicator, not just null\n return null;\n }\n\n // User is restricted - show appropriate onboarding step based on restricted reason\n const restrictedReason = user.restrictedReason;\n\n if (restrictedReason?.type === \"email_not_verified\") {\n // Check if user has a primary email\n const hasPrimaryEmail = !!user.primaryEmail;\n\n if (!hasPrimaryEmail) {\n // User needs to add an email first\n return <AddEmailForm fullPage={props.fullPage} />;\n }\n\n // User has email but it's not verified\n return <VerifyEmailScreen user={user} email={user.primaryEmail} fullPage={props.fullPage} />;\n }\n\n // Unknown restricted reason - show generic message\n return (\n <MessageCard\n title={t(\"Complete your account setup\")}\n fullPage={!!props.fullPage}\n secondaryButtonText={t(\"Sign out\")}\n secondaryAction={async () => {\n await user.signOut();\n }}\n >\n <p>{t(\"You have not yet completed your account setup. Please reach out to support if you believe this is an error.\")}</p>\n </MessageCard>\n );\n}\n\nfunction AddEmailForm(props: {\n fullPage?: boolean,\n onEmailAdded?: () => void,\n}) {\n const { t } = useTranslation();\n const user = useUser({ or: \"throw\", includeRestricted: true });\n const stackApp = useStackApp();\n const [loading, setLoading] = useState(false);\n\n const emailSchema = yupObject({\n email: strictEmailSchema(t('Please enter a valid email address'))\n .defined()\n .nonEmpty(t('Email is required')),\n });\n\n const { register, handleSubmit, formState: { errors } } = useForm({\n resolver: yupResolver(emailSchema)\n });\n\n const onSubmit = async (data: yup.InferType<typeof emailSchema>) => {\n setLoading(true);\n try {\n await user.update({ primaryEmail: data.email });\n props.onEmailAdded?.();\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <MessageCard\n title={t(\"Add your email address\")}\n fullPage={!!props.fullPage}\n secondaryButtonText={t(\"Sign out\")}\n secondaryAction={async () => {\n await user.signOut();\n }}\n >\n <Typography className=\"mb-4\">\n {t(\"Please add an email address to complete your account setup. We'll send you a verification email.\")}\n </Typography>\n <form\n onSubmit={e => runAsynchronouslyWithAlert(handleSubmit(onSubmit)(e))}\n noValidate\n className='flex flex-col gap-2'\n >\n <Input\n {...register(\"email\")}\n placeholder={t(\"Enter your email\")}\n type=\"email\"\n />\n {errors.email && <FormWarningText text={errors.email.message} />}\n <Button type=\"submit\" loading={loading} className=\"w-full\">\n {t(\"Continue\")}\n </Button>\n </form>\n </MessageCard>\n );\n}\n\nfunction VerifyEmailScreen(props: {\n user: NonNullable<ReturnType<typeof useUser>>,\n email: string,\n fullPage?: boolean,\n}) {\n const { t } = useTranslation();\n const { user, email } = props;\n const [changingEmail, setChangingEmail] = useState(false);\n\n if (changingEmail) {\n return <AddEmailForm fullPage={props.fullPage} onEmailAdded={() => setChangingEmail(false)} />;\n }\n\n return (\n <MessageCard\n title={t(\"Please check your email inbox\")}\n fullPage={!!props.fullPage}\n primaryButtonText={t(\"Resend verification email\")}\n primaryAction={async () => {\n await user.sendVerificationEmail();\n }}\n secondaryButtonText={t(\"Sign out\")}\n secondaryAction={async () => {\n await user.signOut();\n }}\n >\n <Typography>\n {t(\"Please verify your email address \")}\n <span className=\"font-semibold\">{email}</span>\n {\" (\"}\n <button\n type=\"button\"\n className=\"text-primary hover:underline\"\n onClick={() => setChangingEmail(true)}\n >\n {t(\"change\")}\n </button>\n {\"). \"}\n {t(\"Click the button below to resend the verification link.\")}\n </Typography>\n </MessageCard>\n );\n}\n\n"],"mappings":";;;;;;;;;;;;;;;AAmBA,SAAgB,WAAW,OAExB;CACD,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,WAAW,aAAa;CAC9B,MAAM,OAAO,QAAQ;EAAE,IAAI;EAAe,mBAAmB;EAAM,CAAC;AAIpE,KAAI,QAAQ,CAAC,KAAK,cAAc;AAC9B,oBAAkB,SAAS,uBAAuB,CAAC;AAEnD,SAAO;;AAIT,KAAI,CAAC,QAAQ,KAAK,aAAa;AAC7B,oBAAkB,SAAS,kBAAkB,CAAC;AAE9C,SAAO;;AAMT,KAFyB,KAAK,kBAER,SAAS,sBAAsB;AAInD,MAAI,CAFoB,CAAC,CAAC,KAAK,aAI7B,QAAO,oBAAC,gBAAa,UAAU,MAAM,WAAY;AAInD,SAAO,oBAAC;GAAwB;GAAM,OAAO,KAAK;GAAc,UAAU,MAAM;IAAY;;AAI9F,QACE,oBAACA;EACC,OAAO,EAAE,8BAA8B;EACvC,UAAU,CAAC,CAAC,MAAM;EAClB,qBAAqB,EAAE,WAAW;EAClC,iBAAiB,YAAY;AAC3B,SAAM,KAAK,SAAS;;YAGtB,oBAAC,iBAAG,EAAE,8GAA8G,GAAK;GAC7G;;AAIlB,SAAS,aAAa,OAGnB;CACD,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,OAAO,QAAQ;EAAE,IAAI;EAAS,mBAAmB;EAAM,CAAC;AAC7C,cAAa;CAC9B,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAQ7C,MAAM,EAAE,UAAU,cAAc,WAAW,EAAE,aAAa,QAAQ,EAChE,UAAU,YAPQ,UAAU,EAC5B,OAAO,kBAAkB,EAAE,qCAAqC,CAAC,CAC9D,SAAS,CACT,SAAS,EAAE,oBAAoB,CAAC,EACpC,CAAC,CAGkC,EACnC,CAAC;CAEF,MAAM,WAAW,OAAO,SAA4C;AAClE,aAAW,KAAK;AAChB,MAAI;AACF,SAAM,KAAK,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC;AAC/C,SAAM,gBAAgB;YACd;AACR,cAAW,MAAM;;;AAIrB,QACE,qBAACA;EACC,OAAO,EAAE,yBAAyB;EAClC,UAAU,CAAC,CAAC,MAAM;EAClB,qBAAqB,EAAE,WAAW;EAClC,iBAAiB,YAAY;AAC3B,SAAM,KAAK,SAAS;;aAGtB,oBAAC;GAAW,WAAU;aACnB,EAAE,mGAAmG;IAC3F,EACb,qBAAC;GACC,WAAU,MAAK,2BAA2B,aAAa,SAAS,CAAC,EAAE,CAAC;GACpE;GACA,WAAU;;IAEV,oBAAC;KACC,GAAI,SAAS,QAAQ;KACrB,aAAa,EAAE,mBAAmB;KAClC,MAAK;MACL;IACD,OAAO,SAAS,oBAAC,mBAAgB,MAAM,OAAO,MAAM,UAAW;IAChE,oBAAC;KAAO,MAAK;KAAkB;KAAS,WAAU;eAC/C,EAAE,WAAW;MACP;;IACJ;GACK;;AAIlB,SAAS,kBAAkB,OAIxB;CACD,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,MAAM,UAAU;CACxB,MAAM,CAAC,eAAe,oBAAoB,SAAS,MAAM;AAEzD,KAAI,cACF,QAAO,oBAAC;EAAa,UAAU,MAAM;EAAU,oBAAoB,iBAAiB,MAAM;GAAI;AAGhG,QACE,oBAACA;EACC,OAAO,EAAE,gCAAgC;EACzC,UAAU,CAAC,CAAC,MAAM;EAClB,mBAAmB,EAAE,4BAA4B;EACjD,eAAe,YAAY;AACzB,SAAM,KAAK,uBAAuB;;EAEpC,qBAAqB,EAAE,WAAW;EAClC,iBAAiB,YAAY;AAC3B,SAAM,KAAK,SAAS;;YAGtB,qBAAC;GACE,EAAE,oCAAoC;GACvC,oBAAC;IAAK,WAAU;cAAiB;KAAa;GAC7C;GACD,oBAAC;IACC,MAAK;IACL,WAAU;IACV,eAAe,iBAAiB,KAAK;cAEpC,EAAE,SAAS;KACL;GACR;GACA,EAAE,0DAA0D;MAClD;GACD"}
1
+ {"version":3,"file":"onboarding.js","names":["MessageCard"],"sources":["../../../src/components-page/onboarding.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { strictEmailSchema, yupObject } from \"@hexclave/shared/dist/schema-fields\";\nimport { runAsynchronously, runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { Button, Input, Typography } from \"@hexclave/ui\";\nimport { useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { useStackApp, useUser } from \"..\";\nimport { FormWarningText } from \"../components/elements/form-warning\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\nexport function Onboarding(props: {\n fullPage?: boolean,\n}) {\n const { t } = useTranslation();\n const hexclaveApp = useStackApp();\n const user = useUser({ or: \"return-null\", includeRestricted: true });\n\n // If user is not restricted anymore, redirect to the intended destination\n // redirectToAfterSignIn automatically checks for after_auth_return_to in the URL\n if (user && !user.isRestricted) {\n runAsynchronously(hexclaveApp.redirectToAfterSignIn());\n // TODO: This should return a loading indicator, not just null\n return null;\n }\n\n // If user is anonymous or not logged in, redirect to sign-in\n if (!user || user.isAnonymous) {\n runAsynchronously(hexclaveApp.redirectToSignIn());\n // TODO: This should return a loading indicator, not just null\n return null;\n }\n\n // User is restricted - show appropriate onboarding step based on restricted reason\n const restrictedReason = user.restrictedReason;\n\n if (restrictedReason?.type === \"email_not_verified\") {\n // Check if user has a primary email\n const hasPrimaryEmail = !!user.primaryEmail;\n\n if (!hasPrimaryEmail) {\n // User needs to add an email first\n return <AddEmailForm fullPage={props.fullPage} />;\n }\n\n // User has email but it's not verified\n return <VerifyEmailScreen user={user} email={user.primaryEmail} fullPage={props.fullPage} />;\n }\n\n // Unknown restricted reason - show generic message\n return (\n <MessageCard\n title={t(\"Complete your account setup\")}\n fullPage={!!props.fullPage}\n secondaryButtonText={t(\"Sign out\")}\n secondaryAction={async () => {\n await user.signOut();\n }}\n >\n <p>{t(\"You have not yet completed your account setup. Please reach out to support if you believe this is an error.\")}</p>\n </MessageCard>\n );\n}\n\nfunction AddEmailForm(props: {\n fullPage?: boolean,\n onEmailAdded?: () => void,\n}) {\n const { t } = useTranslation();\n const user = useUser({ or: \"throw\", includeRestricted: true });\n const hexclaveApp = useStackApp();\n const [loading, setLoading] = useState(false);\n\n const emailSchema = yupObject({\n email: strictEmailSchema(t('Please enter a valid email address'))\n .defined()\n .nonEmpty(t('Email is required')),\n });\n\n const { register, handleSubmit, formState: { errors } } = useForm({\n resolver: yupResolver(emailSchema)\n });\n\n const onSubmit = async (data: yup.InferType<typeof emailSchema>) => {\n setLoading(true);\n try {\n await user.update({ primaryEmail: data.email });\n props.onEmailAdded?.();\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <MessageCard\n title={t(\"Add your email address\")}\n fullPage={!!props.fullPage}\n secondaryButtonText={t(\"Sign out\")}\n secondaryAction={async () => {\n await user.signOut();\n }}\n >\n <Typography className=\"mb-4\">\n {t(\"Please add an email address to complete your account setup. We'll send you a verification email.\")}\n </Typography>\n <form\n onSubmit={e => runAsynchronouslyWithAlert(handleSubmit(onSubmit)(e))}\n noValidate\n className='flex flex-col gap-2'\n >\n <Input\n {...register(\"email\")}\n placeholder={t(\"Enter your email\")}\n type=\"email\"\n />\n {errors.email && <FormWarningText text={errors.email.message} />}\n <Button type=\"submit\" loading={loading} className=\"w-full\">\n {t(\"Continue\")}\n </Button>\n </form>\n </MessageCard>\n );\n}\n\nfunction VerifyEmailScreen(props: {\n user: NonNullable<ReturnType<typeof useUser>>,\n email: string,\n fullPage?: boolean,\n}) {\n const { t } = useTranslation();\n const { user, email } = props;\n const [changingEmail, setChangingEmail] = useState(false);\n\n if (changingEmail) {\n return <AddEmailForm fullPage={props.fullPage} onEmailAdded={() => setChangingEmail(false)} />;\n }\n\n return (\n <MessageCard\n title={t(\"Please check your email inbox\")}\n fullPage={!!props.fullPage}\n primaryButtonText={t(\"Resend verification email\")}\n primaryAction={async () => {\n await user.sendVerificationEmail();\n }}\n secondaryButtonText={t(\"Sign out\")}\n secondaryAction={async () => {\n await user.signOut();\n }}\n >\n <Typography>\n {t(\"Please verify your email address \")}\n <span className=\"font-semibold\">{email}</span>\n {\" (\"}\n <button\n type=\"button\"\n className=\"text-primary hover:underline\"\n onClick={() => setChangingEmail(true)}\n >\n {t(\"change\")}\n </button>\n {\"). \"}\n {t(\"Click the button below to resend the verification link.\")}\n </Typography>\n </MessageCard>\n );\n}\n\n"],"mappings":"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"}