@stackframe/stack 2.7.19 → 2.7.20

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 (72) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/components/credential-sign-in.js +2 -1
  3. package/dist/components/credential-sign-in.js.map +1 -1
  4. package/dist/components/elements/sidebar-layout.js +10 -7
  5. package/dist/components/elements/sidebar-layout.js.map +1 -1
  6. package/dist/components/link.d.mts +14 -0
  7. package/dist/components/link.d.ts +14 -0
  8. package/dist/components/link.js +63 -0
  9. package/dist/components/link.js.map +1 -0
  10. package/dist/components/selected-team-switcher.js +4 -5
  11. package/dist/components/selected-team-switcher.js.map +1 -1
  12. package/dist/components-page/account-settings.js +2 -3
  13. package/dist/components-page/account-settings.js.map +1 -1
  14. package/dist/components-page/auth-page.js +3 -2
  15. package/dist/components-page/auth-page.js.map +1 -1
  16. package/dist/components-page/forgot-password.js +2 -1
  17. package/dist/components-page/forgot-password.js.map +1 -1
  18. package/dist/components-page/oauth-callback.js +4 -4
  19. package/dist/components-page/oauth-callback.js.map +1 -1
  20. package/dist/components-page/stack-handler.d.mts +5 -3
  21. package/dist/components-page/stack-handler.d.ts +5 -3
  22. package/dist/components-page/stack-handler.js +173 -157
  23. package/dist/components-page/stack-handler.js.map +1 -1
  24. package/dist/components-page/team-creation.js +2 -3
  25. package/dist/components-page/team-creation.js.map +1 -1
  26. package/dist/esm/components/credential-sign-in.js +2 -1
  27. package/dist/esm/components/credential-sign-in.js.map +1 -1
  28. package/dist/esm/components/elements/sidebar-layout.js +10 -7
  29. package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
  30. package/dist/esm/components/link.js +28 -0
  31. package/dist/esm/components/link.js.map +1 -0
  32. package/dist/esm/components/selected-team-switcher.js +4 -5
  33. package/dist/esm/components/selected-team-switcher.js.map +1 -1
  34. package/dist/esm/components-page/account-settings.js +2 -3
  35. package/dist/esm/components-page/account-settings.js.map +1 -1
  36. package/dist/esm/components-page/auth-page.js +2 -1
  37. package/dist/esm/components-page/auth-page.js.map +1 -1
  38. package/dist/esm/components-page/forgot-password.js +2 -1
  39. package/dist/esm/components-page/forgot-password.js.map +1 -1
  40. package/dist/esm/components-page/oauth-callback.js +4 -4
  41. package/dist/esm/components-page/oauth-callback.js.map +1 -1
  42. package/dist/esm/components-page/stack-handler.js +173 -157
  43. package/dist/esm/components-page/stack-handler.js.map +1 -1
  44. package/dist/esm/components-page/team-creation.js +2 -3
  45. package/dist/esm/components-page/team-creation.js.map +1 -1
  46. package/dist/esm/lib/stack-app.js +34 -13
  47. package/dist/esm/lib/stack-app.js.map +1 -1
  48. package/dist/esm/providers/stack-provider-client.js +1 -2
  49. package/dist/esm/providers/stack-provider-client.js.map +1 -1
  50. package/dist/esm/providers/stack-provider.js +8 -7
  51. package/dist/esm/providers/stack-provider.js.map +1 -1
  52. package/dist/esm/providers/translation-provider.js +1 -1
  53. package/dist/esm/providers/translation-provider.js.map +1 -1
  54. package/dist/generated/quetzal-translations.d.mts +2 -2
  55. package/dist/generated/quetzal-translations.d.ts +2 -2
  56. package/dist/lib/stack-app.d.mts +5 -1
  57. package/dist/lib/stack-app.d.ts +5 -1
  58. package/dist/lib/stack-app.js +34 -13
  59. package/dist/lib/stack-app.js.map +1 -1
  60. package/dist/providers/stack-provider-client.d.mts +2 -1
  61. package/dist/providers/stack-provider-client.d.ts +2 -1
  62. package/dist/providers/stack-provider-client.js +1 -2
  63. package/dist/providers/stack-provider-client.js.map +1 -1
  64. package/dist/providers/stack-provider.d.mts +2 -2
  65. package/dist/providers/stack-provider.d.ts +2 -2
  66. package/dist/providers/stack-provider.js +8 -7
  67. package/dist/providers/stack-provider.js.map +1 -1
  68. package/dist/providers/translation-provider.d.mts +1 -1
  69. package/dist/providers/translation-provider.d.ts +1 -1
  70. package/dist/providers/translation-provider.js +1 -1
  71. package/dist/providers/translation-provider.js.map +1 -1
  72. package/package.json +5 -5
@@ -2,12 +2,12 @@
2
2
  "use client";
3
3
 
4
4
  // src/components-page/oauth-callback.tsx
5
- import { useRef, useEffect, useState } from "react";
6
- import { useStackApp } from "..";
5
+ import { captureError } from "@stackframe/stack-shared/dist/utils/errors";
7
6
  import { runAsynchronously } from "@stackframe/stack-shared/dist/utils/promises";
7
+ import { useEffect, useRef, useState } from "react";
8
+ import { useStackApp } from "..";
9
+ import { StyledLink } from "../components/link";
8
10
  import { MessageCard } from "../components/message-cards/message-card";
9
- import { StyledLink } from "@stackframe/stack-ui";
10
- import { captureError } from "@stackframe/stack-shared/dist/utils/errors";
11
11
  import { useTranslation } from "../lib/translations";
12
12
  import { jsx, jsxs } from "react/jsx-runtime";
