@stackframe/stack 2.5.37 → 2.6.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 (104) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/components/credential-sign-in.js +4 -2
  3. package/dist/components/credential-sign-in.js.map +1 -1
  4. package/dist/components/credential-sign-up.d.mts +3 -1
  5. package/dist/components/credential-sign-up.d.ts +3 -1
  6. package/dist/components/credential-sign-up.js +23 -17
  7. package/dist/components/credential-sign-up.js.map +1 -1
  8. package/dist/components/elements/sidebar-layout.js +5 -5
  9. package/dist/components/elements/sidebar-layout.js.map +1 -1
  10. package/dist/components/magic-link-sign-in.js +82 -30
  11. package/dist/components/magic-link-sign-in.js.map +1 -1
  12. package/dist/components/message-cards/predefined-message-card.js +22 -20
  13. package/dist/components/message-cards/predefined-message-card.js.map +1 -1
  14. package/dist/components/oauth-button.js +13 -4
  15. package/dist/components/oauth-button.js.map +1 -1
  16. package/dist/components-page/account-settings.js +14 -9
  17. package/dist/components-page/account-settings.js.map +1 -1
  18. package/dist/components-page/auth-page.d.mts +2 -0
  19. package/dist/components-page/auth-page.d.ts +2 -0
  20. package/dist/components-page/auth-page.js +10 -8
  21. package/dist/components-page/auth-page.js.map +1 -1
  22. package/dist/components-page/email-verification.js +10 -8
  23. package/dist/components-page/email-verification.js.map +1 -1
  24. package/dist/components-page/error-page.js +19 -4
  25. package/dist/components-page/error-page.js.map +1 -1
  26. package/dist/components-page/forgot-password.js +7 -4
  27. package/dist/components-page/forgot-password.js.map +1 -1
  28. package/dist/components-page/magic-link-callback.js +11 -9
  29. package/dist/components-page/magic-link-callback.js.map +1 -1
  30. package/dist/components-page/password-reset.js +20 -15
  31. package/dist/components-page/password-reset.js.map +1 -1
  32. package/dist/components-page/sign-in.d.mts +1 -0
  33. package/dist/components-page/sign-in.d.ts +1 -0
  34. package/dist/components-page/sign-in.js +10 -1
  35. package/dist/components-page/sign-in.js.map +1 -1
  36. package/dist/components-page/sign-up.d.mts +2 -0
  37. package/dist/components-page/sign-up.d.ts +2 -0
  38. package/dist/components-page/sign-up.js +11 -1
  39. package/dist/components-page/sign-up.js.map +1 -1
  40. package/dist/esm/components/credential-sign-in.js +4 -2
  41. package/dist/esm/components/credential-sign-in.js.map +1 -1
  42. package/dist/esm/components/credential-sign-up.js +24 -18
  43. package/dist/esm/components/credential-sign-up.js.map +1 -1
  44. package/dist/esm/components/elements/sidebar-layout.js +5 -5
  45. package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
  46. package/dist/esm/components/magic-link-sign-in.js +84 -32
  47. package/dist/esm/components/magic-link-sign-in.js.map +1 -1
  48. package/dist/esm/components/message-cards/predefined-message-card.js +22 -20
  49. package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -1
  50. package/dist/esm/components/oauth-button.js +13 -4
  51. package/dist/esm/components/oauth-button.js.map +1 -1
  52. package/dist/esm/components-page/account-settings.js +14 -9
  53. package/dist/esm/components-page/account-settings.js.map +1 -1
  54. package/dist/esm/components-page/auth-page.js +11 -9
  55. package/dist/esm/components-page/auth-page.js.map +1 -1
  56. package/dist/esm/components-page/email-verification.js +10 -8
  57. package/dist/esm/components-page/email-verification.js.map +1 -1
  58. package/dist/esm/components-page/error-page.js +19 -4
  59. package/dist/esm/components-page/error-page.js.map +1 -1
  60. package/dist/esm/components-page/forgot-password.js +8 -5
  61. package/dist/esm/components-page/forgot-password.js.map +1 -1
  62. package/dist/esm/components-page/magic-link-callback.js +11 -9
  63. package/dist/esm/components-page/magic-link-callback.js.map +1 -1
  64. package/dist/esm/components-page/password-reset.js +21 -16
  65. package/dist/esm/components-page/password-reset.js.map +1 -1
  66. package/dist/esm/components-page/sign-in.js +10 -1
  67. package/dist/esm/components-page/sign-in.js.map +1 -1
  68. package/dist/esm/components-page/sign-up.js +11 -1
  69. package/dist/esm/components-page/sign-up.js.map +1 -1
  70. package/dist/esm/generated/global-css.js +1 -1
  71. package/dist/esm/generated/global-css.js.map +1 -1
  72. package/dist/esm/generated/quetzal-translations.js +1760 -1544
  73. package/dist/esm/generated/quetzal-translations.js.map +1 -1
  74. package/dist/esm/lib/auth.js +4 -3
  75. package/dist/esm/lib/auth.js.map +1 -1
  76. package/dist/esm/lib/stack-app.js +47 -45
  77. package/dist/esm/lib/stack-app.js.map +1 -1
  78. package/dist/esm/lib/translations.js +6 -2
  79. package/dist/esm/lib/translations.js.map +1 -1
  80. package/dist/esm/utils/browser-script.js +0 -1
  81. package/dist/esm/utils/browser-script.js.map +1 -1
  82. package/dist/generated/global-css.d.mts +1 -1
  83. package/dist/generated/global-css.d.ts +1 -1
  84. package/dist/generated/global-css.js +1 -1
  85. package/dist/generated/global-css.js.map +1 -1
  86. package/dist/generated/quetzal-translations.d.mts +2 -2
  87. package/dist/generated/quetzal-translations.d.ts +2 -2
  88. package/dist/generated/quetzal-translations.js +1760 -1544
  89. package/dist/generated/quetzal-translations.js.map +1 -1
  90. package/dist/lib/auth.d.mts +16 -6
  91. package/dist/lib/auth.d.ts +16 -6
  92. package/dist/lib/auth.js +4 -3
  93. package/dist/lib/auth.js.map +1 -1
  94. package/dist/lib/stack-app.d.mts +17 -11
  95. package/dist/lib/stack-app.d.ts +17 -11
  96. package/dist/lib/stack-app.js +46 -44
  97. package/dist/lib/stack-app.js.map +1 -1
  98. package/dist/lib/translations.d.mts +1 -1
  99. package/dist/lib/translations.d.ts +1 -1
  100. package/dist/lib/translations.js +6 -2
  101. package/dist/lib/translations.js.map +1 -1
  102. package/dist/utils/browser-script.js +0 -1
  103. package/dist/utils/browser-script.js.map +1 -1
  104. package/package.json +5 -5
