@stackframe/stack 2.6.27 → 2.6.29
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 +20 -0
- package/dist/components/message-cards/known-error-message-card.js +2 -2
- package/dist/components/message-cards/known-error-message-card.js.map +1 -1
- package/dist/components/message-cards/predefined-message-card.js +5 -5
- package/dist/components/message-cards/predefined-message-card.js.map +1 -1
- package/dist/components-page/account-settings.js +56 -36
- package/dist/components-page/account-settings.js.map +1 -1
- package/dist/components-page/email-verification.js +3 -3
- package/dist/components-page/email-verification.js.map +1 -1
- package/dist/components-page/error-page.js +6 -6
- package/dist/components-page/error-page.js.map +1 -1
- package/dist/components-page/magic-link-callback.js +4 -4
- package/dist/components-page/magic-link-callback.js.map +1 -1
- package/dist/components-page/team-invitation.js +2 -2
- package/dist/components-page/team-invitation.js.map +1 -1
- package/dist/esm/components/message-cards/known-error-message-card.js +2 -2
- package/dist/esm/components/message-cards/known-error-message-card.js.map +1 -1
- package/dist/esm/components/message-cards/predefined-message-card.js +5 -5
- package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -1
- package/dist/esm/components-page/account-settings.js +58 -38
- package/dist/esm/components-page/account-settings.js.map +1 -1
- package/dist/esm/components-page/email-verification.js +3 -3
- package/dist/esm/components-page/email-verification.js.map +1 -1
- package/dist/esm/components-page/error-page.js +6 -6
- package/dist/esm/components-page/error-page.js.map +1 -1
- package/dist/esm/components-page/magic-link-callback.js +4 -4
- package/dist/esm/components-page/magic-link-callback.js.map +1 -1
- package/dist/esm/components-page/team-invitation.js +2 -2
- package/dist/esm/components-page/team-invitation.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 +1233 -1221
- package/dist/esm/generated/quetzal-translations.js.map +1 -1
- package/dist/esm/lib/auth.js +2 -2
- package/dist/esm/lib/auth.js.map +1 -1
- package/dist/esm/lib/stack-app.js +50 -1
- package/dist/esm/lib/stack-app.js.map +1 -1
- package/dist/esm/providers/theme-provider.js +1 -0
- package/dist/esm/providers/theme-provider.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 +1233 -1221
- package/dist/generated/quetzal-translations.js.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/lib/auth.js +1 -1
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/stack-app.d.mts +9 -1
- package/dist/lib/stack-app.d.ts +9 -1
- package/dist/lib/stack-app.js +50 -1
- package/dist/lib/stack-app.js.map +1 -1
- package/dist/providers/theme-provider.js +1 -0
- package/dist/providers/theme-provider.js.map +1 -1
- package/package.json +4 -4
package/dist/esm/lib/auth.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/lib/auth.ts
|
|
2
2
|
import { KnownError } from "@stackframe/stack-shared";
|
|
3
|
-
import { StackAssertionError,
|
|
3
|
+
import { StackAssertionError, throwErr } from "@stackframe/stack-shared/dist/utils/errors";
|
|
4
4
|
import { neverResolve } from "@stackframe/stack-shared/dist/utils/promises";
|
|
5
5
|
import { Result } from "@stackframe/stack-shared/dist/utils/results";
|
|
6
6
|
import { deindent } from "@stackframe/stack-shared/dist/utils/strings";
|
|
@@ -41,7 +41,7 @@ function consumeOAuthCallbackQueryParams() {
|
|
|
41
41
|
const originalUrl = new URL(window.location.href);
|
|
42
42
|
for (const param of requiredParams) {
|
|
43
43
|
if (!originalUrl.searchParams.has(param)) {
|
|
44
|
-
|
|
44
|
+
console.warn(new Error(`Missing required query parameter on OAuth callback: ${param}. Maybe you opened or reloaded the oauth-callback page from your history?`));
|
|
45
45
|
return null;
|
|
46
46
|
}
|
|
47
47
|
}
|
package/dist/esm/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,
|
|
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, 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 console.warn(new Error(`Missing required query parameter on OAuth callback: ${param}. Maybe you opened or reloaded the oauth-callback page from your history?`));\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 console.warn(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 - The user opened the OAuth callback page from their history.\n\n Either way, it is probably safe to ignore this warning unless you are debugging an OAuth issue.\n `);\n return null;\n }\n\n\n const newUrl = new URL(originalUrl);\n for (const param of requiredParams) {\n newUrl.searchParams.delete(param);\n }\n\n // let's get rid of the authorization code in the history as we\n // don't redirect to `redirectUrl` if there's a validation error\n // (as the redirectUrl might be malicious!).\n //\n // We use history.replaceState instead of location.assign(...) to\n // prevent an unnecessary reload\n window.history.replaceState({}, \"\", newUrl.toString());\n\n return {\n originalUrl,\n codeVerifier: cookieResult.codeVerifier,\n state: expectedState,\n };\n}\n\nexport async function callOAuthCallback(\n iface: StackClientInterface,\n redirectUrl: string,\n) {\n // note: this part of the function (until the return) needs\n // to be synchronous, to prevent race conditions when\n // callOAuthCallback is called multiple times in parallel\n const consumed = consumeOAuthCallbackQueryParams();\n if (!consumed) return Result.ok(undefined);\n\n // the rest can be asynchronous (we now know that we are the\n // intended recipient of the callback, and the only instance\n // of callOAuthCallback that's running)\n try {\n return Result.ok(await iface.callOAuthCallback({\n oauthParams: consumed.originalUrl.searchParams,\n redirectUri: constructRedirectUrl(redirectUrl),\n codeVerifier: consumed.codeVerifier,\n state: consumed.state,\n }));\n } catch (e) {\n if (e instanceof KnownError) {\n throw e;\n }\n throw new StackAssertionError(\"Error signing in during OAuth callback. Please try again.\", { cause: e });\n }\n}\n"],"mappings":";AAAA,SAAS,kBAAwC;AAEjD,SAAS,qBAAqB,gBAAgB;AAC9C,SAAS,oBAAoB;AAC7B,SAAS,cAAc;AACvB,SAAS,gBAAgB;AACzB,SAAS,4BAA4B;AACrC,SAAS,+BAA+B,4BAA4B;AAEpE,eAAsB,gBACpB,OACA,SAMA;AACA,QAAM,EAAE,eAAe,MAAM,IAAI,MAAM,qBAAqB;AAC5D,QAAM,WAAW,MAAM,MAAM,YAAY;AAAA,IACvC,UAAU,QAAQ;AAAA,IAClB,aAAa,qBAAqB,QAAQ,WAAW;AAAA,IACrD,kBAAkB,qBAAqB,QAAQ,gBAAgB;AAAA,IAC/D;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,eAAe,QAAQ;AAAA,EACzB,CAAC;AACD,SAAO,SAAS,OAAO,QAAQ;AAC/B,QAAM,aAAa;AACrB;AAEA,eAAsB,2BACpB,OACA,SAMA,SACA;AACA,QAAM,EAAE,eAAe,MAAM,IAAI,MAAM,qBAAqB;AAC5D,QAAM,WAAW,MAAM,MAAM,YAAY;AAAA,IACvC,UAAU,QAAQ;AAAA,IAClB,aAAa,qBAAqB,QAAQ,WAAW;AAAA,IACrD,kBAAkB,qBAAqB,QAAQ,gBAAgB;AAAA,IAC/D,0BAA0B,qBAAqB,OAAO,SAAS,IAAI;AAAA,IACnE;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,eAAe,QAAQ;AAAA,EACzB,CAAC;AACD,SAAO,SAAS,OAAO,QAAQ;AAC/B,QAAM,aAAa;AACrB;AAOA,SAAS,kCAAkC;AACzC,QAAM,iBAAiB,CAAC,QAAQ,OAAO;AACvC,QAAM,cAAc,IAAI,IAAI,OAAO,SAAS,IAAI;AAChD,aAAW,SAAS,gBAAgB;AAClC,QAAI,CAAC,YAAY,aAAa,IAAI,KAAK,GAAG;AACxC,cAAQ,KAAK,IAAI,MAAM,uDAAuD,KAAK,2EAA2E,CAAC;AAC/J,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,gBAAgB,YAAY,aAAa,IAAI,OAAO,KAAK,SAAS,uDAAuD;AAC/H,QAAM,eAAe,8BAA8B,aAAa;AAEhE,MAAI,CAAC,cAAc;AAGjB,YAAQ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWZ;AACD,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,IAAI,IAAI,WAAW;AAClC,aAAW,SAAS,gBAAgB;AAClC,WAAO,aAAa,OAAO,KAAK;AAAA,EAClC;AAQA,SAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,OAAO,SAAS,CAAC;AAErD,SAAO;AAAA,IACL;AAAA,IACA,cAAc,aAAa;AAAA,IAC3B,OAAO;AAAA,EACT;AACF;AAEA,eAAsB,kBACpB,OACA,aACA;AAIA,QAAM,WAAW,gCAAgC;AACjD,MAAI,CAAC,SAAU,QAAO,OAAO,GAAG,MAAS;AAKzC,MAAI;AACF,WAAO,OAAO,GAAG,MAAM,MAAM,kBAAkB;AAAA,MAC7C,aAAa,SAAS,YAAY;AAAA,MAClC,aAAa,qBAAqB,WAAW;AAAA,MAC7C,cAAc,SAAS;AAAA,MACvB,OAAO,SAAS;AAAA,IAClB,CAAC,CAAC;AAAA,EACJ,SAAS,GAAG;AACV,QAAI,aAAa,YAAY;AAC3B,YAAM;AAAA,IACR;AACA,UAAM,IAAI,oBAAoB,6DAA6D,EAAE,OAAO,EAAE,CAAC;AAAA,EACzG;AACF;","names":[]}
|
|
@@ -25,7 +25,7 @@ import { constructRedirectUrl } from "../utils/url";
|
|
|
25
25
|
import { addNewOAuthProviderOrScope, callOAuthCallback, signInWithOAuth } from "./auth";
|
|
26
26
|
import { createBrowserCookieHelper, createCookieHelper, deleteCookieClient, getCookieClient, setOrDeleteCookie, setOrDeleteCookieClient } from "./cookie";
|
|
27
27
|
var NextNavigation = scrambleDuringCompileTime(NextNavigationUnscrambled);
|
|
28
|
-
var clientVersion = "js @stackframe/stack@2.6.
|
|
28
|
+
var clientVersion = "js @stackframe/stack@2.6.29";
|
|
29
29
|
function getUrls(partial) {
|
|
30
30
|
const handler = partial.handler ?? "/handler";
|
|
31
31
|
const home = partial.home ?? "/";
|
|
@@ -191,6 +191,11 @@ var _StackClientAppImpl = class __StackClientAppImpl {
|
|
|
191
191
|
return await this._interface.listTeamMemberProfiles({ teamId }, session);
|
|
192
192
|
}
|
|
193
193
|
);
|
|
194
|
+
this._teamInvitationsCache = createCacheBySession(
|
|
195
|
+
async (session, [teamId]) => {
|
|
196
|
+
return await this._interface.listTeamInvitations({ teamId }, session);
|
|
197
|
+
}
|
|
198
|
+
);
|
|
194
199
|
this._currentUserTeamProfileCache = createCacheBySession(
|
|
195
200
|
async (session, [teamId]) => {
|
|
196
201
|
return await this._interface.getTeamMemberProfile({ teamId, userId: "me" }, session);
|
|
@@ -542,6 +547,17 @@ var _StackClientAppImpl = class __StackClientAppImpl {
|
|
|
542
547
|
}
|
|
543
548
|
};
|
|
544
549
|
}
|
|
550
|
+
_clientTeamInvitationFromCrud(session, crud) {
|
|
551
|
+
return {
|
|
552
|
+
id: crud.id,
|
|
553
|
+
recipientEmail: crud.recipient_email,
|
|
554
|
+
expiresAt: new Date(crud.expires_at_millis),
|
|
555
|
+
revoke: async () => {
|
|
556
|
+
await this._interface.revokeTeamInvitation(crud.id, crud.team_id, session);
|
|
557
|
+
await this._teamInvitationsCache.refresh([session, crud.team_id]);
|
|
558
|
+
}
|
|
559
|
+
};
|
|
560
|
+
}
|
|
545
561
|
_clientTeamFromCrud(crud, session) {
|
|
546
562
|
const app = this;
|
|
547
563
|
return {
|
|
@@ -560,6 +576,7 @@ var _StackClientAppImpl = class __StackClientAppImpl {
|
|
|
560
576
|
session,
|
|
561
577
|
callbackUrl: options.callbackUrl ?? constructRedirectUrl(app.urls.teamInvitation)
|
|
562
578
|
});
|
|
579
|
+
await app._teamInvitationsCache.refresh([session, crud.id]);
|
|
563
580
|
},
|
|
564
581
|
async listUsers() {
|
|
565
582
|
const result = Result.orThrow(await app._teamMemberProfilesCache.getOrWait([session, crud.id], "write-only"));
|
|
@@ -569,6 +586,14 @@ var _StackClientAppImpl = class __StackClientAppImpl {
|
|
|
569
586
|
const result = useAsyncCache(app._teamMemberProfilesCache, [session, crud.id], "team.useUsers()");
|
|
570
587
|
return result.map((crud2) => app._clientTeamUserFromCrud(crud2));
|
|
571
588
|
},
|
|
589
|
+
async listInvitations() {
|
|
590
|
+
const result = Result.orThrow(await app._teamInvitationsCache.getOrWait([session, crud.id], "write-only"));
|
|
591
|
+
return result.map((crud2) => app._clientTeamInvitationFromCrud(session, crud2));
|
|
592
|
+
},
|
|
593
|
+
useInvitations() {
|
|
594
|
+
const result = useAsyncCache(app._teamInvitationsCache, [session, crud.id], "team.useInvitations()");
|
|
595
|
+
return result.map((crud2) => app._clientTeamInvitationFromCrud(session, crud2));
|
|
596
|
+
},
|
|
572
597
|
async update(data) {
|
|
573
598
|
await app._interface.updateTeam({ data: teamUpdateOptionsToCrud(data), teamId: crud.id }, session);
|
|
574
599
|
await app._currentUserTeamsCache.refresh([session]);
|
|
@@ -1385,6 +1410,11 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
|
|
|
1385
1410
|
return await this._interface.listServerTeamMemberProfiles({ teamId });
|
|
1386
1411
|
}
|
|
1387
1412
|
);
|
|
1413
|
+
this._serverTeamInvitationsCache = createCache(
|
|
1414
|
+
async ([teamId]) => {
|
|
1415
|
+
return await this._interface.listServerTeamInvitations({ teamId });
|
|
1416
|
+
}
|
|
1417
|
+
);
|
|
1388
1418
|
this._serverUserTeamProfileCache = createCache(
|
|
1389
1419
|
async ([teamId, userId]) => {
|
|
1390
1420
|
return await this._interface.getServerTeamMemberProfile({ teamId, userId });
|
|
@@ -1597,6 +1627,16 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
|
|
|
1597
1627
|
}
|
|
1598
1628
|
};
|
|
1599
1629
|
}
|
|
1630
|
+
_serverTeamInvitationFromCrud(crud) {
|
|
1631
|
+
return {
|
|
1632
|
+
id: crud.id,
|
|
1633
|
+
recipientEmail: crud.recipient_email,
|
|
1634
|
+
expiresAt: new Date(crud.expires_at_millis),
|
|
1635
|
+
revoke: async () => {
|
|
1636
|
+
await this._interface.revokeServerTeamInvitation(crud.id, crud.team_id);
|
|
1637
|
+
}
|
|
1638
|
+
};
|
|
1639
|
+
}
|
|
1600
1640
|
_currentUserFromCrud(crud, session) {
|
|
1601
1641
|
const app = this;
|
|
1602
1642
|
const currentUser = {
|
|
@@ -1656,6 +1696,15 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
|
|
|
1656
1696
|
email: options.email,
|
|
1657
1697
|
callbackUrl: options.callbackUrl ?? constructRedirectUrl(app.urls.teamInvitation)
|
|
1658
1698
|
});
|
|
1699
|
+
await app._serverTeamInvitationsCache.refresh([crud.id]);
|
|
1700
|
+
},
|
|
1701
|
+
async listInvitations() {
|
|
1702
|
+
const result = Result.orThrow(await app._serverTeamInvitationsCache.getOrWait([crud.id], "write-only"));
|
|
1703
|
+
return result.map((crud2) => app._serverTeamInvitationFromCrud(crud2));
|
|
1704
|
+
},
|
|
1705
|
+
useInvitations() {
|
|
1706
|
+
const result = useAsyncCache(app._serverTeamInvitationsCache, [crud.id], "team.useInvitations()");
|
|
1707
|
+
return useMemo(() => result.map((crud2) => app._serverTeamInvitationFromCrud(crud2)), [result]);
|
|
1659
1708
|
}
|
|
1660
1709
|
};
|
|
1661
1710
|
}
|