@stackframe/stack 2.4.4 → 2.4.7

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 (39) hide show
  1. package/dist/components/card-frame.d.mts +1 -1
  2. package/dist/components/card-frame.d.ts +1 -1
  3. package/dist/components/user-avatar.js +19 -1
  4. package/dist/components/user-avatar.js.map +1 -1
  5. package/dist/components-core/button.js +1 -1
  6. package/dist/components-core/button.js.map +1 -1
  7. package/dist/components-core/index.d.mts +4 -4
  8. package/dist/components-core/index.d.ts +4 -4
  9. package/dist/components-core/loading-indicator.d.mts +4 -6
  10. package/dist/components-core/loading-indicator.d.ts +4 -6
  11. package/dist/components-core/loading-indicator.js +9 -6
  12. package/dist/components-core/loading-indicator.js.map +1 -1
  13. package/dist/components-core-joy/text.d.mts +2 -2
  14. package/dist/components-core-joy/text.d.ts +2 -2
  15. package/dist/components-page/oauth-callback.js +21 -6
  16. package/dist/components-page/oauth-callback.js.map +1 -1
  17. package/dist/components-page/stack-handler.js +8 -0
  18. package/dist/components-page/stack-handler.js.map +1 -1
  19. package/dist/esm/components/user-avatar.js +9 -1
  20. package/dist/esm/components/user-avatar.js.map +1 -1
  21. package/dist/esm/components-core/button.js +1 -1
  22. package/dist/esm/components-core/button.js.map +1 -1
  23. package/dist/esm/components-core/loading-indicator.js +9 -6
  24. package/dist/esm/components-core/loading-indicator.js.map +1 -1
  25. package/dist/esm/components-page/oauth-callback.js +21 -6
  26. package/dist/esm/components-page/oauth-callback.js.map +1 -1
  27. package/dist/esm/components-page/stack-handler.js +10 -2
  28. package/dist/esm/components-page/stack-handler.js.map +1 -1
  29. package/dist/esm/lib/stack-app.js +56 -71
  30. package/dist/esm/lib/stack-app.js.map +1 -1
  31. package/dist/lib/stack-app.d.mts +9 -3
  32. package/dist/lib/stack-app.d.ts +9 -3
  33. package/dist/lib/stack-app.js +55 -70
  34. package/dist/lib/stack-app.js.map +1 -1
  35. package/dist/providers/component-provider.d.mts +6 -6
  36. package/dist/providers/component-provider.d.ts +6 -6
  37. package/dist/providers/joy-provider.d.mts +2 -2
  38. package/dist/providers/joy-provider.d.ts +2 -2
  39. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components-page/oauth-callback.tsx"],"sourcesContent":["'use client';\n\nimport { useRef, useEffect, useState } from \"react\";\nimport { useStackApp } from \"..\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport MessageCard from \"../components/message-card\";\n\nexport default function OAuthCallback () {\n const app = useStackApp();\n const called = useRef(false);\n const [error, setError] = useState<unknown>(null);\n\n useEffect(() => runAsynchronously(async () => {\n if (called.current) return;\n called.current = true;\n try {\n await app.callOAuthCallback();\n } catch (e: any) {\n setError(e);\n }\n }), []);\n\n return <MessageCard title='Redirecting...' fullPage>\n {error ? <div>\n <p>Something went wrong while processing the OAuth callback:</p>\n <pre>{JSON.stringify(error, null, 2)}</pre>\n <p>This is most likely an error in Stack. Please report it.</p>\n </div> : null}\n </MessageCard>;\n}\n"],"mappings":";;;AAEA,SAAS,QAAQ,WAAW,gBAAgB;AAC5C,SAAS,mBAAmB;AAC5B,SAAS,yBAAyB;AAClC,OAAO,iBAAiB;AAkBX,SACP,KADO;AAhBE,SAAR,gBAAkC;AACvC,QAAM,MAAM,YAAY;AACxB,QAAM,SAAS,OAAO,KAAK;AAC3B,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAkB,IAAI;AAEhD,YAAU,MAAM,kBAAkB,YAAY;AAC5C,QAAI,OAAO;AAAS;AACpB,WAAO,UAAU;AACjB,QAAI;AACF,YAAM,IAAI,kBAAkB;AAAA,IAC9B,SAAS,GAAQ;AACf,eAAS,CAAC;AAAA,IACZ;AAAA,EACF,CAAC,GAAG,CAAC,CAAC;AAEN,SAAO,oBAAC,eAAY,OAAM,kBAAiB,UAAQ,MAChD,kBAAQ,qBAAC,SACR;AAAA,wBAAC,OAAE,uEAAyD;AAAA,IAC5D,oBAAC,SAAK,eAAK,UAAU,OAAO,MAAM,CAAC,GAAE;AAAA,IACrC,oBAAC,OAAE,sEAAwD;AAAA,KAC7D,IAAS,MACX;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/components-page/oauth-callback.tsx"],"sourcesContent":["'use client';\n\nimport { useRef, useEffect, useState } from \"react\";\nimport { useStackApp } from \"..\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport MessageCard from \"../components/message-card\";\n\nexport default function OAuthCallback () {\n const app = useStackApp();\n const called = useRef(false);\n const [error, setError] = useState<unknown>(null);\n const [showRedirectLink, setShowRedirectLink] = useState(false);\n\n useEffect(() => runAsynchronously(async () => {\n if (called.current) return;\n called.current = true;\n let hasRedirected = false;\n try {\n hasRedirected = await app.callOAuthCallback();\n } catch (e: any) {\n setError(e);\n }\n if (!hasRedirected) {\n await app.redirectToSignIn();\n }\n }), []);\n\n useEffect(() => {\n setTimeout(() => setShowRedirectLink(true), 3000);\n }, []);\n\n return <MessageCard title='Redirecting...' fullPage>\n {showRedirectLink ? <p>If you are not redirected automatically, <a href={app.urls.home}>click here</a>.</p> : null}\n {error ? <div>\n <p>Something went wrong while processing the OAuth callback:</p>\n <pre>{JSON.stringify(error, null, 2)}</pre>\n <p>This is most likely an error in Stack. Please report it.</p>\n </div> : null}\n </MessageCard>;\n}\n"],"mappings":";;;AAEA,SAAS,QAAQ,WAAW,gBAAgB;AAC5C,SAAS,mBAAmB;AAC5B,SAAS,yBAAyB;AAClC,OAAO,iBAAiB;AA2BA,SAA4C,KAA5C;AAzBT,SAAR,gBAAkC;AACvC,QAAM,MAAM,YAAY;AACxB,QAAM,SAAS,OAAO,KAAK;AAC3B,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAkB,IAAI;AAChD,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,KAAK;AAE9D,YAAU,MAAM,kBAAkB,YAAY;AAC5C,QAAI,OAAO;AAAS;AACpB,WAAO,UAAU;AACjB,QAAI,gBAAgB;AACpB,QAAI;AACF,sBAAgB,MAAM,IAAI,kBAAkB;AAAA,IAC9C,SAAS,GAAQ;AACf,eAAS,CAAC;AAAA,IACZ;AACA,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI,iBAAiB;AAAA,IAC7B;AAAA,EACF,CAAC,GAAG,CAAC,CAAC;AAEN,YAAU,MAAM;AACd,eAAW,MAAM,oBAAoB,IAAI,GAAG,GAAI;AAAA,EAClD,GAAG,CAAC,CAAC;AAEL,SAAO,qBAAC,eAAY,OAAM,kBAAiB,UAAQ,MAChD;AAAA,uBAAmB,qBAAC,OAAE;AAAA;AAAA,MAAyC,oBAAC,OAAE,MAAM,IAAI,KAAK,MAAM,wBAAU;AAAA,MAAI;AAAA,OAAC,IAAO;AAAA,IAC7G,QAAQ,qBAAC,SACR;AAAA,0BAAC,OAAE,uEAAyD;AAAA,MAC5D,oBAAC,SAAK,eAAK,UAAU,OAAO,MAAM,CAAC,GAAE;AAAA,MACrC,oBAAC,OAAE,sEAAwD;AAAA,OAC7D,IAAS;AAAA,KACX;AACF;","names":[]}
