@stackframe/stack 2.7.19 → 2.7.21

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 (150) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/components/credential-sign-in.js +2 -1
  3. package/dist/components/credential-sign-in.js.map +1 -1
  4. package/dist/components/credential-sign-up.js.map +1 -1
  5. package/dist/components/elements/form-warning.js.map +1 -1
  6. package/dist/components/elements/maybe-full-page.js.map +1 -1
  7. package/dist/components/elements/separator-with-text.js.map +1 -1
  8. package/dist/components/elements/sidebar-layout.js +10 -7
  9. package/dist/components/elements/sidebar-layout.js.map +1 -1
  10. package/dist/components/elements/ssr-layout-effect.js.map +1 -1
  11. package/dist/components/elements/user-avatar.js.map +1 -1
  12. package/dist/components/iframe-preventer.js.map +1 -1
  13. package/dist/components/link.d.mts +14 -0
  14. package/dist/components/link.d.ts +14 -0
  15. package/dist/components/link.js +63 -0
  16. package/dist/components/link.js.map +1 -0
  17. package/dist/components/magic-link-sign-in.js.map +1 -1
  18. package/dist/components/message-cards/known-error-message-card.js.map +1 -1
  19. package/dist/components/message-cards/message-card.js.map +1 -1
  20. package/dist/components/message-cards/predefined-message-card.js.map +1 -1
  21. package/dist/components/oauth-button-group.js.map +1 -1
  22. package/dist/components/oauth-button.js.map +1 -1
  23. package/dist/components/passkey-button.js.map +1 -1
  24. package/dist/components/profile-image-editor.js.map +1 -1
  25. package/dist/components/selected-team-switcher.js +4 -5
  26. package/dist/components/selected-team-switcher.js.map +1 -1
  27. package/dist/components/team-icon.js.map +1 -1
  28. package/dist/components/user-button.js.map +1 -1
  29. package/dist/components-page/account-settings.js +2 -3
  30. package/dist/components-page/account-settings.js.map +1 -1
  31. package/dist/components-page/auth-page.js +3 -2
  32. package/dist/components-page/auth-page.js.map +1 -1
  33. package/dist/components-page/email-verification.js.map +1 -1
  34. package/dist/components-page/error-page.js.map +1 -1
  35. package/dist/components-page/forgot-password.js +2 -1
  36. package/dist/components-page/forgot-password.js.map +1 -1
  37. package/dist/components-page/magic-link-callback.js.map +1 -1
  38. package/dist/components-page/oauth-callback.js +4 -4
  39. package/dist/components-page/oauth-callback.js.map +1 -1
  40. package/dist/components-page/password-reset.js.map +1 -1
  41. package/dist/components-page/sign-in.js.map +1 -1
  42. package/dist/components-page/sign-out.js.map +1 -1
  43. package/dist/components-page/sign-up.js.map +1 -1
  44. package/dist/components-page/stack-handler.d.mts +5 -3
  45. package/dist/components-page/stack-handler.d.ts +5 -3
  46. package/dist/components-page/stack-handler.js +173 -157
  47. package/dist/components-page/stack-handler.js.map +1 -1
  48. package/dist/components-page/team-creation.js +2 -3
  49. package/dist/components-page/team-creation.js.map +1 -1
  50. package/dist/components-page/team-invitation.js.map +1 -1
  51. package/dist/esm/components/credential-sign-in.js +2 -1
  52. package/dist/esm/components/credential-sign-in.js.map +1 -1
  53. package/dist/esm/components/credential-sign-up.js.map +1 -1
  54. package/dist/esm/components/elements/form-warning.js.map +1 -1
  55. package/dist/esm/components/elements/maybe-full-page.js.map +1 -1
  56. package/dist/esm/components/elements/separator-with-text.js.map +1 -1
  57. package/dist/esm/components/elements/sidebar-layout.js +10 -7
  58. package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
  59. package/dist/esm/components/elements/ssr-layout-effect.js.map +1 -1
  60. package/dist/esm/components/elements/user-avatar.js.map +1 -1
  61. package/dist/esm/components/iframe-preventer.js.map +1 -1
  62. package/dist/esm/components/link.js +28 -0
  63. package/dist/esm/components/link.js.map +1 -0
  64. package/dist/esm/components/magic-link-sign-in.js.map +1 -1
  65. package/dist/esm/components/message-cards/known-error-message-card.js.map +1 -1
  66. package/dist/esm/components/message-cards/message-card.js.map +1 -1
  67. package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -1
  68. package/dist/esm/components/oauth-button-group.js.map +1 -1
  69. package/dist/esm/components/oauth-button.js.map +1 -1
  70. package/dist/esm/components/passkey-button.js.map +1 -1
  71. package/dist/esm/components/profile-image-editor.js.map +1 -1
  72. package/dist/esm/components/selected-team-switcher.js +4 -5
  73. package/dist/esm/components/selected-team-switcher.js.map +1 -1
  74. package/dist/esm/components/team-icon.js.map +1 -1
  75. package/dist/esm/components/user-button.js.map +1 -1
  76. package/dist/esm/components-page/account-settings.js +2 -3
  77. package/dist/esm/components-page/account-settings.js.map +1 -1
  78. package/dist/esm/components-page/auth-page.js +2 -1
  79. package/dist/esm/components-page/auth-page.js.map +1 -1
  80. package/dist/esm/components-page/email-verification.js.map +1 -1
  81. package/dist/esm/components-page/error-page.js.map +1 -1
  82. package/dist/esm/components-page/forgot-password.js +2 -1
  83. package/dist/esm/components-page/forgot-password.js.map +1 -1
  84. package/dist/esm/components-page/magic-link-callback.js.map +1 -1
  85. package/dist/esm/components-page/oauth-callback.js +4 -4
  86. package/dist/esm/components-page/oauth-callback.js.map +1 -1
  87. package/dist/esm/components-page/password-reset.js.map +1 -1
  88. package/dist/esm/components-page/sign-in.js.map +1 -1
  89. package/dist/esm/components-page/sign-out.js.map +1 -1
  90. package/dist/esm/components-page/sign-up.js.map +1 -1
  91. package/dist/esm/components-page/stack-handler.js +173 -157
  92. package/dist/esm/components-page/stack-handler.js.map +1 -1
  93. package/dist/esm/components-page/team-creation.js +2 -3
  94. package/dist/esm/components-page/team-creation.js.map +1 -1
  95. package/dist/esm/components-page/team-invitation.js.map +1 -1
  96. package/dist/esm/generated/quetzal-translations.js.map +1 -1
  97. package/dist/esm/index.js.map +1 -1
  98. package/dist/esm/lib/auth.js.map +1 -1
  99. package/dist/esm/lib/cookie.js +4 -7
  100. package/dist/esm/lib/cookie.js.map +1 -1
  101. package/dist/esm/lib/hooks.js.map +1 -1
  102. package/dist/esm/lib/stack-app.js +38 -16
  103. package/dist/esm/lib/stack-app.js.map +1 -1
  104. package/dist/esm/lib/translations.js.map +1 -1
  105. package/dist/esm/providers/stack-provider-client.js +1 -2
  106. package/dist/esm/providers/stack-provider-client.js.map +1 -1
  107. package/dist/esm/providers/stack-provider.js +8 -7
  108. package/dist/esm/providers/stack-provider.js.map +1 -1
  109. package/dist/esm/providers/theme-provider.js.map +1 -1
  110. package/dist/esm/providers/translation-provider-client.js.map +1 -1
  111. package/dist/esm/providers/translation-provider.js +1 -1
  112. package/dist/esm/providers/translation-provider.js.map +1 -1
  113. package/dist/esm/utils/browser-script.js.map +1 -1
  114. package/dist/esm/utils/constants.js.map +1 -1
  115. package/dist/esm/utils/url.js +4 -13
  116. package/dist/esm/utils/url.js.map +1 -1
  117. package/dist/generated/quetzal-translations.js.map +1 -1
  118. package/dist/index.js.map +1 -1
  119. package/dist/lib/auth.js.map +1 -1
  120. package/dist/lib/cookie.d.mts +2 -2
  121. package/dist/lib/cookie.d.ts +2 -2
  122. package/dist/lib/cookie.js +5 -8
  123. package/dist/lib/cookie.js.map +1 -1
  124. package/dist/lib/hooks.js.map +1 -1
  125. package/dist/lib/stack-app.d.mts +6 -1
  126. package/dist/lib/stack-app.d.ts +6 -1
  127. package/dist/lib/stack-app.js +37 -15
  128. package/dist/lib/stack-app.js.map +1 -1
  129. package/dist/lib/translations.js.map +1 -1
  130. package/dist/providers/stack-provider-client.d.mts +2 -1
  131. package/dist/providers/stack-provider-client.d.ts +2 -1
  132. package/dist/providers/stack-provider-client.js +1 -2
  133. package/dist/providers/stack-provider-client.js.map +1 -1
  134. package/dist/providers/stack-provider.d.mts +2 -2
  135. package/dist/providers/stack-provider.d.ts +2 -2
  136. package/dist/providers/stack-provider.js +8 -7
  137. package/dist/providers/stack-provider.js.map +1 -1
  138. package/dist/providers/theme-provider.js.map +1 -1
  139. package/dist/providers/translation-provider-client.js.map +1 -1
  140. package/dist/providers/translation-provider.d.mts +1 -1
  141. package/dist/providers/translation-provider.d.ts +1 -1
  142. package/dist/providers/translation-provider.js +1 -1
  143. package/dist/providers/translation-provider.js.map +1 -1
  144. package/dist/utils/browser-script.js.map +1 -1
  145. package/dist/utils/constants.js.map +1 -1
  146. package/dist/utils/url.d.mts +1 -2
  147. package/dist/utils/url.d.ts +1 -2
  148. package/dist/utils/url.js +4 -14
  149. package/dist/utils/url.js.map +1 -1
  150. package/package.json +5 -5