@@ -2,6 +2,7 @@
2
2
  import { KnownError } from "@stackframe/stack-shared";
3
3
  import { StackAssertionError, captureError, throwErr } from "@stackframe/stack-shared/dist/utils/errors";
4
4
  import { neverResolve } from "@stackframe/stack-shared/dist/utils/promises";
5
+ import { Result } from "@stackframe/stack-shared/dist/utils/results";
5
6
  import { deindent } from "@stackframe/stack-shared/dist/utils/strings";
6
7
  import { constructRedirectUrl } from "../utils/url";
7
8
  import { consumeVerifierAndStateCookie, saveVerifierAndState } from "./cookie";
@@ -71,14 +72,14 @@ function consumeOAuthCallbackQueryParams() {
71
72
  }
72
73
  async function callOAuthCallback(iface, redirectUrl) {
73
74
  const consumed = consumeOAuthCallbackQueryParams();
74
- if (!consumed) return null;
75
+ if (!consumed) return Result.ok(void 0);
75
76
  try {
76
- return await iface.callOAuthCallback({
77
+ return Result.ok(await iface.callOAuthCallback({
77
78
  oauthParams: consumed.originalUrl.searchParams,
78
79
  redirectUri: constructRedirectUrl(redirectUrl),
79
80
  codeVerifier: consumed.codeVerifier,
80
81
  state: consumed.state
81
- });
82
+ }));
82
83
  } catch (e) {
83
84
  if (e instanceof KnownError) {
84
85
  throw e;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/auth.ts"],"sourcesContent":["import { KnownError, StackClientInterface } from \"@stackframe/stack-shared\";\nimport { InternalSession } from \"@stackframe/stack-shared/dist/sessions\";\nimport { StackAssertionError, captureError, throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { neverResolve } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { deindent } from \"@stackframe/stack-shared/dist/utils/strings\";\nimport { constructRedirectUrl } from \"../utils/url\";\nimport { consumeVerifierAndStateCookie, saveVerifierAndState } from \"./cookie\";\n\nexport async function signInWithOAuth(\n iface: StackClientInterface,\n options: {\n provider: string,\n redirectUrl: string,\n errorRedirectUrl: string,\n providerScope?: string,\n }\n) {\n const { codeChallenge, state } = await saveVerifierAndState();\n const location = await iface.getOAuthUrl({\n provider: options.provider,\n redirectUrl: constructRedirectUrl(options.redirectUrl),\n errorRedirectUrl: constructRedirectUrl(options.errorRedirectUrl),\n codeChallenge,\n state,\n type: \"authenticate\",\n providerScope: options.providerScope,\n });\n window.location.assign(location);\n await neverResolve();\n}\n\nexport async function addNewOAuthProviderOrScope(\n iface: StackClientInterface,\n options: {\n provider: string,\n redirectUrl: string,\n errorRedirectUrl: string,\n providerScope?: string,\n },\n session: InternalSession,\n) {\n const { codeChallenge, state } = await saveVerifierAndState();\n const location = await iface.getOAuthUrl({\n provider: options.provider,\n redirectUrl: constructRedirectUrl(options.redirectUrl),\n errorRedirectUrl: constructRedirectUrl(options.errorRedirectUrl),\n afterCallbackRedirectUrl: constructRedirectUrl(window.location.href),\n codeChallenge,\n state,\n type: \"link\",\n session,\n providerScope: options.providerScope,\n });\n window.location.assign(location);\n await neverResolve();\n}\n\n/**\n * Checks if the current URL has the query parameters for an OAuth callback, and if so, removes them.\n *\n * Must be synchronous for the logic in callOAuthCallback to work without race conditions.\n */\nfunction consumeOAuthCallbackQueryParams() {\n const requiredParams = [\"code\", \"state\"];\n const originalUrl = new URL(window.location.href);\n for (const param of requiredParams) {\n if (!originalUrl.searchParams.has(param)) {\n captureError(\"consumeOAuthCallbackQueryParams\", new Error(`Missing required query parameter on OAuth callback: ${param}`));\n return null;\n }\n }\n\n const expectedState = originalUrl.searchParams.get(\"state\") ?? throwErr(\"This should never happen; isn't state required above?\");\n const cookieResult = consumeVerifierAndStateCookie(expectedState);\n\n if (!cookieResult) {\n // If the state can't be found in the cookies, then the callback wasn't meant for us.\n // Maybe the website uses another OAuth library?\n captureError(\"consumeOAuthCallbackQueryParams\", new Error(deindent`\n Stack found an outer OAuth callback state in the query parameters, but not in cookies.\n \n This could have multiple reasons:\n - The cookie expired, because the OAuth flow took too long.\n - The user's browser deleted the cookie, either manually or because of a very strict cookie policy.\n - The cookie was already consumed by this page, and the user already logged in.\n - You are using another OAuth client library with the same callback URL as Stack.\n `));\n return null;\n }\n\n\n const newUrl = new URL(originalUrl);\n for (const param of requiredParams) {\n newUrl.searchParams.delete(param);\n }\n\n // let's get rid of the authorization code in the history as we\n // don't redirect to `redirectUrl` if there's a validation error\n // (as the redirectUrl might be malicious!).\n //\n // We use history.replaceState instead of location.assign(...) to\n // prevent an unnecessary reload\n window.history.replaceState({}, \"\", newUrl.toString());\n\n return {\n originalUrl,\n codeVerifier: cookieResult.codeVerifier,\n state: expectedState,\n };\n}\n\nexport async function callOAuthCallback(\n iface: StackClientInterface,\n redirectUrl: string,\n) {\n // note: this part of the function (until the return) needs\n // to be synchronous, to prevent race conditions when\n // callOAuthCallback is called multiple times in parallel\n const consumed = consumeOAuthCallbackQueryParams();\n if (!consumed) return null;\n\n // the rest can be asynchronous (we now know that we are the\n // intended recipient of the callback, and the only instance\n // of callOAuthCallback that's running)\n try {\n return await iface.callOAuthCallback({\n oauthParams: consumed.originalUrl.searchParams,\n redirectUri: constructRedirectUrl(redirectUrl),\n codeVerifier: consumed.codeVerifier,\n state: consumed.state,\n });\n } catch (e) {\n if (e instanceof KnownError) {\n throw e;\n }\n throw new StackAssertionError(\"Error signing in during OAuth callback. Please try again.\", { cause: e });\n }\n}\n"],"mappings":";AAAA,SAAS,kBAAwC;AAEjD,SAAS,qBAAqB,cAAc,gBAAgB;AAC5D,SAAS,oBAAoB;AAC7B,SAAS,gBAAgB;AACzB,SAAS,4BAA4B;AACrC,SAAS,+BAA+B,4BAA4B;AAEpE,eAAsB,gBACpB,OACA,SAMA;AACA,QAAM,EAAE,eAAe,MAAM,IAAI,MAAM,qBAAqB;AAC5D,QAAM,WAAW,MAAM,MAAM,YAAY;AAAA,IACvC,UAAU,QAAQ;AAAA,IAClB,aAAa,qBAAqB,QAAQ,WAAW;AAAA,IACrD,kBAAkB,qBAAqB,QAAQ,gBAAgB;AAAA,IAC/D;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,eAAe,QAAQ;AAAA,EACzB,CAAC;AACD,SAAO,SAAS,OAAO,QAAQ;AAC/B,QAAM,aAAa;AACrB;AAEA,eAAsB,2BACpB,OACA,SAMA,SACA;AACA,QAAM,EAAE,eAAe,MAAM,IAAI,MAAM,qBAAqB;AAC5D,QAAM,WAAW,MAAM,MAAM,YAAY;AAAA,IACvC,UAAU,QAAQ;AAAA,IAClB,aAAa,qBAAqB,QAAQ,WAAW;AAAA,IACrD,kBAAkB,qBAAqB,QAAQ,gBAAgB;AAAA,IAC/D,0BAA0B,qBAAqB,OAAO,SAAS,IAAI;AAAA,IACnE;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,eAAe,QAAQ;AAAA,EACzB,CAAC;AACD,SAAO,SAAS,OAAO,QAAQ;AAC/B,QAAM,aAAa;AACrB;AAOA,SAAS,kCAAkC;AACzC,QAAM,iBAAiB,CAAC,QAAQ,OAAO;AACvC,QAAM,cAAc,IAAI,IAAI,OAAO,SAAS,IAAI;AAChD,aAAW,SAAS,gBAAgB;AAClC,QAAI,CAAC,YAAY,aAAa,IAAI,KAAK,GAAG;AACxC,mBAAa,mCAAmC,IAAI,MAAM,uDAAuD,KAAK,EAAE,CAAC;AACzH,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,gBAAgB,YAAY,aAAa,IAAI,OAAO,KAAK,SAAS,uDAAuD;AAC/H,QAAM,eAAe,8BAA8B,aAAa;AAEhE,MAAI,CAAC,cAAc;AAGjB,iBAAa,mCAAmC,IAAI,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAQzD,CAAC;AACF,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,IAAI,IAAI,WAAW;AAClC,aAAW,SAAS,gBAAgB;AAClC,WAAO,aAAa,OAAO,KAAK;AAAA,EAClC;AAQA,SAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,OAAO,SAAS,CAAC;AAErD,SAAO;AAAA,IACL;AAAA,IACA,cAAc,aAAa;AAAA,IAC3B,OAAO;AAAA,EACT;AACF;AAEA,eAAsB,kBACpB,OACA,aACA;AAIA,QAAM,WAAW,gCAAgC;AACjD,MAAI,CAAC,SAAU,QAAO;AAKtB,MAAI;AACF,WAAO,MAAM,MAAM,kBAAkB;AAAA,MACnC,aAAa,SAAS,YAAY;AAAA,MAClC,aAAa,qBAAqB,WAAW;AAAA,MAC7C,cAAc,SAAS;AAAA,MACvB,OAAO,SAAS;AAAA,IAClB,CAAC;AAAA,EACH,SAAS,GAAG;AACV,QAAI,aAAa,YAAY;AAC3B,YAAM;AAAA,IACR;AACA,UAAM,IAAI,oBAAoB,6DAA6D,EAAE,OAAO,EAAE,CAAC;AAAA,EACzG;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/lib/auth.ts"],"sourcesContent":["import { KnownError, StackClientInterface } from \"@stackframe/stack-shared\";\nimport { InternalSession } from \"@stackframe/stack-shared/dist/sessions\";\nimport { StackAssertionError, captureError, throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { neverResolve } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { deindent } from \"@stackframe/stack-shared/dist/utils/strings\";\nimport { constructRedirectUrl } from \"../utils/url\";\nimport { consumeVerifierAndStateCookie, saveVerifierAndState } from \"./cookie\";\n\nexport async function signInWithOAuth(\n iface: StackClientInterface,\n options: {\n provider: string,\n redirectUrl: string,\n errorRedirectUrl: string,\n providerScope?: string,\n }\n) {\n const { codeChallenge, state } = await saveVerifierAndState();\n const location = await iface.getOAuthUrl({\n provider: options.provider,\n redirectUrl: constructRedirectUrl(options.redirectUrl),\n errorRedirectUrl: constructRedirectUrl(options.errorRedirectUrl),\n codeChallenge,\n state,\n type: \"authenticate\",\n providerScope: options.providerScope,\n });\n window.location.assign(location);\n await neverResolve();\n}\n\nexport async function addNewOAuthProviderOrScope(\n iface: StackClientInterface,\n options: {\n provider: string,\n redirectUrl: string,\n errorRedirectUrl: string,\n providerScope?: string,\n },\n session: InternalSession,\n) {\n const { codeChallenge, state } = await saveVerifierAndState();\n const location = await iface.getOAuthUrl({\n provider: options.provider,\n redirectUrl: constructRedirectUrl(options.redirectUrl),\n errorRedirectUrl: constructRedirectUrl(options.errorRedirectUrl),\n afterCallbackRedirectUrl: constructRedirectUrl(window.location.href),\n codeChallenge,\n state,\n type: \"link\",\n session,\n providerScope: options.providerScope,\n });\n window.location.assign(location);\n await neverResolve();\n}\n\n/**\n * Checks if the current URL has the query parameters for an OAuth callback, and if so, removes them.\n *\n * Must be synchronous for the logic in callOAuthCallback to work without race conditions.\n */\nfunction consumeOAuthCallbackQueryParams() {\n const requiredParams = [\"code\", \"state\"];\n const originalUrl = new URL(window.location.href);\n for (const param of requiredParams) {\n if (!originalUrl.searchParams.has(param)) {\n captureError(\"consumeOAuthCallbackQueryParams\", new Error(`Missing required query parameter on OAuth callback: ${param}`));\n return null;\n }\n }\n\n const expectedState = originalUrl.searchParams.get(\"state\") ?? throwErr(\"This should never happen; isn't state required above?\");\n const cookieResult = consumeVerifierAndStateCookie(expectedState);\n\n if (!cookieResult) {\n // If the state can't be found in the cookies, then the callback wasn't meant for us.\n // Maybe the website uses another OAuth library?\n captureError(\"consumeOAuthCallbackQueryParams\", new Error(deindent`\n Stack found an outer OAuth callback state in the query parameters, but not in cookies.\n \n This could have multiple reasons:\n - The cookie expired, because the OAuth flow took too long.\n - The user's browser deleted the cookie, either manually or because of a very strict cookie policy.\n - The cookie was already consumed by this page, and the user already logged in.\n - You are using another OAuth client library with the same callback URL as Stack.\n `));\n return null;\n }\n\n\n const newUrl = new URL(originalUrl);\n for (const param of requiredParams) {\n newUrl.searchParams.delete(param);\n }\n\n // let's get rid of the authorization code in the history as we\n // don't redirect to `redirectUrl` if there's a validation error\n // (as the redirectUrl might be malicious!).\n //\n // We use history.replaceState instead of location.assign(...) to\n // prevent an unnecessary reload\n window.history.replaceState({}, \"\", newUrl.toString());\n\n return {\n originalUrl,\n codeVerifier: cookieResult.codeVerifier,\n state: expectedState,\n };\n}\n\nexport async function callOAuthCallback(\n iface: StackClientInterface,\n redirectUrl: string,\n) {\n // note: this part of the function (until the return) needs\n // to be synchronous, to prevent race conditions when\n // callOAuthCallback is called multiple times in parallel\n const consumed = consumeOAuthCallbackQueryParams();\n if (!consumed) return Result.ok(undefined);\n\n // the rest can be asynchronous (we now know that we are the\n // intended recipient of the callback, and the only instance\n // of callOAuthCallback that's running)\n try {\n return Result.ok(await iface.callOAuthCallback({\n oauthParams: consumed.originalUrl.searchParams,\n redirectUri: constructRedirectUrl(redirectUrl),\n codeVerifier: consumed.codeVerifier,\n state: consumed.state,\n }));\n } catch (e) {\n if (e instanceof KnownError) {\n throw e;\n }\n throw new StackAssertionError(\"Error signing in during OAuth callback. Please try again.\", { cause: e });\n }\n}\n"],"mappings":";AAAA,SAAS,kBAAwC;AAEjD,SAAS,qBAAqB,cAAc,gBAAgB;AAC5D,SAAS,oBAAoB;AAC7B,SAAS,cAAc;AACvB,SAAS,gBAAgB;AACzB,SAAS,4BAA4B;AACrC,SAAS,+BAA+B,4BAA4B;AAEpE,eAAsB,gBACpB,OACA,SAMA;AACA,QAAM,EAAE,eAAe,MAAM,IAAI,MAAM,qBAAqB;AAC5D,QAAM,WAAW,MAAM,MAAM,YAAY;AAAA,IACvC,UAAU,QAAQ;AAAA,IAClB,aAAa,qBAAqB,QAAQ,WAAW;AAAA,IACrD,kBAAkB,qBAAqB,QAAQ,gBAAgB;AAAA,IAC/D;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,eAAe,QAAQ;AAAA,EACzB,CAAC;AACD,SAAO,SAAS,OAAO,QAAQ;AAC/B,QAAM,aAAa;AACrB;AAEA,eAAsB,2BACpB,OACA,SAMA,SACA;AACA,QAAM,EAAE,eAAe,MAAM,IAAI,MAAM,qBAAqB;AAC5D,QAAM,WAAW,MAAM,MAAM,YAAY;AAAA,IACvC,UAAU,QAAQ;AAAA,IAClB,aAAa,qBAAqB,QAAQ,WAAW;AAAA,IACrD,kBAAkB,qBAAqB,QAAQ,gBAAgB;AAAA,IAC/D,0BAA0B,qBAAqB,OAAO,SAAS,IAAI;AAAA,IACnE;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,eAAe,QAAQ;AAAA,EACzB,CAAC;AACD,SAAO,SAAS,OAAO,QAAQ;AAC/B,QAAM,aAAa;AACrB;AAOA,SAAS,kCAAkC;AACzC,QAAM,iBAAiB,CAAC,QAAQ,OAAO;AACvC,QAAM,cAAc,IAAI,IAAI,OAAO,SAAS,IAAI;AAChD,aAAW,SAAS,gBAAgB;AAClC,QAAI,CAAC,YAAY,aAAa,IAAI,KAAK,GAAG;AACxC,mBAAa,mCAAmC,IAAI,MAAM,uDAAuD,KAAK,EAAE,CAAC;AACzH,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,gBAAgB,YAAY,aAAa,IAAI,OAAO,KAAK,SAAS,uDAAuD;AAC/H,QAAM,eAAe,8BAA8B,aAAa;AAEhE,MAAI,CAAC,cAAc;AAGjB,iBAAa,mCAAmC,IAAI,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAQzD,CAAC;AACF,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,IAAI,IAAI,WAAW;AAClC,aAAW,SAAS,gBAAgB;AAClC,WAAO,aAAa,OAAO,KAAK;AAAA,EAClC;AAQA,SAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,OAAO,SAAS,CAAC;AAErD,SAAO;AAAA,IACL;AAAA,IACA,cAAc,aAAa;AAAA,IAC3B,OAAO;AAAA,EACT;AACF;AAEA,eAAsB,kBACpB,OACA,aACA;AAIA,QAAM,WAAW,gCAAgC;AACjD,MAAI,CAAC,SAAU,QAAO,OAAO,GAAG,MAAS;AAKzC,MAAI;AACF,WAAO,OAAO,GAAG,MAAM,MAAM,kBAAkB;AAAA,MAC7C,aAAa,SAAS,YAAY;AAAA,MAClC,aAAa,qBAAqB,WAAW;AAAA,MAC7C,cAAc,SAAS;AAAA,MACvB,OAAO,SAAS;AAAA,IAClB,CAAC,CAAC;AAAA,EACJ,SAAS,GAAG;AACV,QAAI,aAAa,YAAY;AAC3B,YAAM;AAAA,IACR;AACA,UAAM,IAAI,oBAAoB,6DAA6D,EAAE,OAAO,EAAE,CAAC;AAAA,EACzG;AACF;","names":[]}
