@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.
- package/CHANGELOG.md +13 -0
- package/dist/components/credential-sign-in.js +4 -2
- package/dist/components/credential-sign-in.js.map +1 -1
- package/dist/components/credential-sign-up.d.mts +3 -1
- package/dist/components/credential-sign-up.d.ts +3 -1
- package/dist/components/credential-sign-up.js +23 -17
- package/dist/components/credential-sign-up.js.map +1 -1
- package/dist/components/elements/sidebar-layout.js +5 -5
- package/dist/components/elements/sidebar-layout.js.map +1 -1
- package/dist/components/magic-link-sign-in.js +82 -30
- package/dist/components/magic-link-sign-in.js.map +1 -1
- package/dist/components/message-cards/predefined-message-card.js +22 -20
- package/dist/components/message-cards/predefined-message-card.js.map +1 -1
- package/dist/components/oauth-button.js +13 -4
- package/dist/components/oauth-button.js.map +1 -1
- package/dist/components-page/account-settings.js +14 -9
- package/dist/components-page/account-settings.js.map +1 -1
- package/dist/components-page/auth-page.d.mts +1 -0
- package/dist/components-page/auth-page.d.ts +1 -0
- package/dist/components-page/auth-page.js +5 -5
- package/dist/components-page/auth-page.js.map +1 -1
- package/dist/components-page/email-verification.js +10 -8
- package/dist/components-page/email-verification.js.map +1 -1
- package/dist/components-page/error-page.js +19 -4
- package/dist/components-page/error-page.js.map +1 -1
- package/dist/components-page/magic-link-callback.js +11 -9
- package/dist/components-page/magic-link-callback.js.map +1 -1
- package/dist/components-page/password-reset.js +13 -11
- package/dist/components-page/password-reset.js.map +1 -1
- package/dist/components-page/sign-up.d.mts +1 -0
- package/dist/components-page/sign-up.d.ts +1 -0
- package/dist/components-page/sign-up.js +10 -1
- package/dist/components-page/sign-up.js.map +1 -1
- package/dist/esm/components/credential-sign-in.js +4 -2
- package/dist/esm/components/credential-sign-in.js.map +1 -1
- package/dist/esm/components/credential-sign-up.js +24 -18
- package/dist/esm/components/credential-sign-up.js.map +1 -1
- package/dist/esm/components/elements/sidebar-layout.js +5 -5
- package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
- package/dist/esm/components/magic-link-sign-in.js +84 -32
- package/dist/esm/components/magic-link-sign-in.js.map +1 -1
- package/dist/esm/components/message-cards/predefined-message-card.js +22 -20
- package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -1
- package/dist/esm/components/oauth-button.js +13 -4
- package/dist/esm/components/oauth-button.js.map +1 -1
- package/dist/esm/components-page/account-settings.js +14 -9
- package/dist/esm/components-page/account-settings.js.map +1 -1
- package/dist/esm/components-page/auth-page.js +5 -5
- package/dist/esm/components-page/auth-page.js.map +1 -1
- package/dist/esm/components-page/email-verification.js +10 -8
- package/dist/esm/components-page/email-verification.js.map +1 -1
- package/dist/esm/components-page/error-page.js +19 -4
- package/dist/esm/components-page/error-page.js.map +1 -1
- package/dist/esm/components-page/magic-link-callback.js +11 -9
- package/dist/esm/components-page/magic-link-callback.js.map +1 -1
- package/dist/esm/components-page/password-reset.js +13 -11
- package/dist/esm/components-page/password-reset.js.map +1 -1
- package/dist/esm/components-page/sign-up.js +10 -1
- package/dist/esm/components-page/sign-up.js.map +1 -1
- package/dist/esm/generated/global-css.js +1 -1
- package/dist/esm/generated/global-css.js.map +1 -1
- package/dist/esm/generated/quetzal-translations.js +1748 -1544
- package/dist/esm/generated/quetzal-translations.js.map +1 -1
- package/dist/esm/lib/auth.js +4 -3
- package/dist/esm/lib/auth.js.map +1 -1
- package/dist/esm/lib/stack-app.js +47 -45
- package/dist/esm/lib/stack-app.js.map +1 -1
- package/dist/esm/lib/translations.js +6 -2
- package/dist/esm/lib/translations.js.map +1 -1
- package/dist/esm/utils/browser-script.js +0 -1
- package/dist/esm/utils/browser-script.js.map +1 -1
- package/dist/generated/global-css.d.mts +1 -1
- package/dist/generated/global-css.d.ts +1 -1
- package/dist/generated/global-css.js +1 -1
- package/dist/generated/global-css.js.map +1 -1
- package/dist/generated/quetzal-translations.d.mts +2 -2
- package/dist/generated/quetzal-translations.d.ts +2 -2
- package/dist/generated/quetzal-translations.js +1748 -1544
- package/dist/generated/quetzal-translations.js.map +1 -1
- package/dist/lib/auth.d.mts +16 -6
- package/dist/lib/auth.d.ts +16 -6
- package/dist/lib/auth.js +4 -3
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/stack-app.d.mts +17 -11
- package/dist/lib/stack-app.d.ts +17 -11
- package/dist/lib/stack-app.js +46 -44
- package/dist/lib/stack-app.js.map +1 -1
- package/dist/lib/translations.d.mts +1 -1
- package/dist/lib/translations.d.ts +1 -1
- package/dist/lib/translations.js +6 -2
- package/dist/lib/translations.js.map +1 -1
- package/dist/utils/browser-script.js +0 -1
- package/dist/utils/browser-script.js.map +1 -1
- package/package.json +5 -5
package/dist/lib/auth.d.mts
CHANGED
|
@@ -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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
} |
|
|
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.d.ts
CHANGED
|
@@ -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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
} |
|
|
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
|
|
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;
|
package/dist/lib/auth.js.map
CHANGED
|
@@ -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
|
|
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":[]}
|
package/dist/lib/stack-app.d.mts
CHANGED
|
@@ -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
|
-
|
|
506
|
-
|
|
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"]
|
|
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"]
|
|
566
|
+
}): Promise<Result<undefined, KnownErrors["UserEmailAlreadyExists"] | KnownErrors["PasswordRequirementsNotMet"]>>;
|
|
563
567
|
callOAuthCallback(): Promise<boolean>;
|
|
564
|
-
sendForgotPasswordEmail(email: string): Promise<KnownErrors["UserNotFound"]
|
|
565
|
-
sendMagicLinkEmail(email: string): Promise<
|
|
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"]
|
|
570
|
-
verifyPasswordResetCode(code: string): Promise<KnownErrors["VerificationCodeError"]
|
|
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"]
|
|
577
|
-
signInWithMagicLink(code: string): Promise<KnownErrors["VerificationCodeError"] | KnownErrors["InvalidTotpCode"]
|
|
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';
|
package/dist/lib/stack-app.d.ts
CHANGED
|
@@ -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
|
-
|
|
506
|
-
|
|
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"]
|
|
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"]
|
|
566
|
+
}): Promise<Result<undefined, KnownErrors["UserEmailAlreadyExists"] | KnownErrors["PasswordRequirementsNotMet"]>>;
|
|
563
567
|
callOAuthCallback(): Promise<boolean>;
|
|
564
|
-
sendForgotPasswordEmail(email: string): Promise<KnownErrors["UserNotFound"]
|
|
565
|
-
sendMagicLinkEmail(email: string): Promise<
|
|
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"]
|
|
570
|
-
verifyPasswordResetCode(code: string): Promise<KnownErrors["VerificationCodeError"]
|
|
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"]
|
|
577
|
-
signInWithMagicLink(code: string): Promise<KnownErrors["VerificationCodeError"] | KnownErrors["InvalidTotpCode"]
|
|
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';
|
package/dist/lib/stack-app.js
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
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
|
-
|
|
894
|
-
return error;
|
|
894
|
+
return await this._interface.sendMagicLinkEmail(email, magicLinkRedirectUrl);
|
|
895
895
|
}
|
|
896
896
|
async resetPassword(options) {
|
|
897
|
-
|
|
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
|
-
|
|
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 (
|
|
1047
|
-
await this._signInToAccountWithTokens(result);
|
|
1040
|
+
if (result.status === "ok") {
|
|
1041
|
+
await this._signInToAccountWithTokens(result.data);
|
|
1048
1042
|
if (!options.noRedirect) {
|
|
1049
|
-
|
|
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 (
|
|
1067
|
-
await this._signInToAccountWithTokens(result);
|
|
1060
|
+
if (result.status === "ok") {
|
|
1061
|
+
await this._signInToAccountWithTokens(result.data);
|
|
1068
1062
|
if (!options.noRedirect) {
|
|
1069
|
-
|
|
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
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
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
|
|
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) {
|