@stackframe/react 2.8.56 → 2.8.59

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 (250) hide show
  1. package/dist/components/api-key-dialogs.js.map +1 -1
  2. package/dist/components/api-key-table.js.map +1 -1
  3. package/dist/components/credential-sign-in.js.map +1 -1
  4. package/dist/components/credential-sign-up.js.map +1 -1
  5. package/dist/components/elements/form-warning.js.map +1 -1
  6. package/dist/components/elements/maybe-full-page.js.map +1 -1
  7. package/dist/components/elements/separator-with-text.js.map +1 -1
  8. package/dist/components/elements/sidebar-layout.js.map +1 -1
  9. package/dist/components/elements/ssr-layout-effect.js.map +1 -1
  10. package/dist/components/elements/user-avatar.js.map +1 -1
  11. package/dist/components/link.js.map +1 -1
  12. package/dist/components/magic-link-sign-in.js.map +1 -1
  13. package/dist/components/message-cards/known-error-message-card.js.map +1 -1
  14. package/dist/components/message-cards/message-card.js.map +1 -1
  15. package/dist/components/message-cards/predefined-message-card.js.map +1 -1
  16. package/dist/components/oauth-button-group.js.map +1 -1
  17. package/dist/components/oauth-button.js.map +1 -1
  18. package/dist/components/passkey-button.js.map +1 -1
  19. package/dist/components/profile-image-editor.js.map +1 -1
  20. package/dist/components/selected-team-switcher.js.map +1 -1
  21. package/dist/components/team-icon.js.map +1 -1
  22. package/dist/components/team-switcher.js.map +1 -1
  23. package/dist/components/use-in-iframe.js.map +1 -1
  24. package/dist/components/user-button.js.map +1 -1
  25. package/dist/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
  26. package/dist/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
  27. package/dist/components-page/account-settings/editable-text.js.map +1 -1
  28. package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
  29. package/dist/components-page/account-settings/email-and-auth/emails-section.js +4 -3
  30. package/dist/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
  31. package/dist/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
  32. package/dist/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
  33. package/dist/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
  34. package/dist/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
  35. package/dist/components-page/account-settings/notifications/notifications-page.js.map +1 -1
  36. package/dist/components-page/account-settings/page-layout.js.map +1 -1
  37. package/dist/components-page/account-settings/payments/payments-page.js +79 -0
  38. package/dist/components-page/account-settings/payments/payments-page.js.map +1 -0
  39. package/dist/components-page/account-settings/payments/payments-panel.js +374 -0
  40. package/dist/components-page/account-settings/payments/payments-panel.js.map +1 -0
  41. package/dist/components-page/account-settings/profile-page/profile-page.js.map +1 -1
  42. package/dist/components-page/account-settings/section.js.map +1 -1
  43. package/dist/components-page/account-settings/settings/delete-account-section.js.map +1 -1
  44. package/dist/components-page/account-settings/settings/settings-page.js.map +1 -1
  45. package/dist/components-page/account-settings/settings/sign-out-section.js.map +1 -1
  46. package/dist/components-page/account-settings/teams/leave-team-section.js.map +1 -1
  47. package/dist/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
  48. package/dist/components-page/account-settings/teams/team-creation-page.js.map +1 -1
  49. package/dist/components-page/account-settings/teams/team-display-name-section.js.map +1 -1
  50. package/dist/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
  51. package/dist/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
  52. package/dist/components-page/account-settings/teams/team-page.js.map +1 -1
  53. package/dist/components-page/account-settings/teams/team-profile-image-section.js.map +1 -1
  54. package/dist/components-page/account-settings/teams/team-profile-user-section.js.map +1 -1
  55. package/dist/components-page/account-settings.js +22 -2
  56. package/dist/components-page/account-settings.js.map +1 -1
  57. package/dist/components-page/auth-page.js.map +1 -1
  58. package/dist/components-page/cli-auth-confirm.js.map +1 -1
  59. package/dist/components-page/email-verification.js.map +1 -1
  60. package/dist/components-page/error-page.js.map +1 -1
  61. package/dist/components-page/forgot-password.js.map +1 -1
  62. package/dist/components-page/magic-link-callback.js.map +1 -1
  63. package/dist/components-page/mfa.js.map +1 -1
  64. package/dist/components-page/oauth-callback.js.map +1 -1
  65. package/dist/components-page/onboarding.js +170 -0
  66. package/dist/components-page/onboarding.js.map +1 -0
  67. package/dist/components-page/password-reset.js.map +1 -1
  68. package/dist/components-page/section.js.map +1 -1
  69. package/dist/components-page/sign-in.js.map +1 -1
  70. package/dist/components-page/sign-out.js.map +1 -1
  71. package/dist/components-page/sign-up.js.map +1 -1
  72. package/dist/components-page/stack-handler-client.js +13 -1
  73. package/dist/components-page/stack-handler-client.js.map +1 -1
  74. package/dist/components-page/stack-handler.js.map +1 -1
  75. package/dist/components-page/team-creation.js.map +1 -1
  76. package/dist/components-page/team-invitation.js +15 -1
  77. package/dist/components-page/team-invitation.js.map +1 -1
  78. package/dist/esm/components/api-key-dialogs.js.map +1 -1
  79. package/dist/esm/components/api-key-table.js.map +1 -1
  80. package/dist/esm/components/credential-sign-in.js.map +1 -1
  81. package/dist/esm/components/credential-sign-up.js.map +1 -1
  82. package/dist/esm/components/elements/form-warning.js.map +1 -1
  83. package/dist/esm/components/elements/maybe-full-page.js.map +1 -1
  84. package/dist/esm/components/elements/separator-with-text.js.map +1 -1
  85. package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
  86. package/dist/esm/components/elements/ssr-layout-effect.js.map +1 -1
  87. package/dist/esm/components/elements/user-avatar.js.map +1 -1
  88. package/dist/esm/components/link.js.map +1 -1
  89. package/dist/esm/components/magic-link-sign-in.js.map +1 -1
  90. package/dist/esm/components/message-cards/known-error-message-card.js.map +1 -1
  91. package/dist/esm/components/message-cards/message-card.js.map +1 -1
  92. package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -1
  93. package/dist/esm/components/oauth-button-group.js.map +1 -1
  94. package/dist/esm/components/oauth-button.js.map +1 -1
  95. package/dist/esm/components/passkey-button.js.map +1 -1
  96. package/dist/esm/components/profile-image-editor.js.map +1 -1
  97. package/dist/esm/components/selected-team-switcher.js.map +1 -1
  98. package/dist/esm/components/team-icon.js.map +1 -1
  99. package/dist/esm/components/team-switcher.js.map +1 -1
  100. package/dist/esm/components/use-in-iframe.js.map +1 -1
  101. package/dist/esm/components/user-button.js.map +1 -1
  102. package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
  103. package/dist/esm/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
  104. package/dist/esm/components-page/account-settings/editable-text.js.map +1 -1
  105. package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
  106. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js +4 -3
  107. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
  108. package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
  109. package/dist/esm/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
  110. package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
  111. package/dist/esm/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
  112. package/dist/esm/components-page/account-settings/notifications/notifications-page.js.map +1 -1
  113. package/dist/esm/components-page/account-settings/page-layout.js.map +1 -1
  114. package/dist/esm/components-page/account-settings/payments/payments-page.js +55 -0
  115. package/dist/esm/components-page/account-settings/payments/payments-page.js.map +1 -0
  116. package/dist/esm/components-page/account-settings/payments/payments-panel.js +350 -0
  117. package/dist/esm/components-page/account-settings/payments/payments-panel.js.map +1 -0
  118. package/dist/esm/components-page/account-settings/profile-page/profile-page.js.map +1 -1
  119. package/dist/esm/components-page/account-settings/section.js.map +1 -1
  120. package/dist/esm/components-page/account-settings/settings/delete-account-section.js.map +1 -1
  121. package/dist/esm/components-page/account-settings/settings/settings-page.js.map +1 -1
  122. package/dist/esm/components-page/account-settings/settings/sign-out-section.js.map +1 -1
  123. package/dist/esm/components-page/account-settings/teams/leave-team-section.js.map +1 -1
  124. package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
  125. package/dist/esm/components-page/account-settings/teams/team-creation-page.js.map +1 -1
  126. package/dist/esm/components-page/account-settings/teams/team-display-name-section.js.map +1 -1
  127. package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
  128. package/dist/esm/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
  129. package/dist/esm/components-page/account-settings/teams/team-page.js.map +1 -1
  130. package/dist/esm/components-page/account-settings/teams/team-profile-image-section.js.map +1 -1
  131. package/dist/esm/components-page/account-settings/teams/team-profile-user-section.js.map +1 -1
  132. package/dist/esm/components-page/account-settings.js +23 -3
  133. package/dist/esm/components-page/account-settings.js.map +1 -1
  134. package/dist/esm/components-page/auth-page.js.map +1 -1
  135. package/dist/esm/components-page/cli-auth-confirm.js.map +1 -1
  136. package/dist/esm/components-page/email-verification.js.map +1 -1
  137. package/dist/esm/components-page/error-page.js.map +1 -1
  138. package/dist/esm/components-page/forgot-password.js.map +1 -1
  139. package/dist/esm/components-page/magic-link-callback.js.map +1 -1
  140. package/dist/esm/components-page/mfa.js.map +1 -1
  141. package/dist/esm/components-page/oauth-callback.js.map +1 -1
  142. package/dist/esm/components-page/onboarding.js +146 -0
  143. package/dist/esm/components-page/onboarding.js.map +1 -0
  144. package/dist/esm/components-page/password-reset.js.map +1 -1
  145. package/dist/esm/components-page/section.js.map +1 -1
  146. package/dist/esm/components-page/sign-in.js.map +1 -1
  147. package/dist/esm/components-page/sign-out.js.map +1 -1
  148. package/dist/esm/components-page/sign-up.js.map +1 -1
  149. package/dist/esm/components-page/stack-handler-client.js +13 -1
  150. package/dist/esm/components-page/stack-handler-client.js.map +1 -1
  151. package/dist/esm/components-page/stack-handler.js.map +1 -1
  152. package/dist/esm/components-page/team-creation.js.map +1 -1
  153. package/dist/esm/components-page/team-invitation.js +15 -1
  154. package/dist/esm/components-page/team-invitation.js.map +1 -1
  155. package/dist/esm/generated/global-css.js +1 -1
  156. package/dist/esm/generated/global-css.js.map +1 -1
  157. package/dist/esm/generated/quetzal-translations.js.map +1 -1
  158. package/dist/esm/index.js.map +1 -1
  159. package/dist/esm/integrations/convex/component/convex.config.js.map +1 -1
  160. package/dist/esm/integrations/convex.js.map +1 -1
  161. package/dist/esm/lib/auth.js.map +1 -1
  162. package/dist/esm/lib/cookie.js.map +1 -1
  163. package/dist/esm/lib/hooks.js.map +1 -1
  164. package/dist/esm/lib/stack-app/api-keys/index.js.map +1 -1
  165. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +235 -0
  166. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
  167. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js +210 -29
  168. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  169. package/dist/esm/lib/stack-app/apps/implementations/common.js +2 -1
  170. package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -1
  171. package/dist/esm/lib/stack-app/apps/implementations/index.js.map +1 -1
  172. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js +40 -27
  173. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
  174. package/dist/esm/lib/stack-app/apps/index.js.map +1 -1
  175. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
  176. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
  177. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
  178. package/dist/esm/lib/stack-app/common.js.map +1 -1
  179. package/dist/esm/lib/stack-app/contact-channels/index.js.map +1 -1
  180. package/dist/esm/lib/stack-app/email-templates/index.js.map +1 -1
  181. package/dist/esm/lib/stack-app/index.js.map +1 -1
  182. package/dist/esm/lib/stack-app/internal-api-keys/index.js.map +1 -1
  183. package/dist/esm/lib/stack-app/permissions/index.js.map +1 -1
  184. package/dist/esm/lib/stack-app/projects/index.js +4 -0
  185. package/dist/esm/lib/stack-app/projects/index.js.map +1 -1
  186. package/dist/esm/lib/stack-app/teams/index.js.map +1 -1
  187. package/dist/esm/lib/stack-app/users/index.js +13 -12
  188. package/dist/esm/lib/stack-app/users/index.js.map +1 -1
  189. package/dist/esm/lib/translations.js.map +1 -1
  190. package/dist/esm/providers/stack-provider-client.js.map +1 -1
  191. package/dist/esm/providers/stack-provider.js.map +1 -1
  192. package/dist/esm/providers/theme-provider.js.map +1 -1
  193. package/dist/esm/providers/translation-provider-client.js.map +1 -1
  194. package/dist/esm/providers/translation-provider.js.map +1 -1
  195. package/dist/esm/utils/browser-script.js.map +1 -1
  196. package/dist/esm/utils/constants.js.map +1 -1
  197. package/dist/esm/utils/url.js.map +1 -1
  198. package/dist/generated/global-css.js +1 -1
  199. package/dist/generated/global-css.js.map +1 -1
  200. package/dist/generated/quetzal-translations.js.map +1 -1
  201. package/dist/index.d.mts +306 -17
  202. package/dist/index.d.ts +306 -17
  203. package/dist/index.js.map +1 -1
  204. package/dist/integrations/convex/component/convex.config.js.map +1 -1
  205. package/dist/integrations/convex.js.map +1 -1
  206. package/dist/lib/auth.js.map +1 -1
  207. package/dist/lib/cookie.js.map +1 -1
  208. package/dist/lib/hooks.js.map +1 -1
  209. package/dist/lib/stack-app/api-keys/index.js.map +1 -1
  210. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +235 -0
  211. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
  212. package/dist/lib/stack-app/apps/implementations/client-app-impl.js +208 -27
  213. package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  214. package/dist/lib/stack-app/apps/implementations/common.js +2 -1
  215. package/dist/lib/stack-app/apps/implementations/common.js.map +1 -1
  216. package/dist/lib/stack-app/apps/implementations/index.js.map +1 -1
  217. package/dist/lib/stack-app/apps/implementations/server-app-impl.js +38 -25
  218. package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
  219. package/dist/lib/stack-app/apps/index.js.map +1 -1
  220. package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
  221. package/dist/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
  222. package/dist/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
  223. package/dist/lib/stack-app/common.js.map +1 -1
  224. package/dist/lib/stack-app/connected-accounts/index.js.map +1 -1
  225. package/dist/lib/stack-app/contact-channels/index.js.map +1 -1
  226. package/dist/lib/stack-app/customers/index.js.map +1 -1
  227. package/dist/lib/stack-app/data-vault/index.js.map +1 -1
  228. package/dist/lib/stack-app/email/index.js.map +1 -1
  229. package/dist/lib/stack-app/email-templates/index.js.map +1 -1
  230. package/dist/lib/stack-app/index.js.map +1 -1
  231. package/dist/lib/stack-app/internal-api-keys/index.js.map +1 -1
  232. package/dist/lib/stack-app/notification-categories/index.js.map +1 -1
  233. package/dist/lib/stack-app/permissions/index.js.map +1 -1
  234. package/dist/lib/stack-app/project-configs/index.js.map +1 -1
  235. package/dist/lib/stack-app/projects/index.js +4 -0
  236. package/dist/lib/stack-app/projects/index.js.map +1 -1
  237. package/dist/lib/stack-app/teams/index.js.map +1 -1
  238. package/dist/lib/stack-app/users/index.js +15 -14
  239. package/dist/lib/stack-app/users/index.js.map +1 -1
  240. package/dist/lib/translations.js.map +1 -1
  241. package/dist/providers/stack-provider-client.js.map +1 -1
  242. package/dist/providers/stack-provider.js.map +1 -1
  243. package/dist/providers/theme-provider.js.map +1 -1
  244. package/dist/providers/translation-provider-client.js.map +1 -1
  245. package/dist/providers/translation-provider.js.map +1 -1
  246. package/dist/utils/browser-script.js.map +1 -1
  247. package/dist/utils/constants.js.map +1 -1
  248. package/dist/utils/url.js.map +1 -1
  249. package/package.json +19 -16
  250. package/CHANGELOG.md +0 -2072
