@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.
Files changed (61) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/components-page/account-settings.js +3 -3
  3. package/dist/components-page/account-settings.js.map +1 -1
  4. package/dist/components-page/oauth-callback.js +31 -13
  5. package/dist/components-page/oauth-callback.js.map +1 -1
  6. package/dist/esm/components-page/account-settings.js +3 -3
  7. package/dist/esm/components-page/account-settings.js.map +1 -1
  8. package/dist/esm/components-page/oauth-callback.js +31 -13
  9. package/dist/esm/components-page/oauth-callback.js.map +1 -1
  10. package/dist/esm/generated/global-css.js +1 -1
  11. package/dist/esm/generated/global-css.js.map +1 -1
  12. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +33 -6
  13. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
  14. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js +103 -21
  15. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  16. package/dist/esm/lib/stack-app/apps/implementations/common.js +6 -6
  17. package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -1
  18. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js +90 -20
  19. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
  20. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
  21. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
  22. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
  23. package/dist/esm/lib/stack-app/common.js.map +1 -1
  24. package/dist/esm/lib/stack-app/index.js.map +1 -1
  25. package/dist/esm/lib/stack-app/permissions/index.js +16 -0
  26. package/dist/esm/lib/stack-app/permissions/index.js.map +1 -1
  27. package/dist/esm/lib/stack-app/projects/index.js +1 -0
  28. package/dist/esm/lib/stack-app/projects/index.js.map +1 -1
  29. package/dist/esm/lib/stack-app/users/index.js.map +1 -1
  30. package/dist/esm/providers/stack-provider.js +1 -1
  31. package/dist/esm/providers/stack-provider.js.map +1 -1
  32. package/dist/esm/providers/theme-provider.js +2 -2
  33. package/dist/esm/providers/theme-provider.js.map +1 -1
  34. package/dist/generated/global-css.js +1 -1
  35. package/dist/generated/global-css.js.map +1 -1
  36. package/dist/index.d.mts +75 -4
  37. package/dist/index.d.ts +75 -4
  38. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +32 -5
  39. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
  40. package/dist/lib/stack-app/apps/implementations/client-app-impl.js +103 -21
  41. package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  42. package/dist/lib/stack-app/apps/implementations/common.js +6 -6
  43. package/dist/lib/stack-app/apps/implementations/common.js.map +1 -1
  44. package/dist/lib/stack-app/apps/implementations/server-app-impl.js +89 -19
  45. package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
  46. package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
  47. package/dist/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
  48. package/dist/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
  49. package/dist/lib/stack-app/common.js.map +1 -1
  50. package/dist/lib/stack-app/index.js.map +1 -1
  51. package/dist/lib/stack-app/permissions/index.js +18 -0
  52. package/dist/lib/stack-app/permissions/index.js.map +1 -1
  53. package/dist/lib/stack-app/project-configs/index.js.map +1 -1
  54. package/dist/lib/stack-app/projects/index.js +1 -0
  55. package/dist/lib/stack-app/projects/index.js.map +1 -1
  56. package/dist/lib/stack-app/users/index.js.map +1 -1
  57. package/dist/providers/stack-provider.js +1 -1
  58. package/dist/providers/stack-provider.js.map +1 -1
  59. package/dist/providers/theme-provider.js +2 -2
  60. package/dist/providers/theme-provider.js.map +1 -1
  61. 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
- _clientTeamPermissionFromCrud(crud) {
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(scope, options) {
722
- const recursive = options?.recursive ?? true;
723
- const permissions = import_results.Result.orThrow(await app._currentUserPermissionsCache.getOrWait([session, scope.id, recursive], "write-only"));
724
- return permissions.map((crud2) => app._clientTeamPermissionFromCrud(crud2));
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(scope, options) {
727
- const recursive = options?.recursive ?? true;
728
- const permissions = (0, import_common3.useAsyncCache)(app._currentUserPermissionsCache, [session, scope.id, recursive], "user.usePermissions()");
729
- return (0, import_react2.useMemo)(() => permissions.map((crud2) => app._clientTeamPermissionFromCrud(crud2)), [permissions]);
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(scope, permissionId) {
732
- const permissions = this.usePermissions(scope);
733
- return (0, import_react2.useMemo)(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);
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(scope, permissionId) {
736
- const permissions = await this.listPermissions(scope);
737
- return permissions.find((p) => p.id === permissionId) ?? null;
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(scope, permissionId) {
740
- return await this.getPermission(scope, permissionId) !== null;
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
- const crud = import_results.Result.orThrow(await this._currentUserCache.getOrWait([session], "write-only"));
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
- default: {
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
- const crud = (0, import_common3.useAsyncCache)(this._currentUserCache, [session], "useUser()");
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;