@stackframe/stack 2.8.12 → 2.8.16

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 (228) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/components/api-key-dialogs.js +5 -4
  3. package/dist/components/api-key-dialogs.js.map +1 -1
  4. package/dist/components/credential-sign-in.js +4 -4
  5. package/dist/components/credential-sign-up.js +3 -3
  6. package/dist/components/elements/maybe-full-page.js +1 -1
  7. package/dist/components/elements/sidebar-layout.js +1 -1
  8. package/dist/components/magic-link-sign-in.js +3 -3
  9. package/dist/components/message-cards/known-error-message-card.js +2 -2
  10. package/dist/components/message-cards/message-card.js +1 -1
  11. package/dist/components/message-cards/predefined-message-card.js +3 -3
  12. package/dist/components/oauth-button-group.js +2 -2
  13. package/dist/components/oauth-button.js +27 -16
  14. package/dist/components/oauth-button.js.map +1 -1
  15. package/dist/components/passkey-button.js +2 -2
  16. package/dist/components/profile-image-editor.js +87 -34
  17. package/dist/components/profile-image-editor.js.map +1 -1
  18. package/dist/components/selected-team-switcher.js +41 -9
  19. package/dist/components/selected-team-switcher.js.map +1 -1
  20. package/dist/components/{iframe-preventer.js → use-in-iframe.js} +9 -19
  21. package/dist/components/use-in-iframe.js.map +1 -0
  22. package/dist/components/user-button.js +41 -8
  23. package/dist/components/user-button.js.map +1 -1
  24. package/dist/components-page/account-settings/active-sessions/active-sessions-page.js +57 -12
  25. package/dist/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
  26. package/dist/components-page/account-settings/api-keys/api-keys-page.js +100 -12
  27. package/dist/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
  28. package/dist/components-page/account-settings/editable-text.js +1 -1
  29. package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.js +12 -12
  30. package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
  31. package/dist/components-page/account-settings/email-and-auth/emails-section.js +14 -5
  32. package/dist/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
  33. package/dist/components-page/account-settings/email-and-auth/mfa-section.js +18 -5
  34. package/dist/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
  35. package/dist/components-page/account-settings/email-and-auth/otp-section.js +18 -5
  36. package/dist/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
  37. package/dist/components-page/account-settings/email-and-auth/passkey-section.js +19 -6
  38. package/dist/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
  39. package/dist/components-page/account-settings/email-and-auth/password-section.js +20 -7
  40. package/dist/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
  41. package/dist/components-page/account-settings/profile-page/profile-page.js +18 -8
  42. package/dist/components-page/account-settings/profile-page/profile-page.js.map +1 -1
  43. package/dist/components-page/account-settings/settings/delete-account-section.js +19 -10
  44. package/dist/components-page/account-settings/settings/delete-account-section.js.map +1 -1
  45. package/dist/components-page/account-settings/settings/settings-page.js +6 -6
  46. package/dist/components-page/account-settings/settings/settings-page.js.map +1 -1
  47. package/dist/components-page/account-settings/settings/sign-out-section.js +15 -6
  48. package/dist/components-page/account-settings/settings/sign-out-section.js.map +1 -1
  49. package/dist/components-page/account-settings/teams/leave-team-section.js +3 -3
  50. package/dist/components-page/account-settings/teams/team-api-keys-section.js +5 -5
  51. package/dist/components-page/account-settings/teams/team-creation-page.js +19 -10
  52. package/dist/components-page/account-settings/teams/team-creation-page.js.map +1 -1
  53. package/dist/components-page/account-settings/teams/team-display-name-section.js +4 -4
  54. package/dist/components-page/account-settings/teams/team-member-invitation-section.js +4 -4
  55. package/dist/components-page/account-settings/teams/team-member-list-section.js +3 -3
  56. package/dist/components-page/account-settings/teams/team-page.js +8 -8
  57. package/dist/components-page/account-settings/teams/team-profile-image-section.js +4 -4
  58. package/dist/components-page/account-settings/teams/team-profile-user-section.js +4 -4
  59. package/dist/components-page/account-settings.js +29 -21
  60. package/dist/components-page/account-settings.js.map +1 -1
  61. package/dist/components-page/auth-page.js +11 -12
  62. package/dist/components-page/auth-page.js.map +1 -1
  63. package/dist/components-page/cli-auth-confirm.js +3 -3
  64. package/dist/components-page/email-verification.js +3 -3
  65. package/dist/components-page/error-page.js +6 -6
  66. package/dist/components-page/error-page.js.map +1 -1
  67. package/dist/components-page/forgot-password.js +6 -6
  68. package/dist/components-page/magic-link-callback.js +4 -4
  69. package/dist/components-page/mfa.js +190 -0
  70. package/dist/components-page/mfa.js.map +1 -0
  71. package/dist/components-page/oauth-callback.js +4 -4
  72. package/dist/components-page/password-reset.js +6 -6
  73. package/dist/components-page/sign-in.js +3 -2
  74. package/dist/components-page/sign-in.js.map +1 -1
  75. package/dist/components-page/sign-out.js +2 -2
  76. package/dist/components-page/sign-up.js +1 -1
  77. package/dist/components-page/stack-handler.js +25 -14
  78. package/dist/components-page/stack-handler.js.map +1 -1
  79. package/dist/components-page/team-creation.js +4 -4
  80. package/dist/components-page/team-invitation.js +3 -3
  81. package/dist/esm/components/api-key-dialogs.js +5 -4
  82. package/dist/esm/components/api-key-dialogs.js.map +1 -1
  83. package/dist/esm/components/credential-sign-in.js +4 -4
  84. package/dist/esm/components/credential-sign-up.js +3 -3
  85. package/dist/esm/components/elements/maybe-full-page.js +1 -1
  86. package/dist/esm/components/elements/sidebar-layout.js +1 -1
  87. package/dist/esm/components/magic-link-sign-in.js +3 -3
  88. package/dist/esm/components/message-cards/known-error-message-card.js +2 -2
  89. package/dist/esm/components/message-cards/message-card.js +1 -1
  90. package/dist/esm/components/message-cards/predefined-message-card.js +3 -3
  91. package/dist/esm/components/oauth-button-group.js +2 -2
  92. package/dist/esm/components/oauth-button.js +28 -17
  93. package/dist/esm/components/oauth-button.js.map +1 -1
  94. package/dist/esm/components/passkey-button.js +2 -2
  95. package/dist/esm/components/profile-image-editor.js +86 -34
  96. package/dist/esm/components/profile-image-editor.js.map +1 -1
  97. package/dist/esm/components/selected-team-switcher.js +41 -9
  98. package/dist/esm/components/selected-team-switcher.js.map +1 -1
  99. package/dist/esm/components/use-in-iframe.js +18 -0
  100. package/dist/esm/components/use-in-iframe.js.map +1 -0
  101. package/dist/esm/components/user-button.js +41 -8
  102. package/dist/esm/components/user-button.js.map +1 -1
  103. package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js +57 -12
  104. package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
  105. package/dist/esm/components-page/account-settings/api-keys/api-keys-page.js +100 -12
  106. package/dist/esm/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
  107. package/dist/esm/components-page/account-settings/editable-text.js +1 -1
  108. package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.js +12 -12
  109. package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
  110. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js +14 -5
  111. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
  112. package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js +18 -5
  113. package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
  114. package/dist/esm/components-page/account-settings/email-and-auth/otp-section.js +18 -5
  115. package/dist/esm/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
  116. package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.js +19 -6
  117. package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
  118. package/dist/esm/components-page/account-settings/email-and-auth/password-section.js +20 -7
  119. package/dist/esm/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
  120. package/dist/esm/components-page/account-settings/profile-page/profile-page.js +18 -8
  121. package/dist/esm/components-page/account-settings/profile-page/profile-page.js.map +1 -1
  122. package/dist/esm/components-page/account-settings/settings/delete-account-section.js +19 -10
  123. package/dist/esm/components-page/account-settings/settings/delete-account-section.js.map +1 -1
  124. package/dist/esm/components-page/account-settings/settings/settings-page.js +6 -6
  125. package/dist/esm/components-page/account-settings/settings/settings-page.js.map +1 -1
  126. package/dist/esm/components-page/account-settings/settings/sign-out-section.js +15 -6
  127. package/dist/esm/components-page/account-settings/settings/sign-out-section.js.map +1 -1
  128. package/dist/esm/components-page/account-settings/teams/leave-team-section.js +3 -3
  129. package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js +5 -5
  130. package/dist/esm/components-page/account-settings/teams/team-creation-page.js +19 -10
  131. package/dist/esm/components-page/account-settings/teams/team-creation-page.js.map +1 -1
  132. package/dist/esm/components-page/account-settings/teams/team-display-name-section.js +4 -4
  133. package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js +4 -4
  134. package/dist/esm/components-page/account-settings/teams/team-member-list-section.js +3 -3
  135. package/dist/esm/components-page/account-settings/teams/team-page.js +8 -8
  136. package/dist/esm/components-page/account-settings/teams/team-profile-image-section.js +4 -4
  137. package/dist/esm/components-page/account-settings/teams/team-profile-user-section.js +4 -4
  138. package/dist/esm/components-page/account-settings.js +29 -21
  139. package/dist/esm/components-page/account-settings.js.map +1 -1
  140. package/dist/esm/components-page/auth-page.js +11 -12
  141. package/dist/esm/components-page/auth-page.js.map +1 -1
  142. package/dist/esm/components-page/cli-auth-confirm.js +3 -3
  143. package/dist/esm/components-page/email-verification.js +3 -3
  144. package/dist/esm/components-page/error-page.js +6 -6
  145. package/dist/esm/components-page/error-page.js.map +1 -1
  146. package/dist/esm/components-page/forgot-password.js +6 -6
  147. package/dist/esm/components-page/magic-link-callback.js +4 -4
  148. package/dist/esm/components-page/mfa.js +174 -0
  149. package/dist/esm/components-page/mfa.js.map +1 -0
  150. package/dist/esm/components-page/oauth-callback.js +4 -4
  151. package/dist/esm/components-page/password-reset.js +6 -6
  152. package/dist/esm/components-page/sign-in.js +3 -2
  153. package/dist/esm/components-page/sign-in.js.map +1 -1
  154. package/dist/esm/components-page/sign-out.js +2 -2
  155. package/dist/esm/components-page/sign-up.js +1 -1
  156. package/dist/esm/components-page/stack-handler.js +25 -14
  157. package/dist/esm/components-page/stack-handler.js.map +1 -1
  158. package/dist/esm/components-page/team-creation.js +4 -4
  159. package/dist/esm/components-page/team-invitation.js +3 -3
  160. package/dist/esm/generated/global-css.js +1 -1
  161. package/dist/esm/generated/global-css.js.map +1 -1
  162. package/dist/esm/generated/quetzal-translations.js +3574 -2364
  163. package/dist/esm/generated/quetzal-translations.js.map +1 -1
  164. package/dist/esm/index.js +22 -22
  165. package/dist/esm/lib/auth.js +2 -2
  166. package/dist/esm/lib/cookie.js +1 -129
  167. package/dist/esm/lib/cookie.js.map +1 -1
  168. package/dist/esm/lib/hooks.js +1 -1
  169. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +8 -8
  170. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
  171. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js +52 -21
  172. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  173. package/dist/esm/lib/stack-app/apps/implementations/common.js +2 -1
  174. package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -1
  175. package/dist/esm/lib/stack-app/apps/implementations/index.js +3 -3
  176. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js +8 -8
  177. package/dist/esm/lib/stack-app/apps/index.js +3 -3
  178. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js +1 -1
  179. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js +1 -1
  180. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
  181. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js +1 -1
  182. package/dist/esm/lib/stack-app/common.js.map +1 -1
  183. package/dist/esm/lib/stack-app/index.js +2 -2
  184. package/dist/esm/lib/stack-app/internal-api-keys/index.js.map +1 -1
  185. package/dist/esm/lib/translations.js +1 -1
  186. package/dist/esm/providers/stack-provider-client.js +2 -2
  187. package/dist/esm/providers/stack-provider.js +3 -3
  188. package/dist/esm/providers/theme-provider.js +3 -3
  189. package/dist/esm/providers/translation-provider.js +2 -2
  190. package/dist/esm/utils/browser-script.js +1 -1
  191. package/dist/generated/global-css.js +1 -1
  192. package/dist/generated/global-css.js.map +1 -1
  193. package/dist/generated/quetzal-translations.js +3574 -2364
  194. package/dist/generated/quetzal-translations.js.map +1 -1
  195. package/dist/index.d.mts +71 -2
  196. package/dist/index.d.ts +71 -2
  197. package/dist/index.js +23 -23
  198. package/dist/index.js.map +1 -1
  199. package/dist/lib/auth.js +2 -2
  200. package/dist/lib/cookie.js +4 -132
  201. package/dist/lib/cookie.js.map +1 -1
  202. package/dist/lib/hooks.js +1 -1
  203. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +8 -8
  204. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
  205. package/dist/lib/stack-app/apps/implementations/client-app-impl.js +52 -21
  206. package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  207. package/dist/lib/stack-app/apps/implementations/common.js +2 -1
  208. package/dist/lib/stack-app/apps/implementations/common.js.map +1 -1
  209. package/dist/lib/stack-app/apps/implementations/index.js +3 -3
  210. package/dist/lib/stack-app/apps/implementations/server-app-impl.js +8 -8
  211. package/dist/lib/stack-app/apps/index.js +3 -3
  212. package/dist/lib/stack-app/apps/interfaces/admin-app.js +1 -1
  213. package/dist/lib/stack-app/apps/interfaces/client-app.js +1 -1
  214. package/dist/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
  215. package/dist/lib/stack-app/apps/interfaces/server-app.js +1 -1
  216. package/dist/lib/stack-app/common.js.map +1 -1
  217. package/dist/lib/stack-app/index.js +2 -2
  218. package/dist/lib/stack-app/internal-api-keys/index.js.map +1 -1
  219. package/dist/lib/translations.js +1 -1
  220. package/dist/providers/stack-provider-client.js +2 -2
  221. package/dist/providers/stack-provider.js +3 -3
  222. package/dist/providers/theme-provider.js +3 -3
  223. package/dist/providers/translation-provider.js +2 -2
  224. package/dist/utils/browser-script.js +1 -1
  225. package/package.json +5 -5
  226. package/dist/components/iframe-preventer.js.map +0 -1
  227. package/dist/esm/components/iframe-preventer.js +0 -28
  228. package/dist/esm/components/iframe-preventer.js.map +0 -1
