@stackframe/stack 2.8.49 → 2.8.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/components-page/password-reset.js +6 -5
  3. package/dist/components-page/password-reset.js.map +1 -1
  4. package/dist/components-page/sign-out.js +2 -12
  5. package/dist/components-page/sign-out.js.map +1 -1
  6. package/dist/components-page/stack-handler-client.js +266 -0
  7. package/dist/components-page/stack-handler-client.js.map +1 -0
  8. package/dist/components-page/stack-handler.js +4 -243
  9. package/dist/components-page/stack-handler.js.map +1 -1
  10. package/dist/components-page/team-invitation.js +6 -5
  11. package/dist/components-page/team-invitation.js.map +1 -1
  12. package/dist/esm/components-page/password-reset.js +3 -2
  13. package/dist/esm/components-page/password-reset.js.map +1 -1
  14. package/dist/esm/components-page/sign-out.js +2 -2
  15. package/dist/esm/components-page/sign-out.js.map +1 -1
  16. package/dist/esm/components-page/stack-handler-client.js +242 -0
  17. package/dist/esm/components-page/stack-handler-client.js.map +1 -0
  18. package/dist/esm/components-page/stack-handler.js +5 -244
  19. package/dist/esm/components-page/stack-handler.js.map +1 -1
  20. package/dist/esm/components-page/team-invitation.js +3 -2
  21. package/dist/esm/components-page/team-invitation.js.map +1 -1
  22. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +7 -0
  23. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
  24. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js +51 -33
  25. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  26. package/dist/esm/lib/stack-app/apps/implementations/common.js +3 -3
  27. package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -1
  28. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js +39 -0
  29. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
  30. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
  31. package/dist/esm/lib/stack-app/common.js.map +1 -1
  32. package/dist/esm/lib/stack-app/users/index.js.map +1 -1
  33. package/dist/index.d.mts +119 -98
  34. package/dist/index.d.ts +119 -98
  35. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +7 -0
  36. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
  37. package/dist/lib/stack-app/apps/implementations/client-app-impl.js +51 -33
  38. package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  39. package/dist/lib/stack-app/apps/implementations/common.js +2 -2
  40. package/dist/lib/stack-app/apps/implementations/common.js.map +1 -1
  41. package/dist/lib/stack-app/apps/implementations/server-app-impl.js +49 -0
  42. package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
  43. package/dist/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
  44. package/dist/lib/stack-app/common.js.map +1 -1
  45. package/dist/lib/stack-app/users/index.js.map +1 -1
  46. package/package.json +8 -8