13
13
  function OAuthCallback(props) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components-page/oauth-callback.tsx"],"sourcesContent":["'use client';\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\n\nimport { useRef, useEffect, useState } from \"react\";\nimport { useStackApp } from \"..\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { StyledLink } from \"@stackframe/stack-ui\";\nimport { captureError } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { useTranslation } from \"../lib/translations\";\n\nexport function OAuthCallback(props: { fullPage?: boolean }) {\n const { t } = useTranslation();\n const app = useStackApp();\n const called = useRef(false);\n const [error, setError] = useState<unknown>(null);\n const [showRedirectLink, setShowRedirectLink] = useState(false);\n\n useEffect(() => runAsynchronously(async () => {\n if (called.current) return;\n called.current = true;\n let hasRedirected = false;\n try {\n hasRedirected = await app.callOAuthCallback();\n } catch (e: any) {\n captureError(\"<OAuthCallback />\", e);\n setError(e);\n }\n if (!hasRedirected && (!error || process.env.NODE_ENV === 'production')) {\n await app.redirectToSignIn({ noRedirectBack: true });\n }\n }), []);\n\n useEffect(() => {\n setTimeout(() => setShowRedirectLink(true), 3000);\n }, []);\n\n return <MessageCard title='Redirecting...' fullPage={props.fullPage}>\n {showRedirectLink ? <p>{t('If you are not redirected automatically, ')}<StyledLink href={app.urls.home}>{t(\"click here\")}</StyledLink></p> : null}\n {error ? <div>\n <p>{t(\"Something went wrong while processing the OAuth callback:\")}</p>\n <pre>{JSON.stringify(error, null, 2)}</pre>\n <p>{t(\"This is most likely an error in Stack. Please report it.\")}</p>\n </div> : null}\n </MessageCard>;\n}\n"],"mappings":";;;AAOA,SAAS,QAAQ,WAAW,gBAAgB;AAC5C,SAAS,mBAAmB;AAC5B,SAAS,yBAAyB;AAClC,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AA6BP,SAAmD,KAAnD;AA3BjB,SAAS,cAAc,OAA+B;AAC3D,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,MAAM,YAAY;AACxB,QAAM,SAAS,OAAO,KAAK;AAC3B,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAkB,IAAI;AAChD,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,KAAK;AAE9D,YAAU,MAAM,kBAAkB,YAAY;AAC5C,QAAI,OAAO,QAAS;AACpB,WAAO,UAAU;AACjB,QAAI,gBAAgB;AACpB,QAAI;AACF,sBAAgB,MAAM,IAAI,kBAAkB;AAAA,IAC9C,SAAS,GAAQ;AACf,mBAAa,qBAAqB,CAAC;AACnC,eAAS,CAAC;AAAA,IACZ;AACA,QAAI,CAAC,kBAAkB,CAAC,SAAS,QAAQ,IAAI,aAAa,eAAe;AACvE,YAAM,IAAI,iBAAiB,EAAE,gBAAgB,KAAK,CAAC;AAAA,IACrD;AAAA,EACF,CAAC,GAAG,CAAC,CAAC;AAEN,YAAU,MAAM;AACd,eAAW,MAAM,oBAAoB,IAAI,GAAG,GAAI;AAAA,EAClD,GAAG,CAAC,CAAC;AAEL,SAAO,qBAAC,eAAY,OAAM,kBAAiB,UAAU,MAAM,UACxD;AAAA,uBAAmB,qBAAC,OAAG;AAAA,QAAE,2CAA2C;AAAA,MAAE,oBAAC,cAAW,MAAM,IAAI,KAAK,MAAO,YAAE,YAAY,GAAE;AAAA,OAAa,IAAO;AAAA,IAC5I,QAAQ,qBAAC,SACR;AAAA,0BAAC,OAAG,YAAE,2DAA2D,GAAE;AAAA,MACnE,oBAAC,SAAK,eAAK,UAAU,OAAO,MAAM,CAAC,GAAE;AAAA,MACrC,oBAAC,OAAG,YAAE,0DAA0D,GAAE;AAAA,OACpE,IAAS;AAAA,KACX;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/components-page/oauth-callback.tsx"],"sourcesContent":["'use client';\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\n\nimport { captureError } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useStackApp } from \"..\";\nimport { StyledLink } from \"../components/link\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\nexport function OAuthCallback(props: { fullPage?: boolean }) {\n const { t } = useTranslation();\n const app = useStackApp();\n const called = useRef(false);\n const [error, setError] = useState<unknown>(null);\n const [showRedirectLink, setShowRedirectLink] = useState(false);\n\n useEffect(() => runAsynchronously(async () => {\n if (called.current) return;\n called.current = true;\n let hasRedirected = false;\n try {\n hasRedirected = await app.callOAuthCallback();\n } catch (e: any) {\n captureError(\"<OAuthCallback />\", e);\n setError(e);\n }\n if (!hasRedirected && (!error || process.env.NODE_ENV === 'production')) {\n await app.redirectToSignIn({ noRedirectBack: true });\n }\n }), []);\n\n useEffect(() => {\n setTimeout(() => setShowRedirectLink(true), 3000);\n }, []);\n\n return <MessageCard title='Redirecting...' fullPage={props.fullPage}>\n {showRedirectLink ? <p>{t('If you are not redirected automatically, ')}<StyledLink href={app.urls.home}>{t(\"click here\")}</StyledLink></p> : null}\n {error ? <div>\n <p>{t(\"Something went wrong while processing the OAuth callback:\")}</p>\n <pre>{JSON.stringify(error, null, 2)}</pre>\n <p>{t(\"This is most likely an error in Stack. Please report it.\")}</p>\n </div> : null}\n </MessageCard>;\n}\n"],"mappings":";;;AAOA,SAAS,oBAAoB;AAC7B,SAAS,yBAAyB;AAClC,SAAS,WAAW,QAAQ,gBAAgB;AAC5C,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AA6BP,SAAmD,KAAnD;AA3BjB,SAAS,cAAc,OAA+B;AAC3D,QAAM,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,MAAM,YAAY;AACxB,QAAM,SAAS,OAAO,KAAK;AAC3B,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAkB,IAAI;AAChD,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,KAAK;AAE9D,YAAU,MAAM,kBAAkB,YAAY;AAC5C,QAAI,OAAO,QAAS;AACpB,WAAO,UAAU;AACjB,QAAI,gBAAgB;AACpB,QAAI;AACF,sBAAgB,MAAM,IAAI,kBAAkB;AAAA,IAC9C,SAAS,GAAQ;AACf,mBAAa,qBAAqB,CAAC;AACnC,eAAS,CAAC;AAAA,IACZ;AACA,QAAI,CAAC,kBAAkB,CAAC,SAAS,QAAQ,IAAI,aAAa,eAAe;AACvE,YAAM,IAAI,iBAAiB,EAAE,gBAAgB,KAAK,CAAC;AAAA,IACrD;AAAA,EACF,CAAC,GAAG,CAAC,CAAC;AAEN,YAAU,MAAM;AACd,eAAW,MAAM,oBAAoB,IAAI,GAAG,GAAI;AAAA,EAClD,GAAG,CAAC,CAAC;AAEL,SAAO,qBAAC,eAAY,OAAM,kBAAiB,UAAU,MAAM,UACxD;AAAA,uBAAmB,qBAAC,OAAG;AAAA,QAAE,2CAA2C;AAAA,MAAE,oBAAC,cAAW,MAAM,IAAI,KAAK,MAAO,YAAE,YAAY,GAAE;AAAA,OAAa,IAAO;AAAA,IAC5I,QAAQ,qBAAC,SACR;AAAA,0BAAC,OAAG,YAAE,2DAA2D,GAAE;AAAA,MACnE,oBAAC,SAAK,eAAK,UAAU,OAAO,MAAM,CAAC,GAAE;AAAA,MACrC,oBAAC,OAAG,YAAE,0DAA0D,GAAE;AAAA,OACpE,IAAS;AAAA,KACX;AACF;","names":[]}