@@ -0,0 +1,174 @@
1
+ "use client";
2
+ "use client";
3
+
4
+ // src/components-page/mfa.tsx
5
+ import { KnownErrors } from "@stackframe/stack-shared";
6
+ import {
7
+ Button,
8
+ InputOTP,
9
+ InputOTPGroup,
10
+ InputOTPSlot,
11
+ Spinner,
12
+ Typography,
13
+ cn
14
+ } from "@stackframe/stack-ui";
15
+ import { CheckIcon } from "lucide-react";
16
+ import { useEffect, useMemo, useRef, useState } from "react";
17
+ import { useStackApp } from "../index.js";
18
+ import { FormWarningText } from "../components/elements/form-warning.js";
19
+ import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
20
+ import { useTranslation } from "../lib/translations.js";
21
+ import { jsx, jsxs } from "react/jsx-runtime";
22
+ function MfaForm({ onSuccess, onCancel }) {
23
+ const stackApp = useStackApp();
24
+ const { t } = useTranslation();
25
+ const [otp, setOtp] = useState("");
26
+ const formRef = useRef(null);
27
+ const [submitting, setSubmitting] = useState(false);
28
+ const [error, setError] = useState(null);
29
+ const [verified, setVerified] = useState(false);
30
+ const [attemptCode, setAttemptCode] = useState(null);
31
+ useEffect(() => {
32
+ if (!attemptCode && typeof window !== "undefined") {
33
+ const code = window.sessionStorage.getItem("stack_mfa_attempt_code");
34
+ if (code) {
35
+ setAttemptCode(code);
36
+ }
37
+ }
38
+ }, [attemptCode]);
39
+ useEffect(() => {
40
+ if (otp.length === 6 && !submitting) {
41
+ if (document.activeElement instanceof HTMLElement) {
42
+ document.activeElement.blur();
43
+ }
44
+ if (formRef.current) {
45
+ const inputs = formRef.current.querySelectorAll("input");
46
+ for (const input of inputs) {
47
+ input.blur();
48
+ }
49
+ }
50
+ setSubmitting(true);
51
+ setError(null);
52
+ if (attemptCode) {
53
+ stackApp.signInWithMfa(otp, attemptCode, { noRedirect: true }).then(async (result) => {
54
+ if (result.status === "ok") {
55
+ setVerified(true);
56
+ if (typeof window !== "undefined") {
57
+ window.sessionStorage.removeItem("stack_mfa_attempt_code");
58
+ }
59
+ if (onSuccess) {
60
+ onSuccess();
61
+ } else {
62
+ await stackApp.redirectToAfterSignIn();
63
+ }
64
+ } else {
65
+ throw result.error;
66
+ }
67
+ }).catch((e) => {
68
+ if (e instanceof KnownErrors.InvalidTotpCode) {
69
+ setError(t("Invalid TOTP code"));
70
+ } else {
71
+ setError(t("Verification failed"));
72
+ }
73
+ }).finally(() => {
74
+ setSubmitting(false);
75
+ if (!verified) {
76
+ setOtp("");
77
+ }
78
+ });
79
+ } else {
80
+ setSubmitting(false);
81
+ setError(t("Missing verification information"));
82
+ }
83
+ }
84
+ if (otp.length !== 0 && otp.length !== 6) {
85
+ setError(null);
86
+ }
87
+ }, [otp, submitting, onSuccess, attemptCode, stackApp, t, verified]);
88
+ const inputStyleClass = useMemo(() => {
89
+ if (verified) {
90
+ return "opacity-85 transition-all duration-300";
91
+ }
92
+ if (error) {
93
+ return "ring-red-500 border-red-500";
94
+ }
95
+ return "focus:ring-primary/50";
96
+ }, [error, verified]);
97
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-stretch stack-scope", children: [
98
+ /* @__PURE__ */ jsxs("form", { ref: formRef, className: "w-full flex flex-col items-center gap-4", children: [
99
+ /* @__PURE__ */ jsx(
100
+ InputOTP,
101
+ {
102
+ maxLength: 6,
103
+ type: "text",
104
+ inputMode: "numeric",
105
+ placeholder: "\xB7\xB7\xB7\xB7\xB7\xB7",
106
+ value: otp,
107
+ onChange: (value) => setOtp(value.toUpperCase()),
108
+ disabled: submitting || verified,
109
+ children: /* @__PURE__ */ jsx(InputOTPGroup, { children: [0, 1, 2, 3, 4, 5].map((index) => /* @__PURE__ */ jsx(
110
+ InputOTPSlot,
111
+ {
112
+ index,
113
+ size: "lg",
114
+ className: cn(
115
+ "border focus:ring-2 transition-all",
116
+ inputStyleClass
117
+ )
118
+ },
119
+ index
120
+ )) })
121
+ }
122
+ ),
123
+ /* @__PURE__ */ jsxs("div", { className: "h-8 flex flex-col gap-4 items-center justify-center w-full", children: [
124
+ verified ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 animate-in fade-in duration-300 slide-in-from-bottom-2", children: [
125
+ /* @__PURE__ */ jsx(CheckIcon, { className: "w-5 h-5 text-green-600 animate-in zoom-in duration-300" }),
126
+ /* @__PURE__ */ jsx(Typography, { className: "text-sm font-medium", children: t("Verified! Redirecting...") })
127
+ ] }) : submitting ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
128
+ /* @__PURE__ */ jsx(Spinner, { className: "text-primary h-4 w-4" }),
129
+ /* @__PURE__ */ jsx(Typography, { className: "text-sm", children: t("Verifying...") })
130
+ ] }) : null,
131
+ error !== null && !submitting && !verified ? /* @__PURE__ */ jsx(FormWarningText, { text: error }) : null
132
+ ] })
133
+ ] }),
134
+ onCancel && !verified && /* @__PURE__ */ jsx(
135
+ Button,
136
+ {
137
+ variant: "link",
138
+ onClick: onCancel,
139
+ className: "underline mt-4 self-center",
140
+ disabled: submitting || verified,
141
+ children: t("Cancel")
142
+ }
143
+ )
144
+ ] });
145
+ }
146
+ function MFA(props) {
147
+ const { t } = useTranslation();
148
+ const headerText = t("Multi-Factor Authentication");
149
+ const instructionText = t("Enter the six-digit code from your authenticator app");
150
+ if (props.fullPage) {
151
+ return /* @__PURE__ */ jsx(MaybeFullPage, { fullPage: true, children: /* @__PURE__ */ jsxs(
152
+ "div",
153
+ {
154
+ className: "stack-scope flex flex-col items-stretch",
155
+ style: { maxWidth: "380px", flexBasis: "380px", padding: "1rem" },
156
+ children: [
157
+ /* @__PURE__ */ jsxs("div", { className: "text-center mb-6", children: [
158
+ /* @__PURE__ */ jsx(Typography, { type: "h2", children: headerText }),
159
+ /* @__PURE__ */ jsx(Typography, { className: "mt-2", children: instructionText })
160
+ ] }),
161
+ /* @__PURE__ */ jsx(MfaForm, { onSuccess: props.onSuccess, onCancel: props.onCancel })
162
+ ]
163
+ }
164
+ ) });
165
+ }
166
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-stretch stack-scope", children: [
167
+ /* @__PURE__ */ jsx(Typography, { className: "mb-4 text-center", children: instructionText }),
168
+ /* @__PURE__ */ jsx(MfaForm, { onSuccess: props.onSuccess, onCancel: props.onCancel })
169
+ ] });
170
+ }
171
+ export {
172
+ MFA
173
+ };
174
+ //# sourceMappingURL=mfa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components-page/mfa.tsx"],"sourcesContent":["\"use client\";\n\n\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\n\nimport { KnownErrors } from \"@stackframe/stack-shared\";\nimport {\n Button,\n InputOTP,\n InputOTPGroup,\n InputOTPSlot,\n Spinner,\n Typography,\n cn,\n} from \"@stackframe/stack-ui\";\nimport { CheckIcon } from \"lucide-react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useStackApp } from \"..\";\nimport { FormWarningText } from \"../components/elements/form-warning\";\nimport { MaybeFullPage } from \"../components/elements/maybe-full-page\";\nimport { useTranslation } from \"../lib/translations\";\n\nfunction MfaForm({ onSuccess, onCancel }: {\n onSuccess?: () => void,\n onCancel?: () => void,\n}) {\n const stackApp = useStackApp();\n const { t } = useTranslation();\n const [otp, setOtp] = useState<string>(\"\");\n const formRef = useRef<HTMLFormElement>(null);\n\n const [submitting, setSubmitting] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [verified, setVerified] = useState<boolean>(false);\n\n const [attemptCode, setAttemptCode] = useState<string | null>(null);\n\n useEffect(() => {\n if (!attemptCode && typeof window !== \"undefined\") {\n const code = window.sessionStorage.getItem(\"stack_mfa_attempt_code\");\n if (code) {\n setAttemptCode(code);\n }\n }\n }, [ attemptCode]);\n\n // Handle OTP verification when code is complete\n useEffect(() => {\n if (otp.length === 6 && !submitting) {\n // Blur any focused inputs\n if (document.activeElement instanceof HTMLElement) {\n document.activeElement.blur();\n }\n if (formRef.current) {\n const inputs = formRef.current.querySelectorAll('input');\n for (const input of inputs) {\n input.blur();\n }\n }\n\n setSubmitting(true);\n setError(null);\n\n if (attemptCode) {\n stackApp\n .signInWithMfa(otp, attemptCode, { noRedirect: true })\n .then(async (result) => {\n if (result.status === \"ok\") {\n setVerified(true);\n\n // Cleanup session storage\n if (typeof window !== \"undefined\") {\n window.sessionStorage.removeItem(\"stack_mfa_attempt_code\");\n }\n\n if (onSuccess) {\n onSuccess();\n } else {\n await stackApp.redirectToAfterSignIn();\n }\n } else {\n throw result.error;\n }\n })\n .catch((e) => {\n if (e instanceof KnownErrors.InvalidTotpCode) {\n setError(t(\"Invalid TOTP code\"));\n } else {\n setError(t(\"Verification failed\"));\n }\n })\n .finally(() => {\n setSubmitting(false);\n if (!verified) {\n setOtp(\"\");\n }\n });\n } else {\n setSubmitting(false);\n setError(t(\"Missing verification information\"));\n }\n }\n\n // Clear error when user is typing\n if (otp.length !== 0 && otp.length !== 6) {\n setError(null);\n }\n }, [otp, submitting, onSuccess, attemptCode, stackApp, t, verified]);\n\n\n const inputStyleClass = useMemo(() => {\n if (verified) {\n return \"opacity-85 transition-all duration-300\";\n }\n\n if (error) {\n return \"ring-red-500 border-red-500\";\n }\n\n return \"focus:ring-primary/50\";\n }, [error, verified]);\n\n return (\n <div className=\"flex flex-col items-stretch stack-scope\">\n <form ref={formRef} className=\"w-full flex flex-col items-center gap-4\">\n <InputOTP\n maxLength={6}\n type=\"text\"\n inputMode=\"numeric\"\n placeholder=\"······\"\n value={otp}\n onChange={(value) => setOtp(value.toUpperCase())}\n disabled={submitting || verified}\n >\n <InputOTPGroup>\n {[0, 1, 2, 3, 4, 5].map((index) => (\n <InputOTPSlot\n key={index}\n index={index}\n size=\"lg\"\n className={cn(\n \"border focus:ring-2 transition-all\",\n inputStyleClass,\n )}\n />\n ))}\n </InputOTPGroup>\n </InputOTP>\n\n {/* Verification Status */}\n <div className=\"h-8 flex flex-col gap-4 items-center justify-center w-full\">\n {verified ? (\n <div className=\"flex items-center gap-2 animate-in fade-in duration-300 slide-in-from-bottom-2\">\n <CheckIcon className=\"w-5 h-5 text-green-600 animate-in zoom-in duration-300\" />\n <Typography className=\"text-sm font-medium\">{t(\"Verified! Redirecting...\")}</Typography>\n </div>\n ) : submitting ? (\n <div className=\"flex items-center gap-2\">\n <Spinner className=\"text-primary h-4 w-4\" />\n <Typography className=\"text-sm\">{t(\"Verifying...\")}</Typography>\n </div>\n ) : null}\n\n {/* Error reporting */}\n {error !== null && !submitting && !verified ? <FormWarningText text={error} /> : null}\n </div>\n </form>\n\n {/* Cancel Button */}\n {onCancel && !verified && (\n <Button\n variant=\"link\"\n onClick={onCancel}\n className=\"underline mt-4 self-center\"\n disabled={submitting || verified}\n >\n {t(\"Cancel\")}\n </Button>\n )}\n </div>\n );\n}\n\nexport function MFA(props: {\n fullPage?: boolean,\n onSuccess?: () => void,\n onCancel?: () => void,\n}) {\n const { t } = useTranslation();\n\n const headerText = t(\"Multi-Factor Authentication\");\n const instructionText = t(\"Enter the six-digit code from your authenticator app\");\n\n if (props.fullPage) {\n return (\n <MaybeFullPage fullPage={true}>\n <div\n className=\"stack-scope flex flex-col items-stretch\"\n style={{ maxWidth: \"380px\", flexBasis: \"380px\", padding: \"1rem\" }}\n >\n <div className=\"text-center mb-6\">\n <Typography type=\"h2\">{headerText}</Typography>\n <Typography className=\"mt-2\">{instructionText}</Typography>\n </div>\n <MfaForm onSuccess={props.onSuccess} onCancel={props.onCancel} />\n </div>\n </MaybeFullPage>\n );\n }\n\n return (\n <div className=\"flex flex-col items-stretch stack-scope\">\n <Typography className=\"mb-4 text-center\">{instructionText}</Typography>\n <MfaForm onSuccess={props.onSuccess} onCancel={props.onCancel} />\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -6,10 +6,10 @@ import { captureError } from "@stackframe/stack-shared/dist/utils/errors";
6
6
  import { runAsynchronously } from "@stackframe/stack-shared/dist/utils/promises";