@@ -0,0 +1,242 @@
1
+ "use client";
2
+ "use client";
3
+
4
+ // src/components-page/stack-handler-client.tsx
5
+ import { StackAssertionError } from "@stackframe/stack-shared/dist/utils/errors";
6
+ import { filterUndefined } from "@stackframe/stack-shared/dist/utils/objects";
7
+ import { getRelativePart } from "@stackframe/stack-shared/dist/utils/urls";
8
+ import { notFound, redirect, RedirectType, usePathname, useSearchParams } from "next/navigation";
9
+ import { useMemo } from "react";
10
+ import { SignIn, SignUp } from "../index.js";
11
+ import { useStackApp } from "../lib/hooks.js";
12
+ import { AccountSettings } from "./account-settings.js";
13
+ import { CliAuthConfirmation } from "./cli-auth-confirm.js";
14
+ import { EmailVerification } from "./email-verification.js";
15
+ import { ErrorPage } from "./error-page.js";
16
+ import { ForgotPassword } from "./forgot-password.js";
17
+ import { MagicLinkCallback } from "./magic-link-callback.js";
18
+ import { MFA } from "./mfa.js";
19
+ import { OAuthCallback } from "./oauth-callback.js";
20
+ import { PasswordReset } from "./password-reset.js";
21
+ import { SignOut } from "./sign-out.js";
22
+ import { TeamInvitation } from "./team-invitation.js";
23
+ import { jsx } from "react/jsx-runtime";
24
+ var availablePaths = {
25
+ signIn: "sign-in",
26
+ signUp: "sign-up",
27
+ emailVerification: "email-verification",
28
+ passwordReset: "password-reset",
29
+ forgotPassword: "forgot-password",
30
+ signOut: "sign-out",
31
+ oauthCallback: "oauth-callback",
32
+ magicLinkCallback: "magic-link-callback",
33
+ teamInvitation: "team-invitation",
34
+ accountSettings: "account-settings",
35
+ cliAuthConfirm: "cli-auth-confirm",
36
+ mfa: "mfa",
37
+ error: "error"
38
+ };
39
+ var pathAliases = {
40
+ // also includes the uppercase and non-dashed versions
41
+ ...Object.fromEntries(Object.entries(availablePaths).map(([key, value]) => [value, value])),
42
+ "log-in": availablePaths.signIn,
43
+ "register": availablePaths.signUp
44
+ };
45
+ function renderComponent(props) {
46
+ const { path, searchParams, fullPage, componentProps, redirectIfNotHandler, onNotFound, app } = props;
47
+ switch (path) {
48
+ case availablePaths.signIn: {
49
+ redirectIfNotHandler?.("signIn");
50
+ return /* @__PURE__ */ jsx(
51
+ SignIn,
52
+ {
53
+ fullPage,
54
+ automaticRedirect: true,
55
+ ...filterUndefinedINU(componentProps?.SignIn)
56
+ }
57
+ );
58
+ }
59
+ case availablePaths.signUp: {
60
+ redirectIfNotHandler?.("signUp");
61
+ return /* @__PURE__ */ jsx(
62
+ SignUp,
63
+ {
64
+ fullPage,
65
+ automaticRedirect: true,
66
+ ...filterUndefinedINU(componentProps?.SignUp)
67
+ }
68
+ );
69
+ }
70
+ case availablePaths.emailVerification: {
71
+ redirectIfNotHandler?.("emailVerification");
72
+ return /* @__PURE__ */ jsx(
73
+ EmailVerification,
74
+ {
75
+ searchParams,
76
+ fullPage,
77
+ ...filterUndefinedINU(componentProps?.EmailVerification)
78
+ }
79
+ );
80
+ }
81
+ case availablePaths.passwordReset: {
82
+ redirectIfNotHandler?.("passwordReset");
83
+ return /* @__PURE__ */ jsx(
84
+ PasswordReset,
85
+ {
86
+ searchParams,
87
+ fullPage,
88
+ ...filterUndefinedINU(componentProps?.PasswordReset)
89
+ }
90
+ );
91
+ }
92
+ case availablePaths.forgotPassword: {
93
+ redirectIfNotHandler?.("forgotPassword");
94
+ return /* @__PURE__ */ jsx(
95
+ ForgotPassword,
96
+ {
97
+ fullPage,
98
+ ...filterUndefinedINU(componentProps?.ForgotPassword)
99
+ }
100
+ );
101
+ }
102
+ case availablePaths.signOut: {
103
+ redirectIfNotHandler?.("signOut");
104
+ return /* @__PURE__ */ jsx(
105
+ SignOut,
106
+ {
107
+ fullPage,
108
+ ...filterUndefinedINU(componentProps?.SignOut)
109
+ }
110
+ );
111
+ }
112
+ case availablePaths.oauthCallback: {
113
+ redirectIfNotHandler?.("oauthCallback");
114
+ return /* @__PURE__ */ jsx(
115
+ OAuthCallback,
116
+ {
117
+ fullPage,
118
+ ...filterUndefinedINU(componentProps?.OAuthCallback)
119
+ }
120
+ );
121
+ }
122
+ case availablePaths.magicLinkCallback: {
123
+ redirectIfNotHandler?.("magicLinkCallback");
124
+ return /* @__PURE__ */ jsx(
125
+ MagicLinkCallback,
126
+ {
127
+ searchParams,
128
+ fullPage,
129
+ ...filterUndefinedINU(componentProps?.MagicLinkCallback)
130
+ }
131
+ );
132
+ }
133
+ case availablePaths.teamInvitation: {
134
+ redirectIfNotHandler?.("teamInvitation");
135
+ return /* @__PURE__ */ jsx(
136
+ TeamInvitation,
137
+ {
138
+ searchParams,
139
+ fullPage,
140
+ ...filterUndefinedINU(componentProps?.TeamInvitation)
141
+ }
142
+ );
143
+ }
144
+ case availablePaths.accountSettings: {
145
+ return /* @__PURE__ */ jsx(
146
+ AccountSettings,
147
+ {
148
+ fullPage,
149
+ ...filterUndefinedINU(componentProps?.AccountSettings)
150
+ }
151
+ );
152
+ }
153
+ case availablePaths.error: {
154
+ return /* @__PURE__ */ jsx(
155
+ ErrorPage,
156
+ {
157
+ searchParams,
158
+ fullPage,
159
+ ...filterUndefinedINU(componentProps?.ErrorPage)
160
+ }
161
+ );
162
+ }
163
+ case availablePaths.cliAuthConfirm: {
164
+ return /* @__PURE__ */ jsx(
165
+ CliAuthConfirmation,
166
+ {
167
+ fullPage,
168
+ ...filterUndefinedINU(componentProps?.CliAuthConfirmation)
169
+ }
170
+ );
171
+ }
172
+ case availablePaths.mfa: {
173
+ redirectIfNotHandler?.("mfa");
174
+ return /* @__PURE__ */ jsx(
175
+ MFA,
176
+ {
177
+ fullPage,
178
+ ...filterUndefinedINU(componentProps?.MFA)
179
+ }
180
+ );
181
+ }
182
+ default: {
183
+ if (Object.values(availablePaths).includes(path)) {
184
+ throw new StackAssertionError(`Path alias ${path} not included in switch statement, but in availablePaths?`, { availablePaths });
185
+ }
186
+ for (const [key, value] of Object.entries(pathAliases)) {
187
+ if (path.toLowerCase().replaceAll("-", "") === key.toLowerCase().replaceAll("-", "")) {
188
+ const redirectUrl = `${app.urls.handler}/${value}?${new URLSearchParams(searchParams).toString()}`;
189
+ return { redirect: redirectUrl };
190
+ }
191
+ }
192
+ return onNotFound();
193
+ }
194
+ }
195
+ }
196
+ function StackHandlerClient(props) {
197
+ const stackApp = useStackApp();
198
+ const pathname = usePathname();
199
+ const searchParamsFromHook = useSearchParams();
200
+ const currentLocation = pathname;
201
+ const searchParamsSource = searchParamsFromHook;
202
+ const { path, searchParams } = useMemo(() => {
203
+ const handlerPath = new URL(stackApp.urls.handler, "http://example.com").pathname;
204
+ const relativePath = currentLocation.startsWith(handlerPath) ? currentLocation.slice(handlerPath.length).replace(/^\/+/, "") : currentLocation.replace(/^\/+/, "");
205
+ return {
206
+ path: relativePath,
207
+ searchParams: Object.fromEntries(searchParamsSource.entries())
208
+ };
209
+ }, [currentLocation, searchParamsSource, stackApp.urls.handler]);
210
+ const redirectIfNotHandler = (name) => {
211
+ const url = stackApp.urls[name];
212
+ const handlerUrl = stackApp.urls.handler;
213
+ if (url !== handlerUrl && url.startsWith(handlerUrl + "/")) {
214
+ return;
215
+ }
216
+ const urlObj = new URL(url, "http://example.com");
217
+ for (const [key, value] of Object.entries(searchParams)) {
218
+ urlObj.searchParams.set(key, value);
219
+ }
220
+ redirect(getRelativePart(urlObj), RedirectType.replace);
221
+ };
222
+ const result = renderComponent({
223
+ path,
224
+ searchParams,
225
+ fullPage: props.fullPage,
226
+ componentProps: props.componentProps,
227
+ redirectIfNotHandler,
228
+ onNotFound: () => notFound(),
229
+ app: stackApp
230
+ });
231
+ if (result && "redirect" in result) {
232
+ redirect(result.redirect, RedirectType.replace);
233
+ }
234
+ return result;
235
+ }
236
+ function filterUndefinedINU(value) {
237
+ return value === void 0 ? value : filterUndefined(value);
238
+ }
239
+ export {
240
+ StackHandlerClient
241
+ };
242
+ //# sourceMappingURL=stack-handler-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components-page/stack-handler-client.tsx"],"sourcesContent":["\"use client\";\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\nimport { StackAssertionError } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { FilterUndefined, filterUndefined } from \"@stackframe/stack-shared/dist/utils/objects\";\nimport { getRelativePart } from \"@stackframe/stack-shared/dist/utils/urls\";\nimport { notFound, redirect, RedirectType, usePathname, useSearchParams } from 'next/navigation'; // THIS_LINE_PLATFORM next\nimport { useMemo } from 'react';\nimport { SignIn, SignUp, StackServerApp } from \"..\";\nimport { useStackApp } from \"../lib/hooks\";\nimport { HandlerUrls, StackClientApp } from \"../lib/stack-app\";\nimport { AccountSettings } from \"./account-settings\";\nimport { CliAuthConfirmation } from \"./cli-auth-confirm\";\nimport { EmailVerification } from \"./email-verification\";\nimport { ErrorPage } from \"./error-page\";\nimport { ForgotPassword } from \"./forgot-password\";\nimport { MagicLinkCallback } from \"./magic-link-callback\";\nimport { MFA } from \"./mfa\";\nimport { OAuthCallback } from \"./oauth-callback\";\nimport { PasswordReset } from \"./password-reset\";\nimport { SignOut } from \"./sign-out\";\nimport { TeamInvitation } from \"./team-invitation\";\n\n\ntype Components = {\n SignIn: typeof SignIn,\n SignUp: typeof SignUp,\n EmailVerification: typeof EmailVerification,\n PasswordReset: typeof PasswordReset,\n ForgotPassword: typeof ForgotPassword,\n SignOut: typeof SignOut,\n OAuthCallback: typeof OAuthCallback,\n MagicLinkCallback: typeof MagicLinkCallback,\n TeamInvitation: typeof TeamInvitation,\n ErrorPage: typeof ErrorPage,\n AccountSettings: typeof AccountSettings,\n CliAuthConfirmation: typeof CliAuthConfirmation,\n MFA: typeof MFA,\n};\n\ntype RouteProps = {\n params: Promise<{ stack?: string[] }> | { stack?: string[] },\n searchParams: Promise<Record<string, string>> | Record<string, string>,\n};\n\nconst availablePaths = {\n signIn: 'sign-in',\n signUp: 'sign-up',\n emailVerification: 'email-verification',\n passwordReset: 'password-reset',\n forgotPassword: 'forgot-password',\n signOut: 'sign-out',\n oauthCallback: 'oauth-callback',\n magicLinkCallback: 'magic-link-callback',\n teamInvitation: 'team-invitation',\n accountSettings: 'account-settings',\n cliAuthConfirm: 'cli-auth-confirm',\n mfa: 'mfa',\n error: 'error',\n} as const;\n\nconst pathAliases = {\n // also includes the uppercase and non-dashed versions\n ...Object.fromEntries(Object.entries(availablePaths).map(([key, value]) => [value, value])),\n \"log-in\": availablePaths.signIn,\n \"register\": availablePaths.signUp,\n} as const;\n\nexport type BaseHandlerProps = {\n fullPage: boolean,\n componentProps?: {\n [K in keyof Components]?: Parameters<Components[K]>[0];\n },\n};\n\nfunction renderComponent(props: {\n path: string,\n searchParams: Record<string, string>,\n fullPage: boolean,\n componentProps?: BaseHandlerProps['componentProps'],\n redirectIfNotHandler?: (name: keyof HandlerUrls) => void,\n onNotFound: () => any,\n app: StackClientApp<any> | StackServerApp<any>,\n}) {\n const { path, searchParams, fullPage, componentProps, redirectIfNotHandler, onNotFound, app } = props;\n\n switch (path) {\n case availablePaths.signIn: {\n redirectIfNotHandler?.('signIn');\n return <SignIn\n fullPage={fullPage}\n automaticRedirect\n {...filterUndefinedINU(componentProps?.SignIn)}\n />;\n }\n case availablePaths.signUp: {\n redirectIfNotHandler?.('signUp');\n return <SignUp\n fullPage={fullPage}\n automaticRedirect\n {...filterUndefinedINU(componentProps?.SignUp)}\n />;\n }\n case availablePaths.emailVerification: {\n redirectIfNotHandler?.('emailVerification');\n return <EmailVerification\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.EmailVerification)}\n />;\n }\n case availablePaths.passwordReset: {\n redirectIfNotHandler?.('passwordReset');\n return <PasswordReset\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.PasswordReset)}\n />;\n }\n case availablePaths.forgotPassword: {\n redirectIfNotHandler?.('forgotPassword');\n return <ForgotPassword\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.ForgotPassword)}\n />;\n }\n case availablePaths.signOut: {\n redirectIfNotHandler?.('signOut');\n return <SignOut\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.SignOut)}\n />;\n }\n case availablePaths.oauthCallback: {\n redirectIfNotHandler?.('oauthCallback');\n return <OAuthCallback\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.OAuthCallback)}\n />;\n }\n case availablePaths.magicLinkCallback: {\n redirectIfNotHandler?.('magicLinkCallback');\n return <MagicLinkCallback\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.MagicLinkCallback)}\n />;\n }\n case availablePaths.teamInvitation: {\n redirectIfNotHandler?.('teamInvitation');\n return <TeamInvitation\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.TeamInvitation)}\n />;\n }\n case availablePaths.accountSettings: {\n return <AccountSettings\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.AccountSettings)}\n />;\n }\n case availablePaths.error: {\n return <ErrorPage\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.ErrorPage)}\n />;\n }\n case availablePaths.cliAuthConfirm: {\n return <CliAuthConfirmation\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.CliAuthConfirmation)}\n />;\n }\n case availablePaths.mfa: {\n redirectIfNotHandler?.('mfa');\n return <MFA\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.MFA)}\n />;\n }\n default: {\n if (Object.values(availablePaths).includes(path as any)) {\n throw new StackAssertionError(`Path alias ${path} not included in switch statement, but in availablePaths?`, { availablePaths });\n }\n for (const [key, value] of Object.entries(pathAliases)) {\n if (path.toLowerCase().replaceAll('-', '') === key.toLowerCase().replaceAll('-', '')) {\n const redirectUrl = `${app.urls.handler}/${value}?${new URLSearchParams(searchParams).toString()}`;\n return { redirect: redirectUrl };\n }\n }\n return onNotFound();\n }\n }\n}\n\nexport function StackHandlerClient(props: BaseHandlerProps & Partial<RouteProps> & { location?: string }) {\n // Use hooks to get app\n const stackApp = useStackApp();\n\n const pathname = usePathname();\n const searchParamsFromHook = useSearchParams();\n const currentLocation = pathname;\n const searchParamsSource = searchParamsFromHook;\n\n const { path, searchParams } = useMemo(() => {\n const handlerPath = new URL(stackApp.urls.handler, 'http://example.com').pathname;\n const relativePath = currentLocation.startsWith(handlerPath)\n ? currentLocation.slice(handlerPath.length).replace(/^\\/+/, '')\n : currentLocation.replace(/^\\/+/, '');\n\n return {\n path: relativePath,\n searchParams: Object.fromEntries(searchParamsSource.entries())\n };\n }, [currentLocation, searchParamsSource, stackApp.urls.handler]);\n\n const redirectIfNotHandler = (name: keyof HandlerUrls) => {\n const url = stackApp.urls[name];\n const handlerUrl = stackApp.urls.handler;\n\n if (url !== handlerUrl && url.startsWith(handlerUrl + \"/\")) {\n return;\n }\n\n const urlObj = new URL(url, 'http://example.com');\n for (const [key, value] of Object.entries(searchParams)) {\n urlObj.searchParams.set(key, value);\n }\n\n redirect(getRelativePart(urlObj), RedirectType.replace);\n };\n\n const result = renderComponent({\n path,\n searchParams,\n fullPage: props.fullPage,\n componentProps: props.componentProps,\n redirectIfNotHandler,\n onNotFound: () =>\n notFound()\n ,\n app: stackApp,\n });\n\n if (result && 'redirect' in result) {\n redirect(result.redirect, RedirectType.replace);\n }\n\n return result;\n}\n\n// filter undefined values in object. if object itself is undefined, return undefined\nfunction filterUndefinedINU<T extends {}>(value: T | undefined): FilterUndefined<T> | undefined {\n return value === undefined ? value : filterUndefined(value);\n}\n"],"mappings":"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","names":[]}
@@ -1,249 +1,10 @@
1
1
  // src/components-page/stack-handler.tsx