@@ -14,7 +14,10 @@ type RequestLike = {
14
14
  get: (name: string) => string | null;
15
15
  };
16
16
  };
17
- type RedirectMethod = "window" | "nextjs" | "none";
17
+ type RedirectMethod = "window" | "nextjs" | "none" | {
18
+ useNavigate: () => (to: string) => void;
19
+ navigate?: (to: string) => void;
20
+ };
18
21
  type TokenStoreInit<HasTokenStore extends boolean = boolean> = HasTokenStore extends true ? ("cookie" | "nextjs-cookie" | "memory" | RequestLike | {
19
22
  accessToken: string;
20
23
  refreshToken: string;
@@ -639,6 +642,7 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
639
642
  email: string;
640
643
  password: string;
641
644
  noRedirect?: boolean;
645
+ verificationCallbackUrl?: string;
642
646
  }): Promise<Result<undefined, KnownErrors["UserEmailAlreadyExists"] | KnownErrors["PasswordRequirementsNotMet"]>>;
643
647
  signInWithPasskey(): Promise<Result<undefined, KnownErrors["PasskeyAuthenticationFailed"] | KnownErrors["InvalidTotpCode"] | KnownErrors["PasskeyWebAuthnError"]>>;
644
648
  callOAuthCallback(): Promise<boolean>;