@@ -5,7 +5,7 @@ import { RedirectType, notFound, redirect } from "next/navigation";
5
5
  import EmailVerification from "./email-verification";
6
6
  import { PasswordReset } from "..";
7
7
  import MessageCard from "../components/message-card";
8
- import Signout from "./sign-out";
8
+ import SignOut from "./sign-out";
9
9
  import ForgotPassword from "./forgot-password";
10
10
  import OAuthCallback from "./oauth-callback";
11
11
  import AccountSettings from "./account-settings";
@@ -27,14 +27,22 @@ async function StackHandler({
27
27
  }
28
28
  redirect(url, RedirectType.replace);
29
29
  }
30
+ async function redirectIfHasUser() {
31
+ const user = await app.getServerUser();
32
+ if (user) {
33
+ redirect(app.urls.afterSignIn);
34
+ }
35
+ }
30
36
  const path = stack.join("/");
31
37
  switch (path) {
32
38
  case "signin": {
33
39
  redirectIfNotHandler("signIn");
40
+ await redirectIfHasUser();
34
41
  return /* @__PURE__ */ jsx(SignIn, { fullPage: true });
35
42
  }
36
43
  case "signup": {
37
44
  redirectIfNotHandler("signUp");
45
+ await redirectIfHasUser();
38
46
  return /* @__PURE__ */ jsx(SignUp, { fullPage: true });
39
47
  }
40
48
  case "email-verification": {
@@ -51,7 +59,7 @@ async function StackHandler({
51
59
  }
52
60
  case "signout": {
53
61
  redirectIfNotHandler("signOut");
54
- return /* @__PURE__ */ jsx(Signout, {});
62
+ return /* @__PURE__ */ jsx(SignOut, {});
55
63
  }
56
64
  case "oauth-callback": {
57
65
  redirectIfNotHandler("oauthCallback");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components-page/stack-handler.tsx"],"sourcesContent":["import SignUp from \"./sign-up\";\nimport SignIn from \"./sign-in\";\nimport { RedirectType, notFound, redirect } from 'next/navigation';\nimport EmailVerification from \"./email-verification\";\nimport { PasswordReset, StackServerApp } from \"..\";\nimport MessageCard from \"../components/message-card\";\nimport { HandlerUrls } from \"../lib/stack-app\";\nimport Signout from \"./sign-out\";\nimport ForgotPassword from \"./forgot-password\";\nimport OAuthCallback from \"./oauth-callback\";\nimport AccountSettings from \"./account-settings\";\nimport MagicLinkCallback from \"./magic-link-callback\";\n\nexport default async function StackHandler<HasTokenStore extends boolean>({\n app,\n params: { stack } = {},\n searchParams = {},\n}: { \n app: StackServerApp<HasTokenStore>,\n params?: { stack?: string[] }, \n searchParams?: Record<string, string>,\n}) {\n if (!stack) {\n return (\n <MessageCard title=\"Invalid Stack Handler Setup\" fullPage>\n <p>Can't use Stack handler at this location. Make sure that the file is in a folder called [...stack].</p>\n </MessageCard>\n );\n }\n\n function redirectIfNotHandler(name: keyof HandlerUrls) {\n const url = app.urls[name];\n const handlerUrl = app.urls.handler;\n\n if (url.startsWith(handlerUrl)) {\n // don't redirect if the url is a handler url\n return;\n }\n\n redirect(url, RedirectType.replace);\n }\n\n const path = stack.join('/');\n switch (path) {\n case 'signin': {\n redirectIfNotHandler('signIn');\n return <SignIn fullPage/>;\n }\n case 'signup': {\n redirectIfNotHandler('signUp');\n return <SignUp fullPage/>;\n }\n case 'email-verification': {\n redirectIfNotHandler('emailVerification');\n return <EmailVerification searchParams={searchParams} fullPage/>;\n }\n case 'password-reset': {\n redirectIfNotHandler('passwordReset');\n return <PasswordReset searchParams={searchParams} fullPage />;\n }\n case 'forgot-password': {\n redirectIfNotHandler('forgotPassword');\n return <ForgotPassword fullPage />;\n }\n case 'signout': {\n redirectIfNotHandler('signOut');\n return <Signout/>;\n }\n case 'oauth-callback': {\n redirectIfNotHandler('oauthCallback');\n return <OAuthCallback />;\n }\n case 'account-settings': {\n redirectIfNotHandler('accountSettings');\n return <AccountSettings fullPage />;\n }\n case 'magic-link-callback': {\n redirectIfNotHandler('magicLinkCallback');\n return <MagicLinkCallback searchParams={searchParams} fullPage />;\n }\n default: {\n return notFound();\n }\n }\n}\n"],"mappings":";AAAA,OAAO,YAAY;AACnB,OAAO,YAAY;AACnB,SAAS,cAAc,UAAU,gBAAgB;AACjD,OAAO,uBAAuB;AAC9B,SAAS,qBAAqC;AAC9C,OAAO,iBAAiB;AAExB,OAAO,aAAa;AACpB,OAAO,oBAAoB;AAC3B,OAAO,mBAAmB;AAC1B,OAAO,qBAAqB;AAC5B,OAAO,uBAAuB;AActB;AAZR,eAAO,aAAmE;AAAA,EACxE;AAAA,EACA,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,EACrB,eAAe,CAAC;AAClB,GAIG;AACD,MAAI,CAAC,OAAO;AACV,WACE,oBAAC,eAAY,OAAM,+BAA8B,UAAQ,MACvD,8BAAC,OAAE,iHAAmG,GACxG;AAAA,EAEJ;AAEA,WAAS,qBAAqB,MAAyB;AACrD,UAAM,MAAM,IAAI,KAAK,IAAI;AACzB,UAAM,aAAa,IAAI,KAAK;AAE5B,QAAI,IAAI,WAAW,UAAU,GAAG;AAE9B;AAAA,IACF;AAEA,aAAS,KAAK,aAAa,OAAO;AAAA,EACpC;AAEA,QAAM,OAAO,MAAM,KAAK,GAAG;AAC3B,UAAQ,MAAM;AAAA,IACZ,KAAK,UAAU;AACb,2BAAqB,QAAQ;AAC7B,aAAO,oBAAC,UAAO,UAAQ;AAAA,IACzB;AAAA,IACA,KAAK,UAAU;AACb,2BAAqB,QAAQ;AAC7B,aAAO,oBAAC,UAAO,UAAQ;AAAA,IACzB;AAAA,IACA,KAAK,sBAAsB;AACzB,2BAAqB,mBAAmB;AACxC,aAAO,oBAAC,qBAAkB,cAA4B,UAAQ;AAAA,IAChE;AAAA,IACA,KAAK,kBAAkB;AACrB,2BAAqB,eAAe;AACpC,aAAO,oBAAC,iBAAc,cAA4B,UAAQ,MAAC;AAAA,IAC7D;AAAA,IACA,KAAK,mBAAmB;AACtB,2BAAqB,gBAAgB;AACrC,aAAO,oBAAC,kBAAe,UAAQ,MAAC;AAAA,IAClC;AAAA,IACA,KAAK,WAAW;AACd,2BAAqB,SAAS;AAC9B,aAAO,oBAAC,WAAO;AAAA,IACjB;AAAA,IACA,KAAK,kBAAkB;AACrB,2BAAqB,eAAe;AACpC,aAAO,oBAAC,iBAAc;AAAA,IACxB;AAAA,IACA,KAAK,oBAAoB;AACvB,2BAAqB,iBAAiB;AACtC,aAAO,oBAAC,mBAAgB,UAAQ,MAAC;AAAA,IACnC;AAAA,IACA,KAAK,uBAAuB;AAC1B,2BAAqB,mBAAmB;AACxC,aAAO,oBAAC,qBAAkB,cAA4B,UAAQ,MAAC;AAAA,IACjE;AAAA,IACA,SAAS;AACP,aAAO,SAAS;AAAA,IAClB;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/components-page/stack-handler.tsx"],"sourcesContent":["import SignUp from \"./sign-up\";\nimport SignIn from \"./sign-in\";\nimport { RedirectType, notFound, redirect } from 'next/navigation';\nimport EmailVerification from \"./email-verification\";\nimport { PasswordReset, StackServerApp } from \"..\";\nimport MessageCard from \"../components/message-card\";\nimport { HandlerUrls } from \"../lib/stack-app\";\nimport SignOut from \"./sign-out\";\nimport ForgotPassword from \"./forgot-password\";\nimport OAuthCallback from \"./oauth-callback\";\nimport AccountSettings from \"./account-settings\";\nimport MagicLinkCallback from \"./magic-link-callback\";\n\nexport default async function StackHandler<HasTokenStore extends boolean>({\n app,\n params: { stack } = {},\n searchParams = {},\n}: { \n app: StackServerApp<HasTokenStore>,\n params?: { stack?: string[] }, \n searchParams?: Record<string, string>,\n}) {\n if (!stack) {\n return (\n <MessageCard title=\"Invalid Stack Handler Setup\" fullPage>\n <p>Can't use Stack handler at this location. Make sure that the file is in a folder called [...stack].</p>\n </MessageCard>\n );\n }\n\n function redirectIfNotHandler(name: keyof HandlerUrls) {\n const url = app.urls[name];\n const handlerUrl = app.urls.handler;\n\n if (url.startsWith(handlerUrl)) {\n // don't redirect if the url is a handler url\n return;\n }\n\n redirect(url, RedirectType.replace);\n }\n\n async function redirectIfHasUser() {\n const user = await app.getServerUser();\n if (user) {\n redirect(app.urls.afterSignIn);\n }\n }\n\n const path = stack.join('/');\n switch (path) {\n case 'signin': {\n redirectIfNotHandler('signIn');\n await redirectIfHasUser();\n return <SignIn fullPage/>;\n }\n case 'signup': {\n redirectIfNotHandler('signUp');\n await redirectIfHasUser();\n return <SignUp fullPage/>;\n }\n case 'email-verification': {\n redirectIfNotHandler('emailVerification');\n return <EmailVerification searchParams={searchParams} fullPage/>;\n }\n case 'password-reset': {\n redirectIfNotHandler('passwordReset');\n return <PasswordReset searchParams={searchParams} fullPage />;\n }\n case 'forgot-password': {\n redirectIfNotHandler('forgotPassword');\n return <ForgotPassword fullPage />;\n }\n case 'signout': {\n redirectIfNotHandler('signOut');\n return <SignOut/>;\n }\n case 'oauth-callback': {\n redirectIfNotHandler('oauthCallback');\n return <OAuthCallback />;\n }\n case 'account-settings': {\n redirectIfNotHandler('accountSettings');\n return <AccountSettings fullPage />;\n }\n case 'magic-link-callback': {\n redirectIfNotHandler('magicLinkCallback');\n return <MagicLinkCallback searchParams={searchParams} fullPage />;\n }\n default: {\n return notFound();\n }\n }\n}\n"],"mappings":";AAAA,OAAO,YAAY;AACnB,OAAO,YAAY;AACnB,SAAS,cAAc,UAAU,gBAAgB;AACjD,OAAO,uBAAuB;AAC9B,SAAS,qBAAqC;AAC9C,OAAO,iBAAiB;AAExB,OAAO,aAAa;AACpB,OAAO,oBAAoB;AAC3B,OAAO,mBAAmB;AAC1B,OAAO,qBAAqB;AAC5B,OAAO,uBAAuB;AActB;AAZR,eAAO,aAAmE;AAAA,EACxE;AAAA,EACA,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,EACrB,eAAe,CAAC;AAClB,GAIG;AACD,MAAI,CAAC,OAAO;AACV,WACE,oBAAC,eAAY,OAAM,+BAA8B,UAAQ,MACvD,8BAAC,OAAE,iHAAmG,GACxG;AAAA,EAEJ;AAEA,WAAS,qBAAqB,MAAyB;AACrD,UAAM,MAAM,IAAI,KAAK,IAAI;AACzB,UAAM,aAAa,IAAI,KAAK;AAE5B,QAAI,IAAI,WAAW,UAAU,GAAG;AAE9B;AAAA,IACF;AAEA,aAAS,KAAK,aAAa,OAAO;AAAA,EACpC;AAEA,iBAAe,oBAAoB;AACjC,UAAM,OAAO,MAAM,IAAI,cAAc;AACrC,QAAI,MAAM;AACR,eAAS,IAAI,KAAK,WAAW;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,KAAK,GAAG;AAC3B,UAAQ,MAAM;AAAA,IACZ,KAAK,UAAU;AACb,2BAAqB,QAAQ;AAC7B,YAAM,kBAAkB;AACxB,aAAO,oBAAC,UAAO,UAAQ;AAAA,IACzB;AAAA,IACA,KAAK,UAAU;AACb,2BAAqB,QAAQ;AAC7B,YAAM,kBAAkB;AACxB,aAAO,oBAAC,UAAO,UAAQ;AAAA,IACzB;AAAA,IACA,KAAK,sBAAsB;AACzB,2BAAqB,mBAAmB;AACxC,aAAO,oBAAC,qBAAkB,cAA4B,UAAQ;AAAA,IAChE;AAAA,IACA,KAAK,kBAAkB;AACrB,2BAAqB,eAAe;AACpC,aAAO,oBAAC,iBAAc,cAA4B,UAAQ,MAAC;AAAA,IAC7D;AAAA,IACA,KAAK,mBAAmB;AACtB,2BAAqB,gBAAgB;AACrC,aAAO,oBAAC,kBAAe,UAAQ,MAAC;AAAA,IAClC;AAAA,IACA,KAAK,WAAW;AACd,2BAAqB,SAAS;AAC9B,aAAO,oBAAC,WAAO;AAAA,IACjB;AAAA,IACA,KAAK,kBAAkB;AACrB,2BAAqB,eAAe;AACpC,aAAO,oBAAC,iBAAc;AAAA,IACxB;AAAA,IACA,KAAK,oBAAoB;AACvB,2BAAqB,iBAAiB;AACtC,aAAO,oBAAC,mBAAgB,UAAQ,MAAC;AAAA,IACnC;AAAA,IACA,KAAK,uBAAuB;AAC1B,2BAAqB,mBAAmB;AACxC,aAAO,oBAAC,qBAAkB,cAA4B,UAAQ,MAAC;AAAA,IACjE;AAAA,IACA,SAAS;AACP,aAAO,SAAS;AAAA,IAClB;AAAA,EACF;AACF;","names":[]}
@@ -13,9 +13,10 @@ import { callOAuthCallback, signInWithOAuth } from "./auth";
13
13
  import * as NextNavigation from "next/navigation";
14
14
  import { constructRedirectUrl } from "../utils/url";
15
15
  import { filterUndefined, omit } from "@stackframe/stack-shared/dist/utils/objects";
16
- import { neverResolve, resolved, runAsynchronously, wait } from "@stackframe/stack-shared/dist/utils/promises";
16
+ import { resolved, runAsynchronously, wait } from "@stackframe/stack-shared/dist/utils/promises";
17
17
  import { AsyncCache } from "@stackframe/stack-shared/dist/utils/caches";
18
18
  import { suspend } from "@stackframe/stack-shared/dist/utils/react";
19
+ var clientVersion = "js @stackframe/stack@2.4.7";
19
20
  function permissionDefinitionScopeToType(scope) {
20
21
  return { "any-team": "team", "specific-team": "team", "global": "global" }[scope.type];
21
22
  }
@@ -40,16 +41,16 @@ function getUrls(partial) {
40
41
  };
41
42
  }
