@tern-secure/nextjs 4.0.0 → 4.2.0

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 (132) hide show
  1. package/dist/cjs/app-router/client/TernSecureProvider.js +17 -2
  2. package/dist/cjs/app-router/client/TernSecureProvider.js.map +1 -1
  3. package/dist/cjs/app-router/client/actions.js +49 -49
  4. package/dist/cjs/app-router/client/actions.js.map +1 -1
  5. package/dist/cjs/app-router/route-handler/internal-route.js +17 -2
  6. package/dist/cjs/app-router/route-handler/internal-route.js.map +1 -1
  7. package/dist/cjs/app-router/server/auth.js +42 -28
  8. package/dist/cjs/app-router/server/auth.js.map +1 -1
  9. package/dist/cjs/app-router/server/edge-session.js +80 -0
  10. package/dist/cjs/app-router/server/edge-session.js.map +1 -0
  11. package/dist/cjs/app-router/server/index.js +4 -0
  12. package/dist/cjs/app-router/server/index.js.map +1 -1
  13. package/dist/cjs/app-router/server/jwt.js +141 -0
  14. package/dist/cjs/app-router/server/jwt.js.map +1 -0
  15. package/dist/cjs/app-router/server/sessionTernSecure.js +14 -9
  16. package/dist/cjs/app-router/server/sessionTernSecure.js.map +1 -1
  17. package/dist/cjs/app-router/server/ternSecureMiddleware.js +134 -13
  18. package/dist/cjs/app-router/server/ternSecureMiddleware.js.map +1 -1
  19. package/dist/cjs/boundary/TernSecureClientProvider.js +163 -40
  20. package/dist/cjs/boundary/TernSecureClientProvider.js.map +1 -1
  21. package/dist/cjs/boundary/TernSecureCtx.js.map +1 -1
  22. package/dist/cjs/boundary/hooks/useAuth.js +7 -8
  23. package/dist/cjs/boundary/hooks/useAuth.js.map +1 -1
  24. package/dist/cjs/components/sign-in.js +136 -45
  25. package/dist/cjs/components/sign-in.js.map +1 -1
  26. package/dist/cjs/components/sign-out-button.js +10 -1
  27. package/dist/cjs/components/sign-out-button.js.map +1 -1
  28. package/dist/cjs/components/sign-out.js +12 -3
  29. package/dist/cjs/components/sign-out.js.map +1 -1
  30. package/dist/cjs/components/sign-up.js +10 -5
  31. package/dist/cjs/components/sign-up.js.map +1 -1
  32. package/dist/cjs/errors.js +232 -5
  33. package/dist/cjs/errors.js.map +1 -1
  34. package/dist/cjs/index.js +0 -3
  35. package/dist/cjs/index.js.map +1 -1
  36. package/dist/cjs/types.js +14 -0
  37. package/dist/cjs/types.js.map +1 -1
  38. package/dist/cjs/utils/construct.js +50 -18
  39. package/dist/cjs/utils/construct.js.map +1 -1
  40. package/dist/cjs/utils/redirect.js +57 -0
  41. package/dist/cjs/utils/redirect.js.map +1 -0
  42. package/dist/esm/app-router/client/TernSecureProvider.js +17 -2
  43. package/dist/esm/app-router/client/TernSecureProvider.js.map +1 -1
  44. package/dist/esm/app-router/client/actions.js +59 -51
  45. package/dist/esm/app-router/client/actions.js.map +1 -1
  46. package/dist/esm/app-router/route-handler/internal-route.js +13 -1
  47. package/dist/esm/app-router/route-handler/internal-route.js.map +1 -1
  48. package/dist/esm/app-router/server/auth.js +40 -28
  49. package/dist/esm/app-router/server/auth.js.map +1 -1
  50. package/dist/esm/app-router/server/edge-session.js +56 -0
  51. package/dist/esm/app-router/server/edge-session.js.map +1 -0
  52. package/dist/esm/app-router/server/index.js +4 -2
  53. package/dist/esm/app-router/server/index.js.map +1 -1
  54. package/dist/esm/app-router/server/jwt.js +117 -0
  55. package/dist/esm/app-router/server/jwt.js.map +1 -0
  56. package/dist/esm/app-router/server/sessionTernSecure.js +14 -9
  57. package/dist/esm/app-router/server/sessionTernSecure.js.map +1 -1
  58. package/dist/esm/app-router/server/ternSecureMiddleware.js +132 -13
  59. package/dist/esm/app-router/server/ternSecureMiddleware.js.map +1 -1
  60. package/dist/esm/boundary/TernSecureClientProvider.js +164 -41
  61. package/dist/esm/boundary/TernSecureClientProvider.js.map +1 -1
  62. package/dist/esm/boundary/TernSecureCtx.js.map +1 -1
  63. package/dist/esm/boundary/hooks/useAuth.js +7 -8
  64. package/dist/esm/boundary/hooks/useAuth.js.map +1 -1
  65. package/dist/esm/components/sign-in.js +137 -46
  66. package/dist/esm/components/sign-in.js.map +1 -1
  67. package/dist/esm/components/sign-out-button.js +11 -2
  68. package/dist/esm/components/sign-out-button.js.map +1 -1
  69. package/dist/esm/components/sign-out.js +13 -4
  70. package/dist/esm/components/sign-out.js.map +1 -1
  71. package/dist/esm/components/sign-up.js +10 -5
  72. package/dist/esm/components/sign-up.js.map +1 -1
  73. package/dist/esm/errors.js +228 -4
  74. package/dist/esm/errors.js.map +1 -1
  75. package/dist/esm/index.js +0 -2
  76. package/dist/esm/index.js.map +1 -1
  77. package/dist/esm/types.js +6 -0
  78. package/dist/esm/types.js.map +1 -1
  79. package/dist/esm/utils/construct.js +46 -17
  80. package/dist/esm/utils/construct.js.map +1 -1
  81. package/dist/esm/utils/redirect.js +32 -0
  82. package/dist/esm/utils/redirect.js.map +1 -0
  83. package/dist/types/app-router/client/TernSecureProvider.d.ts +14 -3
  84. package/dist/types/app-router/client/TernSecureProvider.d.ts.map +1 -1
  85. package/dist/types/app-router/client/actions.d.ts +23 -21
  86. package/dist/types/app-router/client/actions.d.ts.map +1 -1
  87. package/dist/types/app-router/route-handler/internal-route.d.ts +3 -0
  88. package/dist/types/app-router/route-handler/internal-route.d.ts.map +1 -1
  89. package/dist/types/app-router/server/auth.d.ts +13 -1
  90. package/dist/types/app-router/server/auth.d.ts.map +1 -1
  91. package/dist/types/app-router/server/edge-session.d.ts +15 -0
  92. package/dist/types/app-router/server/edge-session.d.ts.map +1 -0
  93. package/dist/types/app-router/server/index.d.ts +3 -2
  94. package/dist/types/app-router/server/index.d.ts.map +1 -1
  95. package/dist/types/app-router/server/jwt.d.ts +20 -0
  96. package/dist/types/app-router/server/jwt.d.ts.map +1 -0
  97. package/dist/types/app-router/server/sessionTernSecure.d.ts +4 -1
  98. package/dist/types/app-router/server/sessionTernSecure.d.ts.map +1 -1
  99. package/dist/types/app-router/server/ternSecureMiddleware.d.ts +17 -4
  100. package/dist/types/app-router/server/ternSecureMiddleware.d.ts.map +1 -1
  101. package/dist/types/boundary/TernSecureClientProvider.d.ts +17 -1
  102. package/dist/types/boundary/TernSecureClientProvider.d.ts.map +1 -1
  103. package/dist/types/boundary/TernSecureCtx.d.ts +3 -1
  104. package/dist/types/boundary/TernSecureCtx.d.ts.map +1 -1
  105. package/dist/types/boundary/hooks/useAuth.d.ts +4 -1
  106. package/dist/types/boundary/hooks/useAuth.d.ts.map +1 -1
  107. package/dist/types/components/sign-in.d.ts +1 -2
  108. package/dist/types/components/sign-in.d.ts.map +1 -1
  109. package/dist/types/components/sign-out-button.d.ts +2 -1
  110. package/dist/types/components/sign-out-button.d.ts.map +1 -1
  111. package/dist/types/components/sign-out.d.ts +2 -1
  112. package/dist/types/components/sign-out.d.ts.map +1 -1
  113. package/dist/types/components/sign-up.d.ts.map +1 -1
  114. package/dist/types/components/ui/alert.d.ts +1 -1
  115. package/dist/types/components/ui/button.d.ts +1 -1
  116. package/dist/types/errors.d.ts +36 -2
  117. package/dist/types/errors.d.ts.map +1 -1
  118. package/dist/types/index.d.ts +0 -1
  119. package/dist/types/index.d.ts.map +1 -1
  120. package/dist/types/types.d.ts +35 -0
  121. package/dist/types/types.d.ts.map +1 -1
  122. package/dist/types/utils/construct.d.ts +20 -4
  123. package/dist/types/utils/construct.d.ts.map +1 -1
  124. package/dist/types/utils/redirect.d.ts +9 -0
  125. package/dist/types/utils/redirect.d.ts.map +1 -0
  126. package/package.json +7 -6
  127. package/dist/cjs/boundary/hooks/useUser.js +0 -44
  128. package/dist/cjs/boundary/hooks/useUser.js.map +0 -1
  129. package/dist/esm/boundary/hooks/useUser.js +0 -20
  130. package/dist/esm/boundary/hooks/useUser.js.map +0 -1
  131. package/dist/types/boundary/hooks/useUser.d.ts +0 -7
  132. package/dist/types/boundary/hooks/useUser.d.ts.map +0 -1
