@tern-secure/backend 1.0.1 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/cjs/admin/sessionTernSecure.js +256 -0
  2. package/dist/cjs/admin/sessionTernSecure.js.map +1 -0
  3. package/dist/cjs/admin/tenant.js +68 -0
  4. package/dist/cjs/admin/tenant.js.map +1 -0
  5. package/dist/cjs/index.js +48 -0
  6. package/dist/cjs/index.js.map +1 -0
  7. package/dist/cjs/ternsecureauth.js +40 -0
  8. package/dist/cjs/ternsecureauth.js.map +1 -0
  9. package/dist/cjs/utils/admin-init.js +60 -0
  10. package/dist/cjs/utils/admin-init.js.map +1 -0
  11. package/dist/cjs/utils/config.js +113 -0
  12. package/dist/cjs/utils/config.js.map +1 -0
  13. package/dist/esm/admin/sessionTernSecure.js +226 -0
  14. package/dist/esm/admin/sessionTernSecure.js.map +1 -0
  15. package/dist/esm/admin/tenant.js +43 -0
  16. package/dist/esm/admin/tenant.js.map +1 -0
  17. package/dist/esm/index.js +24 -0
  18. package/dist/esm/index.js.map +1 -0
  19. package/dist/esm/ternsecureauth.js +16 -0
  20. package/dist/esm/ternsecureauth.js.map +1 -0
  21. package/dist/esm/utils/admin-init.js +24 -0
  22. package/dist/esm/utils/admin-init.js.map +1 -0
  23. package/dist/esm/utils/config.js +84 -0
  24. package/dist/esm/utils/config.js.map +1 -0
  25. package/dist/types/admin/sessionTernSecure.d.ts +36 -0
  26. package/dist/types/admin/sessionTernSecure.d.ts.map +1 -0
  27. package/dist/types/admin/tenant.d.ts +17 -0
  28. package/dist/types/admin/tenant.d.ts.map +1 -0
  29. package/dist/types/index.d.ts +5 -0
  30. package/dist/types/index.d.ts.map +1 -0
  31. package/dist/types/ternsecureauth.d.ts +9 -0
  32. package/dist/types/ternsecureauth.d.ts.map +1 -0
  33. package/dist/types/utils/admin-init.d.ts +5 -0
  34. package/dist/types/utils/admin-init.d.ts.map +1 -0
  35. package/dist/types/utils/config.d.ts +35 -0
  36. package/dist/types/utils/config.d.ts.map +1 -0
  37. package/package.json +6 -5
  38. package/.turbo/turbo-build.log +0 -48
  39. package/CHANGELOG.md +0 -30
  40. package/src/admin/sessionTernSecure.ts +0 -193
  41. package/src/admin/tenant.ts +0 -63
  42. package/src/index.ts +0 -12
  43. package/src/ternsecureauth.ts +0 -18
  44. package/src/utils/admin-init.ts +0 -22
  45. package/src/utils/config.ts +0 -122
  46. package/tsconfig.add.json +0 -13
  47. package/tsconfig.json +0 -25
  48. package/tsup.config.ts +0 -31