42
43
  function getDefaultProjectId() {
43
- return process.env.NEXT_PUBLIC_STACK_PROJECT_ID || throwErr("Welcome to Stack! It seems that you haven't provided a project ID. Please create a project on the Stack dashboard at https://app.stack-auth.com and put it in the NEXT_PUBLIC_STACK_PROJECT_ID environment variable.");
44
+ return process.env.NEXT_PUBLIC_STACK_PROJECT_ID || throwErr(new Error("Welcome to Stack! It seems that you haven't provided a project ID. Please create a project on the Stack dashboard at https://app.stack-auth.com and put it in the NEXT_PUBLIC_STACK_PROJECT_ID environment variable."));
44
45
  }
45
46
  function getDefaultPublishableClientKey() {
46
- return process.env.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY || throwErr("Welcome to Stack! It seems that you haven't provided a publishable client key. Please create an API key for your project on the Stack dashboard at https://app.stack-auth.com and copy your publishable client key into the NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY environment variable.");
47
+ return process.env.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY || throwErr(new Error("Welcome to Stack! It seems that you haven't provided a publishable client key. Please create an API key for your project on the Stack dashboard at https://app.stack-auth.com and copy your publishable client key into the NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY environment variable."));
47
48
  }
48
49
  function getDefaultSecretServerKey() {
49
- return process.env.STACK_SECRET_SERVER_KEY || throwErr("No secret server key provided. Please copy your key from the Stack dashboard and put your it in the STACK_SECRET_SERVER_KEY environment variable.");
50
+ return process.env.STACK_SECRET_SERVER_KEY || throwErr(new Error("No secret server key provided. Please copy your key from the Stack dashboard and put your it in the STACK_SECRET_SERVER_KEY environment variable."));
50
51
  }
