@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.
- package/CHANGELOG.md +33 -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 +19 -11
- package/dist/components/elements/sidebar-layout.js.map +1 -1
- package/dist/components/elements/user-avatar.js +1 -1
- package/dist/components/elements/user-avatar.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 +32 -25
- package/dist/components/oauth-button.js.map +1 -1
- package/dist/components/profile-image-editor.js +2 -2
- package/dist/components/profile-image-editor.js.map +1 -1
- package/dist/components/selected-team-switcher.js +1 -1
- package/dist/components/selected-team-switcher.js.map +1 -1
- package/dist/components-page/account-settings.d.mts +4 -2
- package/dist/components-page/account-settings.d.ts +4 -2
- package/dist/components-page/account-settings.js +365 -188
- 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/oauth-callback.js +1 -1
- package/dist/components-page/oauth-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/components-page/stack-handler.d.mts +1 -0
- package/dist/components-page/stack-handler.d.ts +1 -0
- 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 +19 -11
- package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
- package/dist/esm/components/elements/user-avatar.js +1 -1
- package/dist/esm/components/elements/user-avatar.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 +32 -25
- package/dist/esm/components/oauth-button.js.map +1 -1
- package/dist/esm/components/profile-image-editor.js +2 -2
- package/dist/esm/components/profile-image-editor.js.map +1 -1
- package/dist/esm/components/selected-team-switcher.js +1 -1
- package/dist/esm/components/selected-team-switcher.js.map +1 -1
- package/dist/esm/components-page/account-settings.js +365 -189
- 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/oauth-callback.js +1 -1
- package/dist/esm/components-page/oauth-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 +1764 -1356
- 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 +54 -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 +9 -7
- 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 +1764 -1356
- 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 +21 -12
- package/dist/lib/stack-app.d.ts +21 -12
- package/dist/lib/stack-app.js +53 -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 +9 -7
- 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
|
@@ -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
|
-
|
|
503
|
-
|
|
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"]
|
|
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"]
|
|
566
|
+
}): Promise<Result<undefined, KnownErrors["UserEmailAlreadyExists"] | KnownErrors["PasswordRequirementsNotMet"]>>;
|
|
560
567
|
callOAuthCallback(): Promise<boolean>;
|
|
561
|
-
sendForgotPasswordEmail(email: string): Promise<KnownErrors["UserNotFound"]
|
|
562
|
-
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"]>>;
|
|
563
572
|
resetPassword(options: {
|
|
564
573
|
code: string;
|
|
565
574
|
password: string;
|
|
566
|
-
}): Promise<KnownErrors["VerificationCodeError"]
|
|
567
|
-
verifyPasswordResetCode(code: string): Promise<KnownErrors["VerificationCodeError"]
|
|
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"]
|
|
574
|
-
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"]>>;
|
|
575
584
|
redirectToOAuthCallback(): Promise<void>;
|
|
576
585
|
useUser(options: GetUserOptions<HasTokenStore> & {
|
|
577
586
|
or: 'redirect';
|
package/dist/lib/stack-app.d.ts
CHANGED
|
@@ -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
|
-
|
|
503
|
-
|
|
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"]
|
|
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"]
|
|
566
|
+
}): Promise<Result<undefined, KnownErrors["UserEmailAlreadyExists"] | KnownErrors["PasswordRequirementsNotMet"]>>;
|
|
560
567
|
callOAuthCallback(): Promise<boolean>;
|
|
561
|
-
sendForgotPasswordEmail(email: string): Promise<KnownErrors["UserNotFound"]
|
|
562
|
-
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"]>>;
|
|
563
572
|
resetPassword(options: {
|
|
564
573
|
code: string;
|
|
565
574
|
password: string;
|
|
566
|
-
}): Promise<KnownErrors["VerificationCodeError"]
|
|
567
|
-
verifyPasswordResetCode(code: string): Promise<KnownErrors["VerificationCodeError"]
|
|
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"]
|
|
574
|
-
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"]>>;
|
|
575
584
|
redirectToOAuthCallback(): Promise<void>;
|
|
576
585
|
useUser(options: GetUserOptions<HasTokenStore> & {
|
|
577
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 ?? "/";
|
|
@@ -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
|
-
|
|
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
|
-
|
|
889
|
-
return error;
|
|
894
|
+
return await this._interface.sendMagicLinkEmail(email, magicLinkRedirectUrl);
|
|
890
895
|
}
|
|
891
896
|
async resetPassword(options) {
|
|
892
|
-
|
|
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
|
-
|
|
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 (
|
|
1042
|
-
await this._signInToAccountWithTokens(result);
|
|
1040
|
+
if (result.status === "ok") {
|
|
1041
|
+
await this._signInToAccountWithTokens(result.data);
|
|
1043
1042
|
if (!options.noRedirect) {
|
|
1044
|
-
|
|
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 (
|
|
1062
|
-
await this._signInToAccountWithTokens(result);
|
|
1060
|
+
if (result.status === "ok") {
|
|
1061
|
+
await this._signInToAccountWithTokens(result.data);
|
|
1063
1062
|
if (!options.noRedirect) {
|
|
1064
|
-
|
|
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
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
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
|
|
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) {
|