@@ -677,6 +681,7 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
677
681
  or: 'throw';
678
682
  }): Promise<ProjectCurrentUser<ProjectId>>;
679
683
  getUser(options?: GetUserOptions<HasTokenStore>): Promise<ProjectCurrentUser<ProjectId> | null>;
684
+ useNavigate(): (to: string) => void;
680
685
  [stackAppInternalsSymbol]: {
681
686
  toClientJson(): StackClientAppJson<HasTokenStore, ProjectId>;
682
687
  setCurrentUser(userJsonPromise: Promise<CurrentUserCrud['Client']['Read'] | null>): void;
@@ -14,7 +14,10 @@ type RequestLike = {
14
14
  get: (name: string) => string | null;
15
15
  };
16
16
  };
17
- type RedirectMethod = "window" | "nextjs" | "none";
17
+ type RedirectMethod = "window" | "nextjs" | "none" | {
18
+ useNavigate: () => (to: string) => void;
19
+ navigate?: (to: string) => void;
20
+ };
18
21
  type TokenStoreInit<HasTokenStore extends boolean = boolean> = HasTokenStore extends true ? ("cookie" | "nextjs-cookie" | "memory" | RequestLike | {
19
22
  accessToken: string;
20
23
  refreshToken: string;
@@ -639,6 +642,7 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
639
642
  email: string;
640
643
  password: string;
641
644
  noRedirect?: boolean;
645
+ verificationCallbackUrl?: string;
642
646
  }): Promise<Result<undefined, KnownErrors["UserEmailAlreadyExists"] | KnownErrors["PasswordRequirementsNotMet"]>>;
643
647
  signInWithPasskey(): Promise<Result<undefined, KnownErrors["PasskeyAuthenticationFailed"] | KnownErrors["InvalidTotpCode"] | KnownErrors["PasskeyWebAuthnError"]>>;
644
648
  callOAuthCallback(): Promise<boolean>;
@@ -677,6 +681,7 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
677
681
  or: 'throw';
678
682
  }): Promise<ProjectCurrentUser<ProjectId>>;
679
683
  getUser(options?: GetUserOptions<HasTokenStore>): Promise<ProjectCurrentUser<ProjectId> | null>;
