@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
@@ -13,11 +13,21 @@ declare function addNewOAuthProviderOrScope(iface: StackClientInterface, options
13
13
  errorRedirectUrl: string;
14
14
  providerScope?: string;
15
15
  }, session: InternalSession): Promise<void>;
16
- declare function callOAuthCallback(iface: StackClientInterface, redirectUrl: string): Promise<{
17
- newUser: boolean;
18
- afterCallbackRedirectUrl?: string | undefined;
19
- accessToken: string;
20
- refreshToken: string;
21
- } | null>;
16
+ declare function callOAuthCallback(iface: StackClientInterface, redirectUrl: string): Promise<({
17
+ status: "ok";
18
+ data: undefined;
19
+ } & {
20
+ status: "ok";
21
+ }) | ({
22
+ status: "ok";
23
+ data: {
24
+ newUser: boolean;
25
+ afterCallbackRedirectUrl?: string | undefined;
26
+ accessToken: string;
27
+ refreshToken: string;
28
+ };
29
+ } & {
30
+ status: "ok";
31
+ })>;
22
32
 
23
33
  export { addNewOAuthProviderOrScope, callOAuthCallback, signInWithOAuth };
@@ -13,11 +13,21 @@ declare function addNewOAuthProviderOrScope(iface: StackClientInterface, options
13
13
  errorRedirectUrl: string;
14
14
  providerScope?: string;
15
15
  }, session: InternalSession): Promise<void>;
16
- declare function callOAuthCallback(iface: StackClientInterface, redirectUrl: string): Promise<{
17
- newUser: boolean;
18
- afterCallbackRedirectUrl?: string | undefined;
19
- accessToken: string;
20
- refreshToken: string;
21
- } | null>;
16
+ declare function callOAuthCallback(iface: StackClientInterface, redirectUrl: string): Promise<({
17
+ status: "ok";
18
+ data: undefined;
19
+ } & {
20
+ status: "ok";
21
+ }) | ({
22
+ status: "ok";
23
+ data: {
24
+ newUser: boolean;
25
+ afterCallbackRedirectUrl?: string | undefined;
26
+ accessToken: string;
27
+ refreshToken: string;
28
+ };
29
+ } & {
30
+ status: "ok";
31
+ })>;
22
32
 
23
33
  export { addNewOAuthProviderOrScope, callOAuthCallback, signInWithOAuth };
package/dist/lib/auth.js CHANGED
@@ -28,6 +28,7 @@ module.exports = __toCommonJS(auth_exports);
28
28
  var import_stack_shared = require("@stackframe/stack-shared");
29
29
  var import_errors = require("@stackframe/stack-shared/dist/utils/errors");
30
30
  var import_promises = require("@stackframe/stack-shared/dist/utils/promises");
31
+ var import_results = require("@stackframe/stack-shared/dist/utils/results");
31
32
  var import_strings = require("@stackframe/stack-shared/dist/utils/strings");
32
33
  var import_url = require("../utils/url");
33
34
  var import_cookie = require("./cookie");
@@ -97,14 +98,14 @@ function consumeOAuthCallbackQueryParams() {
97
98
  }