7
7
  import { Spinner, cn } from "@stackframe/stack-ui";
8
8
  import { useEffect, useRef, useState } from "react";
9
- import { useStackApp } from "..";
10
- import { MaybeFullPage } from "../components/elements/maybe-full-page";
11
- import { StyledLink } from "../components/link";
12
- import { useTranslation } from "../lib/translations";
9
+ import { useStackApp } from "../index.js";
10
+ import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
11
+ import { StyledLink } from "../components/link.js";
12
+ import { useTranslation } from "../lib/translations.js";
13
13
  import { jsx, jsxs } from "react/jsx-runtime";
14
14
  function OAuthCallback({ fullPage }) {
15
15
  const { t } = useTranslation();
@@ -12,12 +12,12 @@ import { Button, Label, PasswordInput, Typography, cn } from "@stackframe/stack-
12
12
  import React, { useState } from "react";
13
13
  import { useForm } from "react-hook-form";
14
14
  import * as yup from "yup";
15
- import { useStackApp } from "..";
16
- import { FormWarningText } from "../components/elements/form-warning";
17
- import { MaybeFullPage } from "../components/elements/maybe-full-page";
18
- import { MessageCard } from "../components/message-cards/message-card";
19
- import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card";
20
- import { useTranslation } from "../lib/translations";
15
+ import { useStackApp } from "../index.js";
16
+ import { FormWarningText } from "../components/elements/form-warning.js";
17
+ import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
18
+ import { MessageCard } from "../components/message-cards/message-card.js";
19
+ import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card.js";
20
+ import { useTranslation } from "../lib/translations.js";
21
21
  import { jsx, jsxs } from "react/jsx-runtime";
22
22
  function PasswordResetForm(props) {
23
23
  const { t } = useTranslation();
@@ -1,5 +1,5 @@
1
1
  // src/components-page/sign-in.tsx
2
- import { AuthPage } from "./auth-page";
2
+ import { AuthPage } from "./auth-page.js";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  function SignIn(props) {
5
5
  return /* @__PURE__ */ jsx(
@@ -9,7 +9,8 @@ function SignIn(props) {
9
9
  type: "sign-in",
10
10
  automaticRedirect: !!props.automaticRedirect,
11
11
  extraInfo: props.extraInfo,
12
- firstTab: props.firstTab
12
+ firstTab: props.firstTab,
13
+ mockProject: props.mockProject
13
14
  }
14
15
  );
15
16
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components-page/sign-in.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { AuthPage } from \"./auth-page\";\n\nexport function SignIn(props: {\n fullPage?: boolean,\n automaticRedirect?: boolean,\n extraInfo?: React.ReactNode,\n firstTab?: 'magic-link' | 'password',\n}) {\n return (\n <AuthPage\n fullPage={!!props.fullPage}\n type=\"sign-in\"\n automaticRedirect={!!props.automaticRedirect}\n extraInfo={props.extraInfo}\n firstTab={props.firstTab}\n />\n );\n}\n"],"mappings":";AAIA,SAAS,gBAAgB;AASrB;AAPG,SAAS,OAAO,OAKpB;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,CAAC,CAAC,MAAM;AAAA,MAClB,MAAK;AAAA,MACL,mBAAmB,CAAC,CAAC,MAAM;AAAA,MAC3B,WAAW,MAAM;AAAA,MACjB,UAAU,MAAM;AAAA;AAAA,EAClB;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components-page/sign-in.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { AuthPage } from \"./auth-page\";\n\nexport function SignIn(props: {\n fullPage?: boolean,\n automaticRedirect?: boolean,\n extraInfo?: React.ReactNode,\n firstTab?: 'magic-link' | 'password',\n mockProject?: {\n config: {\n signUpEnabled: boolean,\n credentialEnabled: boolean,\n passkeyEnabled: boolean,\n magicLinkEnabled: boolean,\n oauthProviders: {\n id: string,\n }[],\n },\n },\n}) {\n return (\n <AuthPage\n fullPage={!!props.fullPage}\n type=\"sign-in\"\n automaticRedirect={!!props.automaticRedirect}\n extraInfo={props.extraInfo}\n firstTab={props.firstTab}\n mockProject={props.mockProject}\n />\n );\n}\n"],"mappings":";AAIA,SAAS,gBAAgB;AAoBrB;AAlBG,SAAS,OAAO,OAgBpB;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,CAAC,CAAC,MAAM;AAAA,MAClB,MAAK;AAAA,MACL,mBAAmB,CAAC,CAAC,MAAM;AAAA,MAC3B,WAAW,MAAM;AAAA,MACjB,UAAU,MAAM;AAAA,MAChB,aAAa,MAAM;AAAA;AAAA,EACrB;AAEJ;","names":[]}
@@ -4,8 +4,8 @@
4
4
  // src/components-page/sign-out.tsx
