@stackframe/stack 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 +21 -18
  250. package/CHANGELOG.md +0 -2072
@@ -213,6 +213,11 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
213
213
  }, session);
214
214
  }
215
215
  );
216
+ this._customerBillingCache = (0, import_common2.createCacheBySession)(
217
+ async (session, [customerType, customerId]) => {
218
+ return await this._interface.getCustomerBilling(customerType, customerId, session);
219
+ }
220
+ );
216
221
  this._convexPartialUserCache = (0, import_common2.createCache)(
217
222
  async ([ctx]) => await this._getPartialUserFromConvex(ctx)
218
223
  );
@@ -449,7 +454,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
449
454
  if (!(0, import_env.isBrowserLike)()) {
450
455
  throw new import_errors.StackAssertionError("Cannot get browser cookies on the server!");
451
456
  }
452
- return cookie.parse(document.cookie || "");
457
+ return cookie.parseCookie(document.cookie || "");
453
458
  }
454
459
  _getRefreshTokenCookieNamePatterns() {
455
460
  return {
@@ -649,7 +654,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
649
654
  });
650
655
  }
651
656
  const cookieHeader = tokenStoreInit.headers.get("cookie");
652
- const parsed = cookie.parse(cookieHeader || "");
657
+ const parsed = cookie.parseCookie(cookieHeader || "");
653
658
  const res = new import_stores.Store(this._getTokensFromCookies(parsed));
654
659
  this._requestTokenStores.set(tokenStoreInit, res);
655
660
  return res;
@@ -970,32 +975,92 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
970
975
  displayName: item.product.display_name,
971
976
  customerType: item.product.customer_type,
972
977
  isServerOnly: item.product.server_only,
973
- stackable: item.product.stackable
978
+ stackable: item.product.stackable,
979
+ type: item.type,
980
+ subscription: item.subscription ? {
981
+ currentPeriodEnd: item.subscription.current_period_end ? new Date(item.subscription.current_period_end) : null,
982
+ cancelAtPeriodEnd: item.subscription.cancel_at_period_end,
983
+ isCancelable: item.subscription.is_cancelable
984
+ } : null,
985
+ switchOptions: item.switch_options?.map((option) => ({
986
+ productId: option.product_id,
987
+ displayName: option.product.display_name,
988
+ prices: option.product.prices
989
+ }))
974
990
  }));
975
991
  return Object.assign(products, { nextCursor: response.pagination.next_cursor ?? null });
976
992
  }
