@stackframe/stack 2.6.32 → 2.6.34
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 +18 -0
- package/dist/components-page/stack-handler.js +13 -3
- package/dist/components-page/stack-handler.js.map +1 -1
- package/dist/esm/components-page/stack-handler.js +13 -3
- package/dist/esm/components-page/stack-handler.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/lib/stack-app.js +15 -8
- package/dist/esm/lib/stack-app.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/lib/stack-app.d.mts +3 -1
- package/dist/lib/stack-app.d.ts +3 -1
- package/dist/lib/stack-app.js +15 -8
- package/dist/lib/stack-app.js.map +1 -1
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @stackframe/stack
|
|
2
2
|
|
|
3
|
+
## 2.6.34
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Bugfixes
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @stackframe/stack-shared@2.6.34
|
|
10
|
+
- @stackframe/stack-ui@2.6.34
|
|
11
|
+
- @stackframe/stack-sc@2.6.34
|
|
12
|
+
|
|
13
|
+
## 2.6.33
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- @stackframe/stack-sc@2.6.33
|
|
18
|
+
- @stackframe/stack-shared@2.6.33
|
|
19
|
+
- @stackframe/stack-ui@2.6.33
|
|
20
|
+
|
|
3
21
|
## 2.6.32
|
|
4
22
|
|
|
5
23
|
### Patch Changes
|
|
@@ -23,6 +23,7 @@ __export(stack_handler_exports, {
|
|
|
23
23
|
default: () => StackHandler
|
|
24
24
|
});
|
|
25
25
|
module.exports = __toCommonJS(stack_handler_exports);
|
|
26
|
+
var import_errors = require("@stackframe/stack-shared/dist/utils/errors");
|
|
26
27
|
var import_objects = require("@stackframe/stack-shared/dist/utils/objects");
|
|
27
28
|
var import_urls = require("@stackframe/stack-shared/dist/utils/urls");
|
|
28
29
|
var import_navigation = require("next/navigation");
|
|
@@ -79,6 +80,12 @@ async function StackHandler(props) {
|
|
|
79
80
|
accountSettings: "account-settings",
|
|
80
81
|
error: "error"
|
|
81
82
|
};
|
|
83
|
+
const pathAliases = {
|
|
84
|
+
// also includes the uppercase and non-dashed versions
|
|
85
|
+
...Object.fromEntries(Object.entries(availablePaths).map(([key, value]) => [value, value])),
|
|
86
|
+
"log-in": availablePaths.signIn,
|
|
87
|
+
"register": availablePaths.signUp
|
|
88
|
+
};
|
|
82
89
|
const path = params.stack.join("/");
|
|
83
90
|
const render = () => {
|
|
84
91
|
switch (path) {
|
|
@@ -198,9 +205,12 @@ async function StackHandler(props) {
|
|
|
198
205
|
);
|
|
199
206
|
}
|
|
200
207
|
default: {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
208
|
+
if (Object.values(availablePaths).includes(path)) {
|
|
209
|
+
throw new import_errors.StackAssertionError(`Path alias ${path} not included in switch statement, but in availablePaths?`, { availablePaths });
|
|
210
|
+
}
|
|
211
|
+
for (const [key, value] of Object.entries(pathAliases)) {
|
|
212
|
+
if (path === key.toLowerCase().replaceAll("-", "")) {
|
|
213
|
+
(0, import_navigation.redirect)(`${props.app.urls.handler}/${value}?${new URLSearchParams(searchParams).toString()}`, import_navigation.RedirectType.replace);
|
|
204
214
|
}
|
|
205
215
|
}
|
|
206
216
|
return (0, import_navigation.notFound)();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components-page/stack-handler.tsx"],"sourcesContent":["import { 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';\nimport { SignIn, SignUp, StackServerApp } from \"..\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { HandlerUrls } from \"../lib/stack-app\";\nimport { AccountSettings } from \"./account-settings\";\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 { 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};\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}`\";\n\nexport default async function StackHandler<HasTokenStore extends boolean>(props: {\n app: StackServerApp<HasTokenStore>,\n fullPage: boolean,\n componentProps?: {\n [K in keyof Components]?: Parameters<Components[K]>[0];\n },\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 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 function 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 // don't redirect if the url is a handler url\n return;\n }\n\n const urlObj = new URL(url, \"http://example.com\");\n for (const [key, value] of Object.entries(routeProps.searchParams || {})) {\n urlObj.searchParams.set(key, value);\n }\n\n redirect(getRelativePart(urlObj), RedirectType.replace);\n };\n\n const 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 error: 'error',\n };\n\n const path = params.stack.join('/');\n\n const render = () => {\n switch (path) {\n case availablePaths.signIn: {\n redirectIfNotHandler('signIn');\n return <SignIn\n fullPage={props.fullPage}\n automaticRedirect\n {...filterUndefinedINU(props.componentProps?.SignIn)}\n />;\n }\n case availablePaths.signUp: {\n redirectIfNotHandler('signUp');\n return <SignUp\n fullPage={props.fullPage}\n automaticRedirect\n {...filterUndefinedINU(props.componentProps?.SignUp)}\n />;\n }\n case availablePaths.emailVerification: {\n redirectIfNotHandler('emailVerification');\n return <EmailVerification\n searchParams={searchParams}\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.EmailVerification)}\n />;\n }\n case availablePaths.passwordReset: {\n redirectIfNotHandler('passwordReset');\n return <PasswordReset\n searchParams={searchParams || {}}\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.PasswordReset)}\n />;\n }\n case availablePaths.forgotPassword: {\n redirectIfNotHandler('forgotPassword');\n return <ForgotPassword\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.ForgotPassword)}\n />;\n }\n case availablePaths.signOut: {\n redirectIfNotHandler('signOut');\n return <SignOut\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.SignOut)}\n />;\n }\n case availablePaths.oauthCallback: {\n redirectIfNotHandler('oauthCallback');\n return <OAuthCallback\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.OAuthCallback)}\n />;\n }\n case availablePaths.magicLinkCallback: {\n redirectIfNotHandler('magicLinkCallback');\n return <MagicLinkCallback\n searchParams={searchParams || {}}\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.MagicLinkCallback)}\n />;\n }\n case availablePaths.teamInvitation: {\n redirectIfNotHandler('teamInvitation');\n return <TeamInvitation\n searchParams={searchParams || {}}\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.TeamInvitation)}\n />;\n }\n case availablePaths.accountSettings: {\n return <AccountSettings\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.AccountSettings)}\n />;\n }\n case availablePaths.error: {\n return <ErrorPage\n searchParams={searchParams || {}}\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.ErrorPage)}\n />;\n }\n default: {\n for (const [key, value] of Object.entries(availablePaths)) {\n if (path === value.replaceAll('-', '')) {\n redirect(`${props.app.urls.handler}/${value}`, RedirectType.replace);\n }\n }\n return notFound();\n }\n }\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 {render()}\n </>;\n}\n\n\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":["import { 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';\nimport { SignIn, SignUp, StackServerApp } from \"..\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { HandlerUrls } from \"../lib/stack-app\";\nimport { AccountSettings } from \"./account-settings\";\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 { 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};\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}`\";\n\nexport default async function StackHandler<HasTokenStore extends boolean>(props: {\n app: StackServerApp<HasTokenStore>,\n fullPage: boolean,\n componentProps?: {\n [K in keyof Components]?: Parameters<Components[K]>[0];\n },\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 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 function 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 // don't redirect if the url is a handler url\n return;\n }\n\n const urlObj = new URL(url, \"http://example.com\");\n for (const [key, value] of Object.entries(routeProps.searchParams || {})) {\n urlObj.searchParams.set(key, value);\n }\n\n redirect(getRelativePart(urlObj), RedirectType.replace);\n };\n\n const 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 error: 'error',\n };\n\n const 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 };\n\n const path = params.stack.join('/');\n\n const render = () => {\n switch (path) {\n case availablePaths.signIn: {\n redirectIfNotHandler('signIn');\n return <SignIn\n fullPage={props.fullPage}\n automaticRedirect\n {...filterUndefinedINU(props.componentProps?.SignIn)}\n />;\n }\n case availablePaths.signUp: {\n redirectIfNotHandler('signUp');\n return <SignUp\n fullPage={props.fullPage}\n automaticRedirect\n {...filterUndefinedINU(props.componentProps?.SignUp)}\n />;\n }\n case availablePaths.emailVerification: {\n redirectIfNotHandler('emailVerification');\n return <EmailVerification\n searchParams={searchParams}\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.EmailVerification)}\n />;\n }\n case availablePaths.passwordReset: {\n redirectIfNotHandler('passwordReset');\n return <PasswordReset\n searchParams={searchParams || {}}\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.PasswordReset)}\n />;\n }\n case availablePaths.forgotPassword: {\n redirectIfNotHandler('forgotPassword');\n return <ForgotPassword\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.ForgotPassword)}\n />;\n }\n case availablePaths.signOut: {\n redirectIfNotHandler('signOut');\n return <SignOut\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.SignOut)}\n />;\n }\n case availablePaths.oauthCallback: {\n redirectIfNotHandler('oauthCallback');\n return <OAuthCallback\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.OAuthCallback)}\n />;\n }\n case availablePaths.magicLinkCallback: {\n redirectIfNotHandler('magicLinkCallback');\n return <MagicLinkCallback\n searchParams={searchParams || {}}\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.MagicLinkCallback)}\n />;\n }\n case availablePaths.teamInvitation: {\n redirectIfNotHandler('teamInvitation');\n return <TeamInvitation\n searchParams={searchParams || {}}\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.TeamInvitation)}\n />;\n }\n case availablePaths.accountSettings: {\n return <AccountSettings\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.AccountSettings)}\n />;\n }\n case availablePaths.error: {\n return <ErrorPage\n searchParams={searchParams || {}}\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.ErrorPage)}\n />;\n }\n default: {\n if (Object.values(availablePaths).includes(path)) {\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 redirect(`${props.app.urls.handler}/${value}?${new URLSearchParams(searchParams).toString()}`, RedirectType.replace);\n }\n }\n return notFound();\n }\n }\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 {render()}\n </>;\n}\n\n\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,4 +1,5 @@
|
|
|
1
1
|
// src/components-page/stack-handler.tsx
|
|
2
|
+
import { StackAssertionError } from "@stackframe/stack-shared/dist/utils/errors";
|
|
2
3
|
import { filterUndefined, pick } from "@stackframe/stack-shared/dist/utils/objects";
|
|
3
4
|
import { getRelativePart } from "@stackframe/stack-shared/dist/utils/urls";
|
|
4
5
|
import { RedirectType, notFound, redirect } from "next/navigation";
|
|
@@ -55,6 +56,12 @@ async function StackHandler(props) {
|
|
|
55
56
|
accountSettings: "account-settings",
|
|
56
57
|
error: "error"
|
|
57
58
|
};
|
|
59
|
+
const pathAliases = {
|
|
60
|
+
// also includes the uppercase and non-dashed versions
|
|
61
|
+
...Object.fromEntries(Object.entries(availablePaths).map(([key, value]) => [value, value])),
|
|
62
|
+
"log-in": availablePaths.signIn,
|
|
63
|
+
"register": availablePaths.signUp
|
|
64
|
+
};
|
|
58
65
|
const path = params.stack.join("/");
|
|
59
66
|
const render = () => {
|
|
60
67
|
switch (path) {
|
|
@@ -174,9 +181,12 @@ async function StackHandler(props) {
|
|
|
174
181
|
);
|
|
175
182
|
}
|
|
176
183
|
default: {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
184
|
+
if (Object.values(availablePaths).includes(path)) {
|
|
185
|
+
throw new StackAssertionError(`Path alias ${path} not included in switch statement, but in availablePaths?`, { availablePaths });
|
|
186
|
+
}
|
|
187
|
+
for (const [key, value] of Object.entries(pathAliases)) {
|
|
188
|
+
if (path === key.toLowerCase().replaceAll("-", "")) {
|
|
189
|
+
redirect(`${props.app.urls.handler}/${value}?${new URLSearchParams(searchParams).toString()}`, RedirectType.replace);
|
|
180
190
|
}
|
|
181
191
|
}
|
|
182
192
|
return notFound();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components-page/stack-handler.tsx"],"sourcesContent":["import { 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';\nimport { SignIn, SignUp, StackServerApp } from \"..\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { HandlerUrls } from \"../lib/stack-app\";\nimport { AccountSettings } from \"./account-settings\";\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 { 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};\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}`\";\n\nexport default async function StackHandler<HasTokenStore extends boolean>(props: {\n app: StackServerApp<HasTokenStore>,\n fullPage: boolean,\n componentProps?: {\n [K in keyof Components]?: Parameters<Components[K]>[0];\n },\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 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 function 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 // don't redirect if the url is a handler url\n return;\n }\n\n const urlObj = new URL(url, \"http://example.com\");\n for (const [key, value] of Object.entries(routeProps.searchParams || {})) {\n urlObj.searchParams.set(key, value);\n }\n\n redirect(getRelativePart(urlObj), RedirectType.replace);\n };\n\n const 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 error: 'error',\n };\n\n const path = params.stack.join('/');\n\n const render = () => {\n switch (path) {\n case availablePaths.signIn: {\n redirectIfNotHandler('signIn');\n return <SignIn\n fullPage={props.fullPage}\n automaticRedirect\n {...filterUndefinedINU(props.componentProps?.SignIn)}\n />;\n }\n case availablePaths.signUp: {\n redirectIfNotHandler('signUp');\n return <SignUp\n fullPage={props.fullPage}\n automaticRedirect\n {...filterUndefinedINU(props.componentProps?.SignUp)}\n />;\n }\n case availablePaths.emailVerification: {\n redirectIfNotHandler('emailVerification');\n return <EmailVerification\n searchParams={searchParams}\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.EmailVerification)}\n />;\n }\n case availablePaths.passwordReset: {\n redirectIfNotHandler('passwordReset');\n return <PasswordReset\n searchParams={searchParams || {}}\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.PasswordReset)}\n />;\n }\n case availablePaths.forgotPassword: {\n redirectIfNotHandler('forgotPassword');\n return <ForgotPassword\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.ForgotPassword)}\n />;\n }\n case availablePaths.signOut: {\n redirectIfNotHandler('signOut');\n return <SignOut\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.SignOut)}\n />;\n }\n case availablePaths.oauthCallback: {\n redirectIfNotHandler('oauthCallback');\n return <OAuthCallback\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.OAuthCallback)}\n />;\n }\n case availablePaths.magicLinkCallback: {\n redirectIfNotHandler('magicLinkCallback');\n return <MagicLinkCallback\n searchParams={searchParams || {}}\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.MagicLinkCallback)}\n />;\n }\n case availablePaths.teamInvitation: {\n redirectIfNotHandler('teamInvitation');\n return <TeamInvitation\n searchParams={searchParams || {}}\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.TeamInvitation)}\n />;\n }\n case availablePaths.accountSettings: {\n return <AccountSettings\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.AccountSettings)}\n />;\n }\n case availablePaths.error: {\n return <ErrorPage\n searchParams={searchParams || {}}\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.ErrorPage)}\n />;\n }\n default: {\n for (const [key, value] of Object.entries(availablePaths)) {\n if (path === value.replaceAll('-', '')) {\n redirect(`${props.app.urls.handler}/${value}`, RedirectType.replace);\n }\n }\n return notFound();\n }\n }\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 {render()}\n </>;\n}\n\n\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":["import { 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';\nimport { SignIn, SignUp, StackServerApp } from \"..\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { HandlerUrls } from \"../lib/stack-app\";\nimport { AccountSettings } from \"./account-settings\";\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 { 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};\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}`\";\n\nexport default async function StackHandler<HasTokenStore extends boolean>(props: {\n app: StackServerApp<HasTokenStore>,\n fullPage: boolean,\n componentProps?: {\n [K in keyof Components]?: Parameters<Components[K]>[0];\n },\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 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 function 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 // don't redirect if the url is a handler url\n return;\n }\n\n const urlObj = new URL(url, \"http://example.com\");\n for (const [key, value] of Object.entries(routeProps.searchParams || {})) {\n urlObj.searchParams.set(key, value);\n }\n\n redirect(getRelativePart(urlObj), RedirectType.replace);\n };\n\n const 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 error: 'error',\n };\n\n const 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 };\n\n const path = params.stack.join('/');\n\n const render = () => {\n switch (path) {\n case availablePaths.signIn: {\n redirectIfNotHandler('signIn');\n return <SignIn\n fullPage={props.fullPage}\n automaticRedirect\n {...filterUndefinedINU(props.componentProps?.SignIn)}\n />;\n }\n case availablePaths.signUp: {\n redirectIfNotHandler('signUp');\n return <SignUp\n fullPage={props.fullPage}\n automaticRedirect\n {...filterUndefinedINU(props.componentProps?.SignUp)}\n />;\n }\n case availablePaths.emailVerification: {\n redirectIfNotHandler('emailVerification');\n return <EmailVerification\n searchParams={searchParams}\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.EmailVerification)}\n />;\n }\n case availablePaths.passwordReset: {\n redirectIfNotHandler('passwordReset');\n return <PasswordReset\n searchParams={searchParams || {}}\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.PasswordReset)}\n />;\n }\n case availablePaths.forgotPassword: {\n redirectIfNotHandler('forgotPassword');\n return <ForgotPassword\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.ForgotPassword)}\n />;\n }\n case availablePaths.signOut: {\n redirectIfNotHandler('signOut');\n return <SignOut\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.SignOut)}\n />;\n }\n case availablePaths.oauthCallback: {\n redirectIfNotHandler('oauthCallback');\n return <OAuthCallback\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.OAuthCallback)}\n />;\n }\n case availablePaths.magicLinkCallback: {\n redirectIfNotHandler('magicLinkCallback');\n return <MagicLinkCallback\n searchParams={searchParams || {}}\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.MagicLinkCallback)}\n />;\n }\n case availablePaths.teamInvitation: {\n redirectIfNotHandler('teamInvitation');\n return <TeamInvitation\n searchParams={searchParams || {}}\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.TeamInvitation)}\n />;\n }\n case availablePaths.accountSettings: {\n return <AccountSettings\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.AccountSettings)}\n />;\n }\n case availablePaths.error: {\n return <ErrorPage\n searchParams={searchParams || {}}\n fullPage={props.fullPage}\n {...filterUndefinedINU(props.componentProps?.ErrorPage)}\n />;\n }\n default: {\n if (Object.values(availablePaths).includes(path)) {\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 redirect(`${props.app.urls.handler}/${value}?${new URLSearchParams(searchParams).toString()}`, RedirectType.replace);\n }\n }\n return notFound();\n }\n }\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 {render()}\n </>;\n}\n\n\nfunction filterUndefinedINU<T extends {}>(value: T | undefined): FilterUndefined<T> | undefined {\n return value === undefined ? value : filterUndefined(value);\n}\n"],"mappings":";AAAA,SAAS,2BAA2B;AACpC,SAA0B,iBAAiB,YAAY;AACvD,SAAS,uBAAuB;AAChC,SAAS,cAAc,UAAU,gBAAgB;AACjD,SAAS,QAAQ,cAA8B;AAC/C,SAAS,mBAAmB;AAE5B,SAAS,uBAAuB;AAChC,SAAS,yBAAyB;AAClC,SAAS,iBAAiB;AAC1B,SAAS,sBAAsB;AAC/B,SAAS,yBAAyB;AAClC,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,eAAe;AACxB,SAAS,sBAAsB;AA4CzB,SAgJG,UAhJH,KACE,YADF;AAvBN,IAAM,2BAA2B;AAEjC,eAAO,aAAmE,OAWzD;AACf,MAAI,EAAE,gBAAgB,QAAQ;AAC5B,YAAQ,KAAK,wBAAwB;AAAA,EACvC;AAEA,QAAM,aAAa,gBAAgB,QAAQ,MAAM,aAA2B,KAAK,OAAO,CAAC,UAAU,cAAc,CAAQ;AACzH,QAAM,SAAS,MAAM,WAAW;AAChC,QAAM,eAAe,MAAM,WAAW;AACtC,MAAI,CAAC,QAAQ,OAAO;AAClB,WACE,oBAAC,eAAY,OAAM,+BAA8B,UAAU,MAAM,UAC/D,+BAAC,OAAE;AAAA;AAAA,MAAW;AAAA,MAAmB;AAAA,OAAoH,GACvJ;AAAA,EAEJ;AAEA,WAAS,qBAAqB,MAAyB;AACrD,UAAM,MAAM,MAAM,IAAI,KAAK,IAAI;AAC/B,UAAM,aAAa,MAAM,IAAI,KAAK;AAElC,QAAI,QAAQ,cAAc,IAAI,WAAW,aAAa,GAAG,GAAG;AAE1D;AAAA,IACF;AAEA,UAAM,SAAS,IAAI,IAAI,KAAK,oBAAoB;AAChD,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,WAAW,gBAAgB,CAAC,CAAC,GAAG;AACxE,aAAO,aAAa,IAAI,KAAK,KAAK;AAAA,IACpC;AAEA,aAAS,gBAAgB,MAAM,GAAG,aAAa,OAAO;AAAA,EACxD;AAAC;AAED,QAAM,iBAAiB;AAAA,IACrB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,OAAO;AAAA,EACT;AAEA,QAAM,cAAc;AAAA;AAAA,IAElB,GAAG,OAAO,YAAY,OAAO,QAAQ,cAAc,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC;AAAA,IAC1F,UAAU,eAAe;AAAA,IACzB,YAAY,eAAe;AAAA,EAC7B;AAEA,QAAM,OAAO,OAAO,MAAM,KAAK,GAAG;AAElC,QAAM,SAAS,MAAM;AACnB,YAAQ,MAAM;AAAA,MACZ,KAAK,eAAe,QAAQ;AAC1B,6BAAqB,QAAQ;AAC7B,eAAO;AAAA,UAAC;AAAA;AAAA,YACN,UAAU,MAAM;AAAA,YAChB,mBAAiB;AAAA,YAChB,GAAG,mBAAmB,MAAM,gBAAgB,MAAM;AAAA;AAAA,QACrD;AAAA,MACF;AAAA,MACA,KAAK,eAAe,QAAQ;AAC1B,6BAAqB,QAAQ;AAC7B,eAAO;AAAA,UAAC;AAAA;AAAA,YACN,UAAU,MAAM;AAAA,YAChB,mBAAiB;AAAA,YAChB,GAAG,mBAAmB,MAAM,gBAAgB,MAAM;AAAA;AAAA,QACrD;AAAA,MACF;AAAA,MACA,KAAK,eAAe,mBAAmB;AACrC,6BAAqB,mBAAmB;AACxC,eAAO;AAAA,UAAC;AAAA;AAAA,YACN;AAAA,YACA,UAAU,MAAM;AAAA,YACf,GAAG,mBAAmB,MAAM,gBAAgB,iBAAiB;AAAA;AAAA,QAChE;AAAA,MACF;AAAA,MACA,KAAK,eAAe,eAAe;AACjC,6BAAqB,eAAe;AACpC,eAAO;AAAA,UAAC;AAAA;AAAA,YACN,cAAc,gBAAgB,CAAC;AAAA,YAC/B,UAAU,MAAM;AAAA,YACf,GAAG,mBAAmB,MAAM,gBAAgB,aAAa;AAAA;AAAA,QAC5D;AAAA,MACF;AAAA,MACA,KAAK,eAAe,gBAAgB;AAClC,6BAAqB,gBAAgB;AACrC,eAAO;AAAA,UAAC;AAAA;AAAA,YACN,UAAU,MAAM;AAAA,YACf,GAAG,mBAAmB,MAAM,gBAAgB,cAAc;AAAA;AAAA,QAC7D;AAAA,MACF;AAAA,MACA,KAAK,eAAe,SAAS;AAC3B,6BAAqB,SAAS;AAC9B,eAAO;AAAA,UAAC;AAAA;AAAA,YACN,UAAU,MAAM;AAAA,YACf,GAAG,mBAAmB,MAAM,gBAAgB,OAAO;AAAA;AAAA,QACtD;AAAA,MACF;AAAA,MACA,KAAK,eAAe,eAAe;AACjC,6BAAqB,eAAe;AACpC,eAAO;AAAA,UAAC;AAAA;AAAA,YACN,UAAU,MAAM;AAAA,YACf,GAAG,mBAAmB,MAAM,gBAAgB,aAAa;AAAA;AAAA,QAC5D;AAAA,MACF;AAAA,MACA,KAAK,eAAe,mBAAmB;AACrC,6BAAqB,mBAAmB;AACxC,eAAO;AAAA,UAAC;AAAA;AAAA,YACN,cAAc,gBAAgB,CAAC;AAAA,YAC/B,UAAU,MAAM;AAAA,YACf,GAAG,mBAAmB,MAAM,gBAAgB,iBAAiB;AAAA;AAAA,QAChE;AAAA,MACF;AAAA,MACA,KAAK,eAAe,gBAAgB;AAClC,6BAAqB,gBAAgB;AACrC,eAAO;AAAA,UAAC;AAAA;AAAA,YACN,cAAc,gBAAgB,CAAC;AAAA,YAC/B,UAAU,MAAM;AAAA,YACf,GAAG,mBAAmB,MAAM,gBAAgB,cAAc;AAAA;AAAA,QAC7D;AAAA,MACF;AAAA,MACA,KAAK,eAAe,iBAAiB;AACnC,eAAO;AAAA,UAAC;AAAA;AAAA,YACN,UAAU,MAAM;AAAA,YACf,GAAG,mBAAmB,MAAM,gBAAgB,eAAe;AAAA;AAAA,QAC9D;AAAA,MACF;AAAA,MACA,KAAK,eAAe,OAAO;AACzB,eAAO;AAAA,UAAC;AAAA;AAAA,YACN,cAAc,gBAAgB,CAAC;AAAA,YAC/B,UAAU,MAAM;AAAA,YACf,GAAG,mBAAmB,MAAM,gBAAgB,SAAS;AAAA;AAAA,QACxD;AAAA,MACF;AAAA,MACA,SAAS;AACP,YAAI,OAAO,OAAO,cAAc,EAAE,SAAS,IAAI,GAAG;AAChD,gBAAM,IAAI,oBAAoB,cAAc,IAAI,6DAA6D,EAAE,eAAe,CAAC;AAAA,QACjI;AACA,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,WAAW,GAAG;AACtD,cAAI,SAAS,IAAI,YAAY,EAAE,WAAW,KAAK,EAAE,GAAG;AAClD,qBAAS,GAAG,MAAM,IAAI,KAAK,OAAO,IAAI,KAAK,IAAI,IAAI,gBAAgB,YAAY,EAAE,SAAS,CAAC,IAAI,aAAa,OAAO;AAAA,UACrH;AAAA,QACF;AACA,eAAO,SAAS;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,iCACJ;AAAA,YAAQ,IAAI,aAAa,iBAAiB,EAAE,gBAAgB,UAC3D,qBAAC,UAAK,OAAO,EAAE,OAAO,MAAM,GACzB;AAAA;AAAA,MAAyB;AAAA,OAC5B;AAAA,IAED,OAAO;AAAA,KACV;AACF;AAGA,SAAS,mBAAiC,OAAsD;AAC9F,SAAO,UAAU,SAAY,QAAQ,gBAAgB,KAAK;AAC5D;","names":[]}
|