@@ -23,8 +23,23 @@ __export(TernSecureProvider_exports, {
23
23
  module.exports = __toCommonJS(TernSecureProvider_exports);
24
24
  var import_jsx_runtime = require("react/jsx-runtime");
25
25
  var import_TernSecureClientProvider = require("../../boundary/TernSecureClientProvider");
26
- async function TernSecureProvider({ children }) {
27
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_TernSecureClientProvider.TernSecureClientProvider, { children });
26
+ async function TernSecureProvider({
27
+ children,
28
+ requiresVerification = true,
29
+ loginPath,
30
+ signUpPath,
31
+ loadingComponent
32
+ }) {
33
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
34
+ import_TernSecureClientProvider.TernSecureClientProvider,
35
+ {
36
+ requiresVerification,
37
+ loginPath,
38
+ signUpPath,
39
+ loadingComponent,
40
+ children
41
+ }
42
+ );
28
43
  }
29
44
  // Annotate the CommonJS export names for ESM import in node:
30
45
  0 && (module.exports = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app-router/client/TernSecureProvider.tsx"],"sourcesContent":["import React from \"react\"\nimport { TernSecureClientProvider } from \"../../boundary/TernSecureClientProvider\"\n\n\n// Loading fallback component\n/*function TernSecureLoadingFallback() {\n return (\n <div>\n <span className=\"sr-only\">Loading...</span>\n </div>\n )\n}*/\n/**\n * Root Provider for TernSecure\n * Use this in your Next.js App Router root layout\n * Automatically handles client/server boundary and authentication state\n * \n * @example\n * /// app/layout.tsx\n * import { TernSecureProvider } from '@tern/secure'\n * \n * export default function RootLayout({ children }) {\n * return (\n * <html>\n * <body>\n * <TernSecureProvider>\n * {children}\n * </TernSecureProvider>\n * </body>\n * </html>\n * )\n * }\n */\nexport async function TernSecureProvider({ children }: { children: React.ReactNode }) {\n return (\n <TernSecureClientProvider>\n {children}\n </TernSecureClientProvider>\n )\n}"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAmCI;AAlCJ,sCAAyC;AAgCzC,eAAsB,mBAAmB,EAAE,SAAS,GAAkC;AACpF,SACE,4CAAC,4DACI,UACL;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/app-router/client/TernSecureProvider.tsx"],"sourcesContent":["import React from \"react\"\nimport { TernSecureClientProvider } from \"../../boundary/TernSecureClientProvider\"\n\n\n/**\n * Configuration options for TernSecure authentication\n */\nexport interface TernSecureConfig {\n /** Whether email verification is required (defaults to true) */\n requiresVerification?: boolean\n /** Custom path for login page (defaults to /sign-in) */\n loginPath?: string\n /** Custom path for signup page (defaults to /sign-up) */\n signUpPath?: string\n /** Custom loading component */\n loadingComponent?: React.ReactNode\n}\n\n// Loading fallback component\n/*function TernSecureLoadingFallback() {\n return (\n <div>\n <span className=\"sr-only\">Loading...</span>\n </div>\n )\n}*/\n/**\n * Root Provider for TernSecure\n * Use this in your Next.js App Router root layout\n * Automatically handles client/server boundary and authentication state\n * \n * @example\n * /// app/layout.tsx\n * import { TernSecureProvider } from '@tern/secure'\n * \n * export default function RootLayout({ children }) {\n * return (\n * <html>\n * <body>\n * <TernSecureProvider>\n * {children}\n * </TernSecureProvider>\n * </body>\n * </html>\n * )\n * }\n */\nexport async function TernSecureProvider({ \n children,\n requiresVerification = true,\n loginPath,\n signUpPath,\n loadingComponent,\n }: React.PropsWithChildren<TernSecureConfig>) {\n return (\n <TernSecureClientProvider\n requiresVerification={requiresVerification}\n loginPath={loginPath}\n signUpPath={signUpPath}\n loadingComponent={loadingComponent}\n >\n {children}\n </TernSecureClientProvider>\n )\n}"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAuDI;AAtDJ,sCAAyC;AA8CzC,eAAsB,mBAAmB;AAAA,EACvC;AAAA,EACA,uBAAuB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AACD,GAA8C;AAC7C,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEG;AAAA;AAAA,EACL;AAEJ;","names":[]}
@@ -38,27 +38,19 @@ async function createUser(email, password) {
38
38
  };
39
39
  const userCredential = await (0, import_auth.createUserWithEmailAndPassword)(auth, email, password);
40
40
  await (0, import_auth.sendEmailVerification)(userCredential.user, actionCodeSettings);
41
- return { success: true, message: "Account created successfully.", user: userCredential.user };
41
+ return {
42
+ success: true,
43
+ message: "Account created successfully. Please check your email for verification",
44
+ user: userCredential.user
45
+ };
42
46
  } catch (error) {
43
- if (error instanceof Error) {
44
- switch (error.message) {
45
- case "auth/too-many-requests":
46
- throw new Error("Too many attempts. Please try again later.");
47
- case "auth/network-request-failed":
48
- throw new Error("Network disconnected. Please try again later.");
49
- case "auth/email-already-in-use":
50
- throw new Error("Email is already registered.");
51
- case "auth/invalid-email":
52
- throw new Error("Invalid email address.");
53
- case "auth/operation-not-allowed":
54
- throw new Error("Email/password accounts are not enabled.");
55
- case "auth/weak-password":
56
- throw new Error("Password is too weak.");
57
- default:
58
- throw new Error(error.message);
59
- }
60
- }
61
- throw new Error("Failed to create account");
47
+ const authError = (0, import_errors.handleFirebaseAuthError)(error);
48
+ return {
49
+ success: false,
50
+ message: authError.message,
51
+ error: authError.code,
52
+ user: null
53
+ };
62
54
  }
63
55
  }
