@tern-secure/nextjs 3.2.12 → 3.2.13
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/dist/cjs/app-router/client/TernSecureProvider.js +0 -1
- package/dist/cjs/app-router/client/TernSecureProvider.js.map +1 -1
- package/dist/cjs/app-router/client/{auth.js → actions.js} +17 -6
- package/dist/cjs/app-router/client/actions.js.map +1 -0
- package/dist/cjs/app-router/server/index.js +39 -0
- package/dist/cjs/app-router/server/index.js.map +1 -0
- package/dist/cjs/app-router/server/sessionTernSecure.js +128 -0
- package/dist/cjs/app-router/server/sessionTernSecure.js.map +1 -0
- package/dist/cjs/app-router/server/ternSecureMiddleware.js +57 -0
- package/dist/cjs/app-router/server/ternSecureMiddleware.js.map +1 -0
- package/dist/cjs/components/sign-in.js +3 -3
- package/dist/cjs/components/sign-in.js.map +1 -1
- package/dist/cjs/index.js +2 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types.js.map +1 -1
- package/dist/cjs/utils/admin-init.js +57 -0
- package/dist/cjs/utils/admin-init.js.map +1 -0
- package/dist/cjs/utils/config.js +40 -0
- package/dist/cjs/utils/config.js.map +1 -1
- package/dist/esm/app-router/client/TernSecureProvider.js +0 -1
- package/dist/esm/app-router/client/TernSecureProvider.js.map +1 -1
- package/dist/esm/app-router/client/actions.js +22 -0
- package/dist/esm/app-router/client/actions.js.map +1 -0
- package/dist/esm/app-router/server/index.js +11 -0
- package/dist/esm/app-router/server/index.js.map +1 -0
- package/dist/esm/app-router/server/sessionTernSecure.js +99 -0
- package/dist/esm/app-router/server/sessionTernSecure.js.map +1 -0
- package/dist/esm/app-router/server/ternSecureMiddleware.js +33 -0
- package/dist/esm/app-router/server/ternSecureMiddleware.js.map +1 -0
- package/dist/esm/components/sign-in.js +2 -2
- package/dist/esm/components/sign-in.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/utils/admin-init.js +22 -0
- package/dist/esm/utils/admin-init.js.map +1 -0
- package/dist/esm/utils/config.js +37 -0
- package/dist/esm/utils/config.js.map +1 -1
- package/dist/types/app-router/client/TernSecureProvider.d.ts.map +1 -1
- package/dist/types/app-router/client/actions.d.ts +5 -0
- package/dist/types/app-router/client/actions.d.ts.map +1 -0
- package/dist/types/app-router/server/index.d.ts +4 -0
- package/dist/types/app-router/server/index.d.ts.map +1 -0
- package/dist/types/app-router/server/sessionTernSecure.d.ts +37 -0
- package/dist/types/app-router/server/sessionTernSecure.d.ts.map +1 -0
- package/dist/types/app-router/server/ternSecureMiddleware.d.ts +4 -0
- package/dist/types/app-router/server/ternSecureMiddleware.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types.d.ts +16 -0
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/utils/admin-init.d.ts +4 -0
- package/dist/types/utils/admin-init.d.ts.map +1 -0
- package/dist/types/utils/config.d.ts +17 -1
- package/dist/types/utils/config.d.ts.map +1 -1
- package/package.json +6 -1
- package/dist/cjs/app-router/client/auth.js.map +0 -1
- package/dist/esm/app-router/client/auth.js +0 -11
- package/dist/esm/app-router/client/auth.js.map +0 -1
- package/dist/types/app-router/client/auth.d.ts +0 -2
- package/dist/types/app-router/client/auth.d.ts.map +0 -1
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
import { cookies } from "next/headers";
|
|
3
|
+
import { adminTernSecureAuth as adminAuth } from "../../utils/admin-init";
|
|
4
|
+
async function createSessionCookie(idToken) {
|
|
5
|
+
try {
|
|
6
|
+
const expiresIn = 60 * 60 * 24 * 5 * 1e3;
|
|
7
|
+
const sessionCookie = await adminAuth.createSessionCookie(idToken, { expiresIn });
|
|
8
|
+
const cookieStore = await cookies();
|
|
9
|
+
cookieStore.set("_session_cookie", sessionCookie, {
|
|
10
|
+
maxAge: expiresIn,
|
|
11
|
+
httpOnly: true,
|
|
12
|
+
secure: process.env.NODE_ENV === "production",
|
|
13
|
+
path: "/"
|
|
14
|
+
});
|
|
15
|
+
return { success: true, message: "Session created" };
|
|
16
|
+
} catch (error) {
|
|
17
|
+
return { success: false, message: "Failed to create session" };
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async function getServerSessionCookie() {
|
|
21
|
+
var _a;
|
|
22
|
+
const cookieStore = await cookies();
|
|
23
|
+
const sessionCookie = (_a = cookieStore.get("_session_cookie")) == null ? void 0 : _a.value;
|
|
24
|
+
if (!sessionCookie) {
|
|
25
|
+
throw new Error("No session cookie found");
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const decondeClaims = await adminAuth.verifySessionCookie(sessionCookie);
|
|
29
|
+
return {
|
|
30
|
+
token: sessionCookie,
|
|
31
|
+
userId: decondeClaims.uid
|
|
32
|
+
};
|
|
33
|
+
} catch (error) {
|
|
34
|
+
console.error("Error verifying session:", error);
|
|
35
|
+
throw new Error("Invalid Session");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async function getIdToken() {
|
|
39
|
+
var _a;
|
|
40
|
+
const cookieStore = await cookies();
|
|
41
|
+
const token = (_a = cookieStore.get("_session_token")) == null ? void 0 : _a.value;
|
|
42
|
+
if (!token) {
|
|
43
|
+
throw new Error("No session cookie found");
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
const decodedClaims = await adminAuth.verifyIdToken(token);
|
|
47
|
+
return {
|
|
48
|
+
token,
|
|
49
|
+
userId: decodedClaims.uid
|
|
50
|
+
};
|
|
51
|
+
} catch (error) {
|
|
52
|
+
console.error("Error verifying session:", error);
|
|
53
|
+
throw new Error("Invalid Session");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function setServerSession(token) {
|
|
57
|
+
const cookieStore = await cookies();
|
|
58
|
+
cookieStore.set("_session", token, {
|
|
59
|
+
httpOnly: true,
|
|
60
|
+
secure: process.env.NODE_ENV === "production",
|
|
61
|
+
sameSite: "strict",
|
|
62
|
+
maxAge: 60 * 60,
|
|
63
|
+
// 1 hour
|
|
64
|
+
path: "/"
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
async function verifyIDToken(token) {
|
|
68
|
+
try {
|
|
69
|
+
const res = await adminAuth.verifyIdToken(token);
|
|
70
|
+
if (res) {
|
|
71
|
+
return { valid: true, uid: res.uid };
|
|
72
|
+
} else {
|
|
73
|
+
return { valid: false, error: "Invalid token" };
|
|
74
|
+
}
|
|
75
|
+
} catch (error) {
|
|
76
|
+
return { error, valid: false };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async function verifySessionCookie(session) {
|
|
80
|
+
try {
|
|
81
|
+
const res = await adminAuth.verifySessionCookie(session);
|
|
82
|
+
if (res) {
|
|
83
|
+
return { valid: true, uid: res.uid };
|
|
84
|
+
} else {
|
|
85
|
+
return { valid: false, error: "Invalid session" };
|
|
86
|
+
}
|
|
87
|
+
} catch (error) {
|
|
88
|
+
return { error, valid: false };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export {
|
|
92
|
+
createSessionCookie,
|
|
93
|
+
getIdToken,
|
|
94
|
+
getServerSessionCookie,
|
|
95
|
+
setServerSession,
|
|
96
|
+
verifyIDToken,
|
|
97
|
+
verifySessionCookie
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=sessionTernSecure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/app-router/server/sessionTernSecure.ts"],"sourcesContent":["'use server'\r\n\r\nimport { cookies } from 'next/headers';\r\nimport { adminTernSecureAuth as adminAuth } from '../../utils/admin-init';\r\n\r\n\r\nexport interface User {\r\n uid: string;\r\n email: string;\r\n }\r\n\r\nexport interface Session {\r\n user: User | null;\r\n token: string | null;\r\n error: Error | null;\r\n}\r\n\r\nexport async function createSessionCookie(idToken: string) {\r\n try {\r\n const expiresIn = 60 * 60 * 24 * 5 * 1000;\r\n const sessionCookie = await adminAuth.createSessionCookie(idToken, { expiresIn });\r\n\r\n const cookieStore = await cookies();\r\n cookieStore.set('_session_cookie', sessionCookie, {\r\n maxAge: expiresIn,\r\n httpOnly: true,\r\n secure: process.env.NODE_ENV === 'production',\r\n path: '/',\r\n });\r\n return { success: true, message: 'Session created' };\r\n } catch (error) {\r\n return { success: false, message: 'Failed to create session' };\r\n }\r\n}\r\n\r\n\r\n\r\nexport async function getServerSessionCookie() {\r\n const cookieStore = await cookies();\r\n const sessionCookie = cookieStore.get('_session_cookie')?.value;\r\n\r\n if (!sessionCookie) {\r\n throw new Error('No session cookie found')\r\n }\r\n \r\n try {\r\n const decondeClaims = await adminAuth.verifySessionCookie(sessionCookie)\r\n return {\r\n token: sessionCookie,\r\n userId: decondeClaims.uid\r\n }\r\n } catch (error) {\r\n console.error('Error verifying session:', error)\r\n throw new Error('Invalid Session')\r\n }\r\n}\r\n\r\n\r\nexport async function getIdToken() {\r\n const cookieStore = await cookies();\r\n const token = cookieStore.get('_session_token')?.value;\r\n\r\n if (!token) {\r\n throw new Error('No session cookie found')\r\n }\r\n \r\n try {\r\n const decodedClaims = await adminAuth.verifyIdToken(token)\r\n return {\r\n token: token,\r\n userId: decodedClaims.uid\r\n }\r\n } catch (error) {\r\n console.error('Error verifying session:', error)\r\n throw new Error('Invalid Session')\r\n }\r\n}\r\n\r\nexport async function setServerSession(token: string) {\r\n const cookieStore = await cookies();\r\n cookieStore.set('_session', token, {\r\n httpOnly: true,\r\n secure: process.env.NODE_ENV === 'production',\r\n sameSite: 'strict',\r\n maxAge: 60 * 60, // 1 hour\r\n path: '/',\r\n });\r\n }\r\n\r\n export async function verifyIDToken(token: string){\r\n try {\r\n const res = await adminAuth.verifyIdToken(token);\r\n if (res) {\r\n return { valid: true, uid: res.uid };\r\n } else {\r\n return { valid: false, error: 'Invalid token'};\r\n }\r\n } catch (error) {\r\n return {error: error, valid: false}\r\n }\r\n }\r\n\r\n export async function verifySessionCookie(session: string): Promise<{ valid: boolean; uid?: any; error?: any }>{\r\n try {\r\n const res = await adminAuth.verifySessionCookie(session);\r\n if (res) {\r\n return { valid: true, uid: res.uid };\r\n } else {\r\n return { valid: false, error: 'Invalid session'};\r\n }\r\n } catch (error) {\r\n return {error: error, valid: false}\r\n }\r\n }\r\n\r\n\r\n\r\n/*\r\n export async function GET(request: NextRequest) {\r\n const cookieStore = await cookies();\r\n const sessionCookie = cookieStore.get('session')?.value\r\n \r\n if (!sessionCookie) {\r\n return NextResponse.json({ isAuthenticated: false }, { status: 401 })\r\n }\r\n \r\n try {\r\n const decodedClaims = await adminAuth.verifySessionCookie(sessionCookie, true)\r\n return NextResponse.json({ isAuthenticated: true, user: decodedClaims }, { status: 200 })\r\n } catch (error) {\r\n console.error('Error verifying session cookie:', error)\r\n return NextResponse.json({ isAuthenticated: false }, { status: 401 })\r\n }\r\n }\r\n\r\n*/"],"mappings":";AAEA,SAAS,eAAe;AACxB,SAAS,uBAAuB,iBAAiB;AAcjD,eAAsB,oBAAoB,SAAiB;AACzD,MAAI;AACF,UAAM,YAAY,KAAK,KAAK,KAAK,IAAI;AACnC,UAAM,gBAAgB,MAAM,UAAU,oBAAoB,SAAS,EAAE,UAAU,CAAC;AAEhF,UAAM,cAAc,MAAM,QAAQ;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;AArC/C;AAsCE,QAAM,cAAc,MAAM,QAAQ;AAClC,QAAM,iBAAgB,iBAAY,IAAI,iBAAiB,MAAjC,mBAAoC;AAE1D,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAEA,MAAI;AACF,UAAM,gBAAgB,MAAM,UAAU,oBAAoB,aAAa;AACvE,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,cAAc;AAAA,IACxB;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,4BAA4B,KAAK;AAC/C,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AACF;AAGA,eAAsB,aAAa;AA1DnC;AA2DE,QAAM,cAAc,MAAM,QAAQ;AAClC,QAAM,SAAQ,iBAAY,IAAI,gBAAgB,MAAhC,mBAAmC;AAEjD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AAEA,MAAI;AACF,UAAM,gBAAgB,MAAM,UAAU,cAAc,KAAK;AACzD,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,cAAc;AAAA,IACxB;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,4BAA4B,KAAK;AAC/C,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AACF;AAEA,eAAsB,iBAAiB,OAAe;AAClD,QAAM,cAAc,MAAM,QAAQ;AAClC,cAAY,IAAI,YAAY,OAAO;AAAA,IACjC,UAAU;AAAA,IACV,QAAQ,QAAQ,IAAI,aAAa;AAAA,IACjC,UAAU;AAAA,IACV,QAAQ,KAAK;AAAA;AAAA,IACb,MAAM;AAAA,EACR,CAAC;AACH;AAEA,eAAsB,cAAc,OAAc;AAChD,MAAI;AACF,UAAM,MAAM,MAAM,UAAU,cAAc,KAAK;AAC/C,QAAI,KAAK;AACP,aAAO,EAAE,OAAO,MAAM,KAAK,IAAI,IAAI;AAAA,IACrC,OAAO;AACL,aAAO,EAAE,OAAO,OAAO,OAAO,gBAAe;AAAA,IAC/C;AAAA,EACF,SAAS,OAAO;AACd,WAAO,EAAC,OAAc,OAAO,MAAK;AAAA,EACpC;AACF;AAEA,eAAsB,oBAAoB,SAAqE;AAC7G,MAAI;AACF,UAAM,MAAM,MAAM,UAAU,oBAAoB,OAAO;AACvD,QAAI,KAAK;AACP,aAAO,EAAE,OAAO,MAAM,KAAK,IAAI,IAAI;AAAA,IACrC,OAAO;AACL,aAAO,EAAE,OAAO,OAAO,OAAO,kBAAiB;AAAA,IACjD;AAAA,EACF,SAAS,OAAO;AACd,WAAO,EAAC,OAAc,OAAO,MAAK;AAAA,EACpC;AACF;","names":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { verifySessionCookie } from "./sessionTernSecure";
|
|
3
|
+
const signIn = ["/sign-in"];
|
|
4
|
+
const signUp = ["/sign-up"];
|
|
5
|
+
const publicRoutes = [...signIn, ...signUp];
|
|
6
|
+
async function ternSecureMiddleware(req) {
|
|
7
|
+
var _a;
|
|
8
|
+
const isPublicRoute = publicRoutes.includes(req.nextUrl.pathname);
|
|
9
|
+
const session = (_a = req.cookies.get("_session_cookie")) == null ? void 0 : _a.value;
|
|
10
|
+
if (isPublicRoute) {
|
|
11
|
+
return NextResponse.next();
|
|
12
|
+
}
|
|
13
|
+
if (session) {
|
|
14
|
+
const { valid, uid } = await verifySessionCookie(session);
|
|
15
|
+
if (!valid) {
|
|
16
|
+
const response = NextResponse.redirect(new URL(signIn[0], req.url));
|
|
17
|
+
response.cookies.delete("_session_cookie");
|
|
18
|
+
return response;
|
|
19
|
+
}
|
|
20
|
+
const requestHeaders = new Headers(req.headers);
|
|
21
|
+
requestHeaders.set("x-uid", uid);
|
|
22
|
+
return NextResponse.next({
|
|
23
|
+
request: {
|
|
24
|
+
headers: requestHeaders
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return NextResponse.next();
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
ternSecureMiddleware
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=ternSecureMiddleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/app-router/server/ternSecureMiddleware.ts"],"sourcesContent":["import { NextResponse } from 'next/server'\r\nimport type { NextRequest } from 'next/server'\r\nimport { verifySessionCookie } from './sessionTernSecure'\r\n\r\nconst signIn = ['/sign-in']\r\nconst signUp = ['/sign-up']\r\nconst publicRoutes = [...signIn, ...signUp]\r\n\r\n\r\nexport async function ternSecureMiddleware(req: NextRequest) {\r\n const isPublicRoute = publicRoutes.includes(req.nextUrl.pathname)\r\n\r\n //const token = req.cookies.get('_session_token')?.value\r\n const session = req.cookies.get('_session_cookie')?.value\r\n\r\n\r\n if (isPublicRoute) {\r\n return NextResponse.next();\r\n }\r\n\r\n if(session) {\r\n const {valid, uid} = await verifySessionCookie(session)\r\n\r\n if(!valid) {\r\n const response = NextResponse.redirect(new URL(signIn[0], req.url));\r\n response.cookies.delete('_session_cookie');\r\n return response;\r\n }\r\n\r\n const requestHeaders = new Headers(req.headers);\r\n requestHeaders.set('x-uid', uid);\r\n\r\n return NextResponse.next({\r\n request: {\r\n headers: requestHeaders,\r\n },\r\n });\r\n }\r\n\r\n // Allow all other requests (other subdomains)\r\n return NextResponse.next()\r\n}\r\n"],"mappings":"AAAA,SAAS,oBAAoB;AAE7B,SAAS,2BAA2B;AAEpC,MAAM,SAAS,CAAC,UAAU;AAC1B,MAAM,SAAS,CAAC,UAAU;AAC1B,MAAM,eAAe,CAAC,GAAG,QAAQ,GAAG,MAAM;AAG1C,eAAsB,qBAAqB,KAAkB;AAT7D;AAUI,QAAM,gBAAgB,aAAa,SAAS,IAAI,QAAQ,QAAQ;AAGhE,QAAM,WAAU,SAAI,QAAQ,IAAI,iBAAiB,MAAjC,mBAAoC;AAGtD,MAAI,eAAe;AACjB,WAAO,aAAa,KAAK;AAAA,EAC3B;AAEA,MAAG,SAAS;AACV,UAAM,EAAC,OAAO,IAAG,IAAI,MAAM,oBAAoB,OAAO;AAEtD,QAAG,CAAC,OAAO;AACP,YAAM,WAAW,aAAa,SAAS,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC;AAClE,eAAS,QAAQ,OAAO,iBAAiB;AACzC,aAAO;AAAA,IACX;AAEA,UAAM,iBAAiB,IAAI,QAAQ,IAAI,OAAO;AAC9C,mBAAe,IAAI,SAAS,GAAG;AAE/B,WAAO,aAAa,KAAK;AAAA,MACvB,SAAS;AAAA,QACP,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAGA,SAAO,aAAa,KAAK;AAC3B;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useState } from "react";
|
|
4
|
-
import { signInWithEmail } from "../app-router/client/
|
|
4
|
+
import { signInWithEmail } from "../app-router/client/actions";
|
|
5
5
|
import { styles } from "../utils/create-styles";
|
|
6
6
|
import { useRouter } from "next/navigation";
|
|
7
7
|
function SignIn({
|
|
@@ -20,7 +20,7 @@ function SignIn({
|
|
|
20
20
|
setLoading(true);
|
|
21
21
|
try {
|
|
22
22
|
const user = await signInWithEmail(email, password);
|
|
23
|
-
if (user) {
|
|
23
|
+
if (user.success == true) {
|
|
24
24
|
router.push("/");
|
|
25
25
|
}
|
|
26
26
|
} catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/sign-in.tsx"],"sourcesContent":["'use client'\r\n\r\nimport React from 'react'\r\nimport { useState } from 'react'\r\nimport { signInWithEmail } from '../app-router/client/
|
|
1
|
+
{"version":3,"sources":["../../../src/components/sign-in.tsx"],"sourcesContent":["'use client'\r\n\r\nimport React from 'react'\r\nimport { useState } from 'react'\r\nimport { signInWithEmail } from '../app-router/client/actions'\r\nimport { styles } from '../utils/create-styles'\r\nimport { useRouter } from 'next/navigation'\r\n\r\nexport interface SignInProps {\r\n onError?: (error: Error) => void\r\n className?: string\r\n style?: React.CSSProperties\r\n customStyles?: {\r\n container?: string\r\n header?: string\r\n title?: string\r\n formWrapper?: string\r\n formContainer?: string\r\n form?: string\r\n input?: string\r\n button?: string\r\n errorText?: string\r\n label?: string\r\n }\r\n}\r\n\r\nexport function SignIn({ \r\n onError, \r\n className,\r\n style,\r\n customStyles = {}\r\n}: SignInProps) {\r\n\r\n const [loading, setLoading] = useState(false)\r\n const [error, setError] = useState('')\r\n const [email, setEmail] = useState('')\r\n const [password, setPassword] = useState('')\r\n const router = useRouter()\r\n\r\n const handleSubmit = async (e: React.FormEvent) => {\r\n e.preventDefault()\r\n setLoading(true)\r\n try {\r\n const user = await signInWithEmail(email, password)\r\n if (user.success == true) {\r\n router.push('/')\r\n }\r\n } catch (err) {\r\n const errorMessage = err instanceof Error ? err.message : 'Failed to sign in'\r\n setError(errorMessage)\r\n onError?.(err instanceof Error ? err : new Error('Failed to sign in'))\r\n } finally {\r\n setLoading(false)\r\n }\r\n }\r\n\r\n return (\r\n <div className={`${styles.container} ${customStyles.container || ''}`} style={style}>\r\n <div className={`${styles.header} ${customStyles.header || ''}`}>\r\n <h2 className={`${styles.title} ${customStyles.title || ''}`}>\r\n Sign in to your account\r\n </h2>\r\n </div>\r\n \r\n <div className={`${styles.formWrapper} ${customStyles.formWrapper || ''}`}>\r\n <div className={`${styles.formContainer} ${customStyles.formContainer || ''}`}>\r\n <form \r\n onSubmit={handleSubmit} \r\n className={`${styles.form} ${customStyles.form || ''} ${className}`}\r\n role=\"form\"\r\n aria-label=\"Sign in form\"\r\n >\r\n {error && (\r\n <div \r\n className={`${styles.error} ${customStyles.errorText || ''}`}\r\n role=\"alert\"\r\n aria-live=\"polite\"\r\n >\r\n {error}\r\n </div>\r\n )}\r\n <div>\r\n <label htmlFor=\"email\" className={`${styles.label} ${customStyles.label || ''}`}>\r\n Email\r\n </label>\r\n <input\r\n id=\"email\"\r\n name=\"email\"\r\n type=\"email\"\r\n placeholder=\"Enter your email\"\r\n required\r\n value={email}\r\n onChange={(e) => setEmail(e.target.value)}\r\n className={`${styles.input} ${customStyles.input || ''}`}\r\n disabled={loading}\r\n aria-required=\"true\"\r\n aria-invalid={!!error}\r\n />\r\n </div>\r\n <div>\r\n <label htmlFor=\"password\" className={`${styles.label} ${customStyles.label || ''}`}>\r\n Password\r\n </label>\r\n <input\r\n id=\"password\"\r\n name=\"password\"\r\n type=\"password\"\r\n placeholder=\"Enter your password\"\r\n required\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n className={`${styles.input} ${customStyles.input || ''}`}\r\n disabled={loading}\r\n aria-required=\"true\"\r\n aria-invalid={!!error}\r\n />\r\n </div>\r\n <button \r\n type=\"submit\" \r\n disabled={loading}\r\n className={`${styles.button} ${customStyles.button || ''}`}\r\n data-testid=\"sign-in-submit\"\r\n >\r\n {loading ? 'Signing in...' : 'Sign in'}\r\n </button>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\n"],"mappings":"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","names":[]}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TernSecureAuth, TernSecureFirestore } from "./utils/client-init";
|
|
2
2
|
import { loadFireConfig, validateConfig } from "./utils/config";
|
|
3
|
-
import { signInWithEmail } from "./app-router/client/
|
|
3
|
+
import { signInWithEmail } from "./app-router/client/actions";
|
|
4
4
|
import { TernSecureProvider } from "./app-router/client/TernSecureProvider";
|
|
5
5
|
import { useAuth } from "./boundary/hooks/useAuth";
|
|
6
6
|
import { SignIn } from "./components/sign-in";
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["//import { TernSecureServerProvider } from './app-router/server/TernSecureServerProvider'\r\n//import type { TernSecureState } from './app-router/client/TernSecureProvider'\r\nexport { TernSecureAuth, TernSecureFirestore } from './utils/client-init'\r\nexport { loadFireConfig, validateConfig } from './utils/config'\r\nexport { signInWithEmail } from './app-router/client/
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["//import { TernSecureServerProvider } from './app-router/server/TernSecureServerProvider'\r\n//import type { TernSecureState } from './app-router/client/TernSecureProvider'\r\nexport { TernSecureAuth, TernSecureFirestore } from './utils/client-init'\r\nexport { loadFireConfig, validateConfig } from './utils/config'\r\nexport { signInWithEmail } from './app-router/client/actions'\r\n//export { useInternalContext } from './boundary/TernSecureCtx'\r\n//export { TernSecureClientProvider } from './app-router/client/TernSecureProvider'\r\nexport { TernSecureProvider } from './app-router/client/TernSecureProvider'\r\nexport { useAuth } from './boundary/hooks/useAuth' \r\nexport { SignIn } from './components/sign-in'\r\n\r\n//export const TernSecureProvider = TernSecureServerProvider\r\n//export type { TernSecureState }"],"mappings":"AAEA,SAAS,gBAAgB,2BAA2B;AACpD,SAAS,gBAAgB,sBAAsB;AAC/C,SAAS,uBAAuB;AAGhC,SAAS,0BAA0B;AACnC,SAAS,eAAe;AACxB,SAAS,cAAc;","names":[]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import admin from "firebase-admin";
|
|
2
|
+
import { initializeAdminConfig } from "./config";
|
|
3
|
+
if (!admin.apps.length) {
|
|
4
|
+
try {
|
|
5
|
+
const config = initializeAdminConfig();
|
|
6
|
+
admin.initializeApp({
|
|
7
|
+
credential: admin.credential.cert({
|
|
8
|
+
...config,
|
|
9
|
+
privateKey: config.privateKey.replace(/\\n/g, "\n")
|
|
10
|
+
})
|
|
11
|
+
});
|
|
12
|
+
} catch (error) {
|
|
13
|
+
console.error("Firebase admin initialization error", error);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const adminTernSecureAuth = admin.auth();
|
|
17
|
+
const adminTernSecureDb = admin.firestore();
|
|
18
|
+
export {
|
|
19
|
+
adminTernSecureAuth,
|
|
20
|
+
adminTernSecureDb
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=admin-init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/admin-init.ts"],"sourcesContent":["import admin from 'firebase-admin';\r\nimport { initializeAdminConfig } from './config';\r\n\r\nif (!admin.apps.length) {\r\n try {\r\n const config = initializeAdminConfig();\r\n admin.initializeApp({\r\n credential: admin.credential.cert({\r\n ...config,\r\n privateKey: config.privateKey.replace(/\\\\n/g, '\\n'),\r\n }),\r\n });\r\n } catch (error) {\r\n console.error('Firebase admin initialization error', error);\r\n }\r\n}\r\n\r\nexport const adminTernSecureAuth = admin.auth();\r\nexport const adminTernSecureDb = admin.firestore();"],"mappings":"AAAA,OAAO,WAAW;AAClB,SAAS,6BAA6B;AAEtC,IAAI,CAAC,MAAM,KAAK,QAAQ;AACtB,MAAI;AACF,UAAM,SAAS,sBAAsB;AACrC,UAAM,cAAc;AAAA,MAClB,YAAY,MAAM,WAAW,KAAK;AAAA,QAChC,GAAG;AAAA,QACH,YAAY,OAAO,WAAW,QAAQ,QAAQ,IAAI;AAAA,MACpD,CAAC;AAAA,IACH,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,uCAAuC,KAAK;AAAA,EAC5D;AACF;AAEO,MAAM,sBAAsB,MAAM,KAAK;AACvC,MAAM,oBAAoB,MAAM,UAAU;","names":[]}
|
package/dist/esm/utils/config.js
CHANGED
|
@@ -39,9 +39,46 @@ ${validationResult.errors.join("\n")}`
|
|
|
39
39
|
}
|
|
40
40
|
return config;
|
|
41
41
|
};
|
|
42
|
+
const loadAdminConfig = () => ({
|
|
43
|
+
projectId: process.env.FIREBASE_PROJECT_ID || "",
|
|
44
|
+
clientEmail: process.env.FIREBASE_CLIENT_EMAIL || "",
|
|
45
|
+
privateKey: process.env.FIREBASE_PRIVATE_KEY || ""
|
|
46
|
+
});
|
|
47
|
+
const validateAdminConfig = (config) => {
|
|
48
|
+
const requiredFields = [
|
|
49
|
+
"projectId",
|
|
50
|
+
"clientEmail",
|
|
51
|
+
"privateKey"
|
|
52
|
+
];
|
|
53
|
+
const errors = [];
|
|
54
|
+
requiredFields.forEach((field) => {
|
|
55
|
+
if (!config[field]) {
|
|
56
|
+
errors.push(`Missing required field: FIREBASE_${String(field).toUpperCase()}`);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
return {
|
|
60
|
+
isValid: errors.length === 0,
|
|
61
|
+
errors,
|
|
62
|
+
config
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
const initializeAdminConfig = () => {
|
|
66
|
+
const config = loadAdminConfig();
|
|
67
|
+
const validationResult = validateAdminConfig(config);
|
|
68
|
+
if (!validationResult.isValid) {
|
|
69
|
+
throw new Error(
|
|
70
|
+
`Firebase Admin configuration validation failed:
|
|
71
|
+
${validationResult.errors.join("\n")}`
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
return config;
|
|
75
|
+
};
|
|
42
76
|
export {
|
|
77
|
+
initializeAdminConfig,
|
|
43
78
|
initializeConfig,
|
|
79
|
+
loadAdminConfig,
|
|
44
80
|
loadFireConfig,
|
|
81
|
+
validateAdminConfig,
|
|
45
82
|
validateConfig
|
|
46
83
|
};
|
|
47
84
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/config.ts"],"sourcesContent":["import { TernSecureConfig, ConfigValidationResult } from '../types'\r\n\r\n/**\r\n * Loads Firebase configuration from environment variables\r\n * @returns {TernSecureConfig} Firebase configuration object\r\n */\r\nexport const loadFireConfig = (): TernSecureConfig => ({\r\n apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY || '',\r\n authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || '',\r\n projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || '',\r\n storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET || '',\r\n messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID || '',\r\n appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID || '',\r\n measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID || undefined,\r\n})\r\n\r\n/**\r\n * Validates Firebase configuration\r\n * @param {TernSecureConfig} config - Firebase configuration object\r\n * @throws {Error} If required configuration values are missing\r\n * @returns {TernSecureConfig} Validated configuration object\r\n */\r\nexport const validateConfig = (config: TernSecureConfig): ConfigValidationResult => {\r\n const requiredFields: (keyof TernSecureConfig)[] = [\r\n 'apiKey',\r\n 'authDomain',\r\n 'projectId',\r\n 'storageBucket',\r\n 'messagingSenderId',\r\n 'appId'\r\n ]\r\n\r\n const errors: string[] = []\r\n \r\n requiredFields.forEach(field => {\r\n if (!config[field]) {\r\n errors.push(`Missing required field: NEXT_PUBLIC_FIREBASE_${String(field).toUpperCase()}`)\r\n }\r\n })\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors,\r\n config\r\n }\r\n}\r\n\r\n/**\r\n * Initializes configuration with validation\r\n * @throws {Error} If configuration is invalid\r\n */\r\nexport const initializeConfig = (): TernSecureConfig => {\r\n const config = loadFireConfig()\r\n const validationResult = validateConfig(config)\r\n\r\n if (!validationResult.isValid) {\r\n throw new Error(\r\n `Firebase configuration validation failed:\\n${validationResult.errors.join('\\n')}`\r\n )\r\n }\r\n\r\n return config\r\n}"],"mappings":"AAMO,MAAM,iBAAiB,OAAyB;AAAA,EACrD,QAAQ,QAAQ,IAAI,gCAAgC;AAAA,EACpD,YAAY,QAAQ,IAAI,oCAAoC;AAAA,EAC5D,WAAW,QAAQ,IAAI,mCAAmC;AAAA,EAC1D,eAAe,QAAQ,IAAI,uCAAuC;AAAA,EAClE,mBAAmB,QAAQ,IAAI,4CAA4C;AAAA,EAC3E,OAAO,QAAQ,IAAI,+BAA+B;AAAA,EAClD,eAAe,QAAQ,IAAI,uCAAuC;AACpE;AAQO,MAAM,iBAAiB,CAAC,WAAqD;AAClF,QAAM,iBAA6C;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,SAAmB,CAAC;AAE1B,iBAAe,QAAQ,WAAS;AAC9B,QAAI,CAAC,OAAO,KAAK,GAAG;AAClB,aAAO,KAAK,gDAAgD,OAAO,KAAK,EAAE,YAAY,CAAC,EAAE;AAAA,IAC3F;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,SAAS,OAAO,WAAW;AAAA,IAC3B;AAAA,IACA;AAAA,EACF;AACF;AAMO,MAAM,mBAAmB,MAAwB;AACtD,QAAM,SAAS,eAAe;AAC9B,QAAM,mBAAmB,eAAe,MAAM;AAE9C,MAAI,CAAC,iBAAiB,SAAS;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,EAA8C,iBAAiB,OAAO,KAAK,IAAI,CAAC;AAAA,IAClF;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/config.ts"],"sourcesContent":["import { TernSecureConfig, ConfigValidationResult, TernSecureAdminConfig, AdminConfigValidationResult } from '../types'\r\n\r\n/**\r\n * Loads Firebase configuration from environment variables\r\n * @returns {TernSecureConfig} Firebase configuration object\r\n */\r\nexport const loadFireConfig = (): TernSecureConfig => ({\r\n apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY || '',\r\n authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || '',\r\n projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || '',\r\n storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET || '',\r\n messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID || '',\r\n appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID || '',\r\n measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID || undefined,\r\n})\r\n\r\n/**\r\n * Validates Firebase configuration\r\n * @param {TernSecureConfig} config - Firebase configuration object\r\n * @throws {Error} If required configuration values are missing\r\n * @returns {TernSecureConfig} Validated configuration object\r\n */\r\nexport const validateConfig = (config: TernSecureConfig): ConfigValidationResult => {\r\n const requiredFields: (keyof TernSecureConfig)[] = [\r\n 'apiKey',\r\n 'authDomain',\r\n 'projectId',\r\n 'storageBucket',\r\n 'messagingSenderId',\r\n 'appId'\r\n ]\r\n\r\n const errors: string[] = []\r\n \r\n requiredFields.forEach(field => {\r\n if (!config[field]) {\r\n errors.push(`Missing required field: NEXT_PUBLIC_FIREBASE_${String(field).toUpperCase()}`)\r\n }\r\n })\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors,\r\n config\r\n }\r\n}\r\n\r\n/**\r\n * Initializes configuration with validation\r\n * @throws {Error} If configuration is invalid\r\n */\r\nexport const initializeConfig = (): TernSecureConfig => {\r\n const config = loadFireConfig()\r\n const validationResult = validateConfig(config)\r\n\r\n if (!validationResult.isValid) {\r\n throw new Error(\r\n `Firebase configuration validation failed:\\n${validationResult.errors.join('\\n')}`\r\n )\r\n }\r\n\r\n return config\r\n}\r\n\r\n/**\r\n * Loads Firebase Admin configuration from environment variables\r\n * @returns {AdminConfig} Firebase Admin configuration object\r\n */\r\nexport const loadAdminConfig = (): TernSecureAdminConfig => ({\r\n projectId: process.env.FIREBASE_PROJECT_ID || '',\r\n clientEmail: process.env.FIREBASE_CLIENT_EMAIL || '',\r\n privateKey: process.env.FIREBASE_PRIVATE_KEY || '',\r\n})\r\n\r\n/**\r\n * Validates Firebase Admin configuration\r\n * @param {AdminConfig} config - Firebase Admin configuration object\r\n * @returns {ConfigValidationResult} Validation result\r\n */\r\nexport const validateAdminConfig = (config: TernSecureAdminConfig): AdminConfigValidationResult => {\r\n const requiredFields: (keyof TernSecureAdminConfig)[] = [\r\n 'projectId',\r\n 'clientEmail',\r\n 'privateKey'\r\n ]\r\n\r\n const errors: string[] = []\r\n \r\n requiredFields.forEach(field => {\r\n if (!config[field]) {\r\n errors.push(`Missing required field: FIREBASE_${String(field).toUpperCase()}`)\r\n }\r\n })\r\n\r\n return {\r\n isValid: errors.length === 0,\r\n errors,\r\n config\r\n }\r\n}\r\n\r\n/**\r\n * Initializes admin configuration with validation\r\n * @throws {Error} If configuration is invalid\r\n */\r\nexport const initializeAdminConfig = (): TernSecureAdminConfig => {\r\n const config = loadAdminConfig()\r\n const validationResult = validateAdminConfig(config)\r\n\r\n if (!validationResult.isValid) {\r\n throw new Error(\r\n `Firebase Admin configuration validation failed:\\n${validationResult.errors.join('\\n')}`\r\n )\r\n }\r\n\r\n return config\r\n}"],"mappings":"AAMO,MAAM,iBAAiB,OAAyB;AAAA,EACrD,QAAQ,QAAQ,IAAI,gCAAgC;AAAA,EACpD,YAAY,QAAQ,IAAI,oCAAoC;AAAA,EAC5D,WAAW,QAAQ,IAAI,mCAAmC;AAAA,EAC1D,eAAe,QAAQ,IAAI,uCAAuC;AAAA,EAClE,mBAAmB,QAAQ,IAAI,4CAA4C;AAAA,EAC3E,OAAO,QAAQ,IAAI,+BAA+B;AAAA,EAClD,eAAe,QAAQ,IAAI,uCAAuC;AACpE;AAQO,MAAM,iBAAiB,CAAC,WAAqD;AAClF,QAAM,iBAA6C;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,SAAmB,CAAC;AAE1B,iBAAe,QAAQ,WAAS;AAC9B,QAAI,CAAC,OAAO,KAAK,GAAG;AAClB,aAAO,KAAK,gDAAgD,OAAO,KAAK,EAAE,YAAY,CAAC,EAAE;AAAA,IAC3F;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,SAAS,OAAO,WAAW;AAAA,IAC3B;AAAA,IACA;AAAA,EACF;AACF;AAMO,MAAM,mBAAmB,MAAwB;AACtD,QAAM,SAAS,eAAe;AAC9B,QAAM,mBAAmB,eAAe,MAAM;AAE9C,MAAI,CAAC,iBAAiB,SAAS;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,EAA8C,iBAAiB,OAAO,KAAK,IAAI,CAAC;AAAA,IAClF;AAAA,EACF;AAEA,SAAO;AACT;AAMO,MAAM,kBAAkB,OAA8B;AAAA,EAC3D,WAAW,QAAQ,IAAI,uBAAuB;AAAA,EAC9C,aAAa,QAAQ,IAAI,yBAAyB;AAAA,EAClD,YAAY,QAAQ,IAAI,wBAAwB;AAClD;AAOO,MAAM,sBAAsB,CAAC,WAA+D;AACjG,QAAM,iBAAkD;AAAA,IACtD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,SAAmB,CAAC;AAE1B,iBAAe,QAAQ,WAAS;AAC9B,QAAI,CAAC,OAAO,KAAK,GAAG;AAClB,aAAO,KAAK,oCAAoC,OAAO,KAAK,EAAE,YAAY,CAAC,EAAE;AAAA,IAC/E;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,SAAS,OAAO,WAAW;AAAA,IAC3B;AAAA,IACA;AAAA,EACF;AACF;AAMO,MAAM,wBAAwB,MAA6B;AAChE,QAAM,SAAS,gBAAgB;AAC/B,QAAM,mBAAmB,oBAAoB,MAAM;AAEnD,MAAI,CAAC,iBAAiB,SAAS;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,EAAoD,iBAAiB,OAAO,KAAK,IAAI,CAAC;AAAA,IACxF;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TernSecureProvider.d.ts","sourceRoot":"","sources":["../../../../src/app-router/client/TernSecureProvider.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TernSecureProvider.d.ts","sourceRoot":"","sources":["../../../../src/app-router/client/TernSecureProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAkBzB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAM7E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../../src/app-router/client/actions.ts"],"names":[],"mappings":"AAKA,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;;;GAgBpE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/app-router/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface User {
|
|
2
|
+
uid: string;
|
|
3
|
+
email: string;
|
|
4
|
+
}
|
|
5
|
+
export interface Session {
|
|
6
|
+
user: User | null;
|
|
7
|
+
token: string | null;
|
|
8
|
+
error: Error | null;
|
|
9
|
+
}
|
|
10
|
+
export declare function createSessionCookie(idToken: string): Promise<{
|
|
11
|
+
success: boolean;
|
|
12
|
+
message: string;
|
|
13
|
+
}>;
|
|
14
|
+
export declare function getServerSessionCookie(): Promise<{
|
|
15
|
+
token: string;
|
|
16
|
+
userId: string;
|
|
17
|
+
}>;
|
|
18
|
+
export declare function getIdToken(): Promise<{
|
|
19
|
+
token: string;
|
|
20
|
+
userId: string;
|
|
21
|
+
}>;
|
|
22
|
+
export declare function setServerSession(token: string): Promise<void>;
|
|
23
|
+
export declare function verifyIDToken(token: string): Promise<{
|
|
24
|
+
valid: boolean;
|
|
25
|
+
uid: string;
|
|
26
|
+
error?: undefined;
|
|
27
|
+
} | {
|
|
28
|
+
error: unknown;
|
|
29
|
+
valid: boolean;
|
|
30
|
+
uid?: undefined;
|
|
31
|
+
}>;
|
|
32
|
+
export declare function verifySessionCookie(session: string): Promise<{
|
|
33
|
+
valid: boolean;
|
|
34
|
+
uid?: any;
|
|
35
|
+
error?: any;
|
|
36
|
+
}>;
|
|
37
|
+
//# sourceMappingURL=sessionTernSecure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionTernSecure.d.ts","sourceRoot":"","sources":["../../../../src/app-router/server/sessionTernSecure.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,IAAI;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAEH,MAAM,WAAW,OAAO;IACpB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACvB;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM;;;GAgBxD;AAID,wBAAsB,sBAAsB;;;GAkB3C;AAGD,wBAAsB,UAAU;;;GAkB/B;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,iBASjD;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM;;;;;;;;GAWhD;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IAAC,KAAK,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAW9G"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ternSecureMiddleware.d.ts","sourceRoot":"","sources":["../../../../src/app-router/server/ternSecureMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAQ9C,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,WAAW,kCAgC1D"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { TernSecureAuth, TernSecureFirestore } from './utils/client-init';
|
|
2
2
|
export { loadFireConfig, validateConfig } from './utils/config';
|
|
3
|
-
export { signInWithEmail } from './app-router/client/
|
|
3
|
+
export { signInWithEmail } from './app-router/client/actions';
|
|
4
4
|
export { TernSecureProvider } from './app-router/client/TernSecureProvider';
|
|
5
5
|
export { useAuth } from './boundary/hooks/useAuth';
|
|
6
6
|
export { SignIn } from './components/sign-in';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAG7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAA;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA"}
|
package/dist/types/types.d.ts
CHANGED
|
@@ -44,4 +44,20 @@ export interface ConfigValidationResult {
|
|
|
44
44
|
errors: string[];
|
|
45
45
|
config: TernSecureConfig;
|
|
46
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Firebase Admin configuration interface
|
|
49
|
+
*/
|
|
50
|
+
export interface TernSecureAdminConfig {
|
|
51
|
+
projectId: string;
|
|
52
|
+
clientEmail: string;
|
|
53
|
+
privateKey: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Firebase Admin configuration validation result
|
|
57
|
+
*/
|
|
58
|
+
export interface AdminConfigValidationResult {
|
|
59
|
+
isValid: boolean;
|
|
60
|
+
errors: string[];
|
|
61
|
+
config: TernSecureAdminConfig;
|
|
62
|
+
}
|
|
47
63
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAE9C;;;GAGG;AACH,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,WAAW,CAAC,EAAE,aAAa,GAAG,YAAY,CAAA;IAC1C,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2BAA2B;IAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAChC,sBAAsB;IACtB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,WAAW,EAAE,OAAO,CAAA;IACpB,gCAAgC;IAChC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,+CAA+C;IAC/C,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,MAAM,EAAE,gBAAgB,CAAA;CACzB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAE9C;;;GAGG;AACH,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,WAAW,CAAC,EAAE,aAAa,GAAG,YAAY,CAAA;IAC1C,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2BAA2B;IAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAChC,sBAAsB;IACtB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,WAAW,EAAE,OAAO,CAAA;IACpB,gCAAgC;IAChC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;IACnB,+CAA+C;IAC/C,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,MAAM,EAAE,gBAAgB,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,MAAM,EAAE,qBAAqB,CAAA;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-init.d.ts","sourceRoot":"","sources":["../../../src/utils/admin-init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,gBAAgB,CAAC;AAiBnC,eAAO,MAAM,mBAAmB,6CAAe,CAAC;AAChD,eAAO,MAAM,iBAAiB,2BAAoB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TernSecureConfig, ConfigValidationResult } from '../types';
|
|
1
|
+
import { TernSecureConfig, ConfigValidationResult, TernSecureAdminConfig, AdminConfigValidationResult } from '../types';
|
|
2
2
|
/**
|
|
3
3
|
* Loads Firebase configuration from environment variables
|
|
4
4
|
* @returns {TernSecureConfig} Firebase configuration object
|
|
@@ -16,4 +16,20 @@ export declare const validateConfig: (config: TernSecureConfig) => ConfigValidat
|
|
|
16
16
|
* @throws {Error} If configuration is invalid
|
|
17
17
|
*/
|
|
18
18
|
export declare const initializeConfig: () => TernSecureConfig;
|
|
19
|
+
/**
|
|
20
|
+
* Loads Firebase Admin configuration from environment variables
|
|
21
|
+
* @returns {AdminConfig} Firebase Admin configuration object
|
|
22
|
+
*/
|
|
23
|
+
export declare const loadAdminConfig: () => TernSecureAdminConfig;
|
|
24
|
+
/**
|
|
25
|
+
* Validates Firebase Admin configuration
|
|
26
|
+
* @param {AdminConfig} config - Firebase Admin configuration object
|
|
27
|
+
* @returns {ConfigValidationResult} Validation result
|
|
28
|
+
*/
|
|
29
|
+
export declare const validateAdminConfig: (config: TernSecureAdminConfig) => AdminConfigValidationResult;
|
|
30
|
+
/**
|
|
31
|
+
* Initializes admin configuration with validation
|
|
32
|
+
* @throws {Error} If configuration is invalid
|
|
33
|
+
*/
|
|
34
|
+
export declare const initializeAdminConfig: () => TernSecureAdminConfig;
|
|
19
35
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAA;AAEvH;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAO,gBAQhC,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,WAAY,gBAAgB,KAAG,sBAuBzD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,QAAO,gBAWnC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAO,qBAIjC,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,WAAY,qBAAqB,KAAG,2BAoBnE,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,QAAO,qBAWxC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tern-secure/nextjs",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.13",
|
|
4
4
|
"packageManager": "npm@10.9.0",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -53,6 +53,11 @@
|
|
|
53
53
|
"types": "./dist/types/index.d.ts",
|
|
54
54
|
"import": "./dist/esm/index.js",
|
|
55
55
|
"require": "./dist/cjs/index.js"
|
|
56
|
+
},
|
|
57
|
+
"./server": {
|
|
58
|
+
"types": "./dist/types/app-router/server/index.d.ts",
|
|
59
|
+
"import": "./dist/esm/app-router/server/index.js",
|
|
60
|
+
"require": "./dist/cjs/app-router/server/index.js"
|
|
56
61
|
}
|
|
57
62
|
}
|
|
58
63
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app-router/client/auth.ts"],"sourcesContent":["import { TernSecureAuth } from '../../utils/client-init'\r\nimport { signInWithEmailAndPassword } from 'firebase/auth'\r\n\r\n//export interface SignInCredentials {\r\n //email: string\r\n //password: string\r\n//}\r\n\r\nexport async function signInWithEmail(email: string, password: string){\r\n const auth = TernSecureAuth()\r\n const UserCredential = await signInWithEmailAndPassword(auth, email, password)\r\n return UserCredential.user\r\n} "],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAA+B;AAC/B,kBAA2C;AAO3C,eAAsB,gBAAgB,OAAe,UAAiB;AACpE,QAAM,WAAO,mCAAe;AAC5B,QAAM,iBAAiB,UAAM,wCAA2B,MAAM,OAAO,QAAQ;AAC7E,SAAO,eAAe;AACxB;","names":[]}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { TernSecureAuth } from "../../utils/client-init";
|
|
2
|
-
import { signInWithEmailAndPassword } from "firebase/auth";
|
|
3
|
-
async function signInWithEmail(email, password) {
|
|
4
|
-
const auth = TernSecureAuth();
|
|
5
|
-
const UserCredential = await signInWithEmailAndPassword(auth, email, password);
|
|
6
|
-
return UserCredential.user;
|
|
7
|
-
}
|
|
8
|
-
export {
|
|
9
|
-
signInWithEmail
|
|
10
|
-
};
|
|
11
|
-
//# sourceMappingURL=auth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app-router/client/auth.ts"],"sourcesContent":["import { TernSecureAuth } from '../../utils/client-init'\r\nimport { signInWithEmailAndPassword } from 'firebase/auth'\r\n\r\n//export interface SignInCredentials {\r\n //email: string\r\n //password: string\r\n//}\r\n\r\nexport async function signInWithEmail(email: string, password: string){\r\n const auth = TernSecureAuth()\r\n const UserCredential = await signInWithEmailAndPassword(auth, email, password)\r\n return UserCredential.user\r\n} "],"mappings":"AAAA,SAAS,sBAAsB;AAC/B,SAAS,kCAAkC;AAO3C,eAAsB,gBAAgB,OAAe,UAAiB;AACpE,QAAM,OAAO,eAAe;AAC5B,QAAM,iBAAiB,MAAM,2BAA2B,MAAM,OAAO,QAAQ;AAC7E,SAAO,eAAe;AACxB;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/app-router/client/auth.ts"],"names":[],"mappings":"AAQA,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,0CAIpE"}
|