@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.
Files changed (59) 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/auth.js +6 -6
  13. package/dist/esm/lib/auth.js.map +1 -1
  14. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +33 -6
  15. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
  16. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js +76 -39
  17. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  18. package/dist/esm/lib/stack-app/apps/implementations/common.js +1 -1
  19. package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -1
  20. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js +66 -25
  21. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
  22. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
  23. package/dist/esm/lib/stack-app/index.js.map +1 -1
  24. package/dist/esm/lib/stack-app/permissions/index.js +16 -0
  25. package/dist/esm/lib/stack-app/permissions/index.js.map +1 -1
  26. package/dist/esm/lib/stack-app/projects/index.js +1 -0
  27. package/dist/esm/lib/stack-app/projects/index.js.map +1 -1
  28. package/dist/esm/lib/stack-app/users/index.js.map +1 -1
  29. package/dist/esm/providers/theme-provider.js +2 -2
  30. package/dist/esm/providers/theme-provider.js.map +1 -1
  31. package/dist/esm/utils/url.js +2 -2
  32. package/dist/esm/utils/url.js.map +1 -1
  33. package/dist/generated/global-css.js +1 -1
  34. package/dist/generated/global-css.js.map +1 -1
  35. package/dist/index.d.mts +63 -3
  36. package/dist/index.d.ts +63 -3
  37. package/dist/lib/auth.js +6 -6
  38. package/dist/lib/auth.js.map +1 -1
  39. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +32 -5
  40. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
  41. package/dist/lib/stack-app/apps/implementations/client-app-impl.js +76 -39
  42. package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  43. package/dist/lib/stack-app/apps/implementations/common.js +1 -1
  44. package/dist/lib/stack-app/apps/implementations/common.js.map +1 -1
  45. package/dist/lib/stack-app/apps/implementations/server-app-impl.js +66 -25
  46. package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
  47. package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
  48. package/dist/lib/stack-app/index.js.map +1 -1
  49. package/dist/lib/stack-app/permissions/index.js +18 -0
  50. package/dist/lib/stack-app/permissions/index.js.map +1 -1
  51. package/dist/lib/stack-app/project-configs/index.js.map +1 -1
  52. package/dist/lib/stack-app/projects/index.js +1 -0
  53. package/dist/lib/stack-app/projects/index.js.map +1 -1
  54. package/dist/lib/stack-app/users/index.js.map +1 -1
  55. package/dist/providers/theme-provider.js +2 -2
  56. package/dist/providers/theme-provider.js.map +1 -1
  57. package/dist/utils/url.js +2 -2
  58. package/dist/utils/url.js.map +1 -1
  59. 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
- _clientTeamPermissionFromCrud(crud) {
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(crud.id, (0, import_url.constructRedirectUrl)(app.urls.emailVerification), session);
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(scope, options) {
730
- const recursive = options?.recursive ?? true;
731
- const permissions = import_results.Result.orThrow(await app._currentUserPermissionsCache.getOrWait([session, scope.id, recursive], "write-only"));
732
- return permissions.map((crud2) => app._clientTeamPermissionFromCrud(crud2));
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(scope, options) {
735
- const recursive = options?.recursive ?? true;
736
- const permissions = (0, import_common3.useAsyncCache)(app._currentUserPermissionsCache, [session, scope.id, recursive], "user.usePermissions()");
737
- return (0, import_react2.useMemo)(() => permissions.map((crud2) => app._clientTeamPermissionFromCrud(crud2)), [permissions]);
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(scope, permissionId) {
740
- const permissions = this.usePermissions(scope);
741
- return (0, import_react2.useMemo)(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);
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(scope, permissionId) {
744
- const permissions = await this.listPermissions(scope);
745
- return permissions.find((p) => p.id === permissionId) ?? null;
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(scope, permissionId) {
748
- return await this.getPermission(scope, permissionId) !== null;
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
- if (!options?.callbackUrl && !await app._getCurrentUrl()) {
758
- throw new Error("Cannot send verification email without a callback URL from the server or without a redirect method. Make sure you pass the `callbackUrl` option: `sendVerificationEmail({ callbackUrl: ... })`");
759
- }
760
- return await app._interface.sendVerificationEmail(crud.primary_email, options?.callbackUrl ?? (0, import_url.constructRedirectUrl)(app.urls.emailVerification), session);
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
- if (!options?.callbackUrl && !await this._getCurrentUrl()) {
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
- if (!options?.callbackUrl && !await this._getCurrentUrl()) {
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,