@hexclave/react 1.0.3 → 1.0.5

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 (874) hide show
  1. package/dist/components/api-key-dialogs.d.ts +1 -1
  2. package/dist/components/api-key-dialogs.js +5 -5
  3. package/dist/components/api-key-dialogs.js.map +1 -1
  4. package/dist/components/api-key-table.d.ts +1 -1
  5. package/dist/components/api-key-table.js.map +1 -1
  6. package/dist/components/credential-sign-in.js +3 -3
  7. package/dist/components/credential-sign-in.js.map +1 -1
  8. package/dist/components/credential-sign-up.js +5 -5
  9. package/dist/components/credential-sign-up.js.map +1 -1
  10. package/dist/components/elements/form-warning.js.map +1 -1
  11. package/dist/components/elements/maybe-full-page.js.map +1 -1
  12. package/dist/components/elements/separator-with-text.js.map +1 -1
  13. package/dist/components/elements/sidebar-layout.js +1 -1
  14. package/dist/components/elements/sidebar-layout.js.map +1 -1
  15. package/dist/components/elements/ssr-layout-effect.js.map +1 -1
  16. package/dist/components/elements/user-avatar.js +1 -1
  17. package/dist/components/elements/user-avatar.js.map +1 -1
  18. package/dist/components/link.js.map +1 -1
  19. package/dist/components/magic-link-sign-in.js +6 -6
  20. package/dist/components/magic-link-sign-in.js.map +1 -1
  21. package/dist/components/message-cards/known-error-message-card.js +2 -2
  22. package/dist/components/message-cards/known-error-message-card.js.map +1 -1
  23. package/dist/components/message-cards/message-card.js.map +1 -1
  24. package/dist/components/message-cards/predefined-message-card.js +10 -10
  25. package/dist/components/message-cards/predefined-message-card.js.map +1 -1
  26. package/dist/components/oauth-button-group.js +2 -2
  27. package/dist/components/oauth-button-group.js.map +1 -1
  28. package/dist/components/oauth-button.js +2 -2
  29. package/dist/components/oauth-button.js.map +1 -1
  30. package/dist/components/passkey-button.js +3 -3
  31. package/dist/components/passkey-button.js.map +1 -1
  32. package/dist/components/profile-image-editor.js +1 -1
  33. package/dist/components/profile-image-editor.js.map +1 -1
  34. package/dist/components/selected-team-switcher.d.ts +1 -1
  35. package/dist/components/selected-team-switcher.js.map +1 -1
  36. package/dist/components/team-icon.d.ts +1 -1
  37. package/dist/components/team-icon.js +1 -1
  38. package/dist/components/team-icon.js.map +1 -1
  39. package/dist/components/team-switcher.d.ts +1 -1
  40. package/dist/components/team-switcher.js +2 -2
  41. package/dist/components/team-switcher.js.map +1 -1
  42. package/dist/components/use-in-iframe.js.map +1 -1
  43. package/dist/components/user-button.js +1 -1
  44. package/dist/components/user-button.js.map +1 -1
  45. package/dist/components-page/account-settings/active-sessions/active-sessions-page.js +1 -1
  46. package/dist/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
  47. package/dist/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
  48. package/dist/components-page/account-settings/editable-text.js +1 -1
  49. package/dist/components-page/account-settings/editable-text.js.map +1 -1
  50. package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
  51. package/dist/components-page/account-settings/email-and-auth/emails-section.js +3 -3
  52. package/dist/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
  53. package/dist/components-page/account-settings/email-and-auth/mfa-section.js +1 -1
  54. package/dist/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
  55. package/dist/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
  56. package/dist/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
  57. package/dist/components-page/account-settings/email-and-auth/password-section.js +3 -3
  58. package/dist/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
  59. package/dist/components-page/account-settings/notifications/notifications-page.js.map +1 -1
  60. package/dist/components-page/account-settings/page-layout.js.map +1 -1
  61. package/dist/components-page/account-settings/payments/payments-page.d.ts +1 -1
  62. package/dist/components-page/account-settings/payments/payments-page.js.map +1 -1
  63. package/dist/components-page/account-settings/payments/payments-panel.d.ts +1 -1
  64. package/dist/components-page/account-settings/payments/payments-panel.js +3 -3
  65. package/dist/components-page/account-settings/payments/payments-panel.js.map +1 -1
  66. package/dist/components-page/account-settings/profile-page/profile-page.js.map +1 -1
  67. package/dist/components-page/account-settings/section.js.map +1 -1
  68. package/dist/components-page/account-settings/settings/delete-account-section.js.map +1 -1
  69. package/dist/components-page/account-settings/settings/settings-page.js.map +1 -1
  70. package/dist/components-page/account-settings/settings/sign-out-section.js.map +1 -1
  71. package/dist/components-page/account-settings/teams/leave-team-section.d.ts +1 -1
  72. package/dist/components-page/account-settings/teams/leave-team-section.js.map +1 -1
  73. package/dist/components-page/account-settings/teams/team-api-keys-section.d.ts +1 -1
  74. package/dist/components-page/account-settings/teams/team-api-keys-section.js +1 -1
  75. package/dist/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
  76. package/dist/components-page/account-settings/teams/team-creation-page.js +3 -3
  77. package/dist/components-page/account-settings/teams/team-creation-page.js.map +1 -1
  78. package/dist/components-page/account-settings/teams/team-display-name-section.d.ts +1 -1
  79. package/dist/components-page/account-settings/teams/team-display-name-section.js.map +1 -1
  80. package/dist/components-page/account-settings/teams/team-member-invitation-section.d.ts +1 -1
  81. package/dist/components-page/account-settings/teams/team-member-invitation-section.js +4 -4
  82. package/dist/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
  83. package/dist/components-page/account-settings/teams/team-member-list-section.d.ts +1 -1
  84. package/dist/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
  85. package/dist/components-page/account-settings/teams/team-page.d.ts +1 -1
  86. package/dist/components-page/account-settings/teams/team-page.js.map +1 -1
  87. package/dist/components-page/account-settings/teams/team-profile-image-section.d.ts +1 -1
  88. package/dist/components-page/account-settings/teams/team-profile-image-section.js.map +1 -1
  89. package/dist/components-page/account-settings/teams/team-profile-user-section.d.ts +1 -1
  90. package/dist/components-page/account-settings/teams/team-profile-user-section.js.map +1 -1
  91. package/dist/components-page/account-settings.js +3 -3
  92. package/dist/components-page/account-settings.js.map +1 -1
  93. package/dist/components-page/auth-page.d.ts.map +1 -1
  94. package/dist/components-page/auth-page.js +56 -11
  95. package/dist/components-page/auth-page.js.map +1 -1
  96. package/dist/components-page/cli-auth-confirm.js +4 -4
  97. package/dist/components-page/cli-auth-confirm.js.map +1 -1
  98. package/dist/components-page/cli-auth-confirm.test.js +5 -5
  99. package/dist/components-page/cli-auth-confirm.test.js.map +1 -1
  100. package/dist/components-page/email-verification.js +6 -6
  101. package/dist/components-page/email-verification.js.map +1 -1
  102. package/dist/components-page/error-page.js +9 -9
  103. package/dist/components-page/error-page.js.map +1 -1
  104. package/dist/components-page/forgot-password.js +9 -9
  105. package/dist/components-page/forgot-password.js.map +1 -1
  106. package/dist/components-page/{stack-handler-client.d.ts → hexclave-handler-client.d.ts} +4 -4
  107. package/dist/components-page/hexclave-handler-client.d.ts.map +1 -0
  108. package/dist/components-page/{stack-handler-client.js → hexclave-handler-client.js} +25 -24
  109. package/dist/components-page/hexclave-handler-client.js.map +1 -0
  110. package/dist/components-page/{stack-handler.d.ts → hexclave-handler.d.ts} +5 -5
  111. package/dist/components-page/hexclave-handler.d.ts.map +1 -0
  112. package/dist/components-page/{stack-handler.js → hexclave-handler.js} +4 -4
  113. package/dist/components-page/hexclave-handler.js.map +1 -0
  114. package/dist/components-page/magic-link-callback.js +9 -9
  115. package/dist/components-page/magic-link-callback.js.map +1 -1
  116. package/dist/components-page/mfa.js +7 -7
  117. package/dist/components-page/mfa.js.map +1 -1
  118. package/dist/components-page/oauth-callback.js +6 -6
  119. package/dist/components-page/oauth-callback.js.map +1 -1
  120. package/dist/components-page/onboarding.js +7 -7
  121. package/dist/components-page/onboarding.js.map +1 -1
  122. package/dist/components-page/password-reset.js +16 -16
  123. package/dist/components-page/password-reset.js.map +1 -1
  124. package/dist/components-page/sign-in.js.map +1 -1
  125. package/dist/components-page/sign-out.d.ts +1 -0
  126. package/dist/components-page/sign-out.d.ts.map +1 -1
  127. package/dist/components-page/sign-out.js +11 -5
  128. package/dist/components-page/sign-out.js.map +1 -1
  129. package/dist/components-page/sign-up.js.map +1 -1
  130. package/dist/components-page/team-creation.js +5 -5
  131. package/dist/components-page/team-creation.js.map +1 -1
  132. package/dist/components-page/team-invitation.js +17 -17
  133. package/dist/components-page/team-invitation.js.map +1 -1
  134. package/dist/dev-tool/dev-tool-core.d.ts +1 -1
  135. package/dist/dev-tool/dev-tool-core.js +11 -11
  136. package/dist/dev-tool/dev-tool-core.js.map +1 -1
  137. package/dist/dev-tool/dev-tool-styles.d.ts +1 -1
  138. package/dist/dev-tool/dev-tool-styles.js +371 -371
  139. package/dist/dev-tool/dev-tool-styles.js.map +1 -1
  140. package/dist/dev-tool/dev-tool-trigger-position.js.map +1 -1
  141. package/dist/dev-tool/dev-tool-trigger-position.test.js +1 -1
  142. package/dist/dev-tool/dev-tool-trigger-position.test.js.map +1 -1
  143. package/dist/dev-tool/index.d.ts +4 -4
  144. package/dist/dev-tool/index.js +5 -5
  145. package/dist/dev-tool/index.js.map +1 -1
  146. package/dist/esm/components/api-key-dialogs.d.ts +1 -1
  147. package/dist/esm/components/api-key-dialogs.js +5 -5
  148. package/dist/esm/components/api-key-dialogs.js.map +1 -1
  149. package/dist/esm/components/api-key-table.d.ts +1 -1
  150. package/dist/esm/components/api-key-table.js.map +1 -1
  151. package/dist/esm/components/credential-sign-in.js +3 -3
  152. package/dist/esm/components/credential-sign-in.js.map +1 -1
  153. package/dist/esm/components/credential-sign-up.js +5 -5
  154. package/dist/esm/components/credential-sign-up.js.map +1 -1
  155. package/dist/esm/components/elements/form-warning.js.map +1 -1
  156. package/dist/esm/components/elements/maybe-full-page.js.map +1 -1
  157. package/dist/esm/components/elements/separator-with-text.js.map +1 -1
  158. package/dist/esm/components/elements/sidebar-layout.js +1 -1
  159. package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
  160. package/dist/esm/components/elements/ssr-layout-effect.js.map +1 -1
  161. package/dist/esm/components/elements/user-avatar.js +1 -1
  162. package/dist/esm/components/elements/user-avatar.js.map +1 -1
  163. package/dist/esm/components/link.js.map +1 -1
  164. package/dist/esm/components/magic-link-sign-in.js +6 -6
  165. package/dist/esm/components/magic-link-sign-in.js.map +1 -1
  166. package/dist/esm/components/message-cards/known-error-message-card.js +2 -2
  167. package/dist/esm/components/message-cards/known-error-message-card.js.map +1 -1
  168. package/dist/esm/components/message-cards/message-card.js.map +1 -1
  169. package/dist/esm/components/message-cards/predefined-message-card.js +10 -10
  170. package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -1
  171. package/dist/esm/components/oauth-button-group.js +2 -2
  172. package/dist/esm/components/oauth-button-group.js.map +1 -1
  173. package/dist/esm/components/oauth-button.js +2 -2
  174. package/dist/esm/components/oauth-button.js.map +1 -1
  175. package/dist/esm/components/passkey-button.js +3 -3
  176. package/dist/esm/components/passkey-button.js.map +1 -1
  177. package/dist/esm/components/profile-image-editor.js +1 -1
  178. package/dist/esm/components/profile-image-editor.js.map +1 -1
  179. package/dist/esm/components/selected-team-switcher.js.map +1 -1
  180. package/dist/esm/components/team-icon.js +1 -1
  181. package/dist/esm/components/team-icon.js.map +1 -1
  182. package/dist/esm/components/team-switcher.js +2 -2
  183. package/dist/esm/components/team-switcher.js.map +1 -1
  184. package/dist/esm/components/use-in-iframe.js.map +1 -1
  185. package/dist/esm/components/user-button.js +1 -1
  186. package/dist/esm/components/user-button.js.map +1 -1
  187. package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js +1 -1
  188. package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
  189. package/dist/esm/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
  190. package/dist/esm/components-page/account-settings/editable-text.js +1 -1
  191. package/dist/esm/components-page/account-settings/editable-text.js.map +1 -1
  192. package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
  193. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js +3 -3
  194. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
  195. package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js +1 -1
  196. package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
  197. package/dist/esm/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
  198. package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
  199. package/dist/esm/components-page/account-settings/email-and-auth/password-section.js +3 -3
  200. package/dist/esm/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
  201. package/dist/esm/components-page/account-settings/notifications/notifications-page.js.map +1 -1
  202. package/dist/esm/components-page/account-settings/page-layout.js.map +1 -1
  203. package/dist/esm/components-page/account-settings/payments/payments-page.js.map +1 -1
  204. package/dist/esm/components-page/account-settings/payments/payments-panel.d.ts +1 -1
  205. package/dist/esm/components-page/account-settings/payments/payments-panel.js +3 -3
  206. package/dist/esm/components-page/account-settings/payments/payments-panel.js.map +1 -1
  207. package/dist/esm/components-page/account-settings/profile-page/profile-page.js.map +1 -1
  208. package/dist/esm/components-page/account-settings/section.js.map +1 -1
  209. package/dist/esm/components-page/account-settings/settings/delete-account-section.js.map +1 -1
  210. package/dist/esm/components-page/account-settings/settings/settings-page.js.map +1 -1
  211. package/dist/esm/components-page/account-settings/settings/sign-out-section.js.map +1 -1
  212. package/dist/esm/components-page/account-settings/teams/leave-team-section.js.map +1 -1
  213. package/dist/esm/components-page/account-settings/teams/team-api-keys-section.d.ts +1 -1
  214. package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js +1 -1
  215. package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
  216. package/dist/esm/components-page/account-settings/teams/team-creation-page.js +3 -3
  217. package/dist/esm/components-page/account-settings/teams/team-creation-page.js.map +1 -1
  218. package/dist/esm/components-page/account-settings/teams/team-display-name-section.js.map +1 -1
  219. package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js +4 -4
  220. package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
  221. package/dist/esm/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
  222. package/dist/esm/components-page/account-settings/teams/team-page.js.map +1 -1
  223. package/dist/esm/components-page/account-settings/teams/team-profile-image-section.js.map +1 -1
  224. package/dist/esm/components-page/account-settings/teams/team-profile-user-section.js.map +1 -1
  225. package/dist/esm/components-page/account-settings.d.ts +1 -1
  226. package/dist/esm/components-page/account-settings.js +3 -3
  227. package/dist/esm/components-page/account-settings.js.map +1 -1
  228. package/dist/esm/components-page/auth-page.d.ts.map +1 -1
  229. package/dist/esm/components-page/auth-page.js +57 -12
  230. package/dist/esm/components-page/auth-page.js.map +1 -1
  231. package/dist/esm/components-page/cli-auth-confirm.js +4 -4
  232. package/dist/esm/components-page/cli-auth-confirm.js.map +1 -1
  233. package/dist/esm/components-page/cli-auth-confirm.test.js +5 -5
  234. package/dist/esm/components-page/cli-auth-confirm.test.js.map +1 -1
  235. package/dist/esm/components-page/email-verification.js +6 -6
  236. package/dist/esm/components-page/email-verification.js.map +1 -1
  237. package/dist/esm/components-page/error-page.js +9 -9
  238. package/dist/esm/components-page/error-page.js.map +1 -1
  239. package/dist/esm/components-page/forgot-password.js +9 -9
  240. package/dist/esm/components-page/forgot-password.js.map +1 -1
  241. package/dist/esm/components-page/{stack-handler-client.d.ts → hexclave-handler-client.d.ts} +4 -4
  242. package/dist/esm/components-page/hexclave-handler-client.d.ts.map +1 -0
  243. package/dist/esm/components-page/{stack-handler-client.js → hexclave-handler-client.js} +23 -22
  244. package/dist/esm/components-page/hexclave-handler-client.js.map +1 -0
  245. package/dist/esm/components-page/{stack-handler.d.ts → hexclave-handler.d.ts} +5 -5
  246. package/dist/esm/components-page/hexclave-handler.d.ts.map +1 -0
  247. package/dist/esm/components-page/{stack-handler.js → hexclave-handler.js} +4 -4
  248. package/dist/esm/components-page/hexclave-handler.js.map +1 -0
  249. package/dist/esm/components-page/magic-link-callback.js +9 -9
  250. package/dist/esm/components-page/magic-link-callback.js.map +1 -1
  251. package/dist/esm/components-page/mfa.js +7 -7
  252. package/dist/esm/components-page/mfa.js.map +1 -1
  253. package/dist/esm/components-page/oauth-callback.js +6 -6
  254. package/dist/esm/components-page/oauth-callback.js.map +1 -1
  255. package/dist/esm/components-page/onboarding.js +7 -7
  256. package/dist/esm/components-page/onboarding.js.map +1 -1
  257. package/dist/esm/components-page/password-reset.js +16 -16
  258. package/dist/esm/components-page/password-reset.js.map +1 -1
  259. package/dist/esm/components-page/sign-in.js.map +1 -1
  260. package/dist/esm/components-page/sign-out.d.ts +1 -0
  261. package/dist/esm/components-page/sign-out.d.ts.map +1 -1
  262. package/dist/esm/components-page/sign-out.js +11 -5
  263. package/dist/esm/components-page/sign-out.js.map +1 -1
  264. package/dist/esm/components-page/sign-up.js.map +1 -1
  265. package/dist/esm/components-page/team-creation.js +5 -5
  266. package/dist/esm/components-page/team-creation.js.map +1 -1
  267. package/dist/esm/components-page/team-invitation.js +17 -17
  268. package/dist/esm/components-page/team-invitation.js.map +1 -1
  269. package/dist/esm/dev-tool/dev-tool-core.d.ts +1 -1
  270. package/dist/esm/dev-tool/dev-tool-core.js +10 -10
  271. package/dist/esm/dev-tool/dev-tool-core.js.map +1 -1
  272. package/dist/esm/dev-tool/dev-tool-styles.d.ts +1 -1
  273. package/dist/esm/dev-tool/dev-tool-styles.js +371 -371
  274. package/dist/esm/dev-tool/dev-tool-styles.js.map +1 -1
  275. package/dist/esm/dev-tool/dev-tool-trigger-position.js.map +1 -1
  276. package/dist/esm/dev-tool/dev-tool-trigger-position.test.js +1 -1
  277. package/dist/esm/dev-tool/dev-tool-trigger-position.test.js.map +1 -1
  278. package/dist/esm/dev-tool/index.d.ts +4 -4
  279. package/dist/esm/dev-tool/index.js +5 -5
  280. package/dist/esm/dev-tool/index.js.map +1 -1
  281. package/dist/esm/generated/quetzal-translations.d.ts +2 -2
  282. package/dist/esm/generated/quetzal-translations.js.map +1 -1
  283. package/dist/esm/index.d.ts +4 -4
  284. package/dist/esm/index.js +3 -3
  285. package/dist/esm/integrations/convex/component/convex.config.js.map +1 -1
  286. package/dist/esm/integrations/convex.js +1 -1
  287. package/dist/esm/integrations/convex.js.map +1 -1
  288. package/dist/esm/lib/auth.js +1 -1
  289. package/dist/esm/lib/auth.js.map +1 -1
  290. package/dist/esm/lib/auth.test.js +1 -1
  291. package/dist/esm/lib/auth.test.js.map +1 -1
  292. package/dist/esm/lib/cookie.js.map +1 -1
  293. package/dist/esm/lib/env.js.map +1 -1
  294. package/dist/{lib/stack-app → esm/lib/hexclave-app}/api-keys/index.d.ts +2 -2
  295. package/dist/esm/lib/hexclave-app/api-keys/index.d.ts.map +1 -0
  296. package/dist/esm/lib/{stack-app → hexclave-app}/api-keys/index.js +1 -1
  297. package/dist/esm/lib/hexclave-app/api-keys/index.js.map +1 -0
  298. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.d.ts +7 -7
  299. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -0
  300. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.js +8 -8
  301. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -0
  302. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.cross-domain.test.js +2 -2
  303. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -0
  304. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.d.ts +14 -14
  305. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -0
  306. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.js +25 -32
  307. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -0
  308. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.js +1 -1
  309. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +1 -0
  310. package/dist/{lib/stack-app → esm/lib/hexclave-app}/apps/implementations/common.d.ts +4 -4
  311. package/dist/esm/lib/hexclave-app/apps/implementations/common.d.ts.map +1 -0
  312. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/common.js +9 -9
  313. package/dist/esm/lib/hexclave-app/apps/implementations/common.js.map +1 -0
  314. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.d.ts +1 -1
  315. package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.d.ts.map +1 -0
  316. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.js +1 -1
  317. package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.js.map +1 -0
  318. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.js +1 -1
  319. package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.test.js.map +1 -0
  320. package/dist/esm/lib/hexclave-app/apps/implementations/index.d.ts +9 -0
  321. package/dist/esm/lib/hexclave-app/apps/implementations/index.d.ts.map +1 -0
  322. package/dist/esm/lib/hexclave-app/apps/implementations/index.js +27 -0
  323. package/dist/esm/lib/hexclave-app/apps/implementations/index.js.map +1 -0
  324. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.d.ts +1 -1
  325. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.d.ts.map +1 -0
  326. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.js +1 -1
  327. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.js.map +1 -0
  328. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.d.ts +5 -5
  329. package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.d.ts.map +1 -0
  330. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.js +7 -7
  331. package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.js.map +1 -0
  332. package/dist/{lib/stack-app → esm/lib/hexclave-app}/apps/implementations/session-refresh-subscription.d.ts +1 -1
  333. package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.d.ts.map +1 -0
  334. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.js +1 -1
  335. package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.js.map +1 -0
  336. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.js +1 -1
  337. package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js.map +1 -0
  338. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.d.ts +1 -1
  339. package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.d.ts.map +1 -0
  340. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.js +2 -2
  341. package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.js.map +1 -0
  342. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.js +1 -1
  343. package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.test.js.map +1 -0
  344. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.d.ts +1 -1
  345. package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.d.ts.map +1 -0
  346. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.js +3 -3
  347. package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -0
  348. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.d.ts +4 -4
  349. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.d.ts.map +1 -0
  350. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.js +3 -3
  351. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -0
  352. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.d.ts +1 -1
  353. package/dist/esm/lib/hexclave-app/apps/interfaces/server-app.d.ts.map +1 -0
  354. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.js +3 -3
  355. package/dist/esm/lib/hexclave-app/apps/interfaces/server-app.js.map +1 -0
  356. package/dist/esm/lib/{stack-app → hexclave-app}/common.d.ts +7 -7
  357. package/dist/esm/lib/hexclave-app/common.d.ts.map +1 -0
  358. package/dist/esm/lib/hexclave-app/common.js +7 -0
  359. package/dist/esm/lib/hexclave-app/common.js.map +1 -0
  360. package/dist/esm/lib/{stack-app → hexclave-app}/connected-accounts/index.d.ts +1 -1
  361. package/dist/esm/lib/hexclave-app/connected-accounts/index.d.ts.map +1 -0
  362. package/dist/esm/lib/{stack-app → hexclave-app}/contact-channels/index.d.ts +1 -1
  363. package/dist/esm/lib/hexclave-app/contact-channels/index.d.ts.map +1 -0
  364. package/dist/esm/lib/{stack-app → hexclave-app}/contact-channels/index.js +1 -1
  365. package/dist/esm/lib/hexclave-app/contact-channels/index.js.map +1 -0
  366. package/dist/esm/lib/{stack-app → hexclave-app}/customers/index.d.ts +1 -1
  367. package/dist/esm/lib/hexclave-app/customers/index.d.ts.map +1 -0
  368. package/dist/esm/lib/{stack-app → hexclave-app}/data-vault/index.d.ts +1 -1
  369. package/dist/esm/lib/hexclave-app/data-vault/index.d.ts.map +1 -0
  370. package/dist/esm/lib/{stack-app → hexclave-app}/email/index.d.ts +1 -1
  371. package/dist/esm/lib/hexclave-app/email/index.d.ts.map +1 -0
  372. package/dist/{lib/stack-app → esm/lib/hexclave-app}/email-templates/index.d.ts +1 -1
  373. package/dist/esm/lib/hexclave-app/email-templates/index.d.ts.map +1 -0
  374. package/dist/esm/lib/{stack-app → hexclave-app}/email-templates/index.js +1 -1
  375. package/dist/esm/lib/hexclave-app/email-templates/index.js.map +1 -0
  376. package/dist/esm/lib/{stack-app → hexclave-app}/index.d.ts +2 -2
  377. package/dist/esm/lib/{stack-app → hexclave-app}/index.js +2 -2
  378. package/dist/{lib/stack-app → esm/lib/hexclave-app}/internal-api-keys/index.d.ts +1 -1
  379. package/dist/esm/lib/hexclave-app/internal-api-keys/index.d.ts.map +1 -0
  380. package/dist/esm/lib/{stack-app → hexclave-app}/internal-api-keys/index.js +1 -1
  381. package/dist/esm/lib/hexclave-app/internal-api-keys/index.js.map +1 -0
  382. package/dist/{lib/stack-app → esm/lib/hexclave-app}/notification-categories/index.d.ts +1 -1
  383. package/dist/esm/lib/hexclave-app/notification-categories/index.d.ts.map +1 -0
  384. package/dist/{lib/stack-app → esm/lib/hexclave-app}/permissions/index.d.ts +1 -1
  385. package/dist/esm/lib/hexclave-app/permissions/index.d.ts.map +1 -0
  386. package/dist/esm/lib/{stack-app → hexclave-app}/permissions/index.js +1 -1
  387. package/dist/esm/lib/hexclave-app/permissions/index.js.map +1 -0
  388. package/dist/esm/lib/{stack-app → hexclave-app}/project-configs/index.d.ts +1 -1
  389. package/dist/esm/lib/hexclave-app/project-configs/index.d.ts.map +1 -0
  390. package/dist/esm/lib/{stack-app → hexclave-app}/projects/index.d.ts +1 -1
  391. package/dist/esm/lib/hexclave-app/projects/index.d.ts.map +1 -0
  392. package/dist/esm/lib/{stack-app → hexclave-app}/projects/index.js +1 -1
  393. package/dist/esm/lib/hexclave-app/projects/index.js.map +1 -0
  394. package/dist/{lib/stack-app → esm/lib/hexclave-app}/session-replays/index.d.ts +1 -1
  395. package/dist/esm/lib/hexclave-app/session-replays/index.d.ts.map +1 -0
  396. package/dist/esm/lib/{stack-app → hexclave-app}/teams/index.d.ts +1 -1
  397. package/dist/esm/lib/hexclave-app/teams/index.d.ts.map +1 -0
  398. package/dist/esm/lib/{stack-app → hexclave-app}/teams/index.js +1 -1
  399. package/dist/esm/lib/hexclave-app/teams/index.js.map +1 -0
  400. package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.d.ts +1 -1
  401. package/dist/esm/lib/hexclave-app/url-targets.d.ts.map +1 -0
  402. package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.js +2 -2
  403. package/dist/esm/lib/hexclave-app/url-targets.js.map +1 -0
  404. package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.test.js +1 -1
  405. package/dist/esm/lib/hexclave-app/url-targets.test.js.map +1 -0
  406. package/dist/esm/lib/{stack-app → hexclave-app}/users/index.d.ts +2 -2
  407. package/dist/esm/lib/hexclave-app/users/index.d.ts.map +1 -0
  408. package/dist/esm/lib/{stack-app → hexclave-app}/users/index.js +1 -1
  409. package/dist/esm/lib/hexclave-app/users/index.js.map +1 -0
  410. package/dist/esm/lib/hooks.d.ts +1 -1
  411. package/dist/esm/lib/hooks.js +9 -9
  412. package/dist/esm/lib/hooks.js.map +1 -1
  413. package/dist/esm/lib/translations.js.map +1 -1
  414. package/dist/esm/providers/hexclave-context.d.ts +11 -0
  415. package/dist/esm/providers/hexclave-context.d.ts.map +1 -0
  416. package/dist/esm/providers/hexclave-context.js +12 -0
  417. package/dist/esm/providers/hexclave-context.js.map +1 -0
  418. package/dist/esm/providers/{stack-provider-client.d.ts → hexclave-provider-client.d.ts} +5 -5
  419. package/dist/esm/providers/hexclave-provider-client.d.ts.map +1 -0
  420. package/dist/esm/providers/hexclave-provider-client.js +30 -0
  421. package/dist/esm/providers/hexclave-provider-client.js.map +1 -0
  422. package/dist/esm/providers/{stack-provider.d.ts → hexclave-provider.d.ts} +3 -3
  423. package/dist/esm/providers/hexclave-provider.d.ts.map +1 -0
  424. package/dist/esm/providers/{stack-provider.js → hexclave-provider.js} +4 -4
  425. package/dist/esm/providers/hexclave-provider.js.map +1 -0
  426. package/dist/esm/providers/theme-provider.js.map +1 -1
  427. package/dist/esm/providers/translation-provider-client.js.map +1 -1
  428. package/dist/esm/providers/translation-provider.js +1 -1
  429. package/dist/esm/providers/translation-provider.js.map +1 -1
  430. package/dist/esm/tanstack-start-server-context.d.ts +1 -1
  431. package/dist/esm/utils/browser-script.js.map +1 -1
  432. package/dist/esm/utils/constants.js.map +1 -1
  433. package/dist/esm/utils/url.js.map +1 -1
  434. package/dist/generated/quetzal-translations.d.ts +2 -2
  435. package/dist/generated/quetzal-translations.js.map +1 -1
  436. package/dist/index.d.ts +18 -18
  437. package/dist/index.js +9 -9
  438. package/dist/integrations/convex/component/convex.config.js.map +1 -1
  439. package/dist/integrations/convex.js +2 -2
  440. package/dist/integrations/convex.js.map +1 -1
  441. package/dist/lib/auth.js +1 -1
  442. package/dist/lib/auth.js.map +1 -1
  443. package/dist/lib/auth.test.js +1 -1
  444. package/dist/lib/auth.test.js.map +1 -1
  445. package/dist/lib/cookie.js.map +1 -1
  446. package/dist/lib/env.js.map +1 -1
  447. package/dist/{esm/lib/stack-app → lib/hexclave-app}/api-keys/index.d.ts +2 -2
  448. package/dist/{esm/lib/stack-app → lib/hexclave-app}/api-keys/index.d.ts.map +1 -1
  449. package/dist/lib/{stack-app → hexclave-app}/api-keys/index.js +1 -1
  450. package/dist/lib/hexclave-app/api-keys/index.js.map +1 -0
  451. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.d.ts +6 -6
  452. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -0
  453. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.js +6 -6
  454. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -0
  455. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.cross-domain.test.js +2 -2
  456. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -0
  457. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.d.ts +13 -13
  458. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -0
  459. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.js +24 -31
  460. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -0
  461. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.js +1 -1
  462. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +1 -0
  463. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/common.d.ts +4 -4
  464. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/common.d.ts.map +1 -1
  465. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/common.js +8 -8
  466. package/dist/lib/hexclave-app/apps/implementations/common.js.map +1 -0
  467. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.d.ts +1 -1
  468. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/event-tracker.d.ts.map +1 -1
  469. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.js +1 -1
  470. package/dist/lib/hexclave-app/apps/implementations/event-tracker.js.map +1 -0
  471. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.js +1 -1
  472. package/dist/lib/hexclave-app/apps/implementations/event-tracker.test.js.map +1 -0
  473. package/dist/lib/hexclave-app/apps/implementations/index.d.ts +9 -0
  474. package/dist/lib/hexclave-app/apps/implementations/index.d.ts.map +1 -0
  475. package/dist/lib/hexclave-app/apps/implementations/index.js +31 -0
  476. package/dist/lib/hexclave-app/apps/implementations/index.js.map +1 -0
  477. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.d.ts +1 -1
  478. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/redirect-page-urls.d.ts.map +1 -1
  479. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.js +1 -1
  480. package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.js.map +1 -0
  481. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.d.ts +4 -4
  482. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/server-app-impl.d.ts.map +1 -1
  483. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.js +6 -6
  484. package/dist/lib/hexclave-app/apps/implementations/server-app-impl.js.map +1 -0
  485. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/session-refresh-subscription.d.ts +1 -1
  486. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/session-refresh-subscription.d.ts.map +1 -1
  487. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.js +1 -1
  488. package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.js.map +1 -0
  489. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.js +1 -1
  490. package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js.map +1 -0
  491. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.d.ts +1 -1
  492. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/session-replay.d.ts.map +1 -1
  493. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.js +2 -2
  494. package/dist/lib/hexclave-app/apps/implementations/session-replay.js.map +1 -0
  495. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.js +1 -1
  496. package/dist/lib/hexclave-app/apps/implementations/session-replay.test.js.map +1 -0
  497. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.d.ts +1 -1
  498. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/interfaces/admin-app.d.ts.map +1 -1
  499. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.js +2 -2
  500. package/dist/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -0
  501. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.d.ts +4 -4
  502. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/interfaces/client-app.d.ts.map +1 -1
  503. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.js +2 -2
  504. package/dist/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -0
  505. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.d.ts +1 -1
  506. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/interfaces/server-app.d.ts.map +1 -1
  507. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.js +2 -2
  508. package/dist/lib/hexclave-app/apps/interfaces/server-app.js.map +1 -0
  509. package/dist/lib/{stack-app → hexclave-app}/common.d.ts +7 -7
  510. package/dist/{esm/lib/stack-app → lib/hexclave-app}/common.d.ts.map +1 -1
  511. package/dist/lib/hexclave-app/common.js +9 -0
  512. package/dist/lib/hexclave-app/common.js.map +1 -0
  513. package/dist/lib/{stack-app → hexclave-app}/connected-accounts/index.d.ts +1 -1
  514. package/dist/{esm/lib/stack-app → lib/hexclave-app}/connected-accounts/index.d.ts.map +1 -1
  515. package/dist/lib/{stack-app → hexclave-app}/contact-channels/index.d.ts +1 -1
  516. package/dist/{esm/lib/stack-app → lib/hexclave-app}/contact-channels/index.d.ts.map +1 -1
  517. package/dist/lib/{stack-app → hexclave-app}/contact-channels/index.js +1 -1
  518. package/dist/lib/hexclave-app/contact-channels/index.js.map +1 -0
  519. package/dist/lib/{stack-app → hexclave-app}/customers/index.d.ts +1 -1
  520. package/dist/{esm/lib/stack-app → lib/hexclave-app}/customers/index.d.ts.map +1 -1
  521. package/dist/lib/{stack-app → hexclave-app}/data-vault/index.d.ts +1 -1
  522. package/dist/{esm/lib/stack-app → lib/hexclave-app}/data-vault/index.d.ts.map +1 -1
  523. package/dist/lib/{stack-app → hexclave-app}/email/index.d.ts +1 -1
  524. package/dist/{esm/lib/stack-app → lib/hexclave-app}/email/index.d.ts.map +1 -1
  525. package/dist/{esm/lib/stack-app → lib/hexclave-app}/email-templates/index.d.ts +1 -1
  526. package/dist/{esm/lib/stack-app → lib/hexclave-app}/email-templates/index.d.ts.map +1 -1
  527. package/dist/lib/{stack-app → hexclave-app}/email-templates/index.js +1 -1
  528. package/dist/lib/hexclave-app/email-templates/index.js.map +1 -0
  529. package/dist/lib/{stack-app → hexclave-app}/index.d.ts +2 -2
  530. package/dist/lib/{stack-app → hexclave-app}/index.js +2 -2
  531. package/dist/{esm/lib/stack-app → lib/hexclave-app}/internal-api-keys/index.d.ts +1 -1
  532. package/dist/{esm/lib/stack-app → lib/hexclave-app}/internal-api-keys/index.d.ts.map +1 -1
  533. package/dist/lib/{stack-app → hexclave-app}/internal-api-keys/index.js +1 -1
  534. package/dist/lib/hexclave-app/internal-api-keys/index.js.map +1 -0
  535. package/dist/{esm/lib/stack-app → lib/hexclave-app}/notification-categories/index.d.ts +1 -1
  536. package/dist/{esm/lib/stack-app → lib/hexclave-app}/notification-categories/index.d.ts.map +1 -1
  537. package/dist/{esm/lib/stack-app → lib/hexclave-app}/permissions/index.d.ts +1 -1
  538. package/dist/{esm/lib/stack-app → lib/hexclave-app}/permissions/index.d.ts.map +1 -1
  539. package/dist/lib/{stack-app → hexclave-app}/permissions/index.js +1 -1
  540. package/dist/lib/hexclave-app/permissions/index.js.map +1 -0
  541. package/dist/lib/{stack-app → hexclave-app}/project-configs/index.d.ts +1 -1
  542. package/dist/{esm/lib/stack-app → lib/hexclave-app}/project-configs/index.d.ts.map +1 -1
  543. package/dist/lib/{stack-app → hexclave-app}/projects/index.d.ts +1 -1
  544. package/dist/{esm/lib/stack-app → lib/hexclave-app}/projects/index.d.ts.map +1 -1
  545. package/dist/lib/{stack-app → hexclave-app}/projects/index.js +1 -1
  546. package/dist/lib/hexclave-app/projects/index.js.map +1 -0
  547. package/dist/{esm/lib/stack-app → lib/hexclave-app}/session-replays/index.d.ts +1 -1
  548. package/dist/{esm/lib/stack-app → lib/hexclave-app}/session-replays/index.d.ts.map +1 -1
  549. package/dist/lib/{stack-app → hexclave-app}/teams/index.d.ts +1 -1
  550. package/dist/{esm/lib/stack-app → lib/hexclave-app}/teams/index.d.ts.map +1 -1
  551. package/dist/lib/{stack-app → hexclave-app}/teams/index.js +1 -1
  552. package/dist/lib/hexclave-app/teams/index.js.map +1 -0
  553. package/dist/lib/{stack-app → hexclave-app}/url-targets.d.ts +1 -1
  554. package/dist/{esm/lib/stack-app → lib/hexclave-app}/url-targets.d.ts.map +1 -1
  555. package/dist/lib/{stack-app → hexclave-app}/url-targets.js +2 -2
  556. package/dist/lib/hexclave-app/url-targets.js.map +1 -0
  557. package/dist/lib/{stack-app → hexclave-app}/url-targets.test.js +1 -1
  558. package/dist/lib/hexclave-app/url-targets.test.js.map +1 -0
  559. package/dist/lib/{stack-app → hexclave-app}/users/index.d.ts +1 -1
  560. package/dist/{esm/lib/stack-app → lib/hexclave-app}/users/index.d.ts.map +1 -1
  561. package/dist/lib/{stack-app → hexclave-app}/users/index.js +1 -1
  562. package/dist/lib/hexclave-app/users/index.js.map +1 -0
  563. package/dist/lib/hooks.d.ts +3 -3
  564. package/dist/lib/hooks.d.ts.map +1 -1
  565. package/dist/lib/hooks.js +9 -9
  566. package/dist/lib/hooks.js.map +1 -1
  567. package/dist/lib/translations.js.map +1 -1
  568. package/dist/providers/hexclave-context.d.ts +11 -0
  569. package/dist/providers/hexclave-context.d.ts.map +1 -0
  570. package/dist/providers/hexclave-context.js +15 -0
  571. package/dist/providers/hexclave-context.js.map +1 -0
  572. package/dist/providers/{stack-provider-client.d.ts → hexclave-provider-client.d.ts} +5 -5
  573. package/dist/providers/hexclave-provider-client.d.ts.map +1 -0
  574. package/dist/providers/{stack-provider-client.js → hexclave-provider-client.js} +9 -9
  575. package/dist/providers/hexclave-provider-client.js.map +1 -0
  576. package/dist/providers/{stack-provider.d.ts → hexclave-provider.d.ts} +3 -3
  577. package/dist/providers/hexclave-provider.d.ts.map +1 -0
  578. package/dist/providers/{stack-provider.js → hexclave-provider.js} +4 -4
  579. package/dist/providers/hexclave-provider.js.map +1 -0
  580. package/dist/providers/theme-provider.js.map +1 -1
  581. package/dist/providers/translation-provider-client.js.map +1 -1
  582. package/dist/providers/translation-provider.js +1 -1
  583. package/dist/providers/translation-provider.js.map +1 -1
  584. package/dist/tanstack-start-server-context.d.ts +1 -1
  585. package/dist/utils/browser-script.js.map +1 -1
  586. package/dist/utils/constants.js.map +1 -1
  587. package/dist/utils/url.js.map +1 -1
  588. package/package.json +5 -4
  589. package/src/components/api-key-dialogs.tsx +173 -0
  590. package/src/components/api-key-table.tsx +127 -0
  591. package/src/components/credential-sign-in.tsx +83 -0
  592. package/src/components/credential-sign-up.tsx +108 -0
  593. package/src/components/elements/form-warning.tsx +17 -0
  594. package/src/components/elements/maybe-full-page.tsx +60 -0
  595. package/src/components/elements/separator-with-text.tsx +22 -0
  596. package/src/components/elements/sidebar-layout.tsx +136 -0
  597. package/src/components/elements/ssr-layout-effect.tsx +24 -0
  598. package/src/components/elements/user-avatar.tsx +32 -0
  599. package/src/components/link.tsx +38 -0
  600. package/src/components/magic-link-sign-in.tsx +143 -0
  601. package/src/components/message-cards/known-error-message-card.tsx +33 -0
  602. package/src/components/message-cards/message-card.tsx +46 -0
  603. package/src/components/message-cards/predefined-message-card.tsx +88 -0
  604. package/src/components/oauth-button-group.tsx +35 -0
  605. package/src/components/oauth-button.tsx +222 -0
  606. package/src/components/passkey-button.tsx +43 -0
  607. package/src/components/profile-image-editor.tsx +194 -0
  608. package/src/components/selected-team-switcher.tsx +97 -0
  609. package/src/components/team-icon.tsx +30 -0
  610. package/src/components/team-switcher.tsx +191 -0
  611. package/src/components/use-in-iframe.tsx +18 -0
  612. package/src/components/user-button.tsx +157 -0
  613. package/src/components-page/account-settings/active-sessions/active-sessions-page.tsx +238 -0
  614. package/src/components-page/account-settings/api-keys/api-keys-page.tsx +157 -0
  615. package/src/components-page/account-settings/editable-text.tsx +53 -0
  616. package/src/components-page/account-settings/email-and-auth/email-and-auth-page.tsx +24 -0
  617. package/src/components-page/account-settings/email-and-auth/emails-section.tsx +201 -0
  618. package/src/components-page/account-settings/email-and-auth/mfa-section.tsx +139 -0
  619. package/src/components-page/account-settings/email-and-auth/otp-section.tsx +102 -0
  620. package/src/components-page/account-settings/email-and-auth/passkey-section.tsx +112 -0
  621. package/src/components-page/account-settings/email-and-auth/password-section.tsx +174 -0
  622. package/src/components-page/account-settings/notifications/notifications-page.tsx +44 -0
  623. package/src/components-page/account-settings/page-layout.tsx +11 -0
  624. package/src/components-page/account-settings/payments/payments-page.tsx +73 -0
  625. package/src/components-page/account-settings/payments/payments-panel.tsx +543 -0
  626. package/src/components-page/account-settings/profile-page/profile-page.tsx +61 -0
  627. package/src/components-page/account-settings/section.tsx +26 -0
  628. package/src/components-page/account-settings/settings/delete-account-section.tsx +85 -0
  629. package/src/components-page/account-settings/settings/settings-page.tsx +19 -0
  630. package/src/components-page/account-settings/settings/sign-out-section.tsx +40 -0
  631. package/src/components-page/account-settings/teams/leave-team-section.tsx +57 -0
  632. package/src/components-page/account-settings/teams/team-api-keys-section.tsx +74 -0
  633. package/src/components-page/account-settings/teams/team-creation-page.tsx +92 -0
  634. package/src/components-page/account-settings/teams/team-display-name-section.tsx +31 -0
  635. package/src/components-page/account-settings/teams/team-member-invitation-section.tsx +128 -0
  636. package/src/components-page/account-settings/teams/team-member-list-section.tsx +59 -0
  637. package/src/components-page/account-settings/teams/team-page.tsx +28 -0
  638. package/src/components-page/account-settings/teams/team-profile-image-section.tsx +33 -0
  639. package/src/components-page/account-settings/teams/team-profile-user-section.tsx +29 -0
  640. package/src/components-page/account-settings.tsx +343 -0
  641. package/src/components-page/auth-page.tsx +206 -0
  642. package/src/components-page/cli-auth-confirm.test.tsx +204 -0
  643. package/src/components-page/cli-auth-confirm.tsx +278 -0
  644. package/src/components-page/email-verification.tsx +76 -0
  645. package/src/components-page/error-page.tsx +105 -0
  646. package/src/components-page/forgot-password.tsx +105 -0
  647. package/src/components-page/hexclave-handler-client.tsx +361 -0
  648. package/src/components-page/hexclave-handler.tsx +48 -0
  649. package/src/components-page/magic-link-callback.tsx +92 -0
  650. package/src/components-page/mfa.tsx +222 -0
  651. package/src/components-page/oauth-callback.tsx +78 -0
  652. package/src/components-page/onboarding.tsx +176 -0
  653. package/src/components-page/password-reset.tsx +185 -0
  654. package/src/components-page/section.tsx +27 -0
  655. package/src/components-page/sign-in.tsx +34 -0
  656. package/src/components-page/sign-out.tsx +37 -0
  657. package/src/components-page/sign-up.tsx +24 -0
  658. package/src/components-page/team-creation.tsx +78 -0
  659. package/src/components-page/team-invitation.tsx +150 -0
  660. package/src/dev-tool/dev-tool-core.ts +2460 -0
  661. package/src/dev-tool/dev-tool-styles.ts +2758 -0
  662. package/src/dev-tool/dev-tool-trigger-position.test.ts +113 -0
  663. package/src/dev-tool/dev-tool-trigger-position.ts +109 -0
  664. package/src/dev-tool/index.ts +149 -0
  665. package/src/generated/.gitignore +3 -0
  666. package/src/generated/quetzal-translations.ts +4312 -0
  667. package/src/global.css +13 -0
  668. package/src/global.d.ts +5 -0
  669. package/src/index.ts +39 -0
  670. package/src/integrations/convex/component/README.md +74 -0
  671. package/src/integrations/convex/component/convex.config.ts +9 -0
  672. package/src/integrations/convex.ts +28 -0
  673. package/src/lib/auth.test.ts +67 -0
  674. package/src/lib/auth.ts +175 -0
  675. package/src/lib/cookie.ts +327 -0
  676. package/src/lib/env.ts +93 -0
  677. package/src/lib/hexclave-app/api-keys/index.ts +73 -0
  678. package/src/lib/hexclave-app/apps/implementations/admin-app-impl.ts +1261 -0
  679. package/src/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.ts +141 -0
  680. package/src/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.ts +36 -0
  681. package/src/lib/hexclave-app/apps/implementations/client-app-impl.ts +3898 -0
  682. package/src/lib/hexclave-app/apps/implementations/common.ts +244 -0
  683. package/src/lib/hexclave-app/apps/implementations/event-tracker.test.ts +105 -0
  684. package/src/lib/hexclave-app/apps/implementations/event-tracker.ts +306 -0
  685. package/src/lib/hexclave-app/apps/implementations/index.ts +35 -0
  686. package/src/lib/hexclave-app/apps/implementations/redirect-page-urls.ts +342 -0
  687. package/src/lib/hexclave-app/apps/implementations/server-app-impl.ts +1619 -0
  688. package/src/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.ts +106 -0
  689. package/src/lib/hexclave-app/apps/implementations/session-refresh-subscription.ts +52 -0
  690. package/src/lib/hexclave-app/apps/implementations/session-replay.test.ts +33 -0
  691. package/src/lib/hexclave-app/apps/implementations/session-replay.ts +356 -0
  692. package/src/lib/hexclave-app/apps/index.ts +40 -0
  693. package/src/lib/hexclave-app/apps/interfaces/admin-app.ts +192 -0
  694. package/src/lib/hexclave-app/apps/interfaces/client-app.ts +180 -0
  695. package/src/lib/hexclave-app/apps/interfaces/server-app.ts +129 -0
  696. package/src/lib/hexclave-app/common.ts +215 -0
  697. package/src/lib/hexclave-app/connected-accounts/index.ts +49 -0
  698. package/src/lib/hexclave-app/contact-channels/index.ts +80 -0
  699. package/src/lib/hexclave-app/customers/index.ts +158 -0
  700. package/src/lib/hexclave-app/data-vault/index.ts +12 -0
  701. package/src/lib/hexclave-app/email/index.ts +280 -0
  702. package/src/lib/hexclave-app/email-templates/index.ts +24 -0
  703. package/src/lib/hexclave-app/index.ts +146 -0
  704. package/src/lib/hexclave-app/internal-api-keys/index.ts +55 -0
  705. package/src/lib/hexclave-app/notification-categories/index.ts +12 -0
  706. package/src/lib/hexclave-app/permissions/index.ts +75 -0
  707. package/src/lib/hexclave-app/project-configs/index.ts +103 -0
  708. package/src/lib/hexclave-app/projects/index.ts +236 -0
  709. package/src/lib/hexclave-app/session-replays/index.ts +72 -0
  710. package/src/lib/hexclave-app/teams/index.ts +206 -0
  711. package/src/lib/hexclave-app/url-targets.test.ts +253 -0
  712. package/src/lib/hexclave-app/url-targets.ts +395 -0
  713. package/src/lib/hexclave-app/users/index.ts +523 -0
  714. package/src/lib/hooks.tsx +63 -0
  715. package/src/lib/translations.tsx +23 -0
  716. package/src/providers/hexclave-context.tsx +20 -0
  717. package/src/providers/hexclave-provider-client.tsx +39 -0
  718. package/src/providers/hexclave-provider.tsx +48 -0
  719. package/src/providers/theme-provider.tsx +121 -0
  720. package/src/providers/translation-provider-client.tsx +35 -0
  721. package/src/providers/translation-provider.tsx +25 -0
  722. package/src/tanstack-start-server-context.d.ts +13 -0
  723. package/src/utils/browser-script.tsx +135 -0
  724. package/src/utils/constants.tsx +58 -0
  725. package/src/utils/url.ts +24 -0
  726. package/dist/components-page/stack-handler-client.d.ts.map +0 -1
  727. package/dist/components-page/stack-handler-client.js.map +0 -1
  728. package/dist/components-page/stack-handler.d.ts.map +0 -1
  729. package/dist/components-page/stack-handler.js.map +0 -1
  730. package/dist/esm/components-page/stack-handler-client.d.ts.map +0 -1
  731. package/dist/esm/components-page/stack-handler-client.js.map +0 -1
  732. package/dist/esm/components-page/stack-handler.d.ts.map +0 -1
  733. package/dist/esm/components-page/stack-handler.js.map +0 -1
  734. package/dist/esm/lib/stack-app/api-keys/index.js.map +0 -1
  735. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +0 -1
  736. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +0 -1
  737. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js.map +0 -1
  738. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +0 -1
  739. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +0 -1
  740. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +0 -1
  741. package/dist/esm/lib/stack-app/apps/implementations/common.js.map +0 -1
  742. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.js.map +0 -1
  743. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.test.js.map +0 -1
  744. package/dist/esm/lib/stack-app/apps/implementations/index.d.ts +0 -9
  745. package/dist/esm/lib/stack-app/apps/implementations/index.d.ts.map +0 -1
  746. package/dist/esm/lib/stack-app/apps/implementations/index.js +0 -27
  747. package/dist/esm/lib/stack-app/apps/implementations/index.js.map +0 -1
  748. package/dist/esm/lib/stack-app/apps/implementations/redirect-page-urls.js.map +0 -1
  749. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +0 -1
  750. package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.js.map +0 -1
  751. package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.test.js.map +0 -1
  752. package/dist/esm/lib/stack-app/apps/implementations/session-replay.js.map +0 -1
  753. package/dist/esm/lib/stack-app/apps/implementations/session-replay.test.js.map +0 -1
  754. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +0 -1
  755. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +0 -1
  756. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +0 -1
  757. package/dist/esm/lib/stack-app/common.js +0 -7
  758. package/dist/esm/lib/stack-app/common.js.map +0 -1
  759. package/dist/esm/lib/stack-app/contact-channels/index.js.map +0 -1
  760. package/dist/esm/lib/stack-app/email-templates/index.js.map +0 -1
  761. package/dist/esm/lib/stack-app/internal-api-keys/index.js.map +0 -1
  762. package/dist/esm/lib/stack-app/permissions/index.js.map +0 -1
  763. package/dist/esm/lib/stack-app/projects/index.js.map +0 -1
  764. package/dist/esm/lib/stack-app/teams/index.js.map +0 -1
  765. package/dist/esm/lib/stack-app/url-targets.js.map +0 -1
  766. package/dist/esm/lib/stack-app/url-targets.test.js.map +0 -1
  767. package/dist/esm/lib/stack-app/users/index.js.map +0 -1
  768. package/dist/esm/providers/stack-context.d.ts +0 -11
  769. package/dist/esm/providers/stack-context.d.ts.map +0 -1
  770. package/dist/esm/providers/stack-context.js +0 -12
  771. package/dist/esm/providers/stack-context.js.map +0 -1
  772. package/dist/esm/providers/stack-provider-client.d.ts.map +0 -1
  773. package/dist/esm/providers/stack-provider-client.js +0 -30
  774. package/dist/esm/providers/stack-provider-client.js.map +0 -1
  775. package/dist/esm/providers/stack-provider.d.ts.map +0 -1
  776. package/dist/esm/providers/stack-provider.js.map +0 -1
  777. package/dist/lib/stack-app/api-keys/index.d.ts.map +0 -1
  778. package/dist/lib/stack-app/api-keys/index.js.map +0 -1
  779. package/dist/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +0 -1
  780. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +0 -1
  781. package/dist/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js.map +0 -1
  782. package/dist/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +0 -1
  783. package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +0 -1
  784. package/dist/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +0 -1
  785. package/dist/lib/stack-app/apps/implementations/common.d.ts.map +0 -1
  786. package/dist/lib/stack-app/apps/implementations/common.js.map +0 -1
  787. package/dist/lib/stack-app/apps/implementations/event-tracker.d.ts.map +0 -1
  788. package/dist/lib/stack-app/apps/implementations/event-tracker.js.map +0 -1
  789. package/dist/lib/stack-app/apps/implementations/event-tracker.test.js.map +0 -1
  790. package/dist/lib/stack-app/apps/implementations/index.d.ts +0 -9
  791. package/dist/lib/stack-app/apps/implementations/index.d.ts.map +0 -1
  792. package/dist/lib/stack-app/apps/implementations/index.js +0 -31
  793. package/dist/lib/stack-app/apps/implementations/index.js.map +0 -1
  794. package/dist/lib/stack-app/apps/implementations/redirect-page-urls.d.ts.map +0 -1
  795. package/dist/lib/stack-app/apps/implementations/redirect-page-urls.js.map +0 -1
  796. package/dist/lib/stack-app/apps/implementations/server-app-impl.d.ts.map +0 -1
  797. package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +0 -1
  798. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.d.ts.map +0 -1
  799. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.js.map +0 -1
  800. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.test.js.map +0 -1
  801. package/dist/lib/stack-app/apps/implementations/session-replay.d.ts.map +0 -1
  802. package/dist/lib/stack-app/apps/implementations/session-replay.js.map +0 -1
  803. package/dist/lib/stack-app/apps/implementations/session-replay.test.js.map +0 -1
  804. package/dist/lib/stack-app/apps/interfaces/admin-app.d.ts.map +0 -1
  805. package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +0 -1
  806. package/dist/lib/stack-app/apps/interfaces/client-app.d.ts.map +0 -1
  807. package/dist/lib/stack-app/apps/interfaces/client-app.js.map +0 -1
  808. package/dist/lib/stack-app/apps/interfaces/server-app.d.ts.map +0 -1
  809. package/dist/lib/stack-app/apps/interfaces/server-app.js.map +0 -1
  810. package/dist/lib/stack-app/common.d.ts.map +0 -1
  811. package/dist/lib/stack-app/common.js +0 -9
  812. package/dist/lib/stack-app/common.js.map +0 -1
  813. package/dist/lib/stack-app/connected-accounts/index.d.ts.map +0 -1
  814. package/dist/lib/stack-app/contact-channels/index.d.ts.map +0 -1
  815. package/dist/lib/stack-app/contact-channels/index.js.map +0 -1
  816. package/dist/lib/stack-app/customers/index.d.ts.map +0 -1
  817. package/dist/lib/stack-app/data-vault/index.d.ts.map +0 -1
  818. package/dist/lib/stack-app/email/index.d.ts.map +0 -1
  819. package/dist/lib/stack-app/email-templates/index.d.ts.map +0 -1
  820. package/dist/lib/stack-app/email-templates/index.js.map +0 -1
  821. package/dist/lib/stack-app/internal-api-keys/index.d.ts.map +0 -1
  822. package/dist/lib/stack-app/internal-api-keys/index.js.map +0 -1
  823. package/dist/lib/stack-app/notification-categories/index.d.ts.map +0 -1
  824. package/dist/lib/stack-app/permissions/index.d.ts.map +0 -1
  825. package/dist/lib/stack-app/permissions/index.js.map +0 -1
  826. package/dist/lib/stack-app/project-configs/index.d.ts.map +0 -1
  827. package/dist/lib/stack-app/projects/index.d.ts.map +0 -1
  828. package/dist/lib/stack-app/projects/index.js.map +0 -1
  829. package/dist/lib/stack-app/session-replays/index.d.ts.map +0 -1
  830. package/dist/lib/stack-app/teams/index.d.ts.map +0 -1
  831. package/dist/lib/stack-app/teams/index.js.map +0 -1
  832. package/dist/lib/stack-app/url-targets.d.ts.map +0 -1
  833. package/dist/lib/stack-app/url-targets.js.map +0 -1
  834. package/dist/lib/stack-app/url-targets.test.js.map +0 -1
  835. package/dist/lib/stack-app/users/index.d.ts.map +0 -1
  836. package/dist/lib/stack-app/users/index.js.map +0 -1
  837. package/dist/providers/stack-context.d.ts +0 -11
  838. package/dist/providers/stack-context.d.ts.map +0 -1
  839. package/dist/providers/stack-context.js +0 -15
  840. package/dist/providers/stack-context.js.map +0 -1
  841. package/dist/providers/stack-provider-client.d.ts.map +0 -1
  842. package/dist/providers/stack-provider-client.js.map +0 -1
  843. package/dist/providers/stack-provider.d.ts.map +0 -1
  844. package/dist/providers/stack-provider.js.map +0 -1
  845. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.cross-domain.test.d.ts +0 -0
  846. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.d.ts +0 -0
  847. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.d.ts +0 -0
  848. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.d.ts +0 -0
  849. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.d.ts +0 -0
  850. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/index.d.ts +0 -0
  851. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/index.js +0 -0
  852. /package/dist/esm/lib/{stack-app → hexclave-app}/connected-accounts/index.js +0 -0
  853. /package/dist/esm/lib/{stack-app → hexclave-app}/customers/index.js +0 -0
  854. /package/dist/esm/lib/{stack-app → hexclave-app}/data-vault/index.js +0 -0
  855. /package/dist/esm/lib/{stack-app → hexclave-app}/email/index.js +0 -0
  856. /package/dist/esm/lib/{stack-app → hexclave-app}/notification-categories/index.js +0 -0
  857. /package/dist/esm/lib/{stack-app → hexclave-app}/project-configs/index.js +0 -0
  858. /package/dist/esm/lib/{stack-app → hexclave-app}/session-replays/index.js +0 -0
  859. /package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.test.d.ts +0 -0
  860. /package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.cross-domain.test.d.ts +0 -0
  861. /package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.d.ts +0 -0
  862. /package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.d.ts +0 -0
  863. /package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.d.ts +0 -0
  864. /package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.d.ts +0 -0
  865. /package/dist/lib/{stack-app → hexclave-app}/apps/index.d.ts +0 -0
  866. /package/dist/lib/{stack-app → hexclave-app}/apps/index.js +0 -0
  867. /package/dist/lib/{stack-app → hexclave-app}/connected-accounts/index.js +0 -0
  868. /package/dist/lib/{stack-app → hexclave-app}/customers/index.js +0 -0
  869. /package/dist/lib/{stack-app → hexclave-app}/data-vault/index.js +0 -0
  870. /package/dist/lib/{stack-app → hexclave-app}/email/index.js +0 -0
  871. /package/dist/lib/{stack-app → hexclave-app}/notification-categories/index.js +0 -0
  872. /package/dist/lib/{stack-app → hexclave-app}/project-configs/index.js +0 -0
  873. /package/dist/lib/{stack-app → hexclave-app}/session-replays/index.js +0 -0
  874. /package/dist/lib/{stack-app → hexclave-app}/url-targets.test.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"team-member-invitation-section.js","names":[],"sources":["../../../../../src/components-page/account-settings/teams/team-member-invitation-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { strictEmailSchema, yupObject } from \"@hexclave/shared/dist/schema-fields\";\nimport { runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { Button, Input, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Typography } from \"@hexclave/ui\";\nimport { Trash } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { Team } from \"../../..\";\nimport { FormWarningText } from \"../../../components/elements/form-warning\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function TeamMemberInvitationSection(props: { team: Team }) {\n const user = useUser({ or: 'redirect' });\n const inviteMemberPermission = user.usePermission(props.team, '$invite_members');\n\n if (!inviteMemberPermission) {\n return null;\n }\n\n return <MemberInvitationSectionInner team={props.team} />;\n}\n\nfunction MemberInvitationsSectionInvitationsList(props: { team: Team }) {\n const user = useUser({ or: 'redirect' });\n const { t } = useTranslation();\n const invitationsToShow = props.team.useInvitations();\n const removeMemberPermission = user.usePermission(props.team, '$remove_members');\n\n return <>\n <Table className='mt-6'>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[200px]\">{t(\"Outstanding invitations\")}</TableHead>\n <TableHead className=\"w-[60px]\">{t(\"Expires\")}</TableHead>\n <TableHead className=\"w-[36px] max-w-[36px]\"></TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {invitationsToShow.map((invitation, i) => (\n <TableRow key={invitation.id}>\n <TableCell>\n <Typography>{invitation.recipientEmail}</Typography>\n </TableCell>\n <TableCell>\n <Typography variant='secondary'>{invitation.expiresAt.toLocaleString()}</Typography>\n </TableCell>\n <TableCell align='right' className='max-w-[36px]'>\n {removeMemberPermission && (\n <Button onClick={async () => await invitation.revoke()} size='icon' variant='ghost'>\n <Trash className=\"w-4 h-4\" />\n </Button>\n )}\n </TableCell>\n </TableRow>\n ))}\n {invitationsToShow.length === 0 && <TableRow>\n <TableCell colSpan={3}>\n <Typography variant='secondary'>{t(\"No outstanding invitations\")}</Typography>\n </TableCell>\n </TableRow>}\n </TableBody>\n </Table>\n </>;\n}\n\nfunction MemberInvitationSectionInner(props: { team: Team }) {\n const user = useUser({ or: 'redirect' });\n const { t } = useTranslation();\n const readMemberPermission = user.usePermission(props.team, '$read_members');\n\n const invitationSchema = yupObject({\n email: strictEmailSchema(t('Please enter a valid email address')).defined().nonEmpty(t('Please enter an email address')),\n });\n\n const { register, handleSubmit, formState: { errors }, watch } = useForm({\n resolver: yupResolver(invitationSchema)\n });\n const [loading, setLoading] = useState(false);\n const [invitedEmail, setInvitedEmail] = useState<string | null>(null);\n\n const onSubmit = async (data: yup.InferType<typeof invitationSchema>) => {\n setLoading(true);\n\n try {\n await props.team.inviteUser({ email: data.email });\n setInvitedEmail(data.email);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n setInvitedEmail(null);\n }, [watch('email')]);\n\n return (\n <>\n <Section\n title={t(\"Invite member\")}\n description={t(\"Invite a user to your team through email\")}\n >\n <form\n onSubmit={e => runAsynchronouslyWithAlert(handleSubmit(onSubmit)(e))}\n noValidate\n className='w-full'\n >\n <div className=\"flex flex-col gap-4 sm:flex-row w-full\">\n <Input\n placeholder={t(\"Email\")}\n {...register(\"email\")}\n />\n <Button type=\"submit\" loading={loading}>{t(\"Invite User\")}</Button>\n </div>\n <FormWarningText text={errors.email?.message?.toString()} />\n {invitedEmail && <Typography type='label' variant='secondary'>Invited {invitedEmail}</Typography>}\n </form>\n </Section>\n {readMemberPermission && <MemberInvitationsSectionInvitationsList team={props.team} />}\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAkBA,SAAgB,4BAA4B,OAAuB;AAIjE,KAAI,CAHS,QAAQ,EAAE,IAAI,YAAY,CAAC,CACJ,cAAc,MAAM,MAAM,kBAAkB,CAG9E,QAAO;AAGT,QAAO,oBAAC,gCAA6B,MAAM,MAAM,OAAQ;;AAG3D,SAAS,wCAAwC,OAAuB;CACtE,MAAM,OAAO,QAAQ,EAAE,IAAI,YAAY,CAAC;CACxC,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,oBAAoB,MAAM,KAAK,gBAAgB;CACrD,MAAM,yBAAyB,KAAK,cAAc,MAAM,MAAM,kBAAkB;AAEhF,QAAO,0CACL,qBAAC;EAAM,WAAU;aACf,oBAAC,yBACC,qBAAC;GACC,oBAAC;IAAU,WAAU;cAAa,EAAE,0BAA0B;KAAa;GAC3E,oBAAC;IAAU,WAAU;cAAY,EAAE,UAAU;KAAa;GAC1D,oBAAC,aAAU,WAAU,0BAAoC;MAChD,GACC,EACd,qBAAC,wBACE,kBAAkB,KAAK,YAAY,MAClC,qBAAC;GACC,oBAAC,uBACC,oBAAC,wBAAY,WAAW,iBAA4B,GAC1C;GACZ,oBAAC,uBACC,oBAAC;IAAW,SAAQ;cAAa,WAAW,UAAU,gBAAgB;KAAc,GAC1E;GACZ,oBAAC;IAAU,OAAM;IAAQ,WAAU;cAChC,0BACC,oBAAC;KAAO,SAAS,YAAY,MAAM,WAAW,QAAQ;KAAE,MAAK;KAAO,SAAQ;eAC1E,oBAAC,SAAM,WAAU,YAAY;MACtB;KAED;OAbC,WAAW,GAcf,CACX,EACD,kBAAkB,WAAW,KAAK,oBAAC,sBAClC,oBAAC;GAAU,SAAS;aAClB,oBAAC;IAAW,SAAQ;cAAa,EAAE,6BAA6B;KAAc;IACpE,GACH,IACD;GACN,GACP;;AAGL,SAAS,6BAA6B,OAAuB;CAC3D,MAAM,OAAO,QAAQ,EAAE,IAAI,YAAY,CAAC;CACxC,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,uBAAuB,KAAK,cAAc,MAAM,MAAM,gBAAgB;CAM5E,MAAM,EAAE,UAAU,cAAc,WAAW,EAAE,UAAU,UAAU,QAAQ,EACvE,UAAU,YALa,UAAU,EACjC,OAAO,kBAAkB,EAAE,qCAAqC,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,gCAAgC,CAAC,EACzH,CAAC,CAGuC,EACxC,CAAC;CACF,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAC7C,MAAM,CAAC,cAAc,mBAAmB,SAAwB,KAAK;CAErE,MAAM,WAAW,OAAO,SAAiD;AACvE,aAAW,KAAK;AAEhB,MAAI;AACF,SAAM,MAAM,KAAK,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC;AAClD,mBAAgB,KAAK,MAAM;YACnB;AACR,cAAW,MAAM;;;AAIrB,iBAAgB;AACd,kBAAgB,KAAK;IACpB,CAAC,MAAM,QAAQ,CAAC,CAAC;AAEpB,QACE,4CACE,oBAAC;EACC,OAAO,EAAE,gBAAgB;EACzB,aAAa,EAAE,2CAA2C;YAE1D,qBAAC;GACC,WAAU,MAAK,2BAA2B,aAAa,SAAS,CAAC,EAAE,CAAC;GACpE;GACA,WAAU;;IAEV,qBAAC;KAAI,WAAU;gBACb,oBAAC;MACC,aAAa,EAAE,QAAQ;MACvB,GAAI,SAAS,QAAQ;OACrB,EACF,oBAAC;MAAO,MAAK;MAAkB;gBAAU,EAAE,cAAc;OAAU;MAC/D;IACN,oBAAC,mBAAgB,MAAM,OAAO,OAAO,SAAS,UAAU,GAAI;IAC3D,gBAAgB,qBAAC;KAAW,MAAK;KAAQ,SAAQ;gBAAY,YAAS;MAA0B;;IAC5F;GACC,EACT,wBAAwB,oBAAC,2CAAwC,MAAM,MAAM,OAAQ,IACrF"}