@@ -0,0 +1,226 @@
1
+ "use server";
2
+ import { cookies } from "next/headers";
3
+ import { adminTernSecureAuth as adminAuth } from "../utils/admin-init";
4
+ import { handleFirebaseAuthError } from "@tern-secure/types";
5
+ const SESSION_CONSTANTS = {
6
+ COOKIE_NAME: "_session_cookie",
7
+ DEFAULT_EXPIRES_IN_MS: 60 * 60 * 24 * 5 * 1e3,
8
+ // 5 days
9
+ DEFAULT_EXPIRES_IN_SECONDS: 60 * 60 * 24 * 5
10
+ };
11
+ const COOKIE_OPTIONS = {
12
+ httpOnly: true,
13
+ secure: process.env.NODE_ENV === "production",
14
+ sameSite: "strict",
15
+ path: "/"
16
+ };
17
+ async function createSessionCookie(params) {
18
+ try {
19
+ const idToken = typeof params === "string" ? params : params.idToken;
20
+ if (!idToken) {
21
+ const error = new Error("ID token is required for session creation");
22
+ console.error("[createSessionCookie] Missing ID token:", error);
23
+ return {
24
+ success: false,
25
+ message: "ID token is required",
26
+ error: "INVALID_TOKEN",
27
+ cookieSet: false
28
+ };
29
+ }
30
+ let decodedToken;
31
+ try {
32
+ decodedToken = await adminAuth.verifyIdToken(idToken);
33
+ } catch (verifyError) {
34
+ console.error("[createSessionCookie] ID token verification failed:", verifyError);
35
+ const authError = handleFirebaseAuthError(verifyError);
36
+ return {
37
+ success: false,
38
+ message: authError.message,
39
+ error: authError.code,
40
+ cookieSet: false
41
+ };
42
+ }
43
+ if (!decodedToken) {
44
+ const error = new Error("Invalid ID token - verification returned null");
45
+ console.error("[createSessionCookie] Token verification returned null:", error);
46
+ return {
47
+ success: false,
48
+ message: "Invalid ID token",
49
+ error: "INVALID_TOKEN",
50
+ cookieSet: false
51
+ };
52
+ }
53
+ let sessionCookie;
54
+ try {
55
+ sessionCookie = await adminAuth.createSessionCookie(idToken, {
56
+ expiresIn: SESSION_CONSTANTS.DEFAULT_EXPIRES_IN_MS
57
+ });
58
+ } catch (sessionError) {
59
+ console.error("[createSessionCookie] Firebase session cookie creation failed:", sessionError);
60
+ const authError = handleFirebaseAuthError(sessionError);
61
+ return {
62
+ success: false,
63
+ message: authError.message,
64
+ error: authError.code,
65
+ cookieSet: false
66
+ };
67
+ }
68
+ let cookieSetSuccessfully = false;
69
+ try {
70
+ const cookieStore = await cookies();
71
+ cookieStore.set(SESSION_CONSTANTS.COOKIE_NAME, sessionCookie, {
72
+ maxAge: SESSION_CONSTANTS.DEFAULT_EXPIRES_IN_SECONDS,
73
+ ...COOKIE_OPTIONS
74
+ });
75
+ const verifySetCookie = cookieStore.get(SESSION_CONSTANTS.COOKIE_NAME);
76
+ cookieSetSuccessfully = !!(verifySetCookie == null ? void 0 : verifySetCookie.value);
77
+ if (!cookieSetSuccessfully) {
78
+ const error = new Error("Session cookie was not set successfully");
79
+ console.error("[createSessionCookie] Cookie verification failed:", error);
80
+ throw error;
81
+ }
82
+ } catch (cookieError) {
83
+ console.error("[createSessionCookie] Failed to set session cookie:", cookieError);
84
+ return {
85
+ success: false,
86
+ message: "Failed to set session cookie",
87
+ error: "COOKIE_SET_FAILED",
88
+ cookieSet: false
89
+ };
90
+ }
91
+ console.log(`[createSessionCookie] Session cookie created successfully for user: ${decodedToken.uid}`);
92
+ return {
93
+ success: true,
94
+ message: "Session created successfully",
95
+ expiresIn: SESSION_CONSTANTS.DEFAULT_EXPIRES_IN_SECONDS,
96
+ cookieSet: cookieSetSuccessfully
97
+ };
98
+ } catch (error) {
99
+ console.error("[createSessionCookie] Unexpected error:", error);
100
+ const authError = handleFirebaseAuthError(error);
101
+ return {
102
+ success: false,
103
+ message: authError.message || "Failed to create session",
104
+ error: authError.code || "INTERNAL_ERROR",
105
+ cookieSet: false
106
+ };
107
+ }
108
+ }
109
+ async function getServerSessionCookie() {
110
+ var _a;
111
+ const cookieStore = await cookies();
112
+ const sessionCookie = (_a = cookieStore.get("_session_cookie")) == null ? void 0 : _a.value;
113
+ if (!sessionCookie) {
114
+ throw new Error("No session cookie found");
115
+ }
116
+ try {
117
+ const decondeClaims = await adminAuth.verifySessionCookie(sessionCookie, true);
118
+ return {
119
+ token: sessionCookie,
120
+ userId: decondeClaims.uid
121
+ };
122
+ } catch (error) {
123
+ console.error("Error verifying session:", error);
124
+ throw new Error("Invalid Session");
125
+ }
126
+ }
127
+ async function getIdToken() {
128
+ var _a;
129
+ const cookieStore = await cookies();
130
+ const token = (_a = cookieStore.get("_session_token")) == null ? void 0 : _a.value;
131
+ if (!token) {
132
+ throw new Error("No session cookie found");
133
+ }
134
+ try {
135
+ const decodedClaims = await adminAuth.verifyIdToken(token);
136
+ return {
137
+ token,
138
+ userId: decodedClaims.uid
139
+ };
140
+ } catch (error) {
141
+ console.error("Error verifying session:", error);
142
+ throw new Error("Invalid Session");
143
+ }
144
+ }
145
+ async function setServerSession(token) {
146
+ try {
147
+ const cookieStore = await cookies();
148
+ cookieStore.set("_session_token", token, {
149
+ httpOnly: true,
150
+ secure: process.env.NODE_ENV === "production",
151
+ sameSite: "strict",
152
+ maxAge: 60 * 60,
153
+ // 1 hour
154
+ path: "/"
155
+ });
156
+ return { success: true, message: "Session created" };
157
+ } catch {
158
+ return { success: false, message: "Failed to create session" };
159
+ }
160
+ }
161
+ async function verifyTernIdToken(token) {
162
+ try {
163
+ const decodedToken = await adminAuth.verifyIdToken(token);
164
+ return {
165
+ valid: true,
166
+ uid: decodedToken.uid,
167
+ email: decodedToken.email || null,
168
+ authTime: decodedToken.auth_time
169
+ };
170
+ } catch (error) {
171
+ const errorResponse = handleFirebaseAuthError(error);
172
+ return {
173
+ valid: false,
174
+ uid: null,
175
+ email: null,
176
+ error: errorResponse
177
+ };
178
+ }
179
+ }
180
+ async function verifyTernSessionCookie(session) {
181
+ try {
182
+ const res = await adminAuth.verifySessionCookie(session);
183
+ return {
184
+ valid: true,
185
+ uid: res.uid,
186
+ email: res.email || null,
187
+ authTime: res.auth_time
188
+ };
189
+ } catch (error) {
190
+ const errorResponse = handleFirebaseAuthError(error);
191
+ return {
192
+ valid: false,
193
+ uid: null,
194
+ email: null,
195
+ error: errorResponse
196
+ };
197
+ }
198
+ }
199
+ async function clearSessionCookie() {
200
+ var _a;
201
+ const cookieStore = await cookies();
202
+ cookieStore.delete("_session_cookie");
203
+ cookieStore.delete("_session_token");
204
+ cookieStore.delete("_session");
205
+ try {
206
+ const sessionCookie = (_a = cookieStore.get("_session_cookie")) == null ? void 0 : _a.value;
207
+ if (sessionCookie) {
208
+ const decodedClaims = await adminAuth.verifySessionCookie(sessionCookie);
209
+ await adminAuth.revokeRefreshTokens(decodedClaims.uid);
210
+ }
211
+ return { success: true, message: "Session cleared successfully" };
212
+ } catch (error) {
213
+ console.error("Error clearing session:", error);
214
+ return { success: true, message: "Session cookies cleared" };
215
+ }
216
+ }
217
+ export {
218
+ clearSessionCookie,
219
+ createSessionCookie,
220
+ getIdToken,
221
+ getServerSessionCookie,
222
+ setServerSession,
223
+ verifyTernIdToken,
224
+ verifyTernSessionCookie
225
+ };
226
+ //# sourceMappingURL=sessionTernSecure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/admin/sessionTernSecure.ts"],"sourcesContent":["'use server'\r\n\r\nimport { cookies } from 'next/headers';\r\nimport { adminTernSecureAuth as adminAuth } from '../utils/admin-init';\r\nimport { handleFirebaseAuthError, type AuthErrorResponse, type SessionParams, type SessionResult } from '@tern-secure/types';\r\n\r\ninterface FirebaseAuthError extends Error {\r\n code?: string;\r\n}\r\n\r\nexport interface User {\r\n uid: string | null;\r\n email: string | null;\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\ninterface TernVerificationResult extends User {\r\n valid: boolean\r\n authTime?: number\r\n error?: AuthErrorResponse\r\n}\r\n\r\n\r\n// DRY Constants\r\nconst SESSION_CONSTANTS = {\r\n COOKIE_NAME: '_session_cookie',\r\n DEFAULT_EXPIRES_IN_MS: 60 * 60 * 24 * 5 * 1000, // 5 days\r\n DEFAULT_EXPIRES_IN_SECONDS: 60 * 60 * 24 * 5,\r\n} as const;\r\n\r\nconst COOKIE_OPTIONS = {\r\n httpOnly: true,\r\n secure: process.env.NODE_ENV === 'production',\r\n sameSite: 'strict' as const,\r\n path: '/',\r\n} as const;\r\n\r\n\r\n\r\nexport async function createSessionCookie(params: SessionParams | string): Promise<SessionResult> {\r\n try {\r\n // Handle both old string format and new object format for backward compatibility\r\n const idToken = typeof params === 'string' ? params : params.idToken;\r\n \r\n if (!idToken) {\r\n const error = new Error('ID token is required for session creation');\r\n console.error('[createSessionCookie] Missing ID token:', error);\r\n return {\r\n success: false,\r\n message: 'ID token is required',\r\n error: 'INVALID_TOKEN',\r\n cookieSet: false\r\n };\r\n }\r\n\r\n // Verify the ID token first\r\n let decodedToken;\r\n try {\r\n decodedToken = await adminAuth.verifyIdToken(idToken);\r\n } catch (verifyError) {\r\n console.error('[createSessionCookie] ID token verification failed:', verifyError);\r\n const authError = handleFirebaseAuthError(verifyError);\r\n return {\r\n success: false,\r\n message: authError.message,\r\n error: authError.code,\r\n cookieSet: false\r\n };\r\n }\r\n \r\n if (!decodedToken) {\r\n const error = new Error('Invalid ID token - verification returned null');\r\n console.error('[createSessionCookie] Token verification returned null:', error);\r\n return {\r\n success: false,\r\n message: 'Invalid ID token',\r\n error: 'INVALID_TOKEN',\r\n cookieSet: false\r\n };\r\n }\r\n\r\n // Create session cookie\r\n let sessionCookie;\r\n try {\r\n sessionCookie = await adminAuth.createSessionCookie(idToken, { \r\n expiresIn: SESSION_CONSTANTS.DEFAULT_EXPIRES_IN_MS \r\n });\r\n } catch (sessionError) {\r\n console.error('[createSessionCookie] Firebase session cookie creation failed:', sessionError);\r\n const authError = handleFirebaseAuthError(sessionError);\r\n return {\r\n success: false,\r\n message: authError.message,\r\n error: authError.code,\r\n cookieSet: false\r\n };\r\n }\r\n\r\n // Set the cookie and verify it was set\r\n let cookieSetSuccessfully = false;\r\n try {\r\n const cookieStore = await cookies();\r\n cookieStore.set(SESSION_CONSTANTS.COOKIE_NAME, sessionCookie, {\r\n maxAge: SESSION_CONSTANTS.DEFAULT_EXPIRES_IN_SECONDS,\r\n ...COOKIE_OPTIONS,\r\n });\r\n\r\n // Verify the cookie was actually set\r\n const verifySetCookie = cookieStore.get(SESSION_CONSTANTS.COOKIE_NAME);\r\n cookieSetSuccessfully = !!verifySetCookie?.value;\r\n \r\n if (!cookieSetSuccessfully) {\r\n const error = new Error('Session cookie was not set successfully');\r\n console.error('[createSessionCookie] Cookie verification failed:', error);\r\n throw error;\r\n }\r\n\r\n } catch (cookieError) {\r\n console.error('[createSessionCookie] Failed to set session cookie:', cookieError);\r\n return {\r\n success: false,\r\n message: 'Failed to set session cookie',\r\n error: 'COOKIE_SET_FAILED',\r\n cookieSet: false\r\n };\r\n }\r\n\r\n console.log(`[createSessionCookie] Session cookie created successfully for user: ${decodedToken.uid}`);\r\n return {\r\n success: true,\r\n message: 'Session created successfully',\r\n expiresIn: SESSION_CONSTANTS.DEFAULT_EXPIRES_IN_SECONDS,\r\n cookieSet: cookieSetSuccessfully\r\n };\r\n\r\n } catch (error) {\r\n console.error('[createSessionCookie] Unexpected error:', error);\r\n const authError = handleFirebaseAuthError(error);\r\n return {\r\n success: false,\r\n message: authError.message || 'Failed to create session',\r\n error: authError.code || 'INTERNAL_ERROR',\r\n cookieSet: false\r\n };\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, true)\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 try {\r\n const cookieStore = await cookies();\r\n cookieStore.set('_session_token', 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 return { success: true, message: 'Session created' };\r\n } catch {\r\n return { success: false, message: 'Failed to create session' };\r\n }\r\n}\r\n\r\n export async function verifyTernIdToken(token: string): Promise<TernVerificationResult> {\r\n try {\r\n const decodedToken = await adminAuth.verifyIdToken(token);\r\n return {\r\n valid: true,\r\n uid: decodedToken.uid,\r\n email: decodedToken.email || null,\r\n authTime: decodedToken.auth_time\r\n };\r\n } catch (error) {\r\n const errorResponse = handleFirebaseAuthError(error)\r\n return {\r\n valid: false,\r\n uid: null,\r\n email: null,\r\n error: errorResponse\r\n };\r\n }\r\n }\r\n \r\n\r\n export async function verifyTernSessionCookie(session: string): Promise<TernVerificationResult>{\r\n try {\r\n const res = await adminAuth.verifySessionCookie(session);\r\n return { \r\n valid: true, \r\n uid: res.uid,\r\n email: res.email || null,\r\n authTime: res.auth_time\r\n };\r\n } catch (error) {\r\n const errorResponse = handleFirebaseAuthError(error)\r\n return {\r\n valid: false, \r\n uid: null,\r\n email: null,\r\n error: errorResponse\r\n };\r\n }\r\n }\r\n\r\n\r\n export async function clearSessionCookie() {\r\n const cookieStore = await cookies()\r\n \r\n cookieStore.delete('_session_cookie')\r\n cookieStore.delete('_session_token')\r\n cookieStore.delete('_session')\r\n \r\n try {\r\n // Verify if there's an active session before revoking\r\n const sessionCookie = cookieStore.get('_session_cookie')?.value\r\n if (sessionCookie) {\r\n // Get the decoded claims to get the user's ID\r\n const decodedClaims = await adminAuth.verifySessionCookie(sessionCookie)\r\n \r\n // Revoke all sessions for the user\r\n await adminAuth.revokeRefreshTokens(decodedClaims.uid)\r\n }\r\n \r\n return { success: true, message: 'Session cleared successfully' }\r\n } catch (error) {\r\n console.error('Error clearing session:', error)\r\n // Still return success even if revoking fails, as cookies are cleared\r\n return { success: true, message: 'Session cookies cleared' }\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":"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","names":[]}
@@ -0,0 +1,43 @@
1
+ import { TernSecureTenantManager } from "../utils/admin-init";
2
+ async function createTenant(displayName, emailSignInConfig, multiFactorConfig) {
3
+ try {
4
+ const tenantConfig = {
5
+ displayName,
6
+ emailSignInConfig,
7
+ ...multiFactorConfig && { multiFactorConfig }
8
+ };
9
+ const tenant = await TernSecureTenantManager.createTenant(tenantConfig);
10
+ return {
11
+ success: true,
12
+ tenantId: tenant.tenantId,
13
+ displayName: tenant.displayName
14
+ };
15
+ } catch (error) {
16
+ console.error("Error creating tenant:", error);
17
+ throw new Error("Failed to create tenant");
18
+ }
19
+ }
20
+ async function createTenantUser(email, password, tenantId) {
21
+ try {
22
+ const tenantAuth = TernSecureTenantManager.authForTenant(tenantId);
23
+ const userRecord = await tenantAuth.createUser({
24
+ email,
25
+ password,
26
+ emailVerified: false,
27
+ disabled: false
28
+ });
29
+ return {
30
+ success: true,
31
+ message: "Tenant user created successfully",
32
+ user: userRecord.uid
33
+ };
34
+ } catch (error) {
35
+ console.error("Error creating tenant user:", error);
36
+ throw new Error("Failed to create tenant user");
37
+ }
38
+ }
39
+ export {
40
+ createTenant,
41
+ createTenantUser
42
+ };
43
+ //# sourceMappingURL=tenant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/admin/tenant.ts"],"sourcesContent":["import { TernSecureTenantManager } from \"../utils/admin-init\";\r\nimport type { SignInResponse } from '@tern-secure/types';\r\n\r\n\r\nexport async function createTenant(\r\n displayName: string,\r\n emailSignInConfig: {\r\n enabled: boolean;\r\n passwordRequired: boolean;\r\n },\r\n multiFactorConfig?: {\r\n state: 'ENABLED' | 'DISABLED';\r\n factorIds: \"phone\"[];\r\n testPhoneNumbers?: {\r\n [phoneNumber: string]: string;\r\n }\r\n }\r\n) {\r\n try {\r\n const tenantConfig = {\r\n displayName,\r\n emailSignInConfig,\r\n ...(multiFactorConfig && { multiFactorConfig })\r\n };\r\n\r\n const tenant = await TernSecureTenantManager.createTenant(tenantConfig);\r\n \r\n return {\r\n success: true,\r\n tenantId: tenant.tenantId,\r\n displayName: tenant.displayName,\r\n };\r\n } catch (error) {\r\n console.error('Error creating tenant:', error);\r\n throw new Error('Failed to create tenant');\r\n }\r\n}\r\n\r\nexport async function createTenantUser(\r\n email: string,\r\n password: string,\r\n tenantId: string\r\n): Promise<SignInResponse> {\r\n try {\r\n const tenantAuth = TernSecureTenantManager.authForTenant(tenantId);\r\n \r\n const userRecord = await tenantAuth.createUser({\r\n email,\r\n password,\r\n emailVerified: false,\r\n disabled: false\r\n });\r\n\r\n return {\r\n success: true,\r\n message: 'Tenant user created successfully',\r\n user: userRecord.uid,\r\n };\r\n } catch (error) {\r\n console.error('Error creating tenant user:', error);\r\n throw new Error('Failed to create tenant user');\r\n }\r\n}\r\n"],"mappings":"AAAA,SAAS,+BAA+B;AAIxC,eAAsB,aACpB,aACA,mBAIA,mBAOA;AACA,MAAI;AACF,UAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA,GAAI,qBAAqB,EAAE,kBAAkB;AAAA,IAC/C;AAEA,UAAM,SAAS,MAAM,wBAAwB,aAAa,YAAY;AAEtE,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,OAAO;AAAA,MACjB,aAAa,OAAO;AAAA,IACtB;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,0BAA0B,KAAK;AAC7C,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACF;AAEA,eAAsB,iBACpB,OACA,UACA,UACyB;AACzB,MAAI;AACF,UAAM,aAAa,wBAAwB,cAAc,QAAQ;AAEjE,UAAM,aAAa,MAAM,WAAW,WAAW;AAAA,MAC7C;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf,UAAU;AAAA,IACZ,CAAC;AAED,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,MACT,MAAM,WAAW;AAAA,IACnB;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,+BAA+B,KAAK;AAClD,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AACF;","names":[]}
@@ -0,0 +1,24 @@
1
+ import {
2
+ verifyTernSessionCookie,
3
+ createSessionCookie,
4
+ clearSessionCookie
5
+ } from "./admin/sessionTernSecure";
6
+ import {
7
+ adminTernSecureAuth,
8
+ adminTernSecureDb,
9
+ TernSecureTenantManager
10
+ } from "./utils/admin-init";
11
+ import { initializeAdminConfig } from "./utils/config";
12
+ import { createTenant, createTenantUser } from "./admin/tenant";
13
+ export {
14
+ TernSecureTenantManager,
15
+ adminTernSecureAuth,
16
+ adminTernSecureDb,
17
+ clearSessionCookie,
18
+ createSessionCookie,
19
+ createTenant,
20
+ createTenantUser,
21
+ initializeAdminConfig,
22
+ verifyTernSessionCookie
23
+ };
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export { \n verifyTernSessionCookie,\n createSessionCookie, \n clearSessionCookie \n} from './admin/sessionTernSecure'\nexport { \n adminTernSecureAuth, \n adminTernSecureDb, \n TernSecureTenantManager \n} from './utils/admin-init'\nexport { initializeAdminConfig } from './utils/config'\nexport { createTenant, createTenantUser } from './admin/tenant'"],"mappings":"AAAA;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP,SAAS,6BAA6B;AACtC,SAAS,cAAc,wBAAwB;","names":[]}
@@ -0,0 +1,16 @@
1
+ class TernSecureAuthProvider {
2
+ static instance;
3
+ static getOrCreateInstance() {
4
+ if (!TernSecureAuthProvider.instance) {
5
+ TernSecureAuthProvider.instance = new TernSecureAuthProvider();
6
+ }
7
+ return TernSecureAuthProvider.instance;
8
+ }
9
+ static clearInstance() {
10
+ TernSecureAuthProvider.instance = null;
11
+ }
12
+ }
13
+ export {
14
+ TernSecureAuthProvider
15
+ };
16
+ //# sourceMappingURL=ternsecureauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ternsecureauth.ts"],"sourcesContent":["/**\n * Firebase implementation of the TernSecureAuthProvider interface\n */\nexport class TernSecureAuthProvider {\n private static instance: TernSecureAuthProvider | null;\n\n public static getOrCreateInstance(): TernSecureAuthProvider {\n if (!TernSecureAuthProvider.instance) {\n TernSecureAuthProvider.instance = new TernSecureAuthProvider();\n }\n return TernSecureAuthProvider.instance;\n }\n\n static clearInstance() {\n TernSecureAuthProvider.instance = null;\n }\n\n}"],"mappings":"AAGO,MAAM,uBAAwB;AAAA,EACjC,OAAe;AAAA,EAEf,OAAc,sBAA8C;AACxD,QAAI,CAAC,uBAAuB,UAAU;AAClC,6BAAuB,WAAW,IAAI,uBAAuB;AAAA,IACjE;AACA,WAAO,uBAAuB;AAAA,EAClC;AAAA,EAEA,OAAO,gBAAgB;AACnB,2BAAuB,WAAW;AAAA,EACtC;AAEJ;","names":[]}
@@ -0,0 +1,24 @@
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
+ const TernSecureTenantManager = admin.auth().tenantManager();
19
+ export {
20
+ TernSecureTenantManager,
21
+ adminTernSecureAuth,
22
+ adminTernSecureDb
23
+ };
24
+ //# 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\n// Initialize Firebase Admin if not already initialized\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\n// Add explicit type annotations using the types from the admin namespace\r\nexport const adminTernSecureAuth: admin.auth.Auth = admin.auth();\r\nexport const adminTernSecureDb: admin.firestore.Firestore = admin.firestore();\r\nexport const TernSecureTenantManager: admin.auth.TenantManager = admin.auth().tenantManager();"],"mappings":"AAAA,OAAO,WAAW;AAClB,SAAS,6BAA6B;AAGtC,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;AAGO,MAAM,sBAAuC,MAAM,KAAK;AACxD,MAAM,oBAA+C,MAAM,UAAU;AACrE,MAAM,0BAAoD,MAAM,KAAK,EAAE,cAAc;","names":[]}
@@ -0,0 +1,84 @@
1
+ const loadFireConfig = () => ({
2
+ apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY || "",
3
+ authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || "",
4
+ projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || "",
5
+ storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET || "",
6
+ messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID || "",
7
+ appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID || "",
8
+ measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID || void 0
9
+ });
10
+ const validateConfig = (config) => {
11
+ const requiredFields = [
12
+ "apiKey",
13
+ "authDomain",
14
+ "projectId",
15
+ "storageBucket",
16
+ "messagingSenderId",
17
+ "appId"
18
+ ];
19
+ const errors = [];
20
+ requiredFields.forEach((field) => {
21
+ if (!config[field]) {
22
+ errors.push(`Missing required field: NEXT_PUBLIC_FIREBASE_${String(field).toUpperCase()}`);
23
+ }
24
+ });
25
+ return {
26
+ isValid: errors.length === 0,
27
+ errors,
28
+ config
29
+ };
30
+ };
31
+ const initializeConfig = () => {
32
+ const config = loadFireConfig();
33
+ const validationResult = validateConfig(config);
34
+ if (!validationResult.isValid) {
35
+ throw new Error(
36
+ `Firebase configuration validation failed:
37
+ ${validationResult.errors.join("\n")}`
38
+ );
39
+ }
40
+ return config;
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
+ };
76
+ export {
77
+ initializeAdminConfig,
78
+ initializeConfig,
79
+ loadAdminConfig,
80
+ loadFireConfig,
81
+ validateAdminConfig,
82
+ validateConfig
83
+ };
84
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/config.ts"],"sourcesContent":["import { \r\n TernSecureConfig, \r\n ConfigValidationResult, \r\n TernSecureAdminConfig, \r\n AdminConfigValidationResult \r\n} from '@tern-secure/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":"AAWO,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":[]}
@@ -0,0 +1,36 @@
1
+ import { type AuthErrorResponse, type SessionParams, type SessionResult } from '@tern-secure/types';
2
+ export interface User {
3
+ uid: string | null;
4
+ email: string | null;
5
+ }
6
+ export interface Session {
7
+ user: User | null;
8
+ token: string | null;
9
+ error: Error | null;
10
+ }
11
+ interface TernVerificationResult extends User {
12
+ valid: boolean;
13
+ authTime?: number;
14
+ error?: AuthErrorResponse;
15
+ }
16
+ export declare function createSessionCookie(params: SessionParams | string): Promise<SessionResult>;
17
+ export declare function getServerSessionCookie(): Promise<{
18
+ token: string;
19
+ userId: string;
20
+ }>;
21
+ export declare function getIdToken(): Promise<{
22
+ token: string;
23
+ userId: string;
24
+ }>;
25
+ export declare function setServerSession(token: string): Promise<{
26
+ success: boolean;
27
+ message: string;
28
+ }>;
29
+ export declare function verifyTernIdToken(token: string): Promise<TernVerificationResult>;
30
+ export declare function verifyTernSessionCookie(session: string): Promise<TernVerificationResult>;
31
+ export declare function clearSessionCookie(): Promise<{
32
+ success: boolean;
33
+ message: string;
34
+ }>;
35
+ export {};
36
+ //# sourceMappingURL=sessionTernSecure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionTernSecure.d.ts","sourceRoot":"","sources":["../../../src/admin/sessionTernSecure.ts"],"names":[],"mappings":"AAIA,OAAO,EAA2B,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAM7H,MAAM,WAAW,IAAI;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;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,UAAU,sBAAuB,SAAQ,IAAI;IAC3C,KAAK,EAAE,OAAO,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,iBAAiB,CAAA;CAC1B;AAmBD,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA0GhG;AAID,wBAAsB,sBAAsB;;;GAkB3C;AAGD,wBAAsB,UAAU;;;GAkB/B;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM;;;GAcnD;AAEC,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAkBtF;AAGD,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAkB9F;AAGD,wBAAsB,kBAAkB;;;GAwBvC"}
@@ -0,0 +1,17 @@
1
+ import type { SignInResponse } from '@tern-secure/types';
2
+ export declare function createTenant(displayName: string, emailSignInConfig: {
3
+ enabled: boolean;
4
+ passwordRequired: boolean;
5
+ }, multiFactorConfig?: {
6
+ state: 'ENABLED' | 'DISABLED';
7
+ factorIds: "phone"[];
8
+ testPhoneNumbers?: {
9
+ [phoneNumber: string]: string;
10
+ };
11
+ }): Promise<{
12
+ success: boolean;
13
+ tenantId: string;
14
+ displayName: string | undefined;
15
+ }>;
16
+ export declare function createTenantUser(email: string, password: string, tenantId: string): Promise<SignInResponse>;
17
+ //# sourceMappingURL=tenant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../../../src/admin/tenant.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,iBAAiB,EAAE;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,OAAO,CAAC;CAC3B,EACD,iBAAiB,CAAC,EAAE;IAClB,KAAK,EAAE,SAAS,GAAG,UAAU,CAAC;IAC9B,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,gBAAgB,CAAC,EAAE;QACf,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;KACjC,CAAA;CACF;;;;GAoBF;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,cAAc,CAAC,CAoBzB"}
@@ -0,0 +1,5 @@
1
+ export { verifyTernSessionCookie, createSessionCookie, clearSessionCookie } from './admin/sessionTernSecure';
2
+ export { adminTernSecureAuth, adminTernSecureDb, TernSecureTenantManager } from './utils/admin-init';
3
+ export { initializeAdminConfig } from './utils/config';
4
+ export { createTenant, createTenantUser } from './admin/tenant';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EACrB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EACH,mBAAmB,EACnB,iBAAiB,EACjB,uBAAuB,EAC1B,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Firebase implementation of the TernSecureAuthProvider interface
3
+ */
4
+ export declare class TernSecureAuthProvider {
5
+ private static instance;
6
+ static getOrCreateInstance(): TernSecureAuthProvider;
7
+ static clearInstance(): void;
8
+ }
9
+ //# sourceMappingURL=ternsecureauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ternsecureauth.d.ts","sourceRoot":"","sources":["../../src/ternsecureauth.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,sBAAsB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgC;WAEzC,mBAAmB,IAAI,sBAAsB;IAO3D,MAAM,CAAC,aAAa;CAIvB"}
@@ -0,0 +1,5 @@
1
+ import admin from 'firebase-admin';
2
+ export declare const adminTernSecureAuth: admin.auth.Auth;
3
+ export declare const adminTernSecureDb: admin.firestore.Firestore;
4
+ export declare const TernSecureTenantManager: admin.auth.TenantManager;
5
+ //# sourceMappingURL=admin-init.d.ts.map
@@ -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;AAmBnC,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,IAAI,CAAC,IAAmB,CAAC;AACjE,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,SAAS,CAAC,SAA6B,CAAC;AAC9E,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,IAAI,CAAC,aAA4C,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { TernSecureConfig, ConfigValidationResult, TernSecureAdminConfig, AdminConfigValidationResult } from '@tern-secure/types';
2
+ /**
3
+ * Loads Firebase configuration from environment variables
4
+ * @returns {TernSecureConfig} Firebase configuration object
5
+ */
6
+ export declare const loadFireConfig: () => TernSecureConfig;
7
+ /**
8
+ * Validates Firebase configuration
9
+ * @param {TernSecureConfig} config - Firebase configuration object
10
+ * @throws {Error} If required configuration values are missing
11
+ * @returns {TernSecureConfig} Validated configuration object
12
+ */
13
+ export declare const validateConfig: (config: TernSecureConfig) => ConfigValidationResult;
14
+ /**
15
+ * Initializes configuration with validation
16
+ * @throws {Error} If configuration is invalid
17
+ */
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;
35
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,2BAA2B,EAC5B,MAAM,oBAAoB,CAAA;AAE3B;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAO,gBAQhC,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,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,GAAI,QAAQ,qBAAqB,KAAG,2BAoBnE,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,QAAO,qBAWxC,CAAA"}