98
99
  async function callOAuthCallback(iface, redirectUrl) {
99
100
  const consumed = consumeOAuthCallbackQueryParams();
100
- if (!consumed) return null;
101
+ if (!consumed) return import_results.Result.ok(void 0);
101
102
  try {
102
- return await iface.callOAuthCallback({
103
+ return import_results.Result.ok(await iface.callOAuthCallback({
103
104
  oauthParams: consumed.originalUrl.searchParams,
104
105
  redirectUri: (0, import_url.constructRedirectUrl)(redirectUrl),
105
106
  codeVerifier: consumed.codeVerifier,
106
107
  state: consumed.state
107
- });
108
+ }));
108
109
  } catch (e) {
109
110
  if (e instanceof import_stack_shared.KnownError) {
110
111
  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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAiD;AAEjD,oBAA4D;AAC5D,sBAA6B;AAC7B,qBAAyB;AACzB,iBAAqC;AACrC,oBAAoE;AAEpE,eAAsB,gBACpB,OACA,SAMA;AACA,QAAM,EAAE,eAAe,MAAM,IAAI,UAAM,oCAAqB;AAC5D,QAAM,WAAW,MAAM,MAAM,YAAY;AAAA,IACvC,UAAU,QAAQ;AAAA,IAClB,iBAAa,iCAAqB,QAAQ,WAAW;AAAA,IACrD,sBAAkB,iCAAqB,QAAQ,gBAAgB;AAAA,IAC/D;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,eAAe,QAAQ;AAAA,EACzB,CAAC;AACD,SAAO,SAAS,OAAO,QAAQ;AAC/B,YAAM,8BAAa;AACrB;AAEA,eAAsB,2BACpB,OACA,SAMA,SACA;AACA,QAAM,EAAE,eAAe,MAAM,IAAI,UAAM,oCAAqB;AAC5D,QAAM,WAAW,MAAM,MAAM,YAAY;AAAA,IACvC,UAAU,QAAQ;AAAA,IAClB,iBAAa,iCAAqB,QAAQ,WAAW;AAAA,IACrD,sBAAkB,iCAAqB,QAAQ,gBAAgB;AAAA,IAC/D,8BAA0B,iCAAqB,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,YAAM,8BAAa;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,sCAAa,mCAAmC,IAAI,MAAM,uDAAuD,KAAK,EAAE,CAAC;AACzH,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,gBAAgB,YAAY,aAAa,IAAI,OAAO,SAAK,wBAAS,uDAAuD;AAC/H,QAAM,mBAAe,6CAA8B,aAAa;AAEhE,MAAI,CAAC,cAAc;AAGjB,oCAAa,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,iBAAa,iCAAqB,WAAW;AAAA,MAC7C,cAAc,SAAS;AAAA,MACvB,OAAO,SAAS;AAAA,IAClB,CAAC;AAAA,EACH,SAAS,GAAG;AACV,QAAI,aAAa,gCAAY;AAC3B,YAAM;AAAA,IACR;AACA,UAAM,IAAI,kCAAoB,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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAiD;AAEjD,oBAA4D;AAC5D,sBAA6B;AAC7B,qBAAuB;AACvB,qBAAyB;AACzB,iBAAqC;AACrC,oBAAoE;AAEpE,eAAsB,gBACpB,OACA,SAMA;AACA,QAAM,EAAE,eAAe,MAAM,IAAI,UAAM,oCAAqB;AAC5D,QAAM,WAAW,MAAM,MAAM,YAAY;AAAA,IACvC,UAAU,QAAQ;AAAA,IAClB,iBAAa,iCAAqB,QAAQ,WAAW;AAAA,IACrD,sBAAkB,iCAAqB,QAAQ,gBAAgB;AAAA,IAC/D;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,eAAe,QAAQ;AAAA,EACzB,CAAC;AACD,SAAO,SAAS,OAAO,QAAQ;AAC/B,YAAM,8BAAa;AACrB;AAEA,eAAsB,2BACpB,OACA,SAMA,SACA;AACA,QAAM,EAAE,eAAe,MAAM,IAAI,UAAM,oCAAqB;AAC5D,QAAM,WAAW,MAAM,MAAM,YAAY;AAAA,IACvC,UAAU,QAAQ;AAAA,IAClB,iBAAa,iCAAqB,QAAQ,WAAW;AAAA,IACrD,sBAAkB,iCAAqB,QAAQ,gBAAgB;AAAA,IAC/D,8BAA0B,iCAAqB,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,YAAM,8BAAa;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,sCAAa,mCAAmC,IAAI,MAAM,uDAAuD,KAAK,EAAE,CAAC;AACzH,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,gBAAgB,YAAY,aAAa,IAAI,OAAO,SAAK,wBAAS,uDAAuD;AAC/H,QAAM,mBAAe,6CAA8B,aAAa;AAEhE,MAAI,CAAC,cAAc;AAGjB,oCAAa,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,sBAAO,GAAG,MAAS;AAKzC,MAAI;AACF,WAAO,sBAAO,GAAG,MAAM,MAAM,kBAAkB;AAAA,MAC7C,aAAa,SAAS,YAAY;AAAA,MAClC,iBAAa,iCAAqB,WAAW;AAAA,MAC7C,cAAc,SAAS;AAAA,MACvB,OAAO,SAAS;AAAA,IAClB,CAAC,CAAC;AAAA,EACJ,SAAS,GAAG;AACV,QAAI,aAAa,gCAAY;AAC3B,YAAM;AAAA,IACR;AACA,UAAM,IAAI,kCAAoB,6DAA6D,EAAE,OAAO,EAAE,CAAC;AAAA,EACzG;AACF;","names":[]}
@@ -221,6 +221,7 @@ type UserExtra = {
221
221
  * A shorthand method to update multiple fields of the user at once.
222
222
  */
223
223
  update(update: UserUpdateOptions): Promise<void>;
224
+ delete(): Promise<void>;
224
225
  getConnectedAccount(id: ProviderType, options: {
225
226
  or: 'redirect';
226
227
  scopes?: string[];
@@ -276,7 +277,6 @@ type ServerBaseUser = {
276
277
  newPassword: string;
277
278
  }): Promise<KnownErrors["PasswordConfirmationMismatch"] | KnownErrors["PasswordRequirementsNotMet"] | void>;
278
279
  update(user: ServerUserUpdateOptions): Promise<void>;
279
- delete(): Promise<void>;
280
280
  grantPermission(scope: Team, permissionId: string): Promise<void>;
281
281
  revokePermission(scope: Team, permissionId: string): Promise<void>;
282
282
  hasPermission(scope: Team, permissionId: string): Promise<boolean>;
@@ -347,6 +347,7 @@ type ProjectConfig = {
347
347
  readonly credentialEnabled: boolean;
348
348
  readonly magicLinkEnabled: boolean;
349
349
  readonly clientTeamCreationEnabled: boolean;
350
+ readonly clientUserDeletionEnabled: boolean;
350
351
  readonly oauthProviders: OAuthProviderConfig[];
351
352
  };
352
353
  type OAuthProviderConfig = {
@@ -358,6 +359,7 @@ type AdminProjectConfig = {
358
359
  readonly credentialEnabled: boolean;
359
360
  readonly magicLinkEnabled: boolean;
360
361
  readonly clientTeamCreationEnabled: boolean;
362
+ readonly clientUserDeletionEnabled: boolean;
361
363
  readonly allowLocalhost: boolean;
362
364
  readonly oauthProviders: AdminOAuthProviderConfig[];
363
365
  readonly emailConfig?: AdminEmailConfig;
@@ -403,6 +405,7 @@ type AdminProjectConfigUpdateOptions = {
403
405
  credentialEnabled?: boolean;
404
406
  magicLinkEnabled?: boolean;
405
407
  clientTeamCreationEnabled?: boolean;
408
+ clientUserDeletionEnabled?: boolean;
406
409
  allowLocalhost?: boolean;
407
410
  createTeamOnSignUp?: boolean;
408
411
  emailConfig?: AdminEmailConfig;
@@ -466,6 +469,8 @@ type Team = {
466
469
  id: string;
467
470
  displayName: string;
468
471
  profileImageUrl: string | null;
472
+ clientMetadata: any;
473
+ clientReadOnlyMetadata: any;
469
474
  inviteUser(options: {
470
475
  email: string;
471
476
  }): Promise<Result<undefined, KnownErrors["TeamPermissionRequired"]>>;
@@ -476,6 +481,7 @@ type Team = {
476
481
  type TeamUpdateOptions = {
477
482
  displayName?: string;
478
483
  profileImageUrl?: string | null;
484
+ clientMetadata?: ReadonlyJson;
479
485
  };
480
486
  type TeamCreateOptions = {
481
487
  displayName: string;
@@ -487,6 +493,7 @@ type ServerTeamUser = ServerUser & {
487
493
  };
488
494
  type ServerTeam = {
489
495
  createdAt: Date;
496
+ serverMetadata: any;
490
497
  listUsers(): Promise<ServerTeamUser[]>;
491
498
  useUsers(): ServerUser[];
492
499
  update(update: ServerTeamUpdateOptions): Promise<void>;
@@ -498,9 +505,9 @@ type ServerTeam = {
498
505
  removeUser(userId: string): Promise<void>;
499
506
  } & Team;
500
507
  type ServerTeamCreateOptions = TeamCreateOptions;
501
- type ServerTeamUpdateOptions = {
502
- displayName?: string;
503
- profileImageUrl?: string | null;
508
+ type ServerTeamUpdateOptions = TeamUpdateOptions & {
509
+ clientReadOnlyMetadata?: ReadonlyJson;
510
+ serverMetadata?: ReadonlyJson;
504
511
  };
505
512
  type TeamPermission = {
506
513
  id: string;
@@ -551,27 +558,29 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
551
558
  email: string;
552
559
  password: string;
553
560
  noRedirect?: boolean;
554
- }): Promise<KnownErrors["EmailPasswordMismatch"] | KnownErrors["InvalidTotpCode"] | void>;
561
+ }): Promise<Result<undefined, KnownErrors["EmailPasswordMismatch"] | KnownErrors["InvalidTotpCode"]>>;
555
562
  signUpWithCredential(options: {
556
563
  email: string;
557
564
  password: string;
558
565
  noRedirect?: boolean;
559
- }): Promise<KnownErrors["UserEmailAlreadyExists"] | KnownErrors["PasswordRequirementsNotMet"] | void>;
566
+ }): Promise<Result<undefined, KnownErrors["UserEmailAlreadyExists"] | KnownErrors["PasswordRequirementsNotMet"]>>;
560
567
  callOAuthCallback(): Promise<boolean>;
561
- sendForgotPasswordEmail(email: string): Promise<KnownErrors["UserNotFound"] | void>;
562
- sendMagicLinkEmail(email: string): Promise<KnownErrors["RedirectUrlNotWhitelisted"] | void>;
568
+ sendForgotPasswordEmail(email: string): Promise<Result<undefined, KnownErrors["UserNotFound"]>>;
569
+ sendMagicLinkEmail(email: string): Promise<Result<{
570
+ nonce: string;
571
+ }, KnownErrors["RedirectUrlNotWhitelisted"]>>;
563
572
  resetPassword(options: {
564
573
  code: string;
565
574
  password: string;
566
- }): Promise<KnownErrors["VerificationCodeError"] | void>;
567
- verifyPasswordResetCode(code: string): Promise<KnownErrors["VerificationCodeError"] | void>;
575
+ }): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
576
+ verifyPasswordResetCode(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
568
577
  verifyTeamInvitationCode(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
569
578
  acceptTeamInvitation(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
570
579
  getTeamInvitationDetails(code: string): Promise<Result<{
571
580
  teamDisplayName: string;
572
581
  }, KnownErrors["VerificationCodeError"]>>;
573
- verifyEmail(code: string): Promise<KnownErrors["VerificationCodeError"] | void>;
574
- signInWithMagicLink(code: string): Promise<KnownErrors["VerificationCodeError"] | KnownErrors["InvalidTotpCode"] | void>;
582
+ verifyEmail(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
583
+ signInWithMagicLink(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"] | KnownErrors["InvalidTotpCode"]>>;
575
584
  redirectToOAuthCallback(): Promise<void>;
576
585
  useUser(options: GetUserOptions<HasTokenStore> & {
577
586
  or: 'redirect';
@@ -221,6 +221,7 @@ type UserExtra = {
221
221
  * A shorthand method to update multiple fields of the user at once.
222
222
  */
223
223
  update(update: UserUpdateOptions): Promise<void>;
224
+ delete(): Promise<void>;
224
225
  getConnectedAccount(id: ProviderType, options: {
225
226
  or: 'redirect';
226
227
  scopes?: string[];
@@ -276,7 +277,6 @@ type ServerBaseUser = {
276
277
  newPassword: string;
277
278
  }): Promise<KnownErrors["PasswordConfirmationMismatch"] | KnownErrors["PasswordRequirementsNotMet"] | void>;
278
279
  update(user: ServerUserUpdateOptions): Promise<void>;
279
- delete(): Promise<void>;
280
280
  grantPermission(scope: Team, permissionId: string): Promise<void>;
281
281
  revokePermission(scope: Team, permissionId: string): Promise<void>;
282
282
  hasPermission(scope: Team, permissionId: string): Promise<boolean>;
@@ -347,6 +347,7 @@ type ProjectConfig = {
347
347
  readonly credentialEnabled: boolean;
348
348
  readonly magicLinkEnabled: boolean;
349
349
  readonly clientTeamCreationEnabled: boolean;
350
+ readonly clientUserDeletionEnabled: boolean;
350
351
  readonly oauthProviders: OAuthProviderConfig[];
351
352
  };
352
353
  type OAuthProviderConfig = {
@@ -358,6 +359,7 @@ type AdminProjectConfig = {
358
359
  readonly credentialEnabled: boolean;
359
360
  readonly magicLinkEnabled: boolean;
360
361
  readonly clientTeamCreationEnabled: boolean;
362
+ readonly clientUserDeletionEnabled: boolean;
361
363
  readonly allowLocalhost: boolean;
362
364
  readonly oauthProviders: AdminOAuthProviderConfig[];
363
365
  readonly emailConfig?: AdminEmailConfig;
@@ -403,6 +405,7 @@ type AdminProjectConfigUpdateOptions = {
403
405
  credentialEnabled?: boolean;
404
406
  magicLinkEnabled?: boolean;
405
407
  clientTeamCreationEnabled?: boolean;
408
+ clientUserDeletionEnabled?: boolean;
406
409
  allowLocalhost?: boolean;
407
410
  createTeamOnSignUp?: boolean;
408
411
  emailConfig?: AdminEmailConfig;
@@ -466,6 +469,8 @@ type Team = {
466
469
  id: string;
467
470
  displayName: string;
468
471
  profileImageUrl: string | null;
472
+ clientMetadata: any;
473
+ clientReadOnlyMetadata: any;
469
474
  inviteUser(options: {
470
475
  email: string;
471
476
  }): Promise<Result<undefined, KnownErrors["TeamPermissionRequired"]>>;
@@ -476,6 +481,7 @@ type Team = {
476
481
  type TeamUpdateOptions = {
477
482
  displayName?: string;
478
483
  profileImageUrl?: string | null;
484
+ clientMetadata?: ReadonlyJson;
479
485
  };
480
486
  type TeamCreateOptions = {
481
487
  displayName: string;
@@ -487,6 +493,7 @@ type ServerTeamUser = ServerUser & {
487
493
  };
488
494
  type ServerTeam = {
489
495
  createdAt: Date;
496
+ serverMetadata: any;
490
497
  listUsers(): Promise<ServerTeamUser[]>;
491
498
  useUsers(): ServerUser[];
492
499
  update(update: ServerTeamUpdateOptions): Promise<void>;
@@ -498,9 +505,9 @@ type ServerTeam = {
498
505
  removeUser(userId: string): Promise<void>;
499
506
  } & Team;
500
507
  type ServerTeamCreateOptions = TeamCreateOptions;
501
- type ServerTeamUpdateOptions = {
502
- displayName?: string;
503
- profileImageUrl?: string | null;
508
+ type ServerTeamUpdateOptions = TeamUpdateOptions & {
509
+ clientReadOnlyMetadata?: ReadonlyJson;
510
+ serverMetadata?: ReadonlyJson;
504
511
  };
505
512
  type TeamPermission = {
506
513
  id: string;
@@ -551,27 +558,29 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
551
558
  email: string;
552
559
  password: string;
553
560
  noRedirect?: boolean;
554
- }): Promise<KnownErrors["EmailPasswordMismatch"] | KnownErrors["InvalidTotpCode"] | void>;
561
+ }): Promise<Result<undefined, KnownErrors["EmailPasswordMismatch"] | KnownErrors["InvalidTotpCode"]>>;
555
562
  signUpWithCredential(options: {
556
563
  email: string;
557
564
  password: string;
558
565
  noRedirect?: boolean;
559
- }): Promise<KnownErrors["UserEmailAlreadyExists"] | KnownErrors["PasswordRequirementsNotMet"] | void>;
566
+ }): Promise<Result<undefined, KnownErrors["UserEmailAlreadyExists"] | KnownErrors["PasswordRequirementsNotMet"]>>;
560
567
  callOAuthCallback(): Promise<boolean>;
561
- sendForgotPasswordEmail(email: string): Promise<KnownErrors["UserNotFound"] | void>;
562
- sendMagicLinkEmail(email: string): Promise<KnownErrors["RedirectUrlNotWhitelisted"] | void>;
568
+ sendForgotPasswordEmail(email: string): Promise<Result<undefined, KnownErrors["UserNotFound"]>>;
569
+ sendMagicLinkEmail(email: string): Promise<Result<{
570
+ nonce: string;
571
+ }, KnownErrors["RedirectUrlNotWhitelisted"]>>;
563
572
  resetPassword(options: {
564
573
  code: string;
565
574
  password: string;
566
- }): Promise<KnownErrors["VerificationCodeError"] | void>;
567
- verifyPasswordResetCode(code: string): Promise<KnownErrors["VerificationCodeError"] | void>;
575
+ }): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
576
+ verifyPasswordResetCode(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
568
577
  verifyTeamInvitationCode(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
569
578
  acceptTeamInvitation(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
570
579
  getTeamInvitationDetails(code: string): Promise<Result<{
571
580
  teamDisplayName: string;
572
581
  }, KnownErrors["VerificationCodeError"]>>;
573
- verifyEmail(code: string): Promise<KnownErrors["VerificationCodeError"] | void>;
574
- signInWithMagicLink(code: string): Promise<KnownErrors["VerificationCodeError"] | KnownErrors["InvalidTotpCode"] | void>;
582
+ verifyEmail(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
583
+ signInWithMagicLink(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"] | KnownErrors["InvalidTotpCode"]>>;
575
584
  redirectToOAuthCallback(): Promise<void>;
576
585
  useUser(options: GetUserOptions<HasTokenStore> & {
577
586
  or: 'redirect';
@@ -63,7 +63,7 @@ var import_url = require("../utils/url");
63
63
  var import_auth = require("./auth");
64
64
  var import_cookie = require("./cookie");
65
65
  var NextNavigation = (0, import_compile_time.scrambleDuringCompileTime)(NextNavigationUnscrambled);
66
- var clientVersion = "js @stackframe/stack@2.5.35";
66
+ var clientVersion = "js @stackframe/stack@2.6.0";
67
67
  function getUrls(partial) {
68
68
  const handler = partial.handler ?? "/handler";
69
69
  const home = partial.home ?? "/";
@@ -538,6 +538,7 @@ var _StackClientAppImpl = class __StackClientAppImpl {
538
538
  credentialEnabled: crud.config.credential_enabled,
539
539
  magicLinkEnabled: crud.config.magic_link_enabled,
540
540
  clientTeamCreationEnabled: crud.config.client_team_creation_enabled,
541
+ clientUserDeletionEnabled: crud.config.client_user_deletion_enabled,
541
542
  oauthProviders: crud.config.enabled_oauth_providers.map((p) => ({
542
543
  id: p.id
543
544
  }))
@@ -564,6 +565,8 @@ var _StackClientAppImpl = class __StackClientAppImpl {
564
565
  id: crud.id,
565
566
  displayName: crud.display_name,
566
567
  profileImageUrl: crud.profile_image_url,
568
+ clientMetadata: crud.client_metadata,
569
+ clientReadOnlyMetadata: crud.client_read_only_metadata,
567
570
  async inviteUser(options) {
568
571
  return await app._interface.sendTeamInvitation({
569
572
  teamId: crud.id,
@@ -742,6 +745,10 @@ var _StackClientAppImpl = class __StackClientAppImpl {
742
745
  useTeamProfile(team) {
743
746
  const result = useAsyncCache(app._currentUserTeamProfileCache, [session, team.id], "user.useTeamProfile()");
744
747
  return app._editableTeamProfileFromCrud(result);
748
+ },
749
+ async delete() {
750
+ await app._interface.deleteCurrentUser(session);
751
+ session.markInvalid();
745
752
  }
746
753
  };
747
754
  }
@@ -880,32 +887,24 @@ var _StackClientAppImpl = class __StackClientAppImpl {
880
887
  }
881
888
  async sendForgotPasswordEmail(email) {
882
889
  const redirectUrl = (0, import_url.constructRedirectUrl)(this.urls.passwordReset);
883
- const error = await this._interface.sendForgotPasswordEmail(email, redirectUrl);
884
- return error;
890
+ return await this._interface.sendForgotPasswordEmail(email, redirectUrl);
885
891
  }
886
892
  async sendMagicLinkEmail(email) {
887
893
  const magicLinkRedirectUrl = (0, import_url.constructRedirectUrl)(this.urls.magicLinkCallback);
888
- const error = await this._interface.sendMagicLinkEmail(email, magicLinkRedirectUrl);
889
- return error;
894
+ return await this._interface.sendMagicLinkEmail(email, magicLinkRedirectUrl);
890
895
  }
891
896
  async resetPassword(options) {
892
- const error = await this._interface.resetPassword(options);
893
- return error;
897
+ return await this._interface.resetPassword(options);
894
898
  }
895
899
  async verifyPasswordResetCode(code) {
896
900
  return await this._interface.verifyPasswordResetCode(code);
897
901
  }
898
902
  async verifyTeamInvitationCode(code) {
899
- const result = await this._interface.acceptTeamInvitation({
903
+ return await this._interface.acceptTeamInvitation({
900
904
  type: "check",
901
905
  code,
902
906
  session: this._getSession()
903
907
  });
904
- if (result.status === "ok") {
905
- return import_results.Result.ok(void 0);
906
- } else {
907
- return import_results.Result.error(result.error);
908
- }
909
908
  }
910
909
  async acceptTeamInvitation(code) {
911
910
  const result = await this._interface.acceptTeamInvitation({
@@ -1019,7 +1018,7 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1019
1018
  return await callback();
1020
1019
  } catch (e) {
1021
1020
  if (e instanceof import_stack_shared.KnownErrors.MultiFactorAuthenticationRequired) {
1022
- return await this._experimentalMfa(e, this._getSession());
1021
+ return import_results.Result.ok(await this._experimentalMfa(e, this._getSession()));
1023
1022
  }
1024
1023
  throw e;
1025
1024
  }
@@ -1034,19 +1033,19 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1034
1033
  });
1035
1034
  } catch (e) {
1036
1035
  if (e instanceof import_stack_shared.KnownErrors.InvalidTotpCode) {
1037
- return e;
1036
+ return import_results.Result.error(e);
1038
1037
  }
1039
1038
  throw e;
1040
1039
  }
1041
- if (!(result instanceof import_stack_shared.KnownError)) {
1042
- await this._signInToAccountWithTokens(result);
1040
+ if (result.status === "ok") {
1041
+ await this._signInToAccountWithTokens(result.data);
1043
1042
  if (!options.noRedirect) {
1044
- return await this.redirectToAfterSignIn({ replace: true });
1045
- } else {
1046
- return;
1043
+ await this.redirectToAfterSignIn({ replace: true });
1047
1044
  }
1045
+ return import_results.Result.ok(void 0);
1046
+ } else {
1047
+ return import_results.Result.error(result.error);
1048
1048
  }
1049
- return result;
1050
1049
  }
1051
1050
  async signUpWithCredential(options) {
1052
1051
  this._ensurePersistentTokenStore();
@@ -1058,15 +1057,15 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1058
1057
  emailVerificationRedirectUrl,
1059
1058
  session
1060
1059
  );
1061
- if (!(result instanceof import_stack_shared.KnownError)) {
1062
- await this._signInToAccountWithTokens(result);
1060
+ if (result.status === "ok") {
1061
+ await this._signInToAccountWithTokens(result.data);
1063
1062
  if (!options.noRedirect) {
1064
- return await this.redirectToAfterSignUp({ replace: true });
1065
- } else {
1066
- return;
1063
+ await this.redirectToAfterSignUp({ replace: true });
1067
1064
  }
1065
+ return import_results.Result.ok(void 0);
1066
+ } else {
1067
+ return import_results.Result.error(result.error);
1068
1068
  }
1069
- return result;
1070
1069
  }
1071
1070
  async signInWithMagicLink(code) {
1072
1071
  this._ensurePersistentTokenStore();
@@ -1077,18 +1076,20 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1077
1076
  });
1078
1077
  } catch (e) {
1079
1078
  if (e instanceof import_stack_shared.KnownErrors.InvalidTotpCode) {
1080
- return e;
1079
+ return import_results.Result.error(e);
1081
1080
  }
1082
1081
  throw e;
1083
1082
  }
1084
- if (result instanceof import_stack_shared.KnownError) {
1085
- return result;
1086
- }
1087
- await this._signInToAccountWithTokens(result);
1088
- if (result.newUser) {
1089
- await this.redirectToAfterSignUp({ replace: true });
1083
+ if (result.status === "ok") {
1084
+ await this._signInToAccountWithTokens(result.data);
1085
+ if (result.data.newUser) {
1086
+ await this.redirectToAfterSignUp({ replace: true });
1087
+ } else {
1088
+ await this.redirectToAfterSignIn({ replace: true });
1089
+ }
1090
+ return import_results.Result.ok(void 0);
1090
1091
  } else {
1091
- await this.redirectToAfterSignIn({ replace: true });
1092
+ return import_results.Result.error(result.error);
1092
1093
  }
1093
1094
  }
1094
1095
  async callOAuthCallback() {
@@ -1104,13 +1105,12 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1104
1105
  }
1105
1106
  throw e;
1106
1107
  }
1107
- if (result) {
1108
- console.log("OAuth callback result", result);
1109
- await this._signInToAccountWithTokens(result);
1110
- if ("afterCallbackRedirectUrl" in result && result.afterCallbackRedirectUrl) {
1111
- await _redirectTo(result.afterCallbackRedirectUrl, { replace: true });
1108
+ if (result.status === "ok" && result.data) {
1109
+ await this._signInToAccountWithTokens(result.data);
1110
+ if ("afterCallbackRedirectUrl" in result.data && result.data.afterCallbackRedirectUrl) {
1111
+ await _redirectTo(result.data.afterCallbackRedirectUrl, { replace: true });
1112
1112
  return true;
1113
- } else if (result.newUser) {
1113
+ } else if (result.data.newUser) {
1114
1114
  await this.redirectToAfterSignUp({ replace: true });
1115
1115
  return true;
1116
1116
  } else {
@@ -1430,7 +1430,7 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
1430
1430
  return await app._checkFeatureSupport("sendVerificationEmail() on ServerUser", {});
1431
1431
  },
1432
1432
  async updatePassword(options) {
1433
- return await app._checkFeatureSupport("updatePassword() on ServerUser", {});
1433
+ return await this.update({ password: options.newPassword });
1434
1434
  },
1435
1435
  async getTeamProfile(team) {
1436
1436
  const result = await app._serverUserTeamProfileCache.getOrWait([team.id, crud.id], "write-only");
@@ -1468,6 +1468,9 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
1468
1468
  displayName: crud.display_name,
1469
1469
  profileImageUrl: crud.profile_image_url,
1470
1470
  createdAt: new Date(crud.created_at_millis),
1471
+ clientMetadata: crud.client_metadata,
1472
+ clientReadOnlyMetadata: crud.client_read_only_metadata,
1473
+ serverMetadata: crud.server_metadata,
1471
1474
  async update(update) {
1472
1475
  await app._interface.updateServerTeam(crud.id, serverTeamUpdateOptionsToCrud(update));
1473
1476
  await app._serverTeamsCache.refresh([void 0]);
@@ -1704,6 +1707,7 @@ var _StackAdminAppImpl = class extends _StackServerAppImpl {
1704
1707
  credentialEnabled: data.config.credential_enabled,
1705
1708
  magicLinkEnabled: data.config.magic_link_enabled,
1706
1709
  clientTeamCreationEnabled: data.config.client_team_creation_enabled,
1710
+ clientUserDeletionEnabled: data.config.client_user_deletion_enabled,
1707
1711
  allowLocalhost: data.config.allow_localhost,
1708
1712
  oauthProviders: data.config.oauth_providers.map((p) => p.type === "shared" ? {
1709
1713
  id: p.id,
@@ -1953,6 +1957,7 @@ function adminProjectUpdateOptionsToCrud(options) {
1953
1957
  allow_localhost: options.config?.allowLocalhost,
1954
1958
  create_team_on_sign_up: options.config?.createTeamOnSignUp,
1955
1959
  client_team_creation_enabled: options.config?.clientTeamCreationEnabled,
1960
+ client_user_deletion_enabled: options.config?.clientUserDeletionEnabled,
1956
1961
  team_creator_default_permissions: options.config?.teamCreatorDefaultPermissions,
1957
1962
  team_member_default_permissions: options.config?.teamMemberDefaultPermissions
1958
1963
  }
@@ -1976,7 +1981,8 @@ function apiKeyCreateOptionsToCrud(options) {
1976
1981
  function teamUpdateOptionsToCrud(options) {
1977
1982
  return {
1978
1983
  display_name: options.displayName,
1979
- profile_image_url: options.profileImageUrl
1984
+ profile_image_url: options.profileImageUrl,
1985
+ client_metadata: options.clientMetadata
1980
1986
  };
1981
1987
  }
1982
1988
  function teamCreateOptionsToCrud(options) {
@@ -1991,7 +1997,10 @@ function serverTeamCreateOptionsToCrud(options) {
1991
1997
  function serverTeamUpdateOptionsToCrud(options) {
1992
1998
  return {
1993
1999
  display_name: options.displayName,
1994
- profile_image_url: options.profileImageUrl
2000
+ profile_image_url: options.profileImageUrl,
2001
+ client_metadata: options.clientMetadata,
2002
+ client_read_only_metadata: options.clientReadOnlyMetadata,
2003
+ server_metadata: options.serverMetadata
1995
2004
  };
1996
2005
  }
1997
2006
  function serverTeamPermissionDefinitionCreateOptionsToCrud(options) {