@stackframe/react 2.7.29 → 2.8.1
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/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 +103 -21
- 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 +6 -6
- 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 +90 -20
- 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/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/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/stack-provider.js +1 -1
- package/dist/esm/providers/stack-provider.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/generated/global-css.js +1 -1
- package/dist/generated/global-css.js.map +1 -1
- package/dist/index.d.mts +75 -4
- package/dist/index.d.ts +75 -4
- 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 +103 -21
- package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/common.js +6 -6
- package/dist/lib/stack-app/apps/implementations/common.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/server-app-impl.js +89 -19
- 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/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/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/stack-provider.js +1 -1
- package/dist/providers/stack-provider.js.map +1 -1
- package/dist/providers/theme-provider.js +2 -2
- package/dist/providers/theme-provider.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
|
});
|
|
@@ -135,6 +138,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
135
138
|
return await this._interface.listClientContactChannels(session);
|
|
136
139
|
}
|
|
137
140
|
);
|
|
141
|
+
this._anonymousSignUpInProgress = null;
|
|
138
142
|
this._memoryTokenStore = (0, import_common2.createEmptyTokenStore)();
|
|
139
143
|
this._nextServerCookiesTokenStores = /* @__PURE__ */ new WeakMap();
|
|
140
144
|
this._requestTokenStores = /* @__PURE__ */ new WeakMap();
|
|
@@ -474,7 +478,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
474
478
|
}
|
|
475
479
|
};
|
|
476
480
|
}
|
|
477
|
-
|
|
481
|
+
_clientPermissionFromCrud(crud) {
|
|
478
482
|
return {
|
|
479
483
|
id: crud.id
|
|
480
484
|
};
|
|
@@ -713,31 +717,68 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
713
717
|
async createTeam(data) {
|
|
714
718
|
const crud2 = await app._interface.createClientTeam((0, import_teams.teamCreateOptionsToCrud)(data, "me"), session);
|
|
715
719
|
await app._currentUserTeamsCache.refresh([session]);
|
|
720
|
+
await this.update({ selectedTeamId: crud2.id });
|
|
716
721
|
return app._clientTeamFromCrud(crud2, session);
|
|
717
722
|
},
|
|
718
723
|
async leaveTeam(team) {
|
|
719
724
|
await app._interface.leaveTeam(team.id, session);
|
|
720
725
|
},
|
|
721
|
-
async listPermissions(
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
726
|
+
async listPermissions(scopeOrOptions, options) {
|
|
727
|
+
if (scopeOrOptions && "id" in scopeOrOptions) {
|
|
728
|
+
const scope = scopeOrOptions;
|
|
729
|
+
const recursive = options?.recursive ?? true;
|
|
730
|
+
const permissions = import_results.Result.orThrow(await app._currentUserPermissionsCache.getOrWait([session, scope.id, recursive], "write-only"));
|
|
731
|
+
return permissions.map((crud2) => app._clientPermissionFromCrud(crud2));
|
|
732
|
+
} else {
|
|
733
|
+
const opts = scopeOrOptions;
|
|
734
|
+
const recursive = opts?.recursive ?? true;
|
|
735
|
+
const permissions = import_results.Result.orThrow(await app._currentUserProjectPermissionsCache.getOrWait([session, recursive], "write-only"));
|
|
736
|
+
return permissions.map((crud2) => app._clientPermissionFromCrud(crud2));
|
|
737
|
+
}
|
|
725
738
|
},
|
|
726
|
-
usePermissions(
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
739
|
+
usePermissions(scopeOrOptions, options) {
|
|
740
|
+
if (scopeOrOptions && "id" in scopeOrOptions) {
|
|
741
|
+
const scope = scopeOrOptions;
|
|
742
|
+
const recursive = options?.recursive ?? true;
|
|
743
|
+
const permissions = (0, import_common3.useAsyncCache)(app._currentUserPermissionsCache, [session, scope.id, recursive], "user.usePermissions()");
|
|
744
|
+
return (0, import_react2.useMemo)(() => permissions.map((crud2) => app._clientPermissionFromCrud(crud2)), [permissions]);
|
|
745
|
+
} else {
|
|
746
|
+
const opts = scopeOrOptions;
|
|
747
|
+
const recursive = opts?.recursive ?? true;
|
|
748
|
+
const permissions = (0, import_common3.useAsyncCache)(app._currentUserProjectPermissionsCache, [session, recursive], "user.usePermissions()");
|
|
749
|
+
return (0, import_react2.useMemo)(() => permissions.map((crud2) => app._clientPermissionFromCrud(crud2)), [permissions]);
|
|
750
|
+
}
|
|
730
751
|
},
|
|
731
|
-
usePermission(
|
|
732
|
-
|
|
733
|
-
|
|
752
|
+
usePermission(scopeOrPermissionId, permissionId) {
|
|
753
|
+
if (scopeOrPermissionId && typeof scopeOrPermissionId !== "string") {
|
|
754
|
+
const scope = scopeOrPermissionId;
|
|
755
|
+
const permissions = this.usePermissions(scope);
|
|
756
|
+
return (0, import_react2.useMemo)(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);
|
|
757
|
+
} else {
|
|
758
|
+
const pid = scopeOrPermissionId;
|
|
759
|
+
const permissions = this.usePermissions();
|
|
760
|
+
return (0, import_react2.useMemo)(() => permissions.find((p) => p.id === pid) ?? null, [permissions, pid]);
|
|
761
|
+
}
|
|
734
762
|
},
|
|
735
|
-
async getPermission(
|
|
736
|
-
|
|
737
|
-
|
|
763
|
+
async getPermission(scopeOrPermissionId, permissionId) {
|
|
764
|
+
if (scopeOrPermissionId && typeof scopeOrPermissionId !== "string") {
|
|
765
|
+
const scope = scopeOrPermissionId;
|
|
766
|
+
const permissions = await this.listPermissions(scope);
|
|
767
|
+
return permissions.find((p) => p.id === permissionId) ?? null;
|
|
768
|
+
} else {
|
|
769
|
+
const pid = scopeOrPermissionId;
|
|
770
|
+
const permissions = await this.listPermissions();
|
|
771
|
+
return permissions.find((p) => p.id === pid) ?? null;
|
|
772
|
+
}
|
|
738
773
|
},
|
|
739
|
-
async hasPermission(
|
|
740
|
-
|
|
774
|
+
async hasPermission(scopeOrPermissionId, permissionId) {
|
|
775
|
+
if (scopeOrPermissionId && typeof scopeOrPermissionId !== "string") {
|
|
776
|
+
const scope = scopeOrPermissionId;
|
|
777
|
+
return await this.getPermission(scope, permissionId) !== null;
|
|
778
|
+
} else {
|
|
779
|
+
const pid = scopeOrPermissionId;
|
|
780
|
+
return await this.getPermission(pid) !== null;
|
|
781
|
+
}
|
|
741
782
|
},
|
|
742
783
|
async update(update) {
|
|
743
784
|
return await app._updateClientUser(update, session);
|
|
@@ -1021,7 +1062,10 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1021
1062
|
async getUser(options) {
|
|
1022
1063
|
this._ensurePersistentTokenStore(options?.tokenStore);
|
|
1023
1064
|
const session = await this._getSession(options?.tokenStore);
|
|
1024
|
-
|
|
1065
|
+
let crud = import_results.Result.orThrow(await this._currentUserCache.getOrWait([session], "write-only"));
|
|
1066
|
+
if (crud?.is_anonymous && options?.or !== "anonymous" && options?.or !== "anonymous-if-exists") {
|
|
1067
|
+
crud = null;
|
|
1068
|
+
}
|
|
1025
1069
|
if (crud === null) {
|
|
1026
1070
|
switch (options?.or) {
|
|
1027
1071
|
case "redirect": {
|
|
@@ -1031,7 +1075,13 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1031
1075
|
case "throw": {
|
|
1032
1076
|
throw new Error("User is not signed in but getUser was called with { or: 'throw' }");
|
|
1033
1077
|
}
|
|
1034
|
-
|
|
1078
|
+
case "anonymous": {
|
|
1079
|
+
const tokens = await this._signUpAnonymously();
|
|
1080
|
+
return await this.getUser({ tokenStore: tokens, or: "anonymous-if-exists" }) ?? (0, import_errors.throwErr)("Something went wrong while signing up anonymously");
|
|
1081
|
+
}
|
|
1082
|
+
case void 0:
|
|
1083
|
+
case "anonymous-if-exists":
|
|
1084
|
+
case "return-null": {
|
|
1035
1085
|
return null;
|
|
1036
1086
|
}
|
|
1037
1087
|
}
|
|
@@ -1041,7 +1091,10 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1041
1091
|
useUser(options) {
|
|
1042
1092
|
this._ensurePersistentTokenStore(options?.tokenStore);
|
|
1043
1093
|
const session = this._useSession(options?.tokenStore);
|
|
1044
|
-
|
|
1094
|
+
let crud = (0, import_common3.useAsyncCache)(this._currentUserCache, [session], "useUser()");
|
|
1095
|
+
if (crud?.is_anonymous && options?.or !== "anonymous" && options?.or !== "anonymous-if-exists") {
|
|
1096
|
+
crud = null;
|
|
1097
|
+
}
|
|
1045
1098
|
if (crud === null) {
|
|
1046
1099
|
switch (options?.or) {
|
|
1047
1100
|
case "redirect": {
|
|
@@ -1052,7 +1105,18 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1052
1105
|
case "throw": {
|
|
1053
1106
|
throw new Error("User is not signed in but useUser was called with { or: 'throw' }");
|
|
1054
1107
|
}
|
|
1108
|
+
case "anonymous": {
|
|
1109
|
+
(0, import_promises.runAsynchronously)(async () => {
|
|
1110
|
+
await this._signUpAnonymously();
|
|
1111
|
+
if (typeof window !== "undefined") {
|
|
1112
|
+
window.location.reload();
|
|
1113
|
+
}
|
|
1114
|
+
});
|
|
1115
|
+
(0, import_react.suspend)();
|
|
1116
|
+
throw new import_errors.StackAssertionError("suspend should never return");
|
|
1117
|
+
}
|
|
1055
1118
|
case void 0:
|
|
1119
|
+
case "anonymous-if-exists":
|
|
1056
1120
|
case "return-null": {
|
|
1057
1121
|
}
|
|
1058
1122
|
}
|
|
@@ -1154,6 +1218,24 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1154
1218
|
return import_results.Result.error(result.error);
|
|
1155
1219
|
}
|
|
1156
1220
|
}
|
|
1221
|
+
async _signUpAnonymously() {
|
|
1222
|
+
this._ensurePersistentTokenStore();
|
|
1223
|
+
if (!this._anonymousSignUpInProgress) {
|
|
1224
|
+
this._anonymousSignUpInProgress = (async () => {
|
|
1225
|
+
this._ensurePersistentTokenStore();
|
|
1226
|
+
const session = await this._getSession();
|
|
1227
|
+
const result = await this._interface.signUpAnonymously(session);
|
|
1228
|
+
if (result.status === "ok") {
|
|
1229
|
+
await this._signInToAccountWithTokens(result.data);
|
|
1230
|
+
} else {
|
|
1231
|
+
throw new import_errors.StackAssertionError("signUpAnonymously() should never return an error");
|
|
1232
|
+
}
|
|
1233
|
+
this._anonymousSignUpInProgress = null;
|
|
1234
|
+
return result.data;
|
|
1235
|
+
})();
|
|
1236
|
+
}
|
|
1237
|
+
return await this._anonymousSignUpInProgress;
|
|
1238
|
+
}
|
|
1157
1239
|
async signInWithMagicLink(code, options) {
|
|
1158
1240
|
this._ensurePersistentTokenStore();
|
|
1159
1241
|
let result;
|