@stackframe/react 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 +75 -38
- 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 +75 -38
- 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 +4 -4
|
@@ -48,7 +48,6 @@ var import_strings = require("@stackframe/stack-shared/dist/utils/strings");
|
|
|
48
48
|
var import_urls = require("@stackframe/stack-shared/dist/utils/urls");
|
|
49
49
|
var import_uuids = require("@stackframe/stack-shared/dist/utils/uuids");
|
|
50
50
|
var cookie = __toESM(require("cookie"));
|
|
51
|
-
var import_react2 = __toESM(require("react"));
|
|
52
51
|
var import_url = require("../../../../utils/url");
|
|
53
52
|
var import_auth = require("../../../auth");
|
|
54
53
|
var import_cookie = require("../../../cookie");
|
|
@@ -58,6 +57,7 @@ var import_projects = require("../../projects");
|
|
|
58
57
|
var import_teams = require("../../teams");
|
|
59
58
|
var import_users = require("../../users");
|
|
60
59
|
var import_common2 = require("./common");
|
|
60
|
+
var import_react2 = __toESM(require("react"));
|
|
61
61
|
var import_common3 = require("./common");
|
|
62
62
|
var isReactServer = false;
|
|
63
63
|
var process = globalThis.process ?? { env: {} };
|
|
@@ -86,6 +86,9 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
86
86
|
this._currentUserPermissionsCache = (0, import_common2.createCacheBySession)(async (session, [teamId, recursive]) => {
|
|
87
87
|
return await this._interface.listCurrentUserTeamPermissions({ teamId, recursive }, session);
|
|
88
88
|
});
|
|
89
|
+
this._currentUserProjectPermissionsCache = (0, import_common2.createCacheBySession)(async (session, [recursive]) => {
|
|
90
|
+
return await this._interface.listCurrentUserProjectPermissions({ recursive }, session);
|
|
91
|
+
});
|
|
89
92
|
this._currentUserTeamsCache = (0, import_common2.createCacheBySession)(async (session) => {
|
|
90
93
|
return await this._interface.listCurrentUserTeams(session);
|
|
91
94
|
});
|
|
@@ -475,7 +478,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
475
478
|
}
|
|
476
479
|
};
|
|
477
480
|
}
|
|
478
|
-
|
|
481
|
+
_clientPermissionFromCrud(crud) {
|
|
479
482
|
return {
|
|
480
483
|
id: crud.id
|
|
481
484
|
};
|
|
@@ -509,14 +512,11 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
509
512
|
clientMetadata: crud.client_metadata,
|
|
510
513
|
clientReadOnlyMetadata: crud.client_read_only_metadata,
|
|
511
514
|
async inviteUser(options) {
|
|
512
|
-
if (!options.callbackUrl && !await app._getCurrentUrl()) {
|
|
513
|
-
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: ... })`");
|
|
514
|
-
}
|
|
515
515
|
await app._interface.sendTeamInvitation({
|
|
516
516
|
teamId: crud.id,
|
|
517
517
|
email: options.email,
|
|
518
518
|
session,
|
|
519
|
-
callbackUrl: options.callbackUrl ?? (0, import_url.constructRedirectUrl)(app.urls.teamInvitation)
|
|
519
|
+
callbackUrl: options.callbackUrl ?? (0, import_url.constructRedirectUrl)(app.urls.teamInvitation, "callbackUrl")
|
|
520
520
|
});
|
|
521
521
|
await app._teamInvitationsCache.refresh([session, crud.id]);
|
|
522
522
|
},
|
|
@@ -555,8 +555,12 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
555
555
|
isVerified: crud.is_verified,
|
|
556
556
|
isPrimary: crud.is_primary,
|
|
557
557
|
usedForAuth: crud.used_for_auth,
|
|
558
|
-
async sendVerificationEmail() {
|
|
559
|
-
await app._interface.sendCurrentUserContactChannelVerificationEmail(
|
|
558
|
+
async sendVerificationEmail(options) {
|
|
559
|
+
await app._interface.sendCurrentUserContactChannelVerificationEmail(
|
|
560
|
+
crud.id,
|
|
561
|
+
options?.callbackUrl || (0, import_url.constructRedirectUrl)(app.urls.emailVerification, "callbackUrl"),
|
|
562
|
+
session
|
|
563
|
+
);
|
|
560
564
|
},
|
|
561
565
|
async update(data) {
|
|
562
566
|
await app._interface.updateClientContactChannel(crud.id, (0, import_contact_channels.contactChannelUpdateOptionsToCrud)(data), session);
|
|
@@ -658,6 +662,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
658
662
|
oauthProviders: crud.oauth_providers,
|
|
659
663
|
passkeyAuthEnabled: crud.passkey_auth_enabled,
|
|
660
664
|
isMultiFactorRequired: crud.requires_totp_mfa,
|
|
665
|
+
isAnonymous: crud.is_anonymous,
|
|
661
666
|
toClientJson() {
|
|
662
667
|
return crud;
|
|
663
668
|
}
|
|
@@ -714,31 +719,68 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
714
719
|
async createTeam(data) {
|
|
715
720
|
const crud2 = await app._interface.createClientTeam((0, import_teams.teamCreateOptionsToCrud)(data, "me"), session);
|
|
716
721
|
await app._currentUserTeamsCache.refresh([session]);
|
|
722
|
+
await this.update({ selectedTeamId: crud2.id });
|
|
717
723
|
return app._clientTeamFromCrud(crud2, session);
|
|
718
724
|
},
|
|
719
725
|
async leaveTeam(team) {
|
|
720
726
|
await app._interface.leaveTeam(team.id, session);
|
|
721
727
|
},
|
|
722
|
-
async listPermissions(
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
728
|
+
async listPermissions(scopeOrOptions, options) {
|
|
729
|
+
if (scopeOrOptions && "id" in scopeOrOptions) {
|
|
730
|
+
const scope = scopeOrOptions;
|
|
731
|
+
const recursive = options?.recursive ?? true;
|
|
732
|
+
const permissions = import_results.Result.orThrow(await app._currentUserPermissionsCache.getOrWait([session, scope.id, recursive], "write-only"));
|
|
733
|
+
return permissions.map((crud2) => app._clientPermissionFromCrud(crud2));
|
|
734
|
+
} else {
|
|
735
|
+
const opts = scopeOrOptions;
|
|
736
|
+
const recursive = opts?.recursive ?? true;
|
|
737
|
+
const permissions = import_results.Result.orThrow(await app._currentUserProjectPermissionsCache.getOrWait([session, recursive], "write-only"));
|
|
738
|
+
return permissions.map((crud2) => app._clientPermissionFromCrud(crud2));
|
|
739
|
+
}
|
|
726
740
|
},
|
|
727
|
-
usePermissions(
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
741
|
+
usePermissions(scopeOrOptions, options) {
|
|
742
|
+
if (scopeOrOptions && "id" in scopeOrOptions) {
|
|
743
|
+
const scope = scopeOrOptions;
|
|
744
|
+
const recursive = options?.recursive ?? true;
|
|
745
|
+
const permissions = (0, import_common3.useAsyncCache)(app._currentUserPermissionsCache, [session, scope.id, recursive], "user.usePermissions()");
|
|
746
|
+
return (0, import_react2.useMemo)(() => permissions.map((crud2) => app._clientPermissionFromCrud(crud2)), [permissions]);
|
|
747
|
+
} else {
|
|
748
|
+
const opts = scopeOrOptions;
|
|
749
|
+
const recursive = opts?.recursive ?? true;
|
|
750
|
+
const permissions = (0, import_common3.useAsyncCache)(app._currentUserProjectPermissionsCache, [session, recursive], "user.usePermissions()");
|
|
751
|
+
return (0, import_react2.useMemo)(() => permissions.map((crud2) => app._clientPermissionFromCrud(crud2)), [permissions]);
|
|
752
|
+
}
|
|
731
753
|
},
|
|
732
|
-
usePermission(
|
|
733
|
-
|
|
734
|
-
|
|
754
|
+
usePermission(scopeOrPermissionId, permissionId) {
|
|
755
|
+
if (scopeOrPermissionId && typeof scopeOrPermissionId !== "string") {
|
|
756
|
+
const scope = scopeOrPermissionId;
|
|
757
|
+
const permissions = this.usePermissions(scope);
|
|
758
|
+
return (0, import_react2.useMemo)(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);
|
|
759
|
+
} else {
|
|
760
|
+
const pid = scopeOrPermissionId;
|
|
761
|
+
const permissions = this.usePermissions();
|
|
762
|
+
return (0, import_react2.useMemo)(() => permissions.find((p) => p.id === pid) ?? null, [permissions, pid]);
|
|
763
|
+
}
|
|
735
764
|
},
|
|
736
|
-
async getPermission(
|
|
737
|
-
|
|
738
|
-
|
|
765
|
+
async getPermission(scopeOrPermissionId, permissionId) {
|
|
766
|
+
if (scopeOrPermissionId && typeof scopeOrPermissionId !== "string") {
|
|
767
|
+
const scope = scopeOrPermissionId;
|
|
768
|
+
const permissions = await this.listPermissions(scope);
|
|
769
|
+
return permissions.find((p) => p.id === permissionId) ?? null;
|
|
770
|
+
} else {
|
|
771
|
+
const pid = scopeOrPermissionId;
|
|
772
|
+
const permissions = await this.listPermissions();
|
|
773
|
+
return permissions.find((p) => p.id === pid) ?? null;
|
|
774
|
+
}
|
|
739
775
|
},
|
|
740
|
-
async hasPermission(
|
|
741
|
-
|
|
776
|
+
async hasPermission(scopeOrPermissionId, permissionId) {
|
|
777
|
+
if (scopeOrPermissionId && typeof scopeOrPermissionId !== "string") {
|
|
778
|
+
const scope = scopeOrPermissionId;
|
|
779
|
+
return await this.getPermission(scope, permissionId) !== null;
|
|
780
|
+
} else {
|
|
781
|
+
const pid = scopeOrPermissionId;
|
|
782
|
+
return await this.getPermission(pid) !== null;
|
|
783
|
+
}
|
|
742
784
|
},
|
|
743
785
|
async update(update) {
|
|
744
786
|
return await app._updateClientUser(update, session);
|
|
@@ -747,10 +789,11 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
747
789
|
if (!crud.primary_email) {
|
|
748
790
|
throw new import_errors.StackAssertionError("User does not have a primary email");
|
|
749
791
|
}
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
792
|
+
return await app._interface.sendVerificationEmail(
|
|
793
|
+
crud.primary_email,
|
|
794
|
+
options?.callbackUrl ?? (0, import_url.constructRedirectUrl)(app.urls.emailVerification, "callbackUrl"),
|
|
795
|
+
session
|
|
796
|
+
);
|
|
754
797
|
},
|
|
755
798
|
async updatePassword(options) {
|
|
756
799
|
const result = await app._interface.updatePassword(options, session);
|
|
@@ -965,16 +1008,10 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
965
1008
|
return await this._redirectToHandler("teamInvitation", options);
|
|
966
1009
|
}
|
|
967
1010
|
async sendForgotPasswordEmail(email, options) {
|
|
968
|
-
|
|
969
|
-
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: ... })`");
|
|
970
|
-
}
|
|
971
|
-
return await this._interface.sendForgotPasswordEmail(email, options?.callbackUrl ?? (0, import_url.constructRedirectUrl)(this.urls.passwordReset));
|
|
1011
|
+
return await this._interface.sendForgotPasswordEmail(email, options?.callbackUrl ?? (0, import_url.constructRedirectUrl)(this.urls.passwordReset, "callbackUrl"));
|
|
972
1012
|
}
|
|
973
1013
|
async sendMagicLinkEmail(email, options) {
|
|
974
|
-
|
|
975
|
-
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: ... })`");
|
|
976
|
-
}
|
|
977
|
-
return await this._interface.sendMagicLinkEmail(email, options?.callbackUrl ?? (0, import_url.constructRedirectUrl)(this.urls.magicLinkCallback));
|
|
1014
|
+
return await this._interface.sendMagicLinkEmail(email, options?.callbackUrl ?? (0, import_url.constructRedirectUrl)(this.urls.magicLinkCallback, "callbackUrl"));
|
|
978
1015
|
}
|
|
979
1016
|
async resetPassword(options) {
|
|
980
1017
|
return await this._interface.resetPassword(options);
|
|
@@ -1037,7 +1074,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1037
1074
|
}
|
|
1038
1075
|
case "anonymous": {
|
|
1039
1076
|
const tokens = await this._signUpAnonymously();
|
|
1040
|
-
return await this.getUser({ tokenStore: tokens }) ?? (0, import_errors.throwErr)("Something went wrong while signing up anonymously");
|
|
1077
|
+
return await this.getUser({ tokenStore: tokens, or: "anonymous-if-exists" }) ?? (0, import_errors.throwErr)("Something went wrong while signing up anonymously");
|
|
1041
1078
|
}
|
|
1042
1079
|
case void 0:
|
|
1043
1080
|
case "anonymous-if-exists":
|
|
@@ -1161,7 +1198,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1161
1198
|
async signUpWithCredential(options) {
|
|
1162
1199
|
this._ensurePersistentTokenStore();
|
|
1163
1200
|
const session = await this._getSession();
|
|
1164
|
-
const emailVerificationRedirectUrl = options.verificationCallbackUrl ?? (0, import_url.constructRedirectUrl)(this.urls.emailVerification);
|
|
1201
|
+
const emailVerificationRedirectUrl = options.verificationCallbackUrl ?? (0, import_url.constructRedirectUrl)(this.urls.emailVerification, "verificationCallbackUrl");
|
|
1165
1202
|
const result = await this._interface.signUpWithCredential(
|
|
1166
1203
|
options.email,
|
|
1167
1204
|
options.password,
|