@@ -17,7 +17,158 @@ import { SignOut } from "./sign-out";
17
17
  import { TeamInvitation } from "./team-invitation";
18
18
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
19
19
  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`.";
20
- async function StackHandler(props) {
20
+ var availablePaths = {
21
+ signIn: "sign-in",
22
+ signUp: "sign-up",
23
+ emailVerification: "email-verification",
24
+ passwordReset: "password-reset",
25
+ forgotPassword: "forgot-password",
26
+ signOut: "sign-out",
27
+ oauthCallback: "oauth-callback",
28
+ magicLinkCallback: "magic-link-callback",
29
+ teamInvitation: "team-invitation",
30
+ accountSettings: "account-settings",
31
+ error: "error"
32
+ };
33
+ var pathAliases = {
34
+ // also includes the uppercase and non-dashed versions
35
+ ...Object.fromEntries(Object.entries(availablePaths).map(([key, value]) => [value, value])),
36
+ "log-in": availablePaths.signIn,
37
+ "register": availablePaths.signUp
38
+ };
39
+ function renderComponent(props) {
40
+ const { path, searchParams, fullPage, componentProps, redirectIfNotHandler, onNotFound, app } = props;
41
+ switch (path) {
42
+ case availablePaths.signIn: {
43
+ redirectIfNotHandler?.("signIn");
44
+ return /* @__PURE__ */ jsx(
45
+ SignIn,
46
+ {
47
+ fullPage,
48
+ automaticRedirect: true,
49
+ ...filterUndefinedINU(componentProps?.SignIn)
50
+ }
51
+ );
52
+ }
53
+ case availablePaths.signUp: {
54
+ redirectIfNotHandler?.("signUp");
55
+ return /* @__PURE__ */ jsx(
56
+ SignUp,
57
+ {
58
+ fullPage,
59
+ automaticRedirect: true,
60
+ ...filterUndefinedINU(componentProps?.SignUp)
61
+ }
62
+ );
63
+ }
64
+ case availablePaths.emailVerification: {
65
+ redirectIfNotHandler?.("emailVerification");
66
+ return /* @__PURE__ */ jsx(
67
+ EmailVerification,
68
+ {
69
+ searchParams,
70
+ fullPage,
71
+ ...filterUndefinedINU(componentProps?.EmailVerification)
72
+ }
73
+ );
74
+ }
75
+ case availablePaths.passwordReset: {
76
+ redirectIfNotHandler?.("passwordReset");
77
+ return /* @__PURE__ */ jsx(
78
+ PasswordReset,
79
+ {
80
+ searchParams,
81
+ fullPage,
82
+ ...filterUndefinedINU(componentProps?.PasswordReset)
83
+ }
84
+ );
85
+ }
86
+ case availablePaths.forgotPassword: {
87
+ redirectIfNotHandler?.("forgotPassword");
88
+ return /* @__PURE__ */ jsx(
89
+ ForgotPassword,
90
+ {
91
+ fullPage,
92
+ ...filterUndefinedINU(componentProps?.ForgotPassword)
93
+ }
94
+ );
95
+ }
96
+ case availablePaths.signOut: {
97
+ redirectIfNotHandler?.("signOut");
98
+ return /* @__PURE__ */ jsx(
99
+ SignOut,
100
+ {
101
+ fullPage,
102
+ ...filterUndefinedINU(componentProps?.SignOut)
103
+ }
104
+ );
105
+ }
106
+ case availablePaths.oauthCallback: {
107
+ redirectIfNotHandler?.("oauthCallback");
108
+ return /* @__PURE__ */ jsx(
109
+ OAuthCallback,
110
+ {
111
+ fullPage,
112
+ ...filterUndefinedINU(componentProps?.OAuthCallback)
113
+ }
114
+ );
115
+ }
116
+ case availablePaths.magicLinkCallback: {
117
+ redirectIfNotHandler?.("magicLinkCallback");
118
+ return /* @__PURE__ */ jsx(
119
+ MagicLinkCallback,
120
+ {
121
+ searchParams,
122
+ fullPage,
123
+ ...filterUndefinedINU(componentProps?.MagicLinkCallback)
124
+ }
125
+ );
126
+ }
127
+ case availablePaths.teamInvitation: {
128
+ redirectIfNotHandler?.("teamInvitation");
129
+ return /* @__PURE__ */ jsx(
130
+ TeamInvitation,
131
+ {
132
+ searchParams,
133
+ fullPage,
134
+ ...filterUndefinedINU(componentProps?.TeamInvitation)
135
+ }
136
+ );
137
+ }
138
+ case availablePaths.accountSettings: {
139
+ return /* @__PURE__ */ jsx(
140
+ AccountSettings,
141
+ {
142
+ fullPage,
143
+ ...filterUndefinedINU(componentProps?.AccountSettings)
144
+ }
145
+ );
146
+ }
147
+ case availablePaths.error: {
148
+ return /* @__PURE__ */ jsx(
149
+ ErrorPage,
150
+ {
151
+ searchParams,
152
+ fullPage,
153
+ ...filterUndefinedINU(componentProps?.ErrorPage)
154
+ }
155
+ );
156
+ }
157
+ default: {
158
+ if (Object.values(availablePaths).includes(path)) {
159
+ throw new StackAssertionError(`Path alias ${path} not included in switch statement, but in availablePaths?`, { availablePaths });
160
+ }
161
+ for (const [key, value] of Object.entries(pathAliases)) {
162
+ if (path === key.toLowerCase().replaceAll("-", "")) {
163
+ const redirectUrl = `${app.urls.handler}/${value}?${new URLSearchParams(searchParams).toString()}`;
164
+ return { redirect: redirectUrl };
165
+ }
166
+ }
167
+ return onNotFound();
168
+ }
169
+ }
170
+ }
171
+ async function NextStackHandler(props) {
21
172
  if (!("routeProps" in props)) {
22
173
  console.warn(next15DeprecationWarning);
23
174
  }
@@ -31,181 +182,46 @@ async function StackHandler(props) {
31
182
  " at this location. Make sure that the file is in a folder called [...stack] and you are passing the routeProps prop."
32
183
  ] }) });
33
184
  }
34
- function redirectIfNotHandler(name) {
185
+ const path = params.stack.join("/");
186
+ const redirectIfNotHandler = (name) => {
35
187
  const url = props.app.urls[name];
36
188
  const handlerUrl = props.app.urls.handler;
37
189
  if (url !== handlerUrl && url.startsWith(handlerUrl + "/")) {
38
190
  return;
39
191
  }
40
192
  const urlObj = new URL(url, "http://example.com");
41
- for (const [key, value] of Object.entries(routeProps.searchParams || {})) {
42
- urlObj.searchParams.set(key, value);
43
- }
44
- redirect(getRelativePart(urlObj), RedirectType.replace);
45
- }
46
- ;
47
- const availablePaths = {
48
- signIn: "sign-in",
49
- signUp: "sign-up",
50
- emailVerification: "email-verification",
51
- passwordReset: "password-reset",
52
- forgotPassword: "forgot-password",
53
- signOut: "sign-out",
54
- oauthCallback: "oauth-callback",
55
- magicLinkCallback: "magic-link-callback",
56
- teamInvitation: "team-invitation",
57
- accountSettings: "account-settings",
58
- error: "error"
59
- };
60
- const pathAliases = {
61
- // also includes the uppercase and non-dashed versions
62
- ...Object.fromEntries(Object.entries(availablePaths).map(([key, value]) => [value, value])),
63
- "log-in": availablePaths.signIn,
64
- "register": availablePaths.signUp
65
- };
66
- const path = params.stack.join("/");
67
- const render = () => {
68
- switch (path) {
69
- case availablePaths.signIn: {
70
- redirectIfNotHandler("signIn");
71
- return /* @__PURE__ */ jsx(
72
- SignIn,
73
- {
74
- fullPage: props.fullPage,
75
- automaticRedirect: true,
76
- ...filterUndefinedINU(props.componentProps?.SignIn)
77
- }
78
- );
79
- }
80
- case availablePaths.signUp: {
81
- redirectIfNotHandler("signUp");
82
- return /* @__PURE__ */ jsx(
83
- SignUp,
84
- {
85
- fullPage: props.fullPage,
86
- automaticRedirect: true,
87
- ...filterUndefinedINU(props.componentProps?.SignUp)
88
- }
89
- );
90
- }
91
- case availablePaths.emailVerification: {
92
- redirectIfNotHandler("emailVerification");
93
- return /* @__PURE__ */ jsx(
94
- EmailVerification,
95
- {
96
- searchParams,
97
- fullPage: props.fullPage,
98
- ...filterUndefinedINU(props.componentProps?.EmailVerification)
99
- }
100
- );
101
- }
102
- case availablePaths.passwordReset: {
103
- redirectIfNotHandler("passwordReset");
104
- return /* @__PURE__ */ jsx(
105
- PasswordReset,
106
- {
107
- searchParams: searchParams || {},
108
- fullPage: props.fullPage,
109
- ...filterUndefinedINU(props.componentProps?.PasswordReset)
110
- }
111
- );
112
- }
113
- case availablePaths.forgotPassword: {
114
- redirectIfNotHandler("forgotPassword");
115
- return /* @__PURE__ */ jsx(
116
- ForgotPassword,
117
- {
118
- fullPage: props.fullPage,
119
- ...filterUndefinedINU(props.componentProps?.ForgotPassword)
120
- }
121
- );
122
- }
123
- case availablePaths.signOut: {
124
- redirectIfNotHandler("signOut");
125
- return /* @__PURE__ */ jsx(
126
- SignOut,
127
- {
128
- fullPage: props.fullPage,
129
- ...filterUndefinedINU(props.componentProps?.SignOut)
130
- }
131
- );
132
- }
133
- case availablePaths.oauthCallback: {
134
- redirectIfNotHandler("oauthCallback");
135
- return /* @__PURE__ */ jsx(
136
- OAuthCallback,
137
- {
138
- fullPage: props.fullPage,
139
- ...filterUndefinedINU(props.componentProps?.OAuthCallback)
140
- }
141
- );
142
- }
143
- case availablePaths.magicLinkCallback: {
144
- redirectIfNotHandler("magicLinkCallback");
145
- return /* @__PURE__ */ jsx(
146
- MagicLinkCallback,
147
- {
148
- searchParams: searchParams || {},
149
- fullPage: props.fullPage,
150
- ...filterUndefinedINU(props.componentProps?.MagicLinkCallback)
151
- }
152
- );
153
- }
154
- case availablePaths.teamInvitation: {
155
- redirectIfNotHandler("teamInvitation");
156
- return /* @__PURE__ */ jsx(
157
- TeamInvitation,
158
- {
159
- searchParams: searchParams || {},
160
- fullPage: props.fullPage,
161
- ...filterUndefinedINU(props.componentProps?.TeamInvitation)
162
- }
163
- );
164
- }
165
- case availablePaths.accountSettings: {
166
- return /* @__PURE__ */ jsx(
167
- AccountSettings,
168
- {
169
- fullPage: props.fullPage,
170
- ...filterUndefinedINU(props.componentProps?.AccountSettings)
171
- }
172
- );
173
- }
174
- case availablePaths.error: {
175
- return /* @__PURE__ */ jsx(
176
- ErrorPage,
177
- {
178
- searchParams: searchParams || {},
179
- fullPage: props.fullPage,
180
- ...filterUndefinedINU(props.componentProps?.ErrorPage)
181
- }
182
- );
183
- }
184
- default: {
185
- if (Object.values(availablePaths).includes(path)) {
186
- throw new StackAssertionError(`Path alias ${path} not included in switch statement, but in availablePaths?`, { availablePaths });
187
- }
188
- for (const [key, value] of Object.entries(pathAliases)) {
189
- if (path === key.toLowerCase().replaceAll("-", "")) {
190
- redirect(`${props.app.urls.handler}/${value}?${new URLSearchParams(searchParams).toString()}`, RedirectType.replace);
191
- }
192
- }
193
- return notFound();
193
+ if (searchParams) {
194
+ for (const [key, value] of Object.entries(searchParams)) {
195
+ urlObj.searchParams.set(key, value);
194
196
  }
195
197
  }
198
+ redirect(getRelativePart(urlObj), RedirectType.replace);
196
199
  };
200
+ const result = renderComponent({
201
+ path,
202
+ searchParams: searchParams ?? {},
203
+ fullPage: props.fullPage,
204
+ componentProps: props.componentProps,
205
+ redirectIfNotHandler,
206
+ onNotFound: () => notFound(),
207
+ app: props.app
208
+ });
209
+ if (result && "redirect" in result) {
210
+ redirect(result.redirect, RedirectType.replace);
211
+ }
197
212
  return /* @__PURE__ */ jsxs(Fragment, { children: [
198
213
  process.env.NODE_ENV === "development" && !("routeProps" in props) && /* @__PURE__ */ jsxs("span", { style: { color: "red" }, children: [
199
214
  next15DeprecationWarning,
200
215
  ". This warning will not be shown in production."
201
216
  ] }),
202
- /* @__PURE__ */ jsx(IframePreventer, { children: render() })
217
+ /* @__PURE__ */ jsx(IframePreventer, { children: result })
203
218
  ] });
204
219
  }
220
+ var stack_handler_default = NextStackHandler;
205
221
  function filterUndefinedINU(value) {
206
222
  return value === void 0 ? value : filterUndefined(value);
207
223
  }
208
224
  export {
209
- StackHandler as default
225
+ stack_handler_default as default
210
226
  };
211
227
  //# sourceMappingURL=stack-handler.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components-page/stack-handler.tsx"],"sourcesContent":["//===========================================\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, 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 { IframePreventer } from \"../components/iframe-preventer\";\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}`. You can fix this by updating the code in the file `app/handler/[...stack]/route.tsx`.\";\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 <IframePreventer>\n {render()}\n </IframePreventer>\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":["//===========================================\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, 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 { useMemo } from 'react';\nimport { SignIn, SignUp, StackServerApp } from \"..\";\nimport { IframePreventer } from \"../components/iframe-preventer\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { HandlerUrls, StackClientApp } 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}`. 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 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 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 <IframePreventer>\n {result}\n </IframePreventer>\n </>;\n}\n\n\nexport default NextStackHandler;\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":[]}