51
52
  function getDefaultSuperSecretAdminKey() {
52
- return process.env.STACK_SUPER_SECRET_ADMIN_KEY || throwErr("No super secret admin key provided. Please copy your key from the Stack dashboard and put it in the STACK_SUPER_SECRET_ADMIN_KEY environment variable.");
53
+ return process.env.STACK_SUPER_SECRET_ADMIN_KEY || throwErr(new Error("No super secret admin key provided. Please copy your key from the Stack dashboard and put it in the STACK_SUPER_SECRET_ADMIN_KEY environment variable."));
53
54
  }
54
55
  function getDefaultBaseUrl() {
55
56
  return process.env.NEXT_PUBLIC_STACK_URL || defaultBaseUrl;
@@ -195,6 +196,7 @@ var _StackClientAppImpl = class __StackClientAppImpl {
195
196
  this._interface = new StackClientInterface({
196
197
  baseUrl: options.baseUrl ?? getDefaultBaseUrl(),
197
198
  projectId: options.projectId ?? getDefaultProjectId(),
199
+ clientVersion,
198
200
  publishableClientKey: options.publishableClientKey ?? getDefaultPublishableClientKey()
199
201
  });
200
202
  }
@@ -262,6 +264,12 @@ var _StackClientAppImpl = class __StackClientAppImpl {
262
264
  hasPassword: json.hasPassword,
263
265
  authWithEmail: json.authWithEmail,
264
266
  oauthProviders: json.oauthProviders,
267
+ async getSelectedTeam() {
268
+ return await this.getTeam(json.selectedTeamId || "");
269
+ },
270
+ useSelectedTeam() {
271
+ return this.useTeam(json.selectedTeamId || "");
272
+ },
265
273
  async getTeam(teamId) {
266
274
  const teams = await this.listTeams();
267
275
  return teams.find((t) => t.id === teamId) ?? null;
@@ -308,8 +316,7 @@ var _StackClientAppImpl = class __StackClientAppImpl {
308
316
  return permissions.find((p) => p.id === permissionId) ?? null;
309
317
  },
310
318
  async hasPermission(scope, permissionId) {
311
- const permissions = await this.listPermissions(scope);
312
- return permissions.some((p) => p.id === permissionId);
319
+ return await this.getPermission(scope, permissionId) !== null;
313
320
  },
314
321
  toJson() {
315
322
  return json;
@@ -332,6 +339,9 @@ var _StackClientAppImpl = class __StackClientAppImpl {
332
339
  const currentUser = {
333
340
  ...this._userFromJson(json),
334
341
  tokenStore,
342
+ async updateSelectedTeam(team) {
343
+ await app._updateUser({ selectedTeamId: team?.id ?? null }, tokenStore);
344
+ },
335
345
  update(update) {
336
346
  return app._updateUser(update, tokenStore);
337
347
  },
@@ -368,22 +378,6 @@ var _StackClientAppImpl = class __StackClientAppImpl {
368
378
  return currentUser;
369
379
  }
370
380
  }
371
- _userToJson(user) {
372
- return {
373
- projectId: user.projectId,
374
- id: user.id,
375
- displayName: user.displayName,
376
- primaryEmail: user.primaryEmail,
377
- primaryEmailVerified: user.primaryEmailVerified,
378
- profileImageUrl: user.profileImageUrl,
379
- signedUpAtMillis: user.signedUpAt.getTime(),
380
- clientMetadata: user.clientMetadata,
381
- authMethod: user.authMethod,
382
- hasPassword: user.hasPassword,
383
- authWithEmail: user.authWithEmail,
384
- oauthProviders: user.oauthProviders
385
- };
386
- }
387
381
  _projectAdminFromJson(data, adminInterface, onRefresh) {
388
382
  if (data.id !== adminInterface.projectId) {
389
383
  throw new Error(`The project ID of the provided project JSON (${data.id}) does not match the project ID of the app (${adminInterface.projectId})! This is a Stack bug.`);
@@ -421,6 +415,7 @@ var _StackClientAppImpl = class __StackClientAppImpl {
421
415
  return new StackAdminInterface({
422
416
  baseUrl: this._interface.options.baseUrl,
423
417
  projectId: forProjectId,
418
+ clientVersion,
424
419
  projectOwnerTokens: tokenStore
425
420
  });
426
421
  }
@@ -430,11 +425,16 @@ var _StackClientAppImpl = class __StackClientAppImpl {
430
425
  get urls() {
431
426
  return getUrls(this._urlOptions);
432
427
  }
433
- async _redirectTo(handlerName) {
434
- if (!this.urls[handlerName]) {
428
+ async _redirectTo(handlerName, options) {
429
+ const url = this.urls[handlerName];
430
+ if (!url) {
435
431
  throw new Error(`No URL for handler name ${handlerName}`);
436
432
  }
437
- window.location.href = this.urls[handlerName];
433
+ if (options?.replace) {
434
+ window.location.replace(url);
435
+ } else {
436
+ window.location.assign(url);
437
+ }
438
438
  return await wait(2e3);
439
439
  }
440
440
  async redirectToSignIn() {
@@ -561,7 +561,7 @@ var _StackClientAppImpl = class __StackClientAppImpl {
561
561
  const tokenStore = getTokenStore(this._tokenStoreOptions);
562
562
  const errorCode = await this._interface.signInWithCredential(options.email, options.password, tokenStore);
563
563
  if (!errorCode) {
564
- window.location.assign(this.urls.afterSignIn);
564
+ await this.redirectToAfterSignIn({ replace: true });
565
565
  }
566
566
  return errorCode;
567
567
  }
@@ -576,7 +576,7 @@ var _StackClientAppImpl = class __StackClientAppImpl {
576
576
  tokenStore
577
577
  );
578
578
  if (!errorCode) {
579
- window.location.assign(this.urls.afterSignUp);
579
+ await this.redirectToAfterSignUp({ replace: true });
580
580
  }
581
581
  return errorCode;
582
582
  }
@@ -588,11 +588,10 @@ var _StackClientAppImpl = class __StackClientAppImpl {
588
588
  return result;
589
589
  }
590
590
  if (result.newUser) {
591
- window.location.replace(this.urls.afterSignUp);
591
+ await this.redirectToAfterSignUp({ replace: true });
592
592
  } else {
593
- window.location.replace(this.urls.afterSignIn);
593
+ await this.redirectToAfterSignIn({ replace: true });
594
594
  }
595
- await neverResolve();
596
595
  }
597
596
  async callOAuthCallback() {
598
597
  this._ensurePersistentTokenStore();
@@ -600,16 +599,18 @@ var _StackClientAppImpl = class __StackClientAppImpl {
600
599
  const result = await callOAuthCallback(this._interface, tokenStore, this.urls.oauthCallback);
601
600
  if (result) {
602
601
  if (result.newUser) {
603
- window.location.replace(this.urls.afterSignUp);
602
+ await this.redirectToAfterSignUp({ replace: true });
603
+ return true;
604
604
  } else {
605
- window.location.replace(this.urls.afterSignIn);
605
+ await this.redirectToAfterSignIn({ replace: true });
606
+ return true;
606
607
  }
607
608
  }
608
- await neverResolve();
609
+ return false;
609
610
  }
610
611
  async _signOut(tokenStore) {
611
612
  await this._interface.signOut(tokenStore);
612
- window.location.assign(this.urls.afterSignOut);
613
+ await this.redirectToAfterSignOut();
613
614
  }
614
615
  async _sendVerificationEmail(tokenStore) {
615
616
  const emailVerificationRedirectUrl = constructRedirectUrl(this.urls.emailVerification);
@@ -755,24 +756,21 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
755
756
  return await this._interface.listTeamMemberPermissions({ teamId, userId, type, direct });
756
757
  });
757
758
  constructor(options) {
758
- if ("interface" in options) {
759
- super({
760
- interface: options.interface,
761
- tokenStore: options.tokenStore,
762
- urls: options.urls
763
- });
764
- } else {
765
- super({
766
- interface: new StackServerInterface({
767
- baseUrl: options.baseUrl ?? getDefaultBaseUrl(),
768
- projectId: options.projectId ?? getDefaultProjectId(),
769
- publishableClientKey: options.publishableClientKey ?? getDefaultPublishableClientKey(),
770
- secretServerKey: options.secretServerKey ?? getDefaultSecretServerKey()
771
- }),
772
- tokenStore: options.tokenStore,
773
- urls: options.urls ?? {}
774
- });
775
- }
759
+ super("interface" in options ? {
760
+ interface: options.interface,
761
+ tokenStore: options.tokenStore,
762
+ urls: options.urls
763
+ } : {
764
+ interface: new StackServerInterface({
765
+ baseUrl: options.baseUrl ?? getDefaultBaseUrl(),
766
+ projectId: options.projectId ?? getDefaultProjectId(),
767
+ clientVersion,
768
+ publishableClientKey: options.publishableClientKey ?? getDefaultPublishableClientKey(),
769
+ secretServerKey: options.secretServerKey ?? getDefaultSecretServerKey()
770
+ }),
771
+ tokenStore: options.tokenStore,
772
+ urls: options.urls ?? {}
773
+ });
776
774
  }
777
775
  _serverUserFromJson(json) {
778
776
  if (json === null)
@@ -856,7 +854,7 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
856
854
  return permissions.some((p) => p.id === permissionId);
857
855
  },
858
856
  toJson() {
859
- return app._serverUserToJson(this);
857
+ return json;
860
858
  }
861
859
  };
862
860
  }
@@ -873,6 +871,9 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
873
871
  await app._refreshUser(tokenStore);
874
872
  return res;
875
873
  },
874
+ async updateSelectedTeam(team) {
875
+ await this.update({ selectedTeamId: team?.id ?? null });
876
+ },
876
877
  async update(update) {
877
878
  const res = await nonCurrentServerUser.update(update);
878
879
  await app._refreshUser(tokenStore);
@@ -928,23 +929,6 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
928
929
  }
929
930
  };
930
931
  }
931
- _serverUserToJson(user) {
932
- return {
933
- projectId: user.projectId,
934
- id: user.id,
935
- displayName: user.displayName,
936
- primaryEmail: user.primaryEmail,
937
- primaryEmailVerified: user.primaryEmailVerified,
938
- profileImageUrl: user.profileImageUrl,
939
- signedUpAtMillis: user.signedUpAt.getTime(),
940
- clientMetadata: user.clientMetadata,
941
- serverMetadata: user.serverMetadata,
942
- authMethod: user.authMethod,
943
- hasPassword: user.hasPassword,
944
- authWithEmail: user.authWithEmail,
945
- oauthProviders: user.oauthProviders
946
- };
947
- }
948
932
  _serverTeamFromJson(json) {
949
933
  const app = this;
950
934
  return {
@@ -1105,6 +1089,7 @@ var _StackAdminAppImpl = class extends _StackServerAppImpl {
1105
1089
  interface: new StackAdminInterface({
1106
1090
  baseUrl: options.baseUrl ?? getDefaultBaseUrl(),
1107
1091
  projectId: options.projectId ?? getDefaultProjectId(),
1092
+ clientVersion,
1108
1093
  ..."projectOwnerTokens" in options ? {
1109
1094
  projectOwnerTokens: options.projectOwnerTokens
1110
1095
  } : {