@hexclave/next 1.0.0

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 (1036) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +26 -0
  3. package/dist/chunk-BE-pF4vm.js +34 -0
  4. package/dist/components/api-key-dialogs.d.ts +28 -0
  5. package/dist/components/api-key-dialogs.d.ts.map +1 -0
  6. package/dist/components/api-key-dialogs.js +163 -0
  7. package/dist/components/api-key-dialogs.js.map +1 -0
  8. package/dist/components/api-key-table.d.ts +10 -0
  9. package/dist/components/api-key-table.d.ts.map +1 -0
  10. package/dist/components/api-key-table.js +144 -0
  11. package/dist/components/api-key-table.js.map +1 -0
  12. package/dist/components/credential-sign-in.d.ts +7 -0
  13. package/dist/components/credential-sign-in.d.ts.map +1 -0
  14. package/dist/components/credential-sign-in.js +87 -0
  15. package/dist/components/credential-sign-in.js.map +1 -0
  16. package/dist/components/credential-sign-up.d.ts +9 -0
  17. package/dist/components/credential-sign-up.d.ts.map +1 -0
  18. package/dist/components/credential-sign-up.js +121 -0
  19. package/dist/components/credential-sign-up.js.map +1 -0
  20. package/dist/components/elements/form-warning.d.ts +11 -0
  21. package/dist/components/elements/form-warning.d.ts.map +1 -0
  22. package/dist/components/elements/form-warning.js +18 -0
  23. package/dist/components/elements/form-warning.js.map +1 -0
  24. package/dist/components/elements/maybe-full-page.d.ts +16 -0
  25. package/dist/components/elements/maybe-full-page.d.ts.map +1 -0
  26. package/dist/components/elements/maybe-full-page.js +41 -0
  27. package/dist/components/elements/maybe-full-page.js.map +1 -0
  28. package/dist/components/elements/separator-with-text.d.ts +11 -0
  29. package/dist/components/elements/separator-with-text.d.ts.map +1 -0
  30. package/dist/components/elements/separator-with-text.js +31 -0
  31. package/dist/components/elements/separator-with-text.js.map +1 -0
  32. package/dist/components/elements/sidebar-layout.d.ts +21 -0
  33. package/dist/components/elements/sidebar-layout.d.ts.map +1 -0
  34. package/dist/components/elements/sidebar-layout.js +135 -0
  35. package/dist/components/elements/sidebar-layout.js.map +1 -0
  36. package/dist/components/elements/ssr-layout-effect.d.ts +10 -0
  37. package/dist/components/elements/ssr-layout-effect.d.ts.map +1 -0
  38. package/dist/components/elements/ssr-layout-effect.js +22 -0
  39. package/dist/components/elements/ssr-layout-effect.js.map +1 -0
  40. package/dist/components/elements/user-avatar.d.ts +15 -0
  41. package/dist/components/elements/user-avatar.d.ts.map +1 -0
  42. package/dist/components/elements/user-avatar.js +30 -0
  43. package/dist/components/elements/user-avatar.js.map +1 -0
  44. package/dist/components/link.d.ts +16 -0
  45. package/dist/components/link.d.ts.map +1 -0
  46. package/dist/components/link.js +32 -0
  47. package/dist/components/link.js.map +1 -0
  48. package/dist/components/magic-link-sign-in.d.ts +7 -0
  49. package/dist/components/magic-link-sign-in.d.ts.map +1 -0
  50. package/dist/components/magic-link-sign-in.js +138 -0
  51. package/dist/components/magic-link-sign-in.js.map +1 -0
  52. package/dist/components/message-cards/known-error-message-card.d.ts +14 -0
  53. package/dist/components/message-cards/known-error-message-card.d.ts.map +1 -0
  54. package/dist/components/message-cards/known-error-message-card.js +24 -0
  55. package/dist/components/message-cards/known-error-message-card.js.map +1 -0
  56. package/dist/components/message-cards/message-card.d.ts +19 -0
  57. package/dist/components/message-cards/message-card.d.ts.map +1 -0
  58. package/dist/components/message-cards/message-card.js +46 -0
  59. package/dist/components/message-cards/message-card.js.map +1 -0
  60. package/dist/components/message-cards/predefined-message-card.d.ts +13 -0
  61. package/dist/components/message-cards/predefined-message-card.d.ts.map +1 -0
  62. package/dist/components/message-cards/predefined-message-card.js +73 -0
  63. package/dist/components/message-cards/predefined-message-card.js.map +1 -0
  64. package/dist/components/oauth-button-group.d.ts +19 -0
  65. package/dist/components/oauth-button-group.d.ts.map +1 -0
  66. package/dist/components/oauth-button-group.js +24 -0
  67. package/dist/components/oauth-button-group.js.map +1 -0
  68. package/dist/components/oauth-button.d.ts +17 -0
  69. package/dist/components/oauth-button.d.ts.map +1 -0
  70. package/dist/components/oauth-button.js +173 -0
  71. package/dist/components/oauth-button.js.map +1 -0
  72. package/dist/components/passkey-button.d.ts +11 -0
  73. package/dist/components/passkey-button.d.ts.map +1 -0
  74. package/dist/components/passkey-button.js +33 -0
  75. package/dist/components/passkey-button.js.map +1 -0
  76. package/dist/components/profile-image-editor.d.ts +15 -0
  77. package/dist/components/profile-image-editor.d.ts.map +1 -0
  78. package/dist/components/profile-image-editor.js +171 -0
  79. package/dist/components/profile-image-editor.js.map +1 -0
  80. package/dist/components/selected-team-switcher.d.ts +31 -0
  81. package/dist/components/selected-team-switcher.d.ts.map +1 -0
  82. package/dist/components/selected-team-switcher.js +59 -0
  83. package/dist/components/selected-team-switcher.js.map +1 -0
  84. package/dist/components/team-icon.d.ts +10 -0
  85. package/dist/components/team-icon.d.ts.map +1 -0
  86. package/dist/components/team-icon.js +31 -0
  87. package/dist/components/team-icon.js.map +1 -0
  88. package/dist/components/team-switcher.d.ts +31 -0
  89. package/dist/components/team-switcher.d.ts.map +1 -0
  90. package/dist/components/team-switcher.js +123 -0
  91. package/dist/components/team-switcher.js.map +1 -0
  92. package/dist/components/use-in-iframe.d.ts +5 -0
  93. package/dist/components/use-in-iframe.d.ts.map +1 -0
  94. package/dist/components/use-in-iframe.js +18 -0
  95. package/dist/components/use-in-iframe.js.map +1 -0
  96. package/dist/components/user-button.d.ts +22 -0
  97. package/dist/components/user-button.d.ts.map +1 -0
  98. package/dist/components/user-button.js +134 -0
  99. package/dist/components/user-button.js.map +1 -0
  100. package/dist/components-page/account-settings/active-sessions/active-sessions-page.d.ts +20 -0
  101. package/dist/components-page/account-settings/active-sessions/active-sessions-page.d.ts.map +1 -0
  102. package/dist/components-page/account-settings/active-sessions/active-sessions-page.js +208 -0
  103. package/dist/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -0
  104. package/dist/components-page/account-settings/api-keys/api-keys-page.d.ts +16 -0
  105. package/dist/components-page/account-settings/api-keys/api-keys-page.d.ts.map +1 -0
  106. package/dist/components-page/account-settings/api-keys/api-keys-page.js +115 -0
  107. package/dist/components-page/account-settings/api-keys/api-keys-page.js.map +1 -0
  108. package/dist/components-page/account-settings/editable-text.d.ts +10 -0
  109. package/dist/components-page/account-settings/editable-text.d.ts.map +1 -0
  110. package/dist/components-page/account-settings/editable-text.js +49 -0
  111. package/dist/components-page/account-settings/editable-text.js.map +1 -0
  112. package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.d.ts +9 -0
  113. package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.d.ts.map +1 -0
  114. package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.js +24 -0
  115. package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -0
  116. package/dist/components-page/account-settings/email-and-auth/emails-section.d.ts +9 -0
  117. package/dist/components-page/account-settings/email-and-auth/emails-section.d.ts.map +1 -0
  118. package/dist/components-page/account-settings/email-and-auth/emails-section.js +181 -0
  119. package/dist/components-page/account-settings/email-and-auth/emails-section.js.map +1 -0
  120. package/dist/components-page/account-settings/email-and-auth/mfa-section.d.ts +9 -0
  121. package/dist/components-page/account-settings/email-and-auth/mfa-section.d.ts.map +1 -0
  122. package/dist/components-page/account-settings/email-and-auth/mfa-section.js +121 -0
  123. package/dist/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -0
  124. package/dist/components-page/account-settings/email-and-auth/otp-section.d.ts +9 -0
  125. package/dist/components-page/account-settings/email-and-auth/otp-section.d.ts.map +1 -0
  126. package/dist/components-page/account-settings/email-and-auth/otp-section.js +80 -0
  127. package/dist/components-page/account-settings/email-and-auth/otp-section.js.map +1 -0
  128. package/dist/components-page/account-settings/email-and-auth/passkey-section.d.ts +9 -0
  129. package/dist/components-page/account-settings/email-and-auth/passkey-section.d.ts.map +1 -0
  130. package/dist/components-page/account-settings/email-and-auth/passkey-section.js +89 -0
  131. package/dist/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -0
  132. package/dist/components-page/account-settings/email-and-auth/password-section.d.ts +9 -0
  133. package/dist/components-page/account-settings/email-and-auth/password-section.d.ts.map +1 -0
  134. package/dist/components-page/account-settings/email-and-auth/password-section.js +161 -0
  135. package/dist/components-page/account-settings/email-and-auth/password-section.js.map +1 -0
  136. package/dist/components-page/account-settings/notifications/notifications-page.d.ts +7 -0
  137. package/dist/components-page/account-settings/notifications/notifications-page.d.ts.map +1 -0
  138. package/dist/components-page/account-settings/notifications/notifications-page.js +42 -0
  139. package/dist/components-page/account-settings/notifications/notifications-page.js.map +1 -0
  140. package/dist/components-page/account-settings/page-layout.d.ts +9 -0
  141. package/dist/components-page/account-settings/page-layout.d.ts.map +1 -0
  142. package/dist/components-page/account-settings/page-layout.js +15 -0
  143. package/dist/components-page/account-settings/page-layout.js.map +1 -0
  144. package/dist/components-page/account-settings/payments/payments-page.d.ts +12 -0
  145. package/dist/components-page/account-settings/payments/payments-page.d.ts.map +1 -0
  146. package/dist/components-page/account-settings/payments/payments-page.js +55 -0
  147. package/dist/components-page/account-settings/payments/payments-page.js.map +1 -0
  148. package/dist/components-page/account-settings/payments/payments-panel.d.ts +61 -0
  149. package/dist/components-page/account-settings/payments/payments-panel.d.ts.map +1 -0
  150. package/dist/components-page/account-settings/payments/payments-panel.js +466 -0
  151. package/dist/components-page/account-settings/payments/payments-panel.js.map +1 -0
  152. package/dist/components-page/account-settings/profile-page/profile-page.d.ts +12 -0
  153. package/dist/components-page/account-settings/profile-page/profile-page.d.ts.map +1 -0
  154. package/dist/components-page/account-settings/profile-page/profile-page.js +46 -0
  155. package/dist/components-page/account-settings/profile-page/profile-page.js.map +1 -0
  156. package/dist/components-page/account-settings/section.d.ts +11 -0
  157. package/dist/components-page/account-settings/section.d.ts.map +1 -0
  158. package/dist/components-page/account-settings/section.js +29 -0
  159. package/dist/components-page/account-settings/section.js.map +1 -0
  160. package/dist/components-page/account-settings/settings/delete-account-section.d.ts +9 -0
  161. package/dist/components-page/account-settings/settings/delete-account-section.d.ts.map +1 -0
  162. package/dist/components-page/account-settings/settings/delete-account-section.js +70 -0
  163. package/dist/components-page/account-settings/settings/delete-account-section.js.map +1 -0
  164. package/dist/components-page/account-settings/settings/settings-page.d.ts +9 -0
  165. package/dist/components-page/account-settings/settings/settings-page.d.ts.map +1 -0
  166. package/dist/components-page/account-settings/settings/settings-page.js +15 -0
  167. package/dist/components-page/account-settings/settings/settings-page.js.map +1 -0
  168. package/dist/components-page/account-settings/settings/sign-out-section.d.ts +9 -0
  169. package/dist/components-page/account-settings/settings/sign-out-section.d.ts.map +1 -0
  170. package/dist/components-page/account-settings/settings/sign-out-section.js +33 -0
  171. package/dist/components-page/account-settings/settings/sign-out-section.js.map +1 -0
  172. package/dist/components-page/account-settings/teams/leave-team-section.d.ts +10 -0
  173. package/dist/components-page/account-settings/teams/leave-team-section.d.ts.map +1 -0
  174. package/dist/components-page/account-settings/teams/leave-team-section.js +48 -0
  175. package/dist/components-page/account-settings/teams/leave-team-section.js.map +1 -0
  176. package/dist/components-page/account-settings/teams/team-api-keys-section.d.ts +10 -0
  177. package/dist/components-page/account-settings/teams/team-api-keys-section.d.ts.map +1 -0
  178. package/dist/components-page/account-settings/teams/team-api-keys-section.js +57 -0
  179. package/dist/components-page/account-settings/teams/team-api-keys-section.js.map +1 -0
  180. package/dist/components-page/account-settings/teams/team-creation-page.d.ts +9 -0
  181. package/dist/components-page/account-settings/teams/team-creation-page.d.ts.map +1 -0
  182. package/dist/components-page/account-settings/teams/team-creation-page.js +67 -0
  183. package/dist/components-page/account-settings/teams/team-creation-page.js.map +1 -0
  184. package/dist/components-page/account-settings/teams/team-display-name-section.d.ts +10 -0
  185. package/dist/components-page/account-settings/teams/team-display-name-section.d.ts.map +1 -0
  186. package/dist/components-page/account-settings/teams/team-display-name-section.js +25 -0
  187. package/dist/components-page/account-settings/teams/team-display-name-section.js.map +1 -0
  188. package/dist/components-page/account-settings/teams/team-member-invitation-section.d.ts +10 -0
  189. package/dist/components-page/account-settings/teams/team-member-invitation-section.d.ts.map +1 -0
  190. package/dist/components-page/account-settings/teams/team-member-invitation-section.js +114 -0
  191. package/dist/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -0
  192. package/dist/components-page/account-settings/teams/team-member-list-section.d.ts +10 -0
  193. package/dist/components-page/account-settings/teams/team-member-list-section.d.ts.map +1 -0
  194. package/dist/components-page/account-settings/teams/team-member-list-section.js +40 -0
  195. package/dist/components-page/account-settings/teams/team-member-list-section.js.map +1 -0
  196. package/dist/components-page/account-settings/teams/team-page.d.ts +10 -0
  197. package/dist/components-page/account-settings/teams/team-page.d.ts.map +1 -0
  198. package/dist/components-page/account-settings/teams/team-page.js +28 -0
  199. package/dist/components-page/account-settings/teams/team-page.js.map +1 -0
  200. package/dist/components-page/account-settings/teams/team-profile-image-section.d.ts +10 -0
  201. package/dist/components-page/account-settings/teams/team-profile-image-section.d.ts.map +1 -0
  202. package/dist/components-page/account-settings/teams/team-profile-image-section.js +27 -0
  203. package/dist/components-page/account-settings/teams/team-profile-image-section.js.map +1 -0
  204. package/dist/components-page/account-settings/teams/team-profile-user-section.d.ts +10 -0
  205. package/dist/components-page/account-settings/teams/team-profile-user-section.d.ts.map +1 -0
  206. package/dist/components-page/account-settings/teams/team-profile-user-section.js +27 -0
  207. package/dist/components-page/account-settings/teams/team-profile-user-section.js.map +1 -0
  208. package/dist/components-page/account-settings.d.ts +58 -0
  209. package/dist/components-page/account-settings.d.ts.map +1 -0
  210. package/dist/components-page/account-settings.js +267 -0
  211. package/dist/components-page/account-settings.js.map +1 -0
  212. package/dist/components-page/auth-page.d.ts +26 -0
  213. package/dist/components-page/auth-page.d.ts.map +1 -0
  214. package/dist/components-page/auth-page.js +163 -0
  215. package/dist/components-page/auth-page.js.map +1 -0
  216. package/dist/components-page/cli-auth-confirm.d.ts +21 -0
  217. package/dist/components-page/cli-auth-confirm.d.ts.map +1 -0
  218. package/dist/components-page/cli-auth-confirm.js +216 -0
  219. package/dist/components-page/cli-auth-confirm.js.map +1 -0
  220. package/dist/components-page/cli-auth-confirm.test.d.ts +1 -0
  221. package/dist/components-page/cli-auth-confirm.test.js +176 -0
  222. package/dist/components-page/cli-auth-confirm.test.js.map +1 -0
  223. package/dist/components-page/email-verification.d.ts +10 -0
  224. package/dist/components-page/email-verification.d.ts.map +1 -0
  225. package/dist/components-page/email-verification.js +60 -0
  226. package/dist/components-page/email-verification.js.map +1 -0
  227. package/dist/components-page/error-page.d.ts +10 -0
  228. package/dist/components-page/error-page.d.ts.map +1 -0
  229. package/dist/components-page/error-page.js +77 -0
  230. package/dist/components-page/error-page.js.map +1 -0
  231. package/dist/components-page/forgot-password.d.ts +14 -0
  232. package/dist/components-page/forgot-password.d.ts.map +1 -0
  233. package/dist/components-page/forgot-password.js +103 -0
  234. package/dist/components-page/forgot-password.js.map +1 -0
  235. package/dist/components-page/magic-link-callback.d.ts +10 -0
  236. package/dist/components-page/magic-link-callback.d.ts.map +1 -0
  237. package/dist/components-page/magic-link-callback.js +75 -0
  238. package/dist/components-page/magic-link-callback.js.map +1 -0
  239. package/dist/components-page/mfa.d.ts +11 -0
  240. package/dist/components-page/mfa.d.ts.map +1 -0
  241. package/dist/components-page/mfa.js +169 -0
  242. package/dist/components-page/mfa.js.map +1 -0
  243. package/dist/components-page/oauth-callback.d.ts +11 -0
  244. package/dist/components-page/oauth-callback.d.ts.map +1 -0
  245. package/dist/components-page/oauth-callback.js +72 -0
  246. package/dist/components-page/oauth-callback.js.map +1 -0
  247. package/dist/components-page/onboarding.d.ts +9 -0
  248. package/dist/components-page/onboarding.d.ts.map +1 -0
  249. package/dist/components-page/onboarding.js +140 -0
  250. package/dist/components-page/onboarding.js.map +1 -0
  251. package/dist/components-page/password-reset.d.ts +17 -0
  252. package/dist/components-page/password-reset.d.ts.map +1 -0
  253. package/dist/components-page/password-reset.js +161 -0
  254. package/dist/components-page/password-reset.js.map +1 -0
  255. package/dist/components-page/section.d.ts +1 -0
  256. package/dist/components-page/section.js +2 -0
  257. package/dist/components-page/sign-in.d.ts +23 -0
  258. package/dist/components-page/sign-in.d.ts.map +1 -0
  259. package/dist/components-page/sign-in.js +20 -0
  260. package/dist/components-page/sign-in.js.map +1 -0
  261. package/dist/components-page/sign-out.d.ts +9 -0
  262. package/dist/components-page/sign-out.d.ts.map +1 -0
  263. package/dist/components-page/sign-out.js +26 -0
  264. package/dist/components-page/sign-out.js.map +1 -0
  265. package/dist/components-page/sign-up.d.ts +13 -0
  266. package/dist/components-page/sign-up.d.ts.map +1 -0
  267. package/dist/components-page/sign-up.js +22 -0
  268. package/dist/components-page/sign-up.js.map +1 -0
  269. package/dist/components-page/stack-handler-client.d.ts +50 -0
  270. package/dist/components-page/stack-handler-client.d.ts.map +1 -0
  271. package/dist/components-page/stack-handler-client.js +220 -0
  272. package/dist/components-page/stack-handler-client.js.map +1 -0
  273. package/dist/components-page/stack-handler.d.ts +32 -0
  274. package/dist/components-page/stack-handler.d.ts.map +1 -0
  275. package/dist/components-page/stack-handler.js +12 -0
  276. package/dist/components-page/stack-handler.js.map +1 -0
  277. package/dist/components-page/team-creation.d.ts +9 -0
  278. package/dist/components-page/team-creation.d.ts.map +1 -0
  279. package/dist/components-page/team-creation.js +80 -0
  280. package/dist/components-page/team-creation.js.map +1 -0
  281. package/dist/components-page/team-invitation.d.ts +13 -0
  282. package/dist/components-page/team-invitation.d.ts.map +1 -0
  283. package/dist/components-page/team-invitation.js +109 -0
  284. package/dist/components-page/team-invitation.js.map +1 -0
  285. package/dist/dev-tool/dev-tool-core.d.ts +7 -0
  286. package/dist/dev-tool/dev-tool-core.d.ts.map +1 -0
  287. package/dist/dev-tool/dev-tool-core.js +2116 -0
  288. package/dist/dev-tool/dev-tool-core.js.map +1 -0
  289. package/dist/dev-tool/dev-tool-styles.d.ts +5 -0
  290. package/dist/dev-tool/dev-tool-styles.d.ts.map +1 -0
  291. package/dist/dev-tool/dev-tool-styles.js +2757 -0
  292. package/dist/dev-tool/dev-tool-styles.js.map +1 -0
  293. package/dist/dev-tool/dev-tool-trigger-position.d.ts +36 -0
  294. package/dist/dev-tool/dev-tool-trigger-position.d.ts.map +1 -0
  295. package/dist/dev-tool/dev-tool-trigger-position.js +70 -0
  296. package/dist/dev-tool/dev-tool-trigger-position.js.map +1 -0
  297. package/dist/dev-tool/dev-tool-trigger-position.test.d.ts +1 -0
  298. package/dist/dev-tool/dev-tool-trigger-position.test.js +155 -0
  299. package/dist/dev-tool/dev-tool-trigger-position.test.js.map +1 -0
  300. package/dist/dev-tool/index.d.ts +19 -0
  301. package/dist/dev-tool/index.d.ts.map +1 -0
  302. package/dist/dev-tool/index.js +119 -0
  303. package/dist/dev-tool/index.js.map +1 -0
  304. package/dist/esm/components/api-key-dialogs.d.ts +28 -0
  305. package/dist/esm/components/api-key-dialogs.d.ts.map +1 -0
  306. package/dist/esm/components/api-key-dialogs.js +158 -0
  307. package/dist/esm/components/api-key-dialogs.js.map +1 -0
  308. package/dist/esm/components/api-key-table.d.ts +10 -0
  309. package/dist/esm/components/api-key-table.d.ts.map +1 -0
  310. package/dist/esm/components/api-key-table.js +142 -0
  311. package/dist/esm/components/api-key-table.js.map +1 -0
  312. package/dist/esm/components/credential-sign-in.d.ts +7 -0
  313. package/dist/esm/components/credential-sign-in.d.ts.map +1 -0
  314. package/dist/esm/components/credential-sign-in.js +85 -0
  315. package/dist/esm/components/credential-sign-in.js.map +1 -0
  316. package/dist/esm/components/credential-sign-up.d.ts +9 -0
  317. package/dist/esm/components/credential-sign-up.d.ts.map +1 -0
  318. package/dist/esm/components/credential-sign-up.js +117 -0
  319. package/dist/esm/components/credential-sign-up.js.map +1 -0
  320. package/dist/esm/components/elements/form-warning.d.ts +11 -0
  321. package/dist/esm/components/elements/form-warning.d.ts.map +1 -0
  322. package/dist/esm/components/elements/form-warning.js +16 -0
  323. package/dist/esm/components/elements/form-warning.js.map +1 -0
  324. package/dist/esm/components/elements/maybe-full-page.d.ts +16 -0
  325. package/dist/esm/components/elements/maybe-full-page.d.ts.map +1 -0
  326. package/dist/esm/components/elements/maybe-full-page.js +38 -0
  327. package/dist/esm/components/elements/maybe-full-page.js.map +1 -0
  328. package/dist/esm/components/elements/separator-with-text.d.ts +11 -0
  329. package/dist/esm/components/elements/separator-with-text.d.ts.map +1 -0
  330. package/dist/esm/components/elements/separator-with-text.js +29 -0
  331. package/dist/esm/components/elements/separator-with-text.js.map +1 -0
  332. package/dist/esm/components/elements/sidebar-layout.d.ts +21 -0
  333. package/dist/esm/components/elements/sidebar-layout.d.ts.map +1 -0
  334. package/dist/esm/components/elements/sidebar-layout.js +132 -0
  335. package/dist/esm/components/elements/sidebar-layout.js.map +1 -0
  336. package/dist/esm/components/elements/ssr-layout-effect.d.ts +10 -0
  337. package/dist/esm/components/elements/ssr-layout-effect.d.ts.map +1 -0
  338. package/dist/esm/components/elements/ssr-layout-effect.js +20 -0
  339. package/dist/esm/components/elements/ssr-layout-effect.js.map +1 -0
  340. package/dist/esm/components/elements/user-avatar.d.ts +15 -0
  341. package/dist/esm/components/elements/user-avatar.d.ts.map +1 -0
  342. package/dist/esm/components/elements/user-avatar.js +28 -0
  343. package/dist/esm/components/elements/user-avatar.js.map +1 -0
  344. package/dist/esm/components/link.d.ts +16 -0
  345. package/dist/esm/components/link.d.ts.map +1 -0
  346. package/dist/esm/components/link.js +28 -0
  347. package/dist/esm/components/link.js.map +1 -0
  348. package/dist/esm/components/magic-link-sign-in.d.ts +7 -0
  349. package/dist/esm/components/magic-link-sign-in.d.ts.map +1 -0
  350. package/dist/esm/components/magic-link-sign-in.js +136 -0
  351. package/dist/esm/components/magic-link-sign-in.js.map +1 -0
  352. package/dist/esm/components/message-cards/known-error-message-card.d.ts +14 -0
  353. package/dist/esm/components/message-cards/known-error-message-card.d.ts.map +1 -0
  354. package/dist/esm/components/message-cards/known-error-message-card.js +22 -0
  355. package/dist/esm/components/message-cards/known-error-message-card.js.map +1 -0
  356. package/dist/esm/components/message-cards/message-card.d.ts +19 -0
  357. package/dist/esm/components/message-cards/message-card.d.ts.map +1 -0
  358. package/dist/esm/components/message-cards/message-card.js +43 -0
  359. package/dist/esm/components/message-cards/message-card.js.map +1 -0
  360. package/dist/esm/components/message-cards/predefined-message-card.d.ts +13 -0
  361. package/dist/esm/components/message-cards/predefined-message-card.d.ts.map +1 -0
  362. package/dist/esm/components/message-cards/predefined-message-card.js +71 -0
  363. package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -0
  364. package/dist/esm/components/oauth-button-group.d.ts +19 -0
  365. package/dist/esm/components/oauth-button-group.d.ts.map +1 -0
  366. package/dist/esm/components/oauth-button-group.js +22 -0
  367. package/dist/esm/components/oauth-button-group.js.map +1 -0
  368. package/dist/esm/components/oauth-button.d.ts +17 -0
  369. package/dist/esm/components/oauth-button.d.ts.map +1 -0
  370. package/dist/esm/components/oauth-button.js +170 -0
  371. package/dist/esm/components/oauth-button.js.map +1 -0
  372. package/dist/esm/components/passkey-button.d.ts +11 -0
  373. package/dist/esm/components/passkey-button.d.ts.map +1 -0
  374. package/dist/esm/components/passkey-button.js +31 -0
  375. package/dist/esm/components/passkey-button.js.map +1 -0
  376. package/dist/esm/components/profile-image-editor.d.ts +15 -0
  377. package/dist/esm/components/profile-image-editor.d.ts.map +1 -0
  378. package/dist/esm/components/profile-image-editor.js +165 -0
  379. package/dist/esm/components/profile-image-editor.js.map +1 -0
  380. package/dist/esm/components/selected-team-switcher.d.ts +31 -0
  381. package/dist/esm/components/selected-team-switcher.d.ts.map +1 -0
  382. package/dist/esm/components/selected-team-switcher.js +57 -0
  383. package/dist/esm/components/selected-team-switcher.js.map +1 -0
  384. package/dist/esm/components/team-icon.d.ts +10 -0
  385. package/dist/esm/components/team-icon.d.ts.map +1 -0
  386. package/dist/esm/components/team-icon.js +29 -0
  387. package/dist/esm/components/team-icon.js.map +1 -0
  388. package/dist/esm/components/team-switcher.d.ts +31 -0
  389. package/dist/esm/components/team-switcher.d.ts.map +1 -0
  390. package/dist/esm/components/team-switcher.js +121 -0
  391. package/dist/esm/components/team-switcher.js.map +1 -0
  392. package/dist/esm/components/use-in-iframe.d.ts +5 -0
  393. package/dist/esm/components/use-in-iframe.d.ts.map +1 -0
  394. package/dist/esm/components/use-in-iframe.js +16 -0
  395. package/dist/esm/components/use-in-iframe.js.map +1 -0
  396. package/dist/esm/components/user-button.d.ts +22 -0
  397. package/dist/esm/components/user-button.d.ts.map +1 -0
  398. package/dist/esm/components/user-button.js +131 -0
  399. package/dist/esm/components/user-button.js.map +1 -0
  400. package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.d.ts +20 -0
  401. package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.d.ts.map +1 -0
  402. package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js +206 -0
  403. package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -0
  404. package/dist/esm/components-page/account-settings/api-keys/api-keys-page.d.ts +16 -0
  405. package/dist/esm/components-page/account-settings/api-keys/api-keys-page.d.ts.map +1 -0
  406. package/dist/esm/components-page/account-settings/api-keys/api-keys-page.js +113 -0
  407. package/dist/esm/components-page/account-settings/api-keys/api-keys-page.js.map +1 -0
  408. package/dist/esm/components-page/account-settings/editable-text.d.ts +10 -0
  409. package/dist/esm/components-page/account-settings/editable-text.d.ts.map +1 -0
  410. package/dist/esm/components-page/account-settings/editable-text.js +47 -0
  411. package/dist/esm/components-page/account-settings/editable-text.js.map +1 -0
  412. package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.d.ts +9 -0
  413. package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.d.ts.map +1 -0
  414. package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.js +22 -0
  415. package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -0
  416. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.d.ts +9 -0
  417. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.d.ts.map +1 -0
  418. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js +179 -0
  419. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js.map +1 -0
  420. package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.d.ts +9 -0
  421. package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.d.ts.map +1 -0
  422. package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js +118 -0
  423. package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -0
  424. package/dist/esm/components-page/account-settings/email-and-auth/otp-section.d.ts +9 -0
  425. package/dist/esm/components-page/account-settings/email-and-auth/otp-section.d.ts.map +1 -0
  426. package/dist/esm/components-page/account-settings/email-and-auth/otp-section.js +78 -0
  427. package/dist/esm/components-page/account-settings/email-and-auth/otp-section.js.map +1 -0
  428. package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.d.ts +9 -0
  429. package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.d.ts.map +1 -0
  430. package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.js +87 -0
  431. package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -0
  432. package/dist/esm/components-page/account-settings/email-and-auth/password-section.d.ts +9 -0
  433. package/dist/esm/components-page/account-settings/email-and-auth/password-section.d.ts.map +1 -0
  434. package/dist/esm/components-page/account-settings/email-and-auth/password-section.js +158 -0
  435. package/dist/esm/components-page/account-settings/email-and-auth/password-section.js.map +1 -0
  436. package/dist/esm/components-page/account-settings/notifications/notifications-page.d.ts +7 -0
  437. package/dist/esm/components-page/account-settings/notifications/notifications-page.d.ts.map +1 -0
  438. package/dist/esm/components-page/account-settings/notifications/notifications-page.js +40 -0
  439. package/dist/esm/components-page/account-settings/notifications/notifications-page.js.map +1 -0
  440. package/dist/esm/components-page/account-settings/page-layout.d.ts +9 -0
  441. package/dist/esm/components-page/account-settings/page-layout.d.ts.map +1 -0
  442. package/dist/esm/components-page/account-settings/page-layout.js +13 -0
  443. package/dist/esm/components-page/account-settings/page-layout.js.map +1 -0
  444. package/dist/esm/components-page/account-settings/payments/payments-page.d.ts +12 -0
  445. package/dist/esm/components-page/account-settings/payments/payments-page.d.ts.map +1 -0
  446. package/dist/esm/components-page/account-settings/payments/payments-page.js +53 -0
  447. package/dist/esm/components-page/account-settings/payments/payments-page.js.map +1 -0
  448. package/dist/esm/components-page/account-settings/payments/payments-panel.d.ts +61 -0
  449. package/dist/esm/components-page/account-settings/payments/payments-panel.d.ts.map +1 -0
  450. package/dist/esm/components-page/account-settings/payments/payments-panel.js +464 -0
  451. package/dist/esm/components-page/account-settings/payments/payments-panel.js.map +1 -0
  452. package/dist/esm/components-page/account-settings/profile-page/profile-page.d.ts +12 -0
  453. package/dist/esm/components-page/account-settings/profile-page/profile-page.d.ts.map +1 -0
  454. package/dist/esm/components-page/account-settings/profile-page/profile-page.js +44 -0
  455. package/dist/esm/components-page/account-settings/profile-page/profile-page.js.map +1 -0
  456. package/dist/esm/components-page/account-settings/section.d.ts +11 -0
  457. package/dist/esm/components-page/account-settings/section.d.ts.map +1 -0
  458. package/dist/esm/components-page/account-settings/section.js +27 -0
  459. package/dist/esm/components-page/account-settings/section.js.map +1 -0
  460. package/dist/esm/components-page/account-settings/settings/delete-account-section.d.ts +9 -0
  461. package/dist/esm/components-page/account-settings/settings/delete-account-section.d.ts.map +1 -0
  462. package/dist/esm/components-page/account-settings/settings/delete-account-section.js +68 -0
  463. package/dist/esm/components-page/account-settings/settings/delete-account-section.js.map +1 -0
  464. package/dist/esm/components-page/account-settings/settings/settings-page.d.ts +9 -0
  465. package/dist/esm/components-page/account-settings/settings/settings-page.d.ts.map +1 -0
  466. package/dist/esm/components-page/account-settings/settings/settings-page.js +13 -0
  467. package/dist/esm/components-page/account-settings/settings/settings-page.js.map +1 -0
  468. package/dist/esm/components-page/account-settings/settings/sign-out-section.d.ts +9 -0
  469. package/dist/esm/components-page/account-settings/settings/sign-out-section.d.ts.map +1 -0
  470. package/dist/esm/components-page/account-settings/settings/sign-out-section.js +31 -0
  471. package/dist/esm/components-page/account-settings/settings/sign-out-section.js.map +1 -0
  472. package/dist/esm/components-page/account-settings/teams/leave-team-section.d.ts +10 -0
  473. package/dist/esm/components-page/account-settings/teams/leave-team-section.d.ts.map +1 -0
  474. package/dist/esm/components-page/account-settings/teams/leave-team-section.js +46 -0
  475. package/dist/esm/components-page/account-settings/teams/leave-team-section.js.map +1 -0
  476. package/dist/esm/components-page/account-settings/teams/team-api-keys-section.d.ts +10 -0
  477. package/dist/esm/components-page/account-settings/teams/team-api-keys-section.d.ts.map +1 -0
  478. package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js +55 -0
  479. package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js.map +1 -0
  480. package/dist/esm/components-page/account-settings/teams/team-creation-page.d.ts +9 -0
  481. package/dist/esm/components-page/account-settings/teams/team-creation-page.d.ts.map +1 -0
  482. package/dist/esm/components-page/account-settings/teams/team-creation-page.js +65 -0
  483. package/dist/esm/components-page/account-settings/teams/team-creation-page.js.map +1 -0
  484. package/dist/esm/components-page/account-settings/teams/team-display-name-section.d.ts +10 -0
  485. package/dist/esm/components-page/account-settings/teams/team-display-name-section.d.ts.map +1 -0
  486. package/dist/esm/components-page/account-settings/teams/team-display-name-section.js +23 -0
  487. package/dist/esm/components-page/account-settings/teams/team-display-name-section.js.map +1 -0
  488. package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.d.ts +10 -0
  489. package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.d.ts.map +1 -0
  490. package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js +112 -0
  491. package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -0
  492. package/dist/esm/components-page/account-settings/teams/team-member-list-section.d.ts +10 -0
  493. package/dist/esm/components-page/account-settings/teams/team-member-list-section.d.ts.map +1 -0
  494. package/dist/esm/components-page/account-settings/teams/team-member-list-section.js +38 -0
  495. package/dist/esm/components-page/account-settings/teams/team-member-list-section.js.map +1 -0
  496. package/dist/esm/components-page/account-settings/teams/team-page.d.ts +10 -0
  497. package/dist/esm/components-page/account-settings/teams/team-page.d.ts.map +1 -0
  498. package/dist/esm/components-page/account-settings/teams/team-page.js +26 -0
  499. package/dist/esm/components-page/account-settings/teams/team-page.js.map +1 -0
  500. package/dist/esm/components-page/account-settings/teams/team-profile-image-section.d.ts +10 -0
  501. package/dist/esm/components-page/account-settings/teams/team-profile-image-section.d.ts.map +1 -0
  502. package/dist/esm/components-page/account-settings/teams/team-profile-image-section.js +25 -0
  503. package/dist/esm/components-page/account-settings/teams/team-profile-image-section.js.map +1 -0
  504. package/dist/esm/components-page/account-settings/teams/team-profile-user-section.d.ts +10 -0
  505. package/dist/esm/components-page/account-settings/teams/team-profile-user-section.d.ts.map +1 -0
  506. package/dist/esm/components-page/account-settings/teams/team-profile-user-section.js +25 -0
  507. package/dist/esm/components-page/account-settings/teams/team-profile-user-section.js.map +1 -0
  508. package/dist/esm/components-page/account-settings.d.ts +58 -0
  509. package/dist/esm/components-page/account-settings.d.ts.map +1 -0
  510. package/dist/esm/components-page/account-settings.js +264 -0
  511. package/dist/esm/components-page/account-settings.js.map +1 -0
  512. package/dist/esm/components-page/auth-page.d.ts +26 -0
  513. package/dist/esm/components-page/auth-page.d.ts.map +1 -0
  514. package/dist/esm/components-page/auth-page.js +161 -0
  515. package/dist/esm/components-page/auth-page.js.map +1 -0
  516. package/dist/esm/components-page/cli-auth-confirm.d.ts +21 -0
  517. package/dist/esm/components-page/cli-auth-confirm.d.ts.map +1 -0
  518. package/dist/esm/components-page/cli-auth-confirm.js +213 -0
  519. package/dist/esm/components-page/cli-auth-confirm.js.map +1 -0
  520. package/dist/esm/components-page/cli-auth-confirm.test.d.ts +1 -0
  521. package/dist/esm/components-page/cli-auth-confirm.test.js +175 -0
  522. package/dist/esm/components-page/cli-auth-confirm.test.js.map +1 -0
  523. package/dist/esm/components-page/email-verification.d.ts +10 -0
  524. package/dist/esm/components-page/email-verification.d.ts.map +1 -0
  525. package/dist/esm/components-page/email-verification.js +57 -0
  526. package/dist/esm/components-page/email-verification.js.map +1 -0
  527. package/dist/esm/components-page/error-page.d.ts +10 -0
  528. package/dist/esm/components-page/error-page.d.ts.map +1 -0
  529. package/dist/esm/components-page/error-page.js +75 -0
  530. package/dist/esm/components-page/error-page.js.map +1 -0
  531. package/dist/esm/components-page/forgot-password.d.ts +14 -0
  532. package/dist/esm/components-page/forgot-password.d.ts.map +1 -0
  533. package/dist/esm/components-page/forgot-password.js +100 -0
  534. package/dist/esm/components-page/forgot-password.js.map +1 -0
  535. package/dist/esm/components-page/magic-link-callback.d.ts +10 -0
  536. package/dist/esm/components-page/magic-link-callback.d.ts.map +1 -0
  537. package/dist/esm/components-page/magic-link-callback.js +72 -0
  538. package/dist/esm/components-page/magic-link-callback.js.map +1 -0
  539. package/dist/esm/components-page/mfa.d.ts +11 -0
  540. package/dist/esm/components-page/mfa.d.ts.map +1 -0
  541. package/dist/esm/components-page/mfa.js +167 -0
  542. package/dist/esm/components-page/mfa.js.map +1 -0
  543. package/dist/esm/components-page/oauth-callback.d.ts +11 -0
  544. package/dist/esm/components-page/oauth-callback.d.ts.map +1 -0
  545. package/dist/esm/components-page/oauth-callback.js +70 -0
  546. package/dist/esm/components-page/oauth-callback.js.map +1 -0
  547. package/dist/esm/components-page/onboarding.d.ts +9 -0
  548. package/dist/esm/components-page/onboarding.d.ts.map +1 -0
  549. package/dist/esm/components-page/onboarding.js +138 -0
  550. package/dist/esm/components-page/onboarding.js.map +1 -0
  551. package/dist/esm/components-page/password-reset.d.ts +17 -0
  552. package/dist/esm/components-page/password-reset.d.ts.map +1 -0
  553. package/dist/esm/components-page/password-reset.js +157 -0
  554. package/dist/esm/components-page/password-reset.js.map +1 -0
  555. package/dist/esm/components-page/section.d.ts +1 -0
  556. package/dist/esm/components-page/section.js +4 -0
  557. package/dist/esm/components-page/sign-in.d.ts +23 -0
  558. package/dist/esm/components-page/sign-in.d.ts.map +1 -0
  559. package/dist/esm/components-page/sign-in.js +18 -0
  560. package/dist/esm/components-page/sign-in.js.map +1 -0
  561. package/dist/esm/components-page/sign-out.d.ts +9 -0
  562. package/dist/esm/components-page/sign-out.d.ts.map +1 -0
  563. package/dist/esm/components-page/sign-out.js +24 -0
  564. package/dist/esm/components-page/sign-out.js.map +1 -0
  565. package/dist/esm/components-page/sign-up.d.ts +13 -0
  566. package/dist/esm/components-page/sign-up.d.ts.map +1 -0
  567. package/dist/esm/components-page/sign-up.js +20 -0
  568. package/dist/esm/components-page/sign-up.js.map +1 -0
  569. package/dist/esm/components-page/stack-handler-client.d.ts +49 -0
  570. package/dist/esm/components-page/stack-handler-client.d.ts.map +1 -0
  571. package/dist/esm/components-page/stack-handler-client.js +218 -0
  572. package/dist/esm/components-page/stack-handler-client.js.map +1 -0
  573. package/dist/esm/components-page/stack-handler.d.ts +33 -0
  574. package/dist/esm/components-page/stack-handler.d.ts.map +1 -0
  575. package/dist/esm/components-page/stack-handler.js +11 -0
  576. package/dist/esm/components-page/stack-handler.js.map +1 -0
  577. package/dist/esm/components-page/team-creation.d.ts +9 -0
  578. package/dist/esm/components-page/team-creation.d.ts.map +1 -0
  579. package/dist/esm/components-page/team-creation.js +78 -0
  580. package/dist/esm/components-page/team-creation.js.map +1 -0
  581. package/dist/esm/components-page/team-invitation.d.ts +13 -0
  582. package/dist/esm/components-page/team-invitation.d.ts.map +1 -0
  583. package/dist/esm/components-page/team-invitation.js +106 -0
  584. package/dist/esm/components-page/team-invitation.js.map +1 -0
  585. package/dist/esm/dev-tool/dev-tool-core.d.ts +7 -0
  586. package/dist/esm/dev-tool/dev-tool-core.d.ts.map +1 -0
  587. package/dist/esm/dev-tool/dev-tool-core.js +2114 -0
  588. package/dist/esm/dev-tool/dev-tool-core.js.map +1 -0
  589. package/dist/esm/dev-tool/dev-tool-styles.d.ts +5 -0
  590. package/dist/esm/dev-tool/dev-tool-styles.d.ts.map +1 -0
  591. package/dist/esm/dev-tool/dev-tool-styles.js +2755 -0
  592. package/dist/esm/dev-tool/dev-tool-styles.js.map +1 -0
  593. package/dist/esm/dev-tool/dev-tool-trigger-position.d.ts +36 -0
  594. package/dist/esm/dev-tool/dev-tool-trigger-position.d.ts.map +1 -0
  595. package/dist/esm/dev-tool/dev-tool-trigger-position.js +65 -0
  596. package/dist/esm/dev-tool/dev-tool-trigger-position.js.map +1 -0
  597. package/dist/esm/dev-tool/dev-tool-trigger-position.test.d.ts +1 -0
  598. package/dist/esm/dev-tool/dev-tool-trigger-position.test.js +155 -0
  599. package/dist/esm/dev-tool/dev-tool-trigger-position.test.js.map +1 -0
  600. package/dist/esm/dev-tool/index.d.ts +19 -0
  601. package/dist/esm/dev-tool/index.d.ts.map +1 -0
  602. package/dist/esm/dev-tool/index.js +117 -0
  603. package/dist/esm/dev-tool/index.js.map +1 -0
  604. package/dist/esm/generated/global-css.d.ts +5 -0
  605. package/dist/esm/generated/global-css.d.ts.map +1 -0
  606. package/dist/esm/generated/global-css.js +6 -0
  607. package/dist/esm/generated/global-css.js.map +1 -0
  608. package/dist/esm/generated/quetzal-translations.d.ts +6 -0
  609. package/dist/esm/generated/quetzal-translations.d.ts.map +1 -0
  610. package/dist/esm/generated/quetzal-translations.js +4307 -0
  611. package/dist/esm/generated/quetzal-translations.js.map +1 -0
  612. package/dist/esm/global.d.ts +1 -0
  613. package/dist/esm/index.d.ts +27 -0
  614. package/dist/esm/index.js +29 -0
  615. package/dist/esm/integrations/convex/component/convex.config.d.ts +7 -0
  616. package/dist/esm/integrations/convex/component/convex.config.d.ts.map +1 -0
  617. package/dist/esm/integrations/convex/component/convex.config.js +8 -0
  618. package/dist/esm/integrations/convex/component/convex.config.js.map +1 -0
  619. package/dist/esm/integrations/convex.d.ts +13 -0
  620. package/dist/esm/integrations/convex.d.ts.map +1 -0
  621. package/dist/esm/integrations/convex.js +23 -0
  622. package/dist/esm/integrations/convex.js.map +1 -0
  623. package/dist/esm/internal/deprecation-warning.d.ts +1 -0
  624. package/dist/esm/internal/deprecation-warning.js +24 -0
  625. package/dist/esm/internal/deprecation-warning.js.map +1 -0
  626. package/dist/esm/lib/auth.d.ts +31 -0
  627. package/dist/esm/lib/auth.d.ts.map +1 -0
  628. package/dist/esm/lib/auth.js +108 -0
  629. package/dist/esm/lib/auth.js.map +1 -0
  630. package/dist/esm/lib/auth.test.d.ts +1 -0
  631. package/dist/esm/lib/auth.test.js +60 -0
  632. package/dist/esm/lib/auth.test.js.map +1 -0
  633. package/dist/esm/lib/cookie.d.ts +42 -0
  634. package/dist/esm/lib/cookie.d.ts.map +1 -0
  635. package/dist/esm/lib/cookie.js +356 -0
  636. package/dist/esm/lib/cookie.js.map +1 -0
  637. package/dist/esm/lib/env.d.ts +42 -0
  638. package/dist/esm/lib/env.d.ts.map +1 -0
  639. package/dist/esm/lib/env.js +93 -0
  640. package/dist/esm/lib/env.js.map +1 -0
  641. package/dist/esm/lib/hooks.d.ts +33 -0
  642. package/dist/esm/lib/hooks.d.ts.map +1 -0
  643. package/dist/esm/lib/hooks.js +27 -0
  644. package/dist/esm/lib/hooks.js.map +1 -0
  645. package/dist/esm/lib/stack-app/api-keys/index.d.ts +53 -0
  646. package/dist/esm/lib/stack-app/api-keys/index.d.ts.map +1 -0
  647. package/dist/esm/lib/stack-app/api-keys/index.js +22 -0
  648. package/dist/esm/lib/stack-app/api-keys/index.js.map +1 -0
  649. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.d.ts +429 -0
  650. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +1 -0
  651. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +1044 -0
  652. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -0
  653. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.d.ts +1 -0
  654. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js +55 -0
  655. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -0
  656. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.d.ts +599 -0
  657. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +1 -0
  658. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js +2842 -0
  659. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -0
  660. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.d.ts +1 -0
  661. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.js +32 -0
  662. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +1 -0
  663. package/dist/esm/lib/stack-app/apps/implementations/common.d.ts +66 -0
  664. package/dist/esm/lib/stack-app/apps/implementations/common.d.ts.map +1 -0
  665. package/dist/esm/lib/stack-app/apps/implementations/common.js +164 -0
  666. package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -0
  667. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.d.ts +42 -0
  668. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.d.ts.map +1 -0
  669. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.js +211 -0
  670. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.js.map +1 -0
  671. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.test.d.ts +1 -0
  672. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.test.js +87 -0
  673. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.test.js.map +1 -0
  674. package/dist/esm/lib/stack-app/apps/implementations/index.d.ts +9 -0
  675. package/dist/esm/lib/stack-app/apps/implementations/index.d.ts.map +1 -0
  676. package/dist/esm/lib/stack-app/apps/implementations/index.js +27 -0
  677. package/dist/esm/lib/stack-app/apps/implementations/index.js.map +1 -0
  678. package/dist/esm/lib/stack-app/apps/implementations/redirect-page-urls.d.ts +35 -0
  679. package/dist/esm/lib/stack-app/apps/implementations/redirect-page-urls.d.ts.map +1 -0
  680. package/dist/esm/lib/stack-app/apps/implementations/redirect-page-urls.js +197 -0
  681. package/dist/esm/lib/stack-app/apps/implementations/redirect-page-urls.js.map +1 -0
  682. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.d.ts +260 -0
  683. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.d.ts.map +1 -0
  684. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js +1383 -0
  685. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -0
  686. package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.d.ts +28 -0
  687. package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.d.ts.map +1 -0
  688. package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.js +31 -0
  689. package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.js.map +1 -0
  690. package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.test.d.ts +1 -0
  691. package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.test.js +82 -0
  692. package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.test.js.map +1 -0
  693. package/dist/esm/lib/stack-app/apps/implementations/session-replay.d.ts +111 -0
  694. package/dist/esm/lib/stack-app/apps/implementations/session-replay.d.ts.map +1 -0
  695. package/dist/esm/lib/stack-app/apps/implementations/session-replay.js +241 -0
  696. package/dist/esm/lib/stack-app/apps/implementations/session-replay.js.map +1 -0
  697. package/dist/esm/lib/stack-app/apps/implementations/session-replay.test.d.ts +1 -0
  698. package/dist/esm/lib/stack-app/apps/implementations/session-replay.test.js +29 -0
  699. package/dist/esm/lib/stack-app/apps/implementations/session-replay.test.js.map +1 -0
  700. package/dist/esm/lib/stack-app/apps/index.d.ts +4 -0
  701. package/dist/esm/lib/stack-app/apps/index.js +5 -0
  702. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.d.ts +261 -0
  703. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.d.ts.map +1 -0
  704. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js +9 -0
  705. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +1 -0
  706. package/dist/esm/lib/stack-app/apps/interfaces/client-app.d.ts +226 -0
  707. package/dist/esm/lib/stack-app/apps/interfaces/client-app.d.ts.map +1 -0
  708. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js +9 -0
  709. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +1 -0
  710. package/dist/esm/lib/stack-app/apps/interfaces/server-app.d.ts +157 -0
  711. package/dist/esm/lib/stack-app/apps/interfaces/server-app.d.ts.map +1 -0
  712. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js +9 -0
  713. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +1 -0
  714. package/dist/esm/lib/stack-app/common.d.ts +183 -0
  715. package/dist/esm/lib/stack-app/common.d.ts.map +1 -0
  716. package/dist/esm/lib/stack-app/common.js +7 -0
  717. package/dist/esm/lib/stack-app/common.js.map +1 -0
  718. package/dist/esm/lib/stack-app/connected-accounts/index.d.ts +57 -0
  719. package/dist/esm/lib/stack-app/connected-accounts/index.d.ts.map +1 -0
  720. package/dist/esm/lib/stack-app/connected-accounts/index.js +1 -0
  721. package/dist/esm/lib/stack-app/contact-channels/index.d.ts +43 -0
  722. package/dist/esm/lib/stack-app/contact-channels/index.d.ts.map +1 -0
  723. package/dist/esm/lib/stack-app/contact-channels/index.js +39 -0
  724. package/dist/esm/lib/stack-app/contact-channels/index.js.map +1 -0
  725. package/dist/esm/lib/stack-app/customers/index.d.ts +129 -0
  726. package/dist/esm/lib/stack-app/customers/index.d.ts.map +1 -0
  727. package/dist/esm/lib/stack-app/customers/index.js +1 -0
  728. package/dist/esm/lib/stack-app/data-vault/index.d.ts +14 -0
  729. package/dist/esm/lib/stack-app/data-vault/index.d.ts.map +1 -0
  730. package/dist/esm/lib/stack-app/data-vault/index.js +1 -0
  731. package/dist/esm/lib/stack-app/email/index.d.ts +204 -0
  732. package/dist/esm/lib/stack-app/email/index.d.ts.map +1 -0
  733. package/dist/esm/lib/stack-app/email/index.js +1 -0
  734. package/dist/esm/lib/stack-app/email-templates/index.d.ts +17 -0
  735. package/dist/esm/lib/stack-app/email-templates/index.d.ts.map +1 -0
  736. package/dist/esm/lib/stack-app/email-templates/index.js +11 -0
  737. package/dist/esm/lib/stack-app/email-templates/index.js.map +1 -0
  738. package/dist/esm/lib/stack-app/index.d.ts +14 -0
  739. package/dist/esm/lib/stack-app/index.js +5 -0
  740. package/dist/esm/lib/stack-app/internal-api-keys/index.d.ts +42 -0
  741. package/dist/esm/lib/stack-app/internal-api-keys/index.d.ts.map +1 -0
  742. package/dist/esm/lib/stack-app/internal-api-keys/index.js +14 -0
  743. package/dist/esm/lib/stack-app/internal-api-keys/index.js.map +1 -0
  744. package/dist/esm/lib/stack-app/notification-categories/index.d.ts +11 -0
  745. package/dist/esm/lib/stack-app/notification-categories/index.d.ts.map +1 -0
  746. package/dist/esm/lib/stack-app/notification-categories/index.js +1 -0
  747. package/dist/esm/lib/stack-app/permissions/index.d.ts +43 -0
  748. package/dist/esm/lib/stack-app/permissions/index.d.ts.map +1 -0
  749. package/dist/esm/lib/stack-app/permissions/index.js +31 -0
  750. package/dist/esm/lib/stack-app/permissions/index.js.map +1 -0
  751. package/dist/esm/lib/stack-app/project-configs/index.d.ts +99 -0
  752. package/dist/esm/lib/stack-app/project-configs/index.d.ts.map +1 -0
  753. package/dist/esm/lib/stack-app/project-configs/index.js +1 -0
  754. package/dist/esm/lib/stack-app/projects/index.d.ts +147 -0
  755. package/dist/esm/lib/stack-app/projects/index.d.ts.map +1 -0
  756. package/dist/esm/lib/stack-app/projects/index.js +66 -0
  757. package/dist/esm/lib/stack-app/projects/index.js.map +1 -0
  758. package/dist/esm/lib/stack-app/session-replays/index.d.ts +66 -0
  759. package/dist/esm/lib/stack-app/session-replays/index.d.ts.map +1 -0
  760. package/dist/esm/lib/stack-app/session-replays/index.js +1 -0
  761. package/dist/esm/lib/stack-app/teams/index.d.ts +163 -0
  762. package/dist/esm/lib/stack-app/teams/index.d.ts.map +1 -0
  763. package/dist/esm/lib/stack-app/teams/index.js +35 -0
  764. package/dist/esm/lib/stack-app/teams/index.js.map +1 -0
  765. package/dist/esm/lib/stack-app/url-targets.d.ts +39 -0
  766. package/dist/esm/lib/stack-app/url-targets.d.ts.map +1 -0
  767. package/dist/esm/lib/stack-app/url-targets.js +266 -0
  768. package/dist/esm/lib/stack-app/url-targets.js.map +1 -0
  769. package/dist/esm/lib/stack-app/url-targets.test.d.ts +1 -0
  770. package/dist/esm/lib/stack-app/url-targets.test.js +213 -0
  771. package/dist/esm/lib/stack-app/url-targets.test.js.map +1 -0
  772. package/dist/esm/lib/stack-app/users/index.d.ts +400 -0
  773. package/dist/esm/lib/stack-app/users/index.d.ts.map +1 -0
  774. package/dist/esm/lib/stack-app/users/index.js +71 -0
  775. package/dist/esm/lib/stack-app/users/index.js.map +1 -0
  776. package/dist/esm/lib/translations.d.ts +7 -0
  777. package/dist/esm/lib/translations.d.ts.map +1 -0
  778. package/dist/esm/lib/translations.js +18 -0
  779. package/dist/esm/lib/translations.js.map +1 -0
  780. package/dist/esm/providers/stack-context.d.ts +10 -0
  781. package/dist/esm/providers/stack-context.d.ts.map +1 -0
  782. package/dist/esm/providers/stack-context.js +10 -0
  783. package/dist/esm/providers/stack-context.js.map +1 -0
  784. package/dist/esm/providers/stack-provider-client.d.ts +17 -0
  785. package/dist/esm/providers/stack-provider-client.d.ts.map +1 -0
  786. package/dist/esm/providers/stack-provider-client.js +30 -0
  787. package/dist/esm/providers/stack-provider-client.js.map +1 -0
  788. package/dist/esm/providers/stack-provider.d.ts +26 -0
  789. package/dist/esm/providers/stack-provider.d.ts.map +1 -0
  790. package/dist/esm/providers/stack-provider.js +22 -0
  791. package/dist/esm/providers/stack-provider.js.map +1 -0
  792. package/dist/esm/providers/theme-provider.d.ts +46 -0
  793. package/dist/esm/providers/theme-provider.d.ts.map +1 -0
  794. package/dist/esm/providers/theme-provider.js +68 -0
  795. package/dist/esm/providers/theme-provider.js.map +1 -0
  796. package/dist/esm/providers/translation-provider-client.d.ts +16 -0
  797. package/dist/esm/providers/translation-provider-client.d.ts.map +1 -0
  798. package/dist/esm/providers/translation-provider-client.js +20 -0
  799. package/dist/esm/providers/translation-provider-client.js.map +1 -0
  800. package/dist/esm/providers/translation-provider.d.ts +16 -0
  801. package/dist/esm/providers/translation-provider.d.ts.map +1 -0
  802. package/dist/esm/providers/translation-provider.js +23 -0
  803. package/dist/esm/providers/translation-provider.js.map +1 -0
  804. package/dist/esm/tanstack-start-server-context.d.ts +15 -0
  805. package/dist/esm/tanstack-start-server-context.d.ts.map +1 -0
  806. package/dist/esm/utils/browser-script.d.ts +9 -0
  807. package/dist/esm/utils/browser-script.d.ts.map +1 -0
  808. package/dist/esm/utils/browser-script.js +105 -0
  809. package/dist/esm/utils/browser-script.js.map +1 -0
  810. package/dist/esm/utils/constants.d.ts +81 -0
  811. package/dist/esm/utils/constants.d.ts.map +1 -0
  812. package/dist/esm/utils/constants.js +82 -0
  813. package/dist/esm/utils/constants.js.map +1 -0
  814. package/dist/esm/utils/url.d.ts +5 -0
  815. package/dist/esm/utils/url.d.ts.map +1 -0
  816. package/dist/esm/utils/url.js +16 -0
  817. package/dist/esm/utils/url.js.map +1 -0
  818. package/dist/generated/global-css.d.ts +5 -0
  819. package/dist/generated/global-css.d.ts.map +1 -0
  820. package/dist/generated/global-css.js +8 -0
  821. package/dist/generated/global-css.js.map +1 -0
  822. package/dist/generated/quetzal-translations.d.ts +6 -0
  823. package/dist/generated/quetzal-translations.d.ts.map +1 -0
  824. package/dist/generated/quetzal-translations.js +4310 -0
  825. package/dist/generated/quetzal-translations.js.map +1 -0
  826. package/dist/global.d.d.ts +0 -0
  827. package/dist/global.d.ts +1 -0
  828. package/dist/index.d.ts +40 -0
  829. package/dist/index.js +223 -0
  830. package/dist/integrations/convex/component/convex.config.d.ts +61 -0
  831. package/dist/integrations/convex/component/convex.config.d.ts.map +1 -0
  832. package/dist/integrations/convex/component/convex.config.js +9 -0
  833. package/dist/integrations/convex/component/convex.config.js.map +1 -0
  834. package/dist/integrations/convex.d.ts +13 -0
  835. package/dist/integrations/convex.d.ts.map +1 -0
  836. package/dist/integrations/convex.js +25 -0
  837. package/dist/integrations/convex.js.map +1 -0
  838. package/dist/internal/deprecation-warning.d.ts +1 -0
  839. package/dist/internal/deprecation-warning.js +24 -0
  840. package/dist/internal/deprecation-warning.js.map +1 -0
  841. package/dist/lib/auth.d.ts +31 -0
  842. package/dist/lib/auth.d.ts.map +1 -0
  843. package/dist/lib/auth.js +111 -0
  844. package/dist/lib/auth.js.map +1 -0
  845. package/dist/lib/auth.test.d.ts +1 -0
  846. package/dist/lib/auth.test.js +60 -0
  847. package/dist/lib/auth.test.js.map +1 -0
  848. package/dist/lib/cookie.d.ts +42 -0
  849. package/dist/lib/cookie.d.ts.map +1 -0
  850. package/dist/lib/cookie.js +374 -0
  851. package/dist/lib/cookie.js.map +1 -0
  852. package/dist/lib/env.d.ts +42 -0
  853. package/dist/lib/env.d.ts.map +1 -0
  854. package/dist/lib/env.js +95 -0
  855. package/dist/lib/env.js.map +1 -0
  856. package/dist/lib/hooks.d.ts +35 -0
  857. package/dist/lib/hooks.d.ts.map +1 -0
  858. package/dist/lib/hooks.js +30 -0
  859. package/dist/lib/hooks.js.map +1 -0
  860. package/dist/lib/stack-app/api-keys/index.d.ts +53 -0
  861. package/dist/lib/stack-app/api-keys/index.d.ts.map +1 -0
  862. package/dist/lib/stack-app/api-keys/index.js +25 -0
  863. package/dist/lib/stack-app/api-keys/index.js.map +1 -0
  864. package/dist/lib/stack-app/apps/implementations/admin-app-impl.d.ts +427 -0
  865. package/dist/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +1 -0
  866. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +1046 -0
  867. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -0
  868. package/dist/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.d.ts +1 -0
  869. package/dist/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js +55 -0
  870. package/dist/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -0
  871. package/dist/lib/stack-app/apps/implementations/client-app-impl.d.ts +598 -0
  872. package/dist/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +1 -0
  873. package/dist/lib/stack-app/apps/implementations/client-app-impl.js +2847 -0
  874. package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -0
  875. package/dist/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.d.ts +1 -0
  876. package/dist/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.js +32 -0
  877. package/dist/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +1 -0
  878. package/dist/lib/stack-app/apps/implementations/common.d.ts +66 -0
  879. package/dist/lib/stack-app/apps/implementations/common.d.ts.map +1 -0
  880. package/dist/lib/stack-app/apps/implementations/common.js +183 -0
  881. package/dist/lib/stack-app/apps/implementations/common.js.map +1 -0
  882. package/dist/lib/stack-app/apps/implementations/event-tracker.d.ts +42 -0
  883. package/dist/lib/stack-app/apps/implementations/event-tracker.d.ts.map +1 -0
  884. package/dist/lib/stack-app/apps/implementations/event-tracker.js +213 -0
  885. package/dist/lib/stack-app/apps/implementations/event-tracker.js.map +1 -0
  886. package/dist/lib/stack-app/apps/implementations/event-tracker.test.d.ts +1 -0
  887. package/dist/lib/stack-app/apps/implementations/event-tracker.test.js +87 -0
  888. package/dist/lib/stack-app/apps/implementations/event-tracker.test.js.map +1 -0
  889. package/dist/lib/stack-app/apps/implementations/index.d.ts +9 -0
  890. package/dist/lib/stack-app/apps/implementations/index.d.ts.map +1 -0
  891. package/dist/lib/stack-app/apps/implementations/index.js +31 -0
  892. package/dist/lib/stack-app/apps/implementations/index.js.map +1 -0
  893. package/dist/lib/stack-app/apps/implementations/redirect-page-urls.d.ts +35 -0
  894. package/dist/lib/stack-app/apps/implementations/redirect-page-urls.d.ts.map +1 -0
  895. package/dist/lib/stack-app/apps/implementations/redirect-page-urls.js +201 -0
  896. package/dist/lib/stack-app/apps/implementations/redirect-page-urls.js.map +1 -0
  897. package/dist/lib/stack-app/apps/implementations/server-app-impl.d.ts +260 -0
  898. package/dist/lib/stack-app/apps/implementations/server-app-impl.d.ts.map +1 -0
  899. package/dist/lib/stack-app/apps/implementations/server-app-impl.js +1385 -0
  900. package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -0
  901. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.d.ts +28 -0
  902. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.d.ts.map +1 -0
  903. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.js +33 -0
  904. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.js.map +1 -0
  905. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.test.d.ts +1 -0
  906. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.test.js +82 -0
  907. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.test.js.map +1 -0
  908. package/dist/lib/stack-app/apps/implementations/session-replay.d.ts +111 -0
  909. package/dist/lib/stack-app/apps/implementations/session-replay.d.ts.map +1 -0
  910. package/dist/lib/stack-app/apps/implementations/session-replay.js +250 -0
  911. package/dist/lib/stack-app/apps/implementations/session-replay.js.map +1 -0
  912. package/dist/lib/stack-app/apps/implementations/session-replay.test.d.ts +1 -0
  913. package/dist/lib/stack-app/apps/implementations/session-replay.test.js +29 -0
  914. package/dist/lib/stack-app/apps/implementations/session-replay.test.js.map +1 -0
  915. package/dist/lib/stack-app/apps/index.d.ts +4 -0
  916. package/dist/lib/stack-app/apps/index.js +42 -0
  917. package/dist/lib/stack-app/apps/interfaces/admin-app.d.ts +261 -0
  918. package/dist/lib/stack-app/apps/interfaces/admin-app.d.ts.map +1 -0
  919. package/dist/lib/stack-app/apps/interfaces/admin-app.js +12 -0
  920. package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +1 -0
  921. package/dist/lib/stack-app/apps/interfaces/client-app.d.ts +226 -0
  922. package/dist/lib/stack-app/apps/interfaces/client-app.d.ts.map +1 -0
  923. package/dist/lib/stack-app/apps/interfaces/client-app.js +12 -0
  924. package/dist/lib/stack-app/apps/interfaces/client-app.js.map +1 -0
  925. package/dist/lib/stack-app/apps/interfaces/server-app.d.ts +157 -0
  926. package/dist/lib/stack-app/apps/interfaces/server-app.d.ts.map +1 -0
  927. package/dist/lib/stack-app/apps/interfaces/server-app.js +12 -0
  928. package/dist/lib/stack-app/apps/interfaces/server-app.js.map +1 -0
  929. package/dist/lib/stack-app/common.d.ts +183 -0
  930. package/dist/lib/stack-app/common.d.ts.map +1 -0
  931. package/dist/lib/stack-app/common.js +9 -0
  932. package/dist/lib/stack-app/common.js.map +1 -0
  933. package/dist/lib/stack-app/connected-accounts/index.d.ts +57 -0
  934. package/dist/lib/stack-app/connected-accounts/index.d.ts.map +1 -0
  935. package/dist/lib/stack-app/connected-accounts/index.js +0 -0
  936. package/dist/lib/stack-app/contact-channels/index.d.ts +43 -0
  937. package/dist/lib/stack-app/contact-channels/index.d.ts.map +1 -0
  938. package/dist/lib/stack-app/contact-channels/index.js +44 -0
  939. package/dist/lib/stack-app/contact-channels/index.js.map +1 -0
  940. package/dist/lib/stack-app/customers/index.d.ts +129 -0
  941. package/dist/lib/stack-app/customers/index.d.ts.map +1 -0
  942. package/dist/lib/stack-app/customers/index.js +0 -0
  943. package/dist/lib/stack-app/data-vault/index.d.ts +14 -0
  944. package/dist/lib/stack-app/data-vault/index.d.ts.map +1 -0
  945. package/dist/lib/stack-app/data-vault/index.js +0 -0
  946. package/dist/lib/stack-app/email/index.d.ts +204 -0
  947. package/dist/lib/stack-app/email/index.d.ts.map +1 -0
  948. package/dist/lib/stack-app/email/index.js +0 -0
  949. package/dist/lib/stack-app/email-templates/index.d.ts +17 -0
  950. package/dist/lib/stack-app/email-templates/index.d.ts.map +1 -0
  951. package/dist/lib/stack-app/email-templates/index.js +13 -0
  952. package/dist/lib/stack-app/email-templates/index.js.map +1 -0
  953. package/dist/lib/stack-app/index.d.ts +15 -0
  954. package/dist/lib/stack-app/index.js +54 -0
  955. package/dist/lib/stack-app/internal-api-keys/index.d.ts +42 -0
  956. package/dist/lib/stack-app/internal-api-keys/index.d.ts.map +1 -0
  957. package/dist/lib/stack-app/internal-api-keys/index.js +16 -0
  958. package/dist/lib/stack-app/internal-api-keys/index.js.map +1 -0
  959. package/dist/lib/stack-app/notification-categories/index.d.ts +11 -0
  960. package/dist/lib/stack-app/notification-categories/index.d.ts.map +1 -0
  961. package/dist/lib/stack-app/notification-categories/index.js +0 -0
  962. package/dist/lib/stack-app/permissions/index.d.ts +43 -0
  963. package/dist/lib/stack-app/permissions/index.d.ts.map +1 -0
  964. package/dist/lib/stack-app/permissions/index.js +36 -0
  965. package/dist/lib/stack-app/permissions/index.js.map +1 -0
  966. package/dist/lib/stack-app/project-configs/index.d.ts +99 -0
  967. package/dist/lib/stack-app/project-configs/index.d.ts.map +1 -0
  968. package/dist/lib/stack-app/project-configs/index.js +0 -0
  969. package/dist/lib/stack-app/projects/index.d.ts +147 -0
  970. package/dist/lib/stack-app/projects/index.d.ts.map +1 -0
  971. package/dist/lib/stack-app/projects/index.js +69 -0
  972. package/dist/lib/stack-app/projects/index.js.map +1 -0
  973. package/dist/lib/stack-app/session-replays/index.d.ts +66 -0
  974. package/dist/lib/stack-app/session-replays/index.d.ts.map +1 -0
  975. package/dist/lib/stack-app/session-replays/index.js +0 -0
  976. package/dist/lib/stack-app/teams/index.d.ts +163 -0
  977. package/dist/lib/stack-app/teams/index.d.ts.map +1 -0
  978. package/dist/lib/stack-app/teams/index.js +40 -0
  979. package/dist/lib/stack-app/teams/index.js.map +1 -0
  980. package/dist/lib/stack-app/url-targets.d.ts +39 -0
  981. package/dist/lib/stack-app/url-targets.d.ts.map +1 -0
  982. package/dist/lib/stack-app/url-targets.js +274 -0
  983. package/dist/lib/stack-app/url-targets.js.map +1 -0
  984. package/dist/lib/stack-app/url-targets.test.d.ts +1 -0
  985. package/dist/lib/stack-app/url-targets.test.js +213 -0
  986. package/dist/lib/stack-app/url-targets.test.js.map +1 -0
  987. package/dist/lib/stack-app/users/index.d.ts +400 -0
  988. package/dist/lib/stack-app/users/index.d.ts.map +1 -0
  989. package/dist/lib/stack-app/users/index.js +76 -0
  990. package/dist/lib/stack-app/users/index.js.map +1 -0
  991. package/dist/lib/translations.d.ts +7 -0
  992. package/dist/lib/translations.d.ts.map +1 -0
  993. package/dist/lib/translations.js +21 -0
  994. package/dist/lib/translations.js.map +1 -0
  995. package/dist/providers/stack-context.d.ts +10 -0
  996. package/dist/providers/stack-context.d.ts.map +1 -0
  997. package/dist/providers/stack-context.js +13 -0
  998. package/dist/providers/stack-context.js.map +1 -0
  999. package/dist/providers/stack-provider-client.d.ts +17 -0
  1000. package/dist/providers/stack-provider-client.d.ts.map +1 -0
  1001. package/dist/providers/stack-provider-client.js +34 -0
  1002. package/dist/providers/stack-provider-client.js.map +1 -0
  1003. package/dist/providers/stack-provider.d.ts +27 -0
  1004. package/dist/providers/stack-provider.d.ts.map +1 -0
  1005. package/dist/providers/stack-provider.js +24 -0
  1006. package/dist/providers/stack-provider.js.map +1 -0
  1007. package/dist/providers/theme-provider.d.ts +46 -0
  1008. package/dist/providers/theme-provider.d.ts.map +1 -0
  1009. package/dist/providers/theme-provider.js +72 -0
  1010. package/dist/providers/theme-provider.js.map +1 -0
  1011. package/dist/providers/translation-provider-client.d.ts +16 -0
  1012. package/dist/providers/translation-provider-client.d.ts.map +1 -0
  1013. package/dist/providers/translation-provider-client.js +23 -0
  1014. package/dist/providers/translation-provider-client.js.map +1 -0
  1015. package/dist/providers/translation-provider.d.ts +16 -0
  1016. package/dist/providers/translation-provider.d.ts.map +1 -0
  1017. package/dist/providers/translation-provider.js +25 -0
  1018. package/dist/providers/translation-provider.js.map +1 -0
  1019. package/dist/storage-DxMLntUt.d.ts +1912 -0
  1020. package/dist/storage-DxMLntUt.d.ts.map +1 -0
  1021. package/dist/tanstack-start-server-context.d.d.ts +0 -0
  1022. package/dist/tanstack-start-server-context.d.ts +15 -0
  1023. package/dist/tanstack-start-server-context.d.ts.map +1 -0
  1024. package/dist/utils/browser-script.d.ts +9 -0
  1025. package/dist/utils/browser-script.d.ts.map +1 -0
  1026. package/dist/utils/browser-script.js +107 -0
  1027. package/dist/utils/browser-script.js.map +1 -0
  1028. package/dist/utils/constants.d.ts +81 -0
  1029. package/dist/utils/constants.d.ts.map +1 -0
  1030. package/dist/utils/constants.js +92 -0
  1031. package/dist/utils/constants.js.map +1 -0
  1032. package/dist/utils/url.d.ts +5 -0
  1033. package/dist/utils/url.d.ts.map +1 -0
  1034. package/dist/utils/url.js +18 -0
  1035. package/dist/utils/url.js.map +1 -0
  1036. package/package.json +125 -0