5
5
  import { cacheFunction } from "@stackframe/stack-shared/dist/utils/caches";
6
6
  import React from "react";
7
- import { useUser } from "..";
8
- import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card";
7
+ import { useUser } from "../index.js";
8
+ import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card.js";
9
9
  import { jsx } from "react/jsx-runtime";
10
10
  var cacheSignOut = cacheFunction(async (user) => {
11
11
  return await user.signOut();
@@ -2,7 +2,7 @@
2
2
  "use client";
3
3
 
4
4
  // src/components-page/sign-up.tsx
5
- import { AuthPage } from "./auth-page";
5
+ import { AuthPage } from "./auth-page.js";
6
6
  import { jsx } from "react/jsx-runtime";
7
7
  function SignUp(props) {
8
8
  return /* @__PURE__ */ jsx(
@@ -3,19 +3,19 @@ import { StackAssertionError } from "@stackframe/stack-shared/dist/utils/errors"
3
3
  import { filterUndefined, pick } from "@stackframe/stack-shared/dist/utils/objects";
4
4
  import { getRelativePart } from "@stackframe/stack-shared/dist/utils/urls";
5
5
  import { RedirectType, notFound, redirect } from "next/navigation";
6
- import { SignIn, SignUp } from "..";
7
- import { IframePreventer } from "../components/iframe-preventer";
8
- import { MessageCard } from "../components/message-cards/message-card";
9
- import { AccountSettings } from "./account-settings";
10
- import { CliAuthConfirmation } from "./cli-auth-confirm";
11
- import { EmailVerification } from "./email-verification";
12
- import { ErrorPage } from "./error-page";
13
- import { ForgotPassword } from "./forgot-password";
14
- import { MagicLinkCallback } from "./magic-link-callback";
15
- import { OAuthCallback } from "./oauth-callback";
16
- import { PasswordReset } from "./password-reset";
17
- import { SignOut } from "./sign-out";
18
- import { TeamInvitation } from "./team-invitation";
6
+ import { SignIn, SignUp } from "../index.js";
7
+ import { MessageCard } from "../components/message-cards/message-card.js";
8
+ import { AccountSettings } from "./account-settings.js";
9
+ import { CliAuthConfirmation } from "./cli-auth-confirm.js";
10
+ import { EmailVerification } from "./email-verification.js";
11
+ import { ErrorPage } from "./error-page.js";
12
+ import { ForgotPassword } from "./forgot-password.js";
13
+ import { MagicLinkCallback } from "./magic-link-callback.js";
14
+ import { OAuthCallback } from "./oauth-callback.js";
15
+ import { MFA } from "./mfa.js";
16
+ import { PasswordReset } from "./password-reset.js";
17
+ import { SignOut } from "./sign-out.js";
18
+ import { TeamInvitation } from "./team-invitation.js";
19
19
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
20
20
  var next15DeprecationWarning = "DEPRECATION WARNING: Next.js 15 disallows spreading the props argument of <StackHandler /> like `{...props}`, so you must now explicitly pass them in the `routeProps` argument: `routeProps={props}`. You can fix this by updating the code in the file `app/handler/[...stack]/route.tsx`.";
21
21
  var availablePaths = {
@@ -30,6 +30,7 @@ var availablePaths = {
30
30
  teamInvitation: "team-invitation",
31
31
  accountSettings: "account-settings",
32
32
  cliAuthConfirm: "cli-auth-confirm",
33
+ mfa: "mfa",
33
34
  error: "error"
34
35
  };
35
36
  var pathAliases = {
@@ -165,6 +166,16 @@ function renderComponent(props) {
165
166
  }
166
167
  );
167
168
  }
169
+ case availablePaths.mfa: {
170
+ redirectIfNotHandler?.("mfa");
171
+ return /* @__PURE__ */ jsx(
172
+ MFA,
173
+ {
174
+ fullPage,
175
+ ...filterUndefinedINU(componentProps?.MFA)
176
+ }
177
+ );
178
+ }
168
179
  default: {
169
180
  if (Object.values(availablePaths).includes(path)) {
170
181
  throw new StackAssertionError(`Path alias ${path} not included in switch statement, but in availablePaths?`, { availablePaths });
@@ -225,7 +236,7 @@ async function NextStackHandler(props) {
225
236
  next15DeprecationWarning,
226
237
  ". This warning will not be shown in production."
227
238
  ] }),
228
- /* @__PURE__ */ jsx(IframePreventer, { children: result })
239
+ result
229
240
  ] });
230
241
  }