@@ -208,6 +208,11 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
208
208
  }, session);
209
209
  }
210
210
  );
211
+ this._customerBillingCache = (0, import_common2.createCacheBySession)(
212
+ async (session, [customerType, customerId]) => {
213
+ return await this._interface.getCustomerBilling(customerType, customerId, session);
214
+ }
215
+ );
211
216
  this._convexPartialUserCache = (0, import_common2.createCache)(
212
217
  async ([ctx]) => await this._getPartialUserFromConvex(ctx)
213
218
  );
@@ -442,7 +447,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
442
447
  if (!(0, import_env.isBrowserLike)()) {
443
448
  throw new import_errors.StackAssertionError("Cannot get browser cookies on the server!");
444
449
  }
445
- return cookie.parse(document.cookie || "");
450
+ return cookie.parseCookie(document.cookie || "");
446
451
  }
447
452
  _getRefreshTokenCookieNamePatterns() {
448
453
  return {
@@ -640,7 +645,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
640
645
  });
641
646
  }
642
647
  const cookieHeader = tokenStoreInit.headers.get("cookie");
643
- const parsed = cookie.parse(cookieHeader || "");
648
+ const parsed = cookie.parseCookie(cookieHeader || "");
644
649
  const res = new import_stores.Store(this._getTokensFromCookies(parsed));