993
+ _customerBillingFromResponse(response) {
994
+ return {
995
+ hasCustomer: response.has_customer,
996
+ defaultPaymentMethod: response.default_payment_method
997
+ };
998
+ }
977
999
  _createAuth(session) {
978
1000
  const app = this;
979
1001
  return {
980
1002
  _internalSession: session,
981
1003
  currentSession: {
982
1004
  async getTokens() {
983
- const tokens = await session.getOrFetchLikelyValidTokens(2e4);
1005
+ const tokens = await session.getOrFetchLikelyValidTokens(2e4, 75e3);
984
1006
  return {
985
1007
  accessToken: tokens?.accessToken.token ?? null,
986
1008
  refreshToken: tokens?.refreshToken?.token ?? null
987
1009
  };
1010
+ },
1011
+ useTokens() {
1012
+ const [_, setCounter] = import_react2.default.useState(0);
1013
+ import_react2.default.useEffect(() => {
1014
+ const { unsubscribe: unsubscribeRefresh } = session.startRefreshingAccessToken(3e4, 6e4);
1015
+ const { unsubscribe: unsubscribeInvalidate } = session.onInvalidate(() => setCounter((c) => c + 1));
1016
+ const { unsubscribe: unsubscribeAccessTokenChange } = session.onAccessTokenChange(() => setCounter((c) => c + 1));
1017
+ return () => {
1018
+ unsubscribeRefresh();
1019
+ unsubscribeInvalidate();
1020
+ unsubscribeAccessTokenChange();
1021
+ };
1022
+ }, []);
1023
+ let accessToken = session.isKnownToBeInvalid() ? null : session.getAccessTokenIfNotExpiredYet(2e4, 75e3);
1024
+ if (accessToken === null) {
1025
+ accessToken = (0, import_react.use)(session.getOrFetchLikelyValidTokens(2e4, 75e3))?.accessToken ?? null;
1026
+ }
1027
+ return {
1028
+ accessToken: accessToken?.token ?? null,
1029
+ refreshToken: session.getRefreshToken()?.token ?? null
1030
+ };
988
1031
  }
989
1032
  },
1033
+ async getAccessToken() {
1034
+ const tokens = await this.currentSession.getTokens();
1035
+ return tokens.accessToken;
1036
+ },
1037
+ useAccessToken() {
1038
+ return this.currentSession.useTokens().accessToken;
1039
+ },
1040
+ async getRefreshToken() {
1041
+ const tokens = await this.currentSession.getTokens();
1042
+ return tokens.refreshToken;
1043
+ },
1044
+ useRefreshToken() {
1045
+ return this.currentSession.useTokens().refreshToken;
1046
+ },
990
1047
  async getAuthHeaders() {
991
1048
  return {
992
1049
  "x-stack-auth": JSON.stringify(await this.getAuthJson())
993
1050
  };
994
1051
  },
1052
+ useAuthHeaders() {
1053
+ return {
1054
+ "x-stack-auth": JSON.stringify(this.useAuthJson())
1055
+ };
1056
+ },
995
1057
  async getAuthJson() {
996
1058
  const tokens = await this.currentSession.getTokens();
997
1059
  return tokens;
998
1060
  },
1061
+ useAuthJson() {
1062
+ return this.currentSession.useTokens();
1063
+ },
999
1064
  signOut(options) {
1000
1065
  return app._signOut(session, options);
1001
1066
  }
@@ -1036,6 +1101,8 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1036
1101
  passkeyAuthEnabled: crud.passkey_auth_enabled,
1037
1102
  isMultiFactorRequired: crud.requires_totp_mfa,
1038
1103
  isAnonymous: crud.is_anonymous,
1104
+ isRestricted: crud.is_restricted,
1105
+ restrictedReason: crud.restricted_reason,
1039
1106
  toClientJson() {
1040
1107
  return crud;
1041
1108
  }
@@ -1066,7 +1133,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1066
1133
  return this.update({ clientMetadata: metadata });
1067
1134
  },
1068
1135
  async setSelectedTeam(team) {
1069
- await this.update({ selectedTeamId: team?.id ?? null });
1136
+ await this.update({ selectedTeamId: typeof team === "string" ? team : team?.id ?? null });
1070
1137
  },
1071
1138
  getConnectedAccount,
1072
1139
  useConnectedAccount,
@@ -1297,8 +1364,29 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1297
1364
  }
