@tern-secure/nextjs 4.2.11 → 5.0.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.
- package/README.md +33 -33
- package/dist/cjs/app-router/admin/index.js +5 -8
- package/dist/cjs/app-router/admin/index.js.map +1 -1
- package/dist/cjs/app-router/admin/sessionTernSecure.js +3 -6
- package/dist/cjs/app-router/admin/sessionTernSecure.js.map +1 -1
- package/dist/cjs/app-router/client/TernSecureProvider.js +10 -18
- package/dist/cjs/app-router/client/TernSecureProvider.js.map +1 -1
- package/dist/cjs/app-router/client/actions.js +1 -177
- package/dist/cjs/app-router/client/actions.js.map +1 -1
- package/dist/cjs/app-router/route-handler/internal-route.js +4 -35
- package/dist/cjs/app-router/route-handler/internal-route.js.map +1 -1
- package/dist/cjs/boundary/{hooks/useSignUp.js → components.js} +16 -16
- package/dist/cjs/boundary/components.js.map +1 -0
- package/dist/cjs/{lib/utils.js → boundary/hooks.js} +9 -11
- package/dist/cjs/boundary/hooks.js.map +1 -0
- package/dist/cjs/{boundary/TernSecureCtx.js → components/uiComponents.js} +17 -24
- package/dist/cjs/components/uiComponents.js.map +1 -0
- package/dist/cjs/errors.js +1 -0
- package/dist/cjs/errors.js.map +1 -1
- package/dist/cjs/index.js +13 -27
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/server/auth.js +4 -5
- package/dist/cjs/server/auth.js.map +1 -1
- package/dist/cjs/server/crypto.js.map +1 -1
- package/dist/cjs/server/ctx-store.js +1 -2
- package/dist/cjs/server/ctx-store.js.map +1 -1
- package/dist/cjs/server/edge-session.js +6 -7
- package/dist/cjs/server/edge-session.js.map +1 -1
- package/dist/cjs/server/index.js.map +1 -1
- package/dist/cjs/server/jwt-edge.js.map +1 -1
- package/dist/cjs/server/jwt.js.map +1 -1
- package/dist/cjs/server/session-store.js +3 -1
- package/dist/cjs/server/session-store.js.map +1 -1
- package/dist/cjs/server/ternSecureMiddleware.js.map +1 -1
- package/dist/cjs/server/types.js.map +1 -1
- package/dist/cjs/server/utils.js.map +1 -1
- package/dist/cjs/types.js.map +1 -1
- package/dist/cjs/utils/admin-init.js +3 -0
- package/dist/cjs/utils/admin-init.js.map +1 -1
- package/dist/cjs/utils/allNextProviderProps.js +108 -0
- package/dist/cjs/utils/allNextProviderProps.js.map +1 -0
- package/dist/cjs/utils/client-init.js +2 -47
- package/dist/cjs/utils/client-init.js.map +1 -1
- package/dist/cjs/utils/config.js.map +1 -1
- package/dist/cjs/utils/construct.js.map +1 -1
- package/dist/cjs/utils/create-styles.js.map +1 -1
- package/dist/cjs/utils/redirect.js.map +1 -1
- package/dist/cjs/{components/ui/separator.js → utils/tern-ui-script.js} +41 -24
- package/dist/cjs/utils/tern-ui-script.js.map +1 -0
- package/dist/esm/app-router/admin/index.js +6 -4
- package/dist/esm/app-router/admin/index.js.map +1 -1
- package/dist/esm/app-router/admin/sessionTernSecure.js +3 -6
- package/dist/esm/app-router/admin/sessionTernSecure.js.map +1 -1
- package/dist/esm/app-router/client/TernSecureProvider.js +13 -19
- package/dist/esm/app-router/client/TernSecureProvider.js.map +1 -1
- package/dist/esm/app-router/client/actions.js +1 -157
- package/dist/esm/app-router/client/actions.js.map +1 -1
- package/dist/esm/app-router/route-handler/internal-route.js +5 -30
- package/dist/esm/app-router/route-handler/internal-route.js.map +1 -1
- package/dist/esm/boundary/components.js +18 -0
- package/dist/esm/boundary/components.js.map +1 -0
- package/dist/esm/boundary/hooks.js +9 -0
- package/dist/esm/boundary/hooks.js.map +1 -0
- package/dist/esm/components/uiComponents.js +21 -0
- package/dist/esm/components/uiComponents.js.map +1 -0
- package/dist/esm/errors.js +1 -0
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/index.js +15 -16
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/server/auth.js +4 -5
- package/dist/esm/server/auth.js.map +1 -1
- package/dist/esm/server/crypto.js.map +1 -1
- package/dist/esm/server/ctx-store.js +1 -2
- package/dist/esm/server/ctx-store.js.map +1 -1
- package/dist/esm/server/edge-session.js +6 -7
- package/dist/esm/server/edge-session.js.map +1 -1
- package/dist/esm/server/index.js.map +1 -1
- package/dist/esm/server/jwt-edge.js.map +1 -1
- package/dist/esm/server/jwt.js.map +1 -1
- package/dist/esm/server/session-store.js +3 -1
- package/dist/esm/server/session-store.js.map +1 -1
- package/dist/esm/server/ternSecureMiddleware.js.map +1 -1
- package/dist/esm/server/utils.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/utils/admin-init.js +2 -0
- package/dist/esm/utils/admin-init.js.map +1 -1
- package/dist/esm/utils/allNextProviderProps.js +84 -0
- package/dist/esm/utils/allNextProviderProps.js.map +1 -0
- package/dist/esm/utils/client-init.js +2 -21
- package/dist/esm/utils/client-init.js.map +1 -1
- package/dist/esm/utils/config.js.map +1 -1
- package/dist/esm/utils/construct.js.map +1 -1
- package/dist/esm/utils/create-styles.js.map +1 -1
- package/dist/esm/utils/redirect.js.map +1 -1
- package/dist/esm/utils/tern-ui-script.js +42 -0
- package/dist/esm/utils/tern-ui-script.js.map +1 -0
- package/dist/types/app-router/admin/index.d.ts +1 -2
- package/dist/types/app-router/admin/index.d.ts.map +1 -1
- package/dist/types/app-router/client/TernSecureProvider.d.ts +2 -14
- package/dist/types/app-router/client/TernSecureProvider.d.ts.map +1 -1
- package/dist/types/app-router/client/actions.d.ts +1 -54
- package/dist/types/app-router/client/actions.d.ts.map +1 -1
- package/dist/types/app-router/route-handler/internal-route.d.ts +1 -15
- package/dist/types/app-router/route-handler/internal-route.d.ts.map +1 -1
- package/dist/types/boundary/components.d.ts +2 -0
- package/dist/types/boundary/components.d.ts.map +1 -0
- package/dist/types/boundary/hooks.d.ts +2 -0
- package/dist/types/boundary/hooks.d.ts.map +1 -0
- package/dist/types/components/uiComponents.d.ts +6 -0
- package/dist/types/components/uiComponents.d.ts.map +1 -0
- package/dist/types/errors.d.ts +1 -1
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/index.d.ts +3 -9
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/server/ternSecureMiddleware.d.ts.map +1 -1
- package/dist/types/types.d.ts +6 -13
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/utils/admin-init.d.ts +2 -1
- package/dist/types/utils/admin-init.d.ts.map +1 -1
- package/dist/types/utils/allNextProviderProps.d.ts +6 -0
- package/dist/types/utils/allNextProviderProps.d.ts.map +1 -0
- package/dist/types/utils/client-init.d.ts +1 -4
- package/dist/types/utils/client-init.d.ts.map +1 -1
- package/dist/types/utils/config.d.ts +1 -1
- package/dist/types/utils/config.d.ts.map +1 -1
- package/dist/types/utils/construct.d.ts.map +1 -1
- package/dist/types/utils/tern-ui-script.d.ts +8 -0
- package/dist/types/utils/tern-ui-script.d.ts.map +1 -0
- package/package.json +41 -52
- package/dist/cjs/boundary/TernSecureClientProvider.js +0 -240
- package/dist/cjs/boundary/TernSecureClientProvider.js.map +0 -1
- package/dist/cjs/boundary/TernSecureCtx.js.map +0 -1
- package/dist/cjs/boundary/hooks/useAuth.js +0 -63
- package/dist/cjs/boundary/hooks/useAuth.js.map +0 -1
- package/dist/cjs/boundary/hooks/useSignUp.js.map +0 -1
- package/dist/cjs/components/background.js +0 -65
- package/dist/cjs/components/background.js.map +0 -1
- package/dist/cjs/components/sign-in.js +0 -368
- package/dist/cjs/components/sign-in.js.map +0 -1
- package/dist/cjs/components/sign-out-button.js +0 -84
- package/dist/cjs/components/sign-out-button.js.map +0 -1
- package/dist/cjs/components/sign-out.js +0 -99
- package/dist/cjs/components/sign-out.js.map +0 -1
- package/dist/cjs/components/sign-up.js +0 -332
- package/dist/cjs/components/sign-up.js.map +0 -1
- package/dist/cjs/components/ui/alert.js +0 -88
- package/dist/cjs/components/ui/alert.js.map +0 -1
- package/dist/cjs/components/ui/button.js +0 -84
- package/dist/cjs/components/ui/button.js.map +0 -1
- package/dist/cjs/components/ui/card.js +0 -101
- package/dist/cjs/components/ui/card.js.map +0 -1
- package/dist/cjs/components/ui/input.js +0 -58
- package/dist/cjs/components/ui/input.js.map +0 -1
- package/dist/cjs/components/ui/label.js +0 -55
- package/dist/cjs/components/ui/label.js.map +0 -1
- package/dist/cjs/components/ui/separator.js.map +0 -1
- package/dist/cjs/components/verify.js +0 -195
- package/dist/cjs/components/verify.js.map +0 -1
- package/dist/cjs/lib/utils.d.js +0 -17
- package/dist/cjs/lib/utils.d.js.map +0 -1
- package/dist/cjs/lib/utils.js.map +0 -1
- package/dist/esm/boundary/TernSecureClientProvider.js +0 -216
- package/dist/esm/boundary/TernSecureClientProvider.js.map +0 -1
- package/dist/esm/boundary/TernSecureCtx.js +0 -23
- package/dist/esm/boundary/TernSecureCtx.js.map +0 -1
- package/dist/esm/boundary/hooks/useAuth.js +0 -39
- package/dist/esm/boundary/hooks/useAuth.js.map +0 -1
- package/dist/esm/boundary/hooks/useSignUp.js +0 -16
- package/dist/esm/boundary/hooks/useSignUp.js.map +0 -1
- package/dist/esm/components/background.js +0 -41
- package/dist/esm/components/background.js.map +0 -1
- package/dist/esm/components/sign-in.js +0 -344
- package/dist/esm/components/sign-in.js.map +0 -1
- package/dist/esm/components/sign-out-button.js +0 -60
- package/dist/esm/components/sign-out-button.js.map +0 -1
- package/dist/esm/components/sign-out.js +0 -65
- package/dist/esm/components/sign-out.js.map +0 -1
- package/dist/esm/components/sign-up.js +0 -298
- package/dist/esm/components/sign-up.js.map +0 -1
- package/dist/esm/components/ui/alert.js +0 -52
- package/dist/esm/components/ui/alert.js.map +0 -1
- package/dist/esm/components/ui/button.js +0 -49
- package/dist/esm/components/ui/button.js.map +0 -1
- package/dist/esm/components/ui/card.js +0 -62
- package/dist/esm/components/ui/card.js.map +0 -1
- package/dist/esm/components/ui/input.js +0 -24
- package/dist/esm/components/ui/input.js.map +0 -1
- package/dist/esm/components/ui/label.js +0 -21
- package/dist/esm/components/ui/label.js.map +0 -1
- package/dist/esm/components/ui/separator.js +0 -25
- package/dist/esm/components/ui/separator.js.map +0 -1
- package/dist/esm/components/verify.js +0 -161
- package/dist/esm/components/verify.js.map +0 -1
- package/dist/esm/lib/utils.d.js +0 -1
- package/dist/esm/lib/utils.d.js.map +0 -1
- package/dist/esm/lib/utils.js +0 -9
- package/dist/esm/lib/utils.js.map +0 -1
- package/dist/types/boundary/TernSecureClientProvider.d.ts +0 -27
- package/dist/types/boundary/TernSecureClientProvider.d.ts.map +0 -1
- package/dist/types/boundary/TernSecureCtx.d.ts +0 -11
- package/dist/types/boundary/TernSecureCtx.d.ts.map +0 -1
- package/dist/types/boundary/hooks/useAuth.d.ts +0 -15
- package/dist/types/boundary/hooks/useAuth.d.ts.map +0 -1
- package/dist/types/boundary/hooks/useSignUp.d.ts +0 -5
- package/dist/types/boundary/hooks/useSignUp.d.ts.map +0 -1
- package/dist/types/components/background.d.ts +0 -2
- package/dist/types/components/background.d.ts.map +0 -1
- package/dist/types/components/sign-in.d.ts +0 -18
- package/dist/types/components/sign-in.d.ts.map +0 -1
- package/dist/types/components/sign-out-button.d.ts +0 -14
- package/dist/types/components/sign-out-button.d.ts.map +0 -1
- package/dist/types/components/sign-out.d.ts +0 -12
- package/dist/types/components/sign-out.d.ts.map +0 -1
- package/dist/types/components/sign-up.d.ts +0 -11
- package/dist/types/components/sign-up.d.ts.map +0 -1
- package/dist/types/components/ui/alert.d.ts +0 -9
- package/dist/types/components/ui/alert.d.ts.map +0 -1
- package/dist/types/components/ui/button.d.ts +0 -12
- package/dist/types/components/ui/button.d.ts.map +0 -1
- package/dist/types/components/ui/card.d.ts +0 -9
- package/dist/types/components/ui/card.d.ts.map +0 -1
- package/dist/types/components/ui/input.d.ts +0 -4
- package/dist/types/components/ui/input.d.ts.map +0 -1
- package/dist/types/components/ui/label.d.ts +0 -6
- package/dist/types/components/ui/label.d.ts.map +0 -1
- package/dist/types/components/ui/separator.d.ts +0 -5
- package/dist/types/components/ui/separator.d.ts.map +0 -1
- package/dist/types/components/verify.d.ts +0 -2
- package/dist/types/components/verify.d.ts.map +0 -1
- package/dist/types/lib/utils.d.ts +0 -3
- package/dist/types/lib/utils.d.ts.map +0 -1
- package/server/package.json +0 -5
package/README.md
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
# @tern-secure/nextjs
|
|
2
|
-
|
|
3
|
-
A comprehensive Firebase authentication solution for Next.js applications, providing seamless integration with Firebase Auth, including email/password, Google, and Microsoft authentication methods.
|
|
4
|
-
|
|
5
|
-
[](https://www.npmjs.com/package/@tern-secure/nextjs)
|
|
6
|
-
[](https://opensource.org/licenses/ISC)
|
|
7
|
-
|
|
8
|
-
## Features
|
|
9
|
-
|
|
10
|
-
- 🔐 Multiple authentication methods:
|
|
11
|
-
- Email/Password authentication
|
|
12
|
-
- Google OAuth
|
|
13
|
-
- Microsoft OAuth
|
|
14
|
-
- 🔄 Session management with cookies
|
|
15
|
-
- ⚡ Server-side and client-side components
|
|
16
|
-
- 🎨 Customizable UI components
|
|
17
|
-
- 📦 TypeScript support
|
|
18
|
-
- 🚀 Next.js App Router compatible
|
|
19
|
-
|
|
20
|
-
## Installation
|
|
21
|
-
|
|
22
|
-
## Environment Variables
|
|
23
|
-
|
|
24
|
-
Required environment variables:
|
|
25
|
-
```
|
|
26
|
-
NEXT_PUBLIC_FIREBASE_API_KEY=
|
|
27
|
-
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
|
|
28
|
-
NEXT_PUBLIC_FIREBASE_PROJECT_ID=
|
|
29
|
-
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=
|
|
30
|
-
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=
|
|
31
|
-
NEXT_PUBLIC_FIREBASE_APP_ID=
|
|
32
|
-
FIREBASE_ADMIN_CLIENT_EMAIL=
|
|
33
|
-
FIREBASE_ADMIN_PRIVATE_KEY=
|
|
1
|
+
# @tern-secure/nextjs
|
|
2
|
+
|
|
3
|
+
A comprehensive Firebase authentication solution for Next.js applications, providing seamless integration with Firebase Auth, including email/password, Google, and Microsoft authentication methods.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@tern-secure/nextjs)
|
|
6
|
+
[](https://opensource.org/licenses/ISC)
|
|
7
|
+
|
|
8
|
+
## Features
|
|
9
|
+
|
|
10
|
+
- 🔐 Multiple authentication methods:
|
|
11
|
+
- Email/Password authentication
|
|
12
|
+
- Google OAuth
|
|
13
|
+
- Microsoft OAuth
|
|
14
|
+
- 🔄 Session management with cookies
|
|
15
|
+
- ⚡ Server-side and client-side components
|
|
16
|
+
- 🎨 Customizable UI components
|
|
17
|
+
- 📦 TypeScript support
|
|
18
|
+
- 🚀 Next.js App Router compatible
|
|
19
|
+
|
|
20
|
+
## Installation
|
|
21
|
+
|
|
22
|
+
## Environment Variables
|
|
23
|
+
|
|
24
|
+
Required environment variables:
|
|
25
|
+
```
|
|
26
|
+
NEXT_PUBLIC_FIREBASE_API_KEY=
|
|
27
|
+
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=
|
|
28
|
+
NEXT_PUBLIC_FIREBASE_PROJECT_ID=
|
|
29
|
+
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=
|
|
30
|
+
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=
|
|
31
|
+
NEXT_PUBLIC_FIREBASE_APP_ID=
|
|
32
|
+
FIREBASE_ADMIN_CLIENT_EMAIL=
|
|
33
|
+
FIREBASE_ADMIN_PRIVATE_KEY=
|
|
34
34
|
```
|
|
@@ -18,18 +18,15 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var admin_exports = {};
|
|
20
20
|
__export(admin_exports, {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
verifyTernSessionCookie: () => import_sessionTernSecure.verifyTernSessionCookie
|
|
21
|
+
clearSessionCookie: () => import_backend.clearSessionCookie,
|
|
22
|
+
createSessionCookie: () => import_backend.createSessionCookie,
|
|
23
|
+
verifyTernSessionCookie: () => import_backend.verifyTernSessionCookie
|
|
25
24
|
});
|
|
26
25
|
module.exports = __toCommonJS(admin_exports);
|
|
27
|
-
var
|
|
28
|
-
var import_admin_init = require("../../utils/admin-init");
|
|
26
|
+
var import_backend = require("@tern-secure/backend");
|
|
29
27
|
// Annotate the CommonJS export names for ESM import in node:
|
|
30
28
|
0 && (module.exports = {
|
|
31
|
-
|
|
32
|
-
adminTernSecureDb,
|
|
29
|
+
clearSessionCookie,
|
|
33
30
|
createSessionCookie,
|
|
34
31
|
verifyTernSessionCookie
|
|
35
32
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app-router/admin/index.ts"],"sourcesContent":["export { verifyTernSessionCookie, createSessionCookie
|
|
1
|
+
{"version":3,"sources":["../../../../src/app-router/admin/index.ts"],"sourcesContent":["export { \r\n verifyTernSessionCookie, \r\n createSessionCookie, \r\n clearSessionCookie,\r\n} from '@tern-secure/backend'"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAIO;","names":[]}
|
|
@@ -48,9 +48,8 @@ async function createSessionCookie(idToken) {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
async function getServerSessionCookie() {
|
|
51
|
-
var _a;
|
|
52
51
|
const cookieStore = await (0, import_headers.cookies)();
|
|
53
|
-
const sessionCookie =
|
|
52
|
+
const sessionCookie = cookieStore.get("_session_cookie")?.value;
|
|
54
53
|
if (!sessionCookie) {
|
|
55
54
|
throw new Error("No session cookie found");
|
|
56
55
|
}
|
|
@@ -66,9 +65,8 @@ async function getServerSessionCookie() {
|
|
|
66
65
|
}
|
|
67
66
|
}
|
|
68
67
|
async function getIdToken() {
|
|
69
|
-
var _a;
|
|
70
68
|
const cookieStore = await (0, import_headers.cookies)();
|
|
71
|
-
const token =
|
|
69
|
+
const token = cookieStore.get("_session_token")?.value;
|
|
72
70
|
if (!token) {
|
|
73
71
|
throw new Error("No session cookie found");
|
|
74
72
|
}
|
|
@@ -138,13 +136,12 @@ async function verifyTernSessionCookie(session) {
|
|
|
138
136
|
}
|
|
139
137
|
}
|
|
140
138
|
async function clearSessionCookie() {
|
|
141
|
-
var _a;
|
|
142
139
|
const cookieStore = await (0, import_headers.cookies)();
|
|
143
140
|
cookieStore.delete("_session_cookie");
|
|
144
141
|
cookieStore.delete("_session_token");
|
|
145
142
|
cookieStore.delete("_session");
|
|
146
143
|
try {
|
|
147
|
-
const sessionCookie =
|
|
144
|
+
const sessionCookie = cookieStore.get("_session_cookie")?.value;
|
|
148
145
|
if (sessionCookie) {
|
|
149
146
|
const decodedClaims = await import_admin_init.adminTernSecureAuth.verifySessionCookie(sessionCookie);
|
|
150
147
|
await import_admin_init.adminTernSecureAuth.revokeRefreshTokens(decodedClaims.uid);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app-router/admin/sessionTernSecure.ts"],"sourcesContent":["'use server'\n\nimport { cookies } from 'next/headers';\nimport { adminTernSecureAuth as adminAuth } from '../../utils/admin-init';\nimport { handleFirebaseAuthError, type AuthErrorResponse } from '../../errors';\n\ninterface FirebaseAuthError extends Error {\n code?: string;\n}\n\nexport interface User {\n uid: string | null;\n email: string | null;\n }\n\nexport interface Session {\n user: User | null;\n token: string | null;\n error: Error | null;\n}\n\ninterface TernVerificationResult extends User {\n valid: boolean\n authTime?: number\n error?: AuthErrorResponse\n}\n\nexport async function createSessionCookie(idToken: string) {\n try {\n const expiresIn = 60 * 60 * 24 * 5 * 1000;\n const sessionCookie = await adminAuth.createSessionCookie(idToken, { expiresIn });\n\n const cookieStore = await cookies();\n cookieStore.set('_session_cookie', sessionCookie, {\n maxAge: expiresIn,\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n path: '/',\n });\n return { success: true, message: 'Session created' };\n } catch (error) {\n return { success: false, message: 'Failed to create session' };\n }\n}\n\n\n\nexport async function getServerSessionCookie() {\n const cookieStore = await cookies();\n const sessionCookie = cookieStore.get('_session_cookie')?.value;\n\n if (!sessionCookie) {\n throw new Error('No session cookie found')\n }\n \n try {\n const decondeClaims = await adminAuth.verifySessionCookie(sessionCookie, true)\n return {\n token: sessionCookie,\n userId: decondeClaims.uid\n }\n } catch (error) {\n console.error('Error verifying session:', error)\n throw new Error('Invalid Session')\n }\n}\n\n\nexport async function getIdToken() {\n const cookieStore = await cookies();\n const token = cookieStore.get('_session_token')?.value;\n\n if (!token) {\n throw new Error('No session cookie found')\n }\n \n try {\n const decodedClaims = await adminAuth.verifyIdToken(token)\n return {\n token: token,\n userId: decodedClaims.uid\n }\n } catch (error) {\n console.error('Error verifying session:', error)\n throw new Error('Invalid Session')\n }\n}\n\nexport async function setServerSession(token: string) {\n try {\n const cookieStore = await cookies();\n cookieStore.set('_session_token', token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'strict',\n maxAge: 60 * 60, // 1 hour\n path: '/',\n });\n return { success: true, message: 'Session created' };\n } catch {\n return { success: false, message: 'Failed to create session' };\n }\n}\n\n export async function verifyTernIdToken(token: string): Promise<TernVerificationResult> {\n try {\n const decodedToken = await adminAuth.verifyIdToken(token);\n return {\n valid: true,\n uid: decodedToken.uid,\n email: decodedToken.email || null,\n authTime: decodedToken.auth_time\n };\n } catch (error) {\n const errorResponse = handleFirebaseAuthError(error)\n return {\n valid: false,\n uid: null,\n email: null,\n error: errorResponse\n };\n }\n }\n \n\n export async function verifyTernSessionCookie(session: string): Promise<TernVerificationResult>{\n try {\n const res = await adminAuth.verifySessionCookie(session);\n return { \n valid: true, \n uid: res.uid,\n email: res.email || null,\n authTime: res.auth_time\n };\n } catch (error) {\n const errorResponse = handleFirebaseAuthError(error)\n return {\n valid: false, \n uid: null,\n email: null,\n error: errorResponse\n };\n }\n }\n\n\n export async function clearSessionCookie() {\n const cookieStore = await cookies()\n \n cookieStore.delete('_session_cookie')\n cookieStore.delete('_session_token')\n cookieStore.delete('_session')\n \n try {\n // Verify if there's an active session before revoking\n const sessionCookie = cookieStore.get('_session_cookie')?.value\n if (sessionCookie) {\n // Get the decoded claims to get the user's ID\n const decodedClaims = await adminAuth.verifySessionCookie(sessionCookie)\n \n // Revoke all sessions for the user\n await adminAuth.revokeRefreshTokens(decodedClaims.uid)\n }\n \n return { success: true, message: 'Session cleared successfully' }\n } catch (error) {\n console.error('Error clearing session:', error)\n // Still return success even if revoking fails, as cookies are cleared\n return { success: true, message: 'Session cookies cleared' }\n }\n }\n\n\n\n/*\n export async function GET(request: NextRequest) {\n const cookieStore = await cookies();\n const sessionCookie = cookieStore.get('session')?.value\n \n if (!sessionCookie) {\n return NextResponse.json({ isAuthenticated: false }, { status: 401 })\n }\n \n try {\n const decodedClaims = await adminAuth.verifySessionCookie(sessionCookie, true)\n return NextResponse.json({ isAuthenticated: true, user: decodedClaims }, { status: 200 })\n } catch (error) {\n console.error('Error verifying session cookie:', error)\n return NextResponse.json({ isAuthenticated: false }, { status: 401 })\n }\n }\n\n*/"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,qBAAwB;AACxB,wBAAiD;AACjD,oBAAgE;AAuBhE,eAAsB,oBAAoB,SAAiB;AACzD,MAAI;AACF,UAAM,YAAY,KAAK,KAAK,KAAK,IAAI;AACnC,UAAM,gBAAgB,MAAM,kBAAAA,oBAAU,oBAAoB,SAAS,EAAE,UAAU,CAAC;AAEhF,UAAM,cAAc,UAAM,wBAAQ;AAClC,gBAAY,IAAI,mBAAmB,eAAe;AAAA,MAC9C,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ,QAAQ,IAAI,aAAa;AAAA,MACjC,MAAM;AAAA,IACV,CAAC;AACD,WAAO,EAAE,SAAS,MAAM,SAAS,kBAAkB;AAAA,EACvD,SAAS,OAAO;AACZ,WAAO,EAAE,SAAS,OAAO,SAAS,2BAA2B;AAAA,EACjE;AACF;AAIA,eAAsB,yBAAyB;
|
|
1
|
+
{"version":3,"sources":["../../../../src/app-router/admin/sessionTernSecure.ts"],"sourcesContent":["'use server'\n\nimport { cookies } from 'next/headers';\nimport { adminTernSecureAuth as adminAuth } from '../../utils/admin-init';\nimport { handleFirebaseAuthError, type AuthErrorResponse } from '../../errors';\n\ninterface FirebaseAuthError extends Error {\n code?: string;\n}\n\nexport interface User {\n uid: string | null;\n email: string | null;\n }\n\nexport interface Session {\n user: User | null;\n token: string | null;\n error: Error | null;\n}\n\ninterface TernVerificationResult extends User {\n valid: boolean\n authTime?: number\n error?: AuthErrorResponse\n}\n\nexport async function createSessionCookie(idToken: string) {\n try {\n const expiresIn = 60 * 60 * 24 * 5 * 1000;\n const sessionCookie = await adminAuth.createSessionCookie(idToken, { expiresIn });\n\n const cookieStore = await cookies();\n cookieStore.set('_session_cookie', sessionCookie, {\n maxAge: expiresIn,\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n path: '/',\n });\n return { success: true, message: 'Session created' };\n } catch (error) {\n return { success: false, message: 'Failed to create session' };\n }\n}\n\n\n\nexport async function getServerSessionCookie() {\n const cookieStore = await cookies();\n const sessionCookie = cookieStore.get('_session_cookie')?.value;\n\n if (!sessionCookie) {\n throw new Error('No session cookie found')\n }\n \n try {\n const decondeClaims = await adminAuth.verifySessionCookie(sessionCookie, true)\n return {\n token: sessionCookie,\n userId: decondeClaims.uid\n }\n } catch (error) {\n console.error('Error verifying session:', error)\n throw new Error('Invalid Session')\n }\n}\n\n\nexport async function getIdToken() {\n const cookieStore = await cookies();\n const token = cookieStore.get('_session_token')?.value;\n\n if (!token) {\n throw new Error('No session cookie found')\n }\n \n try {\n const decodedClaims = await adminAuth.verifyIdToken(token)\n return {\n token: token,\n userId: decodedClaims.uid\n }\n } catch (error) {\n console.error('Error verifying session:', error)\n throw new Error('Invalid Session')\n }\n}\n\nexport async function setServerSession(token: string) {\n try {\n const cookieStore = await cookies();\n cookieStore.set('_session_token', token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'strict',\n maxAge: 60 * 60, // 1 hour\n path: '/',\n });\n return { success: true, message: 'Session created' };\n } catch {\n return { success: false, message: 'Failed to create session' };\n }\n}\n\n export async function verifyTernIdToken(token: string): Promise<TernVerificationResult> {\n try {\n const decodedToken = await adminAuth.verifyIdToken(token);\n return {\n valid: true,\n uid: decodedToken.uid,\n email: decodedToken.email || null,\n authTime: decodedToken.auth_time\n };\n } catch (error) {\n const errorResponse = handleFirebaseAuthError(error)\n return {\n valid: false,\n uid: null,\n email: null,\n error: errorResponse\n };\n }\n }\n \n\n export async function verifyTernSessionCookie(session: string): Promise<TernVerificationResult>{\n try {\n const res = await adminAuth.verifySessionCookie(session);\n return { \n valid: true, \n uid: res.uid,\n email: res.email || null,\n authTime: res.auth_time\n };\n } catch (error) {\n const errorResponse = handleFirebaseAuthError(error)\n return {\n valid: false, \n uid: null,\n email: null,\n error: errorResponse\n };\n }\n }\n\n\n export async function clearSessionCookie() {\n const cookieStore = await cookies()\n \n cookieStore.delete('_session_cookie')\n cookieStore.delete('_session_token')\n cookieStore.delete('_session')\n \n try {\n // Verify if there's an active session before revoking\n const sessionCookie = cookieStore.get('_session_cookie')?.value\n if (sessionCookie) {\n // Get the decoded claims to get the user's ID\n const decodedClaims = await adminAuth.verifySessionCookie(sessionCookie)\n \n // Revoke all sessions for the user\n await adminAuth.revokeRefreshTokens(decodedClaims.uid)\n }\n \n return { success: true, message: 'Session cleared successfully' }\n } catch (error) {\n console.error('Error clearing session:', error)\n // Still return success even if revoking fails, as cookies are cleared\n return { success: true, message: 'Session cookies cleared' }\n }\n }\n\n\n\n/*\n export async function GET(request: NextRequest) {\n const cookieStore = await cookies();\n const sessionCookie = cookieStore.get('session')?.value\n \n if (!sessionCookie) {\n return NextResponse.json({ isAuthenticated: false }, { status: 401 })\n }\n \n try {\n const decodedClaims = await adminAuth.verifySessionCookie(sessionCookie, true)\n return NextResponse.json({ isAuthenticated: true, user: decodedClaims }, { status: 200 })\n } catch (error) {\n console.error('Error verifying session cookie:', error)\n return NextResponse.json({ isAuthenticated: false }, { status: 401 })\n }\n }\n\n*/"],"mappings":"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","names":["adminAuth"]}
|
|
@@ -22,24 +22,16 @@ __export(TernSecureProvider_exports, {
|
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(TernSecureProvider_exports);
|
|
24
24
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
25
|
-
var
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
{
|
|
36
|
-
requiresVerification,
|
|
37
|
-
loginPath,
|
|
38
|
-
signUpPath,
|
|
39
|
-
loadingComponent,
|
|
40
|
-
children
|
|
41
|
-
}
|
|
42
|
-
);
|
|
25
|
+
var import_react2 = require("@tern-secure/react");
|
|
26
|
+
var import_allNextProviderProps = require("../../utils/allNextProviderProps");
|
|
27
|
+
var import_tern_ui_script = require("../../utils/tern-ui-script");
|
|
28
|
+
function TernSecureProvider(props) {
|
|
29
|
+
const { children, ...nextProps } = props;
|
|
30
|
+
const providerProps = (0, import_allNextProviderProps.allNextProviderPropsWithEnv)(nextProps);
|
|
31
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react2.TernSecureProvider, { ...providerProps, children: [
|
|
32
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_tern_ui_script.TernUIScript, {}),
|
|
33
|
+
children
|
|
34
|
+
] });
|
|
43
35
|
}
|
|
44
36
|
// Annotate the CommonJS export names for ESM import in node:
|
|
45
37
|
0 && (module.exports = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app-router/client/TernSecureProvider.tsx"],"sourcesContent":["import React from \"react\"\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../src/app-router/client/TernSecureProvider.tsx"],"sourcesContent":["import React from \"react\"\r\nimport { \r\n TernSecureProvider as TernSecureReactProvider \r\n} from \"@tern-secure/react\"\r\nimport type { TernSecureNextProps } from \"../../types\"\r\nimport { allNextProviderPropsWithEnv } from \"../../utils/allNextProviderProps\"\r\nimport { TernUIScript } from \"../../utils/tern-ui-script\";\r\n\r\n\r\n\r\n// Loading fallback component\r\n/*function TernSecureLoadingFallback() {\r\n return (\r\n <div>\r\n <span className=\"sr-only\">Loading...</span>\r\n </div>\r\n )\r\n}*/\r\n/**\r\n * Root Provider for TernSecure\r\n * Use this in your Next.js App Router root layout\r\n * Automatically handles client/server boundary and authentication state\r\n * \r\n * @example\r\n * /// app/layout.tsx\r\n * import { TernSecureProvider } from '@tern/secure'\r\n * \r\n * export default function RootLayout({ children }) {\r\n * return (\r\n * <html>\r\n * <body>\r\n * <TernSecureProvider>\r\n * {children}\r\n * </TernSecureProvider>\r\n * </body>\r\n * </html>\r\n * )\r\n * }\r\n */\r\nexport function TernSecureProvider(props: React.PropsWithChildren<TernSecureNextProps>) {\r\n const {children, ...nextProps } = props;\r\n const providerProps = allNextProviderPropsWithEnv(nextProps);\r\n return (\r\n <TernSecureReactProvider {...providerProps}>\r\n <TernUIScript />\r\n {children}\r\n </TernSecureReactProvider>\r\n )\r\n}"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CI;AA1CJ,IAAAA,gBAEO;AAEP,kCAA4C;AAC5C,4BAA6B;AAiCtB,SAAS,mBAAmB,OAAqD;AACtF,QAAM,EAAC,UAAU,GAAG,UAAU,IAAI;AAClC,QAAM,oBAAgB,yDAA4B,SAAS;AAC3D,SACE,6CAAC,cAAAC,oBAAA,EAAyB,GAAG,eAC3B;AAAA,gDAAC,sCAAa;AAAA,IACX;AAAA,KACL;AAEJ;","names":["import_react","TernSecureReactProvider"]}
|
|
@@ -1,180 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
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 actions_exports = {};
|
|
20
|
-
__export(actions_exports, {
|
|
21
|
-
createUser: () => createUser,
|
|
22
|
-
handleAuthRedirectResult: () => handleAuthRedirectResult,
|
|
23
|
-
resendEmailVerification: () => resendEmailVerification,
|
|
24
|
-
signInWithEmail: () => signInWithEmail,
|
|
25
|
-
signInWithMicrosoft: () => signInWithMicrosoft,
|
|
26
|
-
signInWithRedirectGoogle: () => signInWithRedirectGoogle
|
|
27
|
-
});
|
|
28
|
-
module.exports = __toCommonJS(actions_exports);
|
|
29
|
-
var import_client_init = require("../../utils/client-init");
|
|
30
|
-
var import_auth = require("firebase/auth");
|
|
31
|
-
var import_errors = require("../../errors");
|
|
32
|
-
async function createUser(email, password) {
|
|
33
|
-
const auth = (0, import_client_init.TernSecureAuth)();
|
|
34
|
-
try {
|
|
35
|
-
const actionCodeSettings = {
|
|
36
|
-
url: `${window.location.origin}/sign-in`,
|
|
37
|
-
handleCodeInApp: true
|
|
38
|
-
};
|
|
39
|
-
const userCredential = await (0, import_auth.createUserWithEmailAndPassword)(auth, email, password);
|
|
40
|
-
await (0, import_auth.sendEmailVerification)(userCredential.user, actionCodeSettings);
|
|
41
|
-
return {
|
|
42
|
-
success: true,
|
|
43
|
-
message: "Account created successfully. Please check your email for verification",
|
|
44
|
-
user: userCredential.user
|
|
45
|
-
};
|
|
46
|
-
} catch (error) {
|
|
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
|
-
};
|
|
54
|
-
}
|
|
2
|
+
{
|
|
55
3
|
}
|
|
56
|
-
async function signInWithEmail(email, password) {
|
|
57
|
-
const auth = (0, import_client_init.TernSecureAuth)();
|
|
58
|
-
try {
|
|
59
|
-
const UserCredential = await (0, import_auth.signInWithEmailAndPassword)(auth, email, password);
|
|
60
|
-
const user = UserCredential.user;
|
|
61
|
-
return {
|
|
62
|
-
success: true,
|
|
63
|
-
message: "Authentication successful",
|
|
64
|
-
user,
|
|
65
|
-
error: !user.emailVerified ? "REQUIRES_VERIFICATION" : "AUTHENTICATED"
|
|
66
|
-
};
|
|
67
|
-
} catch (error) {
|
|
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
|
-
};
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
async function signInWithRedirectGoogle() {
|
|
78
|
-
const auth = (0, import_client_init.TernSecureAuth)();
|
|
79
|
-
const provider = new import_auth.GoogleAuthProvider();
|
|
80
|
-
provider.setCustomParameters({
|
|
81
|
-
login_hint: "user@example.com",
|
|
82
|
-
prompt: "select_account"
|
|
83
|
-
});
|
|
84
|
-
try {
|
|
85
|
-
await (0, import_auth.signInWithRedirect)(auth, provider);
|
|
86
|
-
return { success: true, message: "Redirect initiated" };
|
|
87
|
-
} catch (error) {
|
|
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
|
-
};
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
async function signInWithMicrosoft() {
|
|
98
|
-
const auth = (0, import_client_init.TernSecureAuth)();
|
|
99
|
-
const provider = new import_auth.OAuthProvider("microsoft.com");
|
|
100
|
-
provider.setCustomParameters({
|
|
101
|
-
prompt: "consent"
|
|
102
|
-
});
|
|
103
|
-
try {
|
|
104
|
-
await (0, import_auth.signInWithRedirect)(auth, provider);
|
|
105
|
-
return { success: true, message: "Redirect initiated" };
|
|
106
|
-
} catch (error) {
|
|
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
|
-
};
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
async function handleAuthRedirectResult() {
|
|
117
|
-
const auth = (0, import_client_init.TernSecureAuth)();
|
|
118
|
-
try {
|
|
119
|
-
const result = await (0, import_auth.getRedirectResult)(auth);
|
|
120
|
-
if (result) {
|
|
121
|
-
const user = result.user;
|
|
122
|
-
return { success: true, user };
|
|
123
|
-
} else {
|
|
124
|
-
return { success: false, error: "No redirect result" };
|
|
125
|
-
}
|
|
126
|
-
} catch (error) {
|
|
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
|
-
};
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
async function resendEmailVerification() {
|
|
137
|
-
const auth = (0, import_client_init.TernSecureAuth)();
|
|
138
|
-
try {
|
|
139
|
-
const user = auth.currentUser;
|
|
140
|
-
if (!user) {
|
|
141
|
-
throw new Error("No user found. Please try signing up again.");
|
|
142
|
-
}
|
|
143
|
-
await user.reload();
|
|
144
|
-
if (user.emailVerified) {
|
|
145
|
-
return {
|
|
146
|
-
success: true,
|
|
147
|
-
message: "Email is already verified. You can sign in.",
|
|
148
|
-
isVerified: true
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
const actionCodeSettings = {
|
|
152
|
-
url: `${window.location.origin}/sign-in`,
|
|
153
|
-
handleCodeInApp: true
|
|
154
|
-
};
|
|
155
|
-
await (0, import_auth.sendEmailVerification)(user, actionCodeSettings);
|
|
156
|
-
return {
|
|
157
|
-
success: true,
|
|
158
|
-
message: "Verification email sent successfully.",
|
|
159
|
-
isVerified: false
|
|
160
|
-
};
|
|
161
|
-
} catch (error) {
|
|
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
|
-
}
|
|
170
|
-
}
|
|
171
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
172
|
-
0 && (module.exports = {
|
|
173
|
-
createUser,
|
|
174
|
-
handleAuthRedirectResult,
|
|
175
|
-
resendEmailVerification,
|
|
176
|
-
signInWithEmail,
|
|
177
|
-
signInWithMicrosoft,
|
|
178
|
-
signInWithRedirectGoogle
|
|
179
|
-
});
|
|
180
4
|
//# sourceMappingURL=actions.js.map
|
|
@@ -1 +1 @@
|
|
|
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 '
|
|
1
|
+
{"version":3,"sources":["../../../../src/app-router/client/actions.ts"],"sourcesContent":["{/*import { TernSecureAuth } from '../../utils/client-init'\r\nimport { \r\n signInWithEmailAndPassword, \r\n signInWithRedirect, \r\n getRedirectResult, \r\n GoogleAuthProvider, \r\n OAuthProvider, \r\n createUserWithEmailAndPassword, \r\n sendEmailVerification \r\n} from 'firebase/auth'\r\nimport type { SignInResponse } from '@tern-secure/types'\r\nimport { handleFirebaseAuthError } from '@tern-secure/types'\r\n\r\n\r\nexport async function createUser(email: string, password: string): Promise<SignInResponse> {\r\n const auth = TernSecureAuth()\r\n \r\n try {\r\n \r\n const actionCodeSettings = {\r\n url: `${window.location.origin}/sign-in`,\r\n handleCodeInApp: true\r\n };\r\n\r\n const userCredential = await createUserWithEmailAndPassword(auth, email, password);\r\n\r\n await sendEmailVerification(userCredential.user, actionCodeSettings)\r\n \r\n return { \r\n success: true, \r\n message: 'Account created successfully. Please check your email for verification', \r\n user: userCredential.user \r\n };\r\n\r\n } catch (error) {\r\n const authError = handleFirebaseAuthError(error)\r\n return { \r\n success: false, \r\n message: authError.message, \r\n error: authError.code,\r\n user: null\r\n }\r\n }\r\n}\r\n\r\n\r\nexport async function signInWithEmail(email: string, password: string): Promise<SignInResponse> {\r\n const auth = TernSecureAuth()\r\n try {\r\n const UserCredential = await signInWithEmailAndPassword(auth, email, password)\r\n const user = UserCredential.user\r\n \r\n return { \r\n success: true, \r\n message: 'Authentication successful',\r\n user: user,\r\n error: !user.emailVerified ? 'REQUIRES_VERIFICATION' : 'AUTHENTICATED'\r\n };\r\n\r\n} catch (error){\r\n const authError = handleFirebaseAuthError(error)\r\n return { \r\n success: false,\r\n message: authError.message,\r\n error: authError.code,\r\n user: null\r\n }\r\n}\r\n}\r\n\r\nexport async function signInWithRedirectGoogle() {\r\n const auth = TernSecureAuth()\r\n const provider = new GoogleAuthProvider()\r\n provider.setCustomParameters({\r\n login_hint: 'user@example.com',\r\n prompt: 'select_account'\r\n })\r\n\r\n try {\r\n await signInWithRedirect(auth, provider)\r\n return { success: true, message: 'Redirect initiated' }\r\n } catch (error) {\r\n const authError = handleFirebaseAuthError(error)\r\n return {\r\n success: false,\r\n message: authError.message,\r\n error: authError.code,\r\n user: null\r\n }\r\n }\r\n}\r\n\r\n\r\nexport async function signInWithMicrosoft() {\r\n const auth = TernSecureAuth()\r\n const provider = new OAuthProvider('microsoft.com')\r\n provider.setCustomParameters({\r\n prompt: 'consent'\r\n })\r\n\r\n try {\r\n await signInWithRedirect(auth, provider)\r\n return { success: true, message: 'Redirect initiated' }\r\n } catch (error) {\r\n const authError = handleFirebaseAuthError(error)\r\n return {\r\n success: false, \r\n message: authError.message,\r\n error: authError.code,\r\n user: null\r\n }\r\n }\r\n}\r\n\r\n\r\nexport async function handleAuthRedirectResult() {\r\n const auth = TernSecureAuth()\r\n try {\r\n const result = await getRedirectResult(auth)\r\n if (result) {\r\n const user = result.user\r\n return { success: true, user }\r\n } else {\r\n return { success: false, error: 'No redirect result' }\r\n }\r\n } catch (error: any) {\r\n const authError = handleFirebaseAuthError(error)\r\n return {\r\n success: false,\r\n message: authError.message,\r\n error: authError.code,\r\n user: null\r\n }\r\n }\r\n}\r\n\r\n\r\nexport async function resendEmailVerification() {\r\n const auth = TernSecureAuth()\r\n try {\r\n const user = auth.currentUser;\r\n if (!user) {\r\n throw new Error('No user found. Please try signing up again.');\r\n }\r\n\r\n await user.reload();\r\n\r\n if (user.emailVerified) {\r\n return { \r\n success: true, \r\n message: 'Email is already verified. You can sign in.',\r\n isVerified: true \r\n };\r\n }\r\n\r\n const actionCodeSettings = {\r\n url: `${window.location.origin}/sign-in`,\r\n handleCodeInApp: true,\r\n };\r\n\r\n await sendEmailVerification(user, actionCodeSettings);\r\n return { \r\n success: true, \r\n message: 'Verification email sent successfully.',\r\n isVerified: false\r\n };\r\n } catch (error) {\r\n const authError = handleFirebaseAuthError(error)\r\n return {\r\n success: false,\r\n message: authError.message,\r\n error: authError.code,\r\n user: null\r\n }\r\n }\r\n}*/}"],"mappings":";AAAA;AA+KG;","names":[]}
|
|
@@ -18,45 +18,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var internal_route_exports = {};
|
|
20
20
|
__export(internal_route_exports, {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
isBaseAuthRoute: () => isBaseAuthRoute,
|
|
25
|
-
isInternalRoute: () => isInternalRoute
|
|
21
|
+
isAuthRoute: () => import_react.isAuthRoute,
|
|
22
|
+
isBaseAuthRoute: () => import_react.isBaseAuthRoute,
|
|
23
|
+
isInternalRoute: () => import_react.isInternalRoute
|
|
26
24
|
});
|
|
27
25
|
module.exports = __toCommonJS(internal_route_exports);
|
|
28
|
-
var
|
|
29
|
-
const internalRoutes = {
|
|
30
|
-
signUpVerify: {
|
|
31
|
-
pattern: /^\/sign-up\/verify$/,
|
|
32
|
-
component: import_verify.Verify
|
|
33
|
-
},
|
|
34
|
-
signInVerify: {
|
|
35
|
-
pattern: /^\/sign-in\/verify$/,
|
|
36
|
-
component: import_verify.Verify
|
|
37
|
-
}
|
|
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
|
-
}
|
|
48
|
-
function handleInternalRoute(pathname) {
|
|
49
|
-
for (const [key, route] of Object.entries(internalRoutes)) {
|
|
50
|
-
if (route.pattern.test(pathname)) {
|
|
51
|
-
return route.component;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
26
|
+
var import_react = require("@tern-secure/react");
|
|
56
27
|
// Annotate the CommonJS export names for ESM import in node:
|
|
57
28
|
0 && (module.exports = {
|
|
58
|
-
handleInternalRoute,
|
|
59
|
-
internalRoutes,
|
|
60
29
|
isAuthRoute,
|
|
61
30
|
isBaseAuthRoute,
|
|
62
31
|
isInternalRoute
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app-router/route-handler/internal-route.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../../../src/app-router/route-handler/internal-route.tsx"],"sourcesContent":["export {\r\n isBaseAuthRoute,\r\n isInternalRoute,\r\n isAuthRoute\r\n} from '@tern-secure/react'"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAIO;","names":[]}
|
|
@@ -17,24 +17,24 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
17
|
return to;
|
|
18
18
|
};
|
|
19
19
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
-
var
|
|
21
|
-
__export(
|
|
22
|
-
|
|
20
|
+
var components_exports = {};
|
|
21
|
+
__export(components_exports, {
|
|
22
|
+
SignIn: () => import_react.SignIn,
|
|
23
|
+
SignUp: () => import_react.SignUp,
|
|
24
|
+
useAuth: () => import_react.useAuth,
|
|
25
|
+
useIdToken: () => import_react.useIdToken,
|
|
26
|
+
useSession: () => import_react.useSession,
|
|
27
|
+
useSignUp: () => import_react.useSignUp
|
|
23
28
|
});
|
|
24
|
-
module.exports = __toCommonJS(
|
|
25
|
-
var
|
|
26
|
-
function useSignUp() {
|
|
27
|
-
const {
|
|
28
|
-
email,
|
|
29
|
-
setEmail
|
|
30
|
-
} = (0, import_TernSecureCtx.useTernSecure)("useSignUp");
|
|
31
|
-
return {
|
|
32
|
-
email,
|
|
33
|
-
setEmail
|
|
34
|
-
};
|
|
35
|
-
}
|
|
29
|
+
module.exports = __toCommonJS(components_exports);
|
|
30
|
+
var import_react = require("@tern-secure/react");
|
|
36
31
|
// Annotate the CommonJS export names for ESM import in node:
|
|
37
32
|
0 && (module.exports = {
|
|
33
|
+
SignIn,
|
|
34
|
+
SignUp,
|
|
35
|
+
useAuth,
|
|
36
|
+
useIdToken,
|
|
37
|
+
useSession,
|
|
38
38
|
useSignUp
|
|
39
39
|
});
|
|
40
|
-
//# sourceMappingURL=
|
|
40
|
+
//# sourceMappingURL=components.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/boundary/components.ts"],"sourcesContent":["'use client'\n\nexport { \n useAuth,\n useIdToken,\n useSignUp,\n useSession,\n SignIn,\n //SignOut,\n //SignOutButton,\n SignUp,\n} from '@tern-secure/react' "],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBASO;","names":[]}
|
|
@@ -16,18 +16,16 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
16
|
return to;
|
|
17
17
|
};
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
var
|
|
20
|
-
__export(
|
|
21
|
-
|
|
19
|
+
var hooks_exports = {};
|
|
20
|
+
__export(hooks_exports, {
|
|
21
|
+
useAuth: () => import_react.useAuth,
|
|
22
|
+
useIdToken: () => import_react.useIdToken
|
|
22
23
|
});
|
|
23
|
-
module.exports = __toCommonJS(
|
|
24
|
-
var
|
|
25
|
-
var import_tailwind_merge = require("tailwind-merge");
|
|
26
|
-
function cn(...inputs) {
|
|
27
|
-
return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
|
|
28
|
-
}
|
|
24
|
+
module.exports = __toCommonJS(hooks_exports);
|
|
25
|
+
var import_react = require("@tern-secure/react");
|
|
29
26
|
// Annotate the CommonJS export names for ESM import in node:
|
|
30
27
|
0 && (module.exports = {
|
|
31
|
-
|
|
28
|
+
useAuth,
|
|
29
|
+
useIdToken
|
|
32
30
|
});
|
|
33
|
-
//# sourceMappingURL=
|
|
31
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/boundary/hooks.ts"],"sourcesContent":["export {\n useAuth,\n useIdToken\n} from '@tern-secure/react'"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAGO;","names":[]}
|
|
@@ -17,33 +17,26 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
17
|
return to;
|
|
18
18
|
};
|
|
19
19
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
-
var
|
|
21
|
-
__export(
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
var uiComponents_exports = {};
|
|
21
|
+
__export(uiComponents_exports, {
|
|
22
|
+
SignIn: () => SignIn,
|
|
23
|
+
SignUp: () => SignUp,
|
|
24
|
+
UserButton: () => import_react2.UserButton
|
|
25
25
|
});
|
|
26
|
-
module.exports = __toCommonJS(
|
|
27
|
-
var
|
|
28
|
-
var
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
module.exports = __toCommonJS(uiComponents_exports);
|
|
27
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
28
|
+
var import_react = require("@tern-secure/react");
|
|
29
|
+
var import_react2 = require("@tern-secure/react");
|
|
30
|
+
const SignIn = (props) => {
|
|
31
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.SignIn, { ...props });
|
|
31
32
|
};
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
const useTernSecure = (hookName) => {
|
|
35
|
-
const context = (0, import_react.useContext)(TernSecureCtx);
|
|
36
|
-
if (!context) {
|
|
37
|
-
throw new Error(
|
|
38
|
-
`${hookName} must be used within TernSecureProvider`
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
return context;
|
|
33
|
+
const SignUp = (props) => {
|
|
34
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.SignUp, { ...props });
|
|
42
35
|
};
|
|
43
36
|
// Annotate the CommonJS export names for ESM import in node:
|
|
44
37
|
0 && (module.exports = {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
38
|
+
SignIn,
|
|
39
|
+
SignUp,
|
|
40
|
+
UserButton
|
|
48
41
|
});
|
|
49
|
-
//# sourceMappingURL=
|
|
42
|
+
//# sourceMappingURL=uiComponents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/uiComponents.tsx"],"sourcesContent":["'use client'\n\nimport { \n SignIn as BaseSignIn,\n SignUp as BaseSignUp,\n} from '@tern-secure/react'\nimport type { ComponentProps } from 'react';\n\nexport {\n UserButton\n} from '@tern-secure/react';\n\nexport const SignIn = (props: ComponentProps<typeof BaseSignIn>) => {\n return <BaseSignIn {...props} />;\n};\n\nexport const SignUp = (props: ComponentProps<typeof BaseSignUp>) => {\n return <BaseSignUp {...props} />; \n};"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaS;AAXT,mBAGO;AAGP,IAAAA,gBAEO;AAEA,MAAM,SAAS,CAAC,UAA6C;AAClE,SAAO,4CAAC,aAAAC,QAAA,EAAY,GAAG,OAAO;AAChC;AAEO,MAAM,SAAS,CAAC,UAA6C;AAClE,SAAO,4CAAC,aAAAC,QAAA,EAAY,GAAG,OAAO;AAChC;","names":["import_react","BaseSignIn","BaseSignUp"]}
|