@@ -6,7 +6,6 @@ import { yupResolver } from "@hookform/resolvers/yup";
6
6
  import { yupObject, yupString } from "@stackframe/stack-shared/dist/schema-fields";
7
7
  import { runAsynchronously } from "@stackframe/stack-shared/dist/utils/promises";
8
8
  import { Button, Input, Label, Typography } from "@stackframe/stack-ui";
9
- import { useRouter } from "next/navigation";
10
9
  import { useState } from "react";
11
10
  import { useForm } from "react-hook-form";
12
11
  import { MessageCard, useStackApp, useUser } from "..";
@@ -26,7 +25,7 @@ function TeamCreation(props) {
26
25
  const project = app.useProject();
27
26
  const user = useUser({ or: "redirect" });
28
27
  const [loading, setLoading] = useState(false);
29
- const router = useRouter();
28
+ const navigate = app.useNavigate();
30
29
  if (!project.config.clientTeamCreationEnabled) {
31
30
  return /* @__PURE__ */ jsx(MessageCard, { title: t("Team creation is not enabled") });
32
31
  }
@@ -34,7 +33,7 @@ function TeamCreation(props) {
34
33
  setLoading(true);
35
34
  try {
36
35
  const team = await user.createTeam({ displayName: data.displayName });
37
- router.push(`${app.urls.handler}/team-settings/${team.id}`);
36
+ navigate(`${app.urls.handler}/team-settings/${team.id}`);
38
37
  } finally {
39
38
  setLoading(false);
40
39
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components-page/team-creation.tsx"],"sourcesContent":["'use client';\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\n\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { yupObject, yupString } from \"@stackframe/stack-shared/dist/schema-fields\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Button, Input, Label, Typography } from \"@stackframe/stack-ui\";\nimport { useRouter } from \"next/navigation\";\nimport { useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { MessageCard, useStackApp, useUser } from \"..\";\nimport { FormWarningText } from \"../components/elements/form-warning\";\nimport { MaybeFullPage } from \"../components/elements/maybe-full-page\";\nimport { useTranslation } from \"../lib/translations\";\n\nexport function TeamCreation(props: { fullPage?: boolean }) {\n const { t } = useTranslation();\n\n const schema = yupObject({\n displayName: yupString().defined().nonEmpty(t('Please enter a team name')),\n });\n\n const { register, handleSubmit, formState: { errors } } = useForm({\n resolver: yupResolver(schema)\n });\n const app = useStackApp();\n const project = app.useProject();\n const user = useUser({ or: 'redirect' });\n const [loading, setLoading] = useState(false);\n const router = useRouter();\n\n if (!project.config.clientTeamCreationEnabled) {\n return <MessageCard title={t('Team creation is not enabled')} />;\n }\n\n const onSubmit = async (data: yup.InferType<typeof schema>) => {\n setLoading(true);\n\n try {\n const team = await user.createTeam({ displayName: data.displayName });\n router.push(`${app.urls.handler}/team-settings/${team.id}`);\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <MaybeFullPage fullPage={!!props.fullPage}>\n <div className='stack-scope flex flex-col items-stretch' style={{ maxWidth: '380px', flexBasis: '380px', padding: props.fullPage ? '1rem' : 0 }}>\n <div className=\"text-center mb-6\">\n <Typography type='h2'>\n {t('Create a Team')}\n </Typography>\n </div>\n <form\n className=\"flex flex-col items-stretch stack-scope\"\n onSubmit={e => runAsynchronously(handleSubmit(onSubmit)(e))}\n noValidate\n >\n <Label htmlFor=\"display-name\" className=\"mb-1\">{t('Display name')}</Label>\n <Input\n id=\"display-name\"\n {...register('displayName')}\n />\n <FormWarningText text={errors.displayName?.message?.toString()} />\n\n <Button type=\"submit\" className=\"mt-6\" loading={loading}>\n {t('Create')}\n </Button>\n </form>\n </div>\n </MaybeFullPage>\n );\n}\n"],"mappings":";;;AAOA,SAAS,mBAAmB;AAC5B,SAAS,WAAW,iBAAiB;AACrC,SAAS,yBAAyB;AAClC,SAAS,QAAQ,OAAO,OAAO,kBAAkB;AACjD,SAAS,iBAAiB;AAC1B,SAAS,gBAAgB;AACzB,SAAS,eAAe;AAExB,SAAS,aAAa,aAAa,eAAe;AAClD,SAAS,uBAAuB;AAChC,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB;AAmBpB,cAsBH,YAtBG;AAjBJ,SAAS,aAAa,OAA+B;AAC1D,QAAM,EAAE,EAAE,IAAI,eAAe;AAE7B,QAAM,SAAS,UAAU;AAAA,IACvB,aAAa,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,0BAA0B,CAAC;AAAA,EAC3E,CAAC;AAED,QAAM,EAAE,UAAU,cAAc,WAAW,EAAE,OAAO,EAAE,IAAI,QAAQ;AAAA,IAChE,UAAU,YAAY,MAAM;AAAA,EAC9B,CAAC;AACD,QAAM,MAAM,YAAY;AACxB,QAAM,UAAU,IAAI,WAAW;AAC/B,QAAM,OAAO,QAAQ,EAAE,IAAI,WAAW,CAAC;AACvC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,SAAS,UAAU;AAEzB,MAAI,CAAC,QAAQ,OAAO,2BAA2B;AAC7C,WAAO,oBAAC,eAAY,OAAO,EAAE,8BAA8B,GAAG;AAAA,EAChE;AAEA,QAAM,WAAW,OAAO,SAAuC;AAC7D,eAAW,IAAI;AAEf,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,WAAW,EAAE,aAAa,KAAK,YAAY,CAAC;AACpE,aAAO,KAAK,GAAG,IAAI,KAAK,OAAO,kBAAkB,KAAK,EAAE,EAAE;AAAA,IAC5D,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,SACE,oBAAC,iBAAc,UAAU,CAAC,CAAC,MAAM,UAC/B,+BAAC,SAAI,WAAU,2CAA0C,OAAO,EAAE,UAAU,SAAS,WAAW,SAAS,SAAS,MAAM,WAAW,SAAS,EAAE,GAC5I;AAAA,wBAAC,SAAI,WAAU,oBACb,8BAAC,cAAW,MAAK,MACd,YAAE,eAAe,GACpB,GACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,UAAU,OAAK,kBAAkB,aAAa,QAAQ,EAAE,CAAC,CAAC;AAAA,QAC1D,YAAU;AAAA,QAEV;AAAA,8BAAC,SAAM,SAAQ,gBAAe,WAAU,QAAQ,YAAE,cAAc,GAAE;AAAA,UAClE;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACF,GAAG,SAAS,aAAa;AAAA;AAAA,UAC5B;AAAA,UACA,oBAAC,mBAAgB,MAAM,OAAO,aAAa,SAAS,SAAS,GAAG;AAAA,UAEhE,oBAAC,UAAO,MAAK,UAAS,WAAU,QAAO,SACpC,YAAE,QAAQ,GACb;AAAA;AAAA;AAAA,IACF;AAAA,KACF,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components-page/team-creation.tsx"],"sourcesContent":["'use client';\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\n\nimport { yupResolver } from \"@hookform/resolvers/yup\";\nimport { yupObject, yupString } from \"@stackframe/stack-shared/dist/schema-fields\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Button, Input, Label, Typography } from \"@stackframe/stack-ui\";\nimport { useState } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport * as yup from \"yup\";\nimport { MessageCard, useStackApp, useUser } from \"..\";\nimport { FormWarningText } from \"../components/elements/form-warning\";\nimport { MaybeFullPage } from \"../components/elements/maybe-full-page\";\nimport { useTranslation } from \"../lib/translations\";\n\nexport function TeamCreation(props: { fullPage?: boolean }) {\n const { t } = useTranslation();\n\n const schema = yupObject({\n displayName: yupString().defined().nonEmpty(t('Please enter a team name')),\n });\n\n const { register, handleSubmit, formState: { errors } } = useForm({\n resolver: yupResolver(schema)\n });\n const app = useStackApp();\n const project = app.useProject();\n const user = useUser({ or: 'redirect' });\n const [loading, setLoading] = useState(false);\n const navigate = app.useNavigate();\n\n if (!project.config.clientTeamCreationEnabled) {\n return <MessageCard title={t('Team creation is not enabled')} />;\n }\n\n const onSubmit = async (data: yup.InferType<typeof schema>) => {\n setLoading(true);\n\n try {\n const team = await user.createTeam({ displayName: data.displayName });\n navigate(`${app.urls.handler}/team-settings/${team.id}`);\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <MaybeFullPage fullPage={!!props.fullPage}>\n <div className='stack-scope flex flex-col items-stretch' style={{ maxWidth: '380px', flexBasis: '380px', padding: props.fullPage ? '1rem' : 0 }}>\n <div className=\"text-center mb-6\">\n <Typography type='h2'>\n {t('Create a Team')}\n </Typography>\n </div>\n <form\n className=\"flex flex-col items-stretch stack-scope\"\n onSubmit={e => runAsynchronously(handleSubmit(onSubmit)(e))}\n noValidate\n >\n <Label htmlFor=\"display-name\" className=\"mb-1\">{t('Display name')}</Label>\n <Input\n id=\"display-name\"\n {...register('displayName')}\n />\n <FormWarningText text={errors.displayName?.message?.toString()} />\n\n <Button type=\"submit\" className=\"mt-6\" loading={loading}>\n {t('Create')}\n </Button>\n </form>\n </div>\n </MaybeFullPage>\n );\n}\n"],"mappings":";;;AAOA,SAAS,mBAAmB;AAC5B,SAAS,WAAW,iBAAiB;AACrC,SAAS,yBAAyB;AAClC,SAAS,QAAQ,OAAO,OAAO,kBAAkB;AACjD,SAAS,gBAAgB;AACzB,SAAS,eAAe;AAExB,SAAS,aAAa,aAAa,eAAe;AAClD,SAAS,uBAAuB;AAChC,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB;AAmBpB,cAsBH,YAtBG;AAjBJ,SAAS,aAAa,OAA+B;AAC1D,QAAM,EAAE,EAAE,IAAI,eAAe;AAE7B,QAAM,SAAS,UAAU;AAAA,IACvB,aAAa,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,0BAA0B,CAAC;AAAA,EAC3E,CAAC;AAED,QAAM,EAAE,UAAU,cAAc,WAAW,EAAE,OAAO,EAAE,IAAI,QAAQ;AAAA,IAChE,UAAU,YAAY,MAAM;AAAA,EAC9B,CAAC;AACD,QAAM,MAAM,YAAY;AACxB,QAAM,UAAU,IAAI,WAAW;AAC/B,QAAM,OAAO,QAAQ,EAAE,IAAI,WAAW,CAAC;AACvC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,WAAW,IAAI,YAAY;AAEjC,MAAI,CAAC,QAAQ,OAAO,2BAA2B;AAC7C,WAAO,oBAAC,eAAY,OAAO,EAAE,8BAA8B,GAAG;AAAA,EAChE;AAEA,QAAM,WAAW,OAAO,SAAuC;AAC7D,eAAW,IAAI;AAEf,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,WAAW,EAAE,aAAa,KAAK,YAAY,CAAC;AACpE,eAAS,GAAG,IAAI,KAAK,OAAO,kBAAkB,KAAK,EAAE,EAAE;AAAA,IACzD,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,SACE,oBAAC,iBAAc,UAAU,CAAC,CAAC,MAAM,UAC/B,+BAAC,SAAI,WAAU,2CAA0C,OAAO,EAAE,UAAU,SAAS,WAAW,SAAS,SAAS,MAAM,WAAW,SAAS,EAAE,GAC5I;AAAA,wBAAC,SAAI,WAAU,oBACb,8BAAC,cAAW,MAAK,MACd,YAAE,eAAe,GACpB,GACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,UAAU,OAAK,kBAAkB,aAAa,QAAQ,EAAE,CAAC,CAAC;AAAA,QAC1D,YAAU;AAAA,QAEV;AAAA,8BAAC,SAAM,SAAQ,gBAAe,WAAU,QAAQ,YAAE,cAAc,GAAE;AAAA,UAClE;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACF,GAAG,SAAS,aAAa;AAAA;AAAA,UAC5B;AAAA,UACA,oBAAC,mBAAgB,MAAM,OAAO,aAAa,SAAS,SAAS,GAAG;AAAA,UAEhE,oBAAC,UAAO,MAAK,UAAS,WAAU,QAAO,SACpC,YAAE,QAAQ,GACb;AAAA;AAAA;AAAA,IACF;AAAA,KACF,GACF;AAEJ;","names":[]}
@@ -24,10 +24,11 @@ import { constructRedirectUrl } from "../utils/url";
24
24
  import { addNewOAuthProviderOrScope, callOAuthCallback, signInWithOAuth } from "./auth";
