@stackframe/stack 2.5.37 → 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 (94) hide show
  1. package/CHANGELOG.md +13 -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 +1 -0
  19. package/dist/components-page/auth-page.d.ts +1 -0
  20. package/dist/components-page/auth-page.js +5 -5
  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/magic-link-callback.js +11 -9
  27. package/dist/components-page/magic-link-callback.js.map +1 -1
  28. package/dist/components-page/password-reset.js +13 -11
  29. package/dist/components-page/password-reset.js.map +1 -1
  30. package/dist/components-page/sign-up.d.mts +1 -0
  31. package/dist/components-page/sign-up.d.ts +1 -0
  32. package/dist/components-page/sign-up.js +10 -1
  33. package/dist/components-page/sign-up.js.map +1 -1
  34. package/dist/esm/components/credential-sign-in.js +4 -2
  35. package/dist/esm/components/credential-sign-in.js.map +1 -1
  36. package/dist/esm/components/credential-sign-up.js +24 -18
  37. package/dist/esm/components/credential-sign-up.js.map +1 -1
  38. package/dist/esm/components/elements/sidebar-layout.js +5 -5
  39. package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
  40. package/dist/esm/components/magic-link-sign-in.js +84 -32
  41. package/dist/esm/components/magic-link-sign-in.js.map +1 -1
  42. package/dist/esm/components/message-cards/predefined-message-card.js +22 -20
  43. package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -1
  44. package/dist/esm/components/oauth-button.js +13 -4
  45. package/dist/esm/components/oauth-button.js.map +1 -1
  46. package/dist/esm/components-page/account-settings.js +14 -9
  47. package/dist/esm/components-page/account-settings.js.map +1 -1
  48. package/dist/esm/components-page/auth-page.js +5 -5
  49. package/dist/esm/components-page/auth-page.js.map +1 -1
  50. package/dist/esm/components-page/email-verification.js +10 -8
  51. package/dist/esm/components-page/email-verification.js.map +1 -1
  52. package/dist/esm/components-page/error-page.js +19 -4
  53. package/dist/esm/components-page/error-page.js.map +1 -1
  54. package/dist/esm/components-page/magic-link-callback.js +11 -9
  55. package/dist/esm/components-page/magic-link-callback.js.map +1 -1
  56. package/dist/esm/components-page/password-reset.js +13 -11
  57. package/dist/esm/components-page/password-reset.js.map +1 -1
  58. package/dist/esm/components-page/sign-up.js +10 -1
  59. package/dist/esm/components-page/sign-up.js.map +1 -1
  60. package/dist/esm/generated/global-css.js +1 -1
  61. package/dist/esm/generated/global-css.js.map +1 -1
  62. package/dist/esm/generated/quetzal-translations.js +1748 -1544
  63. package/dist/esm/generated/quetzal-translations.js.map +1 -1
  64. package/dist/esm/lib/auth.js +4 -3
  65. package/dist/esm/lib/auth.js.map +1 -1
  66. package/dist/esm/lib/stack-app.js +47 -45
  67. package/dist/esm/lib/stack-app.js.map +1 -1
  68. package/dist/esm/lib/translations.js +6 -2
  69. package/dist/esm/lib/translations.js.map +1 -1
  70. package/dist/esm/utils/browser-script.js +0 -1
  71. package/dist/esm/utils/browser-script.js.map +1 -1
  72. package/dist/generated/global-css.d.mts +1 -1
  73. package/dist/generated/global-css.d.ts +1 -1
  74. package/dist/generated/global-css.js +1 -1
  75. package/dist/generated/global-css.js.map +1 -1
  76. package/dist/generated/quetzal-translations.d.mts +2 -2
  77. package/dist/generated/quetzal-translations.d.ts +2 -2
  78. package/dist/generated/quetzal-translations.js +1748 -1544
  79. package/dist/generated/quetzal-translations.js.map +1 -1
  80. package/dist/lib/auth.d.mts +16 -6
  81. package/dist/lib/auth.d.ts +16 -6
  82. package/dist/lib/auth.js +4 -3
  83. package/dist/lib/auth.js.map +1 -1
  84. package/dist/lib/stack-app.d.mts +17 -11
  85. package/dist/lib/stack-app.d.ts +17 -11
  86. package/dist/lib/stack-app.js +46 -44
  87. package/dist/lib/stack-app.js.map +1 -1
  88. package/dist/lib/translations.d.mts +1 -1
  89. package/dist/lib/translations.d.ts +1 -1
  90. package/dist/lib/translations.js +6 -2
  91. package/dist/lib/translations.js.map +1 -1
  92. package/dist/utils/browser-script.js +0 -1
  93. package/dist/utils/browser-script.js.map +1 -1
  94. 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":[]}