645
650
  this._requestTokenStores.set(tokenStoreInit, res);
646
651
  return res;
@@ -961,32 +966,92 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
961
966
  displayName: item.product.display_name,
962
967
  customerType: item.product.customer_type,
963
968
  isServerOnly: item.product.server_only,
964
- stackable: item.product.stackable
969
+ stackable: item.product.stackable,
970
+ type: item.type,
971
+ subscription: item.subscription ? {
972
+ currentPeriodEnd: item.subscription.current_period_end ? new Date(item.subscription.current_period_end) : null,
973
+ cancelAtPeriodEnd: item.subscription.cancel_at_period_end,
974
+ isCancelable: item.subscription.is_cancelable
975
+ } : null,
976
+ switchOptions: item.switch_options?.map((option) => ({
977
+ productId: option.product_id,
978
+ displayName: option.product.display_name,
979
+ prices: option.product.prices
980
+ }))
965
981
  }));
966
982
  return Object.assign(products, { nextCursor: response.pagination.next_cursor ?? null });
967
983
  }
984
+ _customerBillingFromResponse(response) {
985
+ return {
986
+ hasCustomer: response.has_customer,
987
+ defaultPaymentMethod: response.default_payment_method
988
+ };
989
+ }
968
990
  _createAuth(session) {
969
991
  const app = this;
970
992
  return {
971
993
  _internalSession: session,
972
994
  currentSession: {
973
995
  async getTokens() {
974
- const tokens = await session.getOrFetchLikelyValidTokens(2e4);
996
+ const tokens = await session.getOrFetchLikelyValidTokens(2e4, 75e3);
975
997
  return {
976
998
  accessToken: tokens?.accessToken.token ?? null,
977
999
  refreshToken: tokens?.refreshToken?.token ?? null
978
1000
  };
1001
+ },
1002
+ useTokens() {
1003
+ const [_, setCounter] = import_react2.default.useState(0);
1004
+ import_react2.default.useEffect(() => {
1005
+ const { unsubscribe: unsubscribeRefresh } = session.startRefreshingAccessToken(3e4, 6e4);
1006
+ const { unsubscribe: unsubscribeInvalidate } = session.onInvalidate(() => setCounter((c) => c + 1));
1007
+ const { unsubscribe: unsubscribeAccessTokenChange } = session.onAccessTokenChange(() => setCounter((c) => c + 1));
1008
+ return () => {
1009
+ unsubscribeRefresh();
1010
+ unsubscribeInvalidate();
1011
+ unsubscribeAccessTokenChange();
1012
+ };
1013
+ }, []);
1014
+ let accessToken = session.isKnownToBeInvalid() ? null : session.getAccessTokenIfNotExpiredYet(2e4, 75e3);
1015
+ if (accessToken === null) {
1016
+ accessToken = (0, import_react.use)(session.getOrFetchLikelyValidTokens(2e4, 75e3))?.accessToken ?? null;
1017
+ }
1018
+ return {
1019
+ accessToken: accessToken?.token ?? null,
1020
+ refreshToken: session.getRefreshToken()?.token ?? null
1021
+ };
979
1022
  }
980
1023
  },
1024
+ async getAccessToken() {
1025
+ const tokens = await this.currentSession.getTokens();
1026
+ return tokens.accessToken;
1027
+ },
1028
+ useAccessToken() {
1029
+ return this.currentSession.useTokens().accessToken;
1030
+ },
1031
+ async getRefreshToken() {
1032
+ const tokens = await this.currentSession.getTokens();
1033
+ return tokens.refreshToken;
1034
+ },
1035
+ useRefreshToken() {
1036
+ return this.currentSession.useTokens().refreshToken;
1037
+ },
981
1038
  async getAuthHeaders() {
982
1039
  return {
983
1040
  "x-stack-auth": JSON.stringify(await this.getAuthJson())
984
1041
  };
985
1042
  },
1043
+ useAuthHeaders() {
1044
+ return {
1045
+ "x-stack-auth": JSON.stringify(this.useAuthJson())
1046
+ };
1047
+ },
986
1048
  async getAuthJson() {
987
1049
  const tokens = await this.currentSession.getTokens();
988
1050
  return tokens;
989
1051
  },
1052
+ useAuthJson() {
1053
+ return this.currentSession.useTokens();
1054
+ },
990
1055
  signOut(options) {
991
1056
  return app._signOut(session, options);
992
1057
  }
@@ -1027,6 +1092,8 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1027
1092
  passkeyAuthEnabled: crud.passkey_auth_enabled,
1028
1093
  isMultiFactorRequired: crud.requires_totp_mfa,
1029
1094
  isAnonymous: crud.is_anonymous,
1095
+ isRestricted: crud.is_restricted,
1096
+ restrictedReason: crud.restricted_reason,
1030
1097
  toClientJson() {
1031
1098
  return crud;
1032
1099
  }
@@ -1057,7 +1124,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1057
1124
  return this.update({ clientMetadata: metadata });
1058
1125
  },
1059
1126
  async setSelectedTeam(team) {
1060
- await this.update({ selectedTeamId: team?.id ?? null });
1127
+ await this.update({ selectedTeamId: typeof team === "string" ? team : team?.id ?? null });
1061
1128
  },
1062
1129
  getConnectedAccount,
1063
1130
  useConnectedAccount,
@@ -1288,8 +1355,29 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1288
1355
  }