25
25
  import { createBrowserCookieHelper, createCookieHelper, createEmptyCookieHelper, deleteCookieClient, getCookieClient, setOrDeleteCookie, setOrDeleteCookieClient } from "./cookie";
26
26
  import * as sc from "@stackframe/stack-sc";
27
+ import { cookies } from "@stackframe/stack-sc";
27
28
  var isReactServer2 = false;
28
29
  isReactServer2 = sc.isReactServer;
29
30
  var NextNavigation = scrambleDuringCompileTime(NextNavigationUnscrambled);
30
- var clientVersion = "js @stackframe/stack@2.7.19";
31
+ var clientVersion = "js @stackframe/stack@2.7.20";
31
32
  if (clientVersion.startsWith("STACK_COMPILE_TIME")) {
32
33
  throw new StackAssertionError("Client version was not replaced. Something went wrong during build!");
33
34
  }
@@ -241,7 +242,10 @@ var _StackClientAppImpl = class __StackClientAppImpl {
241
242
  getBaseUrl: () => getBaseUrl(_options.baseUrl),
242
243
  projectId: _options.projectId ?? getDefaultProjectId(),
243
244
  clientVersion,
244
- publishableClientKey: _options.publishableClientKey ?? getDefaultPublishableClientKey()
245
+ publishableClientKey: _options.publishableClientKey ?? getDefaultPublishableClientKey(),
246
+ prepareRequest: async () => {
247
+ await cookies?.();
248
+ }
245
249
  });
