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