1289
1356
  _createCustomer(userIdOrTeamId, type, session) {
1290
1357
  const app = this;
1358
+ const effectiveSession = session ?? app._interface.createSession({ refreshToken: null });
1291
1359
  const customerOptions = type === "user" ? { userId: userIdOrTeamId } : { teamId: userIdOrTeamId };
1292
1360
  return {
1361
+ async getBilling() {
1362
+ const response = import_results.Result.orThrow(await app._customerBillingCache.getOrWait([effectiveSession, type, userIdOrTeamId], "write-only"));
1363
+ return app._customerBillingFromResponse(response);
1364
+ },
1365
+ useBilling() {
1366
+ const response = (0, import_common3.useAsyncCache)(app._customerBillingCache, [effectiveSession, type, userIdOrTeamId], "customer.useBilling()");
1367
+ return app._customerBillingFromResponse(response);
1368
+ },
1369
+ async createPaymentMethodSetupIntent() {
1370
+ const body = await app._interface.createCustomerPaymentMethodSetupIntent(type, userIdOrTeamId, effectiveSession);
1371
+ return {
1372
+ clientSecret: body.client_secret,
1373
+ stripeAccountId: body.stripe_account_id
1374
+ };
1375
+ },
1376
+ async setDefaultPaymentMethodFromSetupIntent(setupIntentId) {
1377
+ const body = await app._interface.setDefaultCustomerPaymentMethodFromSetupIntent(type, userIdOrTeamId, setupIntentId, effectiveSession);
1378
+ await app._customerBillingCache.refresh([effectiveSession, type, userIdOrTeamId]);
1379
+ return body.default_payment_method;
1380
+ },
1293
1381
  async getItem(itemId) {
1294
1382
  return await app.getItem({ itemId, ...customerOptions });
1295
1383
  },
@@ -1303,7 +1391,23 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1303
1391
  return app.useProducts({ ...options, ...customerOptions });
1304
1392
  },
1305
1393
  async createCheckoutUrl(options) {
1306
- return await app._interface.createCheckoutUrl(type, userIdOrTeamId, options.productId, session, options.returnUrl);
1394
+ return await app._interface.createCheckoutUrl(type, userIdOrTeamId, options.productId, effectiveSession, options.returnUrl);
1395
+ },
1396
+ async switchSubscription(options) {
1397
+ await app._interface.switchSubscription({
1398
+ customer_type: type,
1399
+ customer_id: userIdOrTeamId,
1400
+ from_product_id: options.fromProductId,
1401
+ to_product_id: options.toProductId,
1402
+ price_id: options.priceId,
1403
+ quantity: options.quantity
1404
+ }, effectiveSession);
1405
+ await app._customerBillingCache.refresh([effectiveSession, type, userIdOrTeamId]);
1406
+ if (type === "user") {
1407
+ await app._userProductsCache.invalidateWhere(([cachedSession, userId]) => cachedSession === effectiveSession && userId === userIdOrTeamId);
1408
+ } else {
1409
+ await app._teamProductsCache.invalidateWhere(([cachedSession, teamId]) => cachedSession === effectiveSession && teamId === userIdOrTeamId);
1410
+ }
1307
1411
  }
1308
1412
  };