684
+ useNavigate(): (to: string) => void;
680
685
  [stackAppInternalsSymbol]: {
681
686
  toClientJson(): StackClientAppJson<HasTokenStore, ProjectId>;
682
687
  setCurrentUser(userJsonPromise: Promise<CurrentUserCrud['Client']['Read'] | null>): void;
@@ -63,10 +63,11 @@ var import_url = require("../utils/url");
63
63
  var import_auth = require("./auth");
64
64
  var import_cookie = require("./cookie");
65
65
  var sc = __toESM(require("@stackframe/stack-sc"));
66
+ var import_stack_sc = require("@stackframe/stack-sc");
66
67
  var isReactServer2 = false;
67
68
  isReactServer2 = sc.isReactServer;
68
69
  var NextNavigation = (0, import_compile_time.scrambleDuringCompileTime)(NextNavigationUnscrambled);
69
- var clientVersion = "js @stackframe/stack@2.7.19";
70
+ var clientVersion = "js @stackframe/stack@2.7.21";
70
71
  if (clientVersion.startsWith("STACK_COMPILE_TIME")) {
71
72
  throw new import_errors.StackAssertionError("Client version was not replaced. Something went wrong during build!");
72
73
  }
@@ -262,6 +263,7 @@ var _StackClientAppImpl = class __StackClientAppImpl {
262
263
  }
263
264
  );
264
265
  this._memoryTokenStore = createEmptyTokenStore();
266
+ this._nextServerCookiesTokenStores = /* @__PURE__ */ new WeakMap();
265
267
  this._requestTokenStores = /* @__PURE__ */ new WeakMap();
266
268
  this._storedBrowserCookieTokenStore = null;