@@ -1,6 +1,6 @@
1
1
  // src/lib/stack-app.ts
2
2
  import { isReactServer } from "@stackframe/stack-sc";
3
- import { KnownError, KnownErrors, StackAdminInterface, StackClientInterface, StackServerInterface } from "@stackframe/stack-shared";
3
+ import { KnownErrors, StackAdminInterface, StackClientInterface, StackServerInterface } from "@stackframe/stack-shared";
4
4
  import { getProductionModeErrors } from "@stackframe/stack-shared/dist/helpers/production-mode";
5
5
  import { InternalSession } from "@stackframe/stack-shared/dist/sessions";
6
6
  import { encodeBase64 } from "@stackframe/stack-shared/dist/utils/bytes";
@@ -24,7 +24,7 @@ import { constructRedirectUrl } from "../utils/url";
24
24
  import { addNewOAuthProviderOrScope, callOAuthCallback, signInWithOAuth } from "./auth";
25
25
  import { deleteCookie, getCookie, setOrDeleteCookie } from "./cookie";
26
26
  var NextNavigation = scrambleDuringCompileTime(NextNavigationUnscrambled);
27
- var clientVersion = "js @stackframe/stack@2.5.37";
27
+ var clientVersion = "js @stackframe/stack@2.6.1";
28
28
  function getUrls(partial) {
29
29
  const handler = partial.handler ?? "/handler";
30
30
  const home = partial.home ?? "/";
@@ -526,6 +526,8 @@ var _StackClientAppImpl = class __StackClientAppImpl {
526
526
  id: crud.id,
527
527
  displayName: crud.display_name,
528
528
  profileImageUrl: crud.profile_image_url,
529
+ clientMetadata: crud.client_metadata,
530
+ clientReadOnlyMetadata: crud.client_read_only_metadata,
529
531
  async inviteUser(options) {
530
532
  return await app._interface.sendTeamInvitation({
531
533
  teamId: crud.id,
@@ -846,32 +848,24 @@ var _StackClientAppImpl = class __StackClientAppImpl {
846
848
  }
847
849
  async sendForgotPasswordEmail(email) {
848
850
  const redirectUrl = constructRedirectUrl(this.urls.passwordReset);
849
- const error = await this._interface.sendForgotPasswordEmail(email, redirectUrl);
850
- return error;
851
+ return await this._interface.sendForgotPasswordEmail(email, redirectUrl);
851
852
  }
852
853
  async sendMagicLinkEmail(email) {
853
854
  const magicLinkRedirectUrl = constructRedirectUrl(this.urls.magicLinkCallback);
854
- const error = await this._interface.sendMagicLinkEmail(email, magicLinkRedirectUrl);
855
- return error;
855
+ return await this._interface.sendMagicLinkEmail(email, magicLinkRedirectUrl);
856
856
  }
857
857
  async resetPassword(options) {
858
- const error = await this._interface.resetPassword(options);
859
- return error;
858
+ return await this._interface.resetPassword(options);
860
859
  }
861
860
  async verifyPasswordResetCode(code) {
862
861
  return await this._interface.verifyPasswordResetCode(code);
863
862
  }
864
863
  async verifyTeamInvitationCode(code) {
865
- const result = await this._interface.acceptTeamInvitation({
864
+ return await this._interface.acceptTeamInvitation({
866
865
  type: "check",
867
866
  code,
868
867
  session: this._getSession()
869
868
  });
870
- if (result.status === "ok") {
871
- return Result.ok(void 0);
872
- } else {
873
- return Result.error(result.error);
874
- }
875
869
  }
876
870
  async acceptTeamInvitation(code) {
877
871
  const result = await this._interface.acceptTeamInvitation({
@@ -985,7 +979,7 @@ var _StackClientAppImpl = class __StackClientAppImpl {
985
979
  return await callback();
986
980
  } catch (e) {
987
981
  if (e instanceof KnownErrors.MultiFactorAuthenticationRequired) {
988
- return await this._experimentalMfa(e, this._getSession());
982
+ return Result.ok(await this._experimentalMfa(e, this._getSession()));
989
983
  }
990
984
  throw e;
991
985
  }
@@ -1000,19 +994,19 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1000
994
  });
1001
995
  } catch (e) {
1002
996
  if (e instanceof KnownErrors.InvalidTotpCode) {
1003
- return e;
997
+ return Result.error(e);
1004
998
  }
1005
999
  throw e;
1006
1000
  }
1007
- if (!(result instanceof KnownError)) {
1008
- await this._signInToAccountWithTokens(result);
1001
+ if (result.status === "ok") {
1002
+ await this._signInToAccountWithTokens(result.data);
1009
1003
  if (!options.noRedirect) {
1010
- return await this.redirectToAfterSignIn({ replace: true });
1011
- } else {
1012
- return;
1004
+ await this.redirectToAfterSignIn({ replace: true });
1013
1005
  }
1006
+ return Result.ok(void 0);
1007
+ } else {
1008
+ return Result.error(result.error);
1014
1009
  }
1015
- return result;
1016
1010
  }
1017
1011
  async signUpWithCredential(options) {
1018
1012
  this._ensurePersistentTokenStore();
@@ -1024,15 +1018,15 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1024
1018
  emailVerificationRedirectUrl,
1025
1019
  session
1026
1020
  );
1027
- if (!(result instanceof KnownError)) {
1028
- await this._signInToAccountWithTokens(result);
1021
+ if (result.status === "ok") {
1022
+ await this._signInToAccountWithTokens(result.data);
1029
1023
  if (!options.noRedirect) {
1030
- return await this.redirectToAfterSignUp({ replace: true });
1031
- } else {
1032
- return;
1024
+ await this.redirectToAfterSignUp({ replace: true });
1033
1025
  }
1026
+ return Result.ok(void 0);
1027
+ } else {
1028
+ return Result.error(result.error);
1034
1029
  }
1035
- return result;
1036
1030
  }
1037
1031
  async signInWithMagicLink(code) {
1038
1032
  this._ensurePersistentTokenStore();
@@ -1043,18 +1037,20 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1043
1037
  });
1044
1038
  } catch (e) {
1045
1039
  if (e instanceof KnownErrors.InvalidTotpCode) {
1046
- return e;
1040
+ return Result.error(e);
1047
1041
  }
1048
1042
  throw e;
1049
1043
  }
1050
- if (result instanceof KnownError) {
1051
- return result;
1052
- }
1053
- await this._signInToAccountWithTokens(result);
1054
- if (result.newUser) {
1055
- await this.redirectToAfterSignUp({ replace: true });
1044
+ if (result.status === "ok") {
1045
+ await this._signInToAccountWithTokens(result.data);
1046
+ if (result.data.newUser) {
1047
+ await this.redirectToAfterSignUp({ replace: true });
1048
+ } else {
1049
+ await this.redirectToAfterSignIn({ replace: true });
1050
+ }
1051
+ return Result.ok(void 0);
1056
1052
  } else {
1057
- await this.redirectToAfterSignIn({ replace: true });
1053
+ return Result.error(result.error);
1058
1054
  }
1059
1055
  }
1060
1056
  async callOAuthCallback() {
@@ -1070,13 +1066,12 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1070
1066
  }
1071
1067
  throw e;
1072
1068
  }
1073
- if (result) {
1074
- console.log("OAuth callback result", result);
1075
- await this._signInToAccountWithTokens(result);
1076
- if ("afterCallbackRedirectUrl" in result && result.afterCallbackRedirectUrl) {
1077
- await _redirectTo(result.afterCallbackRedirectUrl, { replace: true });
1069
+ if (result.status === "ok" && result.data) {
1070
+ await this._signInToAccountWithTokens(result.data);
1071
+ if ("afterCallbackRedirectUrl" in result.data && result.data.afterCallbackRedirectUrl) {
1072
+ await _redirectTo(result.data.afterCallbackRedirectUrl, { replace: true });
1078
1073
  return true;
1079
- } else if (result.newUser) {
1074
+ } else if (result.data.newUser) {
1080
1075
  await this.redirectToAfterSignUp({ replace: true });
1081
1076
  return true;
1082
1077
  } else {
@@ -1396,7 +1391,7 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
1396
1391
  return await app._checkFeatureSupport("sendVerificationEmail() on ServerUser", {});
1397
1392
  },
1398
1393
  async updatePassword(options) {
1399
- return await app._checkFeatureSupport("updatePassword() on ServerUser", {});
1394
+ return await this.update({ password: options.newPassword });
1400
1395
  },
1401
1396
  async getTeamProfile(team) {
1402
1397
  const result = await app._serverUserTeamProfileCache.getOrWait([team.id, crud.id], "write-only");
@@ -1434,6 +1429,9 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
1434
1429
  displayName: crud.display_name,
1435
1430
  profileImageUrl: crud.profile_image_url,
1436
1431
  createdAt: new Date(crud.created_at_millis),
1432
+ clientMetadata: crud.client_metadata,
1433
+ clientReadOnlyMetadata: crud.client_read_only_metadata,
1434
+ serverMetadata: crud.server_metadata,
1437
1435
  async update(update) {
1438
1436
  await app._interface.updateServerTeam(crud.id, serverTeamUpdateOptionsToCrud(update));
1439
1437
  await app._serverTeamsCache.refresh([void 0]);
@@ -1944,7 +1942,8 @@ function apiKeyCreateOptionsToCrud(options) {
1944
1942
  function teamUpdateOptionsToCrud(options) {
1945
1943
  return {
1946
1944
  display_name: options.displayName,
1947
- profile_image_url: options.profileImageUrl
1945
+ profile_image_url: options.profileImageUrl,
1946
+ client_metadata: options.clientMetadata
1948
1947
  };
1949
1948
  }
1950
1949
  function teamCreateOptionsToCrud(options) {
@@ -1959,7 +1958,10 @@ function serverTeamCreateOptionsToCrud(options) {
1959
1958
  function serverTeamUpdateOptionsToCrud(options) {
1960
1959
  return {
1961
1960
  display_name: options.displayName,
1962
- profile_image_url: options.profileImageUrl
1961
+ profile_image_url: options.profileImageUrl,
1962
+ client_metadata: options.clientMetadata,
1963
+ client_read_only_metadata: options.clientReadOnlyMetadata,
1964
+ server_metadata: options.serverMetadata
1963
1965
  };
1964
1966
  }
1965
1967
  function serverTeamPermissionDefinitionCreateOptionsToCrud(options) {