@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
package/dist/index.d.ts CHANGED
@@ -42,6 +42,15 @@ type RedirectMethod = "window" | "none" | {
42
42
  };
43
43
  type GetCurrentUserOptions<HasTokenStore> = {
44
44
  or?: 'redirect' | 'throw' | 'return-null' | 'anonymous' | /** @deprecated */ 'anonymous-if-exists[deprecated]';
45
+ /**
46
+ * Whether to include restricted users (users who haven't completed onboarding requirements like email verification).
47
+ * By default, restricted users are filtered out (treated similar to anonymous users).
48
+ *
49
+ * Note: This option cannot be set to false when `or: 'anonymous'` is used, as all anonymous users are also restricted.
50
+ *
51
+ * @default false
52
+ */
53
+ includeRestricted?: boolean;
45
54
  tokenStore?: TokenStoreInit;
46
55
  } & (HasTokenStore extends false ? {
47
56
  tokenStore: TokenStoreInit;
@@ -89,6 +98,7 @@ type HandlerUrls = {
89
98
  teamInvitation: string;
90
99
  mfa: string;
91
100
  error: string;
101
+ onboarding: string;
92
102
  };
93
103
  type OAuthScopesOnSignIn = {
94
104
  [key in ProviderType]: string[];
@@ -104,6 +114,22 @@ type AuthLike<ExtraOptions = {}> = {
104
114
  signOut(options?: {
105
115
  redirectUrl?: URL | string;
106
116
  }): Promise<void>;
117
+ /**
118
+ * Returns the current access token, or null if the user is not signed in.
119
+ *
120
+ * The access token is a short-lived JWT that can be used to authenticate requests to external servers.
121
+ * It will be automatically refreshed when it expires.
122
+ */
123
+ getAccessToken(options?: {} & ExtraOptions): Promise<string | null>;
124
+ useAccessToken(options?: {} & ExtraOptions): string | null;
125
+ /**
126
+ * Returns the current refresh token, or null if the user is not signed in.
127
+ *
128
+ * The refresh token is a long-lived token that can be used to obtain new access tokens.
129
+ * It should be kept secret and never exposed to the client.
130
+ */
131
+ getRefreshToken(options?: {} & ExtraOptions): Promise<string | null>;
132
+ useRefreshToken(options?: {} & ExtraOptions): string | null;
107
133
  /**
108
134
  * Returns headers for sending authenticated HTTP requests to external servers. Most commonly used in cross-origin
109
135
  * requests. Similar to `getAuthJson`, but specifically for HTTP requests.
@@ -120,8 +146,8 @@ type AuthLike<ExtraOptions = {}> = {
120
146
  * must include `x-stack-auth` in the [`Access-Control-Allow-Headers` header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers)
121
147
  * of the CORS preflight response.
122
148
  *
123
- * If you are not using HTTP (and hence cannot set headers), you will need to use the `getAuthJson()` function
124
- * instead.
149
+ * If you are not using HTTP (and hence cannot set headers), you will need to use the `getAccessToken()` and
150
+ * `getRefreshToken()` functions instead.
125
151
  *
126
152
  * Example:
127
153
  *
@@ -144,7 +170,12 @@ type AuthLike<ExtraOptions = {}> = {
144
170
  getAuthHeaders(options?: {} & ExtraOptions): Promise<{
145
171
  "x-stack-auth": string;
146
172
  }>;
173
+ useAuthHeaders(options?: {} & ExtraOptions): {
174
+ "x-stack-auth": string;
175
+ };
147
176
  /**
177
+ * @deprecated Use `getAccessToken()` and `getRefreshToken()` instead.
178
+ *
148
179
  * Creates a JSON-serializable object containing the information to authenticate a user on an external server.
149
180
  * Similar to `getAuthHeaders`, but returns an object that can be sent over any protocol instead of just
150
181
  * HTTP headers.
@@ -175,6 +206,11 @@ type AuthLike<ExtraOptions = {}> = {
175
206
  accessToken: string | null;
176
207
  refreshToken: string | null;
177
208
  }>;
209
+ /** @deprecated Use `useAccessToken()` and `useRefreshToken()` instead. */
210
+ useAuthJson(options?: {} & ExtraOptions): {
211
+ accessToken: string | null;
212
+ refreshToken: string | null;
213
+ };
178
214
  };
179
215
  /** @internal */
180
216
  declare const stackAppInternalsSymbol: unique symbol;
@@ -213,6 +249,17 @@ type CustomerProduct = {
213
249
  customerType: "user" | "team" | "custom";
214
250
  isServerOnly: boolean;
215
251
  stackable: boolean;
252
+ type: "one_time" | "subscription";
253
+ subscription: null | {
254
+ currentPeriodEnd: Date | null;
255
+ cancelAtPeriodEnd: boolean;
256
+ isCancelable: boolean;
257
+ };
258
+ switchOptions?: Array<{
259
+ productId: string;
260
+ displayName: string;
261
+ prices: InlineProduct["prices"];
262
+ }>;
216
263
  };
217
264
  type CustomerProductsList = CustomerProduct[] & {
218
265
  nextCursor: string | null;
@@ -228,6 +275,21 @@ type CustomerProductsRequestOptions = ({
228
275
  } & CustomerProductsListOptions) | ({
229
276
  customCustomerId: string;
230
277
  } & CustomerProductsListOptions);
278
+ type CustomerDefaultPaymentMethod = {
279
+ id: string;
280
+ brand: string | null;
281
+ last4: string | null;
282
+ exp_month: number | null;
283
+ exp_year: number | null;
284
+ } | null;
285
+ type CustomerBilling = {
286
+ hasCustomer: boolean;
287
+ defaultPaymentMethod: CustomerDefaultPaymentMethod;
288
+ };
289
+ type CustomerPaymentMethodSetupIntent = {
290
+ clientSecret: string;
291
+ stripeAccountId: string;
292
+ };
231
293
  type Customer<IsServer extends boolean = false> = {
232
294
  readonly id: string;
233
295
  createCheckoutUrl(options: ({
@@ -237,7 +299,16 @@ type Customer<IsServer extends boolean = false> = {
237
299
  product: InlineProduct;
238
300
  returnUrl?: string;
239
301
  } : never))): Promise<string>;
240
- } & AsyncStoreProperty<"item", [
302
+ createPaymentMethodSetupIntent(): Promise<CustomerPaymentMethodSetupIntent>;
303
+ setDefaultPaymentMethodFromSetupIntent(setupIntentId: string): Promise<CustomerDefaultPaymentMethod>;
304
+ switchSubscription(options: {
305
+ fromProductId: string;
306
+ toProductId: string;
307
+ priceId?: string;
308
+ quantity?: number;
309
+ }): Promise<void>;
310
+ } & AsyncStoreProperty<"billing", [
311
+ ], CustomerBilling, false> & AsyncStoreProperty<"item", [
241
312
  itemId: string
242
313
  ], IsServer extends true ? ServerItem : Item, false> & AsyncStoreProperty<"products", [
243
314
  options?: CustomerProductsListOptions
@@ -259,6 +330,137 @@ type AdminSentEmail = {
259
330
  sentAt: Date;
260
331
  error?: unknown;
261
332
  };
333
+ type AdminEmailOutboxRecipient = {
334
+ type: "user-primary-email";
335
+ userId: string;
336
+ } | {
337
+ type: "user-custom-emails";
338
+ userId: string;
339
+ emails: string[];
340
+ } | {
341
+ type: "custom-emails";
342
+ emails: string[];
343
+ };
344
+ type AdminEmailOutboxStatus = "paused" | "preparing" | "rendering" | "render-error" | "scheduled" | "queued" | "sending" | "server-error" | "skipped" | "bounced" | "delivery-delayed" | "sent" | "opened" | "clicked" | "marked-as-spam";
345
+ type AdminEmailOutboxSimpleStatus = "in-progress" | "ok" | "error";
346
+ type AdminEmailOutboxBase = {
347
+ id: string;
348
+ createdAt: Date;
349
+ updatedAt: Date;
350
+ to: AdminEmailOutboxRecipient;
351
+ scheduledAt: Date;
352
+ isPaused: false;
353
+ hasRendered: false;
354
+ hasDelivered: false;
355
+ };
356
+ type AdminEmailOutboxRenderedFields = Omit<AdminEmailOutboxBase, "hasRendered"> & {
357
+ hasRendered: true;
358
+ startedRenderingAt: Date;
359
+ renderedAt: Date;
360
+ subject: string;
361
+ html: string | null;
362
+ text: string | null;
363
+ isTransactional: boolean;
364
+ isHighPriority: boolean;
365
+ notificationCategoryId: string | null;
366
+ };
367
+ type AdminEmailOutboxStartedSendingFields = AdminEmailOutboxRenderedFields & {
368
+ startedSendingAt: Date;
369
+ };
370
+ type AdminEmailOutboxFinishedDeliveringFields = Omit<AdminEmailOutboxStartedSendingFields, "hasDelivered"> & {
371
+ hasDelivered: true;
372
+ deliveredAt: Date;
373
+ };
374
+ type AdminEmailOutboxPaused = Omit<AdminEmailOutboxBase, "isPaused"> & {
375
+ status: "paused";
376
+ simpleStatus: "in-progress";
377
+ isPaused: true;
378
+ };
379
+ type AdminEmailOutboxPreparing = AdminEmailOutboxBase & {
380
+ status: "preparing";
381
+ simpleStatus: "in-progress";
382
+ };
383
+ type AdminEmailOutboxRendering = AdminEmailOutboxBase & {
384
+ status: "rendering";
385
+ simpleStatus: "in-progress";
386
+ startedRenderingAt: Date;
387
+ };
388
+ type AdminEmailOutboxRenderError = AdminEmailOutboxBase & {
389
+ status: "render-error";
390
+ simpleStatus: "error";
391
+ startedRenderingAt: Date;
392
+ renderedAt: Date;
393
+ renderError: string;
394
+ };
395
+ type AdminEmailOutboxScheduled = AdminEmailOutboxRenderedFields & {
396
+ status: "scheduled";
397
+ simpleStatus: "in-progress";
398
+ };
399
+ type AdminEmailOutboxQueued = AdminEmailOutboxRenderedFields & {
400
+ status: "queued";
401
+ simpleStatus: "in-progress";
402
+ };
403
+ type AdminEmailOutboxSending = AdminEmailOutboxStartedSendingFields & {
404
+ status: "sending";
405
+ simpleStatus: "in-progress";
406
+ };
407
+ type AdminEmailOutboxServerError = AdminEmailOutboxStartedSendingFields & {
408
+ status: "server-error";
409
+ simpleStatus: "error";
410
+ errorAt: Date;
411
+ serverError: string;
412
+ };
413
+ type AdminEmailOutboxSkipped = Omit<AdminEmailOutboxBase, "hasRendered"> & {
414
+ status: "skipped";
415
+ simpleStatus: "ok";
416
+ hasRendered: boolean;
417
+ skippedAt: Date;
418
+ skippedReason: string;
419
+ skippedDetails: Record<string, unknown>;
420
+ startedRenderingAt?: Date;
421
+ renderedAt?: Date;
422
+ subject?: string;
423
+ html?: string | null;
424
+ text?: string | null;
425
+ isTransactional?: boolean;
426
+ isHighPriority?: boolean;
427
+ notificationCategoryId?: string | null;
428
+ startedSendingAt?: Date;
429
+ };
430
+ type AdminEmailOutboxBounced = AdminEmailOutboxStartedSendingFields & {
431
+ status: "bounced";
432
+ simpleStatus: "error";
433
+ bouncedAt: Date;
434
+ };
435
+ type AdminEmailOutboxDeliveryDelayed = AdminEmailOutboxStartedSendingFields & {
436
+ status: "delivery-delayed";
437
+ simpleStatus: "ok";
438
+ deliveryDelayedAt: Date;
439
+ };
440
+ type AdminEmailOutboxSent = AdminEmailOutboxFinishedDeliveringFields & {
441
+ status: "sent";
442
+ simpleStatus: "ok";
443
+ canHaveDeliveryInfo: boolean;
444
+ };
445
+ type AdminEmailOutboxOpened = AdminEmailOutboxFinishedDeliveringFields & {
446
+ status: "opened";
447
+ simpleStatus: "ok";
448
+ openedAt: Date;
449
+ canHaveDeliveryInfo: true;
450
+ };
451
+ type AdminEmailOutboxClicked = AdminEmailOutboxFinishedDeliveringFields & {
452
+ status: "clicked";
453
+ simpleStatus: "ok";
454
+ clickedAt: Date;
455
+ canHaveDeliveryInfo: true;
456
+ };
457
+ type AdminEmailOutboxMarkedAsSpam = AdminEmailOutboxFinishedDeliveringFields & {
458
+ status: "marked-as-spam";
459
+ simpleStatus: "ok";
460
+ markedAsSpamAt: Date;
461
+ canHaveDeliveryInfo: true;
462
+ };
463
+ type AdminEmailOutbox = AdminEmailOutboxPaused | AdminEmailOutboxPreparing | AdminEmailOutboxRendering | AdminEmailOutboxRenderError | AdminEmailOutboxScheduled | AdminEmailOutboxQueued | AdminEmailOutboxSending | AdminEmailOutboxServerError | AdminEmailOutboxSkipped | AdminEmailOutboxBounced | AdminEmailOutboxDeliveryDelayed | AdminEmailOutboxSent | AdminEmailOutboxOpened | AdminEmailOutboxClicked | AdminEmailOutboxMarkedAsSpam;
262
464
  type SendEmailOptionsBase = {
263
465
  themeId?: string | null | false;
264
466
  subject?: string;
@@ -283,6 +485,25 @@ type SendEmailOptions = SendEmailOptionsBase & XOR<[
283
485
  draftId: string;
284
486
  }
285
487
  ]>;
488
+ type EmailDeliveryWindowStats = {
489
+ sent: number;
490
+ bounced: number;
491
+ marked_as_spam: number;
492
+ };
493
+ type EmailDeliveryStats = {
494
+ hour: EmailDeliveryWindowStats;
495
+ day: EmailDeliveryWindowStats;
496
+ week: EmailDeliveryWindowStats;
497
+ month: EmailDeliveryWindowStats;
498
+ };
499
+ type EmailDeliveryCapacity = {
500
+ rate_per_second: number;
501
+ penalty_factor: number;
502
+ };
503
+ type EmailDeliveryInfo = {
504
+ stats: EmailDeliveryStats;
505
+ capacity: EmailDeliveryCapacity;
506
+ };
286
507
 
287
508
  type InternalApiKeyBase = {
288
509
  id: string;
@@ -485,18 +706,21 @@ type ServerOAuthProvider = {
485
706
  }): Promise<Result<void, InstanceType<typeof KnownErrors.OAuthProviderAccountIdAlreadyUsedForSignIn>>>;
486
707
  delete(): Promise<void>;
487
708
  };
488
- type Session = {
489
- getTokens(): Promise<{
490
- accessToken: string | null;
491
- refreshToken: string | null;
492
- }>;
493
- };
494
709
  /**
495
710
  * Contains everything related to the current user session.
496
711
  */
497
712
  type Auth = AuthLike<{}> & {
498
713
  readonly _internalSession: InternalSession;
499
- readonly currentSession: Session;
714
+ readonly currentSession: {
715
+ getTokens(): Promise<{
716
+ accessToken: string | null;
717
+ refreshToken: string | null;
718
+ }>;
719
+ useTokens(): {
720
+ accessToken: string | null;
721
+ refreshToken: string | null;
722
+ };
723
+ };
500
724
  };
501
725
  /**
502
726
  * ```
@@ -542,6 +766,18 @@ type BaseUser = {
542
766
  readonly passkeyAuthEnabled: boolean;
543
767
  readonly isMultiFactorRequired: boolean;
544
768
  readonly isAnonymous: boolean;
769
+ /**
770
+ * Whether the user is in restricted state (signed up but hasn't completed onboarding requirements).
771
+ * For example, if email verification is required but the user hasn't verified their email yet.
772
+ */
773
+ readonly isRestricted: boolean;
774
+ /**
775
+ * The reason why the user is restricted, e.g., { type: "email_not_verified" } or { type: "anonymous" }.
776
+ * Null if the user is not restricted.
777
+ */
778
+ readonly restrictedReason: {
779
+ type: "anonymous" | "email_not_verified";
780
+ } | null;
545
781
  toClientJson(): CurrentUserCrud["Client"]["Read"];
546
782
  /**
547
783
  * @deprecated, use contact channel's usedForAuth instead
@@ -555,7 +791,7 @@ type BaseUser = {
555
791
  }[];
556
792
  };
557
793
  type UserExtra = {
558
- setDisplayName(displayName: string): Promise<void>;
794
+ setDisplayName(displayName: string | null): Promise<void>;
559
795
  /** @deprecated Use contact channel's sendVerificationEmail instead */
560
796
  sendVerificationEmail(): Promise<KnownErrors["EmailAlreadyVerified"] | void>;
561
797
  setClientMetadata(metadata: any): Promise<void>;
@@ -611,7 +847,7 @@ type UserExtra = {
611
847
  usePermission(scope: Team, permissionId: string): TeamPermission | null;
612
848
  usePermission(permissionId: string): TeamPermission | null;
613
849
  readonly selectedTeam: Team | null;
614
- setSelectedTeam(team: Team | null): Promise<void>;
850
+ setSelectedTeam(teamOrId: string | Team | null): Promise<void>;
615
851
  createTeam(data: TeamCreateOptions): Promise<Team>;
616
852
  leaveTeam(team: Team): Promise<void>;
617
853
  getActiveSessions(): Promise<ActiveSession[]>;
@@ -639,8 +875,8 @@ type User = BaseUser;
639
875
  type CurrentUser = BaseUser & Auth & UserExtra & Customer;
640
876
  type CurrentInternalUser = CurrentUser & InternalUserExtra;
641
877
  type ProjectCurrentUser<ProjectId> = ProjectId extends "internal" ? CurrentInternalUser : CurrentUser;
642
- type TokenPartialUser = Pick<User, "id" | "displayName" | "primaryEmail" | "primaryEmailVerified" | "isAnonymous">;
643
- type SyncedPartialUser = TokenPartialUser & Pick<User, "id" | "displayName" | "primaryEmail" | "primaryEmailVerified" | "profileImageUrl" | "signedUpAt" | "clientMetadata" | "clientReadOnlyMetadata" | "isAnonymous" | "hasPassword">;
878
+ type TokenPartialUser = Pick<User, "id" | "displayName" | "primaryEmail" | "primaryEmailVerified" | "isAnonymous" | "isRestricted" | "restrictedReason">;
879
+ type SyncedPartialUser = TokenPartialUser & Pick<User, "id" | "displayName" | "primaryEmail" | "primaryEmailVerified" | "profileImageUrl" | "signedUpAt" | "clientMetadata" | "clientReadOnlyMetadata" | "isAnonymous" | "hasPassword" | "isRestricted" | "restrictedReason">;
644
880
  type ActiveSession = {
645
881
  id: string;
646
882
  userId: string;
@@ -651,13 +887,14 @@ type ActiveSession = {
651
887
  geoInfo?: GeoInfo;
652
888
  };
653
889
  type UserUpdateOptions = {
654
- displayName?: string;
890
+ displayName?: string | null;
655
891
  clientMetadata?: ReadonlyJson;
656
892
  selectedTeamId?: string | null;
657
893
  totpMultiFactorSecret?: Uint8Array | null;
658
894
  profileImageUrl?: string | null;
659
895
  otpAuthEnabled?: boolean;
660
896
  passkeyAuthEnabled?: boolean;
897
+ primaryEmail?: string | null;
661
898
  };
662
899
  type ServerBaseUser = {
663
900
  setPrimaryEmail(email: string | null, options?: {
@@ -704,7 +941,12 @@ type ServerBaseUser = {
704
941
  createSession(options?: {
705
942
  expiresInMillis?: number;
706
943
  isImpersonation?: boolean;
707
- }): Promise<Session>;
944
+ }): Promise<{
945
+ getTokens(): Promise<{
946
+ accessToken: string | null;
947
+ refreshToken: string | null;
948
+ }>;
949
+ }>;
708
950
  } & AsyncStoreProperty<"team", [id: string], ServerTeam | null, false> & AsyncStoreProperty<"teams", [], ServerTeam[], true> & AsyncStoreProperty<"permission", [scope: Team, permissionId: string, options?: {
709
951
  direct?: boolean;
710
952
  }], AdminTeamPermission | null, false> & AsyncStoreProperty<"permissions", [scope: Team, options?: {
@@ -811,6 +1053,15 @@ type ServerListUsersOptions = {
811
1053
  orderBy?: 'signedUpAt';
812
1054
  desc?: boolean;
813
1055
  query?: string;
1056
+ /**
1057
+ * Whether to include restricted users (users who haven't completed onboarding requirements).
1058
+ * Defaults to false.
1059
+ */
1060
+ includeRestricted?: boolean;
1061
+ /**
1062
+ * Whether to include anonymous users (and restricted users).
1063
+ * Defaults to false.
1064
+ */
814
1065
  includeAnonymous?: boolean;
815
1066
  };
816
1067
  type ServerTeamCreateOptions = TeamCreateOptions & {
@@ -925,6 +1176,8 @@ type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends s
925
1176
  allowConnectedAccounts: boolean;
926
1177
  }): Promise<Result<ServerOAuthProvider, InstanceType<typeof KnownErrors.OAuthProviderAccountIdAlreadyUsedForSignIn>>>;
927
1178
  sendEmail(options: SendEmailOptions): Promise<void>;
1179
+ getEmailDeliveryStats(): Promise<EmailDeliveryInfo>;
1180
+ useEmailDeliveryStats(): EmailDeliveryInfo;
928
1181
  } & AsyncStoreProperty<"user", [id: string], ServerUser | null, false> & Omit<AsyncStoreProperty<"users", [], ServerUser[], true>, "listUsers" | "useUsers"> & AsyncStoreProperty<"teams", [], ServerTeam[], true> & AsyncStoreProperty<"dataVaultStore", [id: string], DataVaultStore, false> & AsyncStoreProperty<"item", [
929
1182
  {
930
1183
  itemId: string;
@@ -941,6 +1194,21 @@ type StackServerApp<HasTokenStore extends boolean = boolean, ProjectId extends s
941
1194
  ], CustomerProductsList, true> & StackClientApp<HasTokenStore, ProjectId>);
942
1195
  declare const StackServerApp: StackServerAppConstructor;
943
1196
 
1197
+ type EmailOutboxListOptions = {
1198
+ status?: string;
1199
+ simpleStatus?: string;
1200
+ limit?: number;
1201
+ cursor?: string;
1202
+ };
1203
+ type EmailOutboxListResult = {
1204
+ items: AdminEmailOutbox[];
1205
+ nextCursor: string | null;
1206
+ };
1207
+ type EmailOutboxUpdateOptions = {
1208
+ isPaused?: boolean;
1209
+ scheduledAtMillis?: number;
1210
+ cancel?: boolean;
1211
+ };
944
1212
  type StackAdminAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = (StackServerAppConstructorOptions<HasTokenStore, ProjectId> & {
945
1213
  superSecretAdminKey?: string;
946
1214
  projectOwnerSession?: InternalSession;
@@ -1073,6 +1341,12 @@ type StackAdminApp<HasTokenStore extends boolean = boolean, ProjectId extends st
1073
1341
  type: "subscription" | "one-time-purchase";
1074
1342
  id: string;
1075
1343
  }): Promise<void>;
1344
+ listOutboxEmails(options?: EmailOutboxListOptions): Promise<EmailOutboxListResult>;
1345
+ getOutboxEmail(id: string): Promise<AdminEmailOutbox>;
1346
+ updateOutboxEmail(id: string, options: EmailOutboxUpdateOptions): Promise<AdminEmailOutbox>;
1347
+ pauseOutboxEmail(id: string): Promise<AdminEmailOutbox>;
1348
+ unpauseOutboxEmail(id: string): Promise<AdminEmailOutbox>;
1349
+ cancelOutboxEmail(id: string): Promise<AdminEmailOutbox>;
1076
1350
  } & StackServerApp<HasTokenStore, ProjectId>);
1077
1351
  declare const StackAdminApp: StackAdminAppConstructor;
1078
1352
 
@@ -1090,6 +1364,9 @@ type ProjectConfig = {
1090
1364
  type OAuthProviderConfig = {
1091
1365
  readonly id: string;
1092
1366
  };
1367
+ /**
1368
+ * @deprecated This type is deprecated. Use the new config override setup instead.
1369
+ */
1093
1370
  type AdminProjectConfig = {
1094
1371
  readonly signUpEnabled: boolean;
1095
1372
  readonly credentialEnabled: boolean;
@@ -1335,6 +1612,12 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
1335
1612
  or: 'anonymous';
1336
1613
  }): Promise<ProjectCurrentUser<ProjectId>>;
1337
1614
  getUser(options?: GetCurrentUserOptions<HasTokenStore>): Promise<ProjectCurrentUser<ProjectId> | null>;
1615
+ cancelSubscription(options: {
1616
+ productId: string;
1617
+ } | {
1618
+ productId: string;
1619
+ teamId: string;
1620
+ }): Promise<void>;
1338
1621
  getPartialUser(options: GetCurrentPartialUserOptions<HasTokenStore> & {
1339
1622
  from: 'token';
1340
1623
  }): Promise<TokenPartialUser | null>;
@@ -1387,6 +1670,7 @@ declare const iconMap: {
1387
1670
  readonly Key: React$1.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React$1.RefAttributes<SVGSVGElement>>;
1388
1671
  readonly Settings: React$1.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React$1.RefAttributes<SVGSVGElement>>;
1389
1672
  readonly CirclePlus: React$1.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React$1.RefAttributes<SVGSVGElement>>;
1673
+ readonly CreditCard: React$1.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React$1.RefAttributes<SVGSVGElement>>;
1390
1674
  };
1391
1675
  declare function AccountSettings(props: {
1392
1676
  fullPage?: boolean;
@@ -1462,6 +1746,10 @@ declare function OAuthCallback({ fullPage }: {
1462
1746
  fullPage?: boolean;
1463
1747
  }): react_jsx_runtime.JSX.Element;
1464
1748
 
1749
+ declare function Onboarding(props: {
1750
+ fullPage?: boolean;
1751
+ }): react_jsx_runtime.JSX.Element | null;
1752
+
1465
1753
  declare function PasswordReset({ searchParams, fullPage, }: {
1466
1754
  searchParams: Record<string, string>;
1467
1755
  fullPage?: boolean;
@@ -1490,6 +1778,7 @@ type Components = {
1490
1778
  AccountSettings: typeof AccountSettings;
1491
1779
  CliAuthConfirmation: typeof CliAuthConfirmation;
1492
1780
  MFA: typeof MFA;
1781
+ Onboarding: typeof Onboarding;
1493
1782
  };
1494
1783
  type BaseHandlerProps = {
1495
1784
  fullPage: boolean;
@@ -1761,4 +2050,4 @@ type UserButtonProps = {
1761
2050
  };
1762
2051
  declare function UserButton(props: UserButtonProps): react_jsx_runtime.JSX.Element;
1763
2052
 
1764
- export { AccountSettings, type AdminDomainConfig, type AdminEmailConfig, type AdminOAuthProviderConfig, type AdminOwnedProject, type AdminProject, type AdminProjectConfig, type AdminProjectConfigUpdateOptions, type AdminProjectCreateOptions, type AdminProjectPermission, type AdminProjectPermissionDefinition, type AdminProjectPermissionDefinitionCreateOptions, type AdminProjectPermissionDefinitionUpdateOptions, type AdminProjectUpdateOptions, type AdminSentEmail, type AdminTeamPermission, type AdminTeamPermissionDefinition, type AdminTeamPermissionDefinitionCreateOptions, type AdminTeamPermissionDefinitionUpdateOptions, type Auth, AuthPage, CliAuthConfirmation, type Connection, type ContactChannel, CredentialSignIn, CredentialSignUp, type CurrentInternalServerUser, type CurrentInternalUser, type CurrentServerUser, type CurrentUser, type EditableTeamMemberProfile, EmailVerification, ForgotPassword, type GetCurrentUserOptions, type GetCurrentUserOptions as GetUserOptions, type HandlerUrls, type InternalApiKey, type InternalApiKeyBase, type InternalApiKeyBaseCrudRead, type InternalApiKeyCreateOptions, type InternalApiKeyFirstView, MagicLinkSignIn, MessageCard, OAuthButton, OAuthButtonGroup, type OAuthConnection, type OAuthProvider, type OAuthProviderConfig, type OAuthScopesOnSignIn, PasswordReset, type Project, type ProjectConfig, SelectedTeamSwitcher, type ServerContactChannel, type ServerListUsersOptions, type ServerOAuthProvider, type ServerTeam, type ServerTeamCreateOptions, type ServerTeamMemberProfile, type ServerTeamUpdateOptions, type ServerTeamUser, type ServerUser, type Session, SignIn, SignUp, StackAdminApp, type StackAdminAppConstructor, type StackAdminAppConstructorOptions, StackClientApp, type StackClientAppConstructor, type StackClientAppConstructorOptions, type StackClientAppJson, StackHandler, ReactStackProvider as StackProvider, StackServerApp, type StackServerAppConstructor, type StackServerAppConstructorOptions, StackTheme, type Team, type TeamCreateOptions, type TeamInvitation$1 as TeamInvitation, type TeamMemberProfile, TeamSwitcher, type TeamUpdateOptions, type TeamUser, type User, UserAvatar, UserButton, stackAppInternalsSymbol, useStackApp, useUser };
2053
+ export { AccountSettings, type AdminDomainConfig, type AdminEmailConfig, type AdminEmailOutbox, type AdminEmailOutboxRecipient, type AdminEmailOutboxSimpleStatus, type AdminEmailOutboxStatus, type AdminOAuthProviderConfig, type AdminOwnedProject, type AdminProject, type AdminProjectConfig, type AdminProjectConfigUpdateOptions, type AdminProjectCreateOptions, type AdminProjectPermission, type AdminProjectPermissionDefinition, type AdminProjectPermissionDefinitionCreateOptions, type AdminProjectPermissionDefinitionUpdateOptions, type AdminProjectUpdateOptions, type AdminSentEmail, type AdminTeamPermission, type AdminTeamPermissionDefinition, type AdminTeamPermissionDefinitionCreateOptions, type AdminTeamPermissionDefinitionUpdateOptions, type Auth, AuthPage, CliAuthConfirmation, type Connection, type ContactChannel, CredentialSignIn, CredentialSignUp, type CurrentInternalServerUser, type CurrentInternalUser, type CurrentServerUser, type CurrentUser, type EditableTeamMemberProfile, type EmailOutboxListOptions, type EmailOutboxListResult, type EmailOutboxUpdateOptions, EmailVerification, ForgotPassword, type GetCurrentUserOptions, type GetCurrentUserOptions as GetUserOptions, type HandlerUrls, type InternalApiKey, type InternalApiKeyBase, type InternalApiKeyBaseCrudRead, type InternalApiKeyCreateOptions, type InternalApiKeyFirstView, MagicLinkSignIn, MessageCard, OAuthButton, OAuthButtonGroup, type OAuthConnection, type OAuthProvider, type OAuthProviderConfig, type OAuthScopesOnSignIn, PasswordReset, type Project, type ProjectConfig, SelectedTeamSwitcher, type ServerContactChannel, type ServerListUsersOptions, type ServerOAuthProvider, type ServerTeam, type ServerTeamCreateOptions, type ServerTeamMemberProfile, type ServerTeamUpdateOptions, type ServerTeamUser, type ServerUser, SignIn, SignUp, StackAdminApp, type StackAdminAppConstructor, type StackAdminAppConstructorOptions, StackClientApp, type StackClientAppConstructor, type StackClientAppConstructorOptions, type StackClientAppJson, StackHandler, ReactStackProvider as StackProvider, StackServerApp, type StackServerAppConstructor, type StackServerAppConstructorOptions, StackTheme, type Team, type TeamCreateOptions, type TeamInvitation$1 as TeamInvitation, type TeamMemberProfile, TeamSwitcher, type TeamUpdateOptions, type TeamUser, type User, UserAvatar, UserButton, stackAppInternalsSymbol, useStackApp, useUser };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nexport * from './lib/stack-app';\n\nexport { getConvexProvidersConfig } from \"./integrations/convex\";\n\nexport { default as StackHandler } from \"./components-page/stack-handler\";\nexport { useStackApp, useUser } from \"./lib/hooks\";\nexport { default as StackProvider } from \"./providers/stack-provider\";\nexport { StackTheme } from './providers/theme-provider';\n\nexport { AccountSettings } from \"./components-page/account-settings\";\nexport { AuthPage } from \"./components-page/auth-page\";\nexport { CliAuthConfirmation } from \"./components-page/cli-auth-confirm\";\nexport { EmailVerification } from \"./components-page/email-verification\";\nexport { ForgotPassword } from \"./components-page/forgot-password\";\nexport { PasswordReset } from \"./components-page/password-reset\";\nexport { SignIn } from \"./components-page/sign-in\";\nexport { SignUp } from \"./components-page/sign-up\";\nexport { CredentialSignIn as CredentialSignIn } from \"./components/credential-sign-in\";\nexport { CredentialSignUp as CredentialSignUp } from \"./components/credential-sign-up\";\nexport { UserAvatar } from \"./components/elements/user-avatar\";\nexport { MagicLinkSignIn as MagicLinkSignIn } from \"./components/magic-link-sign-in\";\nexport { MessageCard } from \"./components/message-cards/message-card\";\nexport { OAuthButton } from \"./components/oauth-button\";\nexport { OAuthButtonGroup } from \"./components/oauth-button-group\";\nexport { SelectedTeamSwitcher } from \"./components/selected-team-switcher\";\nexport { TeamSwitcher } from \"./components/team-switcher\";\nexport { UserButton } from \"./components/user-button\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,0BAAc,qCAJd;AAMA,oBAAyC;AAEzC,2BAAwC;AACxC,mBAAqC;AACrC,4BAAyC;AACzC,4BAA2B;AAE3B,8BAAgC;AAChC,uBAAyB;AACzB,8BAAoC;AACpC,gCAAkC;AAClC,6BAA+B;AAC/B,4BAA8B;AAC9B,qBAAuB;AACvB,qBAAuB;AACvB,gCAAqD;AACrD,gCAAqD;AACrD,yBAA2B;AAC3B,gCAAmD;AACnD,0BAA4B;AAC5B,0BAA4B;AAC5B,gCAAiC;AACjC,oCAAqC;AACrC,2BAA6B;AAC7B,yBAA2B;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nexport * from './lib/stack-app';\n\nexport { getConvexProvidersConfig } from \"./integrations/convex\";\n\nexport { default as StackHandler } from \"./components-page/stack-handler\";\nexport { useStackApp, useUser } from \"./lib/hooks\";\nexport { default as StackProvider } from \"./providers/stack-provider\";\nexport { StackTheme } from './providers/theme-provider';\n\nexport { AccountSettings } from \"./components-page/account-settings\";\nexport { AuthPage } from \"./components-page/auth-page\";\nexport { CliAuthConfirmation } from \"./components-page/cli-auth-confirm\";\nexport { EmailVerification } from \"./components-page/email-verification\";\nexport { ForgotPassword } from \"./components-page/forgot-password\";\nexport { PasswordReset } from \"./components-page/password-reset\";\nexport { SignIn } from \"./components-page/sign-in\";\nexport { SignUp } from \"./components-page/sign-up\";\nexport { CredentialSignIn as CredentialSignIn } from \"./components/credential-sign-in\";\nexport { CredentialSignUp as CredentialSignUp } from \"./components/credential-sign-up\";\nexport { UserAvatar } from \"./components/elements/user-avatar\";\nexport { MagicLinkSignIn as MagicLinkSignIn } from \"./components/magic-link-sign-in\";\nexport { MessageCard } from \"./components/message-cards/message-card\";\nexport { OAuthButton } from \"./components/oauth-button\";\nexport { OAuthButtonGroup } from \"./components/oauth-button-group\";\nexport { SelectedTeamSwitcher } from \"./components/selected-team-switcher\";\nexport { TeamSwitcher } from \"./components/team-switcher\";\nexport { UserButton } from \"./components/user-button\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,0BAAc,qCAJd;AAMA,oBAAyC;AAEzC,2BAAwC;AACxC,mBAAqC;AACrC,4BAAyC;AACzC,4BAA2B;AAE3B,8BAAgC;AAChC,uBAAyB;AACzB,8BAAoC;AACpC,gCAAkC;AAClC,6BAA+B;AAC/B,4BAA8B;AAC9B,qBAAuB;AACvB,qBAAuB;AACvB,gCAAqD;AACrD,gCAAqD;AACrD,yBAA2B;AAC3B,gCAAmD;AACnD,0BAA4B;AAC5B,0BAA4B;AAC5B,gCAAiC;AACjC,oCAAqC;AACrC,2BAA6B;AAC7B,yBAA2B;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/integrations/convex/component/convex.config.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { defineComponent } from \"convex/server\";\n\nconst component = defineComponent(\"stack_auth\");\n\nexport default component;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,oBAAgC;AAEhC,IAAM,gBAAY,+BAAgB,YAAY;AAE9C,IAAO,wBAAQ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/integrations/convex/component/convex.config.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { defineComponent } from \"convex/server\";\n\nconst component = defineComponent(\"stack_auth\");\n\nexport default component;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,oBAAgC;AAEhC,IAAM,gBAAY,+BAAgB,YAAY;AAE9C,IAAO,wBAAQ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/integrations/convex.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { urlString } from \"@stackframe/stack-shared/dist/utils/urls\";\nimport { defaultBaseUrl } from \"../lib/stack-app/apps/implementations/common\";\n\nexport function getConvexProvidersConfig(options: {\n baseUrl?: string,\n projectId: string,\n}) {\n const baseUrl = options.baseUrl || defaultBaseUrl;\n const projectId = options.projectId;\n return [\n {\n type: \"customJwt\",\n issuer: new URL(urlString`/api/v1/projects/${projectId}`, baseUrl),\n jwks: new URL(urlString`/api/v1/projects/${projectId}/.well-known/jwks.json`, baseUrl),\n algorithm: \"ES256\",\n },\n {\n type: \"customJwt\",\n issuer: new URL(urlString`/api/v1/projects-anonymous-users/${projectId}`, baseUrl),\n jwks: new URL(urlString`/api/v1/projects/${projectId}/.well-known/jwks.json?include_anonymous=true`, baseUrl),\n algorithm: \"ES256\",\n },\n ];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,kBAA0B;AAC1B,oBAA+B;AAExB,SAAS,yBAAyB,SAGtC;AACD,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,YAAY,QAAQ;AAC1B,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,QAAQ,IAAI,IAAI,yCAA6B,SAAS,IAAI,OAAO;AAAA,MACjE,MAAM,IAAI,IAAI,yCAA6B,SAAS,0BAA0B,OAAO;AAAA,MACrF,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ,IAAI,IAAI,yDAA6C,SAAS,IAAI,OAAO;AAAA,MACjF,MAAM,IAAI,IAAI,yCAA6B,SAAS,iDAAiD,OAAO;AAAA,MAC5G,WAAW;AAAA,IACb;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/integrations/convex.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { urlString } from \"@stackframe/stack-shared/dist/utils/urls\";\nimport { defaultBaseUrl } from \"../lib/stack-app/apps/implementations/common\";\n\nexport function getConvexProvidersConfig(options: {\n baseUrl?: string,\n projectId: string,\n}) {\n const baseUrl = options.baseUrl || defaultBaseUrl;\n const projectId = options.projectId;\n return [\n {\n type: \"customJwt\",\n issuer: new URL(urlString`/api/v1/projects/${projectId}`, baseUrl),\n jwks: new URL(urlString`/api/v1/projects/${projectId}/.well-known/jwks.json`, baseUrl),\n algorithm: \"ES256\",\n },\n {\n type: \"customJwt\",\n issuer: new URL(urlString`/api/v1/projects-anonymous-users/${projectId}`, baseUrl),\n jwks: new URL(urlString`/api/v1/projects/${projectId}/.well-known/jwks.json?include_anonymous=true`, baseUrl),\n algorithm: \"ES256\",\n },\n ];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,kBAA0B;AAC1B,oBAA+B;AAExB,SAAS,yBAAyB,SAGtC;AACD,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,YAAY,QAAQ;AAC1B,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,QAAQ,IAAI,IAAI,yCAA6B,SAAS,IAAI,OAAO;AAAA,MACjE,MAAM,IAAI,IAAI,yCAA6B,SAAS,0BAA0B,OAAO;AAAA,MACrF,WAAW;AAAA,IACb;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,QAAQ,IAAI,IAAI,yDAA6C,SAAS,IAAI,OAAO;AAAA,MACjF,MAAM,IAAI,IAAI,yCAA6B,SAAS,iDAAiD,OAAO;AAAA,MAC5G,WAAW;AAAA,IACb;AAAA,EACF;AACF;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/auth.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { KnownError, StackClientInterface } from \"@stackframe/stack-shared\";\nimport { InternalSession } from \"@stackframe/stack-shared/dist/sessions\";\nimport { StackAssertionError, throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { neverResolve } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { deindent } from \"@stackframe/stack-shared/dist/utils/strings\";\nimport { constructRedirectUrl } from \"../utils/url\";\nimport { consumeVerifierAndStateCookie, saveVerifierAndState } from \"./cookie\";\n\nexport async function signInWithOAuth(\n iface: StackClientInterface,\n options: {\n provider: string,\n redirectUrl: string,\n errorRedirectUrl: string,\n providerScope?: string,\n },\n session: InternalSession,\n) {\n const { codeChallenge, state } = await saveVerifierAndState();\n const location = await iface.getOAuthUrl({\n provider: options.provider,\n redirectUrl: constructRedirectUrl(options.redirectUrl, \"redirectUrl\"),\n errorRedirectUrl: constructRedirectUrl(options.errorRedirectUrl, \"errorRedirectUrl\"),\n codeChallenge,\n state,\n type: \"authenticate\",\n providerScope: options.providerScope,\n session,\n });\n window.location.assign(location);\n await neverResolve();\n}\n\nexport async function addNewOAuthProviderOrScope(\n iface: StackClientInterface,\n options: {\n provider: string,\n redirectUrl: string,\n errorRedirectUrl: string,\n providerScope?: string,\n },\n session: InternalSession,\n) {\n const { codeChallenge, state } = await saveVerifierAndState();\n const location = await iface.getOAuthUrl({\n provider: options.provider,\n redirectUrl: constructRedirectUrl(options.redirectUrl, \"redirectUrl\"),\n errorRedirectUrl: constructRedirectUrl(options.errorRedirectUrl, \"errorRedirectUrl\"),\n afterCallbackRedirectUrl: constructRedirectUrl(window.location.href, \"afterCallbackRedirectUrl\"),\n codeChallenge,\n state,\n type: \"link\",\n session,\n providerScope: options.providerScope,\n });\n window.location.assign(location);\n await neverResolve();\n}\n\n/**\n * Checks if the current URL has the query parameters for an OAuth callback, and if so, removes them.\n *\n * Must be synchronous for the logic in callOAuthCallback to work without race conditions.\n */\nfunction consumeOAuthCallbackQueryParams() {\n const requiredParams = [\"code\", \"state\"];\n const originalUrl = new URL(window.location.href);\n for (const param of requiredParams) {\n if (!originalUrl.searchParams.has(param)) {\n console.warn(new Error(`Missing required query parameter on OAuth callback: ${param}. Maybe you opened or reloaded the oauth-callback page from your history?`));\n return null;\n }\n }\n\n const expectedState = originalUrl.searchParams.get(\"state\") ?? throwErr(\"This should never happen; isn't state required above?\");\n const cookieResult = consumeVerifierAndStateCookie(expectedState);\n\n if (!cookieResult) {\n // If the state can't be found in the cookies, then the callback wasn't meant for us.\n // Maybe the website uses another OAuth library?\n console.warn(deindent`\n Stack found an outer OAuth callback state in the query parameters, but not in cookies.\n \n This could have multiple reasons:\n - The cookie expired, because the OAuth flow took too long.\n - The user's browser deleted the cookie, either manually or because of a very strict cookie policy.\n - The cookie was already consumed by this page, and the user already logged in.\n - You are using another OAuth client library with the same callback URL as Stack.\n - The user opened the OAuth callback page from their history.\n\n Either way, it is probably safe to ignore this warning unless you are debugging an OAuth issue.\n `);\n return null;\n }\n\n\n const newUrl = new URL(originalUrl);\n for (const param of requiredParams) {\n newUrl.searchParams.delete(param);\n }\n\n // let's get rid of the authorization code in the history as we\n // don't redirect to `redirectUrl` if there's a validation error\n // (as the redirectUrl might be malicious!).\n //\n // We use history.replaceState instead of location.assign(...) to\n // prevent an unnecessary reload\n window.history.replaceState({}, \"\", newUrl.toString());\n\n return {\n originalUrl,\n codeVerifier: cookieResult.codeVerifier,\n state: expectedState,\n };\n}\n\nexport async function callOAuthCallback(\n iface: StackClientInterface,\n redirectUrl: string,\n) {\n // note: this part of the function (until the return) needs\n // to be synchronous, to prevent race conditions when\n // callOAuthCallback is called multiple times in parallel\n const consumed = consumeOAuthCallbackQueryParams();\n if (!consumed) return Result.ok(undefined);\n\n // the rest can be asynchronous (we now know that we are the\n // intended recipient of the callback, and the only instance\n // of callOAuthCallback that's running)\n try {\n return Result.ok(await iface.callOAuthCallback({\n oauthParams: consumed.originalUrl.searchParams,\n redirectUri: constructRedirectUrl(redirectUrl, \"redirectUri\"),\n codeVerifier: consumed.codeVerifier,\n state: consumed.state,\n }));\n } catch (e) {\n if (KnownError.isKnownError(e)) {\n throw e;\n }\n throw new StackAssertionError(\"Error signing in during OAuth callback. Please try again.\", { cause: e });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,0BAAiD;AAEjD,oBAA8C;AAC9C,sBAA6B;AAC7B,qBAAuB;AACvB,qBAAyB;AACzB,iBAAqC;AACrC,oBAAoE;AAEpE,eAAsB,gBACpB,OACA,SAMA,SACA;AACA,QAAM,EAAE,eAAe,MAAM,IAAI,UAAM,oCAAqB;AAC5D,QAAM,WAAW,MAAM,MAAM,YAAY;AAAA,IACvC,UAAU,QAAQ;AAAA,IAClB,iBAAa,iCAAqB,QAAQ,aAAa,aAAa;AAAA,IACpE,sBAAkB,iCAAqB,QAAQ,kBAAkB,kBAAkB;AAAA,IACnF;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,eAAe,QAAQ;AAAA,IACvB;AAAA,EACF,CAAC;AACD,SAAO,SAAS,OAAO,QAAQ;AAC/B,YAAM,8BAAa;AACrB;AAEA,eAAsB,2BACpB,OACA,SAMA,SACA;AACA,QAAM,EAAE,eAAe,MAAM,IAAI,UAAM,oCAAqB;AAC5D,QAAM,WAAW,MAAM,MAAM,YAAY;AAAA,IACvC,UAAU,QAAQ;AAAA,IAClB,iBAAa,iCAAqB,QAAQ,aAAa,aAAa;AAAA,IACpE,sBAAkB,iCAAqB,QAAQ,kBAAkB,kBAAkB;AAAA,IACnF,8BAA0B,iCAAqB,OAAO,SAAS,MAAM,0BAA0B;AAAA,IAC/F;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,eAAe,QAAQ;AAAA,EACzB,CAAC;AACD,SAAO,SAAS,OAAO,QAAQ;AAC/B,YAAM,8BAAa;AACrB;AAOA,SAAS,kCAAkC;AACzC,QAAM,iBAAiB,CAAC,QAAQ,OAAO;AACvC,QAAM,cAAc,IAAI,IAAI,OAAO,SAAS,IAAI;AAChD,aAAW,SAAS,gBAAgB;AAClC,QAAI,CAAC,YAAY,aAAa,IAAI,KAAK,GAAG;AACxC,cAAQ,KAAK,IAAI,MAAM,uDAAuD,KAAK,2EAA2E,CAAC;AAC/J,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,gBAAgB,YAAY,aAAa,IAAI,OAAO,SAAK,wBAAS,uDAAuD;AAC/H,QAAM,mBAAe,6CAA8B,aAAa;AAEhE,MAAI,CAAC,cAAc;AAGjB,YAAQ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWZ;AACD,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,IAAI,IAAI,WAAW;AAClC,aAAW,SAAS,gBAAgB;AAClC,WAAO,aAAa,OAAO,KAAK;AAAA,EAClC;AAQA,SAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,OAAO,SAAS,CAAC;AAErD,SAAO;AAAA,IACL;AAAA,IACA,cAAc,aAAa;AAAA,IAC3B,OAAO;AAAA,EACT;AACF;AAEA,eAAsB,kBACpB,OACA,aACA;AAIA,QAAM,WAAW,gCAAgC;AACjD,MAAI,CAAC,SAAU,QAAO,sBAAO,GAAG,MAAS;AAKzC,MAAI;AACF,WAAO,sBAAO,GAAG,MAAM,MAAM,kBAAkB;AAAA,MAC7C,aAAa,SAAS,YAAY;AAAA,MAClC,iBAAa,iCAAqB,aAAa,aAAa;AAAA,MAC5D,cAAc,SAAS;AAAA,MACvB,OAAO,SAAS;AAAA,IAClB,CAAC,CAAC;AAAA,EACJ,SAAS,GAAG;AACV,QAAI,+BAAW,aAAa,CAAC,GAAG;AAC9B,YAAM;AAAA,IACR;AACA,UAAM,IAAI,kCAAoB,6DAA6D,EAAE,OAAO,EAAE,CAAC;AAAA,EACzG;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/lib/auth.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { KnownError, StackClientInterface } from \"@stackframe/stack-shared\";\nimport { InternalSession } from \"@stackframe/stack-shared/dist/sessions\";\nimport { StackAssertionError, throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { neverResolve } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { deindent } from \"@stackframe/stack-shared/dist/utils/strings\";\nimport { constructRedirectUrl } from \"../utils/url\";\nimport { consumeVerifierAndStateCookie, saveVerifierAndState } from \"./cookie\";\n\nexport async function signInWithOAuth(\n iface: StackClientInterface,\n options: {\n provider: string,\n redirectUrl: string,\n errorRedirectUrl: string,\n providerScope?: string,\n },\n session: InternalSession,\n) {\n const { codeChallenge, state } = await saveVerifierAndState();\n const location = await iface.getOAuthUrl({\n provider: options.provider,\n redirectUrl: constructRedirectUrl(options.redirectUrl, \"redirectUrl\"),\n errorRedirectUrl: constructRedirectUrl(options.errorRedirectUrl, \"errorRedirectUrl\"),\n codeChallenge,\n state,\n type: \"authenticate\",\n providerScope: options.providerScope,\n session,\n });\n window.location.assign(location);\n await neverResolve();\n}\n\nexport async function addNewOAuthProviderOrScope(\n iface: StackClientInterface,\n options: {\n provider: string,\n redirectUrl: string,\n errorRedirectUrl: string,\n providerScope?: string,\n },\n session: InternalSession,\n) {\n const { codeChallenge, state } = await saveVerifierAndState();\n const location = await iface.getOAuthUrl({\n provider: options.provider,\n redirectUrl: constructRedirectUrl(options.redirectUrl, \"redirectUrl\"),\n errorRedirectUrl: constructRedirectUrl(options.errorRedirectUrl, \"errorRedirectUrl\"),\n afterCallbackRedirectUrl: constructRedirectUrl(window.location.href, \"afterCallbackRedirectUrl\"),\n codeChallenge,\n state,\n type: \"link\",\n session,\n providerScope: options.providerScope,\n });\n window.location.assign(location);\n await neverResolve();\n}\n\n/**\n * Checks if the current URL has the query parameters for an OAuth callback, and if so, removes them.\n *\n * Must be synchronous for the logic in callOAuthCallback to work without race conditions.\n */\nfunction consumeOAuthCallbackQueryParams() {\n const requiredParams = [\"code\", \"state\"];\n const originalUrl = new URL(window.location.href);\n for (const param of requiredParams) {\n if (!originalUrl.searchParams.has(param)) {\n console.warn(new Error(`Missing required query parameter on OAuth callback: ${param}. Maybe you opened or reloaded the oauth-callback page from your history?`));\n return null;\n }\n }\n\n const expectedState = originalUrl.searchParams.get(\"state\") ?? throwErr(\"This should never happen; isn't state required above?\");\n const cookieResult = consumeVerifierAndStateCookie(expectedState);\n\n if (!cookieResult) {\n // If the state can't be found in the cookies, then the callback wasn't meant for us.\n // Maybe the website uses another OAuth library?\n console.warn(deindent`\n Stack found an outer OAuth callback state in the query parameters, but not in cookies.\n \n This could have multiple reasons:\n - The cookie expired, because the OAuth flow took too long.\n - The user's browser deleted the cookie, either manually or because of a very strict cookie policy.\n - The cookie was already consumed by this page, and the user already logged in.\n - You are using another OAuth client library with the same callback URL as Stack.\n - The user opened the OAuth callback page from their history.\n\n Either way, it is probably safe to ignore this warning unless you are debugging an OAuth issue.\n `);\n return null;\n }\n\n\n const newUrl = new URL(originalUrl);\n for (const param of requiredParams) {\n newUrl.searchParams.delete(param);\n }\n\n // let's get rid of the authorization code in the history as we\n // don't redirect to `redirectUrl` if there's a validation error\n // (as the redirectUrl might be malicious!).\n //\n // We use history.replaceState instead of location.assign(...) to\n // prevent an unnecessary reload\n window.history.replaceState({}, \"\", newUrl.toString());\n\n return {\n originalUrl,\n codeVerifier: cookieResult.codeVerifier,\n state: expectedState,\n };\n}\n\nexport async function callOAuthCallback(\n iface: StackClientInterface,\n redirectUrl: string,\n) {\n // note: this part of the function (until the return) needs\n // to be synchronous, to prevent race conditions when\n // callOAuthCallback is called multiple times in parallel\n const consumed = consumeOAuthCallbackQueryParams();\n if (!consumed) return Result.ok(undefined);\n\n // the rest can be asynchronous (we now know that we are the\n // intended recipient of the callback, and the only instance\n // of callOAuthCallback that's running)\n try {\n return Result.ok(await iface.callOAuthCallback({\n oauthParams: consumed.originalUrl.searchParams,\n redirectUri: constructRedirectUrl(redirectUrl, \"redirectUri\"),\n codeVerifier: consumed.codeVerifier,\n state: consumed.state,\n }));\n } catch (e) {\n if (KnownError.isKnownError(e)) {\n throw e;\n }\n throw new StackAssertionError(\"Error signing in during OAuth callback. Please try again.\", { cause: e });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,0BAAiD;AAEjD,oBAA8C;AAC9C,sBAA6B;AAC7B,qBAAuB;AACvB,qBAAyB;AACzB,iBAAqC;AACrC,oBAAoE;AAEpE,eAAsB,gBACpB,OACA,SAMA,SACA;AACA,QAAM,EAAE,eAAe,MAAM,IAAI,UAAM,oCAAqB;AAC5D,QAAM,WAAW,MAAM,MAAM,YAAY;AAAA,IACvC,UAAU,QAAQ;AAAA,IAClB,iBAAa,iCAAqB,QAAQ,aAAa,aAAa;AAAA,IACpE,sBAAkB,iCAAqB,QAAQ,kBAAkB,kBAAkB;AAAA,IACnF;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,eAAe,QAAQ;AAAA,IACvB;AAAA,EACF,CAAC;AACD,SAAO,SAAS,OAAO,QAAQ;AAC/B,YAAM,8BAAa;AACrB;AAEA,eAAsB,2BACpB,OACA,SAMA,SACA;AACA,QAAM,EAAE,eAAe,MAAM,IAAI,UAAM,oCAAqB;AAC5D,QAAM,WAAW,MAAM,MAAM,YAAY;AAAA,IACvC,UAAU,QAAQ;AAAA,IAClB,iBAAa,iCAAqB,QAAQ,aAAa,aAAa;AAAA,IACpE,sBAAkB,iCAAqB,QAAQ,kBAAkB,kBAAkB;AAAA,IACnF,8BAA0B,iCAAqB,OAAO,SAAS,MAAM,0BAA0B;AAAA,IAC/F;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,eAAe,QAAQ;AAAA,EACzB,CAAC;AACD,SAAO,SAAS,OAAO,QAAQ;AAC/B,YAAM,8BAAa;AACrB;AAOA,SAAS,kCAAkC;AACzC,QAAM,iBAAiB,CAAC,QAAQ,OAAO;AACvC,QAAM,cAAc,IAAI,IAAI,OAAO,SAAS,IAAI;AAChD,aAAW,SAAS,gBAAgB;AAClC,QAAI,CAAC,YAAY,aAAa,IAAI,KAAK,GAAG;AACxC,cAAQ,KAAK,IAAI,MAAM,uDAAuD,KAAK,2EAA2E,CAAC;AAC/J,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,gBAAgB,YAAY,aAAa,IAAI,OAAO,SAAK,wBAAS,uDAAuD;AAC/H,QAAM,mBAAe,6CAA8B,aAAa;AAEhE,MAAI,CAAC,cAAc;AAGjB,YAAQ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWZ;AACD,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,IAAI,IAAI,WAAW;AAClC,aAAW,SAAS,gBAAgB;AAClC,WAAO,aAAa,OAAO,KAAK;AAAA,EAClC;AAQA,SAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,OAAO,SAAS,CAAC;AAErD,SAAO;AAAA,IACL;AAAA,IACA,cAAc,aAAa;AAAA,IAC3B,OAAO;AAAA,EACT;AACF;AAEA,eAAsB,kBACpB,OACA,aACA;AAIA,QAAM,WAAW,gCAAgC;AACjD,MAAI,CAAC,SAAU,QAAO,sBAAO,GAAG,MAAS;AAKzC,MAAI;AACF,WAAO,sBAAO,GAAG,MAAM,MAAM,kBAAkB;AAAA,MAC7C,aAAa,SAAS,YAAY;AAAA,MAClC,iBAAa,iCAAqB,aAAa,aAAa;AAAA,MAC5D,cAAc,SAAS;AAAA,MACvB,OAAO,SAAS;AAAA,IAClB,CAAC,CAAC;AAAA,EACJ,SAAS,GAAG;AACV,QAAI,+BAAW,aAAa,CAAC,GAAG;AAC9B,YAAM;AAAA,IACR;AACA,UAAM,IAAI,kCAAoB,6DAA6D,EAAE,OAAO,EAAE,CAAC;AAAA,EACzG;AACF;","names":[]}