231
242
  var stack_handler_default = NextStackHandler;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components-page/stack-handler.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { StackAssertionError } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { FilterUndefined, filterUndefined, pick } from \"@stackframe/stack-shared/dist/utils/objects\";\nimport { getRelativePart } from \"@stackframe/stack-shared/dist/utils/urls\";\nimport { RedirectType, notFound, redirect } from 'next/navigation'; // THIS_LINE_PLATFORM next\nimport { useMemo } from 'react';\nimport { SignIn, SignUp, StackServerApp } from \"..\";\nimport { 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 { CliAuthConfirmation } from \"./cli-auth-confirm\";\nimport { EmailVerification } from \"./email-verification\";\nimport { ErrorPage } from \"./error-page\";\nimport { ForgotPassword } from \"./forgot-password\";\nimport { MagicLinkCallback } from \"./magic-link-callback\";\nimport { OAuthCallback } from \"./oauth-callback\";\nimport { PasswordReset } from \"./password-reset\";\nimport { SignOut } from \"./sign-out\";\nimport { TeamInvitation } from \"./team-invitation\";\n\ntype Components = {\n SignIn: typeof SignIn,\n SignUp: typeof SignUp,\n EmailVerification: typeof EmailVerification,\n PasswordReset: typeof PasswordReset,\n ForgotPassword: typeof ForgotPassword,\n SignOut: typeof SignOut,\n OAuthCallback: typeof OAuthCallback,\n MagicLinkCallback: typeof MagicLinkCallback,\n TeamInvitation: typeof TeamInvitation,\n ErrorPage: typeof ErrorPage,\n AccountSettings: typeof AccountSettings,\n CliAuthConfirmation: typeof CliAuthConfirmation,\n};\n\ntype RouteProps = {\n params: Promise<{ stack?: string[] }> | { stack?: string[] },\n searchParams: Promise<Record<string, string>> | Record<string, string>,\n};\n\nconst next15DeprecationWarning = \"DEPRECATION WARNING: Next.js 15 disallows spreading the props argument of <StackHandler /> like `{...props}`, so you must now explicitly pass them in the `routeProps` argument: `routeProps={props}`. You can fix this by updating the code in the file `app/handler/[...stack]/route.tsx`.\";\n\nconst availablePaths = {\n signIn: 'sign-in',\n signUp: 'sign-up',\n emailVerification: 'email-verification',\n passwordReset: 'password-reset',\n forgotPassword: 'forgot-password',\n signOut: 'sign-out',\n oauthCallback: 'oauth-callback',\n magicLinkCallback: 'magic-link-callback',\n teamInvitation: 'team-invitation',\n accountSettings: 'account-settings',\n cliAuthConfirm: 'cli-auth-confirm',\n error: 'error',\n} as const;\n\nconst pathAliases = {\n // also includes the uppercase and non-dashed versions\n ...Object.fromEntries(Object.entries(availablePaths).map(([key, value]) => [value, value])),\n \"log-in\": availablePaths.signIn,\n \"register\": availablePaths.signUp,\n} as const;\n\ntype BaseHandlerProps = {\n fullPage: boolean,\n componentProps?: {\n [K in keyof Components]?: Parameters<Components[K]>[0];\n },\n};\n\nfunction renderComponent(props: {\n path: string,\n searchParams: Record<string, string>,\n fullPage: boolean,\n componentProps?: BaseHandlerProps['componentProps'],\n redirectIfNotHandler?: (name: keyof HandlerUrls) => void,\n onNotFound: () => any,\n app: StackClientApp<any> | StackServerApp<any>,\n}) {\n const { path, searchParams, fullPage, componentProps, redirectIfNotHandler, onNotFound, app } = props;\n\n switch (path) {\n case availablePaths.signIn: {\n redirectIfNotHandler?.('signIn');\n return <SignIn\n fullPage={fullPage}\n automaticRedirect\n {...filterUndefinedINU(componentProps?.SignIn)}\n />;\n }\n case availablePaths.signUp: {\n redirectIfNotHandler?.('signUp');\n return <SignUp\n fullPage={fullPage}\n automaticRedirect\n {...filterUndefinedINU(componentProps?.SignUp)}\n />;\n }\n case availablePaths.emailVerification: {\n redirectIfNotHandler?.('emailVerification');\n return <EmailVerification\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.EmailVerification)}\n />;\n }\n case availablePaths.passwordReset: {\n redirectIfNotHandler?.('passwordReset');\n return <PasswordReset\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.PasswordReset)}\n />;\n }\n case availablePaths.forgotPassword: {\n redirectIfNotHandler?.('forgotPassword');\n return <ForgotPassword\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.ForgotPassword)}\n />;\n }\n case availablePaths.signOut: {\n redirectIfNotHandler?.('signOut');\n return <SignOut\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.SignOut)}\n />;\n }\n case availablePaths.oauthCallback: {\n redirectIfNotHandler?.('oauthCallback');\n return <OAuthCallback\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.OAuthCallback)}\n />;\n }\n case availablePaths.magicLinkCallback: {\n redirectIfNotHandler?.('magicLinkCallback');\n return <MagicLinkCallback\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.MagicLinkCallback)}\n />;\n }\n case availablePaths.teamInvitation: {\n redirectIfNotHandler?.('teamInvitation');\n return <TeamInvitation\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.TeamInvitation)}\n />;\n }\n case availablePaths.accountSettings: {\n return <AccountSettings\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.AccountSettings)}\n />;\n }\n case availablePaths.error: {\n return <ErrorPage\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.ErrorPage)}\n />;\n }\n case availablePaths.cliAuthConfirm: {\n return <CliAuthConfirmation\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.CliAuthConfirmation)}\n />;\n }\n 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\n// filter undefined values in object. if object itself is undefined, return undefined\nfunction filterUndefinedINU<T extends {}>(value: T | undefined): FilterUndefined<T> | undefined {\n return value === undefined ? value : filterUndefined(value);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components-page/stack-handler.tsx"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY\n//===========================================\nimport { StackAssertionError } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { FilterUndefined, filterUndefined, pick } from \"@stackframe/stack-shared/dist/utils/objects\";\nimport { getRelativePart } from \"@stackframe/stack-shared/dist/utils/urls\";\nimport { RedirectType, notFound, redirect } from 'next/navigation'; // THIS_LINE_PLATFORM next\nimport { useMemo } from 'react';\nimport { SignIn, SignUp, StackServerApp } from \"..\";\nimport { MessageCard } from \"../components/message-cards/message-card\";\nimport { HandlerUrls, StackClientApp } from \"../lib/stack-app\";\nimport { AccountSettings } from \"./account-settings\";\nimport { CliAuthConfirmation } from \"./cli-auth-confirm\";\nimport { EmailVerification } from \"./email-verification\";\nimport { ErrorPage } from \"./error-page\";\nimport { ForgotPassword } from \"./forgot-password\";\nimport { MagicLinkCallback } from \"./magic-link-callback\";\nimport { OAuthCallback } from \"./oauth-callback\";\nimport { MFA } from \"./mfa\";\nimport { PasswordReset } from \"./password-reset\";\nimport { SignOut } from \"./sign-out\";\nimport { TeamInvitation } from \"./team-invitation\";\n\ntype Components = {\n SignIn: typeof SignIn,\n SignUp: typeof SignUp,\n EmailVerification: typeof EmailVerification,\n PasswordReset: typeof PasswordReset,\n ForgotPassword: typeof ForgotPassword,\n SignOut: typeof SignOut,\n OAuthCallback: typeof OAuthCallback,\n MagicLinkCallback: typeof MagicLinkCallback,\n TeamInvitation: typeof TeamInvitation,\n ErrorPage: typeof ErrorPage,\n AccountSettings: typeof AccountSettings,\n CliAuthConfirmation: typeof CliAuthConfirmation,\n MFA: typeof MFA,\n};\n\ntype RouteProps = {\n params: Promise<{ stack?: string[] }> | { stack?: string[] },\n searchParams: Promise<Record<string, string>> | Record<string, string>,\n};\n\nconst next15DeprecationWarning = \"DEPRECATION WARNING: Next.js 15 disallows spreading the props argument of <StackHandler /> like `{...props}`, so you must now explicitly pass them in the `routeProps` argument: `routeProps={props}`. You can fix this by updating the code in the file `app/handler/[...stack]/route.tsx`.\";\n\nconst availablePaths = {\n signIn: 'sign-in',\n signUp: 'sign-up',\n emailVerification: 'email-verification',\n passwordReset: 'password-reset',\n forgotPassword: 'forgot-password',\n signOut: 'sign-out',\n oauthCallback: 'oauth-callback',\n magicLinkCallback: 'magic-link-callback',\n teamInvitation: 'team-invitation',\n accountSettings: 'account-settings',\n cliAuthConfirm: 'cli-auth-confirm',\n mfa: 'mfa',\n error: 'error',\n} as const;\n\nconst pathAliases = {\n // also includes the uppercase and non-dashed versions\n ...Object.fromEntries(Object.entries(availablePaths).map(([key, value]) => [value, value])),\n \"log-in\": availablePaths.signIn,\n \"register\": availablePaths.signUp,\n} as const;\n\ntype BaseHandlerProps = {\n fullPage: boolean,\n componentProps?: {\n [K in keyof Components]?: Parameters<Components[K]>[0];\n },\n};\n\nfunction renderComponent(props: {\n path: string,\n searchParams: Record<string, string>,\n fullPage: boolean,\n componentProps?: BaseHandlerProps['componentProps'],\n redirectIfNotHandler?: (name: keyof HandlerUrls) => void,\n onNotFound: () => any,\n app: StackClientApp<any> | StackServerApp<any>,\n}) {\n const { path, searchParams, fullPage, componentProps, redirectIfNotHandler, onNotFound, app } = props;\n\n switch (path) {\n case availablePaths.signIn: {\n redirectIfNotHandler?.('signIn');\n return <SignIn\n fullPage={fullPage}\n automaticRedirect\n {...filterUndefinedINU(componentProps?.SignIn)}\n />;\n }\n case availablePaths.signUp: {\n redirectIfNotHandler?.('signUp');\n return <SignUp\n fullPage={fullPage}\n automaticRedirect\n {...filterUndefinedINU(componentProps?.SignUp)}\n />;\n }\n case availablePaths.emailVerification: {\n redirectIfNotHandler?.('emailVerification');\n return <EmailVerification\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.EmailVerification)}\n />;\n }\n case availablePaths.passwordReset: {\n redirectIfNotHandler?.('passwordReset');\n return <PasswordReset\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.PasswordReset)}\n />;\n }\n case availablePaths.forgotPassword: {\n redirectIfNotHandler?.('forgotPassword');\n return <ForgotPassword\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.ForgotPassword)}\n />;\n }\n case availablePaths.signOut: {\n redirectIfNotHandler?.('signOut');\n return <SignOut\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.SignOut)}\n />;\n }\n case availablePaths.oauthCallback: {\n redirectIfNotHandler?.('oauthCallback');\n return <OAuthCallback\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.OAuthCallback)}\n />;\n }\n case availablePaths.magicLinkCallback: {\n redirectIfNotHandler?.('magicLinkCallback');\n return <MagicLinkCallback\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.MagicLinkCallback)}\n />;\n }\n case availablePaths.teamInvitation: {\n redirectIfNotHandler?.('teamInvitation');\n return <TeamInvitation\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.TeamInvitation)}\n />;\n }\n case availablePaths.accountSettings: {\n return <AccountSettings\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.AccountSettings)}\n />;\n }\n case availablePaths.error: {\n return <ErrorPage\n searchParams={searchParams}\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.ErrorPage)}\n />;\n }\n case availablePaths.cliAuthConfirm: {\n return <CliAuthConfirmation\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.CliAuthConfirmation)}\n />;\n }\n case availablePaths.mfa: {\n redirectIfNotHandler?.('mfa');\n return <MFA\n fullPage={fullPage}\n {...filterUndefinedINU(componentProps?.MFA)}\n />;\n }\n default: {\n if (Object.values(availablePaths).includes(path as any)) {\n throw new StackAssertionError(`Path alias ${path} not included in switch statement, but in availablePaths?`, { availablePaths });\n }\n for (const [key, value] of Object.entries(pathAliases)) {\n if (path === key.toLowerCase().replaceAll('-', '')) {\n const redirectUrl = `${app.urls.handler}/${value}?${new URLSearchParams(searchParams).toString()}`;\n return { redirect: redirectUrl };\n }\n }\n return onNotFound();\n }\n }\n}\n\nasync function NextStackHandler<HasTokenStore extends boolean>(props: BaseHandlerProps & {\n app: StackServerApp<HasTokenStore>,\n} & (\n | Partial<RouteProps>\n | {\n routeProps: RouteProps | unknown,\n }\n)): Promise<any> {\n if (!(\"routeProps\" in props)) {\n console.warn(next15DeprecationWarning);\n }\n\n const routeProps = \"routeProps\" in props ? props.routeProps as RouteProps : pick(props, [\"params\", \"searchParams\"] as any);\n const params = await routeProps.params;\n const searchParams = await routeProps.searchParams;\n\n if (!params?.stack) {\n return (\n <MessageCard title=\"Invalid Stack Handler Setup\" fullPage={props.fullPage}>\n <p>Can't use {\"<StackHandler />\"} at this location. Make sure that the file is in a folder called [...stack] and you are passing the routeProps prop.</p>\n </MessageCard>\n );\n }\n\n const path = params.stack.join('/');\n\n const redirectIfNotHandler = (name: keyof HandlerUrls) => {\n const url = props.app.urls[name];\n const handlerUrl = props.app.urls.handler;\n\n if (url !== handlerUrl && url.startsWith(handlerUrl + \"/\")) {\n return;\n }\n\n const urlObj = new URL(url, \"http://example.com\");\n if (searchParams) {\n for (const [key, value] of Object.entries(searchParams)) {\n urlObj.searchParams.set(key, value);\n }\n }\n\n redirect(getRelativePart(urlObj), RedirectType.replace);\n };\n\n const result = renderComponent({\n path,\n searchParams: searchParams ?? {},\n fullPage: props.fullPage,\n componentProps: props.componentProps,\n redirectIfNotHandler,\n onNotFound: () => notFound(),\n app: props.app,\n });\n\n if (result && 'redirect' in result) {\n redirect(result.redirect, RedirectType.replace);\n }\n\n return <>\n {process.env.NODE_ENV === \"development\" && !(\"routeProps\" in props) && (\n <span style={{ color: \"red\" }}>\n {next15DeprecationWarning}. This warning will not be shown in production.\n </span>\n )}\n {result}\n </>;\n}\n\n\nexport default NextStackHandler;\n\n// filter undefined values in object. if object itself is undefined, return undefined\nfunction filterUndefinedINU<T extends {}>(value: T | undefined): FilterUndefined<T> | undefined {\n return value === undefined ? value : filterUndefined(value);\n}\n"],"mappings":"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","names":[]}