1298
1365
  _createCustomer(userIdOrTeamId, type, session) {
1299
1366
  const app = this;
1367
+ const effectiveSession = session ?? app._interface.createSession({ refreshToken: null });
1300
1368
  const customerOptions = type === "user" ? { userId: userIdOrTeamId } : { teamId: userIdOrTeamId };
1301
1369
  return {
1370
+ async getBilling() {
1371
+ const response = import_results.Result.orThrow(await app._customerBillingCache.getOrWait([effectiveSession, type, userIdOrTeamId], "write-only"));
1372
+ return app._customerBillingFromResponse(response);
1373
+ },
1374
+ useBilling() {
1375
+ const response = (0, import_common3.useAsyncCache)(app._customerBillingCache, [effectiveSession, type, userIdOrTeamId], "customer.useBilling()");
1376
+ return app._customerBillingFromResponse(response);
1377
+ },
1378
+ async createPaymentMethodSetupIntent() {
1379
+ const body = await app._interface.createCustomerPaymentMethodSetupIntent(type, userIdOrTeamId, effectiveSession);
1380
+ return {
1381
+ clientSecret: body.client_secret,
1382
+ stripeAccountId: body.stripe_account_id
1383
+ };
1384
+ },
1385
+ async setDefaultPaymentMethodFromSetupIntent(setupIntentId) {
1386
+ const body = await app._interface.setDefaultCustomerPaymentMethodFromSetupIntent(type, userIdOrTeamId, setupIntentId, effectiveSession);
1387
+ await app._customerBillingCache.refresh([effectiveSession, type, userIdOrTeamId]);
1388
+ return body.default_payment_method;
1389
+ },
1302
1390
  async getItem(itemId) {
1303
1391
  return await app.getItem({ itemId, ...customerOptions });
1304
1392
  },
@@ -1312,7 +1400,23 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1312
1400
  return app.useProducts({ ...options, ...customerOptions });
1313
1401
  },
1314
1402
  async createCheckoutUrl(options) {
1315
- return await app._interface.createCheckoutUrl(type, userIdOrTeamId, options.productId, session, options.returnUrl);
1403
+ return await app._interface.createCheckoutUrl(type, userIdOrTeamId, options.productId, effectiveSession, options.returnUrl);
1404
+ },
1405
+ async switchSubscription(options) {
1406
+ await app._interface.switchSubscription({
1407
+ customer_type: type,
1408
+ customer_id: userIdOrTeamId,
1409
+ from_product_id: options.fromProductId,
1410
+ to_product_id: options.toProductId,
1411
+ price_id: options.priceId,
1412
+ quantity: options.quantity
1413
+ }, effectiveSession);
1414
+ await app._customerBillingCache.refresh([effectiveSession, type, userIdOrTeamId]);
1415
+ if (type === "user") {
1416
+ await app._userProductsCache.invalidateWhere(([cachedSession, userId]) => cachedSession === effectiveSession && userId === userIdOrTeamId);
1417
+ } else {
1418
+ await app._teamProductsCache.invalidateWhere(([cachedSession, teamId]) => cachedSession === effectiveSession && teamId === userIdOrTeamId);
1419
+ }
1316
1420
  }
1317
1421
  };
1318
1422
  }
@@ -1346,6 +1450,25 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1346
1450
  const response = import_results.Result.orThrow(await this._customProductsCache.getOrWait([session, options.customCustomerId, options.cursor ?? null, options.limit ?? null], "write-only"));
1347
1451
  return this._customerProductsFromResponse(response);
1348
1452
  }
1453
+ async cancelSubscription(options) {
1454
+ const session = await this._getSession();
1455
+ const user = await this.getUser();
1456
+ if (!user) {
1457
+ throw new import_stack_shared.KnownErrors.UserAuthenticationRequired();
1458
+ }
1459
+ const customerType = "teamId" in options ? "team" : "user";
1460
+ const customerId = "teamId" in options ? options.teamId : user.id;
1461
+ await this._interface.cancelSubscription({
1462
+ customer_type: customerType,
1463
+ customer_id: customerId,
1464
+ product_id: options.productId
1465
+ }, session);
1466
+ if (customerType === "user") {
1467
+ await this._userProductsCache.invalidateWhere(([cachedSession, userId]) => cachedSession === session && userId === customerId);
1468
+ } else {
1469
+ await this._teamProductsCache.invalidateWhere(([cachedSession, teamId]) => cachedSession === session && teamId === customerId);
1470
+ }
1471
+ }
1349
1472
  useProducts(options) {
1350
1473
  const session = this._useSession();
1351
1474
  const cache = "userId" in options ? this._userProductsCache : "teamId" in options ? this._teamProductsCache : this._customProductsCache;
@@ -1355,15 +1478,13 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1355
1478
  return this._customerProductsFromResponse(response);
1356
1479
  }