1309
1413
  }
@@ -1337,6 +1441,25 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1337
1441
  const response = import_results.Result.orThrow(await this._customProductsCache.getOrWait([session, options.customCustomerId, options.cursor ?? null, options.limit ?? null], "write-only"));
1338
1442
  return this._customerProductsFromResponse(response);
1339
1443
  }
1444
+ async cancelSubscription(options) {
1445
+ const session = await this._getSession();
1446
+ const user = await this.getUser();
1447
+ if (!user) {
1448
+ throw new import_stack_shared.KnownErrors.UserAuthenticationRequired();
1449
+ }
1450
+ const customerType = "teamId" in options ? "team" : "user";
1451
+ const customerId = "teamId" in options ? options.teamId : user.id;
1452
+ await this._interface.cancelSubscription({
1453
+ customer_type: customerType,
1454
+ customer_id: customerId,
1455
+ product_id: options.productId
1456
+ }, session);
1457
+ if (customerType === "user") {
1458
+ await this._userProductsCache.invalidateWhere(([cachedSession, userId]) => cachedSession === session && userId === customerId);
1459
+ } else {
1460
+ await this._teamProductsCache.invalidateWhere(([cachedSession, teamId]) => cachedSession === session && teamId === customerId);
1461
+ }
1462
+ }
1340
1463
  useProducts(options) {
1341
1464
  const session = this._useSession();
1342
1465
  const cache = "userId" in options ? this._userProductsCache : "teamId" in options ? this._teamProductsCache : this._customProductsCache;
@@ -1346,15 +1469,13 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1346
1469
  return this._customerProductsFromResponse(response);
1347
1470
  }
