@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.
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 +75 -38
  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 +75 -38
  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 +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
- _clientTeamPermissionFromCrud(crud) {
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(crud.id, (0, import_url.constructRedirectUrl)(app.urls.emailVerification), session);
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(scope, options) {
723
- const recursive = options?.recursive ?? true;
724
- const permissions = import_results.Result.orThrow(await app._currentUserPermissionsCache.getOrWait([session, scope.id, recursive], "write-only"));
725
- return permissions.map((crud2) => app._clientTeamPermissionFromCrud(crud2));
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(scope, options) {
728
- const recursive = options?.recursive ?? true;
729
- const permissions = (0, import_common3.useAsyncCache)(app._currentUserPermissionsCache, [session, scope.id, recursive], "user.usePermissions()");
730
- return (0, import_react2.useMemo)(() => permissions.map((crud2) => app._clientTeamPermissionFromCrud(crud2)), [permissions]);
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(scope, permissionId) {
733
- const permissions = this.usePermissions(scope);
734
- return (0, import_react2.useMemo)(() => permissions.find((p) => p.id === permissionId) ?? null, [permissions, permissionId]);
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(scope, permissionId) {
737
- const permissions = await this.listPermissions(scope);
738
- return permissions.find((p) => p.id === permissionId) ?? null;
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(scope, permissionId) {
741
- return await this.getPermission(scope, permissionId) !== null;
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
- if (!options?.callbackUrl && !await app._getCurrentUrl()) {
751
- 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: ... })`");
752
- }
753
- return await app._interface.sendVerificationEmail(crud.primary_email, options?.callbackUrl ?? (0, import_url.constructRedirectUrl)(app.urls.emailVerification), session);
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
- if (!options?.callbackUrl && !await this._getCurrentUrl()) {
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
- if (!options?.callbackUrl && !await this._getCurrentUrl()) {
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,