1
+ {"version":3,"file":"team-member-invitation-section.js","names":[],"sources":["../../../../../src/components-page/account-settings/teams/team-member-invitation-section.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 { yupResolver } from \"@hookform/resolvers/yup\";\nimport { strictEmailSchema, yupObject } from \"@hexclave/shared/dist/schema-fields\";\nimport { runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { Button, Input, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Typography } from \"@hexclave/ui\";\nimport { Trash } from \"lucide-react\";\nimport { useEffect, useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { Team } from \"../../..\";\nimport { FormWarningText } from \"../../../components/elements/form-warning\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function TeamMemberInvitationSection(props: { team: Team }) {\n const user = useUser({ or: 'redirect' });\n const inviteMemberPermission = user.usePermission(props.team, '$invite_members');\n\n if (!inviteMemberPermission) {\n return null;\n }\n\n return <MemberInvitationSectionInner team={props.team} />;\n}\n\nfunction MemberInvitationsSectionInvitationsList(props: { team: Team }) {\n const user = useUser({ or: 'redirect' });\n const { t } = useTranslation();\n const invitationsToShow = props.team.useInvitations();\n const removeMemberPermission = user.usePermission(props.team, '$remove_members');\n\n return <>\n <Table className='mt-6'>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[200px]\">{t(\"Outstanding invitations\")}</TableHead>\n <TableHead className=\"w-[60px]\">{t(\"Expires\")}</TableHead>\n <TableHead className=\"w-[36px] max-w-[36px]\"></TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {invitationsToShow.map((invitation, i) => (\n <TableRow key={invitation.id}>\n <TableCell>\n <Typography>{invitation.recipientEmail}</Typography>\n </TableCell>\n <TableCell>\n <Typography variant='secondary'>{invitation.expiresAt.toLocaleString()}</Typography>\n </TableCell>\n <TableCell align='right' className='max-w-[36px]'>\n {removeMemberPermission && (\n <Button onClick={async () => await invitation.revoke()} size='icon' variant='ghost'>\n <Trash className=\"w-4 h-4\" />\n </Button>\n )}\n </TableCell>\n </TableRow>\n ))}\n {invitationsToShow.length === 0 && <TableRow>\n <TableCell colSpan={3}>\n <Typography variant='secondary'>{t(\"No outstanding invitations\")}</Typography>\n </TableCell>\n </TableRow>}\n </TableBody>\n </Table>\n </>;\n}\n\nfunction MemberInvitationSectionInner(props: { team: Team }) {\n const user = useUser({ or: 'redirect' });\n const { t } = useTranslation();\n const readMemberPermission = user.usePermission(props.team, '$read_members');\n\n const invitationSchema = yupObject({\n email: strictEmailSchema(t('Please enter a valid email address')).defined().nonEmpty(t('Please enter an email address')),\n });\n\n const { register, handleSubmit, formState: { errors }, watch } = useForm({\n resolver: yupResolver(invitationSchema)\n });\n const [loading, setLoading] = useState(false);\n const [invitedEmail, setInvitedEmail] = useState<string | null>(null);\n\n const onSubmit = async (data: yup.InferType<typeof invitationSchema>) => {\n setLoading(true);\n\n try {\n await props.team.inviteUser({ email: data.email });\n setInvitedEmail(data.email);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n setInvitedEmail(null);\n }, [watch('email')]);\n\n return (\n <>\n <Section\n title={t(\"Invite member\")}\n description={t(\"Invite a user to your team through email\")}\n >\n <form\n onSubmit={e => runAsynchronouslyWithAlert(handleSubmit(onSubmit)(e))}\n noValidate\n className='w-full'\n >\n <div className=\"flex flex-col gap-4 sm:flex-row w-full\">\n <Input\n placeholder={t(\"Email\")}\n {...register(\"email\")}\n />\n <Button type=\"submit\" loading={loading}>{t(\"Invite User\")}</Button>\n </div>\n <FormWarningText text={errors.email?.message?.toString()} />\n {invitedEmail && <Typography type='label' variant='secondary'>Invited {invitedEmail}</Typography>}\n </form>\n </Section>\n {readMemberPermission && <MemberInvitationsSectionInvitationsList team={props.team} />}\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAkBA,SAAgB,4BAA4B,OAAuB;AAIjE,KAAI,CAHS,QAAQ,EAAE,IAAI,YAAY,CAAC,CACJ,cAAc,MAAM,MAAM,kBAAkB,CAG9E,QAAO;AAGT,QAAO,oBAAC,gCAA6B,MAAM,MAAM,OAAQ;;AAG3D,SAAS,wCAAwC,OAAuB;CACtE,MAAM,OAAO,QAAQ,EAAE,IAAI,YAAY,CAAC;CACxC,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,oBAAoB,MAAM,KAAK,gBAAgB;CACrD,MAAM,yBAAyB,KAAK,cAAc,MAAM,MAAM,kBAAkB;AAEhF,QAAO,0CACL,qBAAC;EAAM,WAAU;aACf,oBAAC,yBACC,qBAAC;GACC,oBAAC;IAAU,WAAU;cAAa,EAAE,0BAA0B;KAAa;GAC3E,oBAAC;IAAU,WAAU;cAAY,EAAE,UAAU;KAAa;GAC1D,oBAAC,aAAU,WAAU,0BAAoC;MAChD,GACC,EACd,qBAAC,wBACE,kBAAkB,KAAK,YAAY,MAClC,qBAAC;GACC,oBAAC,uBACC,oBAAC,wBAAY,WAAW,iBAA4B,GAC1C;GACZ,oBAAC,uBACC,oBAAC;IAAW,SAAQ;cAAa,WAAW,UAAU,gBAAgB;KAAc,GAC1E;GACZ,oBAAC;IAAU,OAAM;IAAQ,WAAU;cAChC,0BACC,oBAAC;KAAO,SAAS,YAAY,MAAM,WAAW,QAAQ;KAAE,MAAK;KAAO,SAAQ;eAC1E,oBAAC,SAAM,WAAU,YAAY;MACtB;KAED;OAbC,WAAW,GAcf,CACX,EACD,kBAAkB,WAAW,KAAK,oBAAC,sBAClC,oBAAC;GAAU,SAAS;aAClB,oBAAC;IAAW,SAAQ;cAAa,EAAE,6BAA6B;KAAc;IACpE,GACH,IACD;GACN,GACP;;AAGL,SAAS,6BAA6B,OAAuB;CAC3D,MAAM,OAAO,QAAQ,EAAE,IAAI,YAAY,CAAC;CACxC,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,uBAAuB,KAAK,cAAc,MAAM,MAAM,gBAAgB;CAM5E,MAAM,EAAE,UAAU,cAAc,WAAW,EAAE,UAAU,UAAU,QAAQ,EACvE,UAAU,YALa,UAAU,EACjC,OAAO,kBAAkB,EAAE,qCAAqC,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,gCAAgC,CAAC,EACzH,CAAC,CAGuC,EACxC,CAAC;CACF,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAC7C,MAAM,CAAC,cAAc,mBAAmB,SAAwB,KAAK;CAErE,MAAM,WAAW,OAAO,SAAiD;AACvE,aAAW,KAAK;AAEhB,MAAI;AACF,SAAM,MAAM,KAAK,WAAW,EAAE,OAAO,KAAK,OAAO,CAAC;AAClD,mBAAgB,KAAK,MAAM;YACnB;AACR,cAAW,MAAM;;;AAIrB,iBAAgB;AACd,kBAAgB,KAAK;IACpB,CAAC,MAAM,QAAQ,CAAC,CAAC;AAEpB,QACE,4CACE,oBAAC;EACC,OAAO,EAAE,gBAAgB;EACzB,aAAa,EAAE,2CAA2C;YAE1D,qBAAC;GACC,WAAU,MAAK,2BAA2B,aAAa,SAAS,CAAC,EAAE,CAAC;GACpE;GACA,WAAU;;IAEV,qBAAC;KAAI,WAAU;gBACb,oBAAC;MACC,aAAa,EAAE,QAAQ;MACvB,GAAI,SAAS,QAAQ;OACrB,EACF,oBAAC;MAAO,MAAK;MAAkB;gBAAU,EAAE,cAAc;OAAU;MAC/D;IACN,oBAAC,mBAAgB,MAAM,OAAO,OAAO,SAAS,UAAU,GAAI;IAC3D,gBAAgB,qBAAC;KAAW,MAAK;KAAQ,SAAQ;gBAAY,YAAS;MAA0B;;IAC5F;GACC,EACT,wBAAwB,oBAAC,2CAAwC,MAAM,MAAM,OAAQ,IACrF"}
@@ -1 +1 @@
1
- {"version":3,"file":"team-member-list-section.js","names":[],"sources":["../../../../../src/components-page/account-settings/teams/team-member-list-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Typography } from \"@hexclave/ui\";\nimport { Team } from \"../../..\";\nimport { UserAvatar } from \"../../../components/elements/user-avatar\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\n\nexport function TeamMemberListSection(props: { team: Team }) {\n const user = useUser({ or: 'redirect' });\n const readMemberPermission = user.usePermission(props.team, '$read_members');\n const inviteMemberPermission = user.usePermission(props.team, '$invite_members');\n\n if (!readMemberPermission && !inviteMemberPermission) {\n return null;\n }\n\n return <MemberListSectionInner team={props.team} />;\n}\n\nfunction MemberListSectionInner(props: { team: Team }) {\n const { t } = useTranslation();\n const users = props.team.useUsers();\n\n return (\n <div>\n <Typography className='font-medium mb-2'>{t(\"Members\")}</Typography>\n <div className='border rounded-md'>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[100px]\">{t(\"User\")}</TableHead>\n <TableHead className=\"w-[200px]\">{t(\"Name\")}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {users.map(({ id, teamProfile }, i) => (\n <TableRow key={id}>\n <TableCell>\n <UserAvatar user={teamProfile} />\n </TableCell>\n <TableCell>\n {teamProfile.displayName && (\n <Typography>{teamProfile.displayName}</Typography>\n )}\n {!teamProfile.displayName && (\n <Typography className=\"text-muted-foreground italic\">{t(\"No display name set\")}</Typography>\n )}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAUA,SAAgB,sBAAsB,OAAuB;CAC3D,MAAM,OAAO,QAAQ,EAAE,IAAI,YAAY,CAAC;CACxC,MAAM,uBAAuB,KAAK,cAAc,MAAM,MAAM,gBAAgB;CAC5E,MAAM,yBAAyB,KAAK,cAAc,MAAM,MAAM,kBAAkB;AAEhF,KAAI,CAAC,wBAAwB,CAAC,uBAC5B,QAAO;AAGT,QAAO,oBAAC,0BAAuB,MAAM,MAAM,OAAQ;;AAGrD,SAAS,uBAAuB,OAAuB;CACrD,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,QAAQ,MAAM,KAAK,UAAU;AAEnC,QACE,qBAAC,oBACC,oBAAC;EAAW,WAAU;YAAoB,EAAE,UAAU;GAAc,EACpE,oBAAC;EAAI,WAAU;YACb,qBAAC,oBACC,oBAAC,yBACC,qBAAC,uBACC,oBAAC;GAAU,WAAU;aAAa,EAAE,OAAO;IAAa,EACxD,oBAAC;GAAU,WAAU;aAAa,EAAE,OAAO;IAAa,IAC/C,GACC,EACd,oBAAC,uBACE,MAAM,KAAK,EAAE,IAAI,eAAe,MAC/B,qBAAC,uBACC,oBAAC,uBACC,oBAAC,cAAW,MAAM,cAAe,GACvB,EACZ,qBAAC,wBACE,YAAY,eACX,oBAAC,wBAAY,YAAY,cAAyB,EAEnD,CAAC,YAAY,eACZ,oBAAC;GAAW,WAAU;aAAgC,EAAE,sBAAsB;IAAc,IAEpF,KAXC,GAYJ,CACX,GACQ,IACN;GACJ,IACF"}
1
+ {"version":3,"file":"team-member-list-section.js","names":[],"sources":["../../../../../src/components-page/account-settings/teams/team-member-list-section.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 { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Typography } from \"@hexclave/ui\";\nimport { Team } from \"../../..\";\nimport { UserAvatar } from \"../../../components/elements/user-avatar\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\n\nexport function TeamMemberListSection(props: { team: Team }) {\n const user = useUser({ or: 'redirect' });\n const readMemberPermission = user.usePermission(props.team, '$read_members');\n const inviteMemberPermission = user.usePermission(props.team, '$invite_members');\n\n if (!readMemberPermission && !inviteMemberPermission) {\n return null;\n }\n\n return <MemberListSectionInner team={props.team} />;\n}\n\nfunction MemberListSectionInner(props: { team: Team }) {\n const { t } = useTranslation();\n const users = props.team.useUsers();\n\n return (\n <div>\n <Typography className='font-medium mb-2'>{t(\"Members\")}</Typography>\n <div className='border rounded-md'>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-[100px]\">{t(\"User\")}</TableHead>\n <TableHead className=\"w-[200px]\">{t(\"Name\")}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {users.map(({ id, teamProfile }, i) => (\n <TableRow key={id}>\n <TableCell>\n <UserAvatar user={teamProfile} />\n </TableCell>\n <TableCell>\n {teamProfile.displayName && (\n <Typography>{teamProfile.displayName}</Typography>\n )}\n {!teamProfile.displayName && (\n <Typography className=\"text-muted-foreground italic\">{t(\"No display name set\")}</Typography>\n )}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAUA,SAAgB,sBAAsB,OAAuB;CAC3D,MAAM,OAAO,QAAQ,EAAE,IAAI,YAAY,CAAC;CACxC,MAAM,uBAAuB,KAAK,cAAc,MAAM,MAAM,gBAAgB;CAC5E,MAAM,yBAAyB,KAAK,cAAc,MAAM,MAAM,kBAAkB;AAEhF,KAAI,CAAC,wBAAwB,CAAC,uBAC5B,QAAO;AAGT,QAAO,oBAAC,0BAAuB,MAAM,MAAM,OAAQ;;AAGrD,SAAS,uBAAuB,OAAuB;CACrD,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,QAAQ,MAAM,KAAK,UAAU;AAEnC,QACE,qBAAC,oBACC,oBAAC;EAAW,WAAU;YAAoB,EAAE,UAAU;GAAc,EACpE,oBAAC;EAAI,WAAU;YACb,qBAAC,oBACC,oBAAC,yBACC,qBAAC,uBACC,oBAAC;GAAU,WAAU;aAAa,EAAE,OAAO;IAAa,EACxD,oBAAC;GAAU,WAAU;aAAa,EAAE,OAAO;IAAa,IAC/C,GACC,EACd,oBAAC,uBACE,MAAM,KAAK,EAAE,IAAI,eAAe,MAC/B,qBAAC,uBACC,oBAAC,uBACC,oBAAC,cAAW,MAAM,cAAe,GACvB,EACZ,qBAAC,wBACE,YAAY,eACX,oBAAC,wBAAY,YAAY,cAAyB,EAEnD,CAAC,YAAY,eACZ,oBAAC;GAAW,WAAU;aAAgC,EAAE,sBAAsB;IAAc,IAEpF,KAXC,GAYJ,CACX,GACQ,IACN;GACJ,IACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"team-page.js","names":[],"sources":["../../../../../src/components-page/account-settings/teams/team-page.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { Team } from \"../../..\";\nimport { PageLayout } from \"../page-layout\";\nimport { LeaveTeamSection } from \"./leave-team-section\";\nimport { TeamApiKeysSection } from \"./team-api-keys-section\";\nimport { TeamDisplayNameSection } from \"./team-display-name-section\";\nimport { TeamMemberInvitationSection } from \"./team-member-invitation-section\";\nimport { TeamMemberListSection } from \"./team-member-list-section\";\nimport { TeamProfileImageSection } from \"./team-profile-image-section\";\nimport { TeamUserProfileSection } from \"./team-profile-user-section\";\n\n\nexport function TeamPage(props: { team: Team }) {\n return (\n <PageLayout>\n <TeamUserProfileSection key={`user-profile-${props.team.id}`} team={props.team} />\n <TeamProfileImageSection key={`profile-image-${props.team.id}`} team={props.team} />\n <TeamDisplayNameSection key={`display-name-${props.team.id}`} team={props.team} />\n <TeamMemberListSection key={`member-list-${props.team.id}`} team={props.team} />\n <TeamMemberInvitationSection key={`member-invitation-${props.team.id}`} team={props.team} />\n <TeamApiKeysSection key={`api-keys-${props.team.id}`} team={props.team} />\n <LeaveTeamSection key={`leave-team-${props.team.id}`} team={props.team} />\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;AAeA,SAAgB,SAAS,OAAuB;AAC9C,QACE,qBAAC;EACC,oBAAC,0BAA6D,MAAM,MAAM,QAA7C,gBAAgB,MAAM,KAAK,KAA0B;EAClF,oBAAC,2BAA+D,MAAM,MAAM,QAA9C,iBAAiB,MAAM,KAAK,KAA0B;EACpF,oBAAC,0BAA6D,MAAM,MAAM,QAA7C,gBAAgB,MAAM,KAAK,KAA0B;EAClF,oBAAC,yBAA2D,MAAM,MAAM,QAA5C,eAAe,MAAM,KAAK,KAA0B;EAChF,oBAAC,+BAAuE,MAAM,MAAM,QAAlD,qBAAqB,MAAM,KAAK,KAA0B;EAC5F,oBAAC,sBAAqD,MAAM,MAAM,QAAzC,YAAY,MAAM,KAAK,KAA0B;EAC1E,oBAAC,oBAAqD,MAAM,MAAM,QAA3C,cAAc,MAAM,KAAK,KAA0B;KAC/D"}
1
+ {"version":3,"file":"team-page.js","names":[],"sources":["../../../../../src/components-page/account-settings/teams/team-page.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 { Team } from \"../../..\";\nimport { PageLayout } from \"../page-layout\";\nimport { LeaveTeamSection } from \"./leave-team-section\";\nimport { TeamApiKeysSection } from \"./team-api-keys-section\";\nimport { TeamDisplayNameSection } from \"./team-display-name-section\";\nimport { TeamMemberInvitationSection } from \"./team-member-invitation-section\";\nimport { TeamMemberListSection } from \"./team-member-list-section\";\nimport { TeamProfileImageSection } from \"./team-profile-image-section\";\nimport { TeamUserProfileSection } from \"./team-profile-user-section\";\n\n\nexport function TeamPage(props: { team: Team }) {\n return (\n <PageLayout>\n <TeamUserProfileSection key={`user-profile-${props.team.id}`} team={props.team} />\n <TeamProfileImageSection key={`profile-image-${props.team.id}`} team={props.team} />\n <TeamDisplayNameSection key={`display-name-${props.team.id}`} team={props.team} />\n <TeamMemberListSection key={`member-list-${props.team.id}`} team={props.team} />\n <TeamMemberInvitationSection key={`member-invitation-${props.team.id}`} team={props.team} />\n <TeamApiKeysSection key={`api-keys-${props.team.id}`} team={props.team} />\n <LeaveTeamSection key={`leave-team-${props.team.id}`} team={props.team} />\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;;AAeA,SAAgB,SAAS,OAAuB;AAC9C,QACE,qBAAC;EACC,oBAAC,0BAA6D,MAAM,MAAM,QAA7C,gBAAgB,MAAM,KAAK,KAA0B;EAClF,oBAAC,2BAA+D,MAAM,MAAM,QAA9C,iBAAiB,MAAM,KAAK,KAA0B;EACpF,oBAAC,0BAA6D,MAAM,MAAM,QAA7C,gBAAgB,MAAM,KAAK,KAA0B;EAClF,oBAAC,yBAA2D,MAAM,MAAM,QAA5C,eAAe,MAAM,KAAK,KAA0B;EAChF,oBAAC,+BAAuE,MAAM,MAAM,QAAlD,qBAAqB,MAAM,KAAK,KAA0B;EAC5F,oBAAC,sBAAqD,MAAM,MAAM,QAAzC,YAAY,MAAM,KAAK,KAA0B;EAC1E,oBAAC,oBAAqD,MAAM,MAAM,QAA3C,cAAc,MAAM,KAAK,KAA0B;KAC/D"}
@@ -1 +1 @@
1
- {"version":3,"file":"team-profile-image-section.js","names":[],"sources":["../../../../../src/components-page/account-settings/teams/team-profile-image-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { Team } from \"../../..\";\nimport { ProfileImageEditor } from \"../../../components/profile-image-editor\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function TeamProfileImageSection(props: { team: Team }) {\n const { t } = useTranslation();\n const user = useUser({ or: 'redirect' });\n const updateTeamPermission = user.usePermission(props.team, '$update_team');\n\n if (!updateTeamPermission) {\n return null;\n }\n\n return (\n <Section\n title={t(\"Team profile image\")}\n description={t(\"Upload an image for your team\")}\n >\n <ProfileImageEditor\n user={props.team}\n onProfileImageUrlChange={async (profileImageUrl) => {\n await props.team.update({ profileImageUrl });\n }}\n />\n </Section>\n );\n}\n"],"mappings":";;;;;;;AAUA,SAAgB,wBAAwB,OAAuB;CAC7D,MAAM,EAAE,MAAM,gBAAgB;AAI9B,KAAI,CAHS,QAAQ,EAAE,IAAI,YAAY,CAAC,CACN,cAAc,MAAM,MAAM,eAAe,CAGzE,QAAO;AAGT,QACE,oBAAC;EACC,OAAO,EAAE,qBAAqB;EAC9B,aAAa,EAAE,gCAAgC;YAE/C,oBAAC;GACC,MAAM,MAAM;GACZ,yBAAyB,OAAO,oBAAoB;AAClD,UAAM,MAAM,KAAK,OAAO,EAAE,iBAAiB,CAAC;;IAE9C;GACM"}
1
+ {"version":3,"file":"team-profile-image-section.js","names":[],"sources":["../../../../../src/components-page/account-settings/teams/team-profile-image-section.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 { Team } from \"../../..\";\nimport { ProfileImageEditor } from \"../../../components/profile-image-editor\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { Section } from \"../section\";\n\nexport function TeamProfileImageSection(props: { team: Team }) {\n const { t } = useTranslation();\n const user = useUser({ or: 'redirect' });\n const updateTeamPermission = user.usePermission(props.team, '$update_team');\n\n if (!updateTeamPermission) {\n return null;\n }\n\n return (\n <Section\n title={t(\"Team profile image\")}\n description={t(\"Upload an image for your team\")}\n >\n <ProfileImageEditor\n user={props.team}\n onProfileImageUrlChange={async (profileImageUrl) => {\n await props.team.update({ profileImageUrl });\n }}\n />\n </Section>\n );\n}\n"],"mappings":";;;;;;;AAUA,SAAgB,wBAAwB,OAAuB;CAC7D,MAAM,EAAE,MAAM,gBAAgB;AAI9B,KAAI,CAHS,QAAQ,EAAE,IAAI,YAAY,CAAC,CACN,cAAc,MAAM,MAAM,eAAe,CAGzE,QAAO;AAGT,QACE,oBAAC;EACC,OAAO,EAAE,qBAAqB;EAC9B,aAAa,EAAE,gCAAgC;YAE/C,oBAAC;GACC,MAAM,MAAM;GACZ,yBAAyB,OAAO,oBAAoB;AAClD,UAAM,MAAM,KAAK,OAAO,EAAE,iBAAiB,CAAC;;IAE9C;GACM"}
@@ -1 +1 @@
1
- {"version":3,"file":"team-profile-user-section.js","names":[],"sources":["../../../../../src/components-page/account-settings/teams/team-profile-user-section.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { Team } from \"../../..\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { EditableText } from \"../editable-text\";\nimport { Section } from \"../section\";\n\nexport function TeamUserProfileSection(props: { team: Team }) {\n const { t } = useTranslation();\n const user = useUser({ or: 'redirect' });\n const profile = user.useTeamProfile(props.team);\n\n return (\n <Section\n title={t(\"Team user name\")}\n description={t(\"Overwrite your user display name in this team\")}\n >\n <EditableText\n value={profile.displayName || ''}\n onSave={async (newDisplayName) => {\n await profile.update({ displayName: newDisplayName });\n }}\n />\n </Section>\n );\n}\n"],"mappings":";;;;;;;AAUA,SAAgB,uBAAuB,OAAuB;CAC5D,MAAM,EAAE,MAAM,gBAAgB;CAE9B,MAAM,UADO,QAAQ,EAAE,IAAI,YAAY,CAAC,CACnB,eAAe,MAAM,KAAK;AAE/C,QACE,oBAAC;EACC,OAAO,EAAE,iBAAiB;EAC1B,aAAa,EAAE,gDAAgD;YAE/D,oBAAC;GACC,OAAO,QAAQ,eAAe;GAC9B,QAAQ,OAAO,mBAAmB;AAChC,UAAM,QAAQ,OAAO,EAAE,aAAa,gBAAgB,CAAC;;IAEvD;GACM"}
1
+ {"version":3,"file":"team-profile-user-section.js","names":[],"sources":["../../../../../src/components-page/account-settings/teams/team-profile-user-section.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 { Team } from \"../../..\";\nimport { useUser } from \"../../../lib/hooks\";\nimport { useTranslation } from \"../../../lib/translations\";\nimport { EditableText } from \"../editable-text\";\nimport { Section } from \"../section\";\n\nexport function TeamUserProfileSection(props: { team: Team }) {\n const { t } = useTranslation();\n const user = useUser({ or: 'redirect' });\n const profile = user.useTeamProfile(props.team);\n\n return (\n <Section\n title={t(\"Team user name\")}\n description={t(\"Overwrite your user display name in this team\")}\n >\n <EditableText\n value={profile.displayName || ''}\n onSave={async (newDisplayName) => {\n await profile.update({ displayName: newDisplayName });\n }}\n />\n </Section>\n );\n}\n"],"mappings":";;;;;;;AAUA,SAAgB,uBAAuB,OAAuB;CAC5D,MAAM,EAAE,MAAM,gBAAgB;CAE9B,MAAM,UADO,QAAQ,EAAE,IAAI,YAAY,CAAC,CACnB,eAAe,MAAM,KAAK;AAE/C,QACE,oBAAC;EACC,OAAO,EAAE,iBAAiB;EAC1B,aAAa,EAAE,gDAAgD;YAE/D,oBAAC;GACC,OAAO,QAAQ,eAAe;GAC9B,QAAQ,OAAO,mBAAmB;AAChC,UAAM,QAAQ,OAAO,EAAE,aAAa,gBAAgB,CAAC;;IAEvD;GACM"}
@@ -1,6 +1,6 @@
1
- import * as lucide_react0 from "lucide-react";
2
1
  import React from "react";
3
2
  import * as react_jsx_runtime0 from "react/jsx-runtime";
3
+ import * as lucide_react0 from "lucide-react";
4
4
 
5
5
  //#region src/components-page/account-settings.d.ts
6
6
  declare const iconMap: {
@@ -2,13 +2,14 @@
2
2
 
3
3
  import { runAsynchronouslyWithAlert } from "@hexclave/shared/dist/utils/promises";
4
4
  import { Skeleton, Typography } from "@hexclave/ui";
5
- import { Bell, CirclePlus, Contact, CreditCard, Key, Monitor, Settings, ShieldCheck } from "lucide-react";
6
5
  import React, { Suspense, useEffect, useMemo, useRef, useState } from "react";
7
6
  import { useStackApp, useUser } from "../index.js";
7
+ import { useTranslation } from "../lib/translations.js";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ import { Bell, CirclePlus, Contact, CreditCard, Key, Monitor, Settings, ShieldCheck } from "lucide-react";
8
10
  import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
9
11
  import { SidebarLayout } from "../components/elements/sidebar-layout.js";
10
12
  import { TeamIcon } from "../components/team-icon.js";
11
- import { useTranslation } from "../lib/translations.js";
12
13
  import { ActiveSessionsPage } from "./account-settings/active-sessions/active-sessions-page.js";
13
14
  import { ApiKeysPage } from "./account-settings/api-keys/api-keys-page.js";
14
15
  import { EmailsAndAuthPage } from "./account-settings/email-and-auth/email-and-auth-page.js";
@@ -18,7 +19,6 @@ import { PaymentsPage } from "./account-settings/payments/payments-page.js";
18
19
  import { SettingsPage } from "./account-settings/settings/settings-page.js";
19
20
  import { TeamCreationPage } from "./account-settings/teams/team-creation-page.js";
20
21
  import { TeamPage } from "./account-settings/teams/team-page.js";
21
- import { jsx, jsxs } from "react/jsx-runtime";
22
22
 
23
23
  //#region src/components-page/account-settings.tsx
24
24
  const iconMap = {
@@ -1 +1 @@
1
- {"version":3,"file":"account-settings.js","names":[],"sources":["../../../src/components-page/account-settings.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 { runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { Skeleton, Typography } from '@hexclave/ui';\nimport { Contact, ShieldCheck, Bell, Monitor, Key, Settings, CirclePlus, CreditCard } from 'lucide-react';\nimport React, { Suspense, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useStackApp, useUser } from '..';\nimport { MaybeFullPage } from \"../components/elements/maybe-full-page\";\nimport { SidebarLayout } from '../components/elements/sidebar-layout';\nimport { TeamIcon } from '../components/team-icon';\nimport { useTranslation } from \"../lib/translations\";\nimport { ActiveSessionsPage } from \"./account-settings/active-sessions/active-sessions-page\";\nimport { ApiKeysPage } from \"./account-settings/api-keys/api-keys-page\";\nimport { EmailsAndAuthPage } from './account-settings/email-and-auth/email-and-auth-page';\nimport { NotificationsPage } from './account-settings/notifications/notifications-page';\nimport { ProfilePage } from \"./account-settings/profile-page/profile-page\";\nimport { PaymentsPage } from \"./account-settings/payments/payments-page\";\nimport { SettingsPage } from './account-settings/settings/settings-page';\nimport { TeamCreationPage } from './account-settings/teams/team-creation-page';\nimport { TeamPage } from './account-settings/teams/team-page';\n\nconst iconMap = {\n Contact,\n ShieldCheck,\n Bell,\n Monitor,\n Key,\n Settings,\n CirclePlus,\n CreditCard,\n} as const;\n\nconst Icon = ({ name }: { name: keyof typeof iconMap }) => {\n const LucideIcon = iconMap[name];\n return <LucideIcon className=\"mr-2 h-4 w-4\"/>;\n};\n\nexport function AccountSettings(props: {\n fullPage?: boolean,\n extraItems?: ({\n title: string,\n content: React.ReactNode,\n id: string,\n } & ({\n icon?: React.ReactNode,\n } | {\n iconName?: keyof typeof iconMap,\n }))[],\n mockUser?: {\n displayName?: string,\n profileImageUrl?: string,\n },\n mockApiKeys?: Array<{\n id: string,\n description: string,\n createdAt: string,\n expiresAt?: string,\n manuallyRevokedAt?: string,\n }>,\n mockProject?: {\n config: {\n allowUserApiKeys: boolean,\n clientTeamCreationEnabled: boolean,\n },\n },\n mockSessions?: Array<{\n id: string,\n isCurrentSession: boolean,\n isImpersonation?: boolean,\n createdAt: string,\n lastUsedAt?: string,\n geoInfo?: {\n ip?: string,\n cityName?: string,\n },\n }>,\n}) {\n const { t } = useTranslation();\n const userFromHook = useUser({ or: props.mockUser ? 'return-null' : 'redirect' });\n const stackApp = useStackApp();\n const projectFromHook = stackApp.useProject();\n\n // Use mock data if provided, otherwise use real data\n const user = props.mockUser ? {\n useTeams: () => [], // Mock empty teams for now\n useBilling: () => ({ hasCustomer: false }), // Mock empty billing for now\n } : userFromHook;\n\n const project = props.mockProject || projectFromHook;\n const teams = user?.useTeams() || [];\n const billing = user?.useBilling() || null;\n const teamsKey = useMemo(() => teams.map(team => team.id).join(\"|\"), [teams]);\n const teamsById = useMemo(() => teams, [teamsKey]);\n const userRef = useRef(userFromHook ?? null);\n const userId = userFromHook?.id ?? null;\n const [paymentsAvailability, setPaymentsAvailability] = useState<{\n userHasProducts: boolean,\n teamIdsWithProducts: Set<string>,\n isReady: boolean,\n }>(() => ({\n userHasProducts: false,\n teamIdsWithProducts: new Set<string>(),\n isReady: !!props.mockUser,\n }));\n\n useEffect(() => {\n userRef.current = userFromHook ?? null;\n }, [userFromHook]);\n\n useEffect(() => {\n if (props.mockUser || !userId) {\n return;\n }\n let cancelled = false;\n runAsynchronouslyWithAlert(async () => {\n const currentUser = userRef.current;\n if (!currentUser || currentUser.id !== userId) {\n return;\n }\n const [userProducts, teamsWithProducts] = await Promise.all([\n currentUser.listProducts({ limit: 1 }),\n Promise.all(teamsById.map(async (team) => {\n const isTeamAdmin = await currentUser.hasPermission(team, \"team_admin\");\n if (!isTeamAdmin) {\n return null;\n }\n const teamProducts = await team.listProducts({ limit: 1 });\n const hasTeamProducts = teamProducts.some((product) => product.customerType === \"team\");\n return hasTeamProducts ? team.id : null;\n })),\n ]);\n if (cancelled) {\n return;\n }\n const userHasProducts = userProducts.some((product) => product.customerType === \"user\");\n const teamIdsWithProducts = new Set<string>(teamsWithProducts.filter((id): id is string => id !== null));\n setPaymentsAvailability({\n userHasProducts,\n teamIdsWithProducts,\n isReady: true,\n });\n });\n return () => {\n cancelled = true;\n };\n }, [props.mockUser, teamsById, userId]);\n\n const teamsWithProducts = useMemo(\n () => teamsById.filter(team => paymentsAvailability.teamIdsWithProducts.has(team.id)),\n [paymentsAvailability.teamIdsWithProducts, teamsById],\n );\n const shouldShowPaymentsTab = props.mockUser\n || (paymentsAvailability.isReady\n && (paymentsAvailability.userHasProducts || teamsWithProducts.length > 0));\n\n // If we're not in mock mode and don't have a user, the useUser hook will handle redirect\n if (!props.mockUser && !userFromHook) {\n return null;\n }\n\n return (\n <MaybeFullPage fullPage={!!props.fullPage}>\n <div className=\"self-stretch flex-grow w-full\">\n <SidebarLayout\n items={([\n {\n title: t('My Profile'),\n type: 'item',\n id: 'profile',\n icon: <Icon name=\"Contact\"/>,\n content: <ProfilePage mockUser={props.mockUser}/>,\n },\n {\n title: t('Emails & Auth'),\n type: 'item',\n id: 'auth',\n icon: <Icon name=\"ShieldCheck\"/>,\n content: <Suspense fallback={<EmailsAndAuthPageSkeleton/>}>\n <EmailsAndAuthPage mockMode={!!props.mockUser}/>\n </Suspense>,\n },\n {\n title: t('Notifications'),\n type: 'item',\n id: 'notifications',\n icon: <Icon name=\"Bell\"/>,\n content: <Suspense fallback={<NotificationsPageSkeleton/>}>\n <NotificationsPage/>\n </Suspense>,\n },\n {\n title: t('Active Sessions'),\n type: 'item',\n id: 'sessions',\n icon: <Icon name=\"Monitor\"/>,\n content: <Suspense fallback={<ActiveSessionsPageSkeleton/>}>\n <ActiveSessionsPage mockSessions={props.mockSessions} mockMode={!!props.mockUser}/>\n </Suspense>,\n },\n ...(project.config.allowUserApiKeys ? [{\n title: t('API Keys'),\n type: 'item',\n id: 'api-keys',\n icon: <Icon name=\"Key\" />,\n content: <Suspense fallback={<ApiKeysPageSkeleton/>}>\n <ApiKeysPage mockApiKeys={props.mockApiKeys} mockMode={!!props.mockUser} />\n </Suspense>,\n }] as const : []),\n ...(shouldShowPaymentsTab ? [{\n title: t('Payments'),\n type: 'item',\n id: 'payments',\n icon: <Icon name=\"CreditCard\" />,\n content: <Suspense fallback={<PaymentsPageSkeleton/>}>\n <PaymentsPage\n mockMode={!!props.mockUser}\n allowPersonal={paymentsAvailability.userHasProducts}\n availableTeams={teamsWithProducts}\n />\n </Suspense>,\n }] as const : []),\n {\n title: t('Settings'),\n type: 'item',\n id: 'settings',\n icon: <Icon name=\"Settings\"/>,\n content: <SettingsPage mockMode={!!props.mockUser}/>,\n },\n ...(props.extraItems?.map(item => ({\n title: item.title,\n type: 'item',\n id: item.id,\n icon: (() => {\n const iconName = (item as any).iconName as keyof typeof iconMap | undefined;\n if (iconName) {\n return <Icon name={iconName}/>;\n } else if ((item as any).icon) {\n return (item as any).icon;\n }\n return null;\n })(),\n content: item.content,\n } as const)) || []),\n ...(teams.length > 0 || project.config.clientTeamCreationEnabled) ? [{\n title: t('Teams'),\n type: 'divider',\n }] as const : [],\n ...teams.map(team => ({\n title: <div className='flex gap-2 items-center w-full'>\n <TeamIcon team={team}/>\n <Typography className=\"max-w-[320px] md:w-[90%] truncate\">{team.displayName}</Typography>\n </div>,\n type: 'item',\n id: `team-${team.id}`,\n content: <Suspense fallback={<TeamPageSkeleton/>}>\n <TeamPage team={team}/>\n </Suspense>,\n } as const)),\n ...project.config.clientTeamCreationEnabled ? [{\n title: t('Create a team'),\n icon: <Icon name=\"CirclePlus\"/>,\n type: 'item',\n id: 'team-creation',\n content: <Suspense fallback={<TeamCreationSkeleton/>}>\n <TeamCreationPage mockMode={!!props.mockUser} />\n </Suspense>,\n }] as const : [],\n ] as const).filter((p) => p.type === 'divider' || (p as any).content )}\n title={t(\"Account Settings\")}\n />\n </div>\n </MaybeFullPage>\n );\n}\n\nfunction PageLayout(props: { children: React.ReactNode }) {\n return (\n <div className='flex flex-col gap-6'>\n {props.children}\n </div>\n );\n}\n\nfunction EmailsAndAuthPageSkeleton() {\n return <PageLayout>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n </PageLayout>;\n}\n\nfunction ActiveSessionsPageSkeleton() {\n return <PageLayout>\n <Skeleton className=\"h-6 w-48 mb-2\"/>\n <Skeleton className=\"h-4 w-full mb-4\"/>\n <Skeleton className=\"h-[200px] w-full mt-1 rounded-md\"/>\n </PageLayout>;\n}\n\nfunction ApiKeysPageSkeleton() {\n return <PageLayout>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-[200px] w-full mt-1 rounded-md\"/>\n </PageLayout>;\n}\n\nfunction PaymentsPageSkeleton() {\n return <PageLayout>\n <Skeleton className=\"h-6 w-48 mb-2\"/>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-[200px] w-full mt-1 rounded-md\"/>\n </PageLayout>;\n}\n\nfunction TeamPageSkeleton() {\n return <PageLayout>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-[200px] w-full mt-1 rounded-md\"/>\n </PageLayout>;\n}\n\nfunction TeamCreationSkeleton() {\n return <PageLayout>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n </PageLayout>;\n}\n\nfunction NotificationsPageSkeleton() {\n return <PageLayout>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n </PageLayout>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"account-settings.js","names":[],"sources":["../../../src/components-page/account-settings.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 { runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { Skeleton, Typography } from '@hexclave/ui';\nimport { Contact, ShieldCheck, Bell, Monitor, Key, Settings, CirclePlus, CreditCard } from 'lucide-react';\nimport React, { Suspense, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useStackApp, useUser } from '..';\nimport { MaybeFullPage } from \"../components/elements/maybe-full-page\";\nimport { SidebarLayout } from '../components/elements/sidebar-layout';\nimport { TeamIcon } from '../components/team-icon';\nimport { useTranslation } from \"../lib/translations\";\nimport { ActiveSessionsPage } from \"./account-settings/active-sessions/active-sessions-page\";\nimport { ApiKeysPage } from \"./account-settings/api-keys/api-keys-page\";\nimport { EmailsAndAuthPage } from './account-settings/email-and-auth/email-and-auth-page';\nimport { NotificationsPage } from './account-settings/notifications/notifications-page';\nimport { ProfilePage } from \"./account-settings/profile-page/profile-page\";\nimport { PaymentsPage } from \"./account-settings/payments/payments-page\";\nimport { SettingsPage } from './account-settings/settings/settings-page';\nimport { TeamCreationPage } from './account-settings/teams/team-creation-page';\nimport { TeamPage } from './account-settings/teams/team-page';\n\nconst iconMap = {\n Contact,\n ShieldCheck,\n Bell,\n Monitor,\n Key,\n Settings,\n CirclePlus,\n CreditCard,\n} as const;\n\nconst Icon = ({ name }: { name: keyof typeof iconMap }) => {\n const LucideIcon = iconMap[name];\n return <LucideIcon className=\"mr-2 h-4 w-4\"/>;\n};\n\nexport function AccountSettings(props: {\n fullPage?: boolean,\n extraItems?: ({\n title: string,\n content: React.ReactNode,\n id: string,\n } & ({\n icon?: React.ReactNode,\n } | {\n iconName?: keyof typeof iconMap,\n }))[],\n mockUser?: {\n displayName?: string,\n profileImageUrl?: string,\n },\n mockApiKeys?: Array<{\n id: string,\n description: string,\n createdAt: string,\n expiresAt?: string,\n manuallyRevokedAt?: string,\n }>,\n mockProject?: {\n config: {\n allowUserApiKeys: boolean,\n clientTeamCreationEnabled: boolean,\n },\n },\n mockSessions?: Array<{\n id: string,\n isCurrentSession: boolean,\n isImpersonation?: boolean,\n createdAt: string,\n lastUsedAt?: string,\n geoInfo?: {\n ip?: string,\n cityName?: string,\n },\n }>,\n}) {\n const { t } = useTranslation();\n const userFromHook = useUser({ or: props.mockUser ? 'return-null' : 'redirect' });\n const hexclaveApp = useStackApp();\n const projectFromHook = hexclaveApp.useProject();\n\n // Use mock data if provided, otherwise use real data\n const user = props.mockUser ? {\n useTeams: () => [], // Mock empty teams for now\n useBilling: () => ({ hasCustomer: false }), // Mock empty billing for now\n } : userFromHook;\n\n const project = props.mockProject || projectFromHook;\n const teams = user?.useTeams() || [];\n const billing = user?.useBilling() || null;\n const teamsKey = useMemo(() => teams.map(team => team.id).join(\"|\"), [teams]);\n const teamsById = useMemo(() => teams, [teamsKey]);\n const userRef = useRef(userFromHook ?? null);\n const userId = userFromHook?.id ?? null;\n const [paymentsAvailability, setPaymentsAvailability] = useState<{\n userHasProducts: boolean,\n teamIdsWithProducts: Set<string>,\n isReady: boolean,\n }>(() => ({\n userHasProducts: false,\n teamIdsWithProducts: new Set<string>(),\n isReady: !!props.mockUser,\n }));\n\n useEffect(() => {\n userRef.current = userFromHook ?? null;\n }, [userFromHook]);\n\n useEffect(() => {\n if (props.mockUser || !userId) {\n return;\n }\n let cancelled = false;\n runAsynchronouslyWithAlert(async () => {\n const currentUser = userRef.current;\n if (!currentUser || currentUser.id !== userId) {\n return;\n }\n const [userProducts, teamsWithProducts] = await Promise.all([\n currentUser.listProducts({ limit: 1 }),\n Promise.all(teamsById.map(async (team) => {\n const isTeamAdmin = await currentUser.hasPermission(team, \"team_admin\");\n if (!isTeamAdmin) {\n return null;\n }\n const teamProducts = await team.listProducts({ limit: 1 });\n const hasTeamProducts = teamProducts.some((product) => product.customerType === \"team\");\n return hasTeamProducts ? team.id : null;\n })),\n ]);\n if (cancelled) {\n return;\n }\n const userHasProducts = userProducts.some((product) => product.customerType === \"user\");\n const teamIdsWithProducts = new Set<string>(teamsWithProducts.filter((id): id is string => id !== null));\n setPaymentsAvailability({\n userHasProducts,\n teamIdsWithProducts,\n isReady: true,\n });\n });\n return () => {\n cancelled = true;\n };\n }, [props.mockUser, teamsById, userId]);\n\n const teamsWithProducts = useMemo(\n () => teamsById.filter(team => paymentsAvailability.teamIdsWithProducts.has(team.id)),\n [paymentsAvailability.teamIdsWithProducts, teamsById],\n );\n const shouldShowPaymentsTab = props.mockUser\n || (paymentsAvailability.isReady\n && (paymentsAvailability.userHasProducts || teamsWithProducts.length > 0));\n\n // If we're not in mock mode and don't have a user, the useUser hook will handle redirect\n if (!props.mockUser && !userFromHook) {\n return null;\n }\n\n return (\n <MaybeFullPage fullPage={!!props.fullPage}>\n <div className=\"self-stretch flex-grow w-full\">\n <SidebarLayout\n items={([\n {\n title: t('My Profile'),\n type: 'item',\n id: 'profile',\n icon: <Icon name=\"Contact\"/>,\n content: <ProfilePage mockUser={props.mockUser}/>,\n },\n {\n title: t('Emails & Auth'),\n type: 'item',\n id: 'auth',\n icon: <Icon name=\"ShieldCheck\"/>,\n content: <Suspense fallback={<EmailsAndAuthPageSkeleton/>}>\n <EmailsAndAuthPage mockMode={!!props.mockUser}/>\n </Suspense>,\n },\n {\n title: t('Notifications'),\n type: 'item',\n id: 'notifications',\n icon: <Icon name=\"Bell\"/>,\n content: <Suspense fallback={<NotificationsPageSkeleton/>}>\n <NotificationsPage/>\n </Suspense>,\n },\n {\n title: t('Active Sessions'),\n type: 'item',\n id: 'sessions',\n icon: <Icon name=\"Monitor\"/>,\n content: <Suspense fallback={<ActiveSessionsPageSkeleton/>}>\n <ActiveSessionsPage mockSessions={props.mockSessions} mockMode={!!props.mockUser}/>\n </Suspense>,\n },\n ...(project.config.allowUserApiKeys ? [{\n title: t('API Keys'),\n type: 'item',\n id: 'api-keys',\n icon: <Icon name=\"Key\" />,\n content: <Suspense fallback={<ApiKeysPageSkeleton/>}>\n <ApiKeysPage mockApiKeys={props.mockApiKeys} mockMode={!!props.mockUser} />\n </Suspense>,\n }] as const : []),\n ...(shouldShowPaymentsTab ? [{\n title: t('Payments'),\n type: 'item',\n id: 'payments',\n icon: <Icon name=\"CreditCard\" />,\n content: <Suspense fallback={<PaymentsPageSkeleton/>}>\n <PaymentsPage\n mockMode={!!props.mockUser}\n allowPersonal={paymentsAvailability.userHasProducts}\n availableTeams={teamsWithProducts}\n />\n </Suspense>,\n }] as const : []),\n {\n title: t('Settings'),\n type: 'item',\n id: 'settings',\n icon: <Icon name=\"Settings\"/>,\n content: <SettingsPage mockMode={!!props.mockUser}/>,\n },\n ...(props.extraItems?.map(item => ({\n title: item.title,\n type: 'item',\n id: item.id,\n icon: (() => {\n const iconName = (item as any).iconName as keyof typeof iconMap | undefined;\n if (iconName) {\n return <Icon name={iconName}/>;\n } else if ((item as any).icon) {\n return (item as any).icon;\n }\n return null;\n })(),\n content: item.content,\n } as const)) || []),\n ...(teams.length > 0 || project.config.clientTeamCreationEnabled) ? [{\n title: t('Teams'),\n type: 'divider',\n }] as const : [],\n ...teams.map(team => ({\n title: <div className='flex gap-2 items-center w-full'>\n <TeamIcon team={team}/>\n <Typography className=\"max-w-[320px] md:w-[90%] truncate\">{team.displayName}</Typography>\n </div>,\n type: 'item',\n id: `team-${team.id}`,\n content: <Suspense fallback={<TeamPageSkeleton/>}>\n <TeamPage team={team}/>\n </Suspense>,\n } as const)),\n ...project.config.clientTeamCreationEnabled ? [{\n title: t('Create a team'),\n icon: <Icon name=\"CirclePlus\"/>,\n type: 'item',\n id: 'team-creation',\n content: <Suspense fallback={<TeamCreationSkeleton/>}>\n <TeamCreationPage mockMode={!!props.mockUser} />\n </Suspense>,\n }] as const : [],\n ] as const).filter((p) => p.type === 'divider' || (p as any).content )}\n title={t(\"Account Settings\")}\n />\n </div>\n </MaybeFullPage>\n );\n}\n\nfunction PageLayout(props: { children: React.ReactNode }) {\n return (\n <div className='flex flex-col gap-6'>\n {props.children}\n </div>\n );\n}\n\nfunction EmailsAndAuthPageSkeleton() {\n return <PageLayout>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n </PageLayout>;\n}\n\nfunction ActiveSessionsPageSkeleton() {\n return <PageLayout>\n <Skeleton className=\"h-6 w-48 mb-2\"/>\n <Skeleton className=\"h-4 w-full mb-4\"/>\n <Skeleton className=\"h-[200px] w-full mt-1 rounded-md\"/>\n </PageLayout>;\n}\n\nfunction ApiKeysPageSkeleton() {\n return <PageLayout>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-[200px] w-full mt-1 rounded-md\"/>\n </PageLayout>;\n}\n\nfunction PaymentsPageSkeleton() {\n return <PageLayout>\n <Skeleton className=\"h-6 w-48 mb-2\"/>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-[200px] w-full mt-1 rounded-md\"/>\n </PageLayout>;\n}\n\nfunction TeamPageSkeleton() {\n return <PageLayout>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-[200px] w-full mt-1 rounded-md\"/>\n </PageLayout>;\n}\n\nfunction TeamCreationSkeleton() {\n return <PageLayout>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n </PageLayout>;\n}\n\nfunction NotificationsPageSkeleton() {\n return <PageLayout>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n <Skeleton className=\"h-9 w-full mt-1\"/>\n </PageLayout>;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth-page.d.ts","names":[],"sources":["../../../src/components-page/auth-page.tsx"],"mappings":";;;KAsBK,KAAA;EACH,gBAAA;EACA,QAAA;EACA,QAAA;EACA,IAAA;EACA,iBAAA;EACA,SAAA,GAAY,KAAA,CAAM,SAAA;EAClB,WAAA;IACE,MAAA;MACE,aAAA;MACA,iBAAA;MACA,cAAA;MACA,gBAAA;MACA,cAAA;QACE,EAAA;MAAA;IAAA;EAAA;AAAA;AAAA,iBAMQ,QAAA,CAAS,KAAA,EAAO,KAAA,GAAK,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"auth-page.d.ts","names":[],"sources":["../../../src/components-page/auth-page.tsx"],"mappings":";;;KA2BK,KAAA;EACH,gBAAA;EACA,QAAA;EACA,QAAA;EACA,IAAA;EACA,iBAAA;EACA,SAAA,GAAY,KAAA,CAAM,SAAA;EAClB,WAAA;IACE,MAAA;MACE,aAAA;MACA,iBAAA;MACA,cAAA;MACA,gBAAA;MACA,cAAA;QACE,EAAA;MAAA;IAAA;EAAA;AAAA;AAAA,iBAWQ,QAAA,CAAS,KAAA,EAAO,KAAA,GAAK,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1,16 +1,21 @@
1
1
  'use client';
2
2
 
3
+ import { captureError } from "@hexclave/shared/dist/utils/errors";
3
4
  import { runAsynchronously } from "@hexclave/shared/dist/utils/promises";
4
5
  import { Skeleton, Tabs, TabsContent, TabsList, TabsTrigger, Typography, cn } from "@hexclave/ui";
5
- import { Suspense } from "react";
6
+ import { Suspense, useMemo } from "react";
6
7
  import { useStackApp, useUser } from "../index.js";
7
- import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
8
8
  import { useTranslation } from "../lib/translations.js";
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
10
+ import { KnownError } from "@hexclave/shared";
11
+ import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
12
+ import { use } from "@hexclave/shared/dist/utils/react";
10
13
  import { CredentialSignIn } from "../components/credential-sign-in.js";
11
14
  import { CredentialSignUp } from "../components/credential-sign-up.js";
12
15
  import { SeparatorWithText } from "../components/elements/separator-with-text.js";
13
16
  import { StyledLink } from "../components/link.js";
17
+ import { KnownErrorMessageCard } from "../components/message-cards/known-error-message-card.js";
18
+ import { MessageCard as MessageCard$1 } from "../components/message-cards/message-card.js";
14
19
  import { MagicLinkSignIn } from "../components/magic-link-sign-in.js";
15
20
  import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card.js";
16
21
  import { OAuthButtonGroup } from "../components/oauth-button-group.js";
@@ -47,16 +52,56 @@ function Fallback(props) {
47
52
  })
48
53
  });
49
54
  }
55
+ function AutomaticRedirect(props) {
56
+ const hexclaveApp = useStackApp();
57
+ const { t } = useTranslation();
58
+ const redirectResult = use(useMemo(async () => {
59
+ try {
60
+ await (props.isRestricted ? hexclaveApp.redirectToOnboarding({ replace: true }) : props.type === "sign-in" ? hexclaveApp.redirectToAfterSignIn({ replace: true }) : hexclaveApp.redirectToAfterSignUp({ replace: true }));
61
+ return { status: "success" };
62
+ } catch (e) {
63
+ if (KnownError.isKnownError(e)) return {
64
+ status: "known-error",
65
+ error: e
66
+ };
67
+ captureError("<AuthPage automaticRedirect />", e);
68
+ return { status: "unknown-error" };
69
+ }
70
+ }, [
71
+ hexclaveApp,
72
+ props.isRestricted,
73
+ props.type
74
+ ]));
75
+ if (redirectResult.status === "known-error") return /* @__PURE__ */ jsx(KnownErrorMessageCard, {
76
+ error: redirectResult.error,
77
+ fullPage: props.fullPage
78
+ });
79
+ if (redirectResult.status === "unknown-error") return /* @__PURE__ */ jsx(PredefinedMessageCard, {
80
+ type: "unknownError",
81
+ fullPage: props.fullPage
82
+ });
83
+ return /* @__PURE__ */ jsx(MessageCard$1, {
84
+ title: t("Redirecting..."),
85
+ fullPage: props.fullPage
86
+ });
87
+ }
50
88
  function Inner(props) {
51
- const stackApp = useStackApp();
89
+ const hexclaveApp = useStackApp();
52
90
  const user = useUser({ includeRestricted: true });
53
- const projectFromHook = stackApp.useProject();
91
+ const projectFromHook = hexclaveApp.useProject();
54
92
  const project = props.mockProject || projectFromHook;
55
93
  const { t } = useTranslation();
56
- if (props.automaticRedirect && user && !props.mockProject) {
57
- runAsynchronously(user.isRestricted ? stackApp.redirectToOnboarding({ replace: true }) : props.type === "sign-in" ? stackApp.redirectToAfterSignIn({ replace: true }) : stackApp.redirectToAfterSignUp({ replace: true }));
58
- return null;
59
- }
94
+ if (props.automaticRedirect && user && !props.mockProject) return /* @__PURE__ */ jsx(Suspense, {
95
+ fallback: /* @__PURE__ */ jsx(MessageCard$1, {
96
+ title: t("Redirecting..."),
97
+ fullPage: props.fullPage
98
+ }),
99
+ children: /* @__PURE__ */ jsx(AutomaticRedirect, {
100
+ fullPage: props.fullPage,
101
+ isRestricted: user.isRestricted,
102
+ type: props.type
103
+ })
104
+ });
60
105
  if (user && !props.mockProject && !props.automaticRedirect) return /* @__PURE__ */ jsx(PredefinedMessageCard, {
61
106
  type: "signedIn",
62
107
  fullPage: props.fullPage
@@ -87,9 +132,9 @@ function Inner(props) {
87
132
  t("Don't have an account?"),
88
133
  " ",
89
134
  /* @__PURE__ */ jsx(StyledLink, {
90
- href: stackApp.urls.signUp,
135
+ href: hexclaveApp.urls.signUp,
91
136
  onClick: (e) => {
92
- runAsynchronously(stackApp.redirectToSignUp());
137
+ runAsynchronously(hexclaveApp.redirectToSignUp());
93
138
  e.preventDefault();
94
139
  },
95
140
  children: t("Sign up")
@@ -98,9 +143,9 @@ function Inner(props) {
98
143
  t("Already have an account?"),
99
144
  " ",
100
145
  /* @__PURE__ */ jsx(StyledLink, {
101
- href: stackApp.urls.signIn,
146
+ href: hexclaveApp.urls.signIn,
102
147
  onClick: (e) => {
103
- runAsynchronously(stackApp.redirectToSignIn());
148
+ runAsynchronously(hexclaveApp.redirectToSignIn());
104
149
  e.preventDefault();
105
150
  },
106
151
  children: t("Sign in")
@@ -1 +1 @@
1
- {"version":3,"file":"auth-page.js","names":[],"sources":["../../../src/components-page/auth-page.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 { runAsynchronously } from '@hexclave/shared/dist/utils/promises';\nimport { Skeleton, Tabs, TabsContent, TabsList, TabsTrigger, Typography, cn } from '@hexclave/ui';\nimport { Suspense } from 'react';\nimport { useStackApp, useUser } from '..';\nimport { CredentialSignIn } from '../components/credential-sign-in';\nimport { CredentialSignUp } from '../components/credential-sign-up';\nimport { MaybeFullPage } from '../components/elements/maybe-full-page';\nimport { SeparatorWithText } from '../components/elements/separator-with-text';\nimport { StyledLink } from '../components/link';\nimport { MagicLinkSignIn } from '../components/magic-link-sign-in';\nimport { PredefinedMessageCard } from '../components/message-cards/predefined-message-card';\nimport { OAuthButtonGroup } from '../components/oauth-button-group';\nimport { PasskeyButton } from '../components/passkey-button';\nimport { useTranslation } from '../lib/translations';\n\ntype Props = {\n noPasswordRepeat?: boolean,\n firstTab?: 'magic-link' | 'password',\n fullPage?: boolean,\n type: 'sign-in' | 'sign-up',\n automaticRedirect?: boolean,\n extraInfo?: React.ReactNode,\n mockProject?: {\n config: {\n signUpEnabled: boolean,\n credentialEnabled: boolean,\n passkeyEnabled: boolean,\n magicLinkEnabled: boolean,\n oauthProviders: {\n id: string,\n }[],\n },\n },\n}\n\nexport function AuthPage(props: Props) {\n return <Suspense fallback={<Fallback {...props} />}>\n <Inner {...props} />\n </Suspense>;\n}\n\nfunction Fallback(props: Props) {\n return (\n <MaybeFullPage fullPage={!!props.fullPage}>\n <div className='stack-scope flex flex-col items-stretch' style={{ maxWidth: '380px', flexBasis: '380px', padding: props.fullPage ? '1rem' : 0 }}>\n <div className=\"text-center mb-6 flex flex-col\">\n <Skeleton className='h-9 w-2/3 self-center' />\n\n <Skeleton className='h-3 w-16 mt-8' />\n <Skeleton className='h-9 w-full mt-1' />\n\n <Skeleton className='h-3 w-24 mt-2' />\n <Skeleton className='h-9 w-full mt-1' />\n\n <Skeleton className='h-9 w-full mt-6' />\n </div>\n </div>\n </MaybeFullPage>\n );\n}\n\nfunction Inner(props: Props) {\n const stackApp = useStackApp();\n const user = useUser({ includeRestricted: true });\n const projectFromHook = stackApp.useProject();\n const project = props.mockProject || projectFromHook;\n const { t } = useTranslation();\n\n if (props.automaticRedirect && user && !props.mockProject) {\n runAsynchronously(\n user.isRestricted\n ? stackApp.redirectToOnboarding({ replace: true })\n : props.type === 'sign-in'\n ? stackApp.redirectToAfterSignIn({ replace: true })\n : stackApp.redirectToAfterSignUp({ replace: true })\n );\n return null;\n }\n\n if (user && !props.mockProject && !props.automaticRedirect) {\n return <PredefinedMessageCard type='signedIn' fullPage={props.fullPage} />;\n }\n\n if (props.type === 'sign-up' && !project.config.signUpEnabled) {\n return <PredefinedMessageCard type='signUpDisabled' fullPage={props.fullPage} />;\n }\n\n const hasOAuthProviders = project.config.oauthProviders.length > 0;\n const hasPasskey = (project.config.passkeyEnabled === true && props.type === \"sign-in\");\n const enableSeparator = (project.config.credentialEnabled || project.config.magicLinkEnabled) && (hasOAuthProviders || hasPasskey);\n\n return (\n <MaybeFullPage fullPage={!!props.fullPage}>\n <div className='stack-scope flex flex-col items-stretch' style={{ maxWidth: '380px', flexBasis: '380px', padding: props.fullPage ? '1rem' : 0 }}>\n <div className=\"text-center mb-6\">\n <Typography type='h2'>\n {props.type === 'sign-in' ? t(\"Sign in to your account\") : t(\"Create a new account\")}\n </Typography>\n {props.type === 'sign-in' ? (\n project.config.signUpEnabled && (\n <Typography>\n {t(\"Don't have an account?\")}{\" \"}\n <StyledLink href={stackApp.urls.signUp} onClick={(e) => {\n runAsynchronously(stackApp.redirectToSignUp());\n e.preventDefault();\n }}>{t(\"Sign up\")}</StyledLink>\n </Typography>\n )\n ) : (\n <Typography>\n {t(\"Already have an account?\")}{\" \"}\n <StyledLink href={stackApp.urls.signIn} onClick={(e) => {\n runAsynchronously(stackApp.redirectToSignIn());\n e.preventDefault();\n }}>{t(\"Sign in\")}</StyledLink>\n </Typography>\n )}\n </div>\n {(hasOAuthProviders || hasPasskey) && (\n <div className='gap-4 flex flex-col items-stretch stack-scope'>\n {hasOAuthProviders && <OAuthButtonGroup type={props.type} mockProject={props.mockProject} />}\n {hasPasskey && <PasskeyButton type={props.type} />}\n </div>\n )}\n\n {enableSeparator && <SeparatorWithText text={t('Or continue with')} />}\n {project.config.credentialEnabled && project.config.magicLinkEnabled ? (\n <Tabs defaultValue={props.firstTab || 'magic-link'}>\n <TabsList className={cn('w-full mb-2', {\n 'flex-row-reverse': props.firstTab === 'password'\n })}>\n <TabsTrigger value='magic-link' className='flex-1'>{t(\"Email\")}</TabsTrigger>\n <TabsTrigger value='password' className='flex-1'>{t(\"Email & Password\")}</TabsTrigger>\n </TabsList>\n <TabsContent value='magic-link'>\n <MagicLinkSignIn />\n </TabsContent>\n <TabsContent value='password'>\n {props.type === 'sign-up' ? <CredentialSignUp noPasswordRepeat={props.noPasswordRepeat} /> : <CredentialSignIn />}\n </TabsContent>\n </Tabs>\n ) : project.config.credentialEnabled ? (\n props.type === 'sign-up' ? <CredentialSignUp noPasswordRepeat={props.noPasswordRepeat} /> : <CredentialSignIn />\n ) : project.config.magicLinkEnabled ? (\n <MagicLinkSignIn />\n ) : !(hasOAuthProviders || hasPasskey) ? <Typography variant={\"destructive\"} className=\"text-center\">{t(\"No authentication method enabled.\")}</Typography> : null}\n {props.extraInfo && (\n <div className={cn('flex flex-col items-center text-center text-sm text-gray-500', {\n 'mt-2': project.config.credentialEnabled || project.config.magicLinkEnabled,\n 'mt-6': !(project.config.credentialEnabled || project.config.magicLinkEnabled),\n })}>\n <div>{props.extraInfo}</div>\n </div>\n )}\n </div>\n </MaybeFullPage>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"auth-page.js","names":["MessageCard"],"sources":["../../../src/components-page/auth-page.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 { use } from '@hexclave/shared/dist/utils/react';\nimport { Skeleton, Tabs, TabsContent, TabsList, TabsTrigger, Typography, cn } from '@hexclave/ui';\nimport { Suspense, useMemo } from 'react';\nimport { useStackApp, useUser } from '..';\nimport { CredentialSignIn } from '../components/credential-sign-in';\nimport { CredentialSignUp } from '../components/credential-sign-up';\nimport { MaybeFullPage } from '../components/elements/maybe-full-page';\nimport { SeparatorWithText } from '../components/elements/separator-with-text';\nimport { StyledLink } from '../components/link';\nimport { KnownErrorMessageCard } from '../components/message-cards/known-error-message-card';\nimport { MessageCard } from '../components/message-cards/message-card';\nimport { MagicLinkSignIn } from '../components/magic-link-sign-in';\nimport { PredefinedMessageCard } from '../components/message-cards/predefined-message-card';\nimport { OAuthButtonGroup } from '../components/oauth-button-group';\nimport { PasskeyButton } from '../components/passkey-button';\nimport { useTranslation } from '../lib/translations';\n\ntype Props = {\n noPasswordRepeat?: boolean,\n firstTab?: 'magic-link' | 'password',\n fullPage?: boolean,\n type: 'sign-in' | 'sign-up',\n automaticRedirect?: boolean,\n extraInfo?: React.ReactNode,\n mockProject?: {\n config: {\n signUpEnabled: boolean,\n credentialEnabled: boolean,\n passkeyEnabled: boolean,\n magicLinkEnabled: boolean,\n oauthProviders: {\n id: string,\n }[],\n },\n },\n}\n\ntype AutomaticRedirectResult =\n | { status: \"success\" }\n | { status: \"known-error\", error: KnownError }\n | { status: \"unknown-error\" };\n\nexport function AuthPage(props: Props) {\n return <Suspense fallback={<Fallback {...props} />}>\n <Inner {...props} />\n </Suspense>;\n}\n\nfunction Fallback(props: Props) {\n return (\n <MaybeFullPage fullPage={!!props.fullPage}>\n <div className='stack-scope flex flex-col items-stretch' style={{ maxWidth: '380px', flexBasis: '380px', padding: props.fullPage ? '1rem' : 0 }}>\n <div className=\"text-center mb-6 flex flex-col\">\n <Skeleton className='h-9 w-2/3 self-center' />\n\n <Skeleton className='h-3 w-16 mt-8' />\n <Skeleton className='h-9 w-full mt-1' />\n\n <Skeleton className='h-3 w-24 mt-2' />\n <Skeleton className='h-9 w-full mt-1' />\n\n <Skeleton className='h-9 w-full mt-6' />\n </div>\n </div>\n </MaybeFullPage>\n );\n}\n\nfunction AutomaticRedirect(props: {\n fullPage?: boolean,\n isRestricted: boolean,\n type: 'sign-in' | 'sign-up',\n}) {\n const hexclaveApp = useStackApp();\n const { t } = useTranslation();\n const redirectResultPromise = useMemo(async (): Promise<AutomaticRedirectResult> => {\n try {\n await (\n props.isRestricted\n ? hexclaveApp.redirectToOnboarding({ replace: true })\n : props.type === 'sign-in'\n ? hexclaveApp.redirectToAfterSignIn({ replace: true })\n : hexclaveApp.redirectToAfterSignUp({ replace: true })\n );\n return { status: \"success\" };\n } catch (e) {\n if (KnownError.isKnownError(e)) {\n return { status: \"known-error\", error: e };\n }\n captureError(\"<AuthPage automaticRedirect />\", e);\n return { status: \"unknown-error\" };\n }\n }, [hexclaveApp, props.isRestricted, props.type]);\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={t(\"Redirecting...\")} fullPage={props.fullPage} />;\n}\n\nfunction Inner(props: Props) {\n const hexclaveApp = useStackApp();\n const user = useUser({ includeRestricted: true });\n const projectFromHook = hexclaveApp.useProject();\n const project = props.mockProject || projectFromHook;\n const { t } = useTranslation();\n\n if (props.automaticRedirect && user && !props.mockProject) {\n return <Suspense fallback={<MessageCard title={t(\"Redirecting...\")} fullPage={props.fullPage} />}>\n <AutomaticRedirect fullPage={props.fullPage} isRestricted={user.isRestricted} type={props.type} />\n </Suspense>;\n }\n\n if (user && !props.mockProject && !props.automaticRedirect) {\n return <PredefinedMessageCard type='signedIn' fullPage={props.fullPage} />;\n }\n\n if (props.type === 'sign-up' && !project.config.signUpEnabled) {\n return <PredefinedMessageCard type='signUpDisabled' fullPage={props.fullPage} />;\n }\n\n const hasOAuthProviders = project.config.oauthProviders.length > 0;\n const hasPasskey = (project.config.passkeyEnabled === true && props.type === \"sign-in\");\n const enableSeparator = (project.config.credentialEnabled || project.config.magicLinkEnabled) && (hasOAuthProviders || hasPasskey);\n\n return (\n <MaybeFullPage fullPage={!!props.fullPage}>\n <div className='stack-scope flex flex-col items-stretch' style={{ maxWidth: '380px', flexBasis: '380px', padding: props.fullPage ? '1rem' : 0 }}>\n <div className=\"text-center mb-6\">\n <Typography type='h2'>\n {props.type === 'sign-in' ? t(\"Sign in to your account\") : t(\"Create a new account\")}\n </Typography>\n {props.type === 'sign-in' ? (\n project.config.signUpEnabled && (\n <Typography>\n {t(\"Don't have an account?\")}{\" \"}\n <StyledLink href={hexclaveApp.urls.signUp} onClick={(e) => {\n runAsynchronously(hexclaveApp.redirectToSignUp());\n e.preventDefault();\n }}>{t(\"Sign up\")}</StyledLink>\n </Typography>\n )\n ) : (\n <Typography>\n {t(\"Already have an account?\")}{\" \"}\n <StyledLink href={hexclaveApp.urls.signIn} onClick={(e) => {\n runAsynchronously(hexclaveApp.redirectToSignIn());\n e.preventDefault();\n }}>{t(\"Sign in\")}</StyledLink>\n </Typography>\n )}\n </div>\n {(hasOAuthProviders || hasPasskey) && (\n <div className='gap-4 flex flex-col items-stretch stack-scope'>\n {hasOAuthProviders && <OAuthButtonGroup type={props.type} mockProject={props.mockProject} />}\n {hasPasskey && <PasskeyButton type={props.type} />}\n </div>\n )}\n\n {enableSeparator && <SeparatorWithText text={t('Or continue with')} />}\n {project.config.credentialEnabled && project.config.magicLinkEnabled ? (\n <Tabs defaultValue={props.firstTab || 'magic-link'}>\n <TabsList className={cn('w-full mb-2', {\n 'flex-row-reverse': props.firstTab === 'password'\n })}>\n <TabsTrigger value='magic-link' className='flex-1'>{t(\"Email\")}</TabsTrigger>\n <TabsTrigger value='password' className='flex-1'>{t(\"Email & Password\")}</TabsTrigger>\n </TabsList>\n <TabsContent value='magic-link'>\n <MagicLinkSignIn />\n </TabsContent>\n <TabsContent value='password'>\n {props.type === 'sign-up' ? <CredentialSignUp noPasswordRepeat={props.noPasswordRepeat} /> : <CredentialSignIn />}\n </TabsContent>\n </Tabs>\n ) : project.config.credentialEnabled ? (\n props.type === 'sign-up' ? <CredentialSignUp noPasswordRepeat={props.noPasswordRepeat} /> : <CredentialSignIn />\n ) : project.config.magicLinkEnabled ? (\n <MagicLinkSignIn />\n ) : !(hasOAuthProviders || hasPasskey) ? <Typography variant={\"destructive\"} className=\"text-center\">{t(\"No authentication method enabled.\")}</Typography> : null}\n {props.extraInfo && (\n <div className={cn('flex flex-col items-center text-center text-sm text-gray-500', {\n 'mt-2': project.config.credentialEnabled || project.config.magicLinkEnabled,\n 'mt-6': !(project.config.credentialEnabled || project.config.magicLinkEnabled),\n })}>\n <div>{props.extraInfo}</div>\n </div>\n )}\n </div>\n </MaybeFullPage>\n );\n}\n"],"mappings":"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"}
@@ -5,13 +5,13 @@ import { Typography } from "@hexclave/ui";
5
5
  import { useCallback, useEffect, useRef, useState } from "react";
6
6
  import { useTranslation } from "../lib/translations.js";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
8
- import { stackAppInternalsSymbol } from "../lib/stack-app/common.js";
9
- import { MessageCard } from "../components/message-cards/message-card.js";
10
8
  import { useStackApp } from "../lib/hooks.js";
9
+ import { hexclaveAppInternalsSymbol } from "../lib/hexclave-app/common.js";
10
+ import { MessageCard } from "../components/message-cards/message-card.js";
11
11
 
12
12
  //#region src/components-page/cli-auth-confirm.tsx
13
13
  async function postCliAuthComplete(app, body) {
14
- return await app[stackAppInternalsSymbol].sendRequest("/auth/cli/complete", {
14
+ return await app[hexclaveAppInternalsSymbol].sendRequest("/auth/cli/complete", {
15
15
  method: "POST",
16
16
  headers: { "Content-Type": "application/json" },
17
17
  body: JSON.stringify(body)
@@ -123,7 +123,7 @@ function useCliAuthConfirmation() {
123
123
  const accessToken = getStringField(tokens, "access_token");
124
124
  const refreshToken = getStringField(tokens, "refresh_token");
125
125
  if (!accessToken || !refreshToken) throw new Error("Anonymous CLI session claim did not return tokens");
126
- await app[stackAppInternalsSymbol].signInWithTokens({
126
+ await app[hexclaveAppInternalsSymbol].signInWithTokens({
127
127
  accessToken,
128
128
  refreshToken
129
129
  });
@@ -1 +1 @@
1
- {"version":3,"file":"cli-auth-confirm.js","names":[],"sources":["../../../src/components-page/cli-auth-confirm.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 { runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { Typography } from \"@hexclave/ui\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { useTranslation } from \"../lib/translations\";\nimport { stackAppInternalsSymbol } from \"../lib/stack-app/common\";\nimport type { StackClientApp } from \"../lib/stack-app/apps/interfaces/client-app\";\nimport { useStackApp } from \"../lib/hooks\";\n\nasync function postCliAuthComplete(app: StackClientApp, body: Record<string, unknown>) {\n return await app[stackAppInternalsSymbol].sendRequest(\"/auth/cli/complete\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n}\n\nasync function ensureCliCompleteOk(result: Response) {\n if (!result.ok) {\n throw new Error(`Authorization failed: ${result.status} ${await result.text()}`);\n }\n}\n\nasync function completeCliAuthWithRefreshToken(app: StackClientApp, loginCode: string, refreshToken: string) {\n const result = await postCliAuthComplete(app, { login_code: loginCode, refresh_token: refreshToken });\n await ensureCliCompleteOk(result);\n}\n\n// Hexclave rebrand: sessionStorage key — straight rename (per-tab, low TTL).\nconst CLI_AUTH_CONFIRMED_KEY = \"hexclave-cli-auth-confirmed\";\n\nfunction markConfirmed(loginCode: string) {\n sessionStorage.setItem(CLI_AUTH_CONFIRMED_KEY, loginCode);\n}\n\nfunction isConfirmed(loginCode: string): boolean {\n return sessionStorage.getItem(CLI_AUTH_CONFIRMED_KEY) === loginCode;\n}\n\nfunction clearConfirmed() {\n sessionStorage.removeItem(CLI_AUTH_CONFIRMED_KEY);\n}\n\nfunction getError(err: unknown): Error {\n return err instanceof Error ? err : new Error(String(err));\n}\n\nfunction getObjectField(data: unknown, fieldName: string): unknown {\n return typeof data === \"object\" && data !== null && fieldName in data\n ? data[fieldName as keyof typeof data]\n : undefined;\n}\n\nfunction getStringField(data: unknown, fieldName: string): string | undefined {\n const value = getObjectField(data, fieldName);\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport type CliAuthConfirmationStatus =\n | \"idle\"\n | \"invalid\"\n | \"authorizing\"\n | \"redirecting\"\n | \"success\"\n | \"error\";\n\nexport type CliAuthConfirmationState = {\n status: CliAuthConfirmationStatus,\n loginCode: string | null,\n error: Error | null,\n isLoading: boolean,\n authorize: () => Promise<void>,\n retry: () => void,\n};\n\nexport function useCliAuthConfirmation(): CliAuthConfirmationState {\n const app = useStackApp();\n const user = app.useUser({ includeRestricted: true });\n const [status, setStatus] = useState<Exclude<CliAuthConfirmationStatus, \"invalid\">>(\"idle\");\n const [error, setError] = useState<Error | null>(null);\n const autoCompleteRef = useRef(false);\n const authorizeInProgressRef = useRef(false);\n const [loginCode] = useState(() => {\n if (typeof window === 'undefined') return null;\n return new URLSearchParams(window.location.search).get(\"login_code\");\n });\n const [confirmed] = useState(() => {\n if (typeof window === 'undefined') return false;\n return loginCode != null && isConfirmed(loginCode);\n });\n\n const completeWithCurrentUser = useCallback(async () => {\n if (!loginCode) {\n throw new Error(\"Missing login code in URL parameters\");\n }\n if (!user) {\n throw new Error(\"Cannot complete CLI authorization without a signed-in user\");\n }\n const refreshToken = (await user.currentSession.getTokens()).refreshToken;\n if (!refreshToken) {\n throw new Error(\"Could not retrieve session token\");\n }\n await completeCliAuthWithRefreshToken(app, loginCode, refreshToken);\n }, [app, loginCode, user]);\n\n useEffect(() => {\n if (!confirmed || !user || autoCompleteRef.current) {\n return;\n }\n autoCompleteRef.current = true;\n runAsynchronouslyWithAlert(async () => {\n setStatus(\"authorizing\");\n try {\n await completeWithCurrentUser();\n clearConfirmed();\n setStatus(\"success\");\n } catch (err) {\n setError(getError(err));\n setStatus(\"error\");\n }\n });\n }, [confirmed, user, completeWithCurrentUser]);\n\n const authorize = useCallback(async () => {\n if (authorizeInProgressRef.current) {\n return;\n }\n authorizeInProgressRef.current = true;\n\n try {\n if (!loginCode) {\n setError(new Error(\"Missing login code in URL parameters\"));\n setStatus(\"error\");\n return;\n }\n\n setError(null);\n setStatus(\"authorizing\");\n if (user) {\n await completeWithCurrentUser();\n clearConfirmed();\n setStatus(\"success\");\n return;\n }\n\n const checkResult = await postCliAuthComplete(app, { login_code: loginCode, mode: \"check\" });\n if (!checkResult.ok) {\n throw new Error(`Failed to verify login code: ${checkResult.status} ${await checkResult.text()}`);\n }\n const checkData: unknown = await checkResult.json();\n const cliSessionState = getStringField(checkData, \"cli_session_state\") ?? null;\n\n if (cliSessionState === \"anonymous\") {\n const claimResult = await postCliAuthComplete(app, { login_code: loginCode, mode: \"claim-anon-session\" });\n\n if (!claimResult.ok) {\n throw new Error(`Failed to claim anonymous session: ${claimResult.status} ${await claimResult.text()}`);\n }\n\n const tokens: unknown = await claimResult.json();\n const accessToken = getStringField(tokens, \"access_token\");\n const refreshToken = getStringField(tokens, \"refresh_token\");\n if (!accessToken || !refreshToken) {\n throw new Error(\"Anonymous CLI session claim did not return tokens\");\n }\n await app[stackAppInternalsSymbol].signInWithTokens({\n accessToken,\n refreshToken,\n });\n markConfirmed(loginCode);\n setStatus(\"redirecting\");\n await app.redirectToSignUp({ replace: true });\n return;\n }\n\n markConfirmed(loginCode);\n setStatus(\"redirecting\");\n await app.redirectToSignIn({ replace: true });\n } catch (err) {\n setError(getError(err));\n setStatus(\"error\");\n } finally {\n authorizeInProgressRef.current = false;\n }\n }, [app, completeWithCurrentUser, loginCode, user]);\n\n const retry = useCallback(() => {\n setError(null);\n autoCompleteRef.current = false;\n setStatus(\"idle\");\n }, []);\n\n const visibleStatus = loginCode == null ? \"invalid\" : status;\n return {\n status: visibleStatus,\n loginCode,\n error,\n isLoading: visibleStatus === \"authorizing\" || visibleStatus === \"redirecting\",\n authorize,\n retry,\n };\n}\n\nexport function CliAuthConfirmation({ fullPage = true }: { fullPage?: boolean }) {\n const { t } = useTranslation();\n const cliAuth = useCliAuthConfirmation();\n\n if (cliAuth.status === \"success\") {\n return (\n <MessageCard title={t(\"CLI Authorization Successful\")} fullPage={fullPage}>\n <Typography>\n {t(\"The CLI application has been authorized successfully. You can close this window and return to the command line.\")}\n </Typography>\n </MessageCard>\n );\n }\n\n if (cliAuth.status === \"error\") {\n return (\n <MessageCard\n title={t(\"Authorization Failed\")}\n fullPage={fullPage}\n primaryButtonText={t(\"Try Again\")}\n primaryAction={cliAuth.retry}\n >\n <Typography className=\"text-red-600\">\n {t(\"Failed to authorize the CLI application:\")}\n </Typography>\n <Typography className=\"text-red-600\">\n {cliAuth.error?.message}\n </Typography>\n </MessageCard>\n );\n }\n\n if (cliAuth.status === \"invalid\") {\n return (\n <MessageCard title={t(\"Invalid CLI Authorization Link\")} fullPage={fullPage}>\n <Typography className=\"text-red-600\">\n {t(\"This CLI authorization link is missing a login code. Please return to the command line and start the login process again.\")}\n </Typography>\n </MessageCard>\n );\n }\n\n if (cliAuth.status === \"authorizing\" || cliAuth.status === \"redirecting\") {\n return (\n <MessageCard title={t(\"Completing Authorization...\")} fullPage={fullPage}>\n <Typography>\n {t(\"Finishing up the CLI authorization...\")}\n </Typography>\n </MessageCard>\n );\n }\n\n return (\n <MessageCard\n title={t(\"Authorize CLI Application\")}\n fullPage={fullPage}\n primaryButtonText={cliAuth.isLoading ? t(\"Authorizing...\") : t(\"Authorize\")}\n primaryAction={cliAuth.authorize}\n >\n <Typography>\n {t(\"A command line application is requesting access to your account. Click the button below to authorize it.\")}\n </Typography>\n <Typography variant=\"destructive\">\n {t(\"WARNING: Make sure you trust the command line application, as it will gain access to your account. If you did not initiate this request, you can close this page and ignore it. We will never send you this link via email or any other means.\")}\n </Typography>\n </MessageCard>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli-auth-confirm.js","names":[],"sources":["../../../src/components-page/cli-auth-confirm.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 { runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { Typography } from \"@hexclave/ui\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { useTranslation } from \"../lib/translations\";\nimport { hexclaveAppInternalsSymbol } from \"../lib/hexclave-app/common\";\nimport type { StackClientApp } from \"../lib/hexclave-app/apps/interfaces/client-app\";\nimport { useStackApp } from \"../lib/hooks\";\n\nasync function postCliAuthComplete(app: StackClientApp, body: Record<string, unknown>) {\n return await app[hexclaveAppInternalsSymbol].sendRequest(\"/auth/cli/complete\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n}\n\nasync function ensureCliCompleteOk(result: Response) {\n if (!result.ok) {\n throw new Error(`Authorization failed: ${result.status} ${await result.text()}`);\n }\n}\n\nasync function completeCliAuthWithRefreshToken(app: StackClientApp, loginCode: string, refreshToken: string) {\n const result = await postCliAuthComplete(app, { login_code: loginCode, refresh_token: refreshToken });\n await ensureCliCompleteOk(result);\n}\n\n// Hexclave rebrand: sessionStorage key — straight rename (per-tab, low TTL).\nconst CLI_AUTH_CONFIRMED_KEY = \"hexclave-cli-auth-confirmed\";\n\nfunction markConfirmed(loginCode: string) {\n sessionStorage.setItem(CLI_AUTH_CONFIRMED_KEY, loginCode);\n}\n\nfunction isConfirmed(loginCode: string): boolean {\n return sessionStorage.getItem(CLI_AUTH_CONFIRMED_KEY) === loginCode;\n}\n\nfunction clearConfirmed() {\n sessionStorage.removeItem(CLI_AUTH_CONFIRMED_KEY);\n}\n\nfunction getError(err: unknown): Error {\n return err instanceof Error ? err : new Error(String(err));\n}\n\nfunction getObjectField(data: unknown, fieldName: string): unknown {\n return typeof data === \"object\" && data !== null && fieldName in data\n ? data[fieldName as keyof typeof data]\n : undefined;\n}\n\nfunction getStringField(data: unknown, fieldName: string): string | undefined {\n const value = getObjectField(data, fieldName);\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport type CliAuthConfirmationStatus =\n | \"idle\"\n | \"invalid\"\n | \"authorizing\"\n | \"redirecting\"\n | \"success\"\n | \"error\";\n\nexport type CliAuthConfirmationState = {\n status: CliAuthConfirmationStatus,\n loginCode: string | null,\n error: Error | null,\n isLoading: boolean,\n authorize: () => Promise<void>,\n retry: () => void,\n};\n\nexport function useCliAuthConfirmation(): CliAuthConfirmationState {\n const app = useStackApp();\n const user = app.useUser({ includeRestricted: true });\n const [status, setStatus] = useState<Exclude<CliAuthConfirmationStatus, \"invalid\">>(\"idle\");\n const [error, setError] = useState<Error | null>(null);\n const autoCompleteRef = useRef(false);\n const authorizeInProgressRef = useRef(false);\n const [loginCode] = useState(() => {\n if (typeof window === 'undefined') return null;\n return new URLSearchParams(window.location.search).get(\"login_code\");\n });\n const [confirmed] = useState(() => {\n if (typeof window === 'undefined') return false;\n return loginCode != null && isConfirmed(loginCode);\n });\n\n const completeWithCurrentUser = useCallback(async () => {\n if (!loginCode) {\n throw new Error(\"Missing login code in URL parameters\");\n }\n if (!user) {\n throw new Error(\"Cannot complete CLI authorization without a signed-in user\");\n }\n const refreshToken = (await user.currentSession.getTokens()).refreshToken;\n if (!refreshToken) {\n throw new Error(\"Could not retrieve session token\");\n }\n await completeCliAuthWithRefreshToken(app, loginCode, refreshToken);\n }, [app, loginCode, user]);\n\n useEffect(() => {\n if (!confirmed || !user || autoCompleteRef.current) {\n return;\n }\n autoCompleteRef.current = true;\n runAsynchronouslyWithAlert(async () => {\n setStatus(\"authorizing\");\n try {\n await completeWithCurrentUser();\n clearConfirmed();\n setStatus(\"success\");\n } catch (err) {\n setError(getError(err));\n setStatus(\"error\");\n }\n });\n }, [confirmed, user, completeWithCurrentUser]);\n\n const authorize = useCallback(async () => {\n if (authorizeInProgressRef.current) {\n return;\n }\n authorizeInProgressRef.current = true;\n\n try {\n if (!loginCode) {\n setError(new Error(\"Missing login code in URL parameters\"));\n setStatus(\"error\");\n return;\n }\n\n setError(null);\n setStatus(\"authorizing\");\n if (user) {\n await completeWithCurrentUser();\n clearConfirmed();\n setStatus(\"success\");\n return;\n }\n\n const checkResult = await postCliAuthComplete(app, { login_code: loginCode, mode: \"check\" });\n if (!checkResult.ok) {\n throw new Error(`Failed to verify login code: ${checkResult.status} ${await checkResult.text()}`);\n }\n const checkData: unknown = await checkResult.json();\n const cliSessionState = getStringField(checkData, \"cli_session_state\") ?? null;\n\n if (cliSessionState === \"anonymous\") {\n const claimResult = await postCliAuthComplete(app, { login_code: loginCode, mode: \"claim-anon-session\" });\n\n if (!claimResult.ok) {\n throw new Error(`Failed to claim anonymous session: ${claimResult.status} ${await claimResult.text()}`);\n }\n\n const tokens: unknown = await claimResult.json();\n const accessToken = getStringField(tokens, \"access_token\");\n const refreshToken = getStringField(tokens, \"refresh_token\");\n if (!accessToken || !refreshToken) {\n throw new Error(\"Anonymous CLI session claim did not return tokens\");\n }\n await app[hexclaveAppInternalsSymbol].signInWithTokens({\n accessToken,\n refreshToken,\n });\n markConfirmed(loginCode);\n setStatus(\"redirecting\");\n await app.redirectToSignUp({ replace: true });\n return;\n }\n\n markConfirmed(loginCode);\n setStatus(\"redirecting\");\n await app.redirectToSignIn({ replace: true });\n } catch (err) {\n setError(getError(err));\n setStatus(\"error\");\n } finally {\n authorizeInProgressRef.current = false;\n }\n }, [app, completeWithCurrentUser, loginCode, user]);\n\n const retry = useCallback(() => {\n setError(null);\n autoCompleteRef.current = false;\n setStatus(\"idle\");\n }, []);\n\n const visibleStatus = loginCode == null ? \"invalid\" : status;\n return {\n status: visibleStatus,\n loginCode,\n error,\n isLoading: visibleStatus === \"authorizing\" || visibleStatus === \"redirecting\",\n authorize,\n retry,\n };\n}\n\nexport function CliAuthConfirmation({ fullPage = true }: { fullPage?: boolean }) {\n const { t } = useTranslation();\n const cliAuth = useCliAuthConfirmation();\n\n if (cliAuth.status === \"success\") {\n return (\n <MessageCard title={t(\"CLI Authorization Successful\")} fullPage={fullPage}>\n <Typography>\n {t(\"The CLI application has been authorized successfully. You can close this window and return to the command line.\")}\n </Typography>\n </MessageCard>\n );\n }\n\n if (cliAuth.status === \"error\") {\n return (\n <MessageCard\n title={t(\"Authorization Failed\")}\n fullPage={fullPage}\n primaryButtonText={t(\"Try Again\")}\n primaryAction={cliAuth.retry}\n >\n <Typography className=\"text-red-600\">\n {t(\"Failed to authorize the CLI application:\")}\n </Typography>\n <Typography className=\"text-red-600\">\n {cliAuth.error?.message}\n </Typography>\n </MessageCard>\n );\n }\n\n if (cliAuth.status === \"invalid\") {\n return (\n <MessageCard title={t(\"Invalid CLI Authorization Link\")} fullPage={fullPage}>\n <Typography className=\"text-red-600\">\n {t(\"This CLI authorization link is missing a login code. Please return to the command line and start the login process again.\")}\n </Typography>\n </MessageCard>\n );\n }\n\n if (cliAuth.status === \"authorizing\" || cliAuth.status === \"redirecting\") {\n return (\n <MessageCard title={t(\"Completing Authorization...\")} fullPage={fullPage}>\n <Typography>\n {t(\"Finishing up the CLI authorization...\")}\n </Typography>\n </MessageCard>\n );\n }\n\n return (\n <MessageCard\n title={t(\"Authorize CLI Application\")}\n fullPage={fullPage}\n primaryButtonText={cliAuth.isLoading ? t(\"Authorizing...\") : t(\"Authorize\")}\n primaryAction={cliAuth.authorize}\n >\n <Typography>\n {t(\"A command line application is requesting access to your account. Click the button below to authorize it.\")}\n </Typography>\n <Typography variant=\"destructive\">\n {t(\"WARNING: Make sure you trust the command line application, as it will gain access to your account. If you did not initiate this request, you can close this page and ignore it. We will never send you this link via email or any other means.\")}\n </Typography>\n </MessageCard>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAgBA,eAAe,oBAAoB,KAAqB,MAA+B;AACrF,QAAO,MAAM,IAAI,4BAA4B,YAAY,sBAAsB;EAC7E,QAAQ;EACR,SAAS,EAAE,gBAAgB,oBAAoB;EAC/C,MAAM,KAAK,UAAU,KAAK;EAC3B,CAAC;;AAGJ,eAAe,oBAAoB,QAAkB;AACnD,KAAI,CAAC,OAAO,GACV,OAAM,IAAI,MAAM,yBAAyB,OAAO,OAAO,GAAG,MAAM,OAAO,MAAM,GAAG;;AAIpF,eAAe,gCAAgC,KAAqB,WAAmB,cAAsB;AAE3G,OAAM,oBADS,MAAM,oBAAoB,KAAK;EAAE,YAAY;EAAW,eAAe;EAAc,CAAC,CACpE;;AAInC,MAAM,yBAAyB;AAE/B,SAAS,cAAc,WAAmB;AACxC,gBAAe,QAAQ,wBAAwB,UAAU;;AAG3D,SAAS,YAAY,WAA4B;AAC/C,QAAO,eAAe,QAAQ,uBAAuB,KAAK;;AAG5D,SAAS,iBAAiB;AACxB,gBAAe,WAAW,uBAAuB;;AAGnD,SAAS,SAAS,KAAqB;AACrC,QAAO,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,IAAI,CAAC;;AAG5D,SAAS,eAAe,MAAe,WAA4B;AACjE,QAAO,OAAO,SAAS,YAAY,SAAS,QAAQ,aAAa,OAC7D,KAAK,aACL;;AAGN,SAAS,eAAe,MAAe,WAAuC;CAC5E,MAAM,QAAQ,eAAe,MAAM,UAAU;AAC7C,QAAO,OAAO,UAAU,WAAW,QAAQ;;AAoB7C,SAAgB,yBAAmD;CACjE,MAAM,MAAM,aAAa;CACzB,MAAM,OAAO,IAAI,QAAQ,EAAE,mBAAmB,MAAM,CAAC;CACrD,MAAM,CAAC,QAAQ,aAAa,SAAwD,OAAO;CAC3F,MAAM,CAAC,OAAO,YAAY,SAAuB,KAAK;CACtD,MAAM,kBAAkB,OAAO,MAAM;CACrC,MAAM,yBAAyB,OAAO,MAAM;CAC5C,MAAM,CAAC,aAAa,eAAe;AACjC,MAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,SAAO,IAAI,gBAAgB,OAAO,SAAS,OAAO,CAAC,IAAI,aAAa;GACpE;CACF,MAAM,CAAC,aAAa,eAAe;AACjC,MAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,SAAO,aAAa,QAAQ,YAAY,UAAU;GAClD;CAEF,MAAM,0BAA0B,YAAY,YAAY;AACtD,MAAI,CAAC,UACH,OAAM,IAAI,MAAM,uCAAuC;AAEzD,MAAI,CAAC,KACH,OAAM,IAAI,MAAM,6DAA6D;EAE/E,MAAM,gBAAgB,MAAM,KAAK,eAAe,WAAW,EAAE;AAC7D,MAAI,CAAC,aACH,OAAM,IAAI,MAAM,mCAAmC;AAErD,QAAM,gCAAgC,KAAK,WAAW,aAAa;IAClE;EAAC;EAAK;EAAW;EAAK,CAAC;AAE1B,iBAAgB;AACd,MAAI,CAAC,aAAa,CAAC,QAAQ,gBAAgB,QACzC;AAEF,kBAAgB,UAAU;AAC1B,6BAA2B,YAAY;AACrC,aAAU,cAAc;AACxB,OAAI;AACF,UAAM,yBAAyB;AAC/B,oBAAgB;AAChB,cAAU,UAAU;YACb,KAAK;AACZ,aAAS,SAAS,IAAI,CAAC;AACvB,cAAU,QAAQ;;IAEpB;IACD;EAAC;EAAW;EAAM;EAAwB,CAAC;CAE9C,MAAM,YAAY,YAAY,YAAY;AACxC,MAAI,uBAAuB,QACzB;AAEF,yBAAuB,UAAU;AAEjC,MAAI;AACF,OAAI,CAAC,WAAW;AACd,6BAAS,IAAI,MAAM,uCAAuC,CAAC;AAC3D,cAAU,QAAQ;AAClB;;AAGF,YAAS,KAAK;AACd,aAAU,cAAc;AACxB,OAAI,MAAM;AACR,UAAM,yBAAyB;AAC/B,oBAAgB;AAChB,cAAU,UAAU;AACpB;;GAGF,MAAM,cAAc,MAAM,oBAAoB,KAAK;IAAE,YAAY;IAAW,MAAM;IAAS,CAAC;AAC5F,OAAI,CAAC,YAAY,GACf,OAAM,IAAI,MAAM,gCAAgC,YAAY,OAAO,GAAG,MAAM,YAAY,MAAM,GAAG;AAKnG,QAFwB,eADG,MAAM,YAAY,MAAM,EACD,oBAAoB,IAAI,UAElD,aAAa;IACnC,MAAM,cAAc,MAAM,oBAAoB,KAAK;KAAE,YAAY;KAAW,MAAM;KAAsB,CAAC;AAEzG,QAAI,CAAC,YAAY,GACf,OAAM,IAAI,MAAM,sCAAsC,YAAY,OAAO,GAAG,MAAM,YAAY,MAAM,GAAG;IAGzG,MAAM,SAAkB,MAAM,YAAY,MAAM;IAChD,MAAM,cAAc,eAAe,QAAQ,eAAe;IAC1D,MAAM,eAAe,eAAe,QAAQ,gBAAgB;AAC5D,QAAI,CAAC,eAAe,CAAC,aACnB,OAAM,IAAI,MAAM,oDAAoD;AAEtE,UAAM,IAAI,4BAA4B,iBAAiB;KACrD;KACA;KACD,CAAC;AACF,kBAAc,UAAU;AACxB,cAAU,cAAc;AACxB,UAAM,IAAI,iBAAiB,EAAE,SAAS,MAAM,CAAC;AAC7C;;AAGF,iBAAc,UAAU;AACxB,aAAU,cAAc;AACxB,SAAM,IAAI,iBAAiB,EAAE,SAAS,MAAM,CAAC;WACtC,KAAK;AACZ,YAAS,SAAS,IAAI,CAAC;AACvB,aAAU,QAAQ;YACV;AACR,0BAAuB,UAAU;;IAElC;EAAC;EAAK;EAAyB;EAAW;EAAK,CAAC;CAEnD,MAAM,QAAQ,kBAAkB;AAC9B,WAAS,KAAK;AACd,kBAAgB,UAAU;AAC1B,YAAU,OAAO;IAChB,EAAE,CAAC;CAEN,MAAM,gBAAgB,aAAa,OAAO,YAAY;AACtD,QAAO;EACL,QAAQ;EACR;EACA;EACA,WAAW,kBAAkB,iBAAiB,kBAAkB;EAChE;EACA;EACD;;AAGH,SAAgB,oBAAoB,EAAE,WAAW,QAAgC;CAC/E,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,UAAU,wBAAwB;AAExC,KAAI,QAAQ,WAAW,UACrB,QACE,oBAAC;EAAY,OAAO,EAAE,+BAA+B;EAAY;YAC/D,oBAAC,wBACE,EAAE,kHAAkH,GAC1G;GACD;AAIlB,KAAI,QAAQ,WAAW,QACrB,QACE,qBAAC;EACC,OAAO,EAAE,uBAAuB;EACtB;EACV,mBAAmB,EAAE,YAAY;EACjC,eAAe,QAAQ;aAEvB,oBAAC;GAAW,WAAU;aACnB,EAAE,2CAA2C;IACnC,EACb,oBAAC;GAAW,WAAU;aACnB,QAAQ,OAAO;IACL;GACD;AAIlB,KAAI,QAAQ,WAAW,UACrB,QACE,oBAAC;EAAY,OAAO,EAAE,iCAAiC;EAAY;YACjE,oBAAC;GAAW,WAAU;aACnB,EAAE,4HAA4H;IACpH;GACD;AAIlB,KAAI,QAAQ,WAAW,iBAAiB,QAAQ,WAAW,cACzD,QACE,oBAAC;EAAY,OAAO,EAAE,8BAA8B;EAAY;YAC9D,oBAAC,wBACE,EAAE,wCAAwC,GAChC;GACD;AAIlB,QACE,qBAAC;EACC,OAAO,EAAE,4BAA4B;EAC3B;EACV,mBAAmB,QAAQ,YAAY,EAAE,iBAAiB,GAAG,EAAE,YAAY;EAC3E,eAAe,QAAQ;aAEvB,oBAAC,wBACE,EAAE,2GAA2G,GACnG,EACb,oBAAC;GAAW,SAAQ;aACjB,EAAE,iPAAiP;IACzO;GACD"}
@@ -1,10 +1,10 @@
1
1
  import { runAsynchronously } from "@hexclave/shared/dist/utils/promises";
2
2
  import React, { act } from "react";
3
3
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
- import { createRoot } from "react-dom/client";
4
+ import { hexclaveAppInternalsSymbol } from "../lib/hexclave-app/common.js";
5
5
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6
- import { stackAppInternalsSymbol } from "../lib/stack-app/common.js";
7
- import { StackContext } from "../providers/stack-context.js";
6
+ import { createRoot } from "react-dom/client";
7
+ import { HexclaveContext } from "../providers/hexclave-context.js";
8
8
  import { useCliAuthConfirmation } from "./cli-auth-confirm.js";
9
9
 
10
10
  //#region src/components-page/cli-auth-confirm.test.tsx
@@ -21,7 +21,7 @@ function createAppTestDouble(options) {
21
21
  useUser: () => options.user,
22
22
  redirectToSignIn: options.redirectToSignIn ?? vi.fn(async () => {}),
23
23
  redirectToSignUp: options.redirectToSignUp ?? vi.fn(async () => {}),
24
- [stackAppInternalsSymbol]: {
24
+ [hexclaveAppInternalsSymbol]: {
25
25
  sendRequest: options.sendRequest,
26
26
  signInWithTokens: options.signInWithTokens ?? vi.fn(async () => {})
27
27
  }
@@ -56,7 +56,7 @@ async function renderWithApp(app) {
56
56
  document.body.append(container);
57
57
  root = createRoot(container);
58
58
  await act(async () => {
59
- root?.render(/* @__PURE__ */ jsx(StackContext.Provider, {
59
+ root?.render(/* @__PURE__ */ jsx(HexclaveContext.Provider, {
60
60
  value: { app },
61
61
  children: /* @__PURE__ */ jsx(HookProbe, {})
62
62
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"cli-auth-confirm.test.js","names":[],"sources":["../../../src/components-page/cli-auth-confirm.test.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n// @vitest-environment jsdom\n\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport React, { act } from \"react\";\nimport { createRoot, type Root } from \"react-dom/client\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport type { StackClientApp } from \"../lib/stack-app/apps/interfaces/client-app\";\nimport { stackAppInternalsSymbol } from \"../lib/stack-app/common\";\nimport { StackContext } from \"../providers/stack-context\";\nimport { useCliAuthConfirmation } from \"./cli-auth-confirm\";\n\nconst previousActEnvironment = Reflect.get(globalThis, \"IS_REACT_ACT_ENVIRONMENT\");\n\nfunction responseJson(data: unknown, init?: ResponseInit) {\n return new Response(JSON.stringify(data), {\n status: init?.status ?? 200,\n headers: { \"Content-Type\": \"application/json\" },\n });\n}\n\nfunction createAppTestDouble(options: {\n user: unknown,\n sendRequest: (path: string, requestOptions: RequestInit) => Promise<Response>,\n signInWithTokens?: (tokens: { accessToken: string, refreshToken: string }) => Promise<void>,\n redirectToSignIn?: (options: { replace: true }) => Promise<void>,\n redirectToSignUp?: (options: { replace: true }) => Promise<void>,\n}) {\n const app = {\n useUser: () => options.user,\n redirectToSignIn: options.redirectToSignIn ?? vi.fn(async () => {}),\n redirectToSignUp: options.redirectToSignUp ?? vi.fn(async () => {}),\n [stackAppInternalsSymbol]: {\n sendRequest: options.sendRequest,\n signInWithTokens: options.signInWithTokens ?? vi.fn(async () => {}),\n },\n };\n\n // This test double intentionally implements only the StackClientApp surface\n // that useCliAuthConfirmation touches.\n return app as unknown as StackClientApp<true>;\n}\n\nfunction HookProbe() {\n const cliAuth = useCliAuthConfirmation();\n return (\n <>\n <div data-testid=\"status\">{cliAuth.status}</div>\n <div data-testid=\"error\">{cliAuth.error?.message}</div>\n <button type=\"button\" onClick={() => runAsynchronously(cliAuth.authorize)}>authorize</button>\n <button onClick={cliAuth.retry}>retry</button>\n </>\n );\n}\n\nlet root: Root | null = null;\nlet container: HTMLDivElement | null = null;\n\nasync function renderWithApp(app: StackClientApp<true>) {\n container = document.createElement(\"div\");\n document.body.append(container);\n root = createRoot(container);\n await act(async () => {\n root?.render(\n <StackContext.Provider value={{ app }}>\n <HookProbe />\n </StackContext.Provider>\n );\n });\n}\n\nfunction getByTestId(testId: string): HTMLElement {\n const element = container?.querySelector(`[data-testid=\"${testId}\"]`);\n if (!(element instanceof HTMLElement)) {\n throw new Error(`Could not find test element ${testId}`);\n }\n return element;\n}\n\nfunction getButton(label: string): HTMLButtonElement {\n const button = [...container?.querySelectorAll(\"button\") ?? []]\n .find((element) => element.textContent === label);\n if (!(button instanceof HTMLButtonElement)) {\n throw new Error(`Could not find button ${label}`);\n }\n return button;\n}\n\ndescribe(\"useCliAuthConfirmation\", () => {\n beforeEach(() => {\n Reflect.set(globalThis, \"IS_REACT_ACT_ENVIRONMENT\", true);\n });\n\n afterEach(() => {\n act(() => {\n root?.unmount();\n });\n container?.remove();\n root = null;\n container = null;\n vi.restoreAllMocks();\n window.history.replaceState({}, \"\", \"/\");\n Reflect.set(globalThis, \"IS_REACT_ACT_ENVIRONMENT\", previousActEnvironment);\n });\n\n it(\"completes CLI auth with the current user's refresh token\", async () => {\n window.history.replaceState({}, \"\", \"/handler/cli-auth-confirm?login_code=login-code\");\n const getTokens = vi.fn(async () => ({ refreshToken: \"refresh-token\" }));\n const sendRequest = vi.fn(async (_path: string, _requestOptions: RequestInit) => new Response(null, { status: 200 }));\n const app = createAppTestDouble({\n user: { currentSession: { getTokens } },\n sendRequest,\n });\n\n await renderWithApp(app);\n await act(async () => {\n getButton(\"authorize\").click();\n });\n\n expect(getByTestId(\"status\").textContent).toBe(\"success\");\n expect(getTokens).toHaveBeenCalledOnce();\n expect(sendRequest).toHaveBeenCalledOnce();\n expect(sendRequest.mock.calls[0][0]).toBe(\"/auth/cli/complete\");\n expect(JSON.parse(String(sendRequest.mock.calls[0][1].body))).toMatchInlineSnapshot(`\n {\n \"login_code\": \"login-code\",\n \"refresh_token\": \"refresh-token\",\n }\n `);\n });\n\n it(\"ignores duplicate authorize clicks before React re-renders\", async () => {\n window.history.replaceState({}, \"\", \"/handler/cli-auth-confirm?login_code=login-code\");\n const getTokens = vi.fn(async () => ({ refreshToken: \"refresh-token\" }));\n const sendRequest = vi.fn(async (_path: string, _requestOptions: RequestInit) => new Response(null, { status: 200 }));\n const app = createAppTestDouble({\n user: { currentSession: { getTokens } },\n sendRequest,\n });\n\n await renderWithApp(app);\n await act(async () => {\n const authorizeButton = getButton(\"authorize\");\n authorizeButton.click();\n authorizeButton.click();\n });\n\n expect(sendRequest).toHaveBeenCalledOnce();\n });\n\n it(\"claims anonymous CLI sessions before redirecting to sign-up\", async () => {\n window.history.replaceState({}, \"\", \"/handler/cli-auth-confirm?login_code=login-code\");\n const signInWithTokens = vi.fn(async (_tokens: { accessToken: string, refreshToken: string }) => {});\n const redirectToSignUp = vi.fn(async (_options: { replace: true }) => {});\n const sendRequest = vi.fn(async (_path: string, _requestOptions: RequestInit) => new Response(null, { status: 200 }))\n .mockResolvedValueOnce(responseJson({ cli_session_state: \"anonymous\" }))\n .mockResolvedValueOnce(responseJson({ access_token: \"access-token\", refresh_token: \"refresh-token\" }));\n const app = createAppTestDouble({\n user: null,\n sendRequest,\n signInWithTokens,\n redirectToSignUp,\n });\n\n await renderWithApp(app);\n await act(async () => {\n getButton(\"authorize\").click();\n });\n\n expect(redirectToSignUp).toHaveBeenCalledWith({ replace: true });\n expect(signInWithTokens).toHaveBeenCalledWith({\n accessToken: \"access-token\",\n refreshToken: \"refresh-token\",\n });\n expect(sessionStorage.getItem(\"hexclave-cli-auth-confirmed\")).toBe(\"login-code\");\n expect(sendRequest.mock.calls.map(call => JSON.parse(String(call[1].body)))).toMatchInlineSnapshot(`\n [\n {\n \"login_code\": \"login-code\",\n \"mode\": \"check\",\n },\n {\n \"login_code\": \"login-code\",\n \"mode\": \"claim-anon-session\",\n },\n ]\n `);\n });\n\n it(\"reports invalid when the login code is missing\", async () => {\n window.history.replaceState({}, \"\", \"/handler/cli-auth-confirm\");\n const app = createAppTestDouble({\n user: null,\n sendRequest: vi.fn(async (_path: string, _requestOptions: RequestInit) => new Response(null, { status: 200 })),\n });\n\n await renderWithApp(app);\n\n expect(getByTestId(\"status\").textContent).toBe(\"invalid\");\n });\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli-auth-confirm.test.js","names":[],"sources":["../../../src/components-page/cli-auth-confirm.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//===========================================\n// @vitest-environment jsdom\n\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport React, { act } from \"react\";\nimport { createRoot, type Root } from \"react-dom/client\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport type { StackClientApp } from \"../lib/hexclave-app/apps/interfaces/client-app\";\nimport { hexclaveAppInternalsSymbol } from \"../lib/hexclave-app/common\";\nimport { HexclaveContext } from \"../providers/hexclave-context\";\nimport { useCliAuthConfirmation } from \"./cli-auth-confirm\";\n\nconst previousActEnvironment = Reflect.get(globalThis, \"IS_REACT_ACT_ENVIRONMENT\");\n\nfunction responseJson(data: unknown, init?: ResponseInit) {\n return new Response(JSON.stringify(data), {\n status: init?.status ?? 200,\n headers: { \"Content-Type\": \"application/json\" },\n });\n}\n\nfunction createAppTestDouble(options: {\n user: unknown,\n sendRequest: (path: string, requestOptions: RequestInit) => Promise<Response>,\n signInWithTokens?: (tokens: { accessToken: string, refreshToken: string }) => Promise<void>,\n redirectToSignIn?: (options: { replace: true }) => Promise<void>,\n redirectToSignUp?: (options: { replace: true }) => Promise<void>,\n}) {\n const app = {\n useUser: () => options.user,\n redirectToSignIn: options.redirectToSignIn ?? vi.fn(async () => {}),\n redirectToSignUp: options.redirectToSignUp ?? vi.fn(async () => {}),\n [hexclaveAppInternalsSymbol]: {\n sendRequest: options.sendRequest,\n signInWithTokens: options.signInWithTokens ?? vi.fn(async () => {}),\n },\n };\n\n // This test double intentionally implements only the StackClientApp surface\n // that useCliAuthConfirmation touches.\n return app as unknown as StackClientApp<true>;\n}\n\nfunction HookProbe() {\n const cliAuth = useCliAuthConfirmation();\n return (\n <>\n <div data-testid=\"status\">{cliAuth.status}</div>\n <div data-testid=\"error\">{cliAuth.error?.message}</div>\n <button type=\"button\" onClick={() => runAsynchronously(cliAuth.authorize)}>authorize</button>\n <button onClick={cliAuth.retry}>retry</button>\n </>\n );\n}\n\nlet root: Root | null = null;\nlet container: HTMLDivElement | null = null;\n\nasync function renderWithApp(app: StackClientApp<true>) {\n container = document.createElement(\"div\");\n document.body.append(container);\n root = createRoot(container);\n await act(async () => {\n root?.render(\n <HexclaveContext.Provider value={{ app }}>\n <HookProbe />\n </HexclaveContext.Provider>\n );\n });\n}\n\nfunction getByTestId(testId: string): HTMLElement {\n const element = container?.querySelector(`[data-testid=\"${testId}\"]`);\n if (!(element instanceof HTMLElement)) {\n throw new Error(`Could not find test element ${testId}`);\n }\n return element;\n}\n\nfunction getButton(label: string): HTMLButtonElement {\n const button = [...container?.querySelectorAll(\"button\") ?? []]\n .find((element) => element.textContent === label);\n if (!(button instanceof HTMLButtonElement)) {\n throw new Error(`Could not find button ${label}`);\n }\n return button;\n}\n\ndescribe(\"useCliAuthConfirmation\", () => {\n beforeEach(() => {\n Reflect.set(globalThis, \"IS_REACT_ACT_ENVIRONMENT\", true);\n });\n\n afterEach(() => {\n act(() => {\n root?.unmount();\n });\n container?.remove();\n root = null;\n container = null;\n vi.restoreAllMocks();\n window.history.replaceState({}, \"\", \"/\");\n Reflect.set(globalThis, \"IS_REACT_ACT_ENVIRONMENT\", previousActEnvironment);\n });\n\n it(\"completes CLI auth with the current user's refresh token\", async () => {\n window.history.replaceState({}, \"\", \"/handler/cli-auth-confirm?login_code=login-code\");\n const getTokens = vi.fn(async () => ({ refreshToken: \"refresh-token\" }));\n const sendRequest = vi.fn(async (_path: string, _requestOptions: RequestInit) => new Response(null, { status: 200 }));\n const app = createAppTestDouble({\n user: { currentSession: { getTokens } },\n sendRequest,\n });\n\n await renderWithApp(app);\n await act(async () => {\n getButton(\"authorize\").click();\n });\n\n expect(getByTestId(\"status\").textContent).toBe(\"success\");\n expect(getTokens).toHaveBeenCalledOnce();\n expect(sendRequest).toHaveBeenCalledOnce();\n expect(sendRequest.mock.calls[0][0]).toBe(\"/auth/cli/complete\");\n expect(JSON.parse(String(sendRequest.mock.calls[0][1].body))).toMatchInlineSnapshot(`\n {\n \"login_code\": \"login-code\",\n \"refresh_token\": \"refresh-token\",\n }\n `);\n });\n\n it(\"ignores duplicate authorize clicks before React re-renders\", async () => {\n window.history.replaceState({}, \"\", \"/handler/cli-auth-confirm?login_code=login-code\");\n const getTokens = vi.fn(async () => ({ refreshToken: \"refresh-token\" }));\n const sendRequest = vi.fn(async (_path: string, _requestOptions: RequestInit) => new Response(null, { status: 200 }));\n const app = createAppTestDouble({\n user: { currentSession: { getTokens } },\n sendRequest,\n });\n\n await renderWithApp(app);\n await act(async () => {\n const authorizeButton = getButton(\"authorize\");\n authorizeButton.click();\n authorizeButton.click();\n });\n\n expect(sendRequest).toHaveBeenCalledOnce();\n });\n\n it(\"claims anonymous CLI sessions before redirecting to sign-up\", async () => {\n window.history.replaceState({}, \"\", \"/handler/cli-auth-confirm?login_code=login-code\");\n const signInWithTokens = vi.fn(async (_tokens: { accessToken: string, refreshToken: string }) => {});\n const redirectToSignUp = vi.fn(async (_options: { replace: true }) => {});\n const sendRequest = vi.fn(async (_path: string, _requestOptions: RequestInit) => new Response(null, { status: 200 }))\n .mockResolvedValueOnce(responseJson({ cli_session_state: \"anonymous\" }))\n .mockResolvedValueOnce(responseJson({ access_token: \"access-token\", refresh_token: \"refresh-token\" }));\n const app = createAppTestDouble({\n user: null,\n sendRequest,\n signInWithTokens,\n redirectToSignUp,\n });\n\n await renderWithApp(app);\n await act(async () => {\n getButton(\"authorize\").click();\n });\n\n expect(redirectToSignUp).toHaveBeenCalledWith({ replace: true });\n expect(signInWithTokens).toHaveBeenCalledWith({\n accessToken: \"access-token\",\n refreshToken: \"refresh-token\",\n });\n expect(sessionStorage.getItem(\"hexclave-cli-auth-confirmed\")).toBe(\"login-code\");\n expect(sendRequest.mock.calls.map(call => JSON.parse(String(call[1].body)))).toMatchInlineSnapshot(`\n [\n {\n \"login_code\": \"login-code\",\n \"mode\": \"check\",\n },\n {\n \"login_code\": \"login-code\",\n \"mode\": \"claim-anon-session\",\n },\n ]\n `);\n });\n\n it(\"reports invalid when the login code is missing\", async () => {\n window.history.replaceState({}, \"\", \"/handler/cli-auth-confirm\");\n const app = createAppTestDouble({\n user: null,\n sendRequest: vi.fn(async (_path: string, _requestOptions: RequestInit) => new Response(null, { status: 200 })),\n });\n\n await renderWithApp(app);\n\n expect(getByTestId(\"status\").textContent).toBe(\"invalid\");\n });\n});\n"],"mappings":"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"}