@@ -8,10 +8,10 @@ import { runAsynchronously } from "@stackframe/stack-shared/dist/utils/promises"
8
8
  import { Button, Input, Label, Typography } from "@stackframe/stack-ui";
9
9
  import { useState } from "react";
10
10
  import { useForm } from "react-hook-form";
11
- import { MessageCard, useStackApp, useUser } from "..";
12
- import { FormWarningText } from "../components/elements/form-warning";
13
- import { MaybeFullPage } from "../components/elements/maybe-full-page";
14
- import { useTranslation } from "../lib/translations";
11
+ import { MessageCard, useStackApp, useUser } from "../index.js";
12
+ import { FormWarningText } from "../components/elements/form-warning.js";
13
+ import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
14
+ import { useTranslation } from "../lib/translations.js";
15
15
  import { jsx, jsxs } from "react/jsx-runtime";
16
16
  function TeamCreation(props) {
17
17
  const { t } = useTranslation();
@@ -7,9 +7,9 @@ import { cacheFunction } from "@stackframe/stack-shared/dist/utils/caches";
7
7
  import { runAsynchronouslyWithAlert } from "@stackframe/stack-shared/dist/utils/promises";
8
8
  import { Typography } from "@stackframe/stack-ui";
9
9
  import React from "react";
10
- import { MessageCard, useStackApp, useUser } from "..";
11
- import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card";
12
- import { useTranslation } from "../lib/translations";
10
+ import { MessageCard, useStackApp, useUser } from "../index.js";
11
+ import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card.js";
12
+ import { useTranslation } from "../lib/translations.js";
13
13
  import { jsx, jsxs } from "react/jsx-runtime";
14
14
  var cachedVerifyInvitation = cacheFunction(async (stackApp, code) => {
15
15
  return await stackApp.verifyTeamInvitationCode(code);