@@ -469,6 +469,8 @@ type Team = {
469
469
  id: string;
470
470
  displayName: string;
471
471
  profileImageUrl: string | null;
472
+ clientMetadata: any;
473
+ clientReadOnlyMetadata: any;
472
474
  inviteUser(options: {
473
475
  email: string;
474
476
  }): Promise<Result<undefined, KnownErrors["TeamPermissionRequired"]>>;
@@ -479,6 +481,7 @@ type Team = {
479
481
  type TeamUpdateOptions = {
480
482
  displayName?: string;
481
483
  profileImageUrl?: string | null;
484
+ clientMetadata?: ReadonlyJson;
482
485
  };
483
486
  type TeamCreateOptions = {
484
487
  displayName: string;
@@ -490,6 +493,7 @@ type ServerTeamUser = ServerUser & {
490
493
  };
491
494
  type ServerTeam = {
492
495
  createdAt: Date;
496
+ serverMetadata: any;
493
497
  listUsers(): Promise<ServerTeamUser[]>;
494
498
  useUsers(): ServerUser[];
495
499
  update(update: ServerTeamUpdateOptions): Promise<void>;
@@ -501,9 +505,9 @@ type ServerTeam = {
501
505
  removeUser(userId: string): Promise<void>;
502
506
  } & Team;
503
507
  type ServerTeamCreateOptions = TeamCreateOptions;
504
- type ServerTeamUpdateOptions = {
505
- displayName?: string;
506
- profileImageUrl?: string | null;
508
+ type ServerTeamUpdateOptions = TeamUpdateOptions & {
509
+ clientReadOnlyMetadata?: ReadonlyJson;
510
+ serverMetadata?: ReadonlyJson;
507
511
  };
508
512
  type TeamPermission = {
509
513
  id: string;
@@ -554,27 +558,29 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
554
558
  email: string;
555
559
  password: string;
556
560
  noRedirect?: boolean;
557
- }): Promise<KnownErrors["EmailPasswordMismatch"] | KnownErrors["InvalidTotpCode"] | void>;
561
+ }): Promise<Result<undefined, KnownErrors["EmailPasswordMismatch"] | KnownErrors["InvalidTotpCode"]>>;
558
562
  signUpWithCredential(options: {
559
563
  email: string;
560
564
  password: string;
561
565
  noRedirect?: boolean;
562
- }): Promise<KnownErrors["UserEmailAlreadyExists"] | KnownErrors["PasswordRequirementsNotMet"] | void>;
566
+ }): Promise<Result<undefined, KnownErrors["UserEmailAlreadyExists"] | KnownErrors["PasswordRequirementsNotMet"]>>;
563
567
  callOAuthCallback(): Promise<boolean>;