2
- import { StackAssertionError } from "@stackframe/stack-shared/dist/utils/errors";
3
- import { filterUndefined, pick } from "@stackframe/stack-shared/dist/utils/objects";
4
- import { getRelativePart } from "@stackframe/stack-shared/dist/utils/urls";
5
- import { RedirectType, notFound, redirect } from "next/navigation";
6
- import { SignIn, SignUp } from "../index.js";
7
- import { MessageCard } from "../components/message-cards/message-card.js";
8
- import { AccountSettings } from "./account-settings.js";
9
- import { CliAuthConfirmation } from "./cli-auth-confirm.js";
10
- import { EmailVerification } from "./email-verification.js";
11
- import { ErrorPage } from "./error-page.js";
12
- import { ForgotPassword } from "./forgot-password.js";
13
- import { MagicLinkCallback } from "./magic-link-callback.js";
14
- import { OAuthCallback } from "./oauth-callback.js";
15
- import { MFA } from "./mfa.js";
16
- import { PasswordReset } from "./password-reset.js";
17
- import { SignOut } from "./sign-out.js";
18
- import { TeamInvitation } from "./team-invitation.js";
19
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
20
- var next15DeprecationWarning = "DEPRECATION WARNING: Next.js 15 disallows spreading the props argument of <StackHandler /> like `{...props}`, so you must now explicitly pass them in the `routeProps` argument: `routeProps={props}`. You can fix this by updating the code in the file `app/handler/[...stack]/route.tsx`.";
21
- var availablePaths = {
22
- signIn: "sign-in",
23
- signUp: "sign-up",
24
- emailVerification: "email-verification",
25
- passwordReset: "password-reset",
26
- forgotPassword: "forgot-password",
27
- signOut: "sign-out",
28
- oauthCallback: "oauth-callback",
29
- magicLinkCallback: "magic-link-callback",
30
- teamInvitation: "team-invitation",
31
- accountSettings: "account-settings",
32
- cliAuthConfirm: "cli-auth-confirm",
33
- mfa: "mfa",
34
- error: "error"
35
- };
36
- var pathAliases = {
37
- // also includes the uppercase and non-dashed versions
38
- ...Object.fromEntries(Object.entries(availablePaths).map(([key, value]) => [value, value])),
39
- "log-in": availablePaths.signIn,
40
- "register": availablePaths.signUp
41
- };
42
- function renderComponent(props) {
43
- const { path, searchParams, fullPage, componentProps, redirectIfNotHandler, onNotFound, app } = props;
44
- switch (path) {
45
- case availablePaths.signIn: {
46
- redirectIfNotHandler?.("signIn");
47
- return /* @__PURE__ */ jsx(
48
- SignIn,
49
- {
50
- fullPage,
51
- automaticRedirect: true,
52
- ...filterUndefinedINU(componentProps?.SignIn)
53
- }
54
- );
55
- }
56
- case availablePaths.signUp: {
57
- redirectIfNotHandler?.("signUp");
58
- return /* @__PURE__ */ jsx(
59
- SignUp,
60
- {
61
- fullPage,
62
- automaticRedirect: true,
63
- ...filterUndefinedINU(componentProps?.SignUp)
64
- }
65
- );
66
- }
67
- case availablePaths.emailVerification: {
68
- redirectIfNotHandler?.("emailVerification");
69
- return /* @__PURE__ */ jsx(
70
- EmailVerification,
71
- {
72
- searchParams,
73
- fullPage,
74
- ...filterUndefinedINU(componentProps?.EmailVerification)
75
- }
76
- );
77
- }
78
- case availablePaths.passwordReset: {
79
- redirectIfNotHandler?.("passwordReset");
80
- return /* @__PURE__ */ jsx(
81
- PasswordReset,
82
- {
83
- searchParams,
84
- fullPage,
85
- ...filterUndefinedINU(componentProps?.PasswordReset)
86
- }
87
- );
88
- }
89
- case availablePaths.forgotPassword: {
90
- redirectIfNotHandler?.("forgotPassword");
91
- return /* @__PURE__ */ jsx(
92
- ForgotPassword,
93
- {
94
- fullPage,
95
- ...filterUndefinedINU(componentProps?.ForgotPassword)
96
- }
97
- );
98
- }
99
- case availablePaths.signOut: {
100
- redirectIfNotHandler?.("signOut");
101
- return /* @__PURE__ */ jsx(
102
- SignOut,
103
- {
104
- fullPage,
105
- ...filterUndefinedINU(componentProps?.SignOut)
106
- }
107
- );
108
- }
109
- case availablePaths.oauthCallback: {
110
- redirectIfNotHandler?.("oauthCallback");
111
- return /* @__PURE__ */ jsx(
112
- OAuthCallback,
113
- {
114
- fullPage,
115
- ...filterUndefinedINU(componentProps?.OAuthCallback)
116
- }
117
- );
118
- }
119
- case availablePaths.magicLinkCallback: {
120
- redirectIfNotHandler?.("magicLinkCallback");
121
- return /* @__PURE__ */ jsx(
122
- MagicLinkCallback,
123
- {
124
- searchParams,
125
- fullPage,
126
- ...filterUndefinedINU(componentProps?.MagicLinkCallback)
127
- }
128
- );
129
- }
130
- case availablePaths.teamInvitation: {
131
- redirectIfNotHandler?.("teamInvitation");
132
- return /* @__PURE__ */ jsx(
133
- TeamInvitation,
134
- {
135
- searchParams,
136
- fullPage,
137
- ...filterUndefinedINU(componentProps?.TeamInvitation)
138
- }
139
- );
140
- }
141
- case availablePaths.accountSettings: {
142
- return /* @__PURE__ */ jsx(
143
- AccountSettings,
144
- {
145
- fullPage,
146
- ...filterUndefinedINU(componentProps?.AccountSettings)
147
- }
148
- );
149
- }
150
- case availablePaths.error: {
151
- return /* @__PURE__ */ jsx(
152
- ErrorPage,
153
- {
154
- searchParams,
155
- fullPage,
156
- ...filterUndefinedINU(componentProps?.ErrorPage)
157
- }
158
- );
159
- }
160
- case availablePaths.cliAuthConfirm: {
161
- return /* @__PURE__ */ jsx(
162
- CliAuthConfirmation,
163
- {
164
- fullPage,
165
- ...filterUndefinedINU(componentProps?.CliAuthConfirmation)
166
- }
167
- );
168
- }
169
- case availablePaths.mfa: {
170
- redirectIfNotHandler?.("mfa");
171
- return /* @__PURE__ */ jsx(
172
- MFA,
173
- {
174
- fullPage,
175
- ...filterUndefinedINU(componentProps?.MFA)
176
- }
177
- );
178
- }
179
- default: {
180
- if (Object.values(availablePaths).includes(path)) {
181
- throw new StackAssertionError(`Path alias ${path} not included in switch statement, but in availablePaths?`, { availablePaths });
182
- }
183
- for (const [key, value] of Object.entries(pathAliases)) {
184
- if (path === key.toLowerCase().replaceAll("-", "")) {
185
- const redirectUrl = `${app.urls.handler}/${value}?${new URLSearchParams(searchParams).toString()}`;
186
- return { redirect: redirectUrl };
187
- }
188
- }
189
- return onNotFound();
190
- }
191
- }
192
- }
193
- async function NextStackHandler(props) {
194
- if (!("routeProps" in props)) {
195
- console.warn(next15DeprecationWarning);
196
- }
197
- const routeProps = "routeProps" in props ? props.routeProps : pick(props, ["params", "searchParams"]);
198
- const params = await routeProps.params;
199
- const searchParams = await routeProps.searchParams;
200
- if (!params?.stack) {
201
- return /* @__PURE__ */ jsx(MessageCard, { title: "Invalid Stack Handler Setup", fullPage: props.fullPage, children: /* @__PURE__ */ jsxs("p", { children: [
202
- "Can't use ",
203
- "<StackHandler />",
204
- " at this location. Make sure that the file is in a folder called [...stack] and you are passing the routeProps prop."
205
- ] }) });
206
- }
207
- const path = params.stack.join("/");
208
- const redirectIfNotHandler = (name) => {
209
- const url = props.app.urls[name];
210
- const handlerUrl = props.app.urls.handler;
211
- if (url !== handlerUrl && url.startsWith(handlerUrl + "/")) {
212
- return;
213
- }
214
- const urlObj = new URL(url, "http://example.com");
215
- if (searchParams) {
216
- for (const [key, value] of Object.entries(searchParams)) {
217
- urlObj.searchParams.set(key, value);
218
- }
219
- }
220
- redirect(getRelativePart(urlObj), RedirectType.replace);
221
- };
222
- const result = renderComponent({
223
- path,
224
- searchParams: searchParams ?? {},
225
- fullPage: props.fullPage,
226
- componentProps: props.componentProps,
227
- redirectIfNotHandler,
228
- onNotFound: () => notFound(),
229
- app: props.app
230
- });
231
- if (result && "redirect" in result) {
232
- redirect(result.redirect, RedirectType.replace);
233
- }
234
- return /* @__PURE__ */ jsxs(Fragment, { children: [
235
- process.env.NODE_ENV === "development" && !("routeProps" in props) && /* @__PURE__ */ jsxs("span", { style: { color: "red" }, children: [
236
- next15DeprecationWarning,
237
- ". This warning will not be shown in production."
238
- ] }),
239
- result
240
- ] });
241
- }
242
- var stack_handler_default = NextStackHandler;
243
- function filterUndefinedINU(value) {
244
- return value === void 0 ? value : filterUndefined(value);
2
+ import { StackHandlerClient } from "./stack-handler-client.js";
3
+ import { jsx } from "react/jsx-runtime";
4
+ function StackHandler({ app, routeProps, params, searchParams, ...props }) {
5
+ return /* @__PURE__ */ jsx(StackHandlerClient, { ...props });
245
6
  }
246
7
  export {
247
- stack_handler_default as default
8
+ StackHandler as default
248
9
  };
249
10
  //# sourceMappingURL=stack-handler.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components-page/stack-handler.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { StackAssertionError } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { FilterUndefined, filterUndefined, pick } from \"@stackframe/stack-shared/dist/utils/objects\";\nimport { getRelativePart } from \"@stackframe/stack-shared/dist/utils/urls\";\nimport { RedirectType, notFound, redirect } from 'next/navigation'; // THIS_LINE_PLATFORM next\nimport { useMemo } from 'react';\nimport { SignIn, SignUp, StackServerApp } from \"..\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { HandlerUrls, StackClientApp } from \"../lib/stack-app\";\nimport { AccountSettings } from \"./account-settings\";\nimport { CliAuthConfirmation } from \"./cli-auth-confirm\";\nimport { EmailVerification } from \"./email-verification\";\nimport { ErrorPage } from \"./error-page\";\nimport { ForgotPassword } from \"./forgot-password\";\nimport { MagicLinkCallback } from \"./magic-link-callback\";\nimport { OAuthCallback } from \"./oauth-callback\";\nimport { MFA } from \"./mfa\";\nimport { PasswordReset } from \"./password-reset\";\nimport { SignOut } from \"./sign-out\";\nimport { TeamInvitation } from \"./team-invitation\";\n\ntype Components = {\n SignIn: typeof SignIn,\n SignUp: typeof SignUp,\n EmailVerification: typeof EmailVerification,\n PasswordReset: typeof PasswordReset,\n ForgotPassword: typeof ForgotPassword,\n SignOut: typeof SignOut,\n OAuthCallback: typeof OAuthCallback,\n MagicLinkCallback: typeof MagicLinkCallback,\n TeamInvitation: typeof TeamInvitation,\n ErrorPage: typeof ErrorPage,\n AccountSettings: typeof AccountSettings,\n CliAuthConfirmation: typeof CliAuthConfirmation,\n MFA: typeof MFA,\n};\n\ntype RouteProps = {\n params: Promise<{ stack?: string[] }> | { stack?: string[] },\n searchParams: Promise<Record<string, string>> | Record<string, string>,\n};\n\nconst next15DeprecationWarning = \"DEPRECATION WARNING: Next.js 15 disallows spreading the props argument of <StackHandler /> like `{...props}`, so you must now explicitly pass them in the `routeProps` argument: `routeProps={props}`. You can fix this by updating the code in the file `app/handler/[...stack]/route.tsx`.\";\n\nconst availablePaths = {\n signIn: 'sign-in',\n signUp: 'sign-up',\n emailVerification: 'email-verification',\n passwordReset: 'password-reset',\n forgotPassword: 'forgot-password',\n signOut: 'sign-out',\n oauthCallback: 'oauth-callback',\n magicLinkCallback: 'magic-link-callback',\n teamInvitation: 'team-invitation',\n accountSettings: 'account-settings',\n cliAuthConfirm: 'cli-auth-confirm',\n mfa: 'mfa',\n error: 'error',\n} as const;\n\nconst pathAliases = {\n // also includes the uppercase and non-dashed versions\n ...Object.fromEntries(Object.entries(availablePaths).map(([key, value]) => [value, value])),\n \"log-in\": availablePaths.signIn,\n \"register\": availablePaths.signUp,\n} as const;\n\ntype BaseHandlerProps = {\n fullPage: boolean,\n componentProps?: {\n [K in keyof Components]?: Parameters<Components[K]>[0];\n },\n};\n\nfunction renderComponent(props: {\n path: string,\n searchParams: Record<string, string>,\n fullPage: boolean,\n componentProps?: BaseHandlerProps['componentProps'],\n redirectIfNotHandler?: (name: keyof HandlerUrls) => void,\n onNotFound: () => any,\n app: StackClientApp<any> | StackServerApp<any>,\n}) {\n const { path, searchParams, fullPage, componentProps, redirectIfNotHandler, onNotFound, app } = props;\n\n switch (path) {\n case availablePaths.signIn: {\n redirectIfNotHandler?.('signIn');\n return <SignIn\n fullPage={fullPage}\n automaticRedirect\n {...filterUndefinedINU(componentProps?.SignIn)}\n />;\n }\n case availablePaths.signUp: {\n redirectIfNotHandler?.('signUp');\n return <SignUp\n fullPage={fullPage}\n automaticRedirect\n {...filterUndefinedINU(componentProps?.SignUp)}\n />;\n }\n case availablePaths.emailVerification: {\n redirectIfNotHandler?.('emailVerification');\n return <EmailVerification\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.EmailVerification)}\n />;\n }\n case availablePaths.passwordReset: {\n redirectIfNotHandler?.('passwordReset');\n return <PasswordReset\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.PasswordReset)}\n />;\n }\n case availablePaths.forgotPassword: {\n redirectIfNotHandler?.('forgotPassword');\n return <ForgotPassword\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.ForgotPassword)}\n />;\n }\n case availablePaths.signOut: {\n redirectIfNotHandler?.('signOut');\n return <SignOut\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.SignOut)}\n />;\n }\n case availablePaths.oauthCallback: {\n redirectIfNotHandler?.('oauthCallback');\n return <OAuthCallback\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.OAuthCallback)}\n />;\n }\n case availablePaths.magicLinkCallback: {\n redirectIfNotHandler?.('magicLinkCallback');\n return <MagicLinkCallback\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.MagicLinkCallback)}\n />;\n }\n case availablePaths.teamInvitation: {\n redirectIfNotHandler?.('teamInvitation');\n return <TeamInvitation\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.TeamInvitation)}\n />;\n }\n case availablePaths.accountSettings: {\n return <AccountSettings\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.AccountSettings)}\n />;\n }\n case availablePaths.error: {\n return <ErrorPage\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.ErrorPage)}\n />;\n }\n case availablePaths.cliAuthConfirm: {\n return <CliAuthConfirmation\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.CliAuthConfirmation)}\n />;\n }\n case availablePaths.mfa: {\n redirectIfNotHandler?.('mfa');\n return <MFA\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.MFA)}\n />;\n }\n default: {\n if (Object.values(availablePaths).includes(path as any)) {\n throw new StackAssertionError(`Path alias ${path} not included in switch statement, but in availablePaths?`, { availablePaths });\n }\n for (const [key, value] of Object.entries(pathAliases)) {\n if (path === key.toLowerCase().replaceAll('-', '')) {\n const redirectUrl = `${app.urls.handler}/${value}?${new URLSearchParams(searchParams).toString()}`;\n return { redirect: redirectUrl };\n }\n }\n return onNotFound();\n }\n }\n}\n\nasync function NextStackHandler<HasTokenStore extends boolean>(props: BaseHandlerProps & {\n app: StackServerApp<HasTokenStore>,\n} & (\n | Partial<RouteProps>\n | {\n routeProps: RouteProps | unknown,\n }\n)): Promise<any> {\n if (!(\"routeProps\" in props)) {\n console.warn(next15DeprecationWarning);\n }\n\n const routeProps = \"routeProps\" in props ? props.routeProps as RouteProps : pick(props, [\"params\", \"searchParams\"] as any);\n const params = await routeProps.params;\n const searchParams = await routeProps.searchParams;\n\n if (!params?.stack) {\n return (\n <MessageCard title=\"Invalid Stack Handler Setup\" fullPage={props.fullPage}>\n <p>Can't use {\"<StackHandler />\"} at this location. Make sure that the file is in a folder called [...stack] and you are passing the routeProps prop.</p>\n </MessageCard>\n );\n }\n\n const path = params.stack.join('/');\n\n const redirectIfNotHandler = (name: keyof HandlerUrls) => {\n const url = props.app.urls[name];\n const handlerUrl = props.app.urls.handler;\n\n if (url !== handlerUrl && url.startsWith(handlerUrl + \"/\")) {\n return;\n }\n\n const urlObj = new URL(url, \"http://example.com\");\n if (searchParams) {\n for (const [key, value] of Object.entries(searchParams)) {\n urlObj.searchParams.set(key, value);\n }\n }\n\n redirect(getRelativePart(urlObj), RedirectType.replace);\n };\n\n const result = renderComponent({\n path,\n searchParams: searchParams ?? {},\n fullPage: props.fullPage,\n componentProps: props.componentProps,\n redirectIfNotHandler,\n onNotFound: () => notFound(),\n app: props.app,\n });\n\n if (result && 'redirect' in result) {\n redirect(result.redirect, RedirectType.replace);\n }\n\n return <>\n {process.env.NODE_ENV === \"development\" && !(\"routeProps\" in props) && (\n <span style={{ color: \"red\" }}>\n {next15DeprecationWarning}. This warning will not be shown in production.\n </span>\n )}\n {result}\n </>;\n}\n\n\nexport default NextStackHandler;\n\n// filter undefined values in object. if object itself is undefined, return undefined\nfunction filterUndefinedINU<T extends {}>(value: T | undefined): FilterUndefined<T> | undefined {\n return value === undefined ? value : filterUndefined(value);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components-page/stack-handler.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n// This file exists solely so the following old, deprecated code from when StackHandler used to still take props:\n// <StackHandler app={stackServerApp} routeProps={props} />\n// does not throw the following error:\n// Only plain objects, and a few built-ins, can be passed to Client Components from Server Components. Classes or null prototypes are not supported.\n// This file exists as a component that can be both client and server, ignores its parameters, and returns <StackHandlerClient />\n\nimport { BaseHandlerProps, StackHandlerClient } from \"./stack-handler-client\";\n\nexport default function StackHandler({ app, routeProps, params, searchParams, ...props }: BaseHandlerProps & { location?: string } & {\n /**\n * @deprecated The app parameter is no longer necessary. You can safely remove it.\n */\n app?: any,\n\n /**\n * @deprecated The routeProps parameter is no longer necessary. You can safely remove it.\n */\n routeProps?: any,\n\n /**\n * @deprecated The params parameter is no longer necessary. You can safely remove it.\n */\n params?: any,\n\n /**\n * @deprecated The searchParams parameter is no longer necessary. You can safely remove it.\n */\n searchParams?: any,\n}) {\n return <StackHandlerClient {...props} />;\n}\n"],"mappings":";AAUA,SAA2B,0BAA0B;AAuB5C;AArBM,SAAR,aAA8B,EAAE,KAAK,YAAY,QAAQ,cAAc,GAAG,MAAM,GAoBpF;AACD,SAAO,oBAAC,sBAAoB,GAAG,OAAO;AACxC;","names":[]}
@@ -5,6 +5,7 @@
5
5
  import { KnownErrors } from "@stackframe/stack-shared";
6
6
  import { cacheFunction } from "@stackframe/stack-shared/dist/utils/caches";
7
7
  import { runAsynchronouslyWithAlert } from "@stackframe/stack-shared/dist/utils/promises";
8
+ import { use } from "@stackframe/stack-shared/dist/utils/react";
8
9
  import { Typography } from "@stackframe/stack-ui";
9
10
  import React from "react";
10
11
  import { MessageCard, useStackApp, useUser } from "../index.js";
@@ -22,7 +23,7 @@ function TeamInvitationInner(props) {
22
23
  const stackApp = useStackApp();
23
24
  const [success, setSuccess] = React.useState(false);
24
25
  const [errorMessage, setErrorMessage] = React.useState(null);
25
- const details = React.use(cachedGetInvitationDetails(stackApp, props.searchParams.code || ""));
26
+ const details = use(cachedGetInvitationDetails(stackApp, props.searchParams.code || ""));
26
27
  if (errorMessage || details.status === "error") {
27
28
  return /* @__PURE__ */ jsx(PredefinedMessageCard, { type: "unknownError", fullPage: props.fullPage });
28
29
  }
@@ -89,7 +90,7 @@ function TeamInvitation({ fullPage = false, searchParams }) {
89
90
  }
90
91
  );
91
92
  }