1348
1471
  _currentUserFromCrud(crud, session) {
1349
- const currentUser = {
1472
+ const currentUser = (0, import_users.withUserDestructureGuard)({
1350
1473
  ...this._createBaseUser(crud),
1351
1474
  ...this._createAuth(session),
1352
1475
  ...this._createUserExtraFromCurrent(crud, session),
1353
1476
  ...this._isInternalProject() ? this._createInternalUserExtra(session) : {},
1354
1477
  ...this._createCustomer(crud.id, "user", session)
1355
- };
1356
- (0, import_users.attachUserDestructureGuard)(currentUser);
1357
- Object.freeze(currentUser);
1478
+ });
1358
1479
  return currentUser;
1359
1480
  }
1360
1481
  _clientSessionFromCrud(crud) {
@@ -1437,7 +1558,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1437
1558
  const queryParams = new URLSearchParams(window.location.search);
1438
1559
  url = queryParams.get("after_auth_return_to") || url;
1439
1560
  }
1440
- } else if (handlerName === "signIn" || handlerName === "signUp") {
1561
+ } else if (handlerName === "signIn" || handlerName === "signUp" || handlerName === "onboarding") {
1441
1562
  if (isReactServer || typeof window === "undefined") {
1442
1563
  } else {
1443
1564
  const currentUrl = new URL(window.location.href);
@@ -1486,6 +1607,9 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1486
1607
  async redirectToAfterSignUp(options) {
1487
1608
  return await this._redirectToHandler("afterSignUp", options);
1488
1609
  }
1610
+ async redirectToOnboarding(options) {
1611
+ return await this._redirectToHandler("onboarding", options);
1612
+ }
1489
1613
  async redirectToAfterSignOut(options) {
1490
1614
  return await this._redirectToHandler("afterSignOut", options);
1491
1615
  }
@@ -1551,16 +1675,22 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1551
1675
  return result;
1552
1676
  }
1553
1677
  async getUser(options) {
1678
+ if (options?.or === "anonymous" && options.includeRestricted === false) {
1679
+ throw new Error("Cannot use { or: 'anonymous' } with { includeRestricted: false }. Anonymous users implicitly include restricted users.");
1680
+ }
1554
1681
  this._ensurePersistentTokenStore(options?.tokenStore);
1555
1682
  const session = await this._getSession(options?.tokenStore);
1556
1683
  let crud = import_results.Result.orThrow(await this._currentUserCache.getOrWait([session], "write-only"));
1557
- if (crud?.is_anonymous && options?.or !== "anonymous" && options?.or !== "anonymous-if-exists[deprecated]") {
1558
- crud = null;
1559
- }
1560
- if (crud === null) {
1684
+ const includeAnonymous = options?.or === "anonymous" || options?.or === "anonymous-if-exists[deprecated]";
1685
+ const includeRestricted = options?.includeRestricted === true || includeAnonymous;
1686
+ if (crud === null || crud.is_anonymous && !includeAnonymous || crud.is_restricted && !includeRestricted) {
1561
1687
  switch (options?.or) {
1562
1688
  case "redirect": {
1563
- await this.redirectToSignIn({ replace: true });
1689
+ if (!crud?.is_anonymous && crud?.is_restricted) {
1690
+ await this.redirectToOnboarding({ replace: true });
1691
+ } else {
1692
+ await this.redirectToSignIn({ replace: true });
1693
+ }
1564
1694
  break;
1565
1695
  }
1566
1696
  case "throw": {
@@ -1568,7 +1698,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1568
1698
  }
1569
1699
  case "anonymous": {
1570
1700
  const tokens = await this._signUpAnonymously();
1571
- return await this.getUser({ tokenStore: tokens, or: "anonymous-if-exists[deprecated]" }) ?? (0, import_errors.throwErr)("Something went wrong while signing up anonymously");
1701
+ return await this.getUser({ tokenStore: tokens, or: "anonymous-if-exists[deprecated]", includeRestricted: true }) ?? (0, import_errors.throwErr)("Something went wrong while signing up anonymously");
1572
1702
  }
1573
1703
  case void 0:
1574
1704
  case "anonymous-if-exists[deprecated]":
@@ -1580,16 +1710,22 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1580
1710
  return crud && this._currentUserFromCrud(crud, session);
1581
1711
  }
1582
1712
  useUser(options) {
1713
+ if (options?.or === "anonymous" && options.includeRestricted === false) {
1714
+ throw new Error("Cannot use { or: 'anonymous' } with { includeRestricted: false }. Anonymous users implicitly include restricted users.");
1715
+ }
1583
1716
  this._ensurePersistentTokenStore(options?.tokenStore);
1584
1717
  const session = this._useSession(options?.tokenStore);
1585
1718
  let crud = (0, import_common3.useAsyncCache)(this._currentUserCache, [session], "clientApp.useUser()");
1586
- if (crud?.is_anonymous && options?.or !== "anonymous" && options?.or !== "anonymous-if-exists[deprecated]") {
1587
- crud = null;
1588
- }
1589
- if (crud === null) {
1719
+ const includeAnonymous = options?.or === "anonymous" || options?.or === "anonymous-if-exists[deprecated]";
1720
+ const includeRestricted = options?.includeRestricted === true || includeAnonymous;
1721
+ if (crud === null || crud.is_anonymous && !includeAnonymous || crud.is_restricted && !includeRestricted) {
1590
1722
  switch (options?.or) {
1591
1723
  case "redirect": {
1592
- (0, import_promises.runAsynchronously)(this.redirectToSignIn({ replace: true }));
1724
+ if (!crud?.is_anonymous && crud?.is_restricted) {
1725
+ (0, import_promises.runAsynchronously)(this.redirectToOnboarding({ replace: true }));
1726
+ } else {
1727
+ (0, import_promises.runAsynchronously)(this.redirectToSignIn({ replace: true }));
1728
+ }
1593
1729
  (0, import_react.suspend)();
1594
1730
  throw new import_errors.StackAssertionError("suspend should never return");
1595
1731
  }
@@ -1617,7 +1753,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1617
1753
  }, [crud, session, options?.or]);
1618
1754
  }
1619
1755
  _getTokenPartialUserFromSession(session, options) {
1620
- const accessToken = session.getAccessTokenIfNotExpiredYet(0);
1756
+ const accessToken = session.getAccessTokenIfNotExpiredYet(0, null);
1621
1757
  if (!accessToken) {
1622
1758
  return null;
1623
1759
  }
@@ -1630,7 +1766,9 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1630
1766
  primaryEmail: accessToken.payload.email,
1631
1767
  displayName: accessToken.payload.name,
1632
1768
  primaryEmailVerified: accessToken.payload.email_verified,
1633
- isAnonymous
1769
+ isAnonymous,
1770
+ isRestricted: accessToken.payload.is_restricted,
1771
+ restrictedReason: accessToken.payload.restricted_reason
1634
1772
  };
1635
1773
  }
1636
1774
  async _getPartialUserFromConvex(ctx) {
@@ -1643,7 +1781,9 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1643
1781
  displayName: auth.name ?? null,
1644
1782
  primaryEmail: auth.email ?? null,
1645
1783
  primaryEmailVerified: auth.email_verified,
1646
- isAnonymous: auth.is_anonymous
1784
+ isAnonymous: auth.is_anonymous,
1785
+ isRestricted: auth.is_restricted,
1786
+ restrictedReason: auth.restricted_reason ?? null
1647
1787
  };
1648
1788
  }
1649
1789
  async getPartialUser(options) {
@@ -1681,7 +1821,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1681
1821
  return async (args) => {
1682
1822
  const session = await this._getSession(options.tokenStore ?? this._tokenStoreInit);
1683
1823
  if (!args.forceRefreshToken) {
1684
- const tokens2 = await session.getOrFetchLikelyValidTokens(2e4);
1824
+ const tokens2 = await session.getOrFetchLikelyValidTokens(2e4, 75e3);
1685
1825
  return tokens2?.accessToken.token ?? null;
1686
1826
  }
1687
1827
  const tokens = await session.fetchNewTokens();
@@ -1690,7 +1830,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1690
1830
  }
1691
1831
  async getConvexHttpClientAuth(options) {
1692
1832
  const session = await this._getSession(options.tokenStore);
1693
- const tokens = await session.getOrFetchLikelyValidTokens(2e4);
1833
+ const tokens = await session.getOrFetchLikelyValidTokens(2e4, 75e3);
1694
1834
  return tokens?.accessToken.token ?? "";
1695
1835
  }
1696
1836
  async _updateClientUser(update, session) {
@@ -2037,11 +2177,44 @@ ${url}`);
2037
2177
  await user.signOut({ redirectUrl: options?.redirectUrl });
2038
2178
  }
2039
2179
  }
2180
+ async getAccessToken(options) {
2181
+ const user = await this.getUser({ tokenStore: options?.tokenStore ?? void 0 });
2182
+ if (user) {
2183
+ return await user.getAccessToken();
2184
+ }
2185
+ return null;
2186
+ }
2187
+ useAccessToken(options) {
2188
+ const user = this.useUser({ tokenStore: options?.tokenStore ?? void 0 });
2189
+ if (user) {
2190
+ return user.useAccessToken();
2191
+ }
2192
+ return null;
2193
+ }
2194
+ async getRefreshToken(options) {
2195
+ const user = await this.getUser({ tokenStore: options?.tokenStore ?? void 0 });
2196
+ if (user) {
2197
+ return await user.getRefreshToken();
2198
+ }
2199
+ return null;
2200
+ }
2201
+ useRefreshToken(options) {
2202
+ const user = this.useUser({ tokenStore: options?.tokenStore ?? void 0 });
2203
+ if (user) {
2204
+ return user.useRefreshToken();
2205
+ }
2206
+ return null;
2207
+ }
2040
2208
  async getAuthHeaders(options) {
2041
2209
  return {
2042
2210
  "x-stack-auth": JSON.stringify(await this.getAuthJson(options))
2043
2211
  };
2044
2212
  }
2213
+ useAuthHeaders(options) {
2214
+ return {
2215
+ "x-stack-auth": JSON.stringify(this.useAuthJson(options))
2216
+ };
2217
+ }
2045
2218
  async getAuthJson(options) {
2046
2219
  const user = await this.getUser({ tokenStore: options?.tokenStore ?? void 0 });
2047
2220
  if (user) {
@@ -2049,6 +2222,13 @@ ${url}`);
2049
2222
  }
2050
2223
  return { accessToken: null, refreshToken: null };
2051
2224
  }
2225
+ useAuthJson(options) {
2226
+ const user = this.useUser({ tokenStore: options?.tokenStore ?? void 0 });
2227
+ if (user) {
2228
+ return user.useAuthJson();
2229
+ }
2230
+ return { accessToken: null, refreshToken: null };
2231
+ }
2052
2232
  async getProject() {
2053
2233
  const crud = import_results.Result.orThrow(await this._currentProjectCache.getOrWait([], "write-only"));
2054
2234
  return this._clientProjectFromCrud(crud);
@@ -2085,6 +2265,7 @@ ${url}`);
2085
2265
  }
2086
2266
  async _refreshUser(session) {
2087
2267
  await this._refreshSession(session);
2268
+ session.suggestAccessTokenExpired();
2088
2269
  }
2089
2270
  async _refreshSession(session) {
2090
2271
  await this._currentUserCache.refresh([session]);