564
- sendForgotPasswordEmail(email: string): Promise<KnownErrors["UserNotFound"] | void>;
565
- 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"]>>;
566
572
  resetPassword(options: {
567
573
  code: string;
568
574
  password: string;
569
- }): Promise<KnownErrors["VerificationCodeError"] | void>;
570
- verifyPasswordResetCode(code: string): Promise<KnownErrors["VerificationCodeError"] | void>;
575
+ }): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
576
+ verifyPasswordResetCode(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
571
577
  verifyTeamInvitationCode(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
572
578
  acceptTeamInvitation(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
573
579
  getTeamInvitationDetails(code: string): Promise<Result<{
574
580
  teamDisplayName: string;
575
581
  }, KnownErrors["VerificationCodeError"]>>;
576
- verifyEmail(code: string): Promise<KnownErrors["VerificationCodeError"] | void>;
577
- 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"]>>;
578
584
  redirectToOAuthCallback(): Promise<void>;
579
585
  useUser(options: GetUserOptions<HasTokenStore> & {
580
586
  or: 'redirect';
@@ -469,6 +469,8 @@ type Team = {
469
469
  id: string;
470
470
  displayName: string;
471
471
  profileImageUrl: string | null;
472
+ clientMetadata: any;
473
+ clientReadOnlyMetadata: any;
472
474
  inviteUser(options: {
473
475
  email: string;
474
476
  }): Promise<Result<undefined, KnownErrors["TeamPermissionRequired"]>>;
@@ -479,6 +481,7 @@ type Team = {
479
481
  type TeamUpdateOptions = {
480
482
  displayName?: string;
481
483
  profileImageUrl?: string | null;
484
+ clientMetadata?: ReadonlyJson;
482
485
  };
483
486
  type TeamCreateOptions = {
484
487
  displayName: string;
@@ -490,6 +493,7 @@ type ServerTeamUser = ServerUser & {
490
493
  };
491
494
  type ServerTeam = {
492
495
  createdAt: Date;
496
+ serverMetadata: any;
493
497
  listUsers(): Promise<ServerTeamUser[]>;
494
498
  useUsers(): ServerUser[];
495
499
  update(update: ServerTeamUpdateOptions): Promise<void>;
@@ -501,9 +505,9 @@ type ServerTeam = {
501
505
  removeUser(userId: string): Promise<void>;
502
506
  } & Team;
503
507
  type ServerTeamCreateOptions = TeamCreateOptions;
504
- type ServerTeamUpdateOptions = {
505
- displayName?: string;
506
- profileImageUrl?: string | null;
508
+ type ServerTeamUpdateOptions = TeamUpdateOptions & {
509
+ clientReadOnlyMetadata?: ReadonlyJson;
510
+ serverMetadata?: ReadonlyJson;
507
511
  };
508
512
  type TeamPermission = {
509
513
  id: string;
@@ -554,27 +558,29 @@ type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends s
554
558
  email: string;
555
559
  password: string;
556
560
  noRedirect?: boolean;
557
- }): Promise<KnownErrors["EmailPasswordMismatch"] | KnownErrors["InvalidTotpCode"] | void>;
561
+ }): Promise<Result<undefined, KnownErrors["EmailPasswordMismatch"] | KnownErrors["InvalidTotpCode"]>>;
558
562
  signUpWithCredential(options: {
559
563
  email: string;
560
564
  password: string;
561
565
  noRedirect?: boolean;
562
- }): Promise<KnownErrors["UserEmailAlreadyExists"] | KnownErrors["PasswordRequirementsNotMet"] | void>;
566
+ }): Promise<Result<undefined, KnownErrors["UserEmailAlreadyExists"] | KnownErrors["PasswordRequirementsNotMet"]>>;
563
567
  callOAuthCallback(): Promise<boolean>;
564
- sendForgotPasswordEmail(email: string): Promise<KnownErrors["UserNotFound"] | void>;
565
- 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"]>>;
566
572
  resetPassword(options: {
567
573
  code: string;
568
574
  password: string;
569
- }): Promise<KnownErrors["VerificationCodeError"] | void>;
570
- verifyPasswordResetCode(code: string): Promise<KnownErrors["VerificationCodeError"] | void>;
575
+ }): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
576
+ verifyPasswordResetCode(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
571
577
  verifyTeamInvitationCode(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
572
578
  acceptTeamInvitation(code: string): Promise<Result<undefined, KnownErrors["VerificationCodeError"]>>;
573
579
  getTeamInvitationDetails(code: string): Promise<Result<{
574
580
  teamDisplayName: string;
575
581
  }, KnownErrors["VerificationCodeError"]>>;
576
- verifyEmail(code: string): Promise<KnownErrors["VerificationCodeError"] | void>;
577
- 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"]>>;
578
584
  redirectToOAuthCallback(): Promise<void>;
579
585
  useUser(options: GetUserOptions<HasTokenStore> & {
580
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.37";
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 ?? "/";
@@ -565,6 +565,8 @@ var _StackClientAppImpl = class __StackClientAppImpl {
565
565
  id: crud.id,
566
566
  displayName: crud.display_name,
567
567
  profileImageUrl: crud.profile_image_url,
568
+ clientMetadata: crud.client_metadata,
569
+ clientReadOnlyMetadata: crud.client_read_only_metadata,
568
570
  async inviteUser(options) {
569
571
  return await app._interface.sendTeamInvitation({
570
572
  teamId: crud.id,
@@ -885,32 +887,24 @@ var _StackClientAppImpl = class __StackClientAppImpl {
885
887
  }
886
888
  async sendForgotPasswordEmail(email) {
887
889
  const redirectUrl = (0, import_url.constructRedirectUrl)(this.urls.passwordReset);
888
- const error = await this._interface.sendForgotPasswordEmail(email, redirectUrl);
889
- return error;
890
+ return await this._interface.sendForgotPasswordEmail(email, redirectUrl);
890
891
  }
891
892
  async sendMagicLinkEmail(email) {
892
893
  const magicLinkRedirectUrl = (0, import_url.constructRedirectUrl)(this.urls.magicLinkCallback);
893
- const error = await this._interface.sendMagicLinkEmail(email, magicLinkRedirectUrl);
894
- return error;
894
+ return await this._interface.sendMagicLinkEmail(email, magicLinkRedirectUrl);
895
895
  }
896
896
  async resetPassword(options) {
897
- const error = await this._interface.resetPassword(options);
898
- return error;
897
+ return await this._interface.resetPassword(options);
899
898
  }
900
899
  async verifyPasswordResetCode(code) {
901
900
  return await this._interface.verifyPasswordResetCode(code);
902
901
  }
903
902
  async verifyTeamInvitationCode(code) {
904
- const result = await this._interface.acceptTeamInvitation({
903
+ return await this._interface.acceptTeamInvitation({
905
904
  type: "check",
906
905
  code,
907
906
  session: this._getSession()
908
907
  });
909
- if (result.status === "ok") {
910
- return import_results.Result.ok(void 0);
911
- } else {
912
- return import_results.Result.error(result.error);
913
- }
914
908
  }
915
909
  async acceptTeamInvitation(code) {
916
910
  const result = await this._interface.acceptTeamInvitation({
@@ -1024,7 +1018,7 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1024
1018
  return await callback();
1025
1019
  } catch (e) {
1026
1020
  if (e instanceof import_stack_shared.KnownErrors.MultiFactorAuthenticationRequired) {
1027
- return await this._experimentalMfa(e, this._getSession());
1021
+ return import_results.Result.ok(await this._experimentalMfa(e, this._getSession()));
1028
1022
  }
1029
1023
  throw e;
1030
1024
  }
@@ -1039,19 +1033,19 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1039
1033
  });
1040
1034
  } catch (e) {
1041
1035
  if (e instanceof import_stack_shared.KnownErrors.InvalidTotpCode) {
1042
- return e;
1036
+ return import_results.Result.error(e);
1043
1037
  }
1044
1038
  throw e;
1045
1039
  }
1046
- if (!(result instanceof import_stack_shared.KnownError)) {
1047
- await this._signInToAccountWithTokens(result);
1040
+ if (result.status === "ok") {
1041
+ await this._signInToAccountWithTokens(result.data);
1048
1042
  if (!options.noRedirect) {
1049
- return await this.redirectToAfterSignIn({ replace: true });
1050
- } else {
1051
- return;
1043
+ await this.redirectToAfterSignIn({ replace: true });
1052
1044
  }
1045
+ return import_results.Result.ok(void 0);
1046
+ } else {
1047
+ return import_results.Result.error(result.error);
1053
1048
  }
1054
- return result;
1055
1049
  }
1056
1050
  async signUpWithCredential(options) {
1057
1051
  this._ensurePersistentTokenStore();
@@ -1063,15 +1057,15 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1063
1057
  emailVerificationRedirectUrl,
1064
1058
  session
1065
1059
  );
1066
- if (!(result instanceof import_stack_shared.KnownError)) {
1067
- await this._signInToAccountWithTokens(result);
1060
+ if (result.status === "ok") {
1061
+ await this._signInToAccountWithTokens(result.data);
1068
1062
  if (!options.noRedirect) {
1069
- return await this.redirectToAfterSignUp({ replace: true });
1070
- } else {
1071
- return;
1063
+ await this.redirectToAfterSignUp({ replace: true });
1072
1064
  }
1065
+ return import_results.Result.ok(void 0);
1066
+ } else {
1067
+ return import_results.Result.error(result.error);
1073
1068
  }
1074
- return result;
1075
1069
  }
1076
1070
  async signInWithMagicLink(code) {
1077
1071
  this._ensurePersistentTokenStore();
@@ -1082,18 +1076,20 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1082
1076
  });
1083
1077
  } catch (e) {
1084
1078
  if (e instanceof import_stack_shared.KnownErrors.InvalidTotpCode) {
1085
- return e;
1079
+ return import_results.Result.error(e);
1086
1080
  }
1087
1081
  throw e;
1088
1082
  }
1089
- if (result instanceof import_stack_shared.KnownError) {
1090
- return result;
1091
- }
1092
- await this._signInToAccountWithTokens(result);
1093
- if (result.newUser) {
1094
- 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);
1095
1091
  } else {
1096
- await this.redirectToAfterSignIn({ replace: true });
1092
+ return import_results.Result.error(result.error);
1097
1093
  }
1098
1094
  }
1099
1095
  async callOAuthCallback() {
@@ -1109,13 +1105,12 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1109
1105
  }
1110
1106
  throw e;
1111
1107
  }
1112
- if (result) {
1113
- console.log("OAuth callback result", result);
1114
- await this._signInToAccountWithTokens(result);
1115
- if ("afterCallbackRedirectUrl" in result && result.afterCallbackRedirectUrl) {
1116
- 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 });
1117
1112
  return true;
1118
- } else if (result.newUser) {
1113
+ } else if (result.data.newUser) {
1119
1114
  await this.redirectToAfterSignUp({ replace: true });
1120
1115
  return true;
1121
1116
  } else {
@@ -1435,7 +1430,7 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
1435
1430
  return await app._checkFeatureSupport("sendVerificationEmail() on ServerUser", {});
1436
1431
  },
1437
1432
  async updatePassword(options) {
1438
- return await app._checkFeatureSupport("updatePassword() on ServerUser", {});
1433
+ return await this.update({ password: options.newPassword });
1439
1434
  },
1440
1435
  async getTeamProfile(team) {
1441
1436
  const result = await app._serverUserTeamProfileCache.getOrWait([team.id, crud.id], "write-only");
@@ -1473,6 +1468,9 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
1473
1468
  displayName: crud.display_name,
1474
1469
  profileImageUrl: crud.profile_image_url,
1475
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,
1476
1474
  async update(update) {
1477
1475
  await app._interface.updateServerTeam(crud.id, serverTeamUpdateOptionsToCrud(update));
1478
1476
  await app._serverTeamsCache.refresh([void 0]);
@@ -1983,7 +1981,8 @@ function apiKeyCreateOptionsToCrud(options) {
1983
1981
  function teamUpdateOptionsToCrud(options) {
1984
1982
  return {
1985
1983
  display_name: options.displayName,
1986
- profile_image_url: options.profileImageUrl
1984
+ profile_image_url: options.profileImageUrl,
1985
+ client_metadata: options.clientMetadata
1987
1986
  };
1988
1987
  }
1989
1988
  function teamCreateOptionsToCrud(options) {
@@ -1998,7 +1997,10 @@ function serverTeamCreateOptionsToCrud(options) {
1998
1997
  function serverTeamUpdateOptionsToCrud(options) {
1999
1998
  return {
2000
1999
  display_name: options.displayName,
2001
- 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
2002
2004
  };
2003
2005
  }
2004
2006
  function serverTeamPermissionDefinitionCreateOptionsToCrud(options) {