92
- const verificationResult = React.use(cachedVerifyInvitation(stackApp, searchParams.code || ""));
93
+ const verificationResult = use(cachedVerifyInvitation(stackApp, searchParams.code || ""));
93
94
  if (verificationResult.status === "error") {
94
95
  const error = verificationResult.error;
95
96
  if (KnownErrors.VerificationCodeNotFound.isInstance(error)) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components-page/team-invitation.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\nimport { KnownErrors } from \"@stackframe/stack-shared\";\nimport { cacheFunction } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport { runAsynchronouslyWithAlert } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Typography } from \"@stackframe/stack-ui\";\nimport React from \"react\";\nimport { MessageCard, StackClientApp, useStackApp, useUser } from \"..\";\nimport { PredefinedMessageCard } from \"../components/message-cards/predefined-message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\nconst cachedVerifyInvitation = cacheFunction(async (stackApp: StackClientApp<true>, code: string) => {\n return await stackApp.verifyTeamInvitationCode(code);\n});\n\nconst cachedGetInvitationDetails = cacheFunction(async (stackApp: StackClientApp<true>, code: string) => {\n return await stackApp.getTeamInvitationDetails(code);\n});\n\nfunction TeamInvitationInner(props: { fullPage?: boolean, searchParams: Record<string, string> }) {\n const { t } = useTranslation();\n const stackApp = useStackApp();\n const [success, setSuccess] = React.useState(false);\n const [errorMessage, setErrorMessage] = React.useState<string | null>(null);\n const details = React.use(cachedGetInvitationDetails(stackApp, props.searchParams.code || ''));\n\n if (errorMessage || details.status === 'error') {\n return (\n <PredefinedMessageCard type=\"unknownError\" fullPage={props.fullPage} />\n );\n }\n\n if (success) {\n return (\n <MessageCard\n title={t('Team invitation')}\n fullPage={props.fullPage}\n primaryButtonText=\"Go home\"\n primaryAction={() => stackApp.redirectToHome()}\n >\n <Typography>You have successfully joined {details.data.teamDisplayName}</Typography>\n </MessageCard>\n );\n }\n\n\n return (\n <MessageCard\n title={t('Team invitation')}\n fullPage={props.fullPage}\n primaryButtonText={t('Join')}\n primaryAction={() => runAsynchronouslyWithAlert(async () => {\n const result = await stackApp.acceptTeamInvitation(props.searchParams.code || '');\n if (result.status === 'error') {\n setErrorMessage(result.error.message);\n } else {\n setSuccess(true);\n }\n })}\n secondaryButtonText={t('Ignore')}\n secondaryAction={() => stackApp.redirectToHome()}\n >\n <Typography>You are invited to join {details.data.teamDisplayName}</Typography>\n </MessageCard>\n );\n}\n\nexport function TeamInvitation({ fullPage=false, searchParams }: { fullPage?: boolean, searchParams: Record<string, string> }) {\n const { t } = useTranslation();\n const user = useUser();\n const stackApp = useStackApp();\n\n const invalidJsx = (\n <MessageCard title={t('Invalid Team Invitation Link')} fullPage={fullPage}>\n <Typography>{t('Please double check if you have the correct team invitation link.')}</Typography>\n </MessageCard>\n );\n\n const expiredJsx = (\n <MessageCard title={t('Expired Team Invitation Link')} fullPage={fullPage}>\n <Typography>{t('Your team invitation link has expired. Please request a new team invitation link ')}</Typography>\n </MessageCard>\n );\n\n const usedJsx = (\n <MessageCard title={t('Used Team Invitation Link')} fullPage={fullPage}>\n <Typography>{t('This team invitation link has already been used.')}</Typography>\n </MessageCard>\n );\n\n const code = searchParams.code;\n if (!code) {\n return invalidJsx;\n }\n\n if (!user) {\n return (\n <MessageCard\n title={t('Team invitation')}\n fullPage={fullPage}\n primaryButtonText={t('Sign in')}\n primaryAction={() => stackApp.redirectToSignIn()}\n secondaryButtonText={t('Cancel')}\n secondaryAction={() => stackApp.redirectToHome()}\n >\n <Typography>{t('Sign in or create an account to join the team.')}</Typography>\n </MessageCard>\n );\n }\n\n const verificationResult = React.use(cachedVerifyInvitation(stackApp, searchParams.code || ''));\n\n if (verificationResult.status === 'error') {\n const error = verificationResult.error;\n if (KnownErrors.VerificationCodeNotFound.isInstance(error)) {\n return invalidJsx;\n } else if (KnownErrors.VerificationCodeExpired.isInstance(error)) {\n return expiredJsx;\n } else if (KnownErrors.VerificationCodeAlreadyUsed.isInstance(error)) {\n return usedJsx;\n } else {\n throw error;\n }\n }\n\n return <TeamInvitationInner fullPage={fullPage} searchParams={searchParams} />;\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components-page/team-invitation.tsx"],"sourcesContent":["'use client';\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\nimport { KnownErrors } from \"@stackframe/stack-shared\";\nimport { cacheFunction } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport { runAsynchronouslyWithAlert } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { use } from \"@stackframe/stack-shared/dist/utils/react\";\nimport { Typography } from \"@stackframe/stack-ui\";\nimport React from \"react\";\nimport { MessageCard, StackClientApp, useStackApp, useUser } from \"..\";\nimport { PredefinedMessageCard } from \"../components/message-cards/predefined-message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\nconst cachedVerifyInvitation = cacheFunction(async (stackApp: StackClientApp<true>, code: string) => {\n return await stackApp.verifyTeamInvitationCode(code);\n});\n\nconst cachedGetInvitationDetails = cacheFunction(async (stackApp: StackClientApp<true>, code: string) => {\n return await stackApp.getTeamInvitationDetails(code);\n});\n\nfunction TeamInvitationInner(props: { fullPage?: boolean, searchParams: Record<string, string> }) {\n const { t } = useTranslation();\n const stackApp = useStackApp();\n const [success, setSuccess] = React.useState(false);\n const [errorMessage, setErrorMessage] = React.useState<string | null>(null);\n const details = use(cachedGetInvitationDetails(stackApp, props.searchParams.code || ''));\n\n if (errorMessage || details.status === 'error') {\n return (\n <PredefinedMessageCard type=\"unknownError\" fullPage={props.fullPage} />\n );\n }\n\n if (success) {\n return (\n <MessageCard\n title={t('Team invitation')}\n fullPage={props.fullPage}\n primaryButtonText=\"Go home\"\n primaryAction={() => stackApp.redirectToHome()}\n >\n <Typography>You have successfully joined {details.data.teamDisplayName}</Typography>\n </MessageCard>\n );\n }\n\n\n return (\n <MessageCard\n title={t('Team invitation')}\n fullPage={props.fullPage}\n primaryButtonText={t('Join')}\n primaryAction={() => runAsynchronouslyWithAlert(async () => {\n const result = await stackApp.acceptTeamInvitation(props.searchParams.code || '');\n if (result.status === 'error') {\n setErrorMessage(result.error.message);\n } else {\n setSuccess(true);\n }\n })}\n secondaryButtonText={t('Ignore')}\n secondaryAction={() => stackApp.redirectToHome()}\n >\n <Typography>You are invited to join {details.data.teamDisplayName}</Typography>\n </MessageCard>\n );\n}\n\nexport function TeamInvitation({ fullPage=false, searchParams }: { fullPage?: boolean, searchParams: Record<string, string> }) {\n const { t } = useTranslation();\n const user = useUser();\n const stackApp = useStackApp();\n\n const invalidJsx = (\n <MessageCard title={t('Invalid Team Invitation Link')} fullPage={fullPage}>\n <Typography>{t('Please double check if you have the correct team invitation link.')}</Typography>\n </MessageCard>\n );\n\n const expiredJsx = (\n <MessageCard title={t('Expired Team Invitation Link')} fullPage={fullPage}>\n <Typography>{t('Your team invitation link has expired. Please request a new team invitation link ')}</Typography>\n </MessageCard>\n );\n\n const usedJsx = (\n <MessageCard title={t('Used Team Invitation Link')} fullPage={fullPage}>\n <Typography>{t('This team invitation link has already been used.')}</Typography>\n </MessageCard>\n );\n\n const code = searchParams.code;\n if (!code) {\n return invalidJsx;\n }\n\n if (!user) {\n return (\n <MessageCard\n title={t('Team invitation')}\n fullPage={fullPage}\n primaryButtonText={t('Sign in')}\n primaryAction={() => stackApp.redirectToSignIn()}\n secondaryButtonText={t('Cancel')}\n secondaryAction={() => stackApp.redirectToHome()}\n >\n <Typography>{t('Sign in or create an account to join the team.')}</Typography>\n </MessageCard>\n );\n }\n\n const verificationResult = use(cachedVerifyInvitation(stackApp, searchParams.code || ''));\n\n if (verificationResult.status === 'error') {\n const error = verificationResult.error;\n if (KnownErrors.VerificationCodeNotFound.isInstance(error)) {\n return invalidJsx;\n } else if (KnownErrors.VerificationCodeExpired.isInstance(error)) {\n return expiredJsx;\n } else if (KnownErrors.VerificationCodeAlreadyUsed.isInstance(error)) {\n return usedJsx;\n } else {\n throw error;\n }\n }\n\n return <TeamInvitationInner fullPage={fullPage} searchParams={searchParams} />;\n};\n"],"mappings":"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","names":[]}
@@ -370,6 +370,13 @@ var _StackAdminAppImplIncomplete = class extends _StackServerAppImplIncomplete {
370
370
  async _refreshInternalApiKeys() {
371
371
  await this._internalApiKeysCache.refresh([]);
372
372
  }
373
+ async _refreshUsers() {
374
+ await Promise.all([
375
+ super._refreshUsers(),
376
+ this._metricsCache.refresh([false]),
377
+ this._metricsCache.refresh([true])
378
+ ]);
379
+ }
373
380
  get [stackAppInternalsSymbol]() {
374
381
  return {
375
382
  ...super[stackAppInternalsSymbol],