1357
1480
  _currentUserFromCrud(crud, session) {
1358
- const currentUser = {
1481
+ const currentUser = (0, import_users.withUserDestructureGuard)({
1359
1482
  ...this._createBaseUser(crud),
1360
1483
  ...this._createAuth(session),
1361
1484
  ...this._createUserExtraFromCurrent(crud, session),
1362
1485
  ...this._isInternalProject() ? this._createInternalUserExtra(session) : {},
1363
1486
  ...this._createCustomer(crud.id, "user", session)
1364
- };
1365
- (0, import_users.attachUserDestructureGuard)(currentUser);
1366
- Object.freeze(currentUser);
1487
+ });
1367
1488
  return currentUser;
1368
1489
  }
1369
1490
  _clientSessionFromCrud(crud) {
@@ -1451,7 +1572,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1451
1572
  const queryParams = new URLSearchParams(window.location.search);
1452
1573
  url = queryParams.get("after_auth_return_to") || url;
1453
1574
  }
1454
- } else if (handlerName === "signIn" || handlerName === "signUp") {
1575
+ } else if (handlerName === "signIn" || handlerName === "signUp" || handlerName === "onboarding") {
1455
1576
  if (isReactServer2 || typeof window === "undefined") {
1456
1577
  } else {
1457
1578
  const currentUrl = new URL(window.location.href);
@@ -1500,6 +1621,9 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1500
1621
  async redirectToAfterSignUp(options) {
1501
1622
  return await this._redirectToHandler("afterSignUp", options);
1502
1623
  }
1624
+ async redirectToOnboarding(options) {
1625
+ return await this._redirectToHandler("onboarding", options);
1626
+ }
1503
1627
  async redirectToAfterSignOut(options) {
1504
1628
  return await this._redirectToHandler("afterSignOut", options);
1505
1629
  }
@@ -1565,16 +1689,22 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1565
1689
  return result;
1566
1690
  }
1567
1691
  async getUser(options) {
1692
+ if (options?.or === "anonymous" && options.includeRestricted === false) {
1693
+ throw new Error("Cannot use { or: 'anonymous' } with { includeRestricted: false }. Anonymous users implicitly include restricted users.");
1694
+ }
1568
1695
  this._ensurePersistentTokenStore(options?.tokenStore);
1569
1696
  const session = await this._getSession(options?.tokenStore);
1570
1697
  let crud = import_results.Result.orThrow(await this._currentUserCache.getOrWait([session], "write-only"));
1571
- if (crud?.is_anonymous && options?.or !== "anonymous" && options?.or !== "anonymous-if-exists[deprecated]") {
1572
- crud = null;
1573
- }
1574
- if (crud === null) {
1698
+ const includeAnonymous = options?.or === "anonymous" || options?.or === "anonymous-if-exists[deprecated]";
1699
+ const includeRestricted = options?.includeRestricted === true || includeAnonymous;
1700
+ if (crud === null || crud.is_anonymous && !includeAnonymous || crud.is_restricted && !includeRestricted) {
1575
1701
  switch (options?.or) {
1576
1702
  case "redirect": {
1577
- await this.redirectToSignIn({ replace: true });
1703
+ if (!crud?.is_anonymous && crud?.is_restricted) {
1704
+ await this.redirectToOnboarding({ replace: true });
1705
+ } else {
1706
+ await this.redirectToSignIn({ replace: true });
1707
+ }
1578
1708
  break;
1579
1709
  }
1580
1710
  case "throw": {
@@ -1582,7 +1712,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1582
1712
  }
1583
1713
  case "anonymous": {
1584
1714
  const tokens = await this._signUpAnonymously();
1585
- return await this.getUser({ tokenStore: tokens, or: "anonymous-if-exists[deprecated]" }) ?? (0, import_errors.throwErr)("Something went wrong while signing up anonymously");
1715
+ return await this.getUser({ tokenStore: tokens, or: "anonymous-if-exists[deprecated]", includeRestricted: true }) ?? (0, import_errors.throwErr)("Something went wrong while signing up anonymously");
1586
1716
  }
1587
1717
  case void 0:
1588
1718
  case "anonymous-if-exists[deprecated]":
@@ -1594,16 +1724,22 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1594
1724
  return crud && this._currentUserFromCrud(crud, session);
1595
1725
  }
1596
1726
  useUser(options) {
1727
+ if (options?.or === "anonymous" && options.includeRestricted === false) {
1728
+ throw new Error("Cannot use { or: 'anonymous' } with { includeRestricted: false }. Anonymous users implicitly include restricted users.");
1729
+ }
1597
1730
  this._ensurePersistentTokenStore(options?.tokenStore);
1598
1731
  const session = this._useSession(options?.tokenStore);
1599
1732
  let crud = (0, import_common3.useAsyncCache)(this._currentUserCache, [session], "clientApp.useUser()");
1600
- if (crud?.is_anonymous && options?.or !== "anonymous" && options?.or !== "anonymous-if-exists[deprecated]") {
1601
- crud = null;
1602
- }
1603
- if (crud === null) {
1733
+ const includeAnonymous = options?.or === "anonymous" || options?.or === "anonymous-if-exists[deprecated]";
1734
+ const includeRestricted = options?.includeRestricted === true || includeAnonymous;
1735
+ if (crud === null || crud.is_anonymous && !includeAnonymous || crud.is_restricted && !includeRestricted) {
1604
1736
  switch (options?.or) {
1605
1737
  case "redirect": {
1606
- (0, import_promises.runAsynchronously)(this.redirectToSignIn({ replace: true }));
1738
+ if (!crud?.is_anonymous && crud?.is_restricted) {
1739
+ (0, import_promises.runAsynchronously)(this.redirectToOnboarding({ replace: true }));
1740
+ } else {
1741
+ (0, import_promises.runAsynchronously)(this.redirectToSignIn({ replace: true }));
1742
+ }
1607
1743
  (0, import_react.suspend)();
1608
1744
  throw new import_errors.StackAssertionError("suspend should never return");
1609
1745
  }
@@ -1631,7 +1767,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1631
1767
  }, [crud, session, options?.or]);
1632
1768
  }
1633
1769
  _getTokenPartialUserFromSession(session, options) {
1634
- const accessToken = session.getAccessTokenIfNotExpiredYet(0);
1770
+ const accessToken = session.getAccessTokenIfNotExpiredYet(0, null);
1635
1771
  if (!accessToken) {
1636
1772
  return null;
1637
1773
  }
@@ -1644,7 +1780,9 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1644
1780
  primaryEmail: accessToken.payload.email,
1645
1781
  displayName: accessToken.payload.name,
1646
1782
  primaryEmailVerified: accessToken.payload.email_verified,
1647
- isAnonymous
1783
+ isAnonymous,
1784
+ isRestricted: accessToken.payload.is_restricted,
1785
+ restrictedReason: accessToken.payload.restricted_reason
1648
1786
  };
1649
1787
  }
1650
1788
  async _getPartialUserFromConvex(ctx) {
@@ -1657,7 +1795,9 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1657
1795
  displayName: auth.name ?? null,
1658
1796
  primaryEmail: auth.email ?? null,
1659
1797
  primaryEmailVerified: auth.email_verified,
1660
- isAnonymous: auth.is_anonymous
1798
+ isAnonymous: auth.is_anonymous,
1799
+ isRestricted: auth.is_restricted,
1800
+ restrictedReason: auth.restricted_reason ?? null
1661
1801
  };
1662
1802
  }
1663
1803
  async getPartialUser(options) {
@@ -1695,7 +1835,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1695
1835
  return async (args) => {
1696
1836
  const session = await this._getSession(options.tokenStore ?? this._tokenStoreInit);
1697
1837
  if (!args.forceRefreshToken) {
1698
- const tokens2 = await session.getOrFetchLikelyValidTokens(2e4);
1838
+ const tokens2 = await session.getOrFetchLikelyValidTokens(2e4, 75e3);
1699
1839
  return tokens2?.accessToken.token ?? null;
1700
1840
  }
1701
1841
  const tokens = await session.fetchNewTokens();
@@ -1704,7 +1844,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1704
1844
  }
1705
1845
  async getConvexHttpClientAuth(options) {
1706
1846
  const session = await this._getSession(options.tokenStore);
1707
- const tokens = await session.getOrFetchLikelyValidTokens(2e4);
1847
+ const tokens = await session.getOrFetchLikelyValidTokens(2e4, 75e3);
1708
1848
  return tokens?.accessToken.token ?? "";
1709
1849
  }
1710
1850
  async _updateClientUser(update, session) {
@@ -2051,11 +2191,44 @@ ${url}`);
2051
2191
  await user.signOut({ redirectUrl: options?.redirectUrl });
2052
2192
  }
2053
2193
  }
2194
+ async getAccessToken(options) {
2195
+ const user = await this.getUser({ tokenStore: options?.tokenStore ?? void 0 });
2196
+ if (user) {
2197
+ return await user.getAccessToken();
2198
+ }
2199
+ return null;
2200
+ }
2201
+ useAccessToken(options) {
2202
+ const user = this.useUser({ tokenStore: options?.tokenStore ?? void 0 });
2203
+ if (user) {
2204
+ return user.useAccessToken();
2205
+ }
2206
+ return null;
2207
+ }
2208
+ async getRefreshToken(options) {
2209
+ const user = await this.getUser({ tokenStore: options?.tokenStore ?? void 0 });
2210
+ if (user) {
2211
+ return await user.getRefreshToken();
2212
+ }
2213
+ return null;
2214
+ }
2215
+ useRefreshToken(options) {
2216
+ const user = this.useUser({ tokenStore: options?.tokenStore ?? void 0 });
2217
+ if (user) {
2218
+ return user.useRefreshToken();
2219
+ }
2220
+ return null;
2221
+ }
2054
2222
  async getAuthHeaders(options) {
2055
2223
  return {
2056
2224
  "x-stack-auth": JSON.stringify(await this.getAuthJson(options))
2057
2225
  };
2058
2226
  }
2227
+ useAuthHeaders(options) {
2228
+ return {
2229
+ "x-stack-auth": JSON.stringify(this.useAuthJson(options))
2230
+ };
2231
+ }
2059
2232
  async getAuthJson(options) {
2060
2233
  const user = await this.getUser({ tokenStore: options?.tokenStore ?? void 0 });
2061
2234
  if (user) {
@@ -2063,6 +2236,13 @@ ${url}`);
2063
2236
  }
2064
2237
  return { accessToken: null, refreshToken: null };
2065
2238
  }
2239
+ useAuthJson(options) {
2240
+ const user = this.useUser({ tokenStore: options?.tokenStore ?? void 0 });
2241
+ if (user) {
2242
+ return user.useAuthJson();
2243
+ }
2244
+ return { accessToken: null, refreshToken: null };
2245
+ }
2066
2246
  async getProject() {
2067
2247
  const crud = import_results.Result.orThrow(await this._currentProjectCache.getOrWait([], "write-only"));
2068
2248
  return this._clientProjectFromCrud(crud);
@@ -2099,6 +2279,7 @@ ${url}`);
2099
2279
  }
2100
2280
  async _refreshUser(session) {
2101
2281
  await this._refreshSession(session);
2282
+ session.suggestAccessTokenExpired();
2102
2283
  }
2103
2284
  async _refreshSession(session) {
2104
2285
  await this._currentUserCache.refresh([session]);