@stackframe/stack 2.7.30 → 2.8.2
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/CHANGELOG.md +31 -0
- package/dist/components-page/account-settings.js +3 -3
- package/dist/components-page/account-settings.js.map +1 -1
- package/dist/components-page/oauth-callback.js +31 -13
- package/dist/components-page/oauth-callback.js.map +1 -1
- package/dist/esm/components-page/account-settings.js +3 -3
- package/dist/esm/components-page/account-settings.js.map +1 -1
- package/dist/esm/components-page/oauth-callback.js +31 -13
- package/dist/esm/components-page/oauth-callback.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/lib/auth.js +6 -6
- package/dist/esm/lib/auth.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +33 -6
- 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 +76 -39
- 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 +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js +66 -25
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
- package/dist/esm/lib/stack-app/index.js.map +1 -1
- package/dist/esm/lib/stack-app/permissions/index.js +16 -0
- package/dist/esm/lib/stack-app/permissions/index.js.map +1 -1
- package/dist/esm/lib/stack-app/projects/index.js +1 -0
- package/dist/esm/lib/stack-app/projects/index.js.map +1 -1
- package/dist/esm/lib/stack-app/users/index.js.map +1 -1
- package/dist/esm/providers/theme-provider.js +2 -2
- package/dist/esm/providers/theme-provider.js.map +1 -1
- package/dist/esm/utils/url.js +2 -2
- 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/index.d.mts +63 -3
- package/dist/index.d.ts +63 -3
- package/dist/lib/auth.js +6 -6
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +32 -5
- 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 +76 -39
- package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/common.js +1 -1
- package/dist/lib/stack-app/apps/implementations/common.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/server-app-impl.js +66 -25
- package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
- package/dist/lib/stack-app/index.js.map +1 -1
- package/dist/lib/stack-app/permissions/index.js +18 -0
- 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 +1 -0
- package/dist/lib/stack-app/projects/index.js.map +1 -1
- package/dist/lib/stack-app/users/index.js.map +1 -1
- package/dist/providers/theme-provider.js +2 -2
- package/dist/providers/theme-provider.js.map +1 -1
- package/dist/utils/url.js +2 -2
- package/dist/utils/url.js.map +1 -1
- package/package.json +5 -5
|
@@ -49,8 +49,6 @@ var import_strings = require("@stackframe/stack-shared/dist/utils/strings");
|
|
|
49
49
|
var import_urls = require("@stackframe/stack-shared/dist/utils/urls");
|
|
50
50
|
var import_uuids = require("@stackframe/stack-shared/dist/utils/uuids");
|
|
51
51
|
var cookie = __toESM(require("cookie"));
|
|
52
|
-
var NextNavigationUnscrambled = __toESM(require("next/navigation"));
|
|
53
|
-
var import_react2 = __toESM(require("react"));
|
|
54
52
|
var import_url = require("../../../../utils/url");
|
|
55
53
|
var import_auth = require("../../../auth");
|
|
56
54
|
var import_cookie = require("../../../cookie");
|
|
@@ -60,6 +58,8 @@ var import_projects = require("../../projects");
|
|
|
60
58
|
var import_teams = require("../../teams");
|
|
61
59
|
var import_users = require("../../users");
|
|
62
60
|
var import_common2 = require("./common");
|
|
61
|
+
var NextNavigationUnscrambled = __toESM(require("next/navigation"));
|
|
62
|
+
var import_react2 = __toESM(require("react"));
|
|
63
63
|
var import_common3 = require("./common");
|
|
64
64
|
var sc = __toESM(require("@stackframe/stack-sc"));
|
|
65
65
|
var import_stack_sc = require("@stackframe/stack-sc");
|
|
@@ -91,6 +91,9 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
91
91
|
this._currentUserPermissionsCache = (0, import_common2.createCacheBySession)(async (session, [teamId, recursive]) => {
|
|
92
92
|
return await this._interface.listCurrentUserTeamPermissions({ teamId, recursive }, session);
|
|
93
93
|
});
|
|
94
|
+
this._currentUserProjectPermissionsCache = (0, import_common2.createCacheBySession)(async (session, [recursive]) => {
|
|
95
|
+
return await this._interface.listCurrentUserProjectPermissions({ recursive }, session);
|
|
96
|
+
});
|
|
94
97
|
this._currentUserTeamsCache = (0, import_common2.createCacheBySession)(async (session) => {
|
|
95
98
|
return await this._interface.listCurrentUserTeams(session);
|
|
96
99
|
});
|
|
@@ -482,7 +485,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
482
485
|
}
|
|
483
486
|
};
|
|
484
487
|
}
|
|
485
|
-
|
|
488
|
+
_clientPermissionFromCrud(crud) {
|
|
486
489
|
return {
|
|
487
490
|
id: crud.id
|
|
488
491
|
};
|
|
@@ -516,14 +519,11 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
516
519
|
clientMetadata: crud.client_metadata,
|
|
517
520
|
clientReadOnlyMetadata: crud.client_read_only_metadata,
|
|
518
521
|
async inviteUser(options) {
|
|
519
|
-
if (!options.callbackUrl && !await app._getCurrentUrl()) {
|
|
520
|
-
throw new Error("Cannot invite user without a callback URL from the server or without a redirect method. Make sure you pass the `callbackUrl` option: `inviteUser({ email, callbackUrl: ... })`");
|
|
521
|
-
}
|
|
522
522
|
await app._interface.sendTeamInvitation({
|
|
523
523
|
teamId: crud.id,
|
|
524
524
|
email: options.email,
|
|
525
525
|
session,
|
|
526
|
-
callbackUrl: options.callbackUrl ?? (0, import_url.constructRedirectUrl)(app.urls.teamInvitation)
|
|
526
|
+
callbackUrl: options.callbackUrl ?? (0, import_url.constructRedirectUrl)(app.urls.teamInvitation, "callbackUrl")
|
|
527
527
|
});
|
|
528
528
|
await app._teamInvitationsCache.refresh([session, crud.id]);
|
|
529
529
|
},
|
|
@@ -562,8 +562,12 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
562
562
|
isVerified: crud.is_verified,
|
|
563
563
|
isPrimary: crud.is_primary,
|
|
564
564
|
usedForAuth: crud.used_for_auth,
|
|
565
|
-
async sendVerificationEmail() {
|
|
566
|
-
await app._interface.sendCurrentUserContactChannelVerificationEmail(
|
|
565
|
+
async sendVerificationEmail(options) {
|
|
566
|
+
await app._interface.sendCurrentUserContactChannelVerificationEmail(
|
|
567
|
+
crud.id,
|
|
568
|
+
options?.callbackUrl || (0, import_url.constructRedirectUrl)(app.urls.emailVerification, "callbackUrl"),
|
|
569
|
+
session
|
|
570
|
+
);
|
|
567
571
|
},
|
|
568
572
|
async update(data) {
|
|
569
573
|
await app._interface.updateClientContactChannel(crud.id, (0, import_contact_channels.contactChannelUpdateOptionsToCrud)(data), session);
|
|
@@ -665,6 +669,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
665
669
|
oauthProviders: crud.oauth_providers,
|
|
666
670
|
passkeyAuthEnabled: crud.passkey_auth_enabled,
|
|
667
671
|
isMultiFactorRequired: crud.requires_totp_mfa,
|
|
672
|
+
isAnonymous: crud.is_anonymous,
|
|
668
673
|
toClientJson() {
|
|
669
674
|
return crud;
|
|
670
675
|
}
|
|
@@ -721,31 +726,68 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
721
726
|
async createTeam(data) {
|
|
722
727
|
const crud2 = await app._interface.createClientTeam((0, import_teams.teamCreateOptionsToCrud)(data, "me"), session);
|
|
723
728
|
await app._currentUserTeamsCache.refresh([session]);
|
|
729
|
+
await this.update({ selectedTeamId: crud2.id });
|
|
724
730
|
return app._clientTeamFromCrud(crud2, session);
|
|
725
731
|
},
|
|
726
732
|
async leaveTeam(team) {
|
|
727
733
|
await app._interface.leaveTeam(team.id, session);
|
|
728
734
|
},
|
|
729
|
-
async listPermissions(
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
735
|
+
async listPermissions(scopeOrOptions, options) {
|
|
736
|
+
if (scopeOrOptions && "id" in scopeOrOptions) {
|
|
737
|
+
const scope = scopeOrOptions;
|
|
738
|
+
const recursive = options?.recursive ?? true;
|
|
739
|
+
const permissions = import_results.Result.orThrow(await app._currentUserPermissionsCache.getOrWait([session, scope.id, recursive], "write-only"));
|
|
740
|
+
return permissions.map((crud2) => app._clientPermissionFromCrud(crud2));
|
|
741
|
+
} else {
|
|
742
|
+
const opts = scopeOrOptions;
|
|
743
|
+
const recursive = opts?.recursive ?? true;
|
|
744
|
+
const permissions = import_results.Result.orThrow(await app._currentUserProjectPermissionsCache.getOrWait([session, recursive], "write-only"));
|
|
745
|
+
return permissions.map((crud2) => app._clientPermissionFromCrud(crud2));
|
|
746
|
+
}
|
|
733
747
|
},
|
|
734
|
-
usePermissions(
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
748
|
+
usePermissions(scopeOrOptions, options) {
|
|
749
|
+
if (scopeOrOptions && "id" in scopeOrOptions) {
|
|
750
|
+
const scope = scopeOrOptions;
|
|
751
|
+
const recursive = options?.recursive ?? true;
|
|
752
|
+
const permissions = (0, import_common3.useAsyncCache)(app._currentUserPermissionsCache, [session, scope.id, recursive], "user.usePermissions()");
|
|
753
|
+
return (0, import_react2.useMemo)(() => permissions.map((crud2) => app._clientPermissionFromCrud(crud2)), [permissions]);
|
|
754
|
+
} else {
|
|
755
|
+
const opts = scopeOrOptions;
|
|
756
|
+
const recursive = opts?.recursive ?? true;
|
|
757
|
+
const permissions = (0, import_common3.useAsyncCache)(app._currentUserProjectPermissionsCache, [session, recursive], "user.usePermissions()");
|
|
758
|
+
return (0, import_react2.useMemo)(() => permissions.map((crud2) => app._clientPermissionFromCrud(crud2)), [permissions]);
|
|
759
|
+
}
|
|
738
760
|
},
|
|
739
|
-
usePermission(
|
|
740
|
-
|
|
741
|
-
|
|
761
|
+
usePermission(scopeOrPermissionId, permissionId) {
|
|
762
|
+
if (scopeOrPermissionId && typeof scopeOrPermissionId !== "string") {
|
|
763
|
+
const scope = scopeOrPermissionId;
|
|
764
|
+
const permissions = this.usePermissions(scope);
|
|
765
|
+
return (0, import_react2.useMemo)(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);
|
|
766
|
+
} else {
|
|
767
|
+
const pid = scopeOrPermissionId;
|
|
768
|
+
const permissions = this.usePermissions();
|
|
769
|
+
return (0, import_react2.useMemo)(() => permissions.find((p) => p.id === pid) ?? null, [permissions, pid]);
|
|
770
|
+
}
|
|
742
771
|
},
|
|
743
|
-
async getPermission(
|
|
744
|
-
|
|
745
|
-
|
|
772
|
+
async getPermission(scopeOrPermissionId, permissionId) {
|
|
773
|
+
if (scopeOrPermissionId && typeof scopeOrPermissionId !== "string") {
|
|
774
|
+
const scope = scopeOrPermissionId;
|
|
775
|
+
const permissions = await this.listPermissions(scope);
|
|
776
|
+
return permissions.find((p) => p.id === permissionId) ?? null;
|
|
777
|
+
} else {
|
|
778
|
+
const pid = scopeOrPermissionId;
|
|
779
|
+
const permissions = await this.listPermissions();
|
|
780
|
+
return permissions.find((p) => p.id === pid) ?? null;
|
|
781
|
+
}
|
|
746
782
|
},
|
|
747
|
-
async hasPermission(
|
|
748
|
-
|
|
783
|
+
async hasPermission(scopeOrPermissionId, permissionId) {
|
|
784
|
+
if (scopeOrPermissionId && typeof scopeOrPermissionId !== "string") {
|
|
785
|
+
const scope = scopeOrPermissionId;
|
|
786
|
+
return await this.getPermission(scope, permissionId) !== null;
|
|
787
|
+
} else {
|
|
788
|
+
const pid = scopeOrPermissionId;
|
|
789
|
+
return await this.getPermission(pid) !== null;
|
|
790
|
+
}
|
|
749
791
|
},
|
|
750
792
|
async update(update) {
|
|
751
793
|
return await app._updateClientUser(update, session);
|
|
@@ -754,10 +796,11 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
754
796
|
if (!crud.primary_email) {
|
|
755
797
|
throw new import_errors.StackAssertionError("User does not have a primary email");
|
|
756
798
|
}
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
799
|
+
return await app._interface.sendVerificationEmail(
|
|
800
|
+
crud.primary_email,
|
|
801
|
+
options?.callbackUrl ?? (0, import_url.constructRedirectUrl)(app.urls.emailVerification, "callbackUrl"),
|
|
802
|
+
session
|
|
803
|
+
);
|
|
761
804
|
},
|
|
762
805
|
async updatePassword(options) {
|
|
763
806
|
const result = await app._interface.updatePassword(options, session);
|
|
@@ -977,16 +1020,10 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
977
1020
|
return await this._redirectToHandler("teamInvitation", options);
|
|
978
1021
|
}
|
|
979
1022
|
async sendForgotPasswordEmail(email, options) {
|
|
980
|
-
|
|
981
|
-
throw new Error("Cannot send forgot password email without a callback URL from the server or without a redirect method. Make sure you pass the `callbackUrl` option: `sendForgotPasswordEmail({ email, callbackUrl: ... })`");
|
|
982
|
-
}
|
|
983
|
-
return await this._interface.sendForgotPasswordEmail(email, options?.callbackUrl ?? (0, import_url.constructRedirectUrl)(this.urls.passwordReset));
|
|
1023
|
+
return await this._interface.sendForgotPasswordEmail(email, options?.callbackUrl ?? (0, import_url.constructRedirectUrl)(this.urls.passwordReset, "callbackUrl"));
|
|
984
1024
|
}
|
|
985
1025
|
async sendMagicLinkEmail(email, options) {
|
|
986
|
-
|
|
987
|
-
throw new Error("Cannot send magic link email without a callback URL from the server or without a redirect method. Make sure you pass the `callbackUrl` option: `sendMagicLinkEmail({ email, callbackUrl: ... })`");
|
|
988
|
-
}
|
|
989
|
-
return await this._interface.sendMagicLinkEmail(email, options?.callbackUrl ?? (0, import_url.constructRedirectUrl)(this.urls.magicLinkCallback));
|
|
1026
|
+
return await this._interface.sendMagicLinkEmail(email, options?.callbackUrl ?? (0, import_url.constructRedirectUrl)(this.urls.magicLinkCallback, "callbackUrl"));
|
|
990
1027
|
}
|
|
991
1028
|
async resetPassword(options) {
|
|
992
1029
|
return await this._interface.resetPassword(options);
|
|
@@ -1049,7 +1086,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1049
1086
|
}
|
|
1050
1087
|
case "anonymous": {
|
|
1051
1088
|
const tokens = await this._signUpAnonymously();
|
|
1052
|
-
return await this.getUser({ tokenStore: tokens }) ?? (0, import_errors.throwErr)("Something went wrong while signing up anonymously");
|
|
1089
|
+
return await this.getUser({ tokenStore: tokens, or: "anonymous-if-exists" }) ?? (0, import_errors.throwErr)("Something went wrong while signing up anonymously");
|
|
1053
1090
|
}
|
|
1054
1091
|
case void 0:
|
|
1055
1092
|
case "anonymous-if-exists":
|
|
@@ -1173,7 +1210,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1173
1210
|
async signUpWithCredential(options) {
|
|
1174
1211
|
this._ensurePersistentTokenStore();
|
|
1175
1212
|
const session = await this._getSession();
|
|
1176
|
-
const emailVerificationRedirectUrl = options.verificationCallbackUrl ?? (0, import_url.constructRedirectUrl)(this.urls.emailVerification);
|
|
1213
|
+
const emailVerificationRedirectUrl = options.verificationCallbackUrl ?? (0, import_url.constructRedirectUrl)(this.urls.emailVerification, "verificationCallbackUrl");
|
|
1177
1214
|
const result = await this._interface.signUpWithCredential(
|
|
1178
1215
|
options.email,
|
|
1179
1216
|
options.password,
|