@stackframe/stack 2.5.35 → 2.6.0

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 (114) hide show
  1. package/CHANGELOG.md +33 -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 +19 -11
  9. package/dist/components/elements/sidebar-layout.js.map +1 -1
  10. package/dist/components/elements/user-avatar.js +1 -1
  11. package/dist/components/elements/user-avatar.js.map +1 -1
  12. package/dist/components/magic-link-sign-in.js +82 -30
  13. package/dist/components/magic-link-sign-in.js.map +1 -1
  14. package/dist/components/message-cards/predefined-message-card.js +22 -20
  15. package/dist/components/message-cards/predefined-message-card.js.map +1 -1
  16. package/dist/components/oauth-button.js +32 -25
  17. package/dist/components/oauth-button.js.map +1 -1
  18. package/dist/components/profile-image-editor.js +2 -2
  19. package/dist/components/profile-image-editor.js.map +1 -1
  20. package/dist/components/selected-team-switcher.js +1 -1
  21. package/dist/components/selected-team-switcher.js.map +1 -1
  22. package/dist/components-page/account-settings.d.mts +4 -2
  23. package/dist/components-page/account-settings.d.ts +4 -2
  24. package/dist/components-page/account-settings.js +365 -188
  25. package/dist/components-page/account-settings.js.map +1 -1
  26. package/dist/components-page/auth-page.d.mts +1 -0
  27. package/dist/components-page/auth-page.d.ts +1 -0
  28. package/dist/components-page/auth-page.js +5 -5
  29. package/dist/components-page/auth-page.js.map +1 -1
  30. package/dist/components-page/email-verification.js +10 -8
  31. package/dist/components-page/email-verification.js.map +1 -1
  32. package/dist/components-page/error-page.js +19 -4
  33. package/dist/components-page/error-page.js.map +1 -1
  34. package/dist/components-page/magic-link-callback.js +11 -9
  35. package/dist/components-page/magic-link-callback.js.map +1 -1
  36. package/dist/components-page/oauth-callback.js +1 -1
  37. package/dist/components-page/oauth-callback.js.map +1 -1
  38. package/dist/components-page/password-reset.js +13 -11
  39. package/dist/components-page/password-reset.js.map +1 -1
  40. package/dist/components-page/sign-up.d.mts +1 -0
  41. package/dist/components-page/sign-up.d.ts +1 -0
  42. package/dist/components-page/sign-up.js +10 -1
  43. package/dist/components-page/sign-up.js.map +1 -1
  44. package/dist/components-page/stack-handler.d.mts +1 -0
  45. package/dist/components-page/stack-handler.d.ts +1 -0
  46. package/dist/esm/components/credential-sign-in.js +4 -2
  47. package/dist/esm/components/credential-sign-in.js.map +1 -1
  48. package/dist/esm/components/credential-sign-up.js +24 -18
  49. package/dist/esm/components/credential-sign-up.js.map +1 -1
  50. package/dist/esm/components/elements/sidebar-layout.js +19 -11
  51. package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
  52. package/dist/esm/components/elements/user-avatar.js +1 -1
  53. package/dist/esm/components/elements/user-avatar.js.map +1 -1
  54. package/dist/esm/components/magic-link-sign-in.js +84 -32
  55. package/dist/esm/components/magic-link-sign-in.js.map +1 -1
  56. package/dist/esm/components/message-cards/predefined-message-card.js +22 -20
  57. package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -1
  58. package/dist/esm/components/oauth-button.js +32 -25
  59. package/dist/esm/components/oauth-button.js.map +1 -1
  60. package/dist/esm/components/profile-image-editor.js +2 -2
  61. package/dist/esm/components/profile-image-editor.js.map +1 -1
  62. package/dist/esm/components/selected-team-switcher.js +1 -1
  63. package/dist/esm/components/selected-team-switcher.js.map +1 -1
  64. package/dist/esm/components-page/account-settings.js +365 -189
  65. package/dist/esm/components-page/account-settings.js.map +1 -1
  66. package/dist/esm/components-page/auth-page.js +5 -5
  67. package/dist/esm/components-page/auth-page.js.map +1 -1
  68. package/dist/esm/components-page/email-verification.js +10 -8
  69. package/dist/esm/components-page/email-verification.js.map +1 -1
  70. package/dist/esm/components-page/error-page.js +19 -4
  71. package/dist/esm/components-page/error-page.js.map +1 -1
  72. package/dist/esm/components-page/magic-link-callback.js +11 -9
  73. package/dist/esm/components-page/magic-link-callback.js.map +1 -1
  74. package/dist/esm/components-page/oauth-callback.js +1 -1
  75. package/dist/esm/components-page/oauth-callback.js.map +1 -1
  76. package/dist/esm/components-page/password-reset.js +13 -11
  77. package/dist/esm/components-page/password-reset.js.map +1 -1
  78. package/dist/esm/components-page/sign-up.js +10 -1
  79. package/dist/esm/components-page/sign-up.js.map +1 -1
  80. package/dist/esm/generated/global-css.js +1 -1
  81. package/dist/esm/generated/global-css.js.map +1 -1
  82. package/dist/esm/generated/quetzal-translations.js +1764 -1356
  83. package/dist/esm/generated/quetzal-translations.js.map +1 -1
  84. package/dist/esm/lib/auth.js +4 -3
  85. package/dist/esm/lib/auth.js.map +1 -1
  86. package/dist/esm/lib/stack-app.js +54 -45
  87. package/dist/esm/lib/stack-app.js.map +1 -1
  88. package/dist/esm/lib/translations.js +6 -2
  89. package/dist/esm/lib/translations.js.map +1 -1
  90. package/dist/esm/utils/browser-script.js +9 -7
  91. package/dist/esm/utils/browser-script.js.map +1 -1
  92. package/dist/generated/global-css.d.mts +1 -1
  93. package/dist/generated/global-css.d.ts +1 -1
  94. package/dist/generated/global-css.js +1 -1
  95. package/dist/generated/global-css.js.map +1 -1
  96. package/dist/generated/quetzal-translations.d.mts +2 -2
  97. package/dist/generated/quetzal-translations.d.ts +2 -2
  98. package/dist/generated/quetzal-translations.js +1764 -1356
  99. package/dist/generated/quetzal-translations.js.map +1 -1
  100. package/dist/lib/auth.d.mts +16 -6
  101. package/dist/lib/auth.d.ts +16 -6
  102. package/dist/lib/auth.js +4 -3
  103. package/dist/lib/auth.js.map +1 -1
  104. package/dist/lib/stack-app.d.mts +21 -12
  105. package/dist/lib/stack-app.d.ts +21 -12
  106. package/dist/lib/stack-app.js +53 -44
  107. package/dist/lib/stack-app.js.map +1 -1
  108. package/dist/lib/translations.d.mts +1 -1
  109. package/dist/lib/translations.d.ts +1 -1
  110. package/dist/lib/translations.js +6 -2
  111. package/dist/lib/translations.js.map +1 -1
  112. package/dist/utils/browser-script.js +9 -7
  113. package/dist/utils/browser-script.js.map +1 -1
  114. 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.35";