64
56
  async function signInWithEmail(email, password) {
@@ -69,12 +61,17 @@ async function signInWithEmail(email, password) {
69
61
  return {
70
62
  success: true,
71
63
  message: "Authentication successful",
72
- user: UserCredential.user,
73
- error: !user.emailVerified ? import_errors.ERRORS.REQUIRES_VERIFICATION : void 0
64
+ user,
65
+ error: !user.emailVerified ? "REQUIRES_VERIFICATION" : "AUTHENTICATED"
74
66
  };
75
67
  } catch (error) {
76
- const errorMessage = error instanceof Error ? error.message : "Failed to sign in";
77
- throw new Error(errorMessage);
68
+ const authError = (0, import_errors.handleFirebaseAuthError)(error);
69
+ return {
70
+ success: false,
71
+ message: authError.message,
72
+ error: authError.code,
73
+ user: null
74
+ };
78
75
  }
79
76
  }
80
77
  async function signInWithRedirectGoogle() {
@@ -88,8 +85,13 @@ async function signInWithRedirectGoogle() {
88
85
  await (0, import_auth.signInWithRedirect)(auth, provider);
89
86
  return { success: true, message: "Redirect initiated" };
90
87
  } catch (error) {
91
- console.error("Error during Google sign-in:", error);
92
- return { success: false, error: "Failed to sign in with Google" };
88
+ const authError = (0, import_errors.handleFirebaseAuthError)(error);
89
+ return {
90
+ success: false,
91
+ message: authError.message,
92
+ error: authError.code,
93
+ user: null
94
+ };
93
95
  }
94
96
  }
95
97
  async function signInWithMicrosoft() {
@@ -102,8 +104,13 @@ async function signInWithMicrosoft() {
102
104
  await (0, import_auth.signInWithRedirect)(auth, provider);
103
105
  return { success: true, message: "Redirect initiated" };
104
106
  } catch (error) {
105
- console.error("Error during Google sign-in:", error);
106
- return { success: false, error: "Failed to sign in with Google" };
107
+ const authError = (0, import_errors.handleFirebaseAuthError)(error);
108
+ return {
109
+ success: false,
110
+ message: authError.message,
111
+ error: authError.code,
112
+ user: null
113
+ };
107
114
  }
108
115
  }
109
116
  async function handleAuthRedirectResult() {
@@ -117,8 +124,13 @@ async function handleAuthRedirectResult() {
117
124
  return { success: false, error: "No redirect result" };
118
125
  }
119
126
  } catch (error) {
120
- console.error("Error handling auth redirect result:", error);
121
- return { success: false, error: error.message || "Failed to handle auth redirect", code: error.code };
127
+ const authError = (0, import_errors.handleFirebaseAuthError)(error);
128
+ return {
129
+ success: false,
130
+ message: authError.message,
131
+ error: authError.code,
132
+ user: null
133
+ };
122
134
  }
123
135
  }
124
136
  async function resendEmailVerification() {
@@ -147,25 +159,13 @@ async function resendEmailVerification() {
147
159
  isVerified: false
148
160
  };
149
161
  } catch (error) {
150
- if (error instanceof Error) {
151
- switch (error.message) {
152
- case "auth/too-many-requests":
153
- throw new Error("Too many attempts. Please try again later.");
154
- case "auth/network-request-failed":
155
- throw new Error("Network disconnected. Please try again later.");
156
- case "auth/email-already-in-use":
157
- throw new Error("Email is already registered.");
158
- case "auth/invalid-email":
159
- throw new Error("Invalid email address.");
160
- case "auth/operation-not-allowed":
161
- throw new Error("Email/password accounts are not enabled.");
162
- case "auth/weak-password":
163
- throw new Error("Password is too weak.");
164
- default:
165
- throw new Error(error.message);
166
- }
167
- }
168
- throw new Error("Failed to resend verification email.");
162
+ const authError = (0, import_errors.handleFirebaseAuthError)(error);
163
+ return {
164
+ success: false,
165
+ message: authError.message,
166
+ error: authError.code,
167
+ user: null
168
+ };
169
169
  }
