@stackframe/stack 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 +104 -22
  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 +104 -22
  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 +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
  });
@@ -140,6 +143,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
140
143
  return await this._interface.listClientContactChannels(session);
141
144
  }
142
145
  );
146
+ this._anonymousSignUpInProgress = null;
143
147
  this._memoryTokenStore = (0, import_common2.createEmptyTokenStore)();
144
148
  this._nextServerCookiesTokenStores = /* @__PURE__ */ new WeakMap();
145
149
  this._requestTokenStores = /* @__PURE__ */ new WeakMap();
@@ -481,7 +485,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
481
485
  }
482
486
  };
483
487
  }
484
- _clientTeamPermissionFromCrud(crud) {
488
+ _clientPermissionFromCrud(crud) {
485
489
  return {
486
490
  id: crud.id
487
491
  };
@@ -720,31 +724,68 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
720
724
  async createTeam(data) {
721
725
  const crud2 = await app._interface.createClientTeam((0, import_teams.teamCreateOptionsToCrud)(data, "me"), session);
722
726
  await app._currentUserTeamsCache.refresh([session]);
727
+ await this.update({ selectedTeamId: crud2.id });
723
728
  return app._clientTeamFromCrud(crud2, session);
724
729
  },
725
730
  async leaveTeam(team) {
726
731
  await app._interface.leaveTeam(team.id, session);
727
732
  },
728
- async listPermissions(scope, options) {
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._clientTeamPermissionFromCrud(crud2));
733
+ async listPermissions(scopeOrOptions, options) {
734
+ if (scopeOrOptions && "id" in scopeOrOptions) {
735
+ const scope = scopeOrOptions;
736
+ const recursive = options?.recursive ?? true;
737
+ const permissions = import_results.Result.orThrow(await app._currentUserPermissionsCache.getOrWait([session, scope.id, recursive], "write-only"));
738
+ return permissions.map((crud2) => app._clientPermissionFromCrud(crud2));
739
+ } else {
740
+ const opts = scopeOrOptions;
741
+ const recursive = opts?.recursive ?? true;
742
+ const permissions = import_results.Result.orThrow(await app._currentUserProjectPermissionsCache.getOrWait([session, recursive], "write-only"));
743
+ return permissions.map((crud2) => app._clientPermissionFromCrud(crud2));
744
+ }
732
745
  },
733
- usePermissions(scope, options) {
734
- const recursive = options?.recursive ?? true;
735
- const permissions = (0, import_common3.useAsyncCache)(app._currentUserPermissionsCache, [session, scope.id, recursive], "user.usePermissions()");
736
- return (0, import_react2.useMemo)(() => permissions.map((crud2) => app._clientTeamPermissionFromCrud(crud2)), [permissions]);
746
+ usePermissions(scopeOrOptions, options) {
747
+ if (scopeOrOptions && "id" in scopeOrOptions) {
748
+ const scope = scopeOrOptions;
749
+ const recursive = options?.recursive ?? true;
750
+ const permissions = (0, import_common3.useAsyncCache)(app._currentUserPermissionsCache, [session, scope.id, recursive], "user.usePermissions()");
751
+ return (0, import_react2.useMemo)(() => permissions.map((crud2) => app._clientPermissionFromCrud(crud2)), [permissions]);
752
+ } else {
753
+ const opts = scopeOrOptions;
754
+ const recursive = opts?.recursive ?? true;
755
+ const permissions = (0, import_common3.useAsyncCache)(app._currentUserProjectPermissionsCache, [session, recursive], "user.usePermissions()");
756
+ return (0, import_react2.useMemo)(() => permissions.map((crud2) => app._clientPermissionFromCrud(crud2)), [permissions]);
757
+ }
737
758
  },
738
- usePermission(scope, permissionId) {
739
- const permissions = this.usePermissions(scope);
740
- return (0, import_react2.useMemo)(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);
759
+ usePermission(scopeOrPermissionId, permissionId) {
760
+ if (scopeOrPermissionId && typeof scopeOrPermissionId !== "string") {
761
+ const scope = scopeOrPermissionId;
762
+ const permissions = this.usePermissions(scope);
763
+ return (0, import_react2.useMemo)(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);
764
+ } else {
765
+ const pid = scopeOrPermissionId;
766
+ const permissions = this.usePermissions();
767
+ return (0, import_react2.useMemo)(() => permissions.find((p) => p.id === pid) ?? null, [permissions, pid]);
768
+ }
741
769
  },
742
- async getPermission(scope, permissionId) {
743
- const permissions = await this.listPermissions(scope);
744
- return permissions.find((p) => p.id === permissionId) ?? null;
770
+ async getPermission(scopeOrPermissionId, permissionId) {
771
+ if (scopeOrPermissionId && typeof scopeOrPermissionId !== "string") {
772
+ const scope = scopeOrPermissionId;
773
+ const permissions = await this.listPermissions(scope);
774
+ return permissions.find((p) => p.id === permissionId) ?? null;
775
+ } else {
776
+ const pid = scopeOrPermissionId;
777
+ const permissions = await this.listPermissions();
778
+ return permissions.find((p) => p.id === pid) ?? null;
779
+ }
745
780
  },
746
- async hasPermission(scope, permissionId) {
747
- return await this.getPermission(scope, permissionId) !== null;
781
+ async hasPermission(scopeOrPermissionId, permissionId) {
782
+ if (scopeOrPermissionId && typeof scopeOrPermissionId !== "string") {
783
+ const scope = scopeOrPermissionId;
784
+ return await this.getPermission(scope, permissionId) !== null;
785
+ } else {
786
+ const pid = scopeOrPermissionId;
787
+ return await this.getPermission(pid) !== null;
788
+ }
748
789
  },
749
790
  async update(update) {
750
791
  return await app._updateClientUser(update, session);
@@ -1033,7 +1074,10 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1033
1074
  async getUser(options) {
1034
1075
  this._ensurePersistentTokenStore(options?.tokenStore);
1035
1076
  const session = await this._getSession(options?.tokenStore);
1036
- const crud = import_results.Result.orThrow(await this._currentUserCache.getOrWait([session], "write-only"));
1077
+ let crud = import_results.Result.orThrow(await this._currentUserCache.getOrWait([session], "write-only"));
1078
+ if (crud?.is_anonymous && options?.or !== "anonymous" && options?.or !== "anonymous-if-exists") {
1079
+ crud = null;
1080
+ }
1037
1081
  if (crud === null) {
1038
1082
  switch (options?.or) {
1039
1083
  case "redirect": {
@@ -1043,7 +1087,13 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1043
1087
  case "throw": {
1044
1088
  throw new Error("User is not signed in but getUser was called with { or: 'throw' }");
1045
1089
  }
1046
- default: {
1090
+ case "anonymous": {
1091
+ const tokens = await this._signUpAnonymously();
1092
+ return await this.getUser({ tokenStore: tokens, or: "anonymous-if-exists" }) ?? (0, import_errors.throwErr)("Something went wrong while signing up anonymously");
1093
+ }
1094
+ case void 0:
1095
+ case "anonymous-if-exists":
1096
+ case "return-null": {
1047
1097
  return null;
1048
1098
  }
1049
1099
  }
@@ -1053,7 +1103,10 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1053
1103
  useUser(options) {
1054
1104
  this._ensurePersistentTokenStore(options?.tokenStore);
1055
1105
  const session = this._useSession(options?.tokenStore);
1056
- const crud = (0, import_common3.useAsyncCache)(this._currentUserCache, [session], "useUser()");
1106
+ let crud = (0, import_common3.useAsyncCache)(this._currentUserCache, [session], "useUser()");
1107
+ if (crud?.is_anonymous && options?.or !== "anonymous" && options?.or !== "anonymous-if-exists") {
1108
+ crud = null;
1109
+ }
1057
1110
  if (crud === null) {
1058
1111
  switch (options?.or) {
1059
1112
  case "redirect": {
@@ -1064,7 +1117,18 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1064
1117
  case "throw": {
1065
1118
  throw new Error("User is not signed in but useUser was called with { or: 'throw' }");
1066
1119
  }
1120
+ case "anonymous": {
1121
+ (0, import_promises.runAsynchronously)(async () => {
1122
+ await this._signUpAnonymously();
1123
+ if (typeof window !== "undefined") {
1124
+ window.location.reload();
1125
+ }
1126
+ });
1127
+ (0, import_react.suspend)();
1128
+ throw new import_errors.StackAssertionError("suspend should never return");
1129
+ }
1067
1130
  case void 0:
1131
+ case "anonymous-if-exists":
1068
1132
  case "return-null": {
1069
1133
  }
1070
1134
  }
@@ -1166,6 +1230,24 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
1166
1230
  return import_results.Result.error(result.error);
1167
1231
  }
1168
1232
  }
1233
+ async _signUpAnonymously() {
1234
+ this._ensurePersistentTokenStore();
1235
+ if (!this._anonymousSignUpInProgress) {
1236
+ this._anonymousSignUpInProgress = (async () => {
1237
+ this._ensurePersistentTokenStore();
1238
+ const session = await this._getSession();
1239
+ const result = await this._interface.signUpAnonymously(session);
1240
+ if (result.status === "ok") {
1241
+ await this._signInToAccountWithTokens(result.data);
1242
+ } else {
1243
+ throw new import_errors.StackAssertionError("signUpAnonymously() should never return an error");
1244
+ }
1245
+ this._anonymousSignUpInProgress = null;
1246
+ return result.data;
1247
+ })();
1248
+ }
1249
+ return await this._anonymousSignUpInProgress;
1250
+ }
1169
1251
  async signInWithMagicLink(code, options) {
1170
1252
  this._ensurePersistentTokenStore();
1171
1253
  let result;