@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.
- package/dist/components/api-key-dialogs.js.map +1 -1
- package/dist/components/api-key-table.js.map +1 -1
- package/dist/components/credential-sign-in.js.map +1 -1
- package/dist/components/credential-sign-up.js.map +1 -1
- package/dist/components/elements/form-warning.js.map +1 -1
- package/dist/components/elements/maybe-full-page.js.map +1 -1
- package/dist/components/elements/separator-with-text.js.map +1 -1
- package/dist/components/elements/sidebar-layout.js.map +1 -1
- package/dist/components/elements/ssr-layout-effect.js.map +1 -1
- package/dist/components/elements/user-avatar.js.map +1 -1
- package/dist/components/link.js.map +1 -1
- package/dist/components/magic-link-sign-in.js.map +1 -1
- package/dist/components/message-cards/known-error-message-card.js.map +1 -1
- package/dist/components/message-cards/message-card.js.map +1 -1
- package/dist/components/message-cards/predefined-message-card.js.map +1 -1
- package/dist/components/oauth-button-group.js.map +1 -1
- package/dist/components/oauth-button.js.map +1 -1
- package/dist/components/passkey-button.js.map +1 -1
- package/dist/components/profile-image-editor.js.map +1 -1
- package/dist/components/selected-team-switcher.js.map +1 -1
- package/dist/components/team-icon.js.map +1 -1
- package/dist/components/team-switcher.js.map +1 -1
- package/dist/components/use-in-iframe.js.map +1 -1
- package/dist/components/user-button.js.map +1 -1
- package/dist/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
- package/dist/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
- package/dist/components-page/account-settings/editable-text.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/emails-section.js +4 -3
- package/dist/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
- package/dist/components-page/account-settings/notifications/notifications-page.js.map +1 -1
- package/dist/components-page/account-settings/page-layout.js.map +1 -1
- package/dist/components-page/account-settings/payments/payments-page.js +79 -0
- package/dist/components-page/account-settings/payments/payments-page.js.map +1 -0
- package/dist/components-page/account-settings/payments/payments-panel.js +374 -0
- package/dist/components-page/account-settings/payments/payments-panel.js.map +1 -0
- package/dist/components-page/account-settings/profile-page/profile-page.js.map +1 -1
- package/dist/components-page/account-settings/section.js.map +1 -1
- package/dist/components-page/account-settings/settings/delete-account-section.js.map +1 -1
- package/dist/components-page/account-settings/settings/settings-page.js.map +1 -1
- package/dist/components-page/account-settings/settings/sign-out-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/leave-team-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-creation-page.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-display-name-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-page.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-profile-image-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-profile-user-section.js.map +1 -1
- package/dist/components-page/account-settings.js +22 -2
- package/dist/components-page/account-settings.js.map +1 -1
- package/dist/components-page/auth-page.js.map +1 -1
- package/dist/components-page/cli-auth-confirm.js.map +1 -1
- package/dist/components-page/email-verification.js.map +1 -1
- package/dist/components-page/error-page.js.map +1 -1
- package/dist/components-page/forgot-password.js.map +1 -1
- package/dist/components-page/magic-link-callback.js.map +1 -1
- package/dist/components-page/mfa.js.map +1 -1
- package/dist/components-page/oauth-callback.js.map +1 -1
- package/dist/components-page/onboarding.js +170 -0
- package/dist/components-page/onboarding.js.map +1 -0
- package/dist/components-page/password-reset.js.map +1 -1
- package/dist/components-page/section.js.map +1 -1
- package/dist/components-page/sign-in.js.map +1 -1
- package/dist/components-page/sign-out.js.map +1 -1
- package/dist/components-page/sign-up.js.map +1 -1
- package/dist/components-page/stack-handler-client.js +13 -1
- package/dist/components-page/stack-handler-client.js.map +1 -1
- package/dist/components-page/stack-handler.js.map +1 -1
- package/dist/components-page/team-creation.js.map +1 -1
- package/dist/components-page/team-invitation.js +15 -1
- package/dist/components-page/team-invitation.js.map +1 -1
- package/dist/esm/components/api-key-dialogs.js.map +1 -1
- package/dist/esm/components/api-key-table.js.map +1 -1
- package/dist/esm/components/credential-sign-in.js.map +1 -1
- package/dist/esm/components/credential-sign-up.js.map +1 -1
- package/dist/esm/components/elements/form-warning.js.map +1 -1
- package/dist/esm/components/elements/maybe-full-page.js.map +1 -1
- package/dist/esm/components/elements/separator-with-text.js.map +1 -1
- package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
- package/dist/esm/components/elements/ssr-layout-effect.js.map +1 -1
- package/dist/esm/components/elements/user-avatar.js.map +1 -1
- package/dist/esm/components/link.js.map +1 -1
- package/dist/esm/components/magic-link-sign-in.js.map +1 -1
- package/dist/esm/components/message-cards/known-error-message-card.js.map +1 -1
- package/dist/esm/components/message-cards/message-card.js.map +1 -1
- package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -1
- package/dist/esm/components/oauth-button-group.js.map +1 -1
- package/dist/esm/components/oauth-button.js.map +1 -1
- package/dist/esm/components/passkey-button.js.map +1 -1
- package/dist/esm/components/profile-image-editor.js.map +1 -1
- package/dist/esm/components/selected-team-switcher.js.map +1 -1
- package/dist/esm/components/team-icon.js.map +1 -1
- package/dist/esm/components/team-switcher.js.map +1 -1
- package/dist/esm/components/use-in-iframe.js.map +1 -1
- package/dist/esm/components/user-button.js.map +1 -1
- package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/editable-text.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js +4 -3
- package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/notifications/notifications-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/page-layout.js.map +1 -1
- package/dist/esm/components-page/account-settings/payments/payments-page.js +55 -0
- package/dist/esm/components-page/account-settings/payments/payments-page.js.map +1 -0
- package/dist/esm/components-page/account-settings/payments/payments-panel.js +350 -0
- package/dist/esm/components-page/account-settings/payments/payments-panel.js.map +1 -0
- package/dist/esm/components-page/account-settings/profile-page/profile-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/section.js.map +1 -1
- package/dist/esm/components-page/account-settings/settings/delete-account-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/settings/settings-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/settings/sign-out-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/leave-team-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-creation-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-display-name-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-profile-image-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-profile-user-section.js.map +1 -1
- package/dist/esm/components-page/account-settings.js +23 -3
- package/dist/esm/components-page/account-settings.js.map +1 -1
- package/dist/esm/components-page/auth-page.js.map +1 -1
- package/dist/esm/components-page/cli-auth-confirm.js.map +1 -1
- package/dist/esm/components-page/email-verification.js.map +1 -1
- package/dist/esm/components-page/error-page.js.map +1 -1
- package/dist/esm/components-page/forgot-password.js.map +1 -1
- package/dist/esm/components-page/magic-link-callback.js.map +1 -1
- package/dist/esm/components-page/mfa.js.map +1 -1
- package/dist/esm/components-page/oauth-callback.js.map +1 -1
- package/dist/esm/components-page/onboarding.js +146 -0
- package/dist/esm/components-page/onboarding.js.map +1 -0
- package/dist/esm/components-page/password-reset.js.map +1 -1
- package/dist/esm/components-page/section.js.map +1 -1
- package/dist/esm/components-page/sign-in.js.map +1 -1
- package/dist/esm/components-page/sign-out.js.map +1 -1
- package/dist/esm/components-page/sign-up.js.map +1 -1
- package/dist/esm/components-page/stack-handler-client.js +13 -1
- package/dist/esm/components-page/stack-handler-client.js.map +1 -1
- package/dist/esm/components-page/stack-handler.js.map +1 -1
- package/dist/esm/components-page/team-creation.js.map +1 -1
- package/dist/esm/components-page/team-invitation.js +15 -1
- package/dist/esm/components-page/team-invitation.js.map +1 -1
- package/dist/esm/generated/global-css.js +1 -1
- package/dist/esm/generated/global-css.js.map +1 -1
- package/dist/esm/generated/quetzal-translations.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/integrations/convex/component/convex.config.js.map +1 -1
- package/dist/esm/integrations/convex.js.map +1 -1
- package/dist/esm/lib/auth.js.map +1 -1
- package/dist/esm/lib/cookie.js.map +1 -1
- package/dist/esm/lib/hooks.js.map +1 -1
- package/dist/esm/lib/stack-app/api-keys/index.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +235 -0
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js +210 -29
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/common.js +2 -1
- package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/index.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js +40 -27
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/index.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
- package/dist/esm/lib/stack-app/common.js.map +1 -1
- package/dist/esm/lib/stack-app/contact-channels/index.js.map +1 -1
- package/dist/esm/lib/stack-app/email-templates/index.js.map +1 -1
- package/dist/esm/lib/stack-app/index.js.map +1 -1
- package/dist/esm/lib/stack-app/internal-api-keys/index.js.map +1 -1
- package/dist/esm/lib/stack-app/permissions/index.js.map +1 -1
- package/dist/esm/lib/stack-app/projects/index.js +4 -0
- package/dist/esm/lib/stack-app/projects/index.js.map +1 -1
- package/dist/esm/lib/stack-app/teams/index.js.map +1 -1
- package/dist/esm/lib/stack-app/users/index.js +13 -12
- package/dist/esm/lib/stack-app/users/index.js.map +1 -1
- package/dist/esm/lib/translations.js.map +1 -1
- package/dist/esm/providers/stack-provider-client.js.map +1 -1
- package/dist/esm/providers/stack-provider.js.map +1 -1
- package/dist/esm/providers/theme-provider.js.map +1 -1
- package/dist/esm/providers/translation-provider-client.js.map +1 -1
- package/dist/esm/providers/translation-provider.js.map +1 -1
- package/dist/esm/utils/browser-script.js.map +1 -1
- package/dist/esm/utils/constants.js.map +1 -1
- package/dist/esm/utils/url.js.map +1 -1
- package/dist/generated/global-css.js +1 -1
- package/dist/generated/global-css.js.map +1 -1
- package/dist/generated/quetzal-translations.js.map +1 -1
- package/dist/index.d.mts +306 -17
- package/dist/index.d.ts +306 -17
- package/dist/index.js.map +1 -1
- package/dist/integrations/convex/component/convex.config.js.map +1 -1
- package/dist/integrations/convex.js.map +1 -1
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/cookie.js.map +1 -1
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/stack-app/api-keys/index.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +235 -0
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/client-app-impl.js +208 -27
- package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/common.js +2 -1
- package/dist/lib/stack-app/apps/implementations/common.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/index.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/server-app-impl.js +38 -25
- package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/index.js.map +1 -1
- package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
- package/dist/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
- package/dist/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
- package/dist/lib/stack-app/common.js.map +1 -1
- package/dist/lib/stack-app/connected-accounts/index.js.map +1 -1
- package/dist/lib/stack-app/contact-channels/index.js.map +1 -1
- package/dist/lib/stack-app/customers/index.js.map +1 -1
- package/dist/lib/stack-app/data-vault/index.js.map +1 -1
- package/dist/lib/stack-app/email/index.js.map +1 -1
- package/dist/lib/stack-app/email-templates/index.js.map +1 -1
- package/dist/lib/stack-app/index.js.map +1 -1
- package/dist/lib/stack-app/internal-api-keys/index.js.map +1 -1
- package/dist/lib/stack-app/notification-categories/index.js.map +1 -1
- package/dist/lib/stack-app/permissions/index.js.map +1 -1
- package/dist/lib/stack-app/project-configs/index.js.map +1 -1
- package/dist/lib/stack-app/projects/index.js +4 -0
- package/dist/lib/stack-app/projects/index.js.map +1 -1
- package/dist/lib/stack-app/teams/index.js.map +1 -1
- package/dist/lib/stack-app/users/index.js +15 -14
- package/dist/lib/stack-app/users/index.js.map +1 -1
- package/dist/lib/translations.js.map +1 -1
- package/dist/providers/stack-provider-client.js.map +1 -1
- package/dist/providers/stack-provider.js.map +1 -1
- package/dist/providers/theme-provider.js.map +1 -1
- package/dist/providers/translation-provider-client.js.map +1 -1
- package/dist/providers/translation-provider.js.map +1 -1
- package/dist/utils/browser-script.js.map +1 -1
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/url.js.map +1 -1
- package/package.json +19 -16
- 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 `
|
|
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
|
-
|
|
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:
|
|
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(
|
|
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<
|
|
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,
|
|
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":[]}
|
package/dist/lib/auth.js.map
CHANGED
|
@@ -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":[]}
|