@@ -0,0 +1,2842 @@
1
+ import { HexclaveAssertionError, captureError, throwErr } from "@hexclave/shared/dist/utils/errors";
2
+ import { neverResolve, runAsynchronously, wait } from "@hexclave/shared/dist/utils/promises";
3
+ import React, { useCallback, useMemo } from "react";
4
+ import { HexclaveClientInterface, KnownErrors } from "@hexclave/shared";
5
+ import { createUrlIfValid, isRelative } from "@hexclave/shared/dist/utils/urls";
6
+ import { suspend, suspendIfSsr, use } from "@hexclave/shared/dist/utils/react";
7
+ import { deepPlainEquals, omit } from "@hexclave/shared/dist/utils/objects";
8
+ import * as NextNavigationUnscrambled from "next/navigation";
9
+ import { deindent, mergeScopeStrings } from "@hexclave/shared/dist/utils/strings";
10
+ import { Result } from "@hexclave/shared/dist/utils/results";
11
+ import { isBrowserLike } from "@hexclave/shared/dist/utils/env";
12
+ import { clientVersion, createCache, createCacheBySession, createEmptyTokenStore, getAnalyticsBaseUrl, getDefaultExtraRequestHeaders, getDefaultProjectId, getDefaultPublishableClientKey, getUrls, resolveApiUrls, resolveConstructorOptions, useAsyncCache } from "./common.js";
13
+ import { getTrustedParentDomain, validateRedirectUrl } from "@hexclave/shared/dist/utils/redirect-urls";
14
+ import { decodeBase32, decodeBase64, encodeBase32, encodeBase64 } from "@hexclave/shared/dist/utils/bytes";
15
+ import { stackAppInternalsSymbol } from "../../common.js";
16
+ import { adminProjectCreateOptionsToCrud } from "../../projects/index.js";
17
+ import { WebAuthnError, startAuthentication, startRegistration } from "@simplewebauthn/browser";
18
+ import { InternalSession } from "@hexclave/shared/dist/sessions";
19
+ import { scrambleDuringCompileTime } from "@hexclave/shared/dist/utils/compile-time";
20
+ import { parseJson } from "@hexclave/shared/dist/utils/json";
21
+ import { DependenciesMap } from "@hexclave/shared/dist/utils/maps";
22
+ import { Store, storeLock } from "@hexclave/shared/dist/utils/stores";
23
+ import { BotChallengeExecutionFailedError, BotChallengeUserCancelledError, withBotChallengeFlow } from "@hexclave/shared/dist/utils/turnstile-flow";
24
+ import { generateUuid } from "@hexclave/shared/dist/utils/uuids";
25
+ import * as cookie from "cookie";
26
+ import { constructRedirectUrl } from "../../../../utils/url.js";
27
+ import { callOAuthCallback, getNewOAuthProviderOrScopeUrl } from "../../../auth.js";
28
+ import { createBrowserCookieHelper, createCookieHelper, createPlaceholderCookieHelper, deleteCookie, deleteCookieClient, getCookieClient, isSecure, saveVerifierAndState, setOrDeleteCookie, setOrDeleteCookieClient } from "../../../cookie.js";
29
+ import { envVars } from "../../../env.js";
30
+ import { apiKeyCreationOptionsToCrud } from "../../api-keys/index.js";
31
+ import { contactChannelCreateOptionsToCrud, contactChannelUpdateOptionsToCrud } from "../../contact-channels/index.js";
32
+ import { teamCreateOptionsToCrud, teamUpdateOptionsToCrud } from "../../teams/index.js";
33
+ import { buildCliAuthConfirmUrl, getHostedHandlerUrl, isHostedHandlerUrlForProject, resolveHandlerUrls } from "../../url-targets.js";
34
+ import { userUpdateOptionsToCrud, withUserDestructureGuard } from "../../users/index.js";
35
+ import { EventTracker } from "./event-tracker.js";
36
+ import { crossDomainAuthQueryParams, getCrossDomainHandoffParamsFromCurrentUrl, planRedirectToHandler } from "./redirect-page-urls.js";
37
+ import { subscribeSessionRefresh } from "./session-refresh-subscription.js";
38
+ import { SessionRecorder, analyticsOptionsFromJson, analyticsOptionsToJson } from "./session-replay.js";
39
+ import { mountDevTool } from "../../../../dev-tool/index.js";
40
+ import * as sc from "@hexclave/sc";
41
+ import { cookies } from "@hexclave/sc";
42
+
43
+ //#region src/lib/stack-app/apps/implementations/client-app-impl.ts
44
+ let isReactServer = false;
45
+ isReactServer = sc.isReactServer;
46
+ const NextNavigation = scrambleDuringCompileTime(NextNavigationUnscrambled);
47
+ const prefetchedCrossDomainHandoffTtlMs = 3300 * 1e3;
48
+ const nestedCrossDomainAuthQueryParams = {
49
+ refreshTokenId: "stack_nested_cross_domain_auth_refresh_token_id",
50
+ callbackUrl: "stack_nested_cross_domain_auth_callback_url",
51
+ redirectUri: "redirect_uri",
52
+ state: "state",
53
+ codeChallenge: "code_challenge",
54
+ codeChallengeMethod: "code_challenge_method",
55
+ afterCallbackRedirectUrl: "after_callback_redirect_url"
56
+ };
57
+ const oauthCallbackResponseQueryParams = [
58
+ "code",
59
+ "state",
60
+ "error",
61
+ "error_description",
62
+ "errorCode",
63
+ "message",
64
+ "details"
65
+ ];
66
+ const allClientApps = /* @__PURE__ */ new Map();
67
+ const STACK_AUTHORIZATION_VALUE_PREFIX = "stackauth_";
68
+ const HEXCLAVE_AUTHORIZATION_VALUE_PREFIX = "hexclave_";
69
+ function getAuthorizationHeaderValueFromAuthJson(authJson) {
70
+ if (authJson.accessToken == null && authJson.refreshToken == null) return null;
71
+ return `Bearer ${STACK_AUTHORIZATION_VALUE_PREFIX}${encodeBase64(new TextEncoder().encode(JSON.stringify(authJson)))}`;
72
+ }
73
+ function getAuthJsonFromAuthorizationHeaderValue(authorizationHeaderValue) {
74
+ const match = authorizationHeaderValue.match(/^Bearer\s+(.+)$/i);
75
+ if (match == null) return null;
76
+ const credential = match[1].trim();
77
+ const matchedPrefix = credential.startsWith(HEXCLAVE_AUTHORIZATION_VALUE_PREFIX) ? HEXCLAVE_AUTHORIZATION_VALUE_PREFIX : credential.startsWith(STACK_AUTHORIZATION_VALUE_PREFIX) ? STACK_AUTHORIZATION_VALUE_PREFIX : null;
78
+ if (matchedPrefix == null) return null;
79
+ const encodedAuthJson = credential.slice(matchedPrefix.length);
80
+ if (encodedAuthJson.length === 0) throw new Error("Invalid Authorization header format. Expected `Bearer stackauth_<base64(getAuthJson())>`.");
81
+ let parsed;
82
+ try {
83
+ const decodedAuthJson = new TextDecoder().decode(decodeBase64(encodedAuthJson));
84
+ parsed = JSON.parse(decodedAuthJson);
85
+ } catch (e) {
86
+ throw new Error("Invalid stackauth authorization header.", { cause: e });
87
+ }
88
+ if (parsed == null || typeof parsed !== "object" || Array.isArray(parsed)) throw new Error("Invalid stackauth authorization payload. Expected an object.");
89
+ const accessToken = Reflect.get(parsed, "accessToken");
90
+ const refreshToken = Reflect.get(parsed, "refreshToken");
91
+ if (accessToken != null && typeof accessToken !== "string") throw new Error("Invalid stackauth authorization payload. `accessToken` must be a string or null.");
92
+ if (refreshToken != null && typeof refreshToken !== "string") throw new Error("Invalid stackauth authorization payload. `refreshToken` must be a string or null.");
93
+ return {
94
+ accessToken: accessToken ?? null,
95
+ refreshToken: refreshToken ?? null
96
+ };
97
+ }
98
+ function getHeaderValueFromRequestLikeHeaders(headers, name) {
99
+ if ("get" in headers && typeof headers.get === "function") return headers.get(name);
100
+ const lowerCaseName = name.toLowerCase();
101
+ for (const [headerName, headerValue] of Object.entries(headers)) if (headerName.toLowerCase() === lowerCaseName) return headerValue;
102
+ return null;
103
+ }
104
+ async function getServerRequestHost() {
105
+ return (await sc.headers?.())?.get("host") ?? null;
106
+ }
107
+ var _StackClientAppImplIncomplete = class _StackClientAppImplIncomplete {
108
+ static {
109
+ this.LazyStackAdminAppImpl = { value: void 0 };
110
+ }
111
+ async _createCookieHelper(overrideTokenStoreInit) {
112
+ const tokenStoreInit = overrideTokenStoreInit === void 0 ? this._tokenStoreInit : overrideTokenStoreInit;
113
+ if (tokenStoreInit === "nextjs-cookie" || tokenStoreInit === "cookie") return await createCookieHelper();
114
+ else return await createPlaceholderCookieHelper();
115
+ }
116
+ /** @deprecated Used by legacy getConnectedAccount(providerId) — combines user check + token check + redirect into one cache */
117
+ async _getUserOAuthConnectionCacheFn(options) {
118
+ const user = await options.getUser();
119
+ let hasConnection = true;
120
+ if (!user || !user.oauth_providers.find((p) => p.id === options.providerId)) hasConnection = false;
121
+ if (!await options.getOrWaitOAuthToken()) hasConnection = false;
122
+ if (!hasConnection && options.redirect) {
123
+ if (!options.session) throw new Error(deindent`
124
+ Cannot add new scopes to a user that is not a CurrentUser. Please ensure that you are calling this function on a CurrentUser object, or remove the 'or: redirect' option.
125
+
126
+ Often, you can solve this by calling this function in the browser instead, or by removing the 'or: redirect' option and dealing with the case where the user doesn't have enough permissions.
127
+ `);
128
+ const location = await getNewOAuthProviderOrScopeUrl(this._interface, {
129
+ provider: options.providerId,
130
+ redirectUrl: this._getOAuthCallbackRedirectUri(),
131
+ errorRedirectUrl: this.urls.error,
132
+ providerScope: mergeScopeStrings(options.scope || "", (this._oauthScopesOnSignIn[options.providerId] ?? []).join(" "))
133
+ }, options.session);
134
+ await this._redirectTo({ url: location });
135
+ return await neverResolve();
136
+ } else if (!hasConnection) return null;
137
+ const providerAccountId = user.oauth_providers.find((p) => p.id === options.providerId)?.account_id ?? "";
138
+ return {
139
+ id: options.providerId,
140
+ provider: options.providerId,
141
+ providerAccountId,
142
+ async getAccessToken() {
143
+ const result = await options.getOrWaitOAuthToken();
144
+ if (!result) throw new HexclaveAssertionError(`Failed to retrieve an access token for this connected account (provider: ${options.providerId}). This usually means the OAuth refresh token has been revoked or expired. The user needs to re-authorize by calling \`linkConnectedAccount\` or using \`getOrLinkConnectedAccount\`.`);
145
+ return result;
146
+ },
147
+ useAccessToken() {
148
+ const result = options.useOAuthToken();
149
+ if (!result) throw new HexclaveAssertionError(`Failed to retrieve an access token for this connected account (provider: ${options.providerId}). This usually means the OAuth refresh token has been revoked or expired. The user needs to re-authorize by calling \`linkConnectedAccount\` or using \`getOrLinkConnectedAccount\`.`);
150
+ return result;
151
+ }
152
+ };
153
+ }
154
+ _createOAuthConnectionFromCrudItem(item, session) {
155
+ const app = this;
156
+ const providerId = item.provider;
157
+ const providerAccountId = item.provider_account_id;
158
+ return {
159
+ id: providerId,
160
+ provider: providerId,
161
+ providerAccountId,
162
+ async getAccessToken(options) {
163
+ const scopeString = options?.scopes?.join(" ") ?? "";
164
+ const result = Result.orThrow(await app._currentUserOAuthConnectionAccessTokensByAccountCache.getOrWait([
165
+ session,
166
+ providerId,
167
+ providerAccountId,
168
+ scopeString
169
+ ], "write-only"));
170
+ if (!result) {
171
+ const scopeDetail = scopeString ? `The requested scopes [${scopeString}] are not available on the existing token.` : "The OAuth refresh token has likely been revoked or expired.";
172
+ return Result.error(new KnownErrors.OAuthAccessTokenNotAvailable(providerId, `${scopeDetail} The user needs to re-authorize by calling \`linkConnectedAccount\` or using \`getOrLinkConnectedAccount\`.`));
173
+ }
174
+ return Result.ok(result);
175
+ },
176
+ useAccessToken(options) {
177
+ const scopeString = options?.scopes?.join(" ") ?? "";
178
+ const result = useAsyncCache(app._currentUserOAuthConnectionAccessTokensByAccountCache, [
179
+ session,
180
+ providerId,
181
+ providerAccountId,
182
+ scopeString
183
+ ], "connection.useAccessToken()");
184
+ if (!result) {
185
+ const scopeDetail = scopeString ? `The requested scopes [${scopeString}] are not available on the existing token.` : "The OAuth refresh token has likely been revoked or expired.";
186
+ return Result.error(new KnownErrors.OAuthAccessTokenNotAvailable(providerId, `${scopeDetail} The user needs to re-authorize by calling \`linkConnectedAccount\` or using \`getOrLinkConnectedAccount\`.`));
187
+ }
188
+ return Result.ok(result);
189
+ }
190
+ };
191
+ }
192
+ constructor(options, extraOptions) {
193
+ this._uniqueIdentifier = void 0;
194
+ this._sessionRecorder = null;
195
+ this._eventTracker = null;
196
+ this.__DEMO_ENABLE_SLIGHT_FETCH_DELAY = false;
197
+ this._ownedAdminApps = new DependenciesMap();
198
+ this._currentUserCache = createCacheBySession(async (session) => {
199
+ if (this.__DEMO_ENABLE_SLIGHT_FETCH_DELAY) await wait(2e3);
200
+ if (session.isKnownToBeInvalid()) return null;
201
+ return await this._interface.getClientUserByToken(session);
202
+ });
203
+ this._currentProjectCache = createCache(async () => {
204
+ return Result.orThrow(await this._interface.getClientProject());
205
+ });
206
+ this._ownedProjectsCache = createCacheBySession(async (session) => {
207
+ return await this._interface.listProjects(session);
208
+ });
209
+ this._currentUserPermissionsCache = createCacheBySession(async (session, [teamId, recursive]) => {
210
+ return await this._interface.listCurrentUserTeamPermissions({
211
+ teamId,
212
+ recursive
213
+ }, session);
214
+ });
215
+ this._currentUserProjectPermissionsCache = createCacheBySession(async (session, [recursive]) => {
216
+ return await this._interface.listCurrentUserProjectPermissions({ recursive }, session);
217
+ });
218
+ this._currentUserTeamsCache = createCacheBySession(async (session) => {
219
+ return await this._interface.listCurrentUserTeams(session);
220
+ });
221
+ this._currentUserOAuthConnectionAccessTokensCache = createCacheBySession(async (session, [providerId, scope]) => {
222
+ try {
223
+ return { accessToken: (await this._interface.createProviderAccessToken(providerId, scope || "", session)).access_token };
224
+ } catch (err) {
225
+ if (!(KnownErrors.OAuthAccessTokenNotAvailable.isInstance(err) || KnownErrors.OAuthConnectionDoesNotHaveRequiredScope.isInstance(err) || KnownErrors.OAuthConnectionNotConnectedToUser.isInstance(err))) throw err;
226
+ }
227
+ return null;
228
+ });
229
+ this._currentUserOAuthConnectionCache = createCacheBySession(async (session, [providerId, scope, redirect]) => {
230
+ return await this._getUserOAuthConnectionCacheFn({
231
+ getUser: async () => Result.orThrow(await this._currentUserCache.getOrWait([session], "write-only")),
232
+ getOrWaitOAuthToken: async () => Result.orThrow(await this._currentUserOAuthConnectionAccessTokensCache.getOrWait([
233
+ session,
234
+ providerId,
235
+ scope || ""
236
+ ], "write-only")),
237
+ useOAuthToken: () => useAsyncCache(this._currentUserOAuthConnectionAccessTokensCache, [
238
+ session,
239
+ providerId,
240
+ scope || ""
241
+ ], "connection.useAccessToken()"),
242
+ providerId,
243
+ scope,
244
+ redirect,
245
+ session
246
+ });
247
+ });
248
+ this._currentUserConnectedAccountsCache = createCacheBySession(async (session) => {
249
+ return (await this._interface.listConnectedAccounts(session)).items.map((item) => this._createOAuthConnectionFromCrudItem(item, session));
250
+ });
251
+ this._currentUserOAuthConnectionAccessTokensByAccountCache = createCacheBySession(async (session, [providerId, providerAccountId, scope]) => {
252
+ try {
253
+ return { accessToken: (await this._interface.createProviderAccessTokenByAccount(providerId, providerAccountId, scope, session)).access_token };
254
+ } catch (err) {
255
+ if (KnownErrors.OAuthAccessTokenNotAvailable.isInstance(err) || KnownErrors.OAuthConnectionDoesNotHaveRequiredScope.isInstance(err) || KnownErrors.OAuthConnectionNotConnectedToUser.isInstance(err)) return null;
256
+ throw err;
257
+ }
258
+ });
259
+ this._currentUserValidConnectedAccountForProviderCache = createCacheBySession(async (session, [provider, scopeString]) => {
260
+ const matchingAccounts = Result.orThrow(await this._currentUserConnectedAccountsCache.getOrWait([session], "write-only")).filter((a) => a.provider === provider);
261
+ const scopes = scopeString ? scopeString.split(" ") : void 0;
262
+ for (const account of matchingAccounts) if ((await account.getAccessToken({ scopes })).status === "ok") return account;
263
+ const location = await getNewOAuthProviderOrScopeUrl(this._interface, {
264
+ provider,
265
+ redirectUrl: this._getOAuthCallbackRedirectUri(),
266
+ errorRedirectUrl: this.urls.error,
267
+ providerScope: mergeScopeStrings(scopeString, (this._oauthScopesOnSignIn[provider] ?? []).join(" "))
268
+ }, session);
269
+ await this._redirectTo({ url: location });
270
+ return await neverResolve();
271
+ });
272
+ this._teamMemberProfilesCache = createCacheBySession(async (session, [teamId]) => {
273
+ return await this._interface.listTeamMemberProfiles({ teamId }, session);
274
+ });
275
+ this._teamInvitationsCache = createCacheBySession(async (session, [teamId]) => {
276
+ return await this._interface.listTeamInvitations({ teamId }, session);
277
+ });
278
+ this._currentUserTeamProfileCache = createCacheBySession(async (session, [teamId]) => {
279
+ return await this._interface.getTeamMemberProfile({
280
+ teamId,
281
+ userId: "me"
282
+ }, session);
283
+ });
284
+ this._currentUserTeamInvitationsCache = createCacheBySession(async (session) => {
285
+ return await this._interface.listCurrentUserTeamInvitations(session);
286
+ });
287
+ this._clientContactChannelsCache = createCacheBySession(async (session) => {
288
+ return await this._interface.listClientContactChannels(session);
289
+ });
290
+ this._userApiKeysCache = createCacheBySession(async (session) => {
291
+ return await this._interface.listProjectApiKeys({ user_id: "me" }, session, "client");
292
+ });
293
+ this._teamApiKeysCache = createCacheBySession(async (session, [teamId]) => {
294
+ return await this._interface.listProjectApiKeys({ team_id: teamId }, session, "client");
295
+ });
296
+ this._notificationCategoriesCache = createCacheBySession(async (session) => {
297
+ return await this._interface.listNotificationCategories(session);
298
+ });
299
+ this._currentUserOAuthProvidersCache = createCacheBySession(async (session) => {
300
+ return await this._interface.listOAuthProviders({ user_id: "me" }, session);
301
+ });
302
+ this._userItemCache = createCacheBySession(async (session, [userId, itemId]) => {
303
+ return await this._interface.getItem({
304
+ userId,
305
+ itemId
306
+ }, session);
307
+ });
308
+ this._teamItemCache = createCacheBySession(async (session, [teamId, itemId]) => {
309
+ return await this._interface.getItem({
310
+ teamId,
311
+ itemId
312
+ }, session);
313
+ });
314
+ this._customItemCache = createCacheBySession(async (session, [customCustomerId, itemId]) => {
315
+ return await this._interface.getItem({
316
+ customCustomerId,
317
+ itemId
318
+ }, session);
319
+ });
320
+ this._userProductsCache = createCacheBySession(async (session, [userId, cursor, limit]) => {
321
+ return await this._interface.listProducts({
322
+ customer_type: "user",
323
+ customer_id: userId,
324
+ cursor: cursor ?? void 0,
325
+ limit: limit ?? void 0
326
+ }, session);
327
+ });
328
+ this._teamProductsCache = createCacheBySession(async (session, [teamId, cursor, limit]) => {
329
+ return await this._interface.listProducts({
330
+ customer_type: "team",
331
+ customer_id: teamId,
332
+ cursor: cursor ?? void 0,
333
+ limit: limit ?? void 0
334
+ }, session);
335
+ });
336
+ this._customProductsCache = createCacheBySession(async (session, [customCustomerId, cursor, limit]) => {
337
+ return await this._interface.listProducts({
338
+ customer_type: "custom",
339
+ customer_id: customCustomerId,
340
+ cursor: cursor ?? void 0,
341
+ limit: limit ?? void 0
342
+ }, session);
343
+ });
344
+ this._userInvoicesCache = createCacheBySession(async (session, [userId, cursor, limit]) => {
345
+ return await this._interface.listInvoices({
346
+ customer_type: "user",
347
+ customer_id: userId,
348
+ cursor: cursor ?? void 0,
349
+ limit: limit ?? void 0
350
+ }, session);
351
+ });
352
+ this._teamInvoicesCache = createCacheBySession(async (session, [teamId, cursor, limit]) => {
353
+ return await this._interface.listInvoices({
354
+ customer_type: "team",
355
+ customer_id: teamId,
356
+ cursor: cursor ?? void 0,
357
+ limit: limit ?? void 0
358
+ }, session);
359
+ });
360
+ this._customerBillingCache = createCacheBySession(async (session, [customerType, customerId]) => {
361
+ return await this._interface.getCustomerBilling(customerType, customerId, session);
362
+ });
363
+ this._convexPartialUserCache = createCache(async ([ctx]) => await this._getPartialUserFromConvex(ctx));
364
+ this._trustedParentDomainCache = createCache(async ([domain]) => await this._getTrustedParentDomain(domain));
365
+ this._anonymousSignUpInProgress = null;
366
+ this._prefetchedCrossDomainHandoffParams = null;
367
+ this._prefetchedCrossDomainHandoffParamsFetchedAt = 0;
368
+ this._isPrefetchingCrossDomainHandoffParams = false;
369
+ this._pendingAuthResolutionPromises = [];
370
+ this._memoryTokenStore = createEmptyTokenStore();
371
+ this._nextServerCookiesTokenStores = /* @__PURE__ */ new WeakMap();
372
+ this._requestTokenStores = /* @__PURE__ */ new WeakMap();
373
+ this._storedBrowserCookieTokenStore = null;
374
+ this._mostRecentQueuedCookieRefreshIndex = 0;
375
+ this._sessionsByTokenStoreAndSessionKey = /* @__PURE__ */ new WeakMap();
376
+ this._botChallengeSiteKeysWarned = false;
377
+ const resolvedOptions = resolveConstructorOptions(options);
378
+ if (!_StackClientAppImplIncomplete.LazyStackAdminAppImpl.value) throw new HexclaveAssertionError("Admin app implementation not initialized. Did you import the _StackClientApp from stack-app/apps/implementations/index.ts? You can't import it directly from ./apps/implementations/client-app-impl.ts as that causes a circular dependency (see the comment at _LazyStackAdminAppImpl for more details).");
379
+ this._options = resolvedOptions;
380
+ this._extraOptions = extraOptions;
381
+ const projectId = resolvedOptions.projectId ?? getDefaultProjectId();
382
+ if (projectId !== "internal" && !projectId.match(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i)) throw new Error(`Invalid project ID: ${projectId}. Project IDs must be UUIDs. Please check your environment variables and/or your StackApp.`);
383
+ const publishableClientKey = resolvedOptions.publishableClientKey ?? getDefaultPublishableClientKey();
384
+ if (extraOptions && extraOptions.interface) this._interface = extraOptions.interface;
385
+ else {
386
+ const apiUrls = resolveApiUrls(resolvedOptions.baseUrl);
387
+ this._interface = new HexclaveClientInterface({
388
+ getBaseUrl: () => apiUrls()[0],
389
+ getAnalyticsBaseUrl: () => getAnalyticsBaseUrl(apiUrls()[0]),
390
+ getApiUrls: apiUrls,
391
+ extraRequestHeaders: resolvedOptions.extraRequestHeaders ?? getDefaultExtraRequestHeaders(),
392
+ projectId,
393
+ clientVersion,
394
+ ...publishableClientKey != null ? { publishableClientKey } : {},
395
+ prepareRequest: async () => {
396
+ await cookies?.();
397
+ }
398
+ });
399
+ }
400
+ this._tokenStoreInit = resolvedOptions.tokenStore;
401
+ this._redirectMethod = resolvedOptions.redirectMethod || (isBrowserLike() ? "window" : "none");
402
+ this._redirectMethod = resolvedOptions.redirectMethod || "nextjs";
403
+ this._urlOptions = resolvedOptions.urls ?? {};
404
+ this._oauthScopesOnSignIn = resolvedOptions.oauthScopesOnSignIn ?? {};
405
+ if (isBrowserLike() && (resolvedOptions.tokenStore === "cookie" || resolvedOptions.tokenStore === "nextjs-cookie")) {
406
+ runAsynchronously(this._trustedParentDomainCache.getOrWait([window.location.hostname], "write-only"));
407
+ this._ensureCrossSubdomainCookieExists();
408
+ }
409
+ if (extraOptions && extraOptions.uniqueIdentifier) {
410
+ this._uniqueIdentifier = extraOptions.uniqueIdentifier;
411
+ this._initUniqueIdentifier();
412
+ }
413
+ this._analyticsOptions = resolvedOptions.analytics;
414
+ const getAnalyticsSession = async () => {
415
+ this._ensurePersistentTokenStore();
416
+ if (await this.getPartialUser({
417
+ from: "token",
418
+ or: "anonymous-if-exists"
419
+ })) return await this._getSession();
420
+ return (await this.getUser({ or: "anonymous" }))._internalSession;
421
+ };
422
+ const analyticsEnabled = this._analyticsOptions?.enabled !== false;
423
+ if (analyticsEnabled && isBrowserLike() && this._hasPersistentTokenStore() && this._analyticsOptions?.replays?.enabled === true) {
424
+ this._sessionRecorder = new SessionRecorder({
425
+ projectId: this.projectId,
426
+ sendBatch: async (body, opts) => {
427
+ return await this._interface.sendSessionReplayBatch(body, await getAnalyticsSession(), opts);
428
+ }
429
+ }, this._analyticsOptions.replays);
430
+ this._sessionRecorder.start();
431
+ }
432
+ if (analyticsEnabled && isBrowserLike() && this._hasPersistentTokenStore()) {
433
+ this._eventTracker = new EventTracker({
434
+ projectId: this.projectId,
435
+ sendBatch: async (body, opts) => {
436
+ return await this._interface.sendAnalyticsEventBatch(body, await getAnalyticsSession(), opts);
437
+ }
438
+ });
439
+ this._eventTracker.start();
440
+ }
441
+ if (isBrowserLike() && this._isOAuthCallbackUrlHosted() && this._currentUrlLooksLikeStackOAuthCallback()) this._trackPendingAuthResolution(async () => {
442
+ if (isBrowserLike()) await this.callOAuthCallback({ dontWarnAboutMissingQueryParams: true });
443
+ });
444
+ if (isBrowserLike()) this._trackPendingAuthResolution(async () => {
445
+ await this._maybeHandleNestedCrossDomainAuth();
446
+ });
447
+ if (isBrowserLike() && resolvedOptions.devTool !== false) mountDevTool(this);
448
+ }
449
+ _initUniqueIdentifier() {
450
+ if (!this._uniqueIdentifier) throw new HexclaveAssertionError("Unique identifier not initialized");
451
+ if (allClientApps.has(this._uniqueIdentifier)) throw new HexclaveAssertionError("A Stack client app with the same unique identifier already exists");
452
+ allClientApps.set(this._uniqueIdentifier, [this._extraOptions?.checkString ?? void 0, this]);
453
+ }
454
+ _trackPendingAuthResolution(callback) {
455
+ const promise = (async () => {
456
+ await Promise.resolve();
457
+ try {
458
+ await callback();
459
+ } catch (error) {
460
+ captureError("pending-auth-resolution-failed", error);
461
+ }
462
+ })();
463
+ this._pendingAuthResolutionPromises.push(promise);
464
+ runAsynchronously(async () => {
465
+ try {
466
+ await promise;
467
+ } finally {
468
+ this._pendingAuthResolutionPromises = this._pendingAuthResolutionPromises.filter((p) => p !== promise);
469
+ }
470
+ });
471
+ }
472
+ async _awaitPendingAuthResolutions(overrideTokenStoreInit, options) {
473
+ if (options?.awaitPendingAuthResolutions === false || overrideTokenStoreInit !== void 0 || !this._hasPersistentTokenStore() || this._pendingAuthResolutionPromises.length === 0) return;
474
+ await Promise.all(this._pendingAuthResolutionPromises);
475
+ }
476
+ _usePendingAuthResolutions(overrideTokenStoreInit) {
477
+ if (overrideTokenStoreInit !== void 0 || !this._hasPersistentTokenStore() || this._pendingAuthResolutionPromises.length === 0) return;
478
+ use(Promise.all(this._pendingAuthResolutionPromises));
479
+ }
480
+ _isOAuthCallbackUrlHosted() {
481
+ const oauthCallbackTarget = this._urlOptions.oauthCallback ?? this._urlOptions.default;
482
+ return typeof oauthCallbackTarget !== "string" && oauthCallbackTarget?.type === "hosted";
483
+ }
484
+ _currentUrlLooksLikeOAuthCallback() {
485
+ if (typeof window === "undefined") return false;
486
+ const currentUrl = new URL(window.location.href);
487
+ return currentUrl.searchParams.has("code") && currentUrl.searchParams.has("state") || currentUrl.searchParams.has("errorCode") && currentUrl.searchParams.has("message");
488
+ }
489
+ _currentUrlLooksLikeStackOAuthCallback() {
490
+ if (typeof window === "undefined") return false;
491
+ const currentUrl = new URL(window.location.href);
492
+ const state = currentUrl.searchParams.get("state");
493
+ if (!currentUrl.searchParams.has("code") || state == null) return false;
494
+ return getCookieClient(`stack-oauth-outer-${state}`) != null;
495
+ }
496
+ _getOAuthCallbackRedirectUri() {
497
+ if (!this._isOAuthCallbackUrlHosted()) return this.urls.oauthCallback;
498
+ if (typeof window === "undefined") throw new HexclaveAssertionError("Hosted OAuth callback URLs require a browser environment to use the current URL as the redirect URI");
499
+ const currentUrl = new URL(window.location.href);
500
+ for (const param of oauthCallbackResponseQueryParams) currentUrl.searchParams.delete(param);
501
+ return currentUrl.toString();
502
+ }
503
+ async _getCurrentRefreshTokenIdIfSignedIn(options) {
504
+ const tokens = await (await this._getSession(options?.overrideTokenStoreInit, options)).getOrFetchLikelyValidTokens(0, null);
505
+ if (tokens?.refreshToken == null) return null;
506
+ return tokens.accessToken.payload.refresh_token_id;
507
+ }
508
+ async _addNestedCrossDomainAuthParamsToRedirectUrl(options) {
509
+ const targetUrl = new URL(options.url, options.currentUrl);
510
+ if (targetUrl.origin === options.currentUrl.origin) return options.url;
511
+ const refreshTokenId = await this._getCurrentRefreshTokenIdIfSignedIn({
512
+ awaitPendingAuthResolutions: options.awaitPendingAuthResolutions,
513
+ overrideTokenStoreInit: options.overrideTokenStoreInit
514
+ });
515
+ if (refreshTokenId == null) return options.url;
516
+ targetUrl.searchParams.set(nestedCrossDomainAuthQueryParams.refreshTokenId, refreshTokenId);
517
+ targetUrl.searchParams.set(nestedCrossDomainAuthQueryParams.callbackUrl, new URL(this._getOAuthCallbackRedirectUri(), options.currentUrl).toString());
518
+ return targetUrl.toString();
519
+ }
520
+ async _maybeHandleNestedCrossDomainAuth() {
521
+ if (typeof window === "undefined") return false;
522
+ const currentUrl = new URL(window.location.href);
523
+ if (currentUrl.searchParams.has("code") && currentUrl.searchParams.has("state")) return false;
524
+ const refreshTokenId = currentUrl.searchParams.get(nestedCrossDomainAuthQueryParams.refreshTokenId);
525
+ if (refreshTokenId == null) return false;
526
+ const redirectUri = currentUrl.searchParams.get(nestedCrossDomainAuthQueryParams.redirectUri);
527
+ const state = currentUrl.searchParams.get(nestedCrossDomainAuthQueryParams.state);
528
+ const codeChallenge = currentUrl.searchParams.get(nestedCrossDomainAuthQueryParams.codeChallenge);
529
+ if (redirectUri != null || state != null || codeChallenge != null) {
530
+ if (redirectUri == null || state == null || codeChallenge == null) throw new HexclaveAssertionError("Nested cross-domain auth callback URL is missing OAuth request parameters", {
531
+ redirectUri,
532
+ state,
533
+ codeChallenge
534
+ });
535
+ if ((currentUrl.searchParams.get(nestedCrossDomainAuthQueryParams.codeChallengeMethod) ?? "S256") !== "S256") throw new HexclaveAssertionError("Nested cross-domain auth only supports S256 PKCE");
536
+ if (isRelative(redirectUri)) throw new Error("Nested cross-domain auth redirect URI must be absolute.");
537
+ const redirectUriUrl = new URL(redirectUri);
538
+ if (!await this._isTrusted(redirectUriUrl.toString())) throw new Error(`Nested cross-domain auth redirect URI ${redirectUri} is not trusted.`);
539
+ const afterCallbackRedirectUrlString = currentUrl.searchParams.get(nestedCrossDomainAuthQueryParams.afterCallbackRedirectUrl);
540
+ const afterCallbackRedirectUrl = afterCallbackRedirectUrlString == null ? redirectUriUrl : new URL(afterCallbackRedirectUrlString, redirectUriUrl);
541
+ if (!await this._isTrusted(afterCallbackRedirectUrl.toString())) throw new Error(`Nested cross-domain auth after-callback redirect URL ${afterCallbackRedirectUrlString} is not trusted.`);
542
+ if (await this._getCurrentRefreshTokenIdIfSignedIn({ awaitPendingAuthResolutions: false }) !== refreshTokenId) throw new Error("Nested cross-domain auth source session does not match the requested refresh token ID.");
543
+ await this._redirectTo({
544
+ url: await this._createCrossDomainAuthRedirectUrl({
545
+ redirectUri: redirectUriUrl.toString(),
546
+ state,
547
+ codeChallenge,
548
+ afterCallbackRedirectUrl: afterCallbackRedirectUrl.toString(),
549
+ awaitPendingAuthResolutions: false
550
+ }),
551
+ replace: true
552
+ });
553
+ return true;
554
+ }
555
+ if (await this._getCurrentRefreshTokenIdIfSignedIn({ awaitPendingAuthResolutions: false }) === refreshTokenId) return false;
556
+ const callbackUrlString = currentUrl.searchParams.get(nestedCrossDomainAuthQueryParams.callbackUrl);
557
+ if (callbackUrlString == null) throw new HexclaveAssertionError("Nested cross-domain auth URL is missing callback URL");
558
+ if (isRelative(callbackUrlString)) throw new Error("Nested cross-domain auth callback URL must be absolute.");
559
+ const callbackUrl = new URL(callbackUrlString);
560
+ if (!await this._isTrusted(callbackUrl.toString())) throw new Error(`Nested cross-domain auth callback URL ${callbackUrlString} is not trusted.`);
561
+ const afterCallbackRedirectUrl = new URL(currentUrl);
562
+ afterCallbackRedirectUrl.searchParams.delete(nestedCrossDomainAuthQueryParams.refreshTokenId);
563
+ afterCallbackRedirectUrl.searchParams.delete(nestedCrossDomainAuthQueryParams.callbackUrl);
564
+ const { state: newState, codeChallenge: newCodeChallenge } = await this._getCrossDomainHandoffParamsForRedirect(currentUrl);
565
+ callbackUrl.searchParams.set(nestedCrossDomainAuthQueryParams.refreshTokenId, refreshTokenId);
566
+ callbackUrl.searchParams.set(nestedCrossDomainAuthQueryParams.redirectUri, new URL(this._getOAuthCallbackRedirectUri(), currentUrl).toString());
567
+ callbackUrl.searchParams.set(nestedCrossDomainAuthQueryParams.state, newState);
568
+ callbackUrl.searchParams.set(nestedCrossDomainAuthQueryParams.codeChallenge, newCodeChallenge);
569
+ callbackUrl.searchParams.set(nestedCrossDomainAuthQueryParams.codeChallengeMethod, "S256");
570
+ callbackUrl.searchParams.set(nestedCrossDomainAuthQueryParams.afterCallbackRedirectUrl, afterCallbackRedirectUrl.toString());
571
+ await this._redirectTo({
572
+ url: callbackUrl,
573
+ replace: true
574
+ });
575
+ return true;
576
+ }
577
+ /**
578
+ * Cloudflare workers does not allow use of randomness on the global scope (on which the Stack app is probably
579
+ * initialized). For that reason, we generate the unique identifier lazily when it is first needed instead of in the
580
+ * constructor.
581
+ */
582
+ _getUniqueIdentifier() {
583
+ if (!this._uniqueIdentifier) {
584
+ this._uniqueIdentifier = generateUuid();
585
+ this._initUniqueIdentifier();
586
+ }
587
+ return this._uniqueIdentifier;
588
+ }
589
+ async _checkFeatureSupport(name, options) {
590
+ return await this._interface.checkFeatureSupport({
591
+ ...options,
592
+ name
593
+ });
594
+ }
595
+ _useCheckFeatureSupport(name, options) {
596
+ runAsynchronously(this._checkFeatureSupport(name, options));
597
+ throw new HexclaveAssertionError(`${name} is not currently supported. Please reach out to Stack support for more information.`);
598
+ }
599
+ get _legacyRefreshTokenCookieName() {
600
+ return `stack-refresh-${this.projectId}`;
601
+ }
602
+ get _refreshTokenCookieName() {
603
+ return `hexclave-refresh-${this.projectId}`;
604
+ }
605
+ _getRefreshTokenDefaultCookieNameForSecure(secure) {
606
+ return `${secure ? "__Host-" : ""}${this._refreshTokenCookieName}--default`;
607
+ }
608
+ _getCustomRefreshCookieName(domain) {
609
+ const encoded = encodeBase32(new TextEncoder().encode(domain.toLowerCase()));
610
+ return `${this._refreshTokenCookieName}--custom-${encoded}`;
611
+ }
612
+ _getDomainFromCustomRefreshCookieName(name) {
613
+ for (const base of [this._refreshTokenCookieName, this._legacyRefreshTokenCookieName]) {
614
+ const prefix = `${base}--custom-`;
615
+ if (!name.startsWith(prefix)) continue;
616
+ try {
617
+ return new TextDecoder().decode(decodeBase32(name.slice(prefix.length)));
618
+ } catch {
619
+ return null;
620
+ }
621
+ }
622
+ return null;
623
+ }
624
+ _formatRefreshCookieValue(refreshToken, updatedAt) {
625
+ return JSON.stringify({
626
+ refresh_token: refreshToken,
627
+ updated_at_millis: updatedAt
628
+ });
629
+ }
630
+ _formatAccessCookieValue(refreshToken, accessToken) {
631
+ return refreshToken && accessToken ? JSON.stringify([refreshToken, accessToken]) : null;
632
+ }
633
+ _parseStructuredRefreshCookie(value) {
634
+ if (!value) return null;
635
+ const parsed = parseJson(value);
636
+ if (parsed.status !== "ok" || typeof parsed.data !== "object" || parsed.data === null) {
637
+ console.warn("Failed to parse structured refresh cookie");
638
+ return null;
639
+ }
640
+ const data = parsed.data;
641
+ const refreshToken = "refresh_token" in data && typeof data.refresh_token === "string" ? data.refresh_token : null;
642
+ const updatedAt = "updated_at_millis" in data && typeof data.updated_at_millis === "number" ? data.updated_at_millis : null;
643
+ if (!refreshToken) {
644
+ console.warn("Refresh token not found in structured refresh cookie");
645
+ return null;
646
+ }
647
+ return {
648
+ refreshToken,
649
+ updatedAt
650
+ };
651
+ }
652
+ _extractRefreshTokenFromCookieMap(cookies) {
653
+ const { legacyNames, structuredPrefixes } = this._getRefreshTokenCookieNamePatterns();
654
+ const currentStructuredPrefixes = [`${this._refreshTokenCookieName}--`, `__Host-${this._refreshTokenCookieName}--`];
655
+ const getNewestStructuredCookie = (prefixes) => {
656
+ let selected = null;
657
+ for (const [name, value] of Object.entries(cookies)) {
658
+ if (!prefixes.some((prefix) => name.startsWith(prefix))) continue;
659
+ const parsed = this._parseStructuredRefreshCookie(value);
660
+ if (!parsed) continue;
661
+ const candidateUpdatedAt = parsed.updatedAt ?? Number.NEGATIVE_INFINITY;
662
+ const selectedUpdatedAt = selected?.updatedAt ?? Number.NEGATIVE_INFINITY;
663
+ if (!selected || candidateUpdatedAt > selectedUpdatedAt) selected = parsed;
664
+ }
665
+ return selected;
666
+ };
667
+ const currentStructuredCookie = getNewestStructuredCookie(currentStructuredPrefixes);
668
+ if (currentStructuredCookie) return {
669
+ refreshToken: currentStructuredCookie.refreshToken,
670
+ updatedAt: currentStructuredCookie.updatedAt ?? null
671
+ };
672
+ for (const name of legacyNames) {
673
+ const value = cookies[name];
674
+ if (value) return {
675
+ refreshToken: value,
676
+ updatedAt: null
677
+ };
678
+ }
679
+ const selected = getNewestStructuredCookie(structuredPrefixes);
680
+ if (!selected) return {
681
+ refreshToken: null,
682
+ updatedAt: null
683
+ };
684
+ return {
685
+ refreshToken: selected.refreshToken,
686
+ updatedAt: selected.updatedAt ?? null
687
+ };
688
+ }
689
+ _getTokensFromCookies(cookies) {
690
+ const { refreshToken } = this._extractRefreshTokenFromCookieMap(cookies);
691
+ const accessTokenCookie = cookies[this._accessTokenCookieName] ?? cookies[this._legacyAccessTokenCookieName] ?? null;
692
+ let accessToken = null;
693
+ if (accessTokenCookie && accessTokenCookie.startsWith("[\"")) {
694
+ const parsed = parseJson(accessTokenCookie);
695
+ if (parsed.status === "ok" && typeof parsed.data === "object" && parsed.data !== null && Array.isArray(parsed.data) && parsed.data.length === 2 && typeof parsed.data[0] === "string" && typeof parsed.data[1] === "string") {
696
+ if (parsed.data[0] === refreshToken) accessToken = parsed.data[1];
697
+ } else console.warn("Access token cookie has invalid format");
698
+ }
699
+ return {
700
+ refreshToken,
701
+ accessToken
702
+ };
703
+ }
704
+ get _accessTokenCookieName() {
705
+ return `hexclave-access`;
706
+ }
707
+ get _legacyAccessTokenCookieName() {
708
+ return `stack-access`;
709
+ }
710
+ _getAllBrowserCookies() {
711
+ if (!isBrowserLike()) throw new HexclaveAssertionError("Cannot get browser cookies on the server!");
712
+ return cookie.parseCookie(document.cookie || "");
713
+ }
714
+ _getRefreshTokenCookieNamePatterns() {
715
+ return {
716
+ legacyNames: [this._legacyRefreshTokenCookieName, "stack-refresh"],
717
+ structuredPrefixes: [
718
+ `${this._refreshTokenCookieName}--`,
719
+ `__Host-${this._refreshTokenCookieName}--`,
720
+ `${this._legacyRefreshTokenCookieName}--`,
721
+ `__Host-${this._legacyRefreshTokenCookieName}--`
722
+ ]
723
+ };
724
+ }
725
+ _collectRefreshTokenCookieNames(cookies) {
726
+ const { legacyNames, structuredPrefixes } = this._getRefreshTokenCookieNamePatterns();
727
+ const names = /* @__PURE__ */ new Set();
728
+ for (const name of legacyNames) if (cookies[name]) names.add(name);
729
+ for (const name of Object.keys(cookies)) if (structuredPrefixes.some((prefix) => name.startsWith(prefix))) names.add(name);
730
+ return names;
731
+ }
732
+ _prepareRefreshCookieUpdate(existingCookies, refreshToken, accessToken, defaultCookieName) {
733
+ const cookieNames = this._collectRefreshTokenCookieNames(existingCookies);
734
+ cookieNames.delete(defaultCookieName);
735
+ const updatedAt = refreshToken ? Date.now() : null;
736
+ return {
737
+ updatedAt,
738
+ refreshCookieValue: refreshToken && updatedAt !== null ? this._formatRefreshCookieValue(refreshToken, updatedAt) : null,
739
+ accessTokenPayload: this._formatAccessCookieValue(refreshToken, accessToken),
740
+ cookieNamesToDelete: [...cookieNames]
741
+ };
742
+ }
743
+ _ensureCrossSubdomainCookieExists() {
744
+ runAsynchronously(async () => {
745
+ const hostname = window.location.hostname;
746
+ const domain = await this._trustedParentDomainCache.getOrWait([hostname], "read-write");
747
+ if (domain.status === "error" || !domain.data) return;
748
+ const cookies = this._getAllBrowserCookies();
749
+ const customCookieName = this._getCustomRefreshCookieName(domain.data);
750
+ if (cookies[customCookieName]) return;
751
+ const { refreshToken, updatedAt } = this._extractRefreshTokenFromCookieMap(cookies);
752
+ if (refreshToken && updatedAt) setOrDeleteCookieClient(customCookieName, this._formatRefreshCookieValue(refreshToken, updatedAt), {
753
+ maxAge: 3600 * 24 * 365,
754
+ domain: domain.data
755
+ });
756
+ });
757
+ }
758
+ _queueCustomRefreshCookieUpdate(refreshToken, updatedAt, context) {
759
+ runAsynchronously(async () => {
760
+ this._mostRecentQueuedCookieRefreshIndex++;
761
+ const updateIndex = this._mostRecentQueuedCookieRefreshIndex;
762
+ let hostname;
763
+ if (isBrowserLike()) hostname = window.location.hostname;
764
+ else hostname = await getServerRequestHost();
765
+ if (!hostname) {
766
+ console.warn("No hostname found when queueing custom refresh cookie update");
767
+ return;
768
+ }
769
+ const domain = await this._trustedParentDomainCache.getOrWait([hostname], "read-write");
770
+ const cookieOptions = {
771
+ maxAge: 3600 * 24 * 365,
772
+ noOpIfServerComponent: true
773
+ };
774
+ const setCookie = async (targetDomain, value) => {
775
+ const name = this._getCustomRefreshCookieName(targetDomain);
776
+ const options = {
777
+ ...cookieOptions,
778
+ domain: targetDomain
779
+ };
780
+ if (context === "browser") setOrDeleteCookieClient(name, value, options);
781
+ else await setOrDeleteCookie(name, value, options);
782
+ };
783
+ if (domain.status === "error" || !domain.data || updateIndex !== this._mostRecentQueuedCookieRefreshIndex) return;
784
+ const value = refreshToken && updatedAt ? this._formatRefreshCookieValue(refreshToken, updatedAt) : null;
785
+ await setCookie(domain.data, value);
786
+ const isSecure$1 = await isSecure();
787
+ const defaultName = this._getRefreshTokenDefaultCookieNameForSecure(isSecure$1);
788
+ if (context === "browser") setOrDeleteCookieClient(defaultName, null, cookieOptions);
789
+ else await setOrDeleteCookie(defaultName, null, cookieOptions);
790
+ });
791
+ }
792
+ async _getTrustedRedirectConfig() {
793
+ const project = Result.orThrow(await this._currentProjectCache.getOrWait([], "write-only"));
794
+ return {
795
+ allowLocalhost: project.config.allow_localhost,
796
+ trustedDomains: [...project.config.domains.map((d) => d.domain), new URL(getHostedHandlerUrl({
797
+ projectId: this.projectId,
798
+ pagePath: ""
799
+ })).origin]
800
+ };
801
+ }
802
+ async _getTrustedParentDomain(currentDomain) {
803
+ return getTrustedParentDomain(currentDomain, (await this._getTrustedRedirectConfig()).trustedDomains);
804
+ }
805
+ _getBrowserCookieTokenStore() {
806
+ if (!isBrowserLike()) throw new Error("Cannot use cookie token store on the server!");
807
+ if (this._storedBrowserCookieTokenStore === null) {
808
+ const getCurrentValue = (old) => {
809
+ const tokens = this._getTokensFromCookies(this._getAllBrowserCookies());
810
+ return {
811
+ refreshToken: tokens.refreshToken,
812
+ accessToken: tokens.accessToken ?? (old?.refreshToken === tokens.refreshToken ? old.accessToken : null)
813
+ };
814
+ };
815
+ this._storedBrowserCookieTokenStore = new Store(getCurrentValue(null));
816
+ let hasSucceededInWriting = true;
817
+ setInterval(() => {
818
+ if (hasSucceededInWriting) {
819
+ const oldValue = this._storedBrowserCookieTokenStore.get();
820
+ const currentValue = getCurrentValue(oldValue);
821
+ if (!deepPlainEquals(currentValue, oldValue)) this._storedBrowserCookieTokenStore.set(currentValue);
822
+ }
823
+ }, 100);
824
+ this._storedBrowserCookieTokenStore.onChange((value) => {
825
+ try {
826
+ const refreshToken = value.refreshToken;
827
+ const secure = window.location.protocol === "https:";
828
+ const defaultName = this._getRefreshTokenDefaultCookieNameForSecure(secure);
829
+ const { updatedAt, refreshCookieValue, accessTokenPayload, cookieNamesToDelete } = this._prepareRefreshCookieUpdate(this._getAllBrowserCookies(), refreshToken, value.accessToken ?? null, defaultName);
830
+ setOrDeleteCookieClient(defaultName, refreshCookieValue, {
831
+ maxAge: 3600 * 24 * 365,
832
+ secure
833
+ });
834
+ setOrDeleteCookieClient(this._accessTokenCookieName, accessTokenPayload, { maxAge: 3600 * 24 });
835
+ cookieNamesToDelete.forEach((name) => {
836
+ const domain = this._getDomainFromCustomRefreshCookieName(name);
837
+ deleteCookieClient(name, domain ? { domain } : {});
838
+ });
839
+ this._queueCustomRefreshCookieUpdate(refreshToken, updatedAt, "browser");
840
+ hasSucceededInWriting = true;
841
+ } catch (e) {
842
+ if (!isBrowserLike()) hasSucceededInWriting = false;
843
+ else throw e;
844
+ }
845
+ });
846
+ }
847
+ return this._storedBrowserCookieTokenStore;
848
+ }
849
+ _getOrCreateTokenStore(cookieHelper, overrideTokenStoreInit) {
850
+ const tokenStoreInit = overrideTokenStoreInit === void 0 ? this._tokenStoreInit : overrideTokenStoreInit;
851
+ switch (tokenStoreInit) {
852
+ case "cookie": return this._getBrowserCookieTokenStore();
853
+ case "nextjs-cookie": if (isBrowserLike()) return this._getBrowserCookieTokenStore();
854
+ else {
855
+ const store = new Store(this._getTokensFromCookies(cookieHelper.getAll()));
856
+ store.onChange((value) => {
857
+ runAsynchronously(async () => {
858
+ const refreshToken = value.refreshToken;
859
+ const secure = await isSecure();
860
+ const defaultName = this._getRefreshTokenDefaultCookieNameForSecure(secure);
861
+ const { updatedAt, refreshCookieValue, accessTokenPayload, cookieNamesToDelete } = this._prepareRefreshCookieUpdate(cookieHelper.getAll(), refreshToken, value.accessToken ?? null, defaultName);
862
+ await Promise.all([setOrDeleteCookie(defaultName, refreshCookieValue, {
863
+ maxAge: 3600 * 24 * 365,
864
+ noOpIfServerComponent: true
865
+ }), setOrDeleteCookie(this._accessTokenCookieName, accessTokenPayload, {
866
+ maxAge: 3600 * 24,
867
+ noOpIfServerComponent: true
868
+ })]);
869
+ if (cookieNamesToDelete.length > 0) await Promise.all(cookieNamesToDelete.map((name) => {
870
+ const domain = this._getDomainFromCustomRefreshCookieName(name);
871
+ return deleteCookie(name, {
872
+ noOpIfServerComponent: true,
873
+ ...domain ? { domain } : {}
874
+ });
875
+ }));
876
+ this._queueCustomRefreshCookieUpdate(refreshToken, updatedAt, "server");
877
+ });
878
+ });
879
+ return store;
880
+ }
881
+ case "memory": return this._memoryTokenStore;
882
+ default:
883
+ if (tokenStoreInit === null) return createEmptyTokenStore();
884
+ else if (typeof tokenStoreInit === "object" && "headers" in tokenStoreInit) {
885
+ if (this._requestTokenStores.has(tokenStoreInit)) return this._requestTokenStores.get(tokenStoreInit);
886
+ const authorizationHeader = getHeaderValueFromRequestLikeHeaders(tokenStoreInit.headers, "authorization");
887
+ if (authorizationHeader) {
888
+ const authJson = getAuthJsonFromAuthorizationHeaderValue(authorizationHeader);
889
+ if (authJson != null) {
890
+ const tokenStore = new Store({
891
+ accessToken: authJson.accessToken,
892
+ refreshToken: authJson.refreshToken
893
+ });
894
+ this._requestTokenStores.set(tokenStoreInit, tokenStore);
895
+ return tokenStore;
896
+ }
897
+ }
898
+ const stackAuthHeader = getHeaderValueFromRequestLikeHeaders(tokenStoreInit.headers, "x-stack-auth");
899
+ if (stackAuthHeader) {
900
+ let parsed;
901
+ try {
902
+ parsed = JSON.parse(stackAuthHeader);
903
+ if (typeof parsed !== "object") throw new Error("x-stack-auth header must be a JSON object");
904
+ if (parsed === null) throw new Error("x-stack-auth header must not be null");
905
+ } catch (e) {
906
+ throw new Error("Invalid x-stack-auth header.", { cause: e });
907
+ }
908
+ return this._getOrCreateTokenStore(cookieHelper, {
909
+ accessToken: parsed.accessToken ?? null,
910
+ refreshToken: parsed.refreshToken ?? null
911
+ });
912
+ }
913
+ const cookieHeader = getHeaderValueFromRequestLikeHeaders(tokenStoreInit.headers, "cookie");
914
+ const parsed = cookie.parseCookie(cookieHeader || "");
915
+ const res = new Store(this._getTokensFromCookies(parsed));
916
+ this._requestTokenStores.set(tokenStoreInit, res);
917
+ return res;
918
+ } else if ("accessToken" in tokenStoreInit || "refreshToken" in tokenStoreInit) return new Store({
919
+ refreshToken: tokenStoreInit.refreshToken,
920
+ accessToken: tokenStoreInit.accessToken
921
+ });
922
+ throw new Error(`Invalid token store ${tokenStoreInit}`);
923
+ }
924
+ }
925
+ _useTokenStore(overrideTokenStoreInit) {
926
+ suspendIfSsr();
927
+ const cookieHelper = createBrowserCookieHelper();
928
+ return this._getOrCreateTokenStore(cookieHelper, overrideTokenStoreInit);
929
+ }
930
+ _getSessionFromTokenStore(tokenStore) {
931
+ const tokenObj = tokenStore.get();
932
+ const sessionKey = InternalSession.calculateSessionKey(tokenObj);
933
+ const existing = sessionKey ? this._sessionsByTokenStoreAndSessionKey.get(tokenStore)?.get(sessionKey) : null;
934
+ if (existing) return existing;
935
+ const session = this._interface.createSession({
936
+ refreshToken: tokenObj.refreshToken,
937
+ accessToken: tokenObj.accessToken
938
+ });
939
+ session.onAccessTokenChange((newAccessToken) => {
940
+ tokenStore.update((old) => ({
941
+ ...old,
942
+ accessToken: newAccessToken?.token ?? null
943
+ }));
944
+ });
945
+ session.onInvalidate(() => {
946
+ tokenStore.update((old) => ({
947
+ ...old,
948
+ accessToken: null,
949
+ refreshToken: null
950
+ }));
951
+ });
952
+ let sessionsBySessionKey = this._sessionsByTokenStoreAndSessionKey.get(tokenStore) ?? /* @__PURE__ */ new Map();
953
+ this._sessionsByTokenStoreAndSessionKey.set(tokenStore, sessionsBySessionKey);
954
+ sessionsBySessionKey.set(sessionKey, session);
955
+ return session;
956
+ }
957
+ async _getSession(overrideTokenStoreInit, options) {
958
+ await this._awaitPendingAuthResolutions(overrideTokenStoreInit, options);
959
+ const tokenStore = this._getOrCreateTokenStore(await this._createCookieHelper(overrideTokenStoreInit), overrideTokenStoreInit);
960
+ return this._getSessionFromTokenStore(tokenStore);
961
+ }
962
+ _useSession(overrideTokenStoreInit) {
963
+ this._usePendingAuthResolutions(overrideTokenStoreInit);
964
+ const tokenStore = this._useTokenStore(overrideTokenStoreInit);
965
+ const subscribe = useCallback((cb) => {
966
+ return subscribeSessionRefresh({
967
+ tokenStore,
968
+ getSession: () => this._getSessionFromTokenStore(tokenStore),
969
+ onTokenStoreChange: cb
970
+ });
971
+ }, [tokenStore]);
972
+ const getSnapshot = useCallback(() => this._getSessionFromTokenStore(tokenStore), [tokenStore]);
973
+ return React.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
974
+ }
975
+ async _signInToAccountWithTokens(tokens) {
976
+ if (!("accessToken" in tokens) || !("refreshToken" in tokens)) throw new HexclaveAssertionError("Invalid tokens object; can't sign in with this", { tokens });
977
+ const tokenStore = this._getOrCreateTokenStore(await this._createCookieHelper());
978
+ tokenStore.set(tokens);
979
+ const newSession = this._getSessionFromTokenStore(tokenStore);
980
+ this._currentUserCache.getOrWait([newSession], "write-only").catch(() => {});
981
+ }
982
+ _getTokenStoreInitForFreshTokens(tokens) {
983
+ if (tokens.accessToken == null) return;
984
+ return {
985
+ accessToken: tokens.accessToken,
986
+ refreshToken: tokens.refreshToken
987
+ };
988
+ }
989
+ _hasPersistentTokenStore(overrideTokenStoreInit) {
990
+ return (overrideTokenStoreInit !== void 0 ? overrideTokenStoreInit : this._tokenStoreInit) !== null;
991
+ }
992
+ _ensurePersistentTokenStore(overrideTokenStoreInit) {
993
+ if (!this._hasPersistentTokenStore(overrideTokenStoreInit)) throw new Error("Cannot call this function on a Stack app without a persistent token store. Make sure the tokenStore option on the constructor is set to a non-null value when initializing Stack.\n\nStack uses token stores to access access tokens of the current user. For example, on web frontends it is commonly the string value 'cookies' for cookie storage.");
994
+ }
995
+ _isInternalProject() {
996
+ return this.projectId === "internal";
997
+ }
998
+ _ensureInternalProject() {
999
+ if (!this._isInternalProject()) throw new Error("Cannot call this function on a Stack app with a project ID other than 'internal'.");
1000
+ }
1001
+ _clientProjectFromCrud(crud) {
1002
+ return {
1003
+ id: crud.id,
1004
+ displayName: crud.display_name,
1005
+ config: {
1006
+ signUpEnabled: crud.config.sign_up_enabled,
1007
+ credentialEnabled: crud.config.credential_enabled,
1008
+ magicLinkEnabled: crud.config.magic_link_enabled,
1009
+ passkeyEnabled: crud.config.passkey_enabled,
1010
+ clientTeamCreationEnabled: crud.config.client_team_creation_enabled,
1011
+ clientUserDeletionEnabled: crud.config.client_user_deletion_enabled,
1012
+ allowTeamApiKeys: crud.config.allow_team_api_keys,
1013
+ allowUserApiKeys: crud.config.allow_user_api_keys,
1014
+ oauthProviders: crud.config.enabled_oauth_providers.map((p) => ({ id: p.id }))
1015
+ }
1016
+ };
1017
+ }
1018
+ _clientPermissionFromCrud(crud) {
1019
+ return { id: crud.id };
1020
+ }
1021
+ _clientTeamUserFromCrud(crud) {
1022
+ return {
1023
+ id: crud.user_id,
1024
+ teamProfile: {
1025
+ displayName: crud.display_name,
1026
+ profileImageUrl: crud.profile_image_url
1027
+ }
1028
+ };
1029
+ }
1030
+ _clientSentTeamInvitationFromCrud(session, crud) {
1031
+ return {
1032
+ id: crud.id,
1033
+ recipientEmail: crud.recipient_email,
1034
+ expiresAt: new Date(crud.expires_at_millis),
1035
+ revoke: async () => {
1036
+ await this._interface.revokeTeamInvitation(crud.id, crud.team_id, session);
1037
+ await this._teamInvitationsCache.refresh([session, crud.team_id]);
1038
+ }
1039
+ };
1040
+ }
1041
+ _clientReceivedTeamInvitationFromCrud(session, crud) {
1042
+ const app = this;
1043
+ return {
1044
+ id: crud.id,
1045
+ teamId: crud.team_id,
1046
+ teamDisplayName: crud.team_display_name,
1047
+ recipientEmail: crud.recipient_email,
1048
+ expiresAt: new Date(crud.expires_at_millis),
1049
+ accept: async () => {
1050
+ await app._interface.acceptTeamInvitationById(crud.id, session);
1051
+ await Promise.all([
1052
+ app._currentUserTeamInvitationsCache.refresh([session]),
1053
+ app._currentUserTeamsCache.refresh([session]),
1054
+ app._teamInvitationsCache.refresh([session, crud.team_id])
1055
+ ]);
1056
+ }
1057
+ };
1058
+ }
1059
+ _baseApiKeyFromCrud(crud) {
1060
+ return {
1061
+ id: crud.id,
1062
+ description: crud.description,
1063
+ expiresAt: crud.expires_at_millis ? new Date(crud.expires_at_millis) : void 0,
1064
+ manuallyRevokedAt: crud.manually_revoked_at_millis ? new Date(crud.manually_revoked_at_millis) : null,
1065
+ createdAt: new Date(crud.created_at_millis),
1066
+ ...crud.type === "team" ? {
1067
+ type: "team",
1068
+ teamId: crud.team_id
1069
+ } : {
1070
+ type: "user",
1071
+ userId: crud.user_id
1072
+ },
1073
+ value: typeof crud.value === "string" ? crud.value : { lastFour: crud.value.last_four },
1074
+ isValid: function() {
1075
+ return this.whyInvalid() === null;
1076
+ },
1077
+ whyInvalid: function() {
1078
+ if (this.manuallyRevokedAt) return "manually-revoked";
1079
+ if (this.expiresAt && this.expiresAt < /* @__PURE__ */ new Date()) return "expired";
1080
+ return null;
1081
+ }
1082
+ };
1083
+ }
1084
+ _clientApiKeyFromCrud(session, crud) {
1085
+ return {
1086
+ ...this._baseApiKeyFromCrud(crud),
1087
+ async revoke() {
1088
+ await this.update({ revoked: true });
1089
+ },
1090
+ update: async (options) => {
1091
+ await this._interface.updateProjectApiKey(crud.type === "team" ? { team_id: crud.team_id } : { user_id: crud.user_id }, crud.id, options, session, "client");
1092
+ if (crud.type === "team") await this._teamApiKeysCache.refresh([session, crud.team_id]);
1093
+ else await this._userApiKeysCache.refresh([session]);
1094
+ }
1095
+ };
1096
+ }
1097
+ _clientTeamFromCrud(crud, session) {
1098
+ const app = this;
1099
+ return {
1100
+ id: crud.id,
1101
+ displayName: crud.display_name,
1102
+ profileImageUrl: crud.profile_image_url,
1103
+ clientMetadata: crud.client_metadata,
1104
+ clientReadOnlyMetadata: crud.client_read_only_metadata,
1105
+ ...this._createCustomer(crud.id, "team", session),
1106
+ async inviteUser(options) {
1107
+ await app._interface.sendTeamInvitation({
1108
+ teamId: crud.id,
1109
+ email: options.email,
1110
+ session,
1111
+ callbackUrl: options.callbackUrl ?? constructRedirectUrl(app.urls.teamInvitation, "callbackUrl")
1112
+ });
1113
+ await app._teamInvitationsCache.refresh([session, crud.id]);
1114
+ },
1115
+ async listUsers() {
1116
+ return Result.orThrow(await app._teamMemberProfilesCache.getOrWait([session, crud.id], "write-only")).map((crud) => app._clientTeamUserFromCrud(crud));
1117
+ },
1118
+ useUsers() {
1119
+ return useAsyncCache(app._teamMemberProfilesCache, [session, crud.id], "team.useUsers()").map((crud) => app._clientTeamUserFromCrud(crud));
1120
+ },
1121
+ async listInvitations() {
1122
+ return Result.orThrow(await app._teamInvitationsCache.getOrWait([session, crud.id], "write-only")).map((crud) => app._clientSentTeamInvitationFromCrud(session, crud));
1123
+ },
1124
+ useInvitations() {
1125
+ return useAsyncCache(app._teamInvitationsCache, [session, crud.id], "team.useInvitations()").map((crud) => app._clientSentTeamInvitationFromCrud(session, crud));
1126
+ },
1127
+ async update(data) {
1128
+ await app._interface.updateTeam({
1129
+ data: teamUpdateOptionsToCrud(data),
1130
+ teamId: crud.id
1131
+ }, session);
1132
+ await app._currentUserTeamsCache.refresh([session]);
1133
+ },
1134
+ async delete() {
1135
+ await app._interface.deleteTeam(crud.id, session);
1136
+ await app._currentUserTeamsCache.refresh([session]);
1137
+ },
1138
+ useApiKeys() {
1139
+ return useAsyncCache(app._teamApiKeysCache, [session, crud.id], "team.useApiKeys()").map((crud) => app._clientApiKeyFromCrud(session, crud));
1140
+ },
1141
+ async listApiKeys() {
1142
+ return Result.orThrow(await app._teamApiKeysCache.getOrWait([session, crud.id], "write-only")).map((crud) => app._clientApiKeyFromCrud(session, crud));
1143
+ },
1144
+ async createApiKey(options) {
1145
+ const result = await app._interface.createProjectApiKey(await apiKeyCreationOptionsToCrud("team", crud.id, options), session, "client");
1146
+ await app._teamApiKeysCache.refresh([session, crud.id]);
1147
+ return app._clientApiKeyFromCrud(session, result);
1148
+ }
1149
+ };
1150
+ }
1151
+ _clientContactChannelFromCrud(crud, session) {
1152
+ const app = this;
1153
+ return {
1154
+ id: crud.id,
1155
+ value: crud.value,
1156
+ type: crud.type,
1157
+ isVerified: crud.is_verified,
1158
+ isPrimary: crud.is_primary,
1159
+ usedForAuth: crud.used_for_auth,
1160
+ async sendVerificationEmail(options) {
1161
+ await app._interface.sendCurrentUserContactChannelVerificationEmail(crud.id, options?.callbackUrl || constructRedirectUrl(app.urls.emailVerification, "callbackUrl"), session);
1162
+ },
1163
+ async update(data) {
1164
+ await app._interface.updateClientContactChannel(crud.id, contactChannelUpdateOptionsToCrud(data), session);
1165
+ await app._clientContactChannelsCache.refresh([session]);
1166
+ },
1167
+ async delete() {
1168
+ await app._interface.deleteClientContactChannel(crud.id, session);
1169
+ await app._clientContactChannelsCache.refresh([session]);
1170
+ }
1171
+ };
1172
+ }
1173
+ _clientNotificationCategoryFromCrud(crud, session) {
1174
+ const app = this;
1175
+ return {
1176
+ id: crud.notification_category_id,
1177
+ name: crud.notification_category_name,
1178
+ enabled: crud.enabled,
1179
+ canDisable: crud.can_disable,
1180
+ async setEnabled(enabled) {
1181
+ await app._interface.setNotificationsEnabled(crud.notification_category_id, enabled, session);
1182
+ await app._notificationCategoriesCache.refresh([session]);
1183
+ }
1184
+ };
1185
+ }
1186
+ _clientOAuthProviderFromCrud(crud, session) {
1187
+ const app = this;
1188
+ return {
1189
+ id: crud.id,
1190
+ type: crud.type,
1191
+ userId: crud.user_id,
1192
+ email: crud.email,
1193
+ allowSignIn: crud.allow_sign_in,
1194
+ allowConnectedAccounts: crud.allow_connected_accounts,
1195
+ async update(data) {
1196
+ try {
1197
+ await app._interface.updateOAuthProvider(crud.user_id, crud.id, {
1198
+ allow_sign_in: data.allowSignIn,
1199
+ allow_connected_accounts: data.allowConnectedAccounts
1200
+ }, session);
1201
+ await Promise.all([app._currentUserOAuthProvidersCache.refresh([session]), app._currentUserConnectedAccountsCache.refresh([session])]);
1202
+ return Result.ok(void 0);
1203
+ } catch (error) {
1204
+ if (KnownErrors.OAuthProviderAccountIdAlreadyUsedForSignIn.isInstance(error)) return Result.error(error);
1205
+ throw error;
1206
+ }
1207
+ },
1208
+ async delete() {
1209
+ await app._interface.deleteOAuthProvider(crud.user_id, crud.id, session);
1210
+ await Promise.all([app._currentUserOAuthProvidersCache.refresh([session]), app._currentUserConnectedAccountsCache.refresh([session])]);
1211
+ }
1212
+ };
1213
+ }
1214
+ _clientItemFromCrud(crud) {
1215
+ return {
1216
+ displayName: crud.display_name,
1217
+ quantity: crud.quantity,
1218
+ nonNegativeQuantity: Math.max(0, crud.quantity)
1219
+ };
1220
+ }
1221
+ _customerProductsFromResponse(response) {
1222
+ const products = response.items.map((item) => ({
1223
+ id: item.id,
1224
+ quantity: item.quantity,
1225
+ displayName: item.product.display_name,
1226
+ customerType: item.product.customer_type,
1227
+ isServerOnly: item.product.server_only,
1228
+ stackable: item.product.stackable,
1229
+ type: item.type,
1230
+ subscription: item.subscription ? {
1231
+ subscriptionId: item.subscription.subscription_id,
1232
+ currentPeriodEnd: item.subscription.current_period_end ? new Date(item.subscription.current_period_end) : null,
1233
+ cancelAtPeriodEnd: item.subscription.cancel_at_period_end,
1234
+ isCancelable: item.subscription.is_cancelable
1235
+ } : null,
1236
+ switchOptions: item.switch_options?.map((option) => ({
1237
+ productId: option.product_id,
1238
+ displayName: option.product.display_name,
1239
+ prices: option.product.prices
1240
+ }))
1241
+ }));
1242
+ return Object.assign(products, { nextCursor: response.pagination.next_cursor ?? null });
1243
+ }
1244
+ _customerInvoicesFromResponse(response) {
1245
+ const invoices = response.items.map((item) => ({
1246
+ status: item.status,
1247
+ amountTotal: item.amount_total,
1248
+ hostedInvoiceUrl: item.hosted_invoice_url,
1249
+ createdAt: new Date(item.created_at_millis)
1250
+ }));
1251
+ return Object.assign(invoices, { nextCursor: response.pagination.next_cursor ?? null });
1252
+ }
1253
+ _customerBillingFromResponse(response) {
1254
+ return {
1255
+ hasCustomer: response.has_customer,
1256
+ defaultPaymentMethod: response.default_payment_method
1257
+ };
1258
+ }
1259
+ _createAuth(session) {
1260
+ const app = this;
1261
+ return {
1262
+ _internalSession: session,
1263
+ currentSession: {
1264
+ async getTokens() {
1265
+ const tokens = await session.getOrFetchLikelyValidTokens(2e4, 75e3);
1266
+ return {
1267
+ accessToken: tokens?.accessToken.token ?? null,
1268
+ refreshToken: tokens?.refreshToken?.token ?? null
1269
+ };
1270
+ },
1271
+ useTokens() {
1272
+ const subscribe = useCallback((cb) => {
1273
+ const { unsubscribe: unsubscribeInvalidate } = session.onInvalidate(cb);
1274
+ const { unsubscribe: unsubscribeAccessTokenChange } = session.onAccessTokenChange(cb);
1275
+ return () => {
1276
+ unsubscribeInvalidate();
1277
+ unsubscribeAccessTokenChange();
1278
+ };
1279
+ }, [session]);
1280
+ const getSnapshot = useCallback(() => {
1281
+ return session.isKnownToBeInvalid() ? null : session.getAccessTokenIfNotExpiredYet(2e4, 75e3)?.token ?? null;
1282
+ }, [session]);
1283
+ let accessToken = React.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
1284
+ if (accessToken === null && !session.isKnownToBeInvalid()) accessToken = use(session.getOrFetchLikelyValidTokens(2e4, 75e3))?.accessToken.token ?? null;
1285
+ return {
1286
+ accessToken,
1287
+ refreshToken: session.getRefreshToken()?.token ?? null
1288
+ };
1289
+ }
1290
+ },
1291
+ async getAccessToken() {
1292
+ return (await this.currentSession.getTokens()).accessToken;
1293
+ },
1294
+ useAccessToken() {
1295
+ return this.currentSession.useTokens().accessToken;
1296
+ },
1297
+ async getRefreshToken() {
1298
+ return (await this.currentSession.getTokens()).refreshToken;
1299
+ },
1300
+ useRefreshToken() {
1301
+ return this.currentSession.useTokens().refreshToken;
1302
+ },
1303
+ async getAuthorizationHeader() {
1304
+ return getAuthorizationHeaderValueFromAuthJson(await this.getAuthJson());
1305
+ },
1306
+ useAuthorizationHeader() {
1307
+ return getAuthorizationHeaderValueFromAuthJson(this.useAuthJson());
1308
+ },
1309
+ async getAuthHeaders() {
1310
+ return { "x-stack-auth": JSON.stringify(await this.getAuthJson()) };
1311
+ },
1312
+ useAuthHeaders() {
1313
+ return { "x-stack-auth": JSON.stringify(this.useAuthJson()) };
1314
+ },
1315
+ async getAuthJson() {
1316
+ return await this.currentSession.getTokens();
1317
+ },
1318
+ useAuthJson() {
1319
+ return this.currentSession.useTokens();
1320
+ },
1321
+ signOut(options) {
1322
+ return app._signOut(session, options);
1323
+ }
1324
+ };
1325
+ }
1326
+ _editableTeamProfileFromCrud(crud, session) {
1327
+ const app = this;
1328
+ return {
1329
+ displayName: crud.display_name,
1330
+ profileImageUrl: crud.profile_image_url,
1331
+ async update(update) {
1332
+ await app._interface.updateTeamMemberProfile({
1333
+ teamId: crud.team_id,
1334
+ userId: crud.user_id,
1335
+ profile: {
1336
+ display_name: update.displayName,
1337
+ profile_image_url: update.profileImageUrl
1338
+ }
1339
+ }, session);
1340
+ await app._currentUserTeamProfileCache.refresh([session, crud.team_id]);
1341
+ }
1342
+ };
1343
+ }
1344
+ _createBaseUser(crud) {
1345
+ return {
1346
+ id: crud.id,
1347
+ displayName: crud.display_name,
1348
+ primaryEmail: crud.primary_email,
1349
+ primaryEmailVerified: crud.primary_email_verified,
1350
+ profileImageUrl: crud.profile_image_url,
1351
+ signedUpAt: new Date(crud.signed_up_at_millis),
1352
+ clientMetadata: crud.client_metadata,
1353
+ clientReadOnlyMetadata: crud.client_read_only_metadata,
1354
+ hasPassword: crud.has_password,
1355
+ emailAuthEnabled: crud.auth_with_email,
1356
+ otpAuthEnabled: crud.otp_auth_enabled,
1357
+ oauthProviders: crud.oauth_providers,
1358
+ passkeyAuthEnabled: crud.passkey_auth_enabled,
1359
+ isMultiFactorRequired: crud.requires_totp_mfa,
1360
+ isAnonymous: crud.is_anonymous,
1361
+ isRestricted: crud.is_restricted,
1362
+ restrictedReason: crud.restricted_reason,
1363
+ toClientJson() {
1364
+ return crud;
1365
+ }
1366
+ };
1367
+ }
1368
+ _createUserExtraFromCurrent(crud, session) {
1369
+ const app = this;
1370
+ async function getConnectedAccount(idOrAccount, options) {
1371
+ const scopeString = options?.scopes?.join(" ") ?? "";
1372
+ if (typeof idOrAccount === "object" && "provider" in idOrAccount && "providerAccountId" in idOrAccount) {
1373
+ const { provider, providerAccountId } = idOrAccount;
1374
+ const found = Result.orThrow(await app._currentUserConnectedAccountsCache.getOrWait([session], "write-only")).find((a) => a.provider === provider && a.providerAccountId === providerAccountId);
1375
+ if (!found) return null;
1376
+ return found;
1377
+ }
1378
+ return Result.orThrow(await app._currentUserOAuthConnectionCache.getOrWait([
1379
+ session,
1380
+ idOrAccount,
1381
+ scopeString,
1382
+ options?.or === "redirect"
1383
+ ], "write-only"));
1384
+ }
1385
+ function useConnectedAccount(idOrAccount, options) {
1386
+ const scopeString = options?.scopes?.join(" ") ?? "";
1387
+ if (typeof idOrAccount === "object" && "provider" in idOrAccount && "providerAccountId" in idOrAccount) {
1388
+ const { provider, providerAccountId } = idOrAccount;
1389
+ return useAsyncCache(app._currentUserConnectedAccountsCache, [session], "user.useConnectedAccount()").find((a) => a.provider === provider && a.providerAccountId === providerAccountId) ?? null;
1390
+ }
1391
+ return useAsyncCache(app._currentUserOAuthConnectionCache, [
1392
+ session,
1393
+ idOrAccount,
1394
+ scopeString,
1395
+ options?.or === "redirect"
1396
+ ], "user.useConnectedAccount()");
1397
+ }
1398
+ return {
1399
+ async getActiveSessions() {
1400
+ return (await app._interface.listSessions(session)).items.map((crud) => app._clientSessionFromCrud(crud));
1401
+ },
1402
+ async revokeSession(sessionId) {
1403
+ await app._interface.deleteSession(sessionId, session);
1404
+ },
1405
+ setDisplayName(displayName) {
1406
+ return this.update({ displayName });
1407
+ },
1408
+ setClientMetadata(metadata) {
1409
+ return this.update({ clientMetadata: metadata });
1410
+ },
1411
+ async setSelectedTeam(team) {
1412
+ await this.update({ selectedTeamId: typeof team === "string" ? team : team?.id ?? null });
1413
+ },
1414
+ getConnectedAccount,
1415
+ useConnectedAccount,
1416
+ async listConnectedAccounts() {
1417
+ return Result.orThrow(await app._currentUserConnectedAccountsCache.getOrWait([session], "write-only"));
1418
+ },
1419
+ useConnectedAccounts() {
1420
+ return useAsyncCache(app._currentUserConnectedAccountsCache, [session], "user.useConnectedAccounts()");
1421
+ },
1422
+ async linkConnectedAccount(provider, options) {
1423
+ const scopeString = options?.scopes?.join(" ") ?? "";
1424
+ const location = await getNewOAuthProviderOrScopeUrl(app._interface, {
1425
+ provider,
1426
+ redirectUrl: app._getOAuthCallbackRedirectUri(),
1427
+ errorRedirectUrl: app.urls.error,
1428
+ providerScope: mergeScopeStrings(scopeString, (app._oauthScopesOnSignIn[provider] ?? []).join(" "))
1429
+ }, session);
1430
+ await app._redirectTo({ url: location });
1431
+ return await neverResolve();
1432
+ },
1433
+ async getOrLinkConnectedAccount(provider, options) {
1434
+ const matchingAccounts = Result.orThrow(await app._currentUserConnectedAccountsCache.getOrWait([session], "write-only")).filter((a) => a.provider === provider);
1435
+ for (const account of matchingAccounts) if ((await account.getAccessToken({ scopes: options?.scopes })).status === "ok") return account;
1436
+ await this.linkConnectedAccount(provider, options);
1437
+ return await neverResolve();
1438
+ },
1439
+ useOrLinkConnectedAccount(provider, options) {
1440
+ const scopeString = options?.scopes?.join(" ") ?? "";
1441
+ return useAsyncCache(app._currentUserValidConnectedAccountForProviderCache, [
1442
+ session,
1443
+ provider,
1444
+ scopeString
1445
+ ], "user.useOrLinkConnectedAccount()");
1446
+ },
1447
+ async getTeam(teamId) {
1448
+ return (await this.listTeams()).find((t) => t.id === teamId) ?? null;
1449
+ },
1450
+ useTeam(teamId) {
1451
+ const teams = this.useTeams();
1452
+ return useMemo(() => {
1453
+ return teams.find((t) => t.id === teamId) ?? null;
1454
+ }, [teams, teamId]);
1455
+ },
1456
+ async listTeams() {
1457
+ return Result.orThrow(await app._currentUserTeamsCache.getOrWait([session], "write-only")).map((crud) => app._clientTeamFromCrud(crud, session));
1458
+ },
1459
+ useTeams() {
1460
+ const teams = useAsyncCache(app._currentUserTeamsCache, [session], "user.useTeams()");
1461
+ return useMemo(() => teams.map((crud) => app._clientTeamFromCrud(crud, session)), [teams]);
1462
+ },
1463
+ async createTeam(data) {
1464
+ const crud = await app._interface.createClientTeam(teamCreateOptionsToCrud(data, "me"), session);
1465
+ await app._currentUserTeamsCache.refresh([session]);
1466
+ await this.update({ selectedTeamId: crud.id });
1467
+ return app._clientTeamFromCrud(crud, session);
1468
+ },
1469
+ async leaveTeam(team) {
1470
+ await app._interface.leaveTeam(team.id, session);
1471
+ },
1472
+ async listTeamInvitations() {
1473
+ return Result.orThrow(await app._currentUserTeamInvitationsCache.getOrWait([session], "write-only")).map((crud) => app._clientReceivedTeamInvitationFromCrud(session, crud));
1474
+ },
1475
+ useTeamInvitations() {
1476
+ const invitations = useAsyncCache(app._currentUserTeamInvitationsCache, [session], "user.useTeamInvitations()");
1477
+ return useMemo(() => invitations.map((crud) => app._clientReceivedTeamInvitationFromCrud(session, crud)), [invitations]);
1478
+ },
1479
+ async listPermissions(scopeOrOptions, options) {
1480
+ if (scopeOrOptions && "id" in scopeOrOptions) {
1481
+ const scope = scopeOrOptions;
1482
+ const recursive = options?.recursive ?? true;
1483
+ return Result.orThrow(await app._currentUserPermissionsCache.getOrWait([
1484
+ session,
1485
+ scope.id,
1486
+ recursive
1487
+ ], "write-only")).map((crud) => app._clientPermissionFromCrud(crud));
1488
+ } else {
1489
+ const recursive = scopeOrOptions?.recursive ?? true;
1490
+ return Result.orThrow(await app._currentUserProjectPermissionsCache.getOrWait([session, recursive], "write-only")).map((crud) => app._clientPermissionFromCrud(crud));
1491
+ }
1492
+ },
1493
+ usePermissions(scopeOrOptions, options) {
1494
+ if (scopeOrOptions && "id" in scopeOrOptions) {
1495
+ const scope = scopeOrOptions;
1496
+ const recursive = options?.recursive ?? true;
1497
+ const permissions = useAsyncCache(app._currentUserPermissionsCache, [
1498
+ session,
1499
+ scope.id,
1500
+ recursive
1501
+ ], "user.usePermissions()");
1502
+ return useMemo(() => permissions.map((crud) => app._clientPermissionFromCrud(crud)), [permissions]);
1503
+ } else {
1504
+ const recursive = scopeOrOptions?.recursive ?? true;
1505
+ const permissions = useAsyncCache(app._currentUserProjectPermissionsCache, [session, recursive], "user.usePermissions()");
1506
+ return useMemo(() => permissions.map((crud) => app._clientPermissionFromCrud(crud)), [permissions]);
1507
+ }
1508
+ },
1509
+ usePermission(scopeOrPermissionId, permissionId) {
1510
+ if (scopeOrPermissionId && typeof scopeOrPermissionId !== "string") {
1511
+ const scope = scopeOrPermissionId;
1512
+ const permissions = this.usePermissions(scope);
1513
+ return useMemo(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);
1514
+ } else {
1515
+ const pid = scopeOrPermissionId;
1516
+ const permissions = this.usePermissions();
1517
+ return useMemo(() => permissions.find((p) => p.id === pid) ?? null, [permissions, pid]);
1518
+ }
1519
+ },
1520
+ async getPermission(scopeOrPermissionId, permissionId) {
1521
+ if (scopeOrPermissionId && typeof scopeOrPermissionId !== "string") {
1522
+ const scope = scopeOrPermissionId;
1523
+ return (await this.listPermissions(scope)).find((p) => p.id === permissionId) ?? null;
1524
+ } else {
1525
+ const pid = scopeOrPermissionId;
1526
+ return (await this.listPermissions()).find((p) => p.id === pid) ?? null;
1527
+ }
1528
+ },
1529
+ async hasPermission(scopeOrPermissionId, permissionId) {
1530
+ if (scopeOrPermissionId && typeof scopeOrPermissionId !== "string") {
1531
+ const scope = scopeOrPermissionId;
1532
+ return await this.getPermission(scope, permissionId) !== null;
1533
+ } else {
1534
+ const pid = scopeOrPermissionId;
1535
+ return await this.getPermission(pid) !== null;
1536
+ }
1537
+ },
1538
+ async update(update) {
1539
+ return await app._updateClientUser(update, session);
1540
+ },
1541
+ async sendVerificationEmail(options) {
1542
+ if (!crud.primary_email) throw new HexclaveAssertionError("User does not have a primary email");
1543
+ return await app._interface.sendVerificationEmail(crud.primary_email, options?.callbackUrl ?? constructRedirectUrl(app.urls.emailVerification, "callbackUrl"), session);
1544
+ },
1545
+ async updatePassword(options) {
1546
+ const result = await app._interface.updatePassword(options, session);
1547
+ await app._currentUserCache.refresh([session]);
1548
+ return result;
1549
+ },
1550
+ async setPassword(options) {
1551
+ const result = await app._interface.setPassword(options, session);
1552
+ await app._currentUserCache.refresh([session]);
1553
+ return result;
1554
+ },
1555
+ selectedTeam: crud.selected_team && this._clientTeamFromCrud(crud.selected_team, session),
1556
+ async getTeamProfile(team) {
1557
+ const result = Result.orThrow(await app._currentUserTeamProfileCache.getOrWait([session, team.id], "write-only"));
1558
+ return app._editableTeamProfileFromCrud(result, session);
1559
+ },
1560
+ useTeamProfile(team) {
1561
+ const result = useAsyncCache(app._currentUserTeamProfileCache, [session, team.id], "user.useTeamProfile()");
1562
+ return app._editableTeamProfileFromCrud(result, session);
1563
+ },
1564
+ async delete() {
1565
+ await app._interface.deleteCurrentUser(session);
1566
+ session.markInvalid();
1567
+ },
1568
+ async listContactChannels() {
1569
+ return Result.orThrow(await app._clientContactChannelsCache.getOrWait([session], "write-only")).map((crud) => app._clientContactChannelFromCrud(crud, session));
1570
+ },
1571
+ useContactChannels() {
1572
+ return useAsyncCache(app._clientContactChannelsCache, [session], "user.useContactChannels()").map((crud) => app._clientContactChannelFromCrud(crud, session));
1573
+ },
1574
+ async createContactChannel(data) {
1575
+ const crud = await app._interface.createClientContactChannel(contactChannelCreateOptionsToCrud("me", data), session);
1576
+ await app._clientContactChannelsCache.refresh([session]);
1577
+ return app._clientContactChannelFromCrud(crud, session);
1578
+ },
1579
+ useNotificationCategories() {
1580
+ return useAsyncCache(app._notificationCategoriesCache, [session], "user.useNotificationCategories()").map((crud) => app._clientNotificationCategoryFromCrud(crud, session));
1581
+ },
1582
+ async listNotificationCategories() {
1583
+ return Result.orThrow(await app._notificationCategoriesCache.getOrWait([session], "write-only")).map((crud) => app._clientNotificationCategoryFromCrud(crud, session));
1584
+ },
1585
+ useApiKeys() {
1586
+ return useAsyncCache(app._userApiKeysCache, [session], "user.useApiKeys()").map((crud) => app._clientApiKeyFromCrud(session, crud));
1587
+ },
1588
+ async listApiKeys() {
1589
+ return (await app._interface.listProjectApiKeys({ user_id: "me" }, session, "client")).map((crud) => app._clientApiKeyFromCrud(session, crud));
1590
+ },
1591
+ async createApiKey(options) {
1592
+ const result = await app._interface.createProjectApiKey(await apiKeyCreationOptionsToCrud("user", "me", options), session, "client");
1593
+ await app._userApiKeysCache.refresh([session]);
1594
+ return app._clientApiKeyFromCrud(session, result);
1595
+ },
1596
+ useOAuthProviders() {
1597
+ return useAsyncCache(app._currentUserOAuthProvidersCache, [session], "user.useOAuthProviders()").map((crud) => app._clientOAuthProviderFromCrud(crud, session));
1598
+ },
1599
+ async listOAuthProviders() {
1600
+ return Result.orThrow(await app._currentUserOAuthProvidersCache.getOrWait([session], "write-only")).map((crud) => app._clientOAuthProviderFromCrud(crud, session));
1601
+ },
1602
+ useOAuthProvider(id) {
1603
+ const providers = this.useOAuthProviders();
1604
+ return useMemo(() => providers.find((p) => p.id === id) ?? null, [providers, id]);
1605
+ },
1606
+ async getOAuthProvider(id) {
1607
+ return (await this.listOAuthProviders()).find((p) => p.id === id) ?? null;
1608
+ },
1609
+ async registerPasskey(options) {
1610
+ const hostname = (await app._getCurrentUrl())?.hostname;
1611
+ if (!hostname) throw new HexclaveAssertionError("hostname must be provided if the Stack App does not have a redirect method");
1612
+ const initiationResult = await app._interface.initiatePasskeyRegistration({}, session);
1613
+ if (initiationResult.status !== "ok") return Result.error(new KnownErrors.PasskeyRegistrationFailed("Failed to get initiation options for passkey registration"));
1614
+ const { options_json, code } = initiationResult.data;
1615
+ if (options_json.rp.id !== "THIS_VALUE_WILL_BE_REPLACED.example.com") throw new HexclaveAssertionError(`Expected returned RP ID from server to equal sentinel, but found ${options_json.rp.id}`);
1616
+ options_json.rp.id = hostname;
1617
+ let attResp;
1618
+ try {
1619
+ attResp = await startRegistration({ optionsJSON: options_json });
1620
+ } catch (error) {
1621
+ if (error instanceof WebAuthnError) return Result.error(new KnownErrors.PasskeyWebAuthnError(error.message, error.name));
1622
+ else {
1623
+ captureError("passkey-registration-failed", error);
1624
+ return Result.error(new KnownErrors.PasskeyRegistrationFailed("Failed to start passkey registration due to unknown error"));
1625
+ }
1626
+ }
1627
+ const registrationResult = await app._interface.registerPasskey({
1628
+ credential: attResp,
1629
+ code
1630
+ }, session);
1631
+ await app._refreshUser(session);
1632
+ return registrationResult;
1633
+ }
1634
+ };
1635
+ }
1636
+ _createInternalUserExtra(session) {
1637
+ const app = this;
1638
+ this._ensureInternalProject();
1639
+ return {
1640
+ createProject(newProject) {
1641
+ return app._createProject(session, newProject);
1642
+ },
1643
+ async transferProject(projectIdToTransfer, newTeamId) {
1644
+ await app._interface.transferProject(session, projectIdToTransfer, newTeamId);
1645
+ await app._refreshProject();
1646
+ },
1647
+ listOwnedProjects() {
1648
+ return app._listOwnedProjects(session);
1649
+ },
1650
+ useOwnedProjects() {
1651
+ return app._useOwnedProjects(session);
1652
+ }
1653
+ };
1654
+ }
1655
+ _createCustomer(userIdOrTeamId, type, session) {
1656
+ const app = this;
1657
+ const effectiveSession = session ?? app._interface.createSession({ refreshToken: null });
1658
+ const customerOptions = type === "user" ? { userId: userIdOrTeamId } : { teamId: userIdOrTeamId };
1659
+ return {
1660
+ async getBilling() {
1661
+ const response = Result.orThrow(await app._customerBillingCache.getOrWait([
1662
+ effectiveSession,
1663
+ type,
1664
+ userIdOrTeamId
1665
+ ], "write-only"));
1666
+ return app._customerBillingFromResponse(response);
1667
+ },
1668
+ useBilling() {
1669
+ const response = useAsyncCache(app._customerBillingCache, [
1670
+ effectiveSession,
1671
+ type,
1672
+ userIdOrTeamId
1673
+ ], "customer.useBilling()");
1674
+ return app._customerBillingFromResponse(response);
1675
+ },
1676
+ async createPaymentMethodSetupIntent() {
1677
+ const body = await app._interface.createCustomerPaymentMethodSetupIntent(type, userIdOrTeamId, effectiveSession);
1678
+ return {
1679
+ clientSecret: body.client_secret,
1680
+ stripeAccountId: body.stripe_account_id
1681
+ };
1682
+ },
1683
+ async setDefaultPaymentMethodFromSetupIntent(setupIntentId) {
1684
+ const body = await app._interface.setDefaultCustomerPaymentMethodFromSetupIntent(type, userIdOrTeamId, setupIntentId, effectiveSession);
1685
+ await app._customerBillingCache.refresh([
1686
+ effectiveSession,
1687
+ type,
1688
+ userIdOrTeamId
1689
+ ]);
1690
+ return body.default_payment_method;
1691
+ },
1692
+ async getItem(itemId) {
1693
+ return await app.getItem({
1694
+ itemId,
1695
+ ...customerOptions
1696
+ });
1697
+ },
1698
+ useItem(itemId) {
1699
+ return app.useItem({
1700
+ itemId,
1701
+ ...customerOptions
1702
+ });
1703
+ },
1704
+ async listProducts(options) {
1705
+ return await app.listProducts({
1706
+ ...options,
1707
+ ...customerOptions
1708
+ });
1709
+ },
1710
+ useProducts(options) {
1711
+ return app.useProducts({
1712
+ ...options,
1713
+ ...customerOptions
1714
+ });
1715
+ },
1716
+ async listInvoices(options) {
1717
+ return await app.listInvoices({
1718
+ ...options,
1719
+ ...customerOptions
1720
+ });
1721
+ },
1722
+ useInvoices(options) {
1723
+ return app.useInvoices({
1724
+ ...options,
1725
+ ...customerOptions
1726
+ });
1727
+ },
1728
+ async createCheckoutUrl(options) {
1729
+ return await app._interface.createCheckoutUrl(type, userIdOrTeamId, options.productId, effectiveSession, options.returnUrl, "client");
1730
+ },
1731
+ async switchSubscription(options) {
1732
+ await app._interface.switchSubscription({
1733
+ customer_type: type,
1734
+ customer_id: userIdOrTeamId,
1735
+ from_product_id: options.fromProductId,
1736
+ to_product_id: options.toProductId,
1737
+ price_id: options.priceId,
1738
+ quantity: options.quantity
1739
+ }, effectiveSession);
1740
+ await app._customerBillingCache.refresh([
1741
+ effectiveSession,
1742
+ type,
1743
+ userIdOrTeamId
1744
+ ]);
1745
+ if (type === "user") await app._userProductsCache.invalidateWhere(([cachedSession, userId]) => cachedSession === effectiveSession && userId === userIdOrTeamId);
1746
+ else await app._teamProductsCache.invalidateWhere(([cachedSession, teamId]) => cachedSession === effectiveSession && teamId === userIdOrTeamId);
1747
+ }
1748
+ };
1749
+ }
1750
+ async getItem(options) {
1751
+ const session = await this._getSession();
1752
+ let crud;
1753
+ if ("userId" in options) crud = Result.orThrow(await this._userItemCache.getOrWait([
1754
+ session,
1755
+ options.userId,
1756
+ options.itemId
1757
+ ], "write-only"));
1758
+ else if ("teamId" in options) crud = Result.orThrow(await this._teamItemCache.getOrWait([
1759
+ session,
1760
+ options.teamId,
1761
+ options.itemId
1762
+ ], "write-only"));
1763
+ else crud = Result.orThrow(await this._customItemCache.getOrWait([
1764
+ session,
1765
+ options.customCustomerId,
1766
+ options.itemId
1767
+ ], "write-only"));
1768
+ return this._clientItemFromCrud(crud);
1769
+ }
1770
+ useItem(options) {
1771
+ const session = this._useSession();
1772
+ const [cache, ownerId] = "userId" in options ? [this._userItemCache, options.userId] : "teamId" in options ? [this._teamItemCache, options.teamId] : [this._customItemCache, options.customCustomerId];
1773
+ const crud = useAsyncCache(cache, [
1774
+ session,
1775
+ ownerId,
1776
+ options.itemId
1777
+ ], "app.useItem()");
1778
+ return this._clientItemFromCrud(crud);
1779
+ }
1780
+ async listProducts(options) {
1781
+ const session = (await this.getUser())?._internalSession ?? await this._getSession();
1782
+ if ("userId" in options) {
1783
+ const response = Result.orThrow(await this._userProductsCache.getOrWait([
1784
+ session,
1785
+ options.userId,
1786
+ options.cursor ?? null,
1787
+ options.limit ?? null
1788
+ ], "write-only"));
1789
+ return this._customerProductsFromResponse(response);
1790
+ } else if ("teamId" in options) {
1791
+ const response = Result.orThrow(await this._teamProductsCache.getOrWait([
1792
+ session,
1793
+ options.teamId,
1794
+ options.cursor ?? null,
1795
+ options.limit ?? null
1796
+ ], "write-only"));
1797
+ return this._customerProductsFromResponse(response);
1798
+ }
1799
+ const response = Result.orThrow(await this._customProductsCache.getOrWait([
1800
+ session,
1801
+ options.customCustomerId,
1802
+ options.cursor ?? null,
1803
+ options.limit ?? null
1804
+ ], "write-only"));
1805
+ return this._customerProductsFromResponse(response);
1806
+ }
1807
+ async listInvoices(options) {
1808
+ const session = await this._getSession();
1809
+ if ("userId" in options) {
1810
+ const response = Result.orThrow(await this._userInvoicesCache.getOrWait([
1811
+ session,
1812
+ options.userId,
1813
+ options.cursor ?? null,
1814
+ options.limit ?? null
1815
+ ], "write-only"));
1816
+ return this._customerInvoicesFromResponse(response);
1817
+ }
1818
+ const response = Result.orThrow(await this._teamInvoicesCache.getOrWait([
1819
+ session,
1820
+ options.teamId,
1821
+ options.cursor ?? null,
1822
+ options.limit ?? null
1823
+ ], "write-only"));
1824
+ return this._customerInvoicesFromResponse(response);
1825
+ }
1826
+ async cancelSubscription(options) {
1827
+ const session = await this._getSession();
1828
+ const user = await this.getUser();
1829
+ if (!user) throw new KnownErrors.UserAuthenticationRequired();
1830
+ const customerType = "teamId" in options ? "team" : "user";
1831
+ const customerId = "teamId" in options ? options.teamId : user.id;
1832
+ await this._interface.cancelSubscription({
1833
+ customer_type: customerType,
1834
+ customer_id: customerId,
1835
+ product_id: options.productId,
1836
+ subscription_id: options.subscriptionId
1837
+ }, session);
1838
+ if (customerType === "user") await this._userProductsCache.invalidateWhere(([cachedSession, userId]) => cachedSession === session && userId === customerId);
1839
+ else await this._teamProductsCache.invalidateWhere(([cachedSession, teamId]) => cachedSession === session && teamId === customerId);
1840
+ }
1841
+ useProducts(options) {
1842
+ const session = this._useSession();
1843
+ const response = useAsyncCache("userId" in options ? this._userProductsCache : "teamId" in options ? this._teamProductsCache : this._customProductsCache, [
1844
+ session,
1845
+ "userId" in options ? options.userId : "teamId" in options ? options.teamId : options.customCustomerId,
1846
+ options.cursor ?? null,
1847
+ options.limit ?? null
1848
+ ], "clientApp.useProducts()");
1849
+ return this._customerProductsFromResponse(response);
1850
+ }
1851
+ useInvoices(options) {
1852
+ const session = this._useSession();
1853
+ const response = useAsyncCache("userId" in options ? this._userInvoicesCache : this._teamInvoicesCache, [
1854
+ session,
1855
+ "userId" in options ? options.userId : options.teamId,
1856
+ options.cursor ?? null,
1857
+ options.limit ?? null
1858
+ ], "clientApp.useInvoices()");
1859
+ return this._customerInvoicesFromResponse(response);
1860
+ }
1861
+ _currentUserFromCrud(crud, session) {
1862
+ return withUserDestructureGuard({
1863
+ ...this._createBaseUser(crud),
1864
+ ...this._createAuth(session),
1865
+ ...this._createUserExtraFromCurrent(crud, session),
1866
+ ...this._isInternalProject() ? this._createInternalUserExtra(session) : {},
1867
+ ...this._createCustomer(crud.id, "user", session)
1868
+ });
1869
+ }
1870
+ _clientSessionFromCrud(crud) {
1871
+ return {
1872
+ id: crud.id,
1873
+ userId: crud.user_id,
1874
+ createdAt: new Date(crud.created_at),
1875
+ isImpersonation: crud.is_impersonation,
1876
+ lastUsedAt: crud.last_used_at ? new Date(crud.last_used_at) : void 0,
1877
+ isCurrentSession: crud.is_current_session ?? false,
1878
+ geoInfo: crud.last_used_at_end_user_ip_info
1879
+ };
1880
+ }
1881
+ _getOwnedAdminApp(forProjectId, session) {
1882
+ if (!this._ownedAdminApps.has([session, forProjectId])) this._ownedAdminApps.set([session, forProjectId], new _StackClientAppImplIncomplete.LazyStackAdminAppImpl.value({
1883
+ baseUrl: this._interface.options.getBaseUrl(),
1884
+ projectId: forProjectId,
1885
+ tokenStore: null,
1886
+ projectOwnerSession: session,
1887
+ noAutomaticPrefetch: true
1888
+ }));
1889
+ return this._ownedAdminApps.get([session, forProjectId]);
1890
+ }
1891
+ get projectId() {
1892
+ return this._interface.projectId;
1893
+ }
1894
+ get version() {
1895
+ return clientVersion;
1896
+ }
1897
+ _getBotChallengeSiteKeys() {
1898
+ if (!isBrowserLike()) return null;
1899
+ const visibleSiteKey = envVars.NEXT_PUBLIC_STACK_BOT_CHALLENGE_SITE_KEY;
1900
+ if (!visibleSiteKey) {
1901
+ if (!this._botChallengeSiteKeysWarned) {
1902
+ this._botChallengeSiteKeysWarned = true;
1903
+ console.warn("[stack-auth] NEXT_PUBLIC_STACK_BOT_CHALLENGE_SITE_KEY is not set — bot challenge fraud protection is disabled. Set the env variable to enable it.");
1904
+ }
1905
+ return null;
1906
+ }
1907
+ return {
1908
+ visibleSiteKey,
1909
+ invisibleSiteKey: envVars.NEXT_PUBLIC_STACK_BOT_CHALLENGE_INVISIBLE_SITE_KEY ?? visibleSiteKey
1910
+ };
1911
+ }
1912
+ _getBotChallengeFlowFailure(error) {
1913
+ if (error instanceof BotChallengeUserCancelledError) return {
1914
+ type: "cancelled",
1915
+ knownError: new KnownErrors.BotChallengeFailed("Bot challenge cancelled by user")
1916
+ };
1917
+ if (error instanceof BotChallengeExecutionFailedError) return {
1918
+ type: "failed",
1919
+ knownError: new KnownErrors.BotChallengeFailed(error.message)
1920
+ };
1921
+ return null;
1922
+ }
1923
+ _normalizeBotChallengeResult(result) {
1924
+ if (result.status === "ok") return result;
1925
+ if (KnownErrors.BotChallengeRequired.isInstance(result.error)) {
1926
+ captureError("bot-challenge-unexpected-after-flow", result.error);
1927
+ return Result.error(new KnownErrors.BotChallengeFailed("Unexpected bot challenge after flow completion"));
1928
+ }
1929
+ return Result.error(result.error);
1930
+ }
1931
+ _toInterfaceBotChallengeInput(challenge) {
1932
+ if (challenge.unavailable) return { phase: "visible" };
1933
+ return {
1934
+ token: challenge.token,
1935
+ phase: challenge.phase
1936
+ };
1937
+ }
1938
+ async _executeResultWithBotChallengeFlow(options) {
1939
+ const siteKeys = this._getBotChallengeSiteKeys();
1940
+ let result;
1941
+ try {
1942
+ if (siteKeys) result = await withBotChallengeFlow({
1943
+ ...siteKeys,
1944
+ action: options.action,
1945
+ execute: options.execute,
1946
+ isChallengeRequired: (flowResult) => {
1947
+ return flowResult.status === "error" && KnownErrors.BotChallengeRequired.isInstance(flowResult.error);
1948
+ }
1949
+ });
1950
+ else result = await options.execute({});
1951
+ } catch (e) {
1952
+ const flowFailure = this._getBotChallengeFlowFailure(e);
1953
+ if (flowFailure) return Result.error(flowFailure.knownError);
1954
+ throw e;
1955
+ }
1956
+ return this._normalizeBotChallengeResult(result);
1957
+ }
1958
+ async _isTrusted(url) {
1959
+ if (isRelative(url)) return true;
1960
+ const parsedUrl = createUrlIfValid(url);
1961
+ if (parsedUrl == null) return false;
1962
+ if (typeof window !== "undefined" && window.location.origin === parsedUrl.origin) return true;
1963
+ if (isHostedHandlerUrlForProject({
1964
+ url,
1965
+ projectId: this.projectId
1966
+ })) return true;
1967
+ const trustedRedirectConfig = await this._getTrustedRedirectConfig();
1968
+ return validateRedirectUrl(parsedUrl, {
1969
+ allowLocalhost: trustedRedirectConfig.allowLocalhost,
1970
+ trustedDomains: trustedRedirectConfig.trustedDomains
1971
+ });
1972
+ }
1973
+ get urls() {
1974
+ return getUrls(this._urlOptions, { projectId: this.projectId });
1975
+ }
1976
+ _prefetchCrossDomainHandoffParamsIfNeeded() {
1977
+ const canWriteOauthVerifierCookie = this._tokenStoreInit === "cookie" || this._tokenStoreInit === "nextjs-cookie";
1978
+ if (!isBrowserLike() || !canWriteOauthVerifierCookie || this._isPrefetchingCrossDomainHandoffParams || this._getFreshPrefetchedCrossDomainHandoffParams() != null) return;
1979
+ this._isPrefetchingCrossDomainHandoffParams = true;
1980
+ runAsynchronously(async () => {
1981
+ try {
1982
+ if (!isBrowserLike()) return;
1983
+ const { state, codeChallenge } = await saveVerifierAndState();
1984
+ this._prefetchedCrossDomainHandoffParams = {
1985
+ state,
1986
+ codeChallenge
1987
+ };
1988
+ this._prefetchedCrossDomainHandoffParamsFetchedAt = performance.now();
1989
+ } finally {
1990
+ this._isPrefetchingCrossDomainHandoffParams = false;
1991
+ }
1992
+ });
1993
+ }
1994
+ _getCrossDomainHandoffParamsForUrlsGetter(currentUrl) {
1995
+ const fromQuery = getCrossDomainHandoffParamsFromCurrentUrl(currentUrl);
1996
+ if (fromQuery != null) return fromQuery;
1997
+ const prefetched = this._getFreshPrefetchedCrossDomainHandoffParams();
1998
+ if (prefetched != null) return prefetched;
1999
+ this._prefetchCrossDomainHandoffParamsIfNeeded();
2000
+ return null;
2001
+ }
2002
+ async _getCrossDomainHandoffParamsForRedirect(currentUrl) {
2003
+ const fromQuery = getCrossDomainHandoffParamsFromCurrentUrl(currentUrl);
2004
+ if (fromQuery != null) return fromQuery;
2005
+ const prefetched = this._getFreshPrefetchedCrossDomainHandoffParams();
2006
+ if (prefetched != null) return prefetched;
2007
+ const { state, codeChallenge } = await saveVerifierAndState();
2008
+ this._prefetchedCrossDomainHandoffParams = {
2009
+ state,
2010
+ codeChallenge
2011
+ };
2012
+ this._prefetchedCrossDomainHandoffParamsFetchedAt = performance.now();
2013
+ return {
2014
+ state,
2015
+ codeChallenge
2016
+ };
2017
+ }
2018
+ _getLocalOAuthCallbackHandlerUrl() {
2019
+ if (this._isOAuthCallbackUrlHosted()) return this._getOAuthCallbackRedirectUri();
2020
+ return resolveHandlerUrls({
2021
+ urls: {
2022
+ ...this._urlOptions,
2023
+ default: { type: "handler-component" },
2024
+ oauthCallback: { type: "handler-component" }
2025
+ },
2026
+ projectId: this.projectId
2027
+ }).oauthCallback;
2028
+ }
2029
+ async _createCrossDomainAuthRedirectUrl(options) {
2030
+ const session = await this._getSession(options.overrideTokenStoreInit, { awaitPendingAuthResolutions: options.awaitPendingAuthResolutions });
2031
+ const response = await this._interface.sendClientRequest("/auth/oauth/cross-domain/authorize", {
2032
+ method: "POST",
2033
+ headers: { "Content-Type": "application/json" },
2034
+ body: JSON.stringify({
2035
+ redirect_uri: options.redirectUri,
2036
+ state: options.state,
2037
+ code_challenge: options.codeChallenge,
2038
+ code_challenge_method: "S256",
2039
+ after_callback_redirect_url: options.afterCallbackRedirectUrl
2040
+ })
2041
+ }, session);
2042
+ if (!response.ok) {
2043
+ const responseBody = await response.text();
2044
+ throw new HexclaveAssertionError(`Cross-domain authorization endpoint failed: ${response.status} ${responseBody}`);
2045
+ }
2046
+ const result = await response.json();
2047
+ if (!("redirect_url" in result) || typeof result.redirect_url !== "string") throw new HexclaveAssertionError("Cross-domain authorization endpoint returned an invalid payload", { result });
2048
+ return result.redirect_url;
2049
+ }
2050
+ _getFreshPrefetchedCrossDomainHandoffParams() {
2051
+ if (this._prefetchedCrossDomainHandoffParams == null) return null;
2052
+ if (performance.now() - this._prefetchedCrossDomainHandoffParamsFetchedAt > prefetchedCrossDomainHandoffTtlMs) {
2053
+ this._prefetchedCrossDomainHandoffParams = null;
2054
+ this._prefetchedCrossDomainHandoffParamsFetchedAt = 0;
2055
+ return null;
2056
+ }
2057
+ return this._prefetchedCrossDomainHandoffParams;
2058
+ }
2059
+ async _getCurrentUrl() {
2060
+ if (this._redirectMethod === "none") return null;
2061
+ return new URL(window.location.href);
2062
+ }
2063
+ async _redirectTo(options) {
2064
+ if (this._redirectMethod === "none") return;
2065
+ else if (isReactServer && this._redirectMethod === "nextjs") NextNavigation.redirect(options.url.toString(), options.replace ? NextNavigation.RedirectType.replace : NextNavigation.RedirectType.push);
2066
+ else if (typeof this._redirectMethod === "object" && this._redirectMethod.navigate) this._redirectMethod.navigate(options.url.toString());
2067
+ else if (options.replace) window.location.replace(options.url);
2068
+ else window.location.assign(options.url);
2069
+ await wait(2e3);
2070
+ }
2071
+ useNavigate() {
2072
+ if (typeof this._redirectMethod === "object") return this._redirectMethod.useNavigate();
2073
+ else if (this._redirectMethod === "window") return (to) => window.location.assign(to);
2074
+ else if (this._redirectMethod === "nextjs") {
2075
+ const router = NextNavigation.useRouter();
2076
+ return (to) => router.push(to);
2077
+ } else return (to) => {};
2078
+ }
2079
+ async _redirectIfTrusted(url, options) {
2080
+ if (!await this._isTrusted(url)) throw new Error(`Redirect URL ${url} is not trusted; should be relative.`);
2081
+ return await this._redirectTo({
2082
+ url,
2083
+ ...options
2084
+ });
2085
+ }
2086
+ async _redirectToHandler(handlerName, options, internalOptions) {
2087
+ const rawHandlerUrl = getUrls(this._urlOptions, { projectId: this.projectId })[handlerName];
2088
+ if (!rawHandlerUrl) throw new Error(`No URL for handler name ${handlerName}`);
2089
+ const currentUrl = isReactServer || typeof window === "undefined" ? null : new URL(window.location.href);
2090
+ const plan = await planRedirectToHandler({
2091
+ handlerName,
2092
+ rawHandlerUrl,
2093
+ noRedirectBack: options?.noRedirectBack === true,
2094
+ currentUrl,
2095
+ localOAuthCallbackUrl: this._getLocalOAuthCallbackHandlerUrl(),
2096
+ getCrossDomainHandoffParams: async (href) => await this._getCrossDomainHandoffParamsForRedirect(href)
2097
+ });
2098
+ if (plan.type === "cross-domain-authorize") {
2099
+ const crossDomainRedirectUrl = await this._createCrossDomainAuthRedirectUrl({
2100
+ redirectUri: plan.redirectUri,
2101
+ state: plan.state,
2102
+ codeChallenge: plan.codeChallenge,
2103
+ afterCallbackRedirectUrl: plan.afterCallbackRedirectUrl,
2104
+ awaitPendingAuthResolutions: internalOptions?.awaitPendingAuthResolutions,
2105
+ overrideTokenStoreInit: internalOptions?.overrideTokenStoreInit
2106
+ });
2107
+ await this._redirectTo({
2108
+ url: crossDomainRedirectUrl,
2109
+ ...options
2110
+ });
2111
+ return;
2112
+ }
2113
+ const redirectUrl = currentUrl != null && handlerName !== "signOut" && handlerName !== "afterSignOut" && handlerName !== "oauthCallback" ? await this._addNestedCrossDomainAuthParamsToRedirectUrl({
2114
+ url: plan.url,
2115
+ currentUrl,
2116
+ awaitPendingAuthResolutions: internalOptions?.awaitPendingAuthResolutions,
2117
+ overrideTokenStoreInit: internalOptions?.overrideTokenStoreInit
2118
+ }) : plan.url;
2119
+ await this._redirectIfTrusted(redirectUrl, options);
2120
+ }
2121
+ _redirectToHandlerDuringRender(handlerName, options) {
2122
+ return false;
2123
+ }
2124
+ async redirectToSignIn(options) {
2125
+ return await this._redirectToHandler("signIn", options);
2126
+ }
2127
+ async redirectToSignUp(options) {
2128
+ return await this._redirectToHandler("signUp", options);
2129
+ }
2130
+ async redirectToSignOut(options) {
2131
+ return await this._redirectToHandler("signOut", options);
2132
+ }
2133
+ async redirectToEmailVerification(options) {
2134
+ return await this._redirectToHandler("emailVerification", options);
2135
+ }
2136
+ async redirectToPasswordReset(options) {
2137
+ return await this._redirectToHandler("passwordReset", options);
2138
+ }
2139
+ async redirectToForgotPassword(options) {
2140
+ return await this._redirectToHandler("forgotPassword", options);
2141
+ }
2142
+ async redirectToHome(options) {
2143
+ return await this._redirectToHandler("home", options);
2144
+ }
2145
+ async redirectToOAuthCallback(options) {
2146
+ return await this._redirectToHandler("oauthCallback", options);
2147
+ }
2148
+ async redirectToMagicLinkCallback(options) {
2149
+ return await this._redirectToHandler("magicLinkCallback", options);
2150
+ }
2151
+ async redirectToAfterSignIn(options) {
2152
+ return await this._redirectToHandler("afterSignIn", options);
2153
+ }
2154
+ async redirectToAfterSignUp(options) {
2155
+ return await this._redirectToHandler("afterSignUp", options);
2156
+ }
2157
+ async redirectToOnboarding(options) {
2158
+ return await this._redirectToHandler("onboarding", options);
2159
+ }
2160
+ async redirectToAfterSignOut(options) {
2161
+ return await this._redirectToHandler("afterSignOut", options);
2162
+ }
2163
+ async redirectToAccountSettings(options) {
2164
+ return await this._redirectToHandler("accountSettings", options);
2165
+ }
2166
+ async redirectToError(options) {
2167
+ return await this._redirectToHandler("error", options);
2168
+ }
2169
+ async redirectToTeamInvitation(options) {
2170
+ return await this._redirectToHandler("teamInvitation", options);
2171
+ }
2172
+ async redirectToCliAuthConfirm(options) {
2173
+ return await this._redirectToHandler("cliAuthConfirm", options);
2174
+ }
2175
+ async redirectToMfa(options) {
2176
+ return await this._redirectToHandler("mfa", options);
2177
+ }
2178
+ async sendForgotPasswordEmail(email, options) {
2179
+ return await this._interface.sendForgotPasswordEmail(email, options?.callbackUrl ?? constructRedirectUrl(this.urls.passwordReset, "callbackUrl"));
2180
+ }
2181
+ async sendMagicLinkEmail(email, options) {
2182
+ const callbackUrl = options?.callbackUrl ?? constructRedirectUrl(this.urls.magicLinkCallback, "callbackUrl");
2183
+ return await this._executeResultWithBotChallengeFlow({
2184
+ action: "send_magic_link_email",
2185
+ execute: async (challenge) => {
2186
+ return await this._interface.sendMagicLinkEmail(email, callbackUrl, this._toInterfaceBotChallengeInput(challenge));
2187
+ }
2188
+ });
2189
+ }
2190
+ async resetPassword(options) {
2191
+ return await this._interface.resetPassword(options);
2192
+ }
2193
+ async verifyPasswordResetCode(code) {
2194
+ return await this._interface.verifyPasswordResetCode(code);
2195
+ }
2196
+ async verifyTeamInvitationCode(code) {
2197
+ return await this._interface.acceptTeamInvitation({
2198
+ type: "check",
2199
+ code,
2200
+ session: await this._getSession()
2201
+ });
2202
+ }
2203
+ async acceptTeamInvitation(code) {
2204
+ const result = await this._interface.acceptTeamInvitation({
2205
+ type: "use",
2206
+ code,
2207
+ session: await this._getSession()
2208
+ });
2209
+ if (result.status === "ok") return Result.ok(void 0);
2210
+ else return Result.error(result.error);
2211
+ }
2212
+ async getTeamInvitationDetails(code) {
2213
+ const result = await this._interface.acceptTeamInvitation({
2214
+ type: "details",
2215
+ code,
2216
+ session: await this._getSession()
2217
+ });
2218
+ if (result.status === "ok") return Result.ok({ teamDisplayName: result.data.team_display_name });
2219
+ else return Result.error(result.error);
2220
+ }
2221
+ async verifyEmail(code) {
2222
+ const result = await this._interface.verifyEmail(code);
2223
+ await this._currentUserCache.refresh([await this._getSession()]);
2224
+ await this._clientContactChannelsCache.refresh([await this._getSession()]);
2225
+ return result;
2226
+ }
2227
+ async getUser(options) {
2228
+ if (options?.or === "anonymous" && options.includeRestricted === false) throw new Error("Cannot use { or: 'anonymous' } with { includeRestricted: false }. Anonymous users implicitly include restricted users.");
2229
+ this._ensurePersistentTokenStore(options?.tokenStore);
2230
+ const session = await this._getSession(options?.tokenStore);
2231
+ let crud = Result.orThrow(await this._currentUserCache.getOrWait([session], "write-only"));
2232
+ const includeAnonymous = options?.or === "anonymous" || options?.or === "anonymous-if-exists[deprecated]";
2233
+ const includeRestricted = options?.includeRestricted === true || includeAnonymous;
2234
+ if (crud === null || crud.is_anonymous && !includeAnonymous || crud.is_restricted && !includeRestricted) switch (options?.or) {
2235
+ case "redirect":
2236
+ if (!crud?.is_anonymous && crud?.is_restricted) await this.redirectToOnboarding({ replace: true });
2237
+ else await this.redirectToSignIn({ replace: true });
2238
+ break;
2239
+ case "throw": throw new Error("User is not signed in but getUser was called with { or: 'throw' }");
2240
+ case "anonymous": {
2241
+ const tokens = await this._signUpAnonymously();
2242
+ return await this.getUser({
2243
+ tokenStore: tokens,
2244
+ or: "anonymous-if-exists[deprecated]",
2245
+ includeRestricted: true
2246
+ }) ?? throwErr("Something went wrong while signing up anonymously");
2247
+ }
2248
+ case void 0:
2249
+ case "anonymous-if-exists[deprecated]":
2250
+ case "return-null": return null;
2251
+ }
2252
+ return crud && this._currentUserFromCrud(crud, session);
2253
+ }
2254
+ useUser(options) {
2255
+ if (options?.or === "anonymous" && options.includeRestricted === false) throw new Error("Cannot use { or: 'anonymous' } with { includeRestricted: false }. Anonymous users implicitly include restricted users.");
2256
+ this._ensurePersistentTokenStore(options?.tokenStore);
2257
+ const session = this._useSession(options?.tokenStore);
2258
+ let crud = useAsyncCache(this._currentUserCache, [session], "clientApp.useUser()");
2259
+ const includeAnonymous = options?.or === "anonymous" || options?.or === "anonymous-if-exists[deprecated]";
2260
+ const includeRestricted = options?.includeRestricted === true || includeAnonymous;
2261
+ if (crud === null || crud.is_anonymous && !includeAnonymous || crud.is_restricted && !includeRestricted) switch (options?.or) {
2262
+ case "redirect":
2263
+ if (!crud?.is_anonymous && crud?.is_restricted) {
2264
+ if (!this._redirectToHandlerDuringRender("onboarding", { replace: true })) runAsynchronously(this.redirectToOnboarding({ replace: true }));
2265
+ } else if (!this._redirectToHandlerDuringRender("signIn", { replace: true })) runAsynchronously(this.redirectToSignIn({ replace: true }));
2266
+ suspend();
2267
+ throw new HexclaveAssertionError("suspend should never return");
2268
+ case "throw": throw new Error("User is not signed in but useUser was called with { or: 'throw' }");
2269
+ case "anonymous":
2270
+ runAsynchronously(async () => {
2271
+ await this._signUpAnonymously();
2272
+ if (typeof window !== "undefined") window.location.reload();
2273
+ });
2274
+ suspend();
2275
+ throw new HexclaveAssertionError("suspend should never return");
2276
+ case void 0:
2277
+ case "anonymous-if-exists[deprecated]":
2278
+ case "return-null":
2279
+ crud = null;
2280
+ break;
2281
+ }
2282
+ return useMemo(() => {
2283
+ return crud && this._currentUserFromCrud(crud, session);
2284
+ }, [
2285
+ crud,
2286
+ session,
2287
+ options?.or
2288
+ ]);
2289
+ }
2290
+ _getTokenPartialUserFromSession(session, options) {
2291
+ const accessToken = session.getAccessTokenIfNotExpiredYet(0, null);
2292
+ if (!accessToken) return null;
2293
+ const isAnonymous = accessToken.payload.is_anonymous;
2294
+ if (isAnonymous && options.or !== "anonymous-if-exists") return null;
2295
+ return {
2296
+ id: accessToken.payload.sub,
2297
+ primaryEmail: accessToken.payload.email,
2298
+ displayName: accessToken.payload.name,
2299
+ primaryEmailVerified: accessToken.payload.email_verified,
2300
+ isAnonymous,
2301
+ isMultiFactorRequired: accessToken.payload.requires_totp_mfa,
2302
+ isRestricted: accessToken.payload.is_restricted,
2303
+ restrictedReason: accessToken.payload.restricted_reason
2304
+ };
2305
+ }
2306
+ async _getPartialUserFromConvex(ctx) {
2307
+ const auth = await ctx.auth.getUserIdentity();
2308
+ if (!auth) return null;
2309
+ return {
2310
+ id: auth.subject,
2311
+ displayName: auth.name ?? null,
2312
+ primaryEmail: auth.email ?? null,
2313
+ primaryEmailVerified: auth.email_verified,
2314
+ isAnonymous: auth.is_anonymous,
2315
+ isMultiFactorRequired: auth.requires_totp_mfa,
2316
+ isRestricted: auth.is_restricted,
2317
+ restrictedReason: auth.restricted_reason ?? null
2318
+ };
2319
+ }
2320
+ async getPartialUser(options) {
2321
+ switch (options.from) {
2322
+ case "token": {
2323
+ this._ensurePersistentTokenStore(options.tokenStore ?? this._tokenStoreInit);
2324
+ const session = await this._getSession(options.tokenStore);
2325
+ return this._getTokenPartialUserFromSession(session, options);
2326
+ }
2327
+ case "convex": return await this._getPartialUserFromConvex(options.ctx);
2328
+ default: throw new Error(`Invalid 'from' option: ${options.from}`);
2329
+ }
2330
+ }
2331
+ usePartialUser(options) {
2332
+ switch (options.from) {
2333
+ case "token": {
2334
+ this._ensurePersistentTokenStore(options.tokenStore ?? this._tokenStoreInit);
2335
+ const session = this._useSession(options.tokenStore);
2336
+ return this._getTokenPartialUserFromSession(session, options);
2337
+ }
2338
+ case "convex": return useAsyncCache(this._convexPartialUserCache, [options.ctx], "clientApp.usePartialUser()");
2339
+ default: throw new Error(`Invalid 'from' option: ${options.from}`);
2340
+ }
2341
+ }
2342
+ getConvexClientAuth(options) {
2343
+ return async (args) => {
2344
+ const session = await this._getSession(options.tokenStore ?? this._tokenStoreInit);
2345
+ if (!args.forceRefreshToken) return (await session.getOrFetchLikelyValidTokens(2e4, 75e3))?.accessToken.token ?? null;
2346
+ return (await session.fetchNewTokens())?.accessToken.token ?? null;
2347
+ };
2348
+ }
2349
+ async getConvexHttpClientAuth(options) {
2350
+ return (await (await this._getSession(options.tokenStore)).getOrFetchLikelyValidTokens(2e4, 75e3))?.accessToken.token ?? "";
2351
+ }
2352
+ async _updateClientUser(update, session) {
2353
+ const res = await this._interface.updateClientUser(userUpdateOptionsToCrud(update), session);
2354
+ await this._refreshUser(session);
2355
+ return res;
2356
+ }
2357
+ async signInWithOAuth(provider, options) {
2358
+ if (typeof window === "undefined") throw new Error("signInWithOAuth can currently only be called in a browser environment");
2359
+ this._ensurePersistentTokenStore();
2360
+ const session = await this._getSession();
2361
+ const currentUrl = new URL(window.location.href);
2362
+ const afterCallbackRedirectUrl = options?.returnTo != null ? constructRedirectUrl(options.returnTo, "returnTo") : currentUrl.searchParams.has("after_auth_return_to") ? currentUrl.toString() : void 0;
2363
+ const siteKeys = this._getBotChallengeSiteKeys();
2364
+ const { codeChallenge, state } = await saveVerifierAndState();
2365
+ const executeOAuth = async (challenge) => {
2366
+ return await this._interface.authorizeOAuth({
2367
+ provider,
2368
+ redirectUrl: constructRedirectUrl(this._getOAuthCallbackRedirectUri(), "redirectUrl"),
2369
+ errorRedirectUrl: constructRedirectUrl(this.urls.error, "errorRedirectUrl"),
2370
+ afterCallbackRedirectUrl,
2371
+ type: "authenticate",
2372
+ providerScope: this._oauthScopesOnSignIn[provider]?.join(" "),
2373
+ codeChallenge,
2374
+ state,
2375
+ botChallenge: this._toInterfaceBotChallengeInput(challenge),
2376
+ session
2377
+ });
2378
+ };
2379
+ let authorizeResult;
2380
+ try {
2381
+ if (siteKeys) authorizeResult = await withBotChallengeFlow({
2382
+ ...siteKeys,
2383
+ action: "oauth_authenticate",
2384
+ execute: executeOAuth,
2385
+ isChallengeRequired: (result) => {
2386
+ return result.status === "error" && KnownErrors.BotChallengeRequired.isInstance(result.error);
2387
+ }
2388
+ });
2389
+ else authorizeResult = await executeOAuth({});
2390
+ } catch (e) {
2391
+ const flowFailure = this._getBotChallengeFlowFailure(e);
2392
+ if (flowFailure?.type === "cancelled") return;
2393
+ if (flowFailure?.type === "failed") throw flowFailure.knownError;
2394
+ throw e;
2395
+ }
2396
+ const location = Result.orThrow(authorizeResult);
2397
+ await this._redirectTo({ url: location });
2398
+ await neverResolve();
2399
+ }
2400
+ /**
2401
+ * Handles MFA verification by redirecting to the OTP page
2402
+ */
2403
+ async _experimentalMfa(error, session) {
2404
+ if (typeof window !== "undefined") window.sessionStorage.setItem("hexclave_mfa_attempt_code", error.details?.attempt_code ?? throwErr("attempt code missing"));
2405
+ await this.redirectToMfa();
2406
+ throw new HexclaveAssertionError("we should have redirected in redirectToMfa()");
2407
+ }
2408
+ /**
2409
+ * @deprecated
2410
+ * TODO remove
2411
+ */
2412
+ async _catchMfaRequiredError(callback) {
2413
+ try {
2414
+ return await callback();
2415
+ } catch (e) {
2416
+ if (KnownErrors.MultiFactorAuthenticationRequired.isInstance(e)) return Result.ok(await this._experimentalMfa(e, await this._getSession(void 0, { awaitPendingAuthResolutions: false })));
2417
+ throw e;
2418
+ }
2419
+ }
2420
+ async signInWithCredential(options) {
2421
+ this._ensurePersistentTokenStore();
2422
+ const session = await this._getSession();
2423
+ let result;
2424
+ try {
2425
+ result = await this._catchMfaRequiredError(async () => {
2426
+ return await this._interface.signInWithCredential(options.email, options.password, session);
2427
+ });
2428
+ } catch (e) {
2429
+ if (KnownErrors.InvalidTotpCode.isInstance(e)) return Result.error(e);
2430
+ throw e;
2431
+ }
2432
+ if (result.status === "ok") {
2433
+ await this._signInToAccountWithTokens(result.data);
2434
+ if (!options.noRedirect) await this._redirectToHandler("afterSignIn", { replace: true }, { overrideTokenStoreInit: this._getTokenStoreInitForFreshTokens(result.data) });
2435
+ return Result.ok(void 0);
2436
+ } else return Result.error(result.error);
2437
+ }
2438
+ async signUpWithCredential(options) {
2439
+ if (options.noVerificationCallback && options.verificationCallbackUrl) throw new HexclaveAssertionError("verificationCallbackUrl is not allowed when noVerificationCallback is true");
2440
+ this._ensurePersistentTokenStore();
2441
+ const session = await this._getSession();
2442
+ const emailVerificationRedirectUrl = options.noVerificationCallback ? void 0 : options.verificationCallbackUrl ?? constructRedirectUrl(this.urls.emailVerification, "verificationCallbackUrl");
2443
+ const executeSignUp = async (challenge) => {
2444
+ let result = await this._interface.signUpWithCredential(options.email, options.password, emailVerificationRedirectUrl, session, this._toInterfaceBotChallengeInput(challenge));
2445
+ if (result.status === "error" && result.error instanceof KnownErrors.RedirectUrlNotWhitelisted && emailVerificationRedirectUrl !== void 0) {
2446
+ if (!options.verificationCallbackUrl) {
2447
+ captureError("signup-verification-url-not-whitelisted", new HexclaveAssertionError("The auto-constructed verification callback URL is not whitelisted; proceeding without email verification", { emailVerificationRedirectUrl }));
2448
+ result = await this._interface.signUpWithCredential(options.email, options.password, void 0, session, this._toInterfaceBotChallengeInput(challenge));
2449
+ }
2450
+ }
2451
+ return result;
2452
+ };
2453
+ let result;
2454
+ result = await this._executeResultWithBotChallengeFlow({
2455
+ action: "sign_up_with_credential",
2456
+ execute: executeSignUp
2457
+ });
2458
+ if (result.status === "ok") {
2459
+ await this._signInToAccountWithTokens(result.data);
2460
+ if (!options.noRedirect) await this._redirectToHandler("afterSignUp", { replace: true }, { overrideTokenStoreInit: this._getTokenStoreInitForFreshTokens(result.data) });
2461
+ return Result.ok(void 0);
2462
+ } else return Result.error(result.error);
2463
+ }
2464
+ async _signUpAnonymously() {
2465
+ this._ensurePersistentTokenStore();
2466
+ if (!this._anonymousSignUpInProgress) this._anonymousSignUpInProgress = (async () => {
2467
+ this._ensurePersistentTokenStore();
2468
+ const session = await this._getSession();
2469
+ const result = await this._interface.signUpAnonymously(session);
2470
+ if (result.status === "ok") await this._signInToAccountWithTokens(result.data);
2471
+ else throw new HexclaveAssertionError("signUpAnonymously() should never return an error");
2472
+ this._anonymousSignUpInProgress = null;
2473
+ return result.data;
2474
+ })();
2475
+ return await this._anonymousSignUpInProgress;
2476
+ }
2477
+ async signInWithMagicLink(code, options) {
2478
+ this._ensurePersistentTokenStore();
2479
+ const session = await this._getSession();
2480
+ let result;
2481
+ try {
2482
+ result = await this._catchMfaRequiredError(async () => {
2483
+ return await this._interface.signInWithMagicLink(code, session);
2484
+ });
2485
+ } catch (e) {
2486
+ if (KnownErrors.InvalidTotpCode.isInstance(e)) return Result.error(e);
2487
+ throw e;
2488
+ }
2489
+ if (result.status === "ok") {
2490
+ await this._signInToAccountWithTokens(result.data);
2491
+ if (!options?.noRedirect) if (result.data.newUser) await this._redirectToHandler("afterSignUp", { replace: true }, {
2492
+ awaitPendingAuthResolutions: false,
2493
+ overrideTokenStoreInit: this._getTokenStoreInitForFreshTokens(result.data)
2494
+ });
2495
+ else await this._redirectToHandler("afterSignIn", { replace: true }, {
2496
+ awaitPendingAuthResolutions: false,
2497
+ overrideTokenStoreInit: this._getTokenStoreInitForFreshTokens(result.data)
2498
+ });
2499
+ return Result.ok(void 0);
2500
+ } else return Result.error(result.error);
2501
+ }
2502
+ /**
2503
+ * Initiates a CLI authentication process that allows a command line application
2504
+ * to get a refresh token for a user's account.
2505
+ *
2506
+ * This process works as follows:
2507
+ * 1. The CLI app calls this method, which initiates the auth process with the server
2508
+ * 2. The server returns a polling code and a login code
2509
+ * 3. The CLI app opens a browser window to the appUrl with the login code as a parameter
2510
+ * 4. The user logs in through the browser and confirms the authorization
2511
+ * 5. The CLI app polls for the refresh token using the polling code
2512
+ *
2513
+ * @param options Options for the CLI login
2514
+ * @param options.appUrl The URL of the app that will handle the CLI auth confirmation
2515
+ * @param options.expiresInMillis Optional duration in milliseconds before the auth attempt expires (default: 2 hours)
2516
+ * @param options.maxAttempts Optional maximum number of polling attempts (default: Infinity)
2517
+ * @param options.waitTimeMillis Optional time to wait between polling attempts (default: 2 seconds)
2518
+ * @param options.promptLink Optional function to call with the login URL and code to prompt the user to open the browser
2519
+ * @param options.anonRefreshToken Optional anonymous refresh token from the CLI's token store to associate with this login attempt
2520
+ * @returns Result containing either the refresh token or an error
2521
+ */
2522
+ async promptCliLogin(options) {
2523
+ const response = await this._interface.sendClientRequest("/auth/cli", {
2524
+ method: "POST",
2525
+ headers: { "Content-Type": "application/json" },
2526
+ body: JSON.stringify({
2527
+ expires_in_millis: options.expiresInMillis,
2528
+ ...options.anonRefreshToken != null ? { anon_refresh_token: options.anonRefreshToken } : {}
2529
+ })
2530
+ }, null);
2531
+ if (!response.ok) return Result.error(new KnownErrors.CliAuthError(`Failed to initiate CLI auth: ${response.status} ${await response.text()}`));
2532
+ const initResult = await response.json();
2533
+ const pollingCode = initResult.polling_code;
2534
+ const loginCode = initResult.login_code;
2535
+ const url = buildCliAuthConfirmUrl({
2536
+ cliAuthConfirmUrl: this.urls.cliAuthConfirm,
2537
+ appUrl: options.appUrl,
2538
+ loginCode
2539
+ });
2540
+ if (options.promptLink) options.promptLink(url, loginCode);
2541
+ else {
2542
+ console.log(`Your verification code: ${loginCode}`);
2543
+ console.log(`Please visit the following URL to authenticate:\n${url}`);
2544
+ }
2545
+ let attempts = 0;
2546
+ while (attempts < (options.maxAttempts ?? Infinity)) {
2547
+ attempts++;
2548
+ const pollResponse = await this._interface.sendClientRequest("/auth/cli/poll", {
2549
+ method: "POST",
2550
+ headers: { "Content-Type": "application/json" },
2551
+ body: JSON.stringify({ polling_code: pollingCode })
2552
+ }, null);
2553
+ if (!pollResponse.ok) return Result.error(new KnownErrors.CliAuthError(`Failed to initiate CLI auth: ${pollResponse.status} ${await pollResponse.text()}`));
2554
+ const pollResult = await pollResponse.json();
2555
+ if (pollResponse.status === 201 && pollResult.status === "success") return Result.ok(pollResult.refresh_token);
2556
+ if (pollResult.status === "waiting") {
2557
+ await wait(options.waitTimeMillis ?? 2e3);
2558
+ continue;
2559
+ }
2560
+ if (pollResult.status === "expired") return Result.error(new KnownErrors.CliAuthExpiredError("CLI authentication request expired. Please try again."));
2561
+ if (pollResult.status === "used") return Result.error(new KnownErrors.CliAuthUsedError("This authentication token has already been used."));
2562
+ return Result.error(new KnownErrors.CliAuthError(`Unexpected status from CLI auth polling: ${pollResult.status}`));
2563
+ }
2564
+ return Result.error(new KnownErrors.CliAuthError("Timed out waiting for CLI authentication."));
2565
+ }
2566
+ async signInWithMfa(totp, code, options) {
2567
+ this._ensurePersistentTokenStore();
2568
+ const session = await this._getSession();
2569
+ let result;
2570
+ try {
2571
+ result = await this._catchMfaRequiredError(async () => {
2572
+ return await this._interface.signInWithMfa(totp, code, session);
2573
+ });
2574
+ } catch (e) {
2575
+ if (e instanceof KnownErrors.InvalidTotpCode) return Result.error(e);
2576
+ throw e;
2577
+ }
2578
+ if (result.status === "ok") {
2579
+ await this._signInToAccountWithTokens(result.data);
2580
+ if (!options?.noRedirect) if (result.data.newUser) await this._redirectToHandler("afterSignUp", { replace: true }, { overrideTokenStoreInit: this._getTokenStoreInitForFreshTokens(result.data) });
2581
+ else await this._redirectToHandler("afterSignIn", { replace: true }, { overrideTokenStoreInit: this._getTokenStoreInitForFreshTokens(result.data) });
2582
+ return Result.ok(void 0);
2583
+ }
2584
+ return Result.error(result.error);
2585
+ }
2586
+ async signInWithPasskey() {
2587
+ this._ensurePersistentTokenStore();
2588
+ const session = await this._getSession();
2589
+ let result;
2590
+ try {
2591
+ result = await this._catchMfaRequiredError(async () => {
2592
+ const initiationResult = await this._interface.initiatePasskeyAuthentication({}, session);
2593
+ if (initiationResult.status !== "ok") return Result.error(new KnownErrors.PasskeyAuthenticationFailed("Failed to get initiation options for passkey authentication"));
2594
+ const { options_json, code } = initiationResult.data;
2595
+ if (options_json.rpId !== "THIS_VALUE_WILL_BE_REPLACED.example.com") throw new HexclaveAssertionError(`Expected returned RP ID from server to equal sentinel, but found ${options_json.rpId}`);
2596
+ options_json.rpId = window.location.hostname;
2597
+ const authentication_response = await startAuthentication({ optionsJSON: options_json });
2598
+ return await this._interface.signInWithPasskey({
2599
+ authentication_response,
2600
+ code
2601
+ }, session);
2602
+ });
2603
+ } catch (error) {
2604
+ if (error instanceof WebAuthnError) return Result.error(new KnownErrors.PasskeyWebAuthnError(error.message, error.name));
2605
+ else return Result.error(new KnownErrors.PasskeyAuthenticationFailed("Failed to sign in with passkey"));
2606
+ }
2607
+ if (result.status === "ok") {
2608
+ await this._signInToAccountWithTokens(result.data);
2609
+ await this._redirectToHandler("afterSignIn", { replace: true }, { overrideTokenStoreInit: this._getTokenStoreInitForFreshTokens(result.data) });
2610
+ return Result.ok(void 0);
2611
+ } else return Result.error(result.error);
2612
+ }
2613
+ async callOAuthCallback(options) {
2614
+ if (typeof window === "undefined") throw new Error("callOAuthCallback can currently only be called in a browser environment");
2615
+ if (this._currentUrlLooksLikeOAuthCallback()) this._ensurePersistentTokenStore();
2616
+ let oauthCallbackRedirectUri = this._getOAuthCallbackRedirectUri();
2617
+ const currentUrl = new URL(window.location.href);
2618
+ if (currentUrl.searchParams.get(crossDomainAuthQueryParams.marker) === "1") {
2619
+ currentUrl.searchParams.delete("code");
2620
+ currentUrl.searchParams.delete("state");
2621
+ oauthCallbackRedirectUri = currentUrl.toString();
2622
+ }
2623
+ let result;
2624
+ try {
2625
+ result = await this._catchMfaRequiredError(async () => {
2626
+ return await callOAuthCallback(this._interface, oauthCallbackRedirectUri, options);
2627
+ });
2628
+ } catch (e) {
2629
+ if (KnownErrors.InvalidTotpCode.isInstance(e)) {
2630
+ alert("Invalid TOTP code. Please try signing in again.");
2631
+ return false;
2632
+ } else throw e;
2633
+ }
2634
+ if (result.status === "ok" && result.data) {
2635
+ this._ensurePersistentTokenStore();
2636
+ await this._signInToAccountWithTokens(result.data);
2637
+ if ("afterCallbackRedirectUrl" in result.data && result.data.afterCallbackRedirectUrl) {
2638
+ await this._redirectTo({
2639
+ url: result.data.afterCallbackRedirectUrl,
2640
+ replace: true
2641
+ });
2642
+ return true;
2643
+ } else if (result.data.newUser) {
2644
+ await this._redirectToHandler("afterSignUp", { replace: true }, {
2645
+ awaitPendingAuthResolutions: false,
2646
+ overrideTokenStoreInit: this._getTokenStoreInitForFreshTokens(result.data)
2647
+ });
2648
+ return true;
2649
+ } else {
2650
+ await this._redirectToHandler("afterSignIn", { replace: true }, {
2651
+ awaitPendingAuthResolutions: false,
2652
+ overrideTokenStoreInit: this._getTokenStoreInitForFreshTokens(result.data)
2653
+ });
2654
+ return true;
2655
+ }
2656
+ }
2657
+ return false;
2658
+ }
2659
+ async _signOut(session, options) {
2660
+ this._eventTracker?.clearBuffer();
2661
+ this._sessionRecorder?.clearBuffer();
2662
+ await storeLock.withWriteLock(async () => {
2663
+ await this._interface.signOut(session);
2664
+ if (options?.redirectUrl) await this._redirectTo({
2665
+ url: options.redirectUrl,
2666
+ replace: true
2667
+ });
2668
+ else await this.redirectToAfterSignOut();
2669
+ });
2670
+ }
2671
+ async signOut(options) {
2672
+ const user = await this.getUser({ tokenStore: options?.tokenStore ?? void 0 });
2673
+ if (user) await user.signOut({ redirectUrl: options?.redirectUrl });
2674
+ }
2675
+ async getAccessToken(options) {
2676
+ const user = await this.getUser({ tokenStore: options?.tokenStore ?? void 0 });
2677
+ if (user) return await user.getAccessToken();
2678
+ return null;
2679
+ }
2680
+ useAccessToken(options) {
2681
+ const user = this.useUser({ tokenStore: options?.tokenStore ?? void 0 });
2682
+ if (user) return user.useAccessToken();
2683
+ return null;
2684
+ }
2685
+ async getRefreshToken(options) {
2686
+ const user = await this.getUser({ tokenStore: options?.tokenStore ?? void 0 });
2687
+ if (user) return await user.getRefreshToken();
2688
+ return null;
2689
+ }
2690
+ useRefreshToken(options) {
2691
+ const user = this.useUser({ tokenStore: options?.tokenStore ?? void 0 });
2692
+ if (user) return user.useRefreshToken();
2693
+ return null;
2694
+ }
2695
+ async getAuthorizationHeader(options) {
2696
+ return getAuthorizationHeaderValueFromAuthJson(await this.getAuthJson(options));
2697
+ }
2698
+ useAuthorizationHeader(options) {
2699
+ return getAuthorizationHeaderValueFromAuthJson(this.useAuthJson(options));
2700
+ }
2701
+ async getAuthHeaders(options) {
2702
+ return { "x-stack-auth": JSON.stringify(await this.getAuthJson(options)) };
2703
+ }
2704
+ useAuthHeaders(options) {
2705
+ return { "x-stack-auth": JSON.stringify(this.useAuthJson(options)) };
2706
+ }
2707
+ async getAuthJson(options) {
2708
+ const user = await this.getUser({ tokenStore: options?.tokenStore ?? void 0 });
2709
+ if (user) return await user.getAuthJson();
2710
+ return {
2711
+ accessToken: null,
2712
+ refreshToken: null
2713
+ };
2714
+ }
2715
+ useAuthJson(options) {
2716
+ const user = this.useUser({ tokenStore: options?.tokenStore ?? void 0 });
2717
+ if (user) return user.useAuthJson();
2718
+ return {
2719
+ accessToken: null,
2720
+ refreshToken: null
2721
+ };
2722
+ }
2723
+ async getProject() {
2724
+ const crud = Result.orThrow(await this._currentProjectCache.getOrWait([], "write-only"));
2725
+ return this._clientProjectFromCrud(crud);
2726
+ }
2727
+ useProject() {
2728
+ const crud = useAsyncCache(this._currentProjectCache, [], "clientApp.useProject()");
2729
+ return useMemo(() => this._clientProjectFromCrud(crud), [crud]);
2730
+ }
2731
+ async _listOwnedProjects(session) {
2732
+ this._ensureInternalProject();
2733
+ return Result.orThrow(await this._ownedProjectsCache.getOrWait([session], "write-only")).map((j) => this._getOwnedAdminApp(j.id, session)._adminOwnedProjectFromCrud(j, () => this._refreshOwnedProjects(session)));
2734
+ }
2735
+ _useOwnedProjects(session) {
2736
+ this._ensureInternalProject();
2737
+ const projects = useAsyncCache(this._ownedProjectsCache, [session], "clientApp.useOwnedProjects()");
2738
+ return useMemo(() => projects.map((j) => this._getOwnedAdminApp(j.id, session)._adminOwnedProjectFromCrud(j, () => this._refreshOwnedProjects(session))), [projects]);
2739
+ }
2740
+ async _createProject(session, newProject) {
2741
+ this._ensureInternalProject();
2742
+ const crud = await this._interface.createProject(adminProjectCreateOptionsToCrud(newProject), session);
2743
+ const res = this._getOwnedAdminApp(crud.id, session)._adminOwnedProjectFromCrud(crud, () => this._refreshOwnedProjects(session));
2744
+ await this._refreshOwnedProjects(session);
2745
+ return res;
2746
+ }
2747
+ async _refreshUser(session) {
2748
+ await this._refreshSession(session);
2749
+ }
2750
+ async _refreshSession(session) {
2751
+ await Promise.all([this._currentUserCache.refresh([session]), this._currentUserConnectedAccountsCache.refresh([session])]);
2752
+ session.suggestAccessTokenExpired();
2753
+ }
2754
+ async _refreshUsers() {}
2755
+ async _refreshProject() {
2756
+ await this._currentProjectCache.refresh([]);
2757
+ }
2758
+ async _refreshOwnedProjects(session) {
2759
+ await this._ownedProjectsCache.refresh([session]);
2760
+ }
2761
+ static get [stackAppInternalsSymbol]() {
2762
+ return { fromClientJson: (json) => {
2763
+ const providedCheckString = JSON.stringify(omit(json, []));
2764
+ const existing = allClientApps.get(json.uniqueIdentifier);
2765
+ if (existing) {
2766
+ const [existingCheckString, clientApp] = existing;
2767
+ if (existingCheckString !== void 0 && existingCheckString !== providedCheckString) throw new HexclaveAssertionError("The provided app JSON does not match the configuration of the existing client app with the same unique identifier", {
2768
+ providedObj: json,
2769
+ existingString: existingCheckString
2770
+ });
2771
+ return clientApp;
2772
+ }
2773
+ const { analytics, ...restJson } = omit(json, ["uniqueIdentifier"]);
2774
+ return new _StackClientAppImplIncomplete({
2775
+ ...restJson,
2776
+ analytics: analyticsOptionsFromJson(analytics)
2777
+ }, {
2778
+ uniqueIdentifier: json.uniqueIdentifier,
2779
+ checkString: providedCheckString
2780
+ });
2781
+ } };
2782
+ }
2783
+ get [stackAppInternalsSymbol]() {
2784
+ return {
2785
+ toClientJson: () => {
2786
+ if (typeof this._redirectMethod !== "string") throw new HexclaveAssertionError("Cannot serialize to JSON from an application with a non-string redirect method");
2787
+ const publishableClientKey = "publishableClientKey" in this._interface.options ? this._interface.options.publishableClientKey : void 0;
2788
+ return {
2789
+ baseUrl: this._options.baseUrl,
2790
+ projectId: this.projectId,
2791
+ ...publishableClientKey != null ? { publishableClientKey } : {},
2792
+ tokenStore: this._tokenStoreInit,
2793
+ urls: this._urlOptions,
2794
+ oauthScopesOnSignIn: this._oauthScopesOnSignIn,
2795
+ uniqueIdentifier: this._getUniqueIdentifier(),
2796
+ redirectMethod: this._redirectMethod,
2797
+ extraRequestHeaders: this._options.extraRequestHeaders,
2798
+ devTool: this._options.devTool,
2799
+ analytics: analyticsOptionsToJson(this._analyticsOptions)
2800
+ };
2801
+ },
2802
+ setCurrentUser: (userJsonPromise) => {
2803
+ runAsynchronously(async () => {
2804
+ await this._currentUserCache.forceSetCachedValueAsync([await this._getSession()], Result.fromPromise(userJsonPromise));
2805
+ });
2806
+ },
2807
+ getConstructorOptions: () => this._options,
2808
+ sendSessionReplayBatch: async (body, options) => {
2809
+ return await this._interface.sendSessionReplayBatch(body, await this._getSession(), options);
2810
+ },
2811
+ sendAnalyticsEventBatch: async (body, options) => {
2812
+ return await this._interface.sendAnalyticsEventBatch(body, await this._getSession(), options);
2813
+ },
2814
+ addRequestListener: (listener) => {
2815
+ return this._interface.addRequestListener(listener);
2816
+ },
2817
+ sendRequest: async (path, requestOptions, requestType = "client") => {
2818
+ return await this._interface.sendClientRequest(path, requestOptions, await this._getSession(), requestType);
2819
+ },
2820
+ getRedirectMethod: () => this._redirectMethod ?? throwErr("Redirect method should have been initialized in the Stack client app constructor"),
2821
+ redirectToUrl: async (url, options) => {
2822
+ await this._redirectTo({
2823
+ url,
2824
+ ...options
2825
+ });
2826
+ },
2827
+ redirectToHandler: async (handlerName, options) => {
2828
+ await this._redirectToHandler(handlerName, options);
2829
+ },
2830
+ refreshOwnedProjects: async () => {
2831
+ await this._refreshOwnedProjects(await this._getSession());
2832
+ },
2833
+ signInWithTokens: async (tokens) => {
2834
+ await this._signInToAccountWithTokens(tokens);
2835
+ }
2836
+ };
2837
+ }
2838
+ };
2839
+
2840
+ //#endregion
2841
+ export { _StackClientAppImplIncomplete };
2842
+ //# sourceMappingURL=client-app-impl.js.map