267
269
  /**
@@ -280,7 +282,10 @@ var _StackClientAppImpl = class __StackClientAppImpl {
280
282
  getBaseUrl: () => getBaseUrl(_options.baseUrl),
281
283
  projectId: _options.projectId ?? getDefaultProjectId(),
282
284
  clientVersion,
283
- publishableClientKey: _options.publishableClientKey ?? getDefaultPublishableClientKey()
285
+ publishableClientKey: _options.publishableClientKey ?? getDefaultPublishableClientKey(),
286
+ prepareRequest: async () => {
287
+ await (0, import_stack_sc.cookies)?.();
288
+ }
284
289
  });
285
290
  }
286
291
  this._tokenStoreInit = _options.tokenStore;
@@ -303,7 +308,7 @@ var _StackClientAppImpl = class __StackClientAppImpl {
303
308
  if (this._tokenStoreInit === "nextjs-cookie" || this._tokenStoreInit === "cookie") {
304
309
  return await (0, import_cookie.createCookieHelper)();
305
310
  } else {
306
- return await (0, import_cookie.createEmptyCookieHelper)();
311
+ return await (0, import_cookie.createPlaceholderCookieHelper)();
307
312
  }
308
313
  }
309
314
  async _getUserOAuthConnectionCacheFn(options) {
@@ -384,9 +389,9 @@ var _StackClientAppImpl = class __StackClientAppImpl {
384
389
  get _refreshTokenCookieName() {
385
390
  return `stack-refresh-${this.projectId}`;
386
391
  }
387
- _getTokensFromCookies(cookies) {
388
- const refreshToken = cookies.refreshTokenCookie;
389
- const accessTokenObject = cookies.accessTokenCookie?.startsWith('["') ? JSON.parse(cookies.accessTokenCookie) : null;
392
+ _getTokensFromCookies(cookies2) {
393
+ const refreshToken = cookies2.refreshTokenCookie;
394
+ const accessTokenObject = cookies2.accessTokenCookie?.startsWith('["') ? JSON.parse(cookies2.accessTokenCookie) : null;
390
395
  const accessToken = accessTokenObject && refreshToken === accessTokenObject[0] ? accessTokenObject[1] : null;
391
396
  return {
392
397
  refreshToken,
@@ -959,16 +964,29 @@ var _StackClientAppImpl = class __StackClientAppImpl {
959
964
  async _redirectTo(options) {
960
965
  if (this._redirectMethod === "none") {
961
966
  return;
962
- }
963
- if (isReactServer2 && this._redirectMethod === "nextjs") {
967
+ } else if (isReactServer2 && this._redirectMethod === "nextjs") {
964
968
  NextNavigation.redirect(options.url.toString(), options.replace ? NextNavigation.RedirectType.replace : NextNavigation.RedirectType.push);
969
+ } else if (typeof this._redirectMethod === "object" && this._redirectMethod.navigate) {
970
+ this._redirectMethod.navigate(options.url.toString());
965
971
  } else {
966
972
  if (options.replace) {
967
973
  window.location.replace(options.url);
968
974
  } else {
969
975
  window.location.assign(options.url);
970
976
  }
971
- await (0, import_promises.wait)(2e3);
977
+ }
978
+ await (0, import_promises.wait)(2e3);
979
+ }
980
+ useNavigate() {
981
+ if (typeof this._redirectMethod === "object") {
982
+ return this._redirectMethod.useNavigate();
983
+ } else if (this._redirectMethod === "window") {
984
+ return () => window.location.assign;
985
+ } else if (this._redirectMethod === "nextjs") {
986
+ return NextNavigation.useRouter().push;
987
+ } else {
988
+ return (to) => {
989
+ };
972
990
  }
973
991
  }
974
992
  async _redirectIfTrusted(url, options) {
@@ -1135,7 +1153,6 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1135
1153
  }
1136
1154
  useUser(options) {
1137
1155
  this._ensurePersistentTokenStore(options?.tokenStore);
1138
- const router = NextNavigation.useRouter();
1139
1156
  const session = this._useSession(options?.tokenStore);
1140
1157
  const crud = useAsyncCache(this._currentUserCache, [session], "useUser()");
1141
1158
  if (crud === null) {
@@ -1233,7 +1250,7 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1233
1250
  async signUpWithCredential(options) {
1234
1251
  this._ensurePersistentTokenStore();
1235
1252
  const session = await this._getSession();
1236
- const emailVerificationRedirectUrl = (0, import_url.constructRedirectUrl)(this.urls.emailVerification);
1253
+ const emailVerificationRedirectUrl = options.verificationCallbackUrl ?? (0, import_url.constructRedirectUrl)(this.urls.emailVerification);
1237
1254
  const result = await this._interface.signUpWithCredential(
1238
1255
  options.email,
1239
1256
  options.password,
@@ -1432,6 +1449,9 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1432
1449
  if (!("publishableClientKey" in this._interface.options)) {
1433
1450
  throw new import_errors.StackAssertionError("Cannot serialize to JSON from an application without a publishable client key");
1434
1451
  }
1452
+ if (typeof this._redirectMethod !== "string") {
1453
+ throw new import_errors.StackAssertionError("Cannot serialize to JSON from an application with a non-string redirect method");
1454
+ }
1435
1455
  return {
1436
1456
  baseUrl: this._options.baseUrl,
1437
1457
  projectId: this.projectId,
@@ -1439,7 +1459,8 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1439
1459
  tokenStore: this._tokenStoreInit,
1440
1460
  urls: this._urlOptions,
1441
1461
  oauthScopesOnSignIn: this._oauthScopesOnSignIn,
1442
- uniqueIdentifier: this._getUniqueIdentifier()
1462
+ uniqueIdentifier: this._getUniqueIdentifier(),
1463
+ redirectMethod: this._redirectMethod
1443
1464
  };
1444
1465
  },
1445
1466
  setCurrentUser: (userJsonPromise) => {
@@ -1473,7 +1494,8 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
1473
1494
  publishableClientKey: options.publishableClientKey,
1474
1495
  tokenStore: options.tokenStore,
1475
1496
  urls: options.urls ?? {},
1476
- oauthScopesOnSignIn: options.oauthScopesOnSignIn ?? {}
1497
+ oauthScopesOnSignIn: options.oauthScopesOnSignIn ?? {},
1498
+ redirectMethod: options.redirectMethod
1477
1499
  });
1478
1500
  // TODO override the client user cache to use the server user cache, so we save some requests
1479
1501
  this._currentServerUserCache = createCacheBySession(async (session) => {
@@ -1869,7 +1891,6 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
1869
1891
  return this.useUserById(options);
1870
1892
  } else {
1871
1893
  this._ensurePersistentTokenStore(options?.tokenStore);
1872
- const router = NextNavigation.useRouter();
1873
1894
  const session = this._useSession(options?.tokenStore);
1874
1895
  const crud = useAsyncCache(this._currentServerUserCache, [session], "useUser()");
1875
1896
  if (crud === null) {
@@ -1981,7 +2002,8 @@ var _StackAdminAppImpl = class extends _StackServerAppImpl {
1981
2002
  projectId: options.projectId,
1982
2003
  tokenStore: options.tokenStore,
1983
2004
  urls: options.urls,
1984
- oauthScopesOnSignIn: options.oauthScopesOnSignIn
2005
+ oauthScopesOnSignIn: options.oauthScopesOnSignIn,
2006
+ redirectMethod: options.redirectMethod
1985
2007
  });
1986
2008
  this._adminProjectCache = createCache(async () => {
1987
2009
  return await this._interface.getProject();