170
170
  }
171
171
  // Annotate the CommonJS export names for ESM import in node:
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app-router/client/actions.ts"],"sourcesContent":["import { TernSecureAuth } from '../../utils/client-init'\nimport { signInWithEmailAndPassword, signInWithRedirect, getRedirectResult, GoogleAuthProvider, OAuthProvider, createUserWithEmailAndPassword, sendEmailVerification } from 'firebase/auth'\nimport { ERRORS } from '../../errors'\n\nexport interface SignInResponse {\n success: boolean;\n message?: string;\n error?: typeof ERRORS[keyof typeof ERRORS];\n user?: any;\n}\n\nexport async function createUser(email: string, password: string) {\n const auth = TernSecureAuth()\n try {\n \n const actionCodeSettings = {\n url: `${window.location.origin}/sign-in`,\n handleCodeInApp: true\n };\n\n const userCredential = await createUserWithEmailAndPassword(auth, email, password);\n\n await sendEmailVerification(userCredential.user, actionCodeSettings)\n \n return { success: true, message: 'Account created successfully.', user: userCredential.user };\n\n } catch (error) {\n // Handle specific Firebase auth errors\n if (error instanceof Error) {\n switch (error.message) {\n case 'auth/too-many-requests':\n throw new Error('Too many attempts. Please try again later.');\n case 'auth/network-request-failed':\n throw new Error('Network disconnected. Please try again later.');\n case 'auth/email-already-in-use':\n throw new Error('Email is already registered.');\n case 'auth/invalid-email':\n throw new Error('Invalid email address.');\n case 'auth/operation-not-allowed':\n throw new Error('Email/password accounts are not enabled.');\n case 'auth/weak-password':\n throw new Error('Password is too weak.');\n default:\n throw new Error(error.message);\n }\n }\n throw new Error('Failed to create account');\n }\n}\n\n\nexport async function signInWithEmail(email: string, password: string): Promise<SignInResponse> {\n const auth = TernSecureAuth()\n try {\n const UserCredential = await signInWithEmailAndPassword(auth, email, password)\n const user = UserCredential.user\n return { \n success: true, \n message: 'Authentication successful',\n user: UserCredential.user,\n error: !user.emailVerified ? ERRORS.REQUIRES_VERIFICATION : undefined\n };\n \n} catch (error){\n const errorMessage = error instanceof Error ? error.message : 'Failed to sign in';\n throw new Error(errorMessage);\n}\n} \n\nexport async function signInWithRedirectGoogle() {\n const auth = TernSecureAuth()\n const provider = new GoogleAuthProvider()\n provider.setCustomParameters({\n login_hint: 'user@example.com',\n prompt: 'select_account'\n })\n\n try {\n await signInWithRedirect(auth, provider)\n return { success: true, message: 'Redirect initiated' }\n } catch (error) {\n console.error('Error during Google sign-in:', error)\n return { success: false, error: 'Failed to sign in with Google' }\n }\n}\n\n\nexport async function signInWithMicrosoft() {\n const auth = TernSecureAuth()\n const provider = new OAuthProvider('microsoft.com')\n provider.setCustomParameters({\n prompt: 'consent'\n })\n\n try {\n await signInWithRedirect(auth, provider)\n return { success: true, message: 'Redirect initiated' }\n } catch (error) {\n console.error('Error during Google sign-in:', error)\n return { success: false, error: 'Failed to sign in with Google' }\n }\n}\n\n\nexport async function handleAuthRedirectResult() {\n const auth = TernSecureAuth()\n try {\n const result = await getRedirectResult(auth)\n if (result) {\n const user = result.user\n return { success: true, user }\n } else {\n return { success: false, error: 'No redirect result' }\n }\n } catch (error: any) {\n console.error('Error handling auth redirect result:', error)\n return { success: false, error: error.message || 'Failed to handle auth redirect', code: error.code }\n }\n}\n\n\nexport async function resendEmailVerification() {\n const auth = TernSecureAuth()\n try {\n const user = auth.currentUser;\n if (!user) {\n throw new Error('No user found. Please try signing up again.');\n }\n\n await user.reload();\n\n if (user.emailVerified) {\n return { \n success: true, \n message: 'Email is already verified. You can sign in.',\n isVerified: true \n };\n }\n\n const actionCodeSettings = {\n url: `${window.location.origin}/sign-in`,\n handleCodeInApp: true,\n };\n\n await sendEmailVerification(user, actionCodeSettings);\n return { \n success: true, \n message: 'Verification email sent successfully.',\n isVerified: false\n };\n } catch (error) {\n if (error instanceof Error) {\n switch (error.message) {\n case 'auth/too-many-requests':\n throw new Error('Too many attempts. Please try again later.');\n case 'auth/network-request-failed':\n throw new Error('Network disconnected. Please try again later.');\n case 'auth/email-already-in-use':\n throw new Error('Email is already registered.');\n case 'auth/invalid-email':\n throw new Error('Invalid email address.');\n case 'auth/operation-not-allowed':\n throw new Error('Email/password accounts are not enabled.');\n case 'auth/weak-password':\n throw new Error('Password is too weak.');\n default:\n throw new Error(error.message);\n }\n }\n throw new Error('Failed to resend verification email.');\n }\n}"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/app-router/client/actions.ts"],"sourcesContent":["import { TernSecureAuth } from '../../utils/client-init'\nimport { \n signInWithEmailAndPassword, \n signInWithRedirect, \n getRedirectResult, \n GoogleAuthProvider, \n OAuthProvider, \n createUserWithEmailAndPassword, \n sendEmailVerification } from 'firebase/auth'\nimport type { SignInResponse } from '../../types'\nimport { handleFirebaseAuthError } from '../../errors'\n\n\nexport async function createUser(email: string, password: string): Promise<SignInResponse> {\n const auth = TernSecureAuth()\n try {\n \n const actionCodeSettings = {\n url: `${window.location.origin}/sign-in`,\n handleCodeInApp: true\n };\n\n const userCredential = await createUserWithEmailAndPassword(auth, email, password);\n\n await sendEmailVerification(userCredential.user, actionCodeSettings)\n \n return { \n success: true, \n message: 'Account created successfully. Please check your email for verification', \n user: userCredential.user \n };\n\n } catch (error) {\n const authError = handleFirebaseAuthError(error)\n return { \n success: false, \n message: authError.message, \n error: authError.code,\n user: null\n }\n }\n}\n\n\nexport async function signInWithEmail(email: string, password: string): Promise<SignInResponse> {\n const auth = TernSecureAuth()\n try {\n const UserCredential = await signInWithEmailAndPassword(auth, email, password)\n const user = UserCredential.user\n \n return { \n success: true, \n message: 'Authentication successful',\n user: user,\n error: !user.emailVerified ? 'REQUIRES_VERIFICATION' : 'AUTHENTICATED'\n };\n\n} catch (error){\n const authError = handleFirebaseAuthError(error)\n return { \n success: false,\n message: authError.message,\n error: authError.code,\n user: null\n }\n}\n}\n\nexport async function signInWithRedirectGoogle() {\n const auth = TernSecureAuth()\n const provider = new GoogleAuthProvider()\n provider.setCustomParameters({\n login_hint: 'user@example.com',\n prompt: 'select_account'\n })\n\n try {\n await signInWithRedirect(auth, provider)\n return { success: true, message: 'Redirect initiated' }\n } catch (error) {\n const authError = handleFirebaseAuthError(error)\n return {\n success: false,\n message: authError.message,\n error: authError.code,\n user: null\n }\n }\n}\n\n\nexport async function signInWithMicrosoft() {\n const auth = TernSecureAuth()\n const provider = new OAuthProvider('microsoft.com')\n provider.setCustomParameters({\n prompt: 'consent'\n })\n\n try {\n await signInWithRedirect(auth, provider)\n return { success: true, message: 'Redirect initiated' }\n } catch (error) {\n const authError = handleFirebaseAuthError(error)\n return {\n success: false, \n message: authError.message,\n error: authError.code,\n user: null\n }\n }\n}\n\n\nexport async function handleAuthRedirectResult() {\n const auth = TernSecureAuth()\n try {\n const result = await getRedirectResult(auth)\n if (result) {\n const user = result.user\n return { success: true, user }\n } else {\n return { success: false, error: 'No redirect result' }\n }\n } catch (error: any) {\n const authError = handleFirebaseAuthError(error)\n return {\n success: false,\n message: authError.message,\n error: authError.code,\n user: null\n }\n }\n}\n\n\nexport async function resendEmailVerification() {\n const auth = TernSecureAuth()\n try {\n const user = auth.currentUser;\n if (!user) {\n throw new Error('No user found. Please try signing up again.');\n }\n\n await user.reload();\n\n if (user.emailVerified) {\n return { \n success: true, \n message: 'Email is already verified. You can sign in.',\n isVerified: true \n };\n }\n\n const actionCodeSettings = {\n url: `${window.location.origin}/sign-in`,\n handleCodeInApp: true,\n };\n\n await sendEmailVerification(user, actionCodeSettings);\n return { \n success: true, \n message: 'Verification email sent successfully.',\n isVerified: false\n };\n } catch (error) {\n const authError = handleFirebaseAuthError(error)\n return {\n success: false,\n message: authError.message,\n error: authError.code,\n user: null\n }\n }\n}"],"mappings":"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","names":[]}
@@ -19,7 +19,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  var internal_route_exports = {};
20
20
  __export(internal_route_exports, {
21
21
  handleInternalRoute: () => handleInternalRoute,
22
- internalRoutes: () => internalRoutes
22
+ internalRoutes: () => internalRoutes,
23
+ isAuthRoute: () => isAuthRoute,
24
+ isBaseAuthRoute: () => isBaseAuthRoute,
25
+ isInternalRoute: () => isInternalRoute
23
26
  });
24
27
  module.exports = __toCommonJS(internal_route_exports);
25
28
  var import_verify = require("../../components/verify");
@@ -33,6 +36,15 @@ const internalRoutes = {
33
36
  component: import_verify.Verify
34
37
  }
35
38
  };
39
+ function isInternalRoute(pathname) {
40
+ return Object.values(internalRoutes).some((route) => route.pattern.test(pathname));
41
+ }
42
+ function isAuthRoute(pathname) {
43
+ return pathname.startsWith("/sign-in") || pathname.startsWith("/sign-up");
44
+ }
45
+ function isBaseAuthRoute(pathname) {
46
+ return pathname === "/sign-in" || pathname === "/sign-up";
47
+ }
36
48
  function handleInternalRoute(pathname) {
37
49
  for (const [key, route] of Object.entries(internalRoutes)) {
38
50
  if (route.pattern.test(pathname)) {
@@ -44,6 +56,9 @@ function handleInternalRoute(pathname) {
44
56
  // Annotate the CommonJS export names for ESM import in node:
45
57
  0 && (module.exports = {
46
58
  handleInternalRoute,
47
- internalRoutes
59
+ internalRoutes,
60
+ isAuthRoute,
61
+ isBaseAuthRoute,
62
+ isInternalRoute
48
63
  });
49
64
  //# sourceMappingURL=internal-route.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app-router/route-handler/internal-route.tsx"],"sourcesContent":["import { Verify } from \"../../components/verify\"\n\n// Internal route mapping\nexport const internalRoutes = {\n signUpVerify: {\n pattern: /^\\/sign-up\\/verify$/,\n component: Verify,\n },\n signInVerify: {\n pattern: /^\\/sign-in\\/verify$/,\n component: Verify,\n },\n}\n\n// Internal route handler\nexport function handleInternalRoute(pathname: string) {\n for (const [key, route] of Object.entries(internalRoutes)) {\n if (route.pattern.test(pathname)) {\n return route.component\n }\n }\n return null\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuB;AAGhB,MAAM,iBAAiB;AAAA,EAC5B,cAAc;AAAA,IACZ,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AAAA,EACA,cAAc;AAAA,IACZ,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AACF;AAGO,SAAS,oBAAoB,UAAkB;AACpD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,cAAc,GAAG;AACzD,QAAI,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAChC,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../../src/app-router/route-handler/internal-route.tsx"],"sourcesContent":["import { Verify } from \"../../components/verify\"\n\n// Internal route mapping\nexport const internalRoutes = {\n signUpVerify: {\n pattern: /^\\/sign-up\\/verify$/,\n component: Verify,\n },\n signInVerify: {\n pattern: /^\\/sign-in\\/verify$/,\n component: Verify,\n },\n}\n\n// Check if path is an internal route\nexport function isInternalRoute(pathname: string): boolean {\n return Object.values(internalRoutes).some((route) => route.pattern.test(pathname))\n}\n\n// Check if path is within auth routes\nexport function isAuthRoute(pathname: string): boolean {\n return pathname.startsWith(\"/sign-in\") || pathname.startsWith(\"/sign-up\")\n}\n\n// Check if path is exactly the base auth route\nexport function isBaseAuthRoute(pathname: string): boolean {\n return pathname === \"/sign-in\" || pathname === \"/sign-up\"\n}\n\n// Internal route handler\nexport function handleInternalRoute(pathname: string) {\n for (const [key, route] of Object.entries(internalRoutes)) {\n if (route.pattern.test(pathname)) {\n return route.component\n }\n }\n return null\n}"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuB;AAGhB,MAAM,iBAAiB;AAAA,EAC5B,cAAc;AAAA,IACZ,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AAAA,EACA,cAAc;AAAA,IACZ,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AACF;AAGO,SAAS,gBAAgB,UAA2B;AACzD,SAAO,OAAO,OAAO,cAAc,EAAE,KAAK,CAAC,UAAU,MAAM,QAAQ,KAAK,QAAQ,CAAC;AACnF;AAGO,SAAS,YAAY,UAA2B;AACrD,SAAO,SAAS,WAAW,UAAU,KAAK,SAAS,WAAW,UAAU;AAC1E;AAGO,SAAS,gBAAgB,UAA2B;AACzD,SAAO,aAAa,cAAc,aAAa;AACjD;AAGO,SAAS,oBAAoB,UAAkB;AACpD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,cAAc,GAAG;AACzD,QAAI,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAChC,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
@@ -19,53 +19,67 @@ var __copyProps = (to, from, except, desc) => {
19
19
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
20
  var auth_exports = {};
21
21
  __export(auth_exports, {
22
- auth: () => auth
22
+ auth: () => auth,
23
+ getUserInfo: () => getUserInfo,
24
+ isAuthenticated: () => isAuthenticated
23
25
  });
24
26
  module.exports = __toCommonJS(auth_exports);
25
27
  var import_headers = require("next/headers");
26
- var import_sessionTernSecure = require("./sessionTernSecure");
27
28
  async function auth() {
28
- var _a, _b, _c;
29
+ var _a, _b;
29
30
  try {
31
+ const headersList = await (0, import_headers.headers)();
30
32
  const cookieStore = await (0, import_headers.cookies)();
31
- const sessionCookie = (_a = cookieStore.get("_session_cookie")) == null ? void 0 : _a.value;
32
- if (sessionCookie) {
33
- const sessionResult = await (0, import_sessionTernSecure.verifyTernSessionCookie)(sessionCookie);
34
- if (sessionResult.valid) {
35
- return {
36
- userId: sessionResult.uid,
37
- token: sessionCookie,
38
- error: null
39
- };
40
- }
41
- }
42
- const idToken = (_b = cookieStore.get("_session_token")) == null ? void 0 : _b.value;
43
- if (idToken) {
44
- const tokenResult = await (0, import_sessionTernSecure.verifyTernIdToken)(idToken);
45
- if (tokenResult.valid) {
46
- return {
47
- userId: (_c = tokenResult.uid) != null ? _c : null,
48
- token: idToken,
49
- error: null
50
- };
51
- }
33
+ const userId = headersList.get("x-user-id");
34
+ const authTime = headersList.get("x-auth-time");
35
+ const emailVerified = headersList.get("x-auth-verified") === "true";
36
+ if (userId) {
37
+ const token = ((_a = cookieStore.get("_session_cookie")) == null ? void 0 : _a.value) || ((_b = cookieStore.get("_session_token")) == null ? void 0 : _b.value) || null;
38
+ return {
39
+ user: {
40
+ uid: userId,
41
+ email: headersList.get("x-user-email") || null,
42
+ emailVerified,
43
+ authTime: authTime ? parseInt(authTime) : void 0
44
+ },
45
+ token,
46
+ error: null
47
+ };
52
48
  }
53
49
  return {
54
- userId: null,
50
+ user: null,
55
51
  token: null,
56
52
  error: new Error("No valid session or token found")
57
53
  };
58
54
  } catch (error) {
59
- console.error("Error in auth function:", error);
55
+ console.error("Error in getAuthResult:", error);
60
56
  return {
61
- userId: null,
57
+ user: null,
62
58
  token: null,
63
59
  error: error instanceof Error ? error : new Error("An unknown error occurred")
64
60
  };
65
61
  }
66
62
  }
63
+ async function isAuthenticated() {
64
+ const authResult = await auth();
65
+ return authResult.user !== null;
66
+ }
67
+ async function getUserInfo() {
68
+ const authResult = await auth();
69
+ if (!authResult.user) {
70
+ return null;
71
+ }
72
+ return {
73
+ uid: authResult.user.uid,
74
+ email: authResult.user.email,
75
+ emailVerified: authResult.user.emailVerified,
76
+ authTime: authResult.user.authTime
77
+ };
78
+ }
67
79
  // Annotate the CommonJS export names for ESM import in node:
68
80
  0 && (module.exports = {
69
- auth
81
+ auth,
82
+ getUserInfo,
83
+ isAuthenticated
70
84
  });
71
85
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app-router/server/auth.ts"],"sourcesContent":["'use server'\n\nimport { cookies } from 'next/headers';\nimport { verifyTernIdToken, verifyTernSessionCookie } from './sessionTernSecure';\n\nexport interface AuthResult {\n userId: string | null;\n token: string | null;\n error: Error | null;\n}\n\nexport async function auth(): Promise<AuthResult> {\n try {\n const cookieStore = await cookies();\n const sessionCookie = cookieStore.get('_session_cookie')?.value;\n if (sessionCookie) {\n const sessionResult = await verifyTernSessionCookie(sessionCookie);\n if (sessionResult.valid) {\n return {\n userId: sessionResult.uid,\n token: sessionCookie,\n error: null\n };\n }\n }\n\n // If session cookie is not present or invalid, try the ID token\n const idToken = cookieStore.get('_session_token')?.value;\n if (idToken) {\n const tokenResult = await verifyTernIdToken(idToken);\n if (tokenResult.valid) {\n return {\n userId: tokenResult.uid ?? null,\n token: idToken,\n error: null\n };\n }\n }\n\n /// If both checks fail, return null values\n return {\n userId: null,\n token: null,\n error: new Error('No valid session or token found')\n };\n } catch (error) {\n console.error('Error in auth function:', error);\n return {\n userId: null,\n token: null,\n error: error instanceof Error ? error : new Error('An unknown error occurred')\n };\n }\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,qBAAwB;AACxB,+BAA4D;AAQ5D,eAAsB,OAA4B;AAXlD;AAYE,MAAI;AACF,UAAM,cAAc,UAAM,wBAAQ;AAClC,UAAM,iBAAgB,iBAAY,IAAI,iBAAiB,MAAjC,mBAAoC;AAC1D,QAAI,eAAe;AACjB,YAAM,gBAAgB,UAAM,kDAAwB,aAAa;AACjE,UAAI,cAAc,OAAO;AACvB,eAAO;AAAA,UACL,QAAQ,cAAc;AAAA,UACtB,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAGA,UAAM,WAAU,iBAAY,IAAI,gBAAgB,MAAhC,mBAAmC;AACnD,QAAI,SAAS;AACX,YAAM,cAAc,UAAM,4CAAkB,OAAO;AACnD,UAAI,YAAY,OAAO;AACrB,eAAO;AAAA,UACL,SAAQ,iBAAY,QAAZ,YAAmB;AAAA,UAC3B,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAGA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO,IAAI,MAAM,iCAAiC;AAAA,IACpD;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,2BAA2B,KAAK;AAC9C,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,2BAA2B;AAAA,IAC/E;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../../src/app-router/server/auth.ts"],"sourcesContent":["'use server'\nimport { cookies, headers } from \"next/headers\"\nimport type { UserInfo, SessionResult } from \"./edge-session\"\n\n\nexport interface AuthResult {\n user: UserInfo | null\n token: string | null\n error: Error | null\n}\n\n\n /**\n * Get the current authenticated user from the session or token\n */\n export async function auth(): Promise<AuthResult> {\n try {\n const headersList = await headers()\n const cookieStore = await cookies()\n\n const userId = headersList.get('x-user-id')\n const authTime = headersList.get('x-auth-time')\n const emailVerified = headersList.get('x-auth-verified') === 'true'\n\n if (userId) {\n const token = cookieStore.get(\"_session_cookie\")?.value || \n cookieStore.get(\"_session_token\")?.value || \n null\n \n return {\n user: {\n uid: userId,\n email: headersList.get('x-user-email') || null,\n emailVerified,\n authTime: authTime ? parseInt(authTime) : undefined\n },\n token,\n error: null\n }\n }\n\n return {\n user: null,\n token: null,\n error: new Error(\"No valid session or token found\"),\n }\n } catch (error) {\n console.error(\"Error in getAuthResult:\", error)\n return {\n user: null,\n token: null,\n error: error instanceof Error ? error : new Error(\"An unknown error occurred\"),\n }\n }\n}\n\n/**\n * Type guard to check if user is authenticated\n */\nexport async function isAuthenticated(): Promise<boolean> {\n const authResult = await auth()\n return authResult.user !== null\n}\n\n/**\n * Get user info from auth result\n */\nexport async function getUserInfo(): Promise<UserInfo | null> {\n const authResult = await auth()\n if (!authResult.user) {\n return null\n }\n\n return {\n uid: authResult.user.uid,\n email: authResult.user.email,\n emailVerified: authResult.user.emailVerified,\n authTime: authResult.user.authTime\n }\n }\n\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,qBAAiC;AAc/B,eAAsB,OAA4B;AAfpD;AAgBI,MAAI;AACF,UAAM,cAAc,UAAM,wBAAQ;AAClC,UAAM,cAAc,UAAM,wBAAQ;AAElC,UAAM,SAAS,YAAY,IAAI,WAAW;AAC1C,UAAM,WAAW,YAAY,IAAI,aAAa;AAC9C,UAAM,gBAAgB,YAAY,IAAI,iBAAiB,MAAM;AAE7D,QAAI,QAAQ;AACV,YAAM,UAAQ,iBAAY,IAAI,iBAAiB,MAAjC,mBAAoC,YACrC,iBAAY,IAAI,gBAAgB,MAAhC,mBAAmC,UACnC;AAEb,aAAO;AAAA,QACL,MAAM;AAAA,UACJ,KAAK;AAAA,UACL,OAAO,YAAY,IAAI,cAAc,KAAK;AAAA,UAC1C;AAAA,UACA,UAAU,WAAW,SAAS,QAAQ,IAAI;AAAA,QAC5C;AAAA,QACA;AAAA,QACA,OAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,IAAI,MAAM,iCAAiC;AAAA,IACpD;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,2BAA2B,KAAK;AAC9C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,2BAA2B;AAAA,IAC/E;AAAA,EACF;AACJ;AAKA,eAAsB,kBAAoC;AACxD,QAAM,aAAa,MAAM,KAAK;AAC9B,SAAO,WAAW,SAAS;AAC7B;AAKA,eAAsB,cAAwC;AAC5D,QAAM,aAAa,MAAM,KAAK;AAC9B,MAAI,CAAC,WAAW,MAAM;AACpB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,KAAK,WAAW,KAAK;AAAA,IACrB,OAAO,WAAW,KAAK;AAAA,IACvB,eAAe,WAAW,KAAK;AAAA,IAC/B,UAAU,WAAW,KAAK;AAAA,EAC5B;AACA;","names":[]}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var edge_session_exports = {};
20
+ __export(edge_session_exports, {
21
+ verifySession: () => verifySession
22
+ });
23
+ module.exports = __toCommonJS(edge_session_exports);
24
+ var import_headers = require("next/headers");
25
+ var import_jwt = require("./jwt");
26
+ async function verifySession(request) {
27
+ var _a, _b, _c, _d, _e, _f;
28
+ try {
29
+ const cookieStore = await (0, import_headers.cookies)();
30
+ const sessionCookie = (_a = cookieStore.get("_session_cookie")) == null ? void 0 : _a.value;
31
+ if (sessionCookie) {
32
+ const result = await (0, import_jwt.verifyFirebaseToken)(sessionCookie, true);
33
+ if (result.valid) {
34
+ return {
35
+ isAuthenticated: true,
36
+ user: {
37
+ uid: (_b = result.uid) != null ? _b : "",
38
+ email: result.email || null,
39
+ emailVerified: (_c = result.emailVerified) != null ? _c : false,
40
+ disabled: false
41
+ }
42
+ };
43
+ }
44
+ console.log("Session cookie verification failed:", result.error);
45
+ }
46
+ const idToken = (_d = cookieStore.get("_session_token")) == null ? void 0 : _d.value;
47
+ if (idToken) {
48
+ const result = await (0, import_jwt.verifyFirebaseToken)(idToken, false);
49
+ if (result.valid) {
50
+ return {
51
+ isAuthenticated: true,
52
+ user: {
53
+ uid: (_e = result.uid) != null ? _e : "",
54
+ email: result.email || null,
55
+ emailVerified: (_f = result.emailVerified) != null ? _f : false,
56
+ disabled: false
57
+ }
58
+ };
59
+ }
60
+ console.log("ID token verification failed:", result.error);
61
+ }
62
+ return {
63
+ isAuthenticated: false,
64
+ user: null,
65
+ error: "No valid session found"
66
+ };
67
+ } catch (error) {
68
+ console.error("Session verification error:", error);
69
+ return {
70
+ isAuthenticated: false,
71
+ user: null,
72
+ error: error instanceof Error ? error.message : "Session verification failed"
73
+ };
74
+ }
75
+ }
76
+ // Annotate the CommonJS export names for ESM import in node:
77
+ 0 && (module.exports = {
78
+ verifySession
79
+ });
80
+ //# sourceMappingURL=edge-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/app-router/server/edge-session.ts"],"sourcesContent":["import { cookies } from \"next/headers\"\nimport { verifyFirebaseToken } from \"./jwt\"\nimport type { NextRequest } from \"next/server\"\n\nexport interface UserInfo {\n uid: string\n email: string | null\n emailVerified?: boolean\n authTime?: number\n disabled?: boolean\n}\n\n\nexport interface SessionResult {\n isAuthenticated: boolean\n user: UserInfo | null\n error?: string\n}\n\nexport async function verifySession(request: NextRequest): Promise<SessionResult> {\n try {\n const cookieStore = await cookies()\n\n // First try session cookie\n const sessionCookie = cookieStore.get(\"_session_cookie\")?.value\n if (sessionCookie) {\n const result = await verifyFirebaseToken(sessionCookie, true)\n if (result.valid) {\n return {\n isAuthenticated: true,\n user: {\n uid: result.uid ?? '',\n email: result.email || null,\n emailVerified: result.emailVerified ?? false,\n disabled: false,\n },\n }\n }\n console.log(\"Session cookie verification failed:\", result.error)\n }\n\n // Then try ID token\n const idToken = cookieStore.get(\"_session_token\")?.value\n if (idToken) {\n const result = await verifyFirebaseToken(idToken, false)\n if (result.valid) {\n return {\n isAuthenticated: true,\n user: {\n uid: result.uid ?? '',\n email: result.email || null,\n emailVerified: result.emailVerified ?? false,\n disabled: false,\n },\n }\n }\n console.log(\"ID token verification failed:\", result.error)\n }\n\n return {\n isAuthenticated: false,\n user: null,\n error: \"No valid session found\",\n }\n } catch (error) {\n console.error(\"Session verification error:\", error)\n return {\n isAuthenticated: false,\n user: null,\n error: error instanceof Error ? error.message : \"Session verification failed\",\n }\n }\n}"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAwB;AACxB,iBAAoC;AAkBpC,eAAsB,cAAc,SAA8C;AAnBlF;AAoBE,MAAI;AACF,UAAM,cAAc,UAAM,wBAAQ;AAGlC,UAAM,iBAAgB,iBAAY,IAAI,iBAAiB,MAAjC,mBAAoC;AAC1D,QAAI,eAAe;AACjB,YAAM,SAAS,UAAM,gCAAoB,eAAe,IAAI;AAC5D,UAAI,OAAO,OAAO;AAChB,eAAO;AAAA,UACL,iBAAiB;AAAA,UACjB,MAAM;AAAA,YACJ,MAAK,YAAO,QAAP,YAAc;AAAA,YACnB,OAAO,OAAO,SAAS;AAAA,YACvB,gBAAe,YAAO,kBAAP,YAAwB;AAAA,YACvC,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AACA,cAAQ,IAAI,uCAAuC,OAAO,KAAK;AAAA,IACjE;AAGA,UAAM,WAAU,iBAAY,IAAI,gBAAgB,MAAhC,mBAAmC;AACnD,QAAI,SAAS;AACX,YAAM,SAAS,UAAM,gCAAoB,SAAS,KAAK;AACvD,UAAI,OAAO,OAAO;AAChB,eAAO;AAAA,UACL,iBAAiB;AAAA,UACjB,MAAM;AAAA,YACJ,MAAK,YAAO,QAAP,YAAc;AAAA,YACnB,OAAO,OAAO,SAAS;AAAA,YACvB,gBAAe,YAAO,kBAAP,YAAwB;AAAA,YACvC,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AACA,cAAQ,IAAI,iCAAiC,OAAO,KAAK;AAAA,IAC3D;AAEA,WAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,+BAA+B,KAAK;AAClD,WAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAClD;AAAA,EACF;AACF;","names":[]}
@@ -21,7 +21,9 @@ __export(server_exports, {
21
21
  adminTernSecureAuth: () => import_admin_init.adminTernSecureAuth,
22
22
  adminTernSecureDb: () => import_admin_init.adminTernSecureDb,
23
23
  auth: () => import_auth.auth,
24
+ createRouteMatcher: () => import_ternSecureMiddleware.createRouteMatcher,
24
25
  createSessionCookie: () => import_sessionTernSecure.createSessionCookie,
26
+ getUserInfo: () => import_auth.getUserInfo,
25
27
  ternSecureMiddleware: () => import_ternSecureMiddleware.ternSecureMiddleware,
26
28
  verifyTernSessionCookie: () => import_sessionTernSecure.verifyTernSessionCookie
27
29
  });
@@ -35,7 +37,9 @@ var import_auth = require("./auth");
35
37
  adminTernSecureAuth,
36
38
  adminTernSecureDb,
37
39
  auth,
40
+ createRouteMatcher,
38
41
  createSessionCookie,
42
+ getUserInfo,
39
43
  ternSecureMiddleware,
40
44
  verifyTernSessionCookie
41
45
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app-router/server/index.ts"],"sourcesContent":["export { adminTernSecureAuth, adminTernSecureDb } from '../../utils/admin-init'\nexport { ternSecureMiddleware } from './ternSecureMiddleware'\nexport { verifyTernSessionCookie, createSessionCookie } from './sessionTernSecure'\nexport { auth } from './auth'"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAuD;AACvD,kCAAqC;AACrC,+BAA6D;AAC7D,kBAAqB;","names":[]}
1
+ {"version":3,"sources":["../../../../src/app-router/server/index.ts"],"sourcesContent":["export { adminTernSecureAuth, adminTernSecureDb } from '../../utils/admin-init'\nexport { ternSecureMiddleware, createRouteMatcher } from './ternSecureMiddleware'\nexport { verifyTernSessionCookie, createSessionCookie } from './sessionTernSecure'\nexport { auth, getUserInfo } from './auth'\nexport type { AuthResult } from './auth'"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAuD;AACvD,kCAAyD;AACzD,+BAA6D;AAC7D,kBAAkC;","names":[]}