246
250
  }
247
251
  this._tokenStoreInit = _options.tokenStore;
@@ -345,9 +349,9 @@ var _StackClientAppImpl = class __StackClientAppImpl {
345
349
  get _refreshTokenCookieName() {
346
350
  return `stack-refresh-${this.projectId}`;
347
351
  }
348
- _getTokensFromCookies(cookies) {
349
- const refreshToken = cookies.refreshTokenCookie;
350
- const accessTokenObject = cookies.accessTokenCookie?.startsWith('["') ? JSON.parse(cookies.accessTokenCookie) : null;
352
+ _getTokensFromCookies(cookies2) {
353
+ const refreshToken = cookies2.refreshTokenCookie;
354
+ const accessTokenObject = cookies2.accessTokenCookie?.startsWith('["') ? JSON.parse(cookies2.accessTokenCookie) : null;
351
355
  const accessToken = accessTokenObject && refreshToken === accessTokenObject[0] ? accessTokenObject[1] : null;
352
356
  return {
353
357
  refreshToken,
@@ -920,16 +924,29 @@ var _StackClientAppImpl = class __StackClientAppImpl {
920
924
  async _redirectTo(options) {
921
925
  if (this._redirectMethod === "none") {
922
926
  return;
923
- }
924
- if (isReactServer2 && this._redirectMethod === "nextjs") {
927
+ } else if (isReactServer2 && this._redirectMethod === "nextjs") {
925
928
  NextNavigation.redirect(options.url.toString(), options.replace ? NextNavigation.RedirectType.replace : NextNavigation.RedirectType.push);
929
+ } else if (typeof this._redirectMethod === "object" && this._redirectMethod.navigate) {
930
+ this._redirectMethod.navigate(options.url.toString());
926
931
  } else {
927
932
  if (options.replace) {
928
933
  window.location.replace(options.url);
929
934
  } else {
930
935
  window.location.assign(options.url);
931
936
  }
932
- await wait(2e3);
937
+ }
938
+ await wait(2e3);
939
+ }
940
+ useNavigate() {
941
+ if (typeof this._redirectMethod === "object") {
942
+ return this._redirectMethod.useNavigate();
943
+ } else if (this._redirectMethod === "window") {
944
+ return () => window.location.assign;
945
+ } else if (this._redirectMethod === "nextjs") {
946
+ return NextNavigation.useRouter().push;
947
+ } else {
948
+ return (to) => {
949
+ };
933
950
  }
934
951
  }
935
952
  async _redirectIfTrusted(url, options) {
@@ -1096,7 +1113,6 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1096
1113
  }
1097
1114
  useUser(options) {
1098
1115
  this._ensurePersistentTokenStore(options?.tokenStore);
1099
- const router = NextNavigation.useRouter();
1100
1116
  const session = this._useSession(options?.tokenStore);
1101
1117
  const crud = useAsyncCache(this._currentUserCache, [session], "useUser()");
1102
1118
  if (crud === null) {
@@ -1393,6 +1409,9 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1393
1409
  if (!("publishableClientKey" in this._interface.options)) {
1394
1410
  throw new StackAssertionError("Cannot serialize to JSON from an application without a publishable client key");
1395
1411
  }
1412
+ if (typeof this._redirectMethod !== "string") {
1413
+ throw new StackAssertionError("Cannot serialize to JSON from an application with a non-string redirect method");
1414
+ }
1396
1415
  return {
1397
1416
  baseUrl: this._options.baseUrl,
1398
1417
  projectId: this.projectId,
@@ -1400,7 +1419,8 @@ var _StackClientAppImpl = class __StackClientAppImpl {
1400
1419
  tokenStore: this._tokenStoreInit,
1401
1420
  urls: this._urlOptions,
1402
1421
  oauthScopesOnSignIn: this._oauthScopesOnSignIn,
1403
- uniqueIdentifier: this._getUniqueIdentifier()
1422
+ uniqueIdentifier: this._getUniqueIdentifier(),
1423
+ redirectMethod: this._redirectMethod
1404
1424
  };
1405
1425
  },
1406
1426
  setCurrentUser: (userJsonPromise) => {
@@ -1434,7 +1454,8 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
1434
1454
  publishableClientKey: options.publishableClientKey,
1435
1455
  tokenStore: options.tokenStore,
1436
1456
  urls: options.urls ?? {},
1437
- oauthScopesOnSignIn: options.oauthScopesOnSignIn ?? {}
1457
+ oauthScopesOnSignIn: options.oauthScopesOnSignIn ?? {},
1458
+ redirectMethod: options.redirectMethod
1438
1459
  });
1439
1460
  // TODO override the client user cache to use the server user cache, so we save some requests
1440
1461
  this._currentServerUserCache = createCacheBySession(async (session) => {
@@ -1830,7 +1851,6 @@ var _StackServerAppImpl = class extends _StackClientAppImpl {
1830
1851
  return this.useUserById(options);
1831
1852
  } else {
1832
1853
  this._ensurePersistentTokenStore(options?.tokenStore);
1833
- const router = NextNavigation.useRouter();
1834
1854
  const session = this._useSession(options?.tokenStore);
1835
1855
  const crud = useAsyncCache(this._currentServerUserCache, [session], "useUser()");
1836
1856
  if (crud === null) {
@@ -1942,7 +1962,8 @@ var _StackAdminAppImpl = class extends _StackServerAppImpl {
1942
1962
  projectId: options.projectId,
1943
1963
  tokenStore: options.tokenStore,
1944
1964
  urls: options.urls,
1945
- oauthScopesOnSignIn: options.oauthScopesOnSignIn
1965
+ oauthScopesOnSignIn: options.oauthScopesOnSignIn,
1966
+ redirectMethod: options.redirectMethod
1946
1967
  });
1947
1968
  this._adminProjectCache = createCache(async () => {
1948
1969
  return await this._interface.getProject();