27
+ var clientVersion = "js @stackframe/stack@2.6.0";
28
28
  function getUrls(partial) {
29
29
  const handler = partial.handler ?? "/handler";
30
30
  const home = partial.home ?? "/";
@@ -499,6 +499,7 @@ var _StackClientAppImpl = class __StackClientAppImpl {
499
499
  credentialEnabled: crud.config.credential_enabled,
500
500
  magicLinkEnabled: crud.config.magic_link_enabled,
501
501
  clientTeamCreationEnabled: crud.config.client_team_creation_enabled,
502
+ clientUserDeletionEnabled: crud.config.client_user_deletion_enabled,
502
503
  oauthProviders: crud.config.enabled_oauth_providers.map((p) => ({
503
504
  id: p.id
504
505
  }))
@@ -525,6 +526,8 @@ var _StackClientAppImpl = class __StackClientAppImpl {
525
526
  id: crud.id,
526
527
  displayName: crud.display_name,
527
528
  profileImageUrl: crud.profile_image_url,
529
+ clientMetadata: crud.client_metadata,
530
+ clientReadOnlyMetadata: crud.client_read_only_metadata,
528
531
  async inviteUser(options) {
529
532
  return await app._interface.sendTeamInvitation({
530
533
  teamId: crud.id,
@@ -703,6 +706,10 @@ var _StackClientAppImpl = class __StackClientAppImpl {
703
706
  useTeamProfile(team) {
704
707
  const result = useAsyncCache(app._currentUserTeamProfileCache, [session, team.id], "user.useTeamProfile()");
705
708
  return app._editableTeamProfileFromCrud(result);
709
+ },
710
+ async delete() {
711
+ await app._interface.deleteCurrentUser(session);
712
+ session.markInvalid();
706
713
  }
707
714
  };
708
715
  }
@@ -841,32 +848,24 @@ var _StackClientAppImpl = class __StackClientAppImpl {
841
848
  }
842
849
  async sendForgotPasswordEmail(email) {
843
850
  const redirectUrl = constructRedirectUrl(this.urls.passwordReset);
844
- const error = await this._interface.sendForgotPasswordEmail(email, redirectUrl);
845
- return error;
851
+ return await this._interface.sendForgotPasswordEmail(email, redirectUrl);
846
852
  }
847
853
  async sendMagicLinkEmail(email) {
848
854
  const magicLinkRedirectUrl = constructRedirectUrl(this.urls.magicLinkCallback);
849
- const error = await this._interface.sendMagicLinkEmail(email, magicLinkRedirectUrl);
850
- return error;
855
+ return await this._interface.sendMagicLinkEmail(email, magicLinkRedirectUrl);
851
856
  }
852
857
  async resetPassword(options) {
853
- const error = await this._interface.resetPassword(options);
854
- return error;
858
+ return await this._interface.resetPassword(options);
855
859
  }
856
860
  async verifyPasswordResetCode(code) {
857
861
  return await this._interface.verifyPasswordResetCode(code);
858
862
  }
859
863
  async verifyTeamInvitationCode(code) {
860
- const result = await this._interface.acceptTeamInvitation({
864
+ return await this._interface.acceptTeamInvitation({
861
865
  type: "check",
862
866
  code,
863
867
  session: this._getSession()
864
868
  });
865
- if (result.status === "ok") {
866
- return Result.ok(void 0);
867
- } else {
868
- return Result.error(result.error);
869
- }
870
869
  }
871
870
  async acceptTeamInvitation(code) {
872
871
  const result = await this._interface.acceptTeamInvitation({
@@ -980,7 +979,7 @@ var _StackClientAppImpl = class __StackClientAppImpl {
980
979
  return await callback();
981
980
  } catch (e) {
982
981
  if (e instanceof KnownErrors.MultiFactorAuthenticationRequired) {
983
- return await this._experimentalMfa(e, this._getSession());
982
+ return Result.ok(await this._experimentalMfa(e, this._getSession()));
984
983
  }
985
984
  throw e;
986
985
  }
@@ -995,19 +994,19 @@ var _StackClientAppImpl = class __StackClientAppImpl {
995
994
  });
996
995
  } catch (e) {
997
996
  if (e instanceof KnownErrors.InvalidTotpCode) {
998
- return e;
997
+ return Result.error(e);
999
998
  }
1000
999
  throw e;
1001
1000
  }
1002
- if (!(result instanceof KnownError)) {
1003
- await this._signInToAccountWithTokens(result);
1001
+ if (result.status === "ok") {
1002
+ await this._signInToAccountWithTokens(result.data);
1004
1003
  if (!options.noRedirect) {
1005
- return await this.redirectToAfterSignIn({ replace: true });
1006
- } else {
1007
- return;
1004
+ await this.redirectToAfterSignIn({ replace: true });
1008
1005
  }
1006
+ return Result.ok(void 0);
1007
+ } else {
1008
+ return Result.error(result.error);
1009
1009
  }
1010
- return result;
1011
1010
  }
1012
1011
  async signUpWithCredential(options) {
1013
1012
  this._ensurePersistentTokenStore();
@@ -1019,15 +1018,15 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1019
1018
  emailVerificationRedirectUrl,
1020
1019
  session
1021
1020
  );
1022
- if (!(result instanceof KnownError)) {
1023
- await this._signInToAccountWithTokens(result);
1021
+ if (result.status === "ok") {
1022
+ await this._signInToAccountWithTokens(result.data);
1024
1023
  if (!options.noRedirect) {
1025
- return await this.redirectToAfterSignUp({ replace: true });
1026
- } else {
1027
- return;
1024
+ await this.redirectToAfterSignUp({ replace: true });
1028
1025
  }
1026
+ return Result.ok(void 0);
1027
+ } else {
1028
+ return Result.error(result.error);
1029
1029
  }
1030
- return result;
1031
1030
  }
1032
1031
  async signInWithMagicLink(code) {
1033
1032
  this._ensurePersistentTokenStore();
@@ -1038,18 +1037,20 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1038
1037
  });
1039
1038
  } catch (e) {
1040
1039
  if (e instanceof KnownErrors.InvalidTotpCode) {
1041
- return e;
1040
+ return Result.error(e);
1042
1041
  }
1043
1042
  throw e;
1044
1043
  }
1045
- if (result instanceof KnownError) {
1046
- return result;
1047
- }
1048
- await this._signInToAccountWithTokens(result);
1049
- if (result.newUser) {
1050
- 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);
1051
1052
  } else {
1052
- await this.redirectToAfterSignIn({ replace: true });
1053
+ return Result.error(result.error);
1053
1054
  }
1054
1055
  }
1055
1056
  async callOAuthCallback() {
@@ -1065,13 +1066,12 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1065
1066
  }
1066
1067
  throw e;
1067
1068
  }
1068
- if (result) {
1069
- console.log("OAuth callback result", result);
1070
- await this._signInToAccountWithTokens(result);
1071
- if ("afterCallbackRedirectUrl" in result && result.afterCallbackRedirectUrl) {
1072
- 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 });
1073
1073
  return true;
1074
- } else if (result.newUser) {
1074
+ } else if (result.data.newUser) {
1075
1075
  await this.redirectToAfterSignUp({ replace: true });
1076
1076
  return true;
1077
1077
  } else {
@@ -1391,7 +1391,7 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
1391
1391
  return await app._checkFeatureSupport("sendVerificationEmail() on ServerUser", {});
1392
1392
  },
1393
1393
  async updatePassword(options) {
1394
- return await app._checkFeatureSupport("updatePassword() on ServerUser", {});
1394
+ return await this.update({ password: options.newPassword });
1395
1395
  },
1396
1396
  async getTeamProfile(team) {
1397
1397
  const result = await app._serverUserTeamProfileCache.getOrWait([team.id, crud.id], "write-only");
@@ -1429,6 +1429,9 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
1429
1429
  displayName: crud.display_name,
1430
1430
  profileImageUrl: crud.profile_image_url,
1431
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,
1432
1435
  async update(update) {
1433
1436
  await app._interface.updateServerTeam(crud.id, serverTeamUpdateOptionsToCrud(update));
1434
1437
  await app._serverTeamsCache.refresh([void 0]);
@@ -1665,6 +1668,7 @@ var _StackAdminAppImpl = class extends _StackServerAppImpl {
1665
1668
  credentialEnabled: data.config.credential_enabled,
1666
1669
  magicLinkEnabled: data.config.magic_link_enabled,
1667
1670
  clientTeamCreationEnabled: data.config.client_team_creation_enabled,
1671
+ clientUserDeletionEnabled: data.config.client_user_deletion_enabled,
1668
1672
  allowLocalhost: data.config.allow_localhost,
1669
1673
  oauthProviders: data.config.oauth_providers.map((p) => p.type === "shared" ? {
1670
1674
  id: p.id,
@@ -1914,6 +1918,7 @@ function adminProjectUpdateOptionsToCrud(options) {
1914
1918
  allow_localhost: options.config?.allowLocalhost,
1915
1919
  create_team_on_sign_up: options.config?.createTeamOnSignUp,
1916
1920
  client_team_creation_enabled: options.config?.clientTeamCreationEnabled,
1921
+ client_user_deletion_enabled: options.config?.clientUserDeletionEnabled,
1917
1922
  team_creator_default_permissions: options.config?.teamCreatorDefaultPermissions,
1918
1923
  team_member_default_permissions: options.config?.teamMemberDefaultPermissions
1919
1924
  }
@@ -1937,7 +1942,8 @@ function apiKeyCreateOptionsToCrud(options) {
1937
1942
  function teamUpdateOptionsToCrud(options) {
1938
1943
  return {
1939
1944
  display_name: options.displayName,
1940
- profile_image_url: options.profileImageUrl
1945
+ profile_image_url: options.profileImageUrl,
1946
+ client_metadata: options.clientMetadata
1941
1947
  };
1942
1948
  }
1943
1949
  function teamCreateOptionsToCrud(options) {
@@ -1952,7 +1958,10 @@ function serverTeamCreateOptionsToCrud(options) {
1952
1958
  function serverTeamUpdateOptionsToCrud(options) {
1953
1959
  return {
1954
1960
  display_name: options.displayName,
1955
- 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
1956
1965
  };
1957
1966
  }
1958
1967
  function serverTeamPermissionDefinitionCreateOptionsToCrud(options) {