@marcwelti/mw-core 0.6.0 → 0.6.1

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.
@@ -1,6 +1,6 @@
1
1
  import { FirebaseApp } from 'firebase/app';
2
2
  import { Auth, User, UserCredential } from 'firebase/auth';
3
- export { Auth, User, UserCredential } from 'firebase/auth';
3
+ export { Auth, AuthCredential, User, UserCredential } from 'firebase/auth';
4
4
  import { Firestore, DocumentData, QueryConstraint, CollectionReference, DocumentReference, Unsubscribe } from 'firebase/firestore';
5
5
  export { CollectionReference, DocumentData, DocumentReference, DocumentSnapshot, FieldValue, OrderByDirection, QueryConstraint, QuerySnapshot, Timestamp, Unsubscribe, WhereFilterOp, limit, orderBy, query, serverTimestamp, startAfter, where } from 'firebase/firestore';
6
6
  import { FirebaseStorage } from 'firebase/storage';
@@ -106,6 +106,33 @@ declare function getCurrentUser(): User | null;
106
106
  * Useful for SSR/initial load
107
107
  */
108
108
  declare function waitForAuthState(): Promise<User | null>;
109
+ /**
110
+ * Delete the authenticated user
111
+ * Requires recent authentication
112
+ */
113
+ declare function deleteUser(user: User): Promise<void>;
114
+ /**
115
+ * Get the Firebase Auth instance
116
+ */
117
+ declare function getAuth(): Auth;
118
+ /**
119
+ * Convenience: Reauthenticate with password
120
+ * @returns Promise<UserCredential>
121
+ */
122
+ declare function reauthenticateWithPassword(user: User, password: string): Promise<UserCredential>;
123
+ /**
124
+ * Convenience: Reauthenticate with Google
125
+ * @returns Promise<UserCredential> or false if user cancelled
126
+ */
127
+ declare function reauthenticateWithGoogle(user: User): Promise<UserCredential | false>;
128
+ /**
129
+ * Update user email (requires recent authentication)
130
+ */
131
+ declare function updateUserEmail(user: User, newEmail: string): Promise<void>;
132
+ /**
133
+ * Update user password (requires recent authentication)
134
+ */
135
+ declare function updateUserPassword(user: User, newPassword: string): Promise<void>;
109
136
 
110
137
  /**
111
138
  * Get a document reference
@@ -174,4 +201,4 @@ declare function trackSignUp(method: string): Promise<void>;
174
201
  */
175
202
  declare function trackLogin(method: string): Promise<void>;
176
203
 
177
- export { type FirebaseConfig, addDocument, app, auth, db, deleteDocument, getCollection, getCollectionRef, getCurrentUser, getDocRef, getDocument, getFirebaseAnalytics, getFirebaseApp, getFirebaseAuth, getFirebaseConfig, getFirebaseFirestore, getFirebaseStorage, getGoogleRedirectResult, initializeFirebase, resetPassword, sendVerificationEmail, setDocument, signInWithEmail, signInWithGoogle, signInWithGoogleRedirect, signOut, signUpWithEmail, storage, subscribeToAuthState, subscribeToCollection, subscribeToDocument, trackEvent, trackLogin, trackPageView, trackSignUp, trackUserAction, updateDocument, updateUserProfile, waitForAuthState };
204
+ export { type FirebaseConfig, addDocument, app, auth, db, deleteDocument, deleteUser, getAuth, getCollection, getCollectionRef, getCurrentUser, getDocRef, getDocument, getFirebaseAnalytics, getFirebaseApp, getFirebaseAuth, getFirebaseConfig, getFirebaseFirestore, getFirebaseStorage, getGoogleRedirectResult, initializeFirebase, reauthenticateWithGoogle, reauthenticateWithPassword, resetPassword, sendVerificationEmail, setDocument, signInWithEmail, signInWithGoogle, signInWithGoogleRedirect, signOut, signUpWithEmail, storage, subscribeToAuthState, subscribeToCollection, subscribeToDocument, trackEvent, trackLogin, trackPageView, trackSignUp, trackUserAction, updateDocument, updateUserEmail, updateUserPassword, updateUserProfile, waitForAuthState };
@@ -1,6 +1,6 @@
1
1
  import { FirebaseApp } from 'firebase/app';
2
2
  import { Auth, User, UserCredential } from 'firebase/auth';
3
- export { Auth, User, UserCredential } from 'firebase/auth';
3
+ export { Auth, AuthCredential, User, UserCredential } from 'firebase/auth';
4
4
  import { Firestore, DocumentData, QueryConstraint, CollectionReference, DocumentReference, Unsubscribe } from 'firebase/firestore';
5
5
  export { CollectionReference, DocumentData, DocumentReference, DocumentSnapshot, FieldValue, OrderByDirection, QueryConstraint, QuerySnapshot, Timestamp, Unsubscribe, WhereFilterOp, limit, orderBy, query, serverTimestamp, startAfter, where } from 'firebase/firestore';
6
6
  import { FirebaseStorage } from 'firebase/storage';
@@ -106,6 +106,33 @@ declare function getCurrentUser(): User | null;
106
106
  * Useful for SSR/initial load
107
107
  */
108
108
  declare function waitForAuthState(): Promise<User | null>;
109
+ /**
110
+ * Delete the authenticated user
111
+ * Requires recent authentication
112
+ */
113
+ declare function deleteUser(user: User): Promise<void>;
114
+ /**
115
+ * Get the Firebase Auth instance
116
+ */
117
+ declare function getAuth(): Auth;
118
+ /**
119
+ * Convenience: Reauthenticate with password
120
+ * @returns Promise<UserCredential>
121
+ */
122
+ declare function reauthenticateWithPassword(user: User, password: string): Promise<UserCredential>;
123
+ /**
124
+ * Convenience: Reauthenticate with Google
125
+ * @returns Promise<UserCredential> or false if user cancelled
126
+ */
127
+ declare function reauthenticateWithGoogle(user: User): Promise<UserCredential | false>;
128
+ /**
129
+ * Update user email (requires recent authentication)
130
+ */
131
+ declare function updateUserEmail(user: User, newEmail: string): Promise<void>;
132
+ /**
133
+ * Update user password (requires recent authentication)
134
+ */
135
+ declare function updateUserPassword(user: User, newPassword: string): Promise<void>;
109
136
 
110
137
  /**
111
138
  * Get a document reference
@@ -174,4 +201,4 @@ declare function trackSignUp(method: string): Promise<void>;
174
201
  */
175
202
  declare function trackLogin(method: string): Promise<void>;
176
203
 
177
- export { type FirebaseConfig, addDocument, app, auth, db, deleteDocument, getCollection, getCollectionRef, getCurrentUser, getDocRef, getDocument, getFirebaseAnalytics, getFirebaseApp, getFirebaseAuth, getFirebaseConfig, getFirebaseFirestore, getFirebaseStorage, getGoogleRedirectResult, initializeFirebase, resetPassword, sendVerificationEmail, setDocument, signInWithEmail, signInWithGoogle, signInWithGoogleRedirect, signOut, signUpWithEmail, storage, subscribeToAuthState, subscribeToCollection, subscribeToDocument, trackEvent, trackLogin, trackPageView, trackSignUp, trackUserAction, updateDocument, updateUserProfile, waitForAuthState };
204
+ export { type FirebaseConfig, addDocument, app, auth, db, deleteDocument, deleteUser, getAuth, getCollection, getCollectionRef, getCurrentUser, getDocRef, getDocument, getFirebaseAnalytics, getFirebaseApp, getFirebaseAuth, getFirebaseConfig, getFirebaseFirestore, getFirebaseStorage, getGoogleRedirectResult, initializeFirebase, reauthenticateWithGoogle, reauthenticateWithPassword, resetPassword, sendVerificationEmail, setDocument, signInWithEmail, signInWithGoogle, signInWithGoogleRedirect, signOut, signUpWithEmail, storage, subscribeToAuthState, subscribeToCollection, subscribeToDocument, trackEvent, trackLogin, trackPageView, trackSignUp, trackUserAction, updateDocument, updateUserEmail, updateUserPassword, updateUserProfile, waitForAuthState };
@@ -138,6 +138,35 @@ function waitForAuthState() {
138
138
  });
139
139
  });
140
140
  }
141
+ async function deleteUser(user) {
142
+ return auth$1.deleteUser(user);
143
+ }
144
+ function getAuth2() {
145
+ return getFirebaseAuth();
146
+ }
147
+ async function reauthenticateWithPassword(user, password) {
148
+ if (!user.email) throw new Error("User email not found");
149
+ const credential = auth$1.EmailAuthProvider.credential(user.email, password);
150
+ return auth$1.reauthenticateWithCredential(user, credential);
151
+ }
152
+ async function reauthenticateWithGoogle(user) {
153
+ try {
154
+ const provider = new auth$1.GoogleAuthProvider();
155
+ return await auth$1.reauthenticateWithPopup(user, provider);
156
+ } catch (error) {
157
+ if (error.code === "auth/popup-closed-by-user" || error.code === "auth/cancelled-popup-request") {
158
+ return false;
159
+ }
160
+ throw error;
161
+ }
162
+ }
163
+ async function updateUserEmail(user, newEmail) {
164
+ const { updateEmail: firebaseUpdateEmail } = await import('firebase/auth');
165
+ return firebaseUpdateEmail(user, newEmail);
166
+ }
167
+ async function updateUserPassword(user, newPassword) {
168
+ return auth$1.updatePassword(user, newPassword);
169
+ }
141
170
  function getDocRef(collectionPath, documentId) {
142
171
  const db2 = getFirebaseFirestore();
143
172
  return firestore.doc(db2, collectionPath, documentId);
@@ -353,7 +382,9 @@ exports.auth = auth;
353
382
  exports.db = db;
354
383
  exports.deleteDocument = deleteDocument;
355
384
  exports.deleteFile = deleteFile;
385
+ exports.deleteUser = deleteUser;
356
386
  exports.generateFilePath = generateFilePath;
387
+ exports.getAuth = getAuth2;
357
388
  exports.getCollection = getCollection;
358
389
  exports.getCollectionRef = getCollectionRef;
359
390
  exports.getCurrentUser = getCurrentUser;
@@ -371,6 +402,8 @@ exports.getGoogleRedirectResult = getGoogleRedirectResult;
371
402
  exports.getStorageRef = getStorageRef;
372
403
  exports.initializeFirebase = initializeFirebase;
373
404
  exports.listFiles = listFiles;
405
+ exports.reauthenticateWithGoogle = reauthenticateWithGoogle;
406
+ exports.reauthenticateWithPassword = reauthenticateWithPassword;
374
407
  exports.resetPassword = resetPassword;
375
408
  exports.sendVerificationEmail = sendVerificationEmail;
376
409
  exports.setDocument = setDocument;
@@ -390,6 +423,8 @@ exports.trackSignUp = trackSignUp;
390
423
  exports.trackUserAction = trackUserAction;
391
424
  exports.updateDocument = updateDocument;
392
425
  exports.updateFileMetadata = updateFileMetadata;
426
+ exports.updateUserEmail = updateUserEmail;
427
+ exports.updateUserPassword = updateUserPassword;
393
428
  exports.updateUserProfile = updateUserProfile;
394
429
  exports.uploadFile = uploadFile;
395
430
  exports.uploadFileWithProgress = uploadFileWithProgress;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/firebase/config.ts","../../src/firebase/auth.ts","../../src/firebase/firestore.ts","../../src/firebase/storage.ts","../../src/firebase/analytics.ts"],"names":["getApps","getApp","initializeApp","getAuth","getFirestore","getStorage","auth","signInWithEmailAndPassword","createUserWithEmailAndPassword","updateProfile","firebaseSignOut","sendPasswordResetEmail","sendEmailVerification","GoogleAuthProvider","signInWithPopup","signInWithRedirect","getRedirectResult","onAuthStateChanged","db","doc","collection","getDoc","query","getDocs","addDoc","serverTimestamp","setDoc","updateDoc","deleteDoc","onSnapshot","storage","ref","uploadBytes","getDownloadURL","uploadBytesResumable","deleteObject","listAll","getMetadata","updateMetadata","isSupported","getAnalytics","analytics","logEvent"],"mappings":"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","file":"index.js","sourcesContent":["import { initializeApp, getApps, getApp, FirebaseApp } from 'firebase/app';\nimport { getAuth, Auth } from 'firebase/auth';\nimport { getFirestore, Firestore } from 'firebase/firestore';\nimport { getStorage, FirebaseStorage } from 'firebase/storage';\n\n/**\n * Firebase configuration interface\n * All values should be provided via environment variables\n */\nexport interface FirebaseConfig {\n apiKey: string;\n authDomain: string;\n projectId: string;\n storageBucket: string;\n messagingSenderId: string;\n appId: string;\n measurementId?: string;\n}\n\n/**\n * Get Firebase configuration from environment variables\n * Works with Next.js NEXT_PUBLIC_ prefix\n */\nexport function getFirebaseConfig(): FirebaseConfig {\n const config: FirebaseConfig = {\n apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY || '',\n authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || '',\n projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || '',\n storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET || '',\n messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID || '',\n appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID || '',\n measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID,\n };\n\n // Validate required fields\n const requiredFields: (keyof FirebaseConfig)[] = [\n 'apiKey',\n 'authDomain',\n 'projectId',\n 'storageBucket',\n 'messagingSenderId',\n 'appId',\n ];\n\n const missingFields = requiredFields.filter((field) => !config[field]);\n\n if (missingFields.length > 0) {\n console.warn(\n `[mw-core] Missing Firebase config fields: ${missingFields.join(', ')}. ` +\n `Make sure to set NEXT_PUBLIC_FIREBASE_* environment variables.`\n );\n }\n\n return config;\n}\n\n/**\n * Initialize Firebase app (singleton pattern)\n * Safe to call multiple times - returns existing instance if already initialized\n */\nexport function initializeFirebase(config?: FirebaseConfig): FirebaseApp {\n if (getApps().length > 0) {\n return getApp();\n }\n\n const firebaseConfig = config || getFirebaseConfig();\n return initializeApp(firebaseConfig);\n}\n\n// Lazy initialization singletons\nlet _app: FirebaseApp | null = null;\nlet _auth: Auth | null = null;\nlet _db: Firestore | null = null;\nlet _storage: FirebaseStorage | null = null;\n\n/**\n * Get the Firebase app instance\n */\nexport function getFirebaseApp(): FirebaseApp {\n if (!_app) {\n _app = initializeFirebase();\n }\n return _app;\n}\n\n/**\n * Get the Firebase Auth instance\n */\nexport function getFirebaseAuth(): Auth {\n if (!_auth) {\n _auth = getAuth(getFirebaseApp());\n }\n return _auth;\n}\n\n/**\n * Get the Firestore database instance\n * Supports named databases via NEXT_PUBLIC_FIRESTORE_DATABASE_ID env var\n */\nexport function getFirebaseFirestore(): Firestore {\n if (!_db) {\n const databaseId = process.env.NEXT_PUBLIC_FIRESTORE_DATABASE_ID;\n if (databaseId) {\n _db = getFirestore(getFirebaseApp(), databaseId);\n } else {\n _db = getFirestore(getFirebaseApp());\n }\n }\n return _db;\n}\n\n/**\n * Get the Firebase Storage instance\n */\nexport function getFirebaseStorage(): FirebaseStorage {\n if (!_storage) {\n _storage = getStorage(getFirebaseApp());\n }\n return _storage;\n}\n\n// Convenience exports for direct access\nexport const app = typeof window !== 'undefined' ? getFirebaseApp() : null;\nexport const auth = typeof window !== 'undefined' ? getFirebaseAuth() : null;\nexport const db = typeof window !== 'undefined' ? getFirebaseFirestore() : null;\nexport const storage = typeof window !== 'undefined' ? getFirebaseStorage() : null;\n\n","import {\n signInWithEmailAndPassword,\n createUserWithEmailAndPassword,\n signOut as firebaseSignOut,\n sendPasswordResetEmail,\n sendEmailVerification,\n updateProfile,\n updatePassword as firebaseUpdatePassword,\n GoogleAuthProvider,\n EmailAuthProvider,\n signInWithPopup,\n signInWithRedirect,\n getRedirectResult,\n onAuthStateChanged,\n reauthenticateWithCredential as firebaseReauthenticateWithCredential,\n reauthenticateWithPopup as firebaseReauthenticateWithPopup,\n verifyBeforeUpdateEmail as firebaseVerifyBeforeUpdateEmail,\n deleteUser as firebaseDeleteUser,\n getAdditionalUserInfo as firebaseGetAdditionalUserInfo,\n User,\n UserCredential,\n Auth,\n AuthCredential,\n} from 'firebase/auth';\nimport { getFirebaseAuth } from './config';\n\n/**\n * Sign in with email and password\n */\nexport async function signInWithEmail(\n email: string,\n password: string\n): Promise<UserCredential> {\n const auth = getFirebaseAuth();\n return signInWithEmailAndPassword(auth, email, password);\n}\n\n/**\n * Create a new account with email and password\n */\nexport async function signUpWithEmail(\n email: string,\n password: string,\n displayName?: string\n): Promise<UserCredential> {\n const auth = getFirebaseAuth();\n const credential = await createUserWithEmailAndPassword(auth, email, password);\n \n if (displayName && credential.user) {\n await updateProfile(credential.user, { displayName });\n }\n \n return credential;\n}\n\n/**\n * Sign out the current user\n */\nexport async function signOut(): Promise<void> {\n const auth = getFirebaseAuth();\n return firebaseSignOut(auth);\n}\n\n/**\n * Send a password reset email\n */\nexport async function resetPassword(email: string): Promise<void> {\n const auth = getFirebaseAuth();\n return sendPasswordResetEmail(auth, email);\n}\n\n/**\n * Send email verification to the current user\n */\nexport async function sendVerificationEmail(user: User): Promise<void> {\n return sendEmailVerification(user);\n}\n\n/**\n * Update the current user's profile\n */\nexport async function updateUserProfile(\n user: User,\n profile: { displayName?: string; photoURL?: string }\n): Promise<void> {\n return updateProfile(user, profile);\n}\n\n/**\n * Sign in with Google using popup\n */\nexport async function signInWithGoogle(): Promise<UserCredential> {\n const auth = getFirebaseAuth();\n const provider = new GoogleAuthProvider();\n provider.addScope('email');\n provider.addScope('profile');\n return signInWithPopup(auth, provider);\n}\n\n/**\n * Sign in with Google using redirect (better for mobile)\n */\nexport async function signInWithGoogleRedirect(): Promise<void> {\n const auth = getFirebaseAuth();\n const provider = new GoogleAuthProvider();\n provider.addScope('email');\n provider.addScope('profile');\n return signInWithRedirect(auth, provider);\n}\n\n/**\n * Get the result of a redirect sign-in\n */\nexport async function getGoogleRedirectResult(): Promise<UserCredential | null> {\n const auth = getFirebaseAuth();\n return getRedirectResult(auth);\n}\n\n/**\n * Subscribe to auth state changes\n */\nexport function subscribeToAuthState(\n callback: (user: User | null) => void\n): () => void {\n const auth = getFirebaseAuth();\n return onAuthStateChanged(auth, callback);\n}\n\n/**\n * Get the current user (may be null if not authenticated)\n */\nexport function getCurrentUser(): User | null {\n const auth = getFirebaseAuth();\n return auth.currentUser;\n}\n\n/**\n * Wait for the auth state to be determined\n * Useful for SSR/initial load\n */\nexport function waitForAuthState(): Promise<User | null> {\n return new Promise((resolve) => {\n const auth = getFirebaseAuth();\n const unsubscribe = onAuthStateChanged(auth, (user) => {\n unsubscribe();\n resolve(user);\n });\n });\n}\n\n/**\n * Update the current user's password\n * Requires recent authentication\n */\nexport async function updatePassword(\n user: User,\n newPassword: string\n): Promise<void> {\n return firebaseUpdatePassword(user, newPassword);\n}\n\n/**\n * Re-authenticate user with email/password credential\n * Required before sensitive operations like password change, email change, account deletion\n */\nexport async function reauthenticateWithCredential(\n user: User,\n credential: AuthCredential\n): Promise<UserCredential> {\n return firebaseReauthenticateWithCredential(user, credential);\n}\n\n/**\n * Re-authenticate user with Google popup\n * Required before sensitive operations for Google-authenticated users\n */\nexport async function reauthenticateWithPopup(\n user: User\n): Promise<UserCredential> {\n const provider = new GoogleAuthProvider();\n return firebaseReauthenticateWithPopup(user, provider);\n}\n\n/**\n * Send verification email to new email address before updating\n * User must verify new email before it becomes active\n */\nexport async function verifyBeforeUpdateEmail(\n user: User,\n newEmail: string\n): Promise<void> {\n return firebaseVerifyBeforeUpdateEmail(user, newEmail);\n}\n\n/**\n * Delete the authenticated user\n * Requires recent authentication\n */\nexport async function deleteUser(user: User): Promise<void> {\n return firebaseDeleteUser(user);\n}\n\n/**\n * Get additional user info from credential (e.g., isNewUser)\n */\nexport function getAdditionalUserInfo(credential: UserCredential) {\n return firebaseGetAdditionalUserInfo(credential);\n}\n\n/**\n * Create email/password credential for re-authentication\n */\nexport function createEmailCredential(email: string, password: string): AuthCredential {\n return EmailAuthProvider.credential(email, password);\n}\n\n/**\n * Get the Firebase Auth instance\n */\nexport function getAuth(): Auth {\n return getFirebaseAuth();\n}\n\n/**\n * Convenience: Reauthenticate with password\n * @returns Promise<UserCredential>\n */\nexport async function reauthenticateWithPassword(\n user: User,\n password: string\n): Promise<UserCredential> {\n if (!user.email) throw new Error('User email not found');\n const credential = EmailAuthProvider.credential(user.email, password);\n return firebaseReauthenticateWithCredential(user, credential);\n}\n\n/**\n * Convenience: Reauthenticate with Google\n * @returns Promise<UserCredential> or false if user cancelled\n */\nexport async function reauthenticateWithGoogle(\n user: User\n): Promise<UserCredential | false> {\n try {\n const provider = new GoogleAuthProvider();\n return await firebaseReauthenticateWithPopup(user, provider);\n } catch (error: any) {\n if (error.code === 'auth/popup-closed-by-user' || error.code === 'auth/cancelled-popup-request') {\n return false; // User cancelled\n }\n throw error;\n }\n}\n\n/**\n * Update user email (requires recent authentication)\n */\nexport async function updateUserEmail(user: User, newEmail: string): Promise<void> {\n const { updateEmail: firebaseUpdateEmail } = await import('firebase/auth');\n return firebaseUpdateEmail(user, newEmail);\n}\n\n/**\n * Update user password (requires recent authentication)\n */\nexport async function updateUserPassword(user: User, newPassword: string): Promise<void> {\n return firebaseUpdatePassword(user, newPassword);\n}\n\n// Re-export useful types\nexport type { User, UserCredential, Auth, AuthCredential };\n\n// Re-export providers for direct use\nexport { GoogleAuthProvider, EmailAuthProvider };\n\n","import {\n collection,\n doc,\n getDoc,\n getDocs,\n setDoc,\n updateDoc,\n deleteDoc,\n addDoc,\n query,\n where,\n orderBy,\n limit,\n startAfter,\n onSnapshot,\n DocumentData,\n DocumentReference,\n CollectionReference,\n QueryConstraint,\n DocumentSnapshot,\n QuerySnapshot,\n Timestamp,\n serverTimestamp,\n FieldValue,\n WhereFilterOp,\n OrderByDirection,\n Unsubscribe,\n} from 'firebase/firestore';\nimport { getFirebaseFirestore } from './config';\n\n/**\n * Get a document reference\n */\nexport function getDocRef<T = DocumentData>(\n collectionPath: string,\n documentId: string\n): DocumentReference<T> {\n const db = getFirebaseFirestore();\n return doc(db, collectionPath, documentId) as DocumentReference<T>;\n}\n\n/**\n * Get a collection reference\n */\nexport function getCollectionRef<T = DocumentData>(\n collectionPath: string\n): CollectionReference<T> {\n const db = getFirebaseFirestore();\n return collection(db, collectionPath) as CollectionReference<T>;\n}\n\n/**\n * Get a single document by ID\n */\nexport async function getDocument<T = DocumentData>(\n collectionPath: string,\n documentId: string\n): Promise<T | null> {\n const docRef = getDocRef<T>(collectionPath, documentId);\n const docSnap = await getDoc(docRef);\n \n if (docSnap.exists()) {\n return { id: docSnap.id, ...docSnap.data() } as T;\n }\n \n return null;\n}\n\n/**\n * Get all documents in a collection\n */\nexport async function getCollection<T = DocumentData>(\n collectionPath: string,\n constraints: QueryConstraint[] = []\n): Promise<T[]> {\n const collectionRef = getCollectionRef<T>(collectionPath);\n const q = query(collectionRef, ...constraints);\n const querySnapshot = await getDocs(q);\n \n return querySnapshot.docs.map((doc) => ({\n id: doc.id,\n ...doc.data(),\n })) as T[];\n}\n\n/**\n * Add a new document with auto-generated ID\n */\nexport async function addDocument<T = DocumentData>(\n collectionPath: string,\n data: Omit<T, 'id'>\n): Promise<string> {\n const collectionRef = getCollectionRef(collectionPath);\n const docRef = await addDoc(collectionRef, {\n ...data,\n createdAt: serverTimestamp(),\n updatedAt: serverTimestamp(),\n });\n return docRef.id;\n}\n\n/**\n * Set/create a document with a specific ID\n */\nexport async function setDocument<T = DocumentData>(\n collectionPath: string,\n documentId: string,\n data: Omit<T, 'id'>,\n merge: boolean = false\n): Promise<void> {\n const docRef = getDocRef(collectionPath, documentId);\n await setDoc(\n docRef,\n {\n ...data,\n updatedAt: serverTimestamp(),\n ...(merge ? {} : { createdAt: serverTimestamp() }),\n },\n { merge }\n );\n}\n\n/**\n * Update specific fields in a document\n */\nexport async function updateDocument<T = DocumentData>(\n collectionPath: string,\n documentId: string,\n data: Partial<T>\n): Promise<void> {\n const docRef = getDocRef(collectionPath, documentId);\n await updateDoc(docRef, {\n ...data,\n updatedAt: serverTimestamp(),\n });\n}\n\n/**\n * Delete a document\n */\nexport async function deleteDocument(\n collectionPath: string,\n documentId: string\n): Promise<void> {\n const docRef = getDocRef(collectionPath, documentId);\n await deleteDoc(docRef);\n}\n\n/**\n * Subscribe to a single document\n */\nexport function subscribeToDocument<T = DocumentData>(\n collectionPath: string,\n documentId: string,\n callback: (data: T | null) => void\n): Unsubscribe {\n const docRef = getDocRef<T>(collectionPath, documentId);\n \n return onSnapshot(docRef, (docSnap) => {\n if (docSnap.exists()) {\n callback({ id: docSnap.id, ...docSnap.data() } as T);\n } else {\n callback(null);\n }\n });\n}\n\n/**\n * Subscribe to a collection\n */\nexport function subscribeToCollection<T = DocumentData>(\n collectionPath: string,\n callback: (data: T[]) => void,\n constraints: QueryConstraint[] = []\n): Unsubscribe {\n const collectionRef = getCollectionRef<T>(collectionPath);\n const q = query(collectionRef, ...constraints);\n \n return onSnapshot(q, (querySnapshot) => {\n const data = querySnapshot.docs.map((doc) => ({\n id: doc.id,\n ...doc.data(),\n })) as T[];\n callback(data);\n });\n}\n\n// Export query helpers for convenience\nexport {\n query,\n where,\n orderBy,\n limit,\n startAfter,\n Timestamp,\n serverTimestamp,\n};\n\n// Export raw Firebase functions for direct usage in AuthProvider\nexport {\n doc,\n setDoc,\n getDoc,\n onSnapshot,\n};\n\n// Re-export types\nexport type {\n DocumentData,\n DocumentReference,\n CollectionReference,\n QueryConstraint,\n DocumentSnapshot,\n QuerySnapshot,\n FieldValue,\n WhereFilterOp,\n OrderByDirection,\n Unsubscribe,\n};\n\n","import {\n ref,\n uploadBytes,\n uploadBytesResumable,\n getDownloadURL,\n deleteObject,\n listAll,\n getMetadata,\n updateMetadata,\n StorageReference,\n UploadTask,\n UploadMetadata,\n FullMetadata,\n ListResult,\n} from 'firebase/storage';\nimport { getFirebaseStorage } from './config';\n\n/**\n * Get a reference to a storage location\n */\nexport function getStorageRef(path: string): StorageReference {\n const storage = getFirebaseStorage();\n return ref(storage, path);\n}\n\n/**\n * Upload a file to storage\n */\nexport async function uploadFile(\n path: string,\n file: Blob | Uint8Array | ArrayBuffer,\n metadata?: UploadMetadata\n): Promise<string> {\n const storageRef = getStorageRef(path);\n await uploadBytes(storageRef, file, metadata);\n return getDownloadURL(storageRef);\n}\n\n/**\n * Upload a file with progress tracking\n */\nexport function uploadFileWithProgress(\n path: string,\n file: Blob | Uint8Array | ArrayBuffer,\n onProgress?: (progress: number) => void,\n metadata?: UploadMetadata\n): { task: UploadTask; promise: Promise<string> } {\n const storageRef = getStorageRef(path);\n const task = uploadBytesResumable(storageRef, file, metadata);\n \n if (onProgress) {\n task.on('state_changed', (snapshot) => {\n const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;\n onProgress(progress);\n });\n }\n \n const promise = new Promise<string>((resolve, reject) => {\n task.on(\n 'state_changed',\n null,\n (error) => reject(error),\n async () => {\n const url = await getDownloadURL(task.snapshot.ref);\n resolve(url);\n }\n );\n });\n \n return { task, promise };\n}\n\n/**\n * Get the download URL for a file\n */\nexport async function getFileURL(path: string): Promise<string> {\n const storageRef = getStorageRef(path);\n return getDownloadURL(storageRef);\n}\n\n/**\n * Delete a file from storage\n */\nexport async function deleteFile(path: string): Promise<void> {\n const storageRef = getStorageRef(path);\n return deleteObject(storageRef);\n}\n\n/**\n * List all files in a directory\n */\nexport async function listFiles(path: string): Promise<ListResult> {\n const storageRef = getStorageRef(path);\n return listAll(storageRef);\n}\n\n/**\n * Get metadata for a file\n */\nexport async function getFileMetadata(path: string): Promise<FullMetadata> {\n const storageRef = getStorageRef(path);\n return getMetadata(storageRef);\n}\n\n/**\n * Update metadata for a file\n */\nexport async function updateFileMetadata(\n path: string,\n metadata: Partial<UploadMetadata>\n): Promise<FullMetadata> {\n const storageRef = getStorageRef(path);\n return updateMetadata(storageRef, metadata);\n}\n\n/**\n * Generate a unique file path with timestamp\n */\nexport function generateFilePath(\n folder: string,\n filename: string,\n userId?: string\n): string {\n const timestamp = Date.now();\n const extension = filename.split('.').pop() || '';\n const baseName = filename.replace(/\\.[^/.]+$/, '');\n const sanitizedName = baseName.replace(/[^a-zA-Z0-9]/g, '_');\n \n if (userId) {\n return `${folder}/${userId}/${timestamp}_${sanitizedName}.${extension}`;\n }\n \n return `${folder}/${timestamp}_${sanitizedName}.${extension}`;\n}\n\n// Re-export types\nexport type {\n StorageReference,\n UploadTask,\n UploadMetadata,\n FullMetadata,\n ListResult,\n};\n\n","import { getAnalytics, logEvent, Analytics, isSupported } from 'firebase/analytics';\nimport { getFirebaseApp } from './config';\n\nlet _analytics: Analytics | null = null;\n\n/**\n * Get the Firebase Analytics instance\n * Only works in browser environment\n */\nexport async function getFirebaseAnalytics(): Promise<Analytics | null> {\n if (typeof window === 'undefined') {\n return null;\n }\n\n if (_analytics) {\n return _analytics;\n }\n\n const supported = await isSupported();\n if (!supported) {\n console.warn('[mw-core] Firebase Analytics is not supported in this environment');\n return null;\n }\n\n _analytics = getAnalytics(getFirebaseApp());\n return _analytics;\n}\n\n/**\n * Log a custom event to Firebase Analytics\n */\nexport async function trackEvent(\n eventName: string,\n eventParams?: Record<string, unknown>\n): Promise<void> {\n const analytics = await getFirebaseAnalytics();\n if (analytics) {\n logEvent(analytics, eventName, eventParams);\n }\n}\n\n/**\n * Track a page view\n */\nexport async function trackPageView(\n pagePath: string,\n pageTitle?: string\n): Promise<void> {\n await trackEvent('page_view', {\n page_path: pagePath,\n page_title: pageTitle,\n });\n}\n\n/**\n * Track a user action\n */\nexport async function trackUserAction(\n action: string,\n category: string,\n label?: string,\n value?: number\n): Promise<void> {\n await trackEvent(action, {\n event_category: category,\n event_label: label,\n value,\n });\n}\n\n/**\n * Track sign up event\n */\nexport async function trackSignUp(method: string): Promise<void> {\n await trackEvent('sign_up', { method });\n}\n\n/**\n * Track login event\n */\nexport async function trackLogin(method: string): Promise<void> {\n await trackEvent('login', { method });\n}\n\n// Re-export types\nexport type { Analytics };\n\n"]}
1
+ {"version":3,"sources":["../../src/firebase/config.ts","../../src/firebase/auth.ts","../../src/firebase/firestore.ts","../../src/firebase/storage.ts","../../src/firebase/analytics.ts"],"names":["getApps","getApp","initializeApp","getAuth","getFirestore","getStorage","auth","signInWithEmailAndPassword","createUserWithEmailAndPassword","updateProfile","firebaseSignOut","sendPasswordResetEmail","sendEmailVerification","GoogleAuthProvider","signInWithPopup","signInWithRedirect","getRedirectResult","onAuthStateChanged","firebaseDeleteUser","EmailAuthProvider","firebaseReauthenticateWithCredential","firebaseReauthenticateWithPopup","firebaseUpdatePassword","db","doc","collection","getDoc","query","getDocs","addDoc","serverTimestamp","setDoc","updateDoc","deleteDoc","onSnapshot","storage","ref","uploadBytes","getDownloadURL","uploadBytesResumable","deleteObject","listAll","getMetadata","updateMetadata","isSupported","getAnalytics","analytics","logEvent"],"mappings":"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","file":"index.js","sourcesContent":["import { initializeApp, getApps, getApp, FirebaseApp } from 'firebase/app';\nimport { getAuth, Auth } from 'firebase/auth';\nimport { getFirestore, Firestore } from 'firebase/firestore';\nimport { getStorage, FirebaseStorage } from 'firebase/storage';\n\n/**\n * Firebase configuration interface\n * All values should be provided via environment variables\n */\nexport interface FirebaseConfig {\n apiKey: string;\n authDomain: string;\n projectId: string;\n storageBucket: string;\n messagingSenderId: string;\n appId: string;\n measurementId?: string;\n}\n\n/**\n * Get Firebase configuration from environment variables\n * Works with Next.js NEXT_PUBLIC_ prefix\n */\nexport function getFirebaseConfig(): FirebaseConfig {\n const config: FirebaseConfig = {\n apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY || '',\n authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || '',\n projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || '',\n storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET || '',\n messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID || '',\n appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID || '',\n measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID,\n };\n\n // Validate required fields\n const requiredFields: (keyof FirebaseConfig)[] = [\n 'apiKey',\n 'authDomain',\n 'projectId',\n 'storageBucket',\n 'messagingSenderId',\n 'appId',\n ];\n\n const missingFields = requiredFields.filter((field) => !config[field]);\n\n if (missingFields.length > 0) {\n console.warn(\n `[mw-core] Missing Firebase config fields: ${missingFields.join(', ')}. ` +\n `Make sure to set NEXT_PUBLIC_FIREBASE_* environment variables.`\n );\n }\n\n return config;\n}\n\n/**\n * Initialize Firebase app (singleton pattern)\n * Safe to call multiple times - returns existing instance if already initialized\n */\nexport function initializeFirebase(config?: FirebaseConfig): FirebaseApp {\n if (getApps().length > 0) {\n return getApp();\n }\n\n const firebaseConfig = config || getFirebaseConfig();\n return initializeApp(firebaseConfig);\n}\n\n// Lazy initialization singletons\nlet _app: FirebaseApp | null = null;\nlet _auth: Auth | null = null;\nlet _db: Firestore | null = null;\nlet _storage: FirebaseStorage | null = null;\n\n/**\n * Get the Firebase app instance\n */\nexport function getFirebaseApp(): FirebaseApp {\n if (!_app) {\n _app = initializeFirebase();\n }\n return _app;\n}\n\n/**\n * Get the Firebase Auth instance\n */\nexport function getFirebaseAuth(): Auth {\n if (!_auth) {\n _auth = getAuth(getFirebaseApp());\n }\n return _auth;\n}\n\n/**\n * Get the Firestore database instance\n * Supports named databases via NEXT_PUBLIC_FIRESTORE_DATABASE_ID env var\n */\nexport function getFirebaseFirestore(): Firestore {\n if (!_db) {\n const databaseId = process.env.NEXT_PUBLIC_FIRESTORE_DATABASE_ID;\n if (databaseId) {\n _db = getFirestore(getFirebaseApp(), databaseId);\n } else {\n _db = getFirestore(getFirebaseApp());\n }\n }\n return _db;\n}\n\n/**\n * Get the Firebase Storage instance\n */\nexport function getFirebaseStorage(): FirebaseStorage {\n if (!_storage) {\n _storage = getStorage(getFirebaseApp());\n }\n return _storage;\n}\n\n// Convenience exports for direct access\nexport const app = typeof window !== 'undefined' ? getFirebaseApp() : null;\nexport const auth = typeof window !== 'undefined' ? getFirebaseAuth() : null;\nexport const db = typeof window !== 'undefined' ? getFirebaseFirestore() : null;\nexport const storage = typeof window !== 'undefined' ? getFirebaseStorage() : null;\n\n","import {\n signInWithEmailAndPassword,\n createUserWithEmailAndPassword,\n signOut as firebaseSignOut,\n sendPasswordResetEmail,\n sendEmailVerification,\n updateProfile,\n updatePassword as firebaseUpdatePassword,\n GoogleAuthProvider,\n EmailAuthProvider,\n signInWithPopup,\n signInWithRedirect,\n getRedirectResult,\n onAuthStateChanged,\n reauthenticateWithCredential as firebaseReauthenticateWithCredential,\n reauthenticateWithPopup as firebaseReauthenticateWithPopup,\n verifyBeforeUpdateEmail as firebaseVerifyBeforeUpdateEmail,\n deleteUser as firebaseDeleteUser,\n getAdditionalUserInfo as firebaseGetAdditionalUserInfo,\n User,\n UserCredential,\n Auth,\n AuthCredential,\n} from 'firebase/auth';\nimport { getFirebaseAuth } from './config';\n\n/**\n * Sign in with email and password\n */\nexport async function signInWithEmail(\n email: string,\n password: string\n): Promise<UserCredential> {\n const auth = getFirebaseAuth();\n return signInWithEmailAndPassword(auth, email, password);\n}\n\n/**\n * Create a new account with email and password\n */\nexport async function signUpWithEmail(\n email: string,\n password: string,\n displayName?: string\n): Promise<UserCredential> {\n const auth = getFirebaseAuth();\n const credential = await createUserWithEmailAndPassword(auth, email, password);\n \n if (displayName && credential.user) {\n await updateProfile(credential.user, { displayName });\n }\n \n return credential;\n}\n\n/**\n * Sign out the current user\n */\nexport async function signOut(): Promise<void> {\n const auth = getFirebaseAuth();\n return firebaseSignOut(auth);\n}\n\n/**\n * Send a password reset email\n */\nexport async function resetPassword(email: string): Promise<void> {\n const auth = getFirebaseAuth();\n return sendPasswordResetEmail(auth, email);\n}\n\n/**\n * Send email verification to the current user\n */\nexport async function sendVerificationEmail(user: User): Promise<void> {\n return sendEmailVerification(user);\n}\n\n/**\n * Update the current user's profile\n */\nexport async function updateUserProfile(\n user: User,\n profile: { displayName?: string; photoURL?: string }\n): Promise<void> {\n return updateProfile(user, profile);\n}\n\n/**\n * Sign in with Google using popup\n */\nexport async function signInWithGoogle(): Promise<UserCredential> {\n const auth = getFirebaseAuth();\n const provider = new GoogleAuthProvider();\n provider.addScope('email');\n provider.addScope('profile');\n return signInWithPopup(auth, provider);\n}\n\n/**\n * Sign in with Google using redirect (better for mobile)\n */\nexport async function signInWithGoogleRedirect(): Promise<void> {\n const auth = getFirebaseAuth();\n const provider = new GoogleAuthProvider();\n provider.addScope('email');\n provider.addScope('profile');\n return signInWithRedirect(auth, provider);\n}\n\n/**\n * Get the result of a redirect sign-in\n */\nexport async function getGoogleRedirectResult(): Promise<UserCredential | null> {\n const auth = getFirebaseAuth();\n return getRedirectResult(auth);\n}\n\n/**\n * Subscribe to auth state changes\n */\nexport function subscribeToAuthState(\n callback: (user: User | null) => void\n): () => void {\n const auth = getFirebaseAuth();\n return onAuthStateChanged(auth, callback);\n}\n\n/**\n * Get the current user (may be null if not authenticated)\n */\nexport function getCurrentUser(): User | null {\n const auth = getFirebaseAuth();\n return auth.currentUser;\n}\n\n/**\n * Wait for the auth state to be determined\n * Useful for SSR/initial load\n */\nexport function waitForAuthState(): Promise<User | null> {\n return new Promise((resolve) => {\n const auth = getFirebaseAuth();\n const unsubscribe = onAuthStateChanged(auth, (user) => {\n unsubscribe();\n resolve(user);\n });\n });\n}\n\n/**\n * Update the current user's password\n * Requires recent authentication\n */\nexport async function updatePassword(\n user: User,\n newPassword: string\n): Promise<void> {\n return firebaseUpdatePassword(user, newPassword);\n}\n\n/**\n * Re-authenticate user with email/password credential\n * Required before sensitive operations like password change, email change, account deletion\n */\nexport async function reauthenticateWithCredential(\n user: User,\n credential: AuthCredential\n): Promise<UserCredential> {\n return firebaseReauthenticateWithCredential(user, credential);\n}\n\n/**\n * Re-authenticate user with Google popup\n * Required before sensitive operations for Google-authenticated users\n */\nexport async function reauthenticateWithPopup(\n user: User\n): Promise<UserCredential> {\n const provider = new GoogleAuthProvider();\n return firebaseReauthenticateWithPopup(user, provider);\n}\n\n/**\n * Send verification email to new email address before updating\n * User must verify new email before it becomes active\n */\nexport async function verifyBeforeUpdateEmail(\n user: User,\n newEmail: string\n): Promise<void> {\n return firebaseVerifyBeforeUpdateEmail(user, newEmail);\n}\n\n/**\n * Delete the authenticated user\n * Requires recent authentication\n */\nexport async function deleteUser(user: User): Promise<void> {\n return firebaseDeleteUser(user);\n}\n\n/**\n * Get additional user info from credential (e.g., isNewUser)\n */\nexport function getAdditionalUserInfo(credential: UserCredential) {\n return firebaseGetAdditionalUserInfo(credential);\n}\n\n/**\n * Create email/password credential for re-authentication\n */\nexport function createEmailCredential(email: string, password: string): AuthCredential {\n return EmailAuthProvider.credential(email, password);\n}\n\n/**\n * Get the Firebase Auth instance\n */\nexport function getAuth(): Auth {\n return getFirebaseAuth();\n}\n\n/**\n * Convenience: Reauthenticate with password\n * @returns Promise<UserCredential>\n */\nexport async function reauthenticateWithPassword(\n user: User,\n password: string\n): Promise<UserCredential> {\n if (!user.email) throw new Error('User email not found');\n const credential = EmailAuthProvider.credential(user.email, password);\n return firebaseReauthenticateWithCredential(user, credential);\n}\n\n/**\n * Convenience: Reauthenticate with Google\n * @returns Promise<UserCredential> or false if user cancelled\n */\nexport async function reauthenticateWithGoogle(\n user: User\n): Promise<UserCredential | false> {\n try {\n const provider = new GoogleAuthProvider();\n return await firebaseReauthenticateWithPopup(user, provider);\n } catch (error: any) {\n if (error.code === 'auth/popup-closed-by-user' || error.code === 'auth/cancelled-popup-request') {\n return false; // User cancelled\n }\n throw error;\n }\n}\n\n/**\n * Update user email (requires recent authentication)\n */\nexport async function updateUserEmail(user: User, newEmail: string): Promise<void> {\n const { updateEmail: firebaseUpdateEmail } = await import('firebase/auth');\n return firebaseUpdateEmail(user, newEmail);\n}\n\n/**\n * Update user password (requires recent authentication)\n */\nexport async function updateUserPassword(user: User, newPassword: string): Promise<void> {\n return firebaseUpdatePassword(user, newPassword);\n}\n\n// Re-export useful types\nexport type { User, UserCredential, Auth, AuthCredential };\n\n// Re-export providers for direct use\nexport { GoogleAuthProvider, EmailAuthProvider };\n\n","import {\n collection,\n doc,\n getDoc,\n getDocs,\n setDoc,\n updateDoc,\n deleteDoc,\n addDoc,\n query,\n where,\n orderBy,\n limit,\n startAfter,\n onSnapshot,\n DocumentData,\n DocumentReference,\n CollectionReference,\n QueryConstraint,\n DocumentSnapshot,\n QuerySnapshot,\n Timestamp,\n serverTimestamp,\n FieldValue,\n WhereFilterOp,\n OrderByDirection,\n Unsubscribe,\n} from 'firebase/firestore';\nimport { getFirebaseFirestore } from './config';\n\n/**\n * Get a document reference\n */\nexport function getDocRef<T = DocumentData>(\n collectionPath: string,\n documentId: string\n): DocumentReference<T> {\n const db = getFirebaseFirestore();\n return doc(db, collectionPath, documentId) as DocumentReference<T>;\n}\n\n/**\n * Get a collection reference\n */\nexport function getCollectionRef<T = DocumentData>(\n collectionPath: string\n): CollectionReference<T> {\n const db = getFirebaseFirestore();\n return collection(db, collectionPath) as CollectionReference<T>;\n}\n\n/**\n * Get a single document by ID\n */\nexport async function getDocument<T = DocumentData>(\n collectionPath: string,\n documentId: string\n): Promise<T | null> {\n const docRef = getDocRef<T>(collectionPath, documentId);\n const docSnap = await getDoc(docRef);\n \n if (docSnap.exists()) {\n return { id: docSnap.id, ...docSnap.data() } as T;\n }\n \n return null;\n}\n\n/**\n * Get all documents in a collection\n */\nexport async function getCollection<T = DocumentData>(\n collectionPath: string,\n constraints: QueryConstraint[] = []\n): Promise<T[]> {\n const collectionRef = getCollectionRef<T>(collectionPath);\n const q = query(collectionRef, ...constraints);\n const querySnapshot = await getDocs(q);\n \n return querySnapshot.docs.map((doc) => ({\n id: doc.id,\n ...doc.data(),\n })) as T[];\n}\n\n/**\n * Add a new document with auto-generated ID\n */\nexport async function addDocument<T = DocumentData>(\n collectionPath: string,\n data: Omit<T, 'id'>\n): Promise<string> {\n const collectionRef = getCollectionRef(collectionPath);\n const docRef = await addDoc(collectionRef, {\n ...data,\n createdAt: serverTimestamp(),\n updatedAt: serverTimestamp(),\n });\n return docRef.id;\n}\n\n/**\n * Set/create a document with a specific ID\n */\nexport async function setDocument<T = DocumentData>(\n collectionPath: string,\n documentId: string,\n data: Omit<T, 'id'>,\n merge: boolean = false\n): Promise<void> {\n const docRef = getDocRef(collectionPath, documentId);\n await setDoc(\n docRef,\n {\n ...data,\n updatedAt: serverTimestamp(),\n ...(merge ? {} : { createdAt: serverTimestamp() }),\n },\n { merge }\n );\n}\n\n/**\n * Update specific fields in a document\n */\nexport async function updateDocument<T = DocumentData>(\n collectionPath: string,\n documentId: string,\n data: Partial<T>\n): Promise<void> {\n const docRef = getDocRef(collectionPath, documentId);\n await updateDoc(docRef, {\n ...data,\n updatedAt: serverTimestamp(),\n });\n}\n\n/**\n * Delete a document\n */\nexport async function deleteDocument(\n collectionPath: string,\n documentId: string\n): Promise<void> {\n const docRef = getDocRef(collectionPath, documentId);\n await deleteDoc(docRef);\n}\n\n/**\n * Subscribe to a single document\n */\nexport function subscribeToDocument<T = DocumentData>(\n collectionPath: string,\n documentId: string,\n callback: (data: T | null) => void\n): Unsubscribe {\n const docRef = getDocRef<T>(collectionPath, documentId);\n \n return onSnapshot(docRef, (docSnap) => {\n if (docSnap.exists()) {\n callback({ id: docSnap.id, ...docSnap.data() } as T);\n } else {\n callback(null);\n }\n });\n}\n\n/**\n * Subscribe to a collection\n */\nexport function subscribeToCollection<T = DocumentData>(\n collectionPath: string,\n callback: (data: T[]) => void,\n constraints: QueryConstraint[] = []\n): Unsubscribe {\n const collectionRef = getCollectionRef<T>(collectionPath);\n const q = query(collectionRef, ...constraints);\n \n return onSnapshot(q, (querySnapshot) => {\n const data = querySnapshot.docs.map((doc) => ({\n id: doc.id,\n ...doc.data(),\n })) as T[];\n callback(data);\n });\n}\n\n// Export query helpers for convenience\nexport {\n query,\n where,\n orderBy,\n limit,\n startAfter,\n Timestamp,\n serverTimestamp,\n};\n\n// Export raw Firebase functions for direct usage in AuthProvider\nexport {\n doc,\n setDoc,\n getDoc,\n onSnapshot,\n};\n\n// Re-export types\nexport type {\n DocumentData,\n DocumentReference,\n CollectionReference,\n QueryConstraint,\n DocumentSnapshot,\n QuerySnapshot,\n FieldValue,\n WhereFilterOp,\n OrderByDirection,\n Unsubscribe,\n};\n\n","import {\n ref,\n uploadBytes,\n uploadBytesResumable,\n getDownloadURL,\n deleteObject,\n listAll,\n getMetadata,\n updateMetadata,\n StorageReference,\n UploadTask,\n UploadMetadata,\n FullMetadata,\n ListResult,\n} from 'firebase/storage';\nimport { getFirebaseStorage } from './config';\n\n/**\n * Get a reference to a storage location\n */\nexport function getStorageRef(path: string): StorageReference {\n const storage = getFirebaseStorage();\n return ref(storage, path);\n}\n\n/**\n * Upload a file to storage\n */\nexport async function uploadFile(\n path: string,\n file: Blob | Uint8Array | ArrayBuffer,\n metadata?: UploadMetadata\n): Promise<string> {\n const storageRef = getStorageRef(path);\n await uploadBytes(storageRef, file, metadata);\n return getDownloadURL(storageRef);\n}\n\n/**\n * Upload a file with progress tracking\n */\nexport function uploadFileWithProgress(\n path: string,\n file: Blob | Uint8Array | ArrayBuffer,\n onProgress?: (progress: number) => void,\n metadata?: UploadMetadata\n): { task: UploadTask; promise: Promise<string> } {\n const storageRef = getStorageRef(path);\n const task = uploadBytesResumable(storageRef, file, metadata);\n \n if (onProgress) {\n task.on('state_changed', (snapshot) => {\n const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;\n onProgress(progress);\n });\n }\n \n const promise = new Promise<string>((resolve, reject) => {\n task.on(\n 'state_changed',\n null,\n (error) => reject(error),\n async () => {\n const url = await getDownloadURL(task.snapshot.ref);\n resolve(url);\n }\n );\n });\n \n return { task, promise };\n}\n\n/**\n * Get the download URL for a file\n */\nexport async function getFileURL(path: string): Promise<string> {\n const storageRef = getStorageRef(path);\n return getDownloadURL(storageRef);\n}\n\n/**\n * Delete a file from storage\n */\nexport async function deleteFile(path: string): Promise<void> {\n const storageRef = getStorageRef(path);\n return deleteObject(storageRef);\n}\n\n/**\n * List all files in a directory\n */\nexport async function listFiles(path: string): Promise<ListResult> {\n const storageRef = getStorageRef(path);\n return listAll(storageRef);\n}\n\n/**\n * Get metadata for a file\n */\nexport async function getFileMetadata(path: string): Promise<FullMetadata> {\n const storageRef = getStorageRef(path);\n return getMetadata(storageRef);\n}\n\n/**\n * Update metadata for a file\n */\nexport async function updateFileMetadata(\n path: string,\n metadata: Partial<UploadMetadata>\n): Promise<FullMetadata> {\n const storageRef = getStorageRef(path);\n return updateMetadata(storageRef, metadata);\n}\n\n/**\n * Generate a unique file path with timestamp\n */\nexport function generateFilePath(\n folder: string,\n filename: string,\n userId?: string\n): string {\n const timestamp = Date.now();\n const extension = filename.split('.').pop() || '';\n const baseName = filename.replace(/\\.[^/.]+$/, '');\n const sanitizedName = baseName.replace(/[^a-zA-Z0-9]/g, '_');\n \n if (userId) {\n return `${folder}/${userId}/${timestamp}_${sanitizedName}.${extension}`;\n }\n \n return `${folder}/${timestamp}_${sanitizedName}.${extension}`;\n}\n\n// Re-export types\nexport type {\n StorageReference,\n UploadTask,\n UploadMetadata,\n FullMetadata,\n ListResult,\n};\n\n","import { getAnalytics, logEvent, Analytics, isSupported } from 'firebase/analytics';\nimport { getFirebaseApp } from './config';\n\nlet _analytics: Analytics | null = null;\n\n/**\n * Get the Firebase Analytics instance\n * Only works in browser environment\n */\nexport async function getFirebaseAnalytics(): Promise<Analytics | null> {\n if (typeof window === 'undefined') {\n return null;\n }\n\n if (_analytics) {\n return _analytics;\n }\n\n const supported = await isSupported();\n if (!supported) {\n console.warn('[mw-core] Firebase Analytics is not supported in this environment');\n return null;\n }\n\n _analytics = getAnalytics(getFirebaseApp());\n return _analytics;\n}\n\n/**\n * Log a custom event to Firebase Analytics\n */\nexport async function trackEvent(\n eventName: string,\n eventParams?: Record<string, unknown>\n): Promise<void> {\n const analytics = await getFirebaseAnalytics();\n if (analytics) {\n logEvent(analytics, eventName, eventParams);\n }\n}\n\n/**\n * Track a page view\n */\nexport async function trackPageView(\n pagePath: string,\n pageTitle?: string\n): Promise<void> {\n await trackEvent('page_view', {\n page_path: pagePath,\n page_title: pageTitle,\n });\n}\n\n/**\n * Track a user action\n */\nexport async function trackUserAction(\n action: string,\n category: string,\n label?: string,\n value?: number\n): Promise<void> {\n await trackEvent(action, {\n event_category: category,\n event_label: label,\n value,\n });\n}\n\n/**\n * Track sign up event\n */\nexport async function trackSignUp(method: string): Promise<void> {\n await trackEvent('sign_up', { method });\n}\n\n/**\n * Track login event\n */\nexport async function trackLogin(method: string): Promise<void> {\n await trackEvent('login', { method });\n}\n\n// Re-export types\nexport type { Analytics };\n\n"]}
@@ -1,5 +1,5 @@
1
1
  import { getApps, getApp, initializeApp } from 'firebase/app';
2
- import { getAuth, signInWithEmailAndPassword, createUserWithEmailAndPassword, updateProfile, signOut as signOut$1, sendPasswordResetEmail, sendEmailVerification, GoogleAuthProvider, signInWithPopup, signInWithRedirect, getRedirectResult, onAuthStateChanged } from 'firebase/auth';
2
+ import { getAuth, signInWithEmailAndPassword, createUserWithEmailAndPassword, updateProfile, signOut as signOut$1, sendPasswordResetEmail, sendEmailVerification, GoogleAuthProvider, signInWithPopup, signInWithRedirect, getRedirectResult, onAuthStateChanged, deleteUser as deleteUser$1, EmailAuthProvider, reauthenticateWithCredential, reauthenticateWithPopup, updatePassword } from 'firebase/auth';
3
3
  import { getFirestore, doc, collection, getDoc, query, getDocs, addDoc, serverTimestamp, setDoc, updateDoc, deleteDoc, onSnapshot } from 'firebase/firestore';
4
4
  export { Timestamp, limit, orderBy, query, serverTimestamp, startAfter, where } from 'firebase/firestore';
5
5
  import { getStorage, ref, uploadBytes, getDownloadURL, uploadBytesResumable, deleteObject, listAll, getMetadata, updateMetadata } from 'firebase/storage';
@@ -137,6 +137,35 @@ function waitForAuthState() {
137
137
  });
138
138
  });
139
139
  }
140
+ async function deleteUser(user) {
141
+ return deleteUser$1(user);
142
+ }
143
+ function getAuth2() {
144
+ return getFirebaseAuth();
145
+ }
146
+ async function reauthenticateWithPassword(user, password) {
147
+ if (!user.email) throw new Error("User email not found");
148
+ const credential = EmailAuthProvider.credential(user.email, password);
149
+ return reauthenticateWithCredential(user, credential);
150
+ }
151
+ async function reauthenticateWithGoogle(user) {
152
+ try {
153
+ const provider = new GoogleAuthProvider();
154
+ return await reauthenticateWithPopup(user, provider);
155
+ } catch (error) {
156
+ if (error.code === "auth/popup-closed-by-user" || error.code === "auth/cancelled-popup-request") {
157
+ return false;
158
+ }
159
+ throw error;
160
+ }
161
+ }
162
+ async function updateUserEmail(user, newEmail) {
163
+ const { updateEmail: firebaseUpdateEmail } = await import('firebase/auth');
164
+ return firebaseUpdateEmail(user, newEmail);
165
+ }
166
+ async function updateUserPassword(user, newPassword) {
167
+ return updatePassword(user, newPassword);
168
+ }
140
169
  function getDocRef(collectionPath, documentId) {
141
170
  const db2 = getFirebaseFirestore();
142
171
  return doc(db2, collectionPath, documentId);
@@ -318,6 +347,6 @@ async function trackLogin(method) {
318
347
  await trackEvent("login", { method });
319
348
  }
320
349
 
321
- export { addDocument, app, auth, db, deleteDocument, deleteFile, generateFilePath, getCollection, getCollectionRef, getCurrentUser, getDocRef, getDocument, getFileMetadata, getFileURL, getFirebaseAnalytics, getFirebaseApp, getFirebaseAuth, getFirebaseConfig, getFirebaseFirestore, getFirebaseStorage, getGoogleRedirectResult, getStorageRef, initializeFirebase, listFiles, resetPassword, sendVerificationEmail, setDocument, signInWithEmail, signInWithGoogle, signInWithGoogleRedirect, signOut, signUpWithEmail, storage, subscribeToAuthState, subscribeToCollection, subscribeToDocument, trackEvent, trackLogin, trackPageView, trackSignUp, trackUserAction, updateDocument, updateFileMetadata, updateUserProfile, uploadFile, uploadFileWithProgress, waitForAuthState };
350
+ export { addDocument, app, auth, db, deleteDocument, deleteFile, deleteUser, generateFilePath, getAuth2 as getAuth, getCollection, getCollectionRef, getCurrentUser, getDocRef, getDocument, getFileMetadata, getFileURL, getFirebaseAnalytics, getFirebaseApp, getFirebaseAuth, getFirebaseConfig, getFirebaseFirestore, getFirebaseStorage, getGoogleRedirectResult, getStorageRef, initializeFirebase, listFiles, reauthenticateWithGoogle, reauthenticateWithPassword, resetPassword, sendVerificationEmail, setDocument, signInWithEmail, signInWithGoogle, signInWithGoogleRedirect, signOut, signUpWithEmail, storage, subscribeToAuthState, subscribeToCollection, subscribeToDocument, trackEvent, trackLogin, trackPageView, trackSignUp, trackUserAction, updateDocument, updateFileMetadata, updateUserEmail, updateUserPassword, updateUserProfile, uploadFile, uploadFileWithProgress, waitForAuthState };
322
351
  //# sourceMappingURL=index.mjs.map
323
352
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/firebase/config.ts","../../src/firebase/auth.ts","../../src/firebase/firestore.ts","../../src/firebase/storage.ts","../../src/firebase/analytics.ts"],"names":["auth","firebaseSignOut","db","doc","storage"],"mappings":"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","file":"index.mjs","sourcesContent":["import { initializeApp, getApps, getApp, FirebaseApp } from 'firebase/app';\nimport { getAuth, Auth } from 'firebase/auth';\nimport { getFirestore, Firestore } from 'firebase/firestore';\nimport { getStorage, FirebaseStorage } from 'firebase/storage';\n\n/**\n * Firebase configuration interface\n * All values should be provided via environment variables\n */\nexport interface FirebaseConfig {\n apiKey: string;\n authDomain: string;\n projectId: string;\n storageBucket: string;\n messagingSenderId: string;\n appId: string;\n measurementId?: string;\n}\n\n/**\n * Get Firebase configuration from environment variables\n * Works with Next.js NEXT_PUBLIC_ prefix\n */\nexport function getFirebaseConfig(): FirebaseConfig {\n const config: FirebaseConfig = {\n apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY || '',\n authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || '',\n projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || '',\n storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET || '',\n messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID || '',\n appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID || '',\n measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID,\n };\n\n // Validate required fields\n const requiredFields: (keyof FirebaseConfig)[] = [\n 'apiKey',\n 'authDomain',\n 'projectId',\n 'storageBucket',\n 'messagingSenderId',\n 'appId',\n ];\n\n const missingFields = requiredFields.filter((field) => !config[field]);\n\n if (missingFields.length > 0) {\n console.warn(\n `[mw-core] Missing Firebase config fields: ${missingFields.join(', ')}. ` +\n `Make sure to set NEXT_PUBLIC_FIREBASE_* environment variables.`\n );\n }\n\n return config;\n}\n\n/**\n * Initialize Firebase app (singleton pattern)\n * Safe to call multiple times - returns existing instance if already initialized\n */\nexport function initializeFirebase(config?: FirebaseConfig): FirebaseApp {\n if (getApps().length > 0) {\n return getApp();\n }\n\n const firebaseConfig = config || getFirebaseConfig();\n return initializeApp(firebaseConfig);\n}\n\n// Lazy initialization singletons\nlet _app: FirebaseApp | null = null;\nlet _auth: Auth | null = null;\nlet _db: Firestore | null = null;\nlet _storage: FirebaseStorage | null = null;\n\n/**\n * Get the Firebase app instance\n */\nexport function getFirebaseApp(): FirebaseApp {\n if (!_app) {\n _app = initializeFirebase();\n }\n return _app;\n}\n\n/**\n * Get the Firebase Auth instance\n */\nexport function getFirebaseAuth(): Auth {\n if (!_auth) {\n _auth = getAuth(getFirebaseApp());\n }\n return _auth;\n}\n\n/**\n * Get the Firestore database instance\n * Supports named databases via NEXT_PUBLIC_FIRESTORE_DATABASE_ID env var\n */\nexport function getFirebaseFirestore(): Firestore {\n if (!_db) {\n const databaseId = process.env.NEXT_PUBLIC_FIRESTORE_DATABASE_ID;\n if (databaseId) {\n _db = getFirestore(getFirebaseApp(), databaseId);\n } else {\n _db = getFirestore(getFirebaseApp());\n }\n }\n return _db;\n}\n\n/**\n * Get the Firebase Storage instance\n */\nexport function getFirebaseStorage(): FirebaseStorage {\n if (!_storage) {\n _storage = getStorage(getFirebaseApp());\n }\n return _storage;\n}\n\n// Convenience exports for direct access\nexport const app = typeof window !== 'undefined' ? getFirebaseApp() : null;\nexport const auth = typeof window !== 'undefined' ? getFirebaseAuth() : null;\nexport const db = typeof window !== 'undefined' ? getFirebaseFirestore() : null;\nexport const storage = typeof window !== 'undefined' ? getFirebaseStorage() : null;\n\n","import {\n signInWithEmailAndPassword,\n createUserWithEmailAndPassword,\n signOut as firebaseSignOut,\n sendPasswordResetEmail,\n sendEmailVerification,\n updateProfile,\n updatePassword as firebaseUpdatePassword,\n GoogleAuthProvider,\n EmailAuthProvider,\n signInWithPopup,\n signInWithRedirect,\n getRedirectResult,\n onAuthStateChanged,\n reauthenticateWithCredential as firebaseReauthenticateWithCredential,\n reauthenticateWithPopup as firebaseReauthenticateWithPopup,\n verifyBeforeUpdateEmail as firebaseVerifyBeforeUpdateEmail,\n deleteUser as firebaseDeleteUser,\n getAdditionalUserInfo as firebaseGetAdditionalUserInfo,\n User,\n UserCredential,\n Auth,\n AuthCredential,\n} from 'firebase/auth';\nimport { getFirebaseAuth } from './config';\n\n/**\n * Sign in with email and password\n */\nexport async function signInWithEmail(\n email: string,\n password: string\n): Promise<UserCredential> {\n const auth = getFirebaseAuth();\n return signInWithEmailAndPassword(auth, email, password);\n}\n\n/**\n * Create a new account with email and password\n */\nexport async function signUpWithEmail(\n email: string,\n password: string,\n displayName?: string\n): Promise<UserCredential> {\n const auth = getFirebaseAuth();\n const credential = await createUserWithEmailAndPassword(auth, email, password);\n \n if (displayName && credential.user) {\n await updateProfile(credential.user, { displayName });\n }\n \n return credential;\n}\n\n/**\n * Sign out the current user\n */\nexport async function signOut(): Promise<void> {\n const auth = getFirebaseAuth();\n return firebaseSignOut(auth);\n}\n\n/**\n * Send a password reset email\n */\nexport async function resetPassword(email: string): Promise<void> {\n const auth = getFirebaseAuth();\n return sendPasswordResetEmail(auth, email);\n}\n\n/**\n * Send email verification to the current user\n */\nexport async function sendVerificationEmail(user: User): Promise<void> {\n return sendEmailVerification(user);\n}\n\n/**\n * Update the current user's profile\n */\nexport async function updateUserProfile(\n user: User,\n profile: { displayName?: string; photoURL?: string }\n): Promise<void> {\n return updateProfile(user, profile);\n}\n\n/**\n * Sign in with Google using popup\n */\nexport async function signInWithGoogle(): Promise<UserCredential> {\n const auth = getFirebaseAuth();\n const provider = new GoogleAuthProvider();\n provider.addScope('email');\n provider.addScope('profile');\n return signInWithPopup(auth, provider);\n}\n\n/**\n * Sign in with Google using redirect (better for mobile)\n */\nexport async function signInWithGoogleRedirect(): Promise<void> {\n const auth = getFirebaseAuth();\n const provider = new GoogleAuthProvider();\n provider.addScope('email');\n provider.addScope('profile');\n return signInWithRedirect(auth, provider);\n}\n\n/**\n * Get the result of a redirect sign-in\n */\nexport async function getGoogleRedirectResult(): Promise<UserCredential | null> {\n const auth = getFirebaseAuth();\n return getRedirectResult(auth);\n}\n\n/**\n * Subscribe to auth state changes\n */\nexport function subscribeToAuthState(\n callback: (user: User | null) => void\n): () => void {\n const auth = getFirebaseAuth();\n return onAuthStateChanged(auth, callback);\n}\n\n/**\n * Get the current user (may be null if not authenticated)\n */\nexport function getCurrentUser(): User | null {\n const auth = getFirebaseAuth();\n return auth.currentUser;\n}\n\n/**\n * Wait for the auth state to be determined\n * Useful for SSR/initial load\n */\nexport function waitForAuthState(): Promise<User | null> {\n return new Promise((resolve) => {\n const auth = getFirebaseAuth();\n const unsubscribe = onAuthStateChanged(auth, (user) => {\n unsubscribe();\n resolve(user);\n });\n });\n}\n\n/**\n * Update the current user's password\n * Requires recent authentication\n */\nexport async function updatePassword(\n user: User,\n newPassword: string\n): Promise<void> {\n return firebaseUpdatePassword(user, newPassword);\n}\n\n/**\n * Re-authenticate user with email/password credential\n * Required before sensitive operations like password change, email change, account deletion\n */\nexport async function reauthenticateWithCredential(\n user: User,\n credential: AuthCredential\n): Promise<UserCredential> {\n return firebaseReauthenticateWithCredential(user, credential);\n}\n\n/**\n * Re-authenticate user with Google popup\n * Required before sensitive operations for Google-authenticated users\n */\nexport async function reauthenticateWithPopup(\n user: User\n): Promise<UserCredential> {\n const provider = new GoogleAuthProvider();\n return firebaseReauthenticateWithPopup(user, provider);\n}\n\n/**\n * Send verification email to new email address before updating\n * User must verify new email before it becomes active\n */\nexport async function verifyBeforeUpdateEmail(\n user: User,\n newEmail: string\n): Promise<void> {\n return firebaseVerifyBeforeUpdateEmail(user, newEmail);\n}\n\n/**\n * Delete the authenticated user\n * Requires recent authentication\n */\nexport async function deleteUser(user: User): Promise<void> {\n return firebaseDeleteUser(user);\n}\n\n/**\n * Get additional user info from credential (e.g., isNewUser)\n */\nexport function getAdditionalUserInfo(credential: UserCredential) {\n return firebaseGetAdditionalUserInfo(credential);\n}\n\n/**\n * Create email/password credential for re-authentication\n */\nexport function createEmailCredential(email: string, password: string): AuthCredential {\n return EmailAuthProvider.credential(email, password);\n}\n\n/**\n * Get the Firebase Auth instance\n */\nexport function getAuth(): Auth {\n return getFirebaseAuth();\n}\n\n/**\n * Convenience: Reauthenticate with password\n * @returns Promise<UserCredential>\n */\nexport async function reauthenticateWithPassword(\n user: User,\n password: string\n): Promise<UserCredential> {\n if (!user.email) throw new Error('User email not found');\n const credential = EmailAuthProvider.credential(user.email, password);\n return firebaseReauthenticateWithCredential(user, credential);\n}\n\n/**\n * Convenience: Reauthenticate with Google\n * @returns Promise<UserCredential> or false if user cancelled\n */\nexport async function reauthenticateWithGoogle(\n user: User\n): Promise<UserCredential | false> {\n try {\n const provider = new GoogleAuthProvider();\n return await firebaseReauthenticateWithPopup(user, provider);\n } catch (error: any) {\n if (error.code === 'auth/popup-closed-by-user' || error.code === 'auth/cancelled-popup-request') {\n return false; // User cancelled\n }\n throw error;\n }\n}\n\n/**\n * Update user email (requires recent authentication)\n */\nexport async function updateUserEmail(user: User, newEmail: string): Promise<void> {\n const { updateEmail: firebaseUpdateEmail } = await import('firebase/auth');\n return firebaseUpdateEmail(user, newEmail);\n}\n\n/**\n * Update user password (requires recent authentication)\n */\nexport async function updateUserPassword(user: User, newPassword: string): Promise<void> {\n return firebaseUpdatePassword(user, newPassword);\n}\n\n// Re-export useful types\nexport type { User, UserCredential, Auth, AuthCredential };\n\n// Re-export providers for direct use\nexport { GoogleAuthProvider, EmailAuthProvider };\n\n","import {\n collection,\n doc,\n getDoc,\n getDocs,\n setDoc,\n updateDoc,\n deleteDoc,\n addDoc,\n query,\n where,\n orderBy,\n limit,\n startAfter,\n onSnapshot,\n DocumentData,\n DocumentReference,\n CollectionReference,\n QueryConstraint,\n DocumentSnapshot,\n QuerySnapshot,\n Timestamp,\n serverTimestamp,\n FieldValue,\n WhereFilterOp,\n OrderByDirection,\n Unsubscribe,\n} from 'firebase/firestore';\nimport { getFirebaseFirestore } from './config';\n\n/**\n * Get a document reference\n */\nexport function getDocRef<T = DocumentData>(\n collectionPath: string,\n documentId: string\n): DocumentReference<T> {\n const db = getFirebaseFirestore();\n return doc(db, collectionPath, documentId) as DocumentReference<T>;\n}\n\n/**\n * Get a collection reference\n */\nexport function getCollectionRef<T = DocumentData>(\n collectionPath: string\n): CollectionReference<T> {\n const db = getFirebaseFirestore();\n return collection(db, collectionPath) as CollectionReference<T>;\n}\n\n/**\n * Get a single document by ID\n */\nexport async function getDocument<T = DocumentData>(\n collectionPath: string,\n documentId: string\n): Promise<T | null> {\n const docRef = getDocRef<T>(collectionPath, documentId);\n const docSnap = await getDoc(docRef);\n \n if (docSnap.exists()) {\n return { id: docSnap.id, ...docSnap.data() } as T;\n }\n \n return null;\n}\n\n/**\n * Get all documents in a collection\n */\nexport async function getCollection<T = DocumentData>(\n collectionPath: string,\n constraints: QueryConstraint[] = []\n): Promise<T[]> {\n const collectionRef = getCollectionRef<T>(collectionPath);\n const q = query(collectionRef, ...constraints);\n const querySnapshot = await getDocs(q);\n \n return querySnapshot.docs.map((doc) => ({\n id: doc.id,\n ...doc.data(),\n })) as T[];\n}\n\n/**\n * Add a new document with auto-generated ID\n */\nexport async function addDocument<T = DocumentData>(\n collectionPath: string,\n data: Omit<T, 'id'>\n): Promise<string> {\n const collectionRef = getCollectionRef(collectionPath);\n const docRef = await addDoc(collectionRef, {\n ...data,\n createdAt: serverTimestamp(),\n updatedAt: serverTimestamp(),\n });\n return docRef.id;\n}\n\n/**\n * Set/create a document with a specific ID\n */\nexport async function setDocument<T = DocumentData>(\n collectionPath: string,\n documentId: string,\n data: Omit<T, 'id'>,\n merge: boolean = false\n): Promise<void> {\n const docRef = getDocRef(collectionPath, documentId);\n await setDoc(\n docRef,\n {\n ...data,\n updatedAt: serverTimestamp(),\n ...(merge ? {} : { createdAt: serverTimestamp() }),\n },\n { merge }\n );\n}\n\n/**\n * Update specific fields in a document\n */\nexport async function updateDocument<T = DocumentData>(\n collectionPath: string,\n documentId: string,\n data: Partial<T>\n): Promise<void> {\n const docRef = getDocRef(collectionPath, documentId);\n await updateDoc(docRef, {\n ...data,\n updatedAt: serverTimestamp(),\n });\n}\n\n/**\n * Delete a document\n */\nexport async function deleteDocument(\n collectionPath: string,\n documentId: string\n): Promise<void> {\n const docRef = getDocRef(collectionPath, documentId);\n await deleteDoc(docRef);\n}\n\n/**\n * Subscribe to a single document\n */\nexport function subscribeToDocument<T = DocumentData>(\n collectionPath: string,\n documentId: string,\n callback: (data: T | null) => void\n): Unsubscribe {\n const docRef = getDocRef<T>(collectionPath, documentId);\n \n return onSnapshot(docRef, (docSnap) => {\n if (docSnap.exists()) {\n callback({ id: docSnap.id, ...docSnap.data() } as T);\n } else {\n callback(null);\n }\n });\n}\n\n/**\n * Subscribe to a collection\n */\nexport function subscribeToCollection<T = DocumentData>(\n collectionPath: string,\n callback: (data: T[]) => void,\n constraints: QueryConstraint[] = []\n): Unsubscribe {\n const collectionRef = getCollectionRef<T>(collectionPath);\n const q = query(collectionRef, ...constraints);\n \n return onSnapshot(q, (querySnapshot) => {\n const data = querySnapshot.docs.map((doc) => ({\n id: doc.id,\n ...doc.data(),\n })) as T[];\n callback(data);\n });\n}\n\n// Export query helpers for convenience\nexport {\n query,\n where,\n orderBy,\n limit,\n startAfter,\n Timestamp,\n serverTimestamp,\n};\n\n// Export raw Firebase functions for direct usage in AuthProvider\nexport {\n doc,\n setDoc,\n getDoc,\n onSnapshot,\n};\n\n// Re-export types\nexport type {\n DocumentData,\n DocumentReference,\n CollectionReference,\n QueryConstraint,\n DocumentSnapshot,\n QuerySnapshot,\n FieldValue,\n WhereFilterOp,\n OrderByDirection,\n Unsubscribe,\n};\n\n","import {\n ref,\n uploadBytes,\n uploadBytesResumable,\n getDownloadURL,\n deleteObject,\n listAll,\n getMetadata,\n updateMetadata,\n StorageReference,\n UploadTask,\n UploadMetadata,\n FullMetadata,\n ListResult,\n} from 'firebase/storage';\nimport { getFirebaseStorage } from './config';\n\n/**\n * Get a reference to a storage location\n */\nexport function getStorageRef(path: string): StorageReference {\n const storage = getFirebaseStorage();\n return ref(storage, path);\n}\n\n/**\n * Upload a file to storage\n */\nexport async function uploadFile(\n path: string,\n file: Blob | Uint8Array | ArrayBuffer,\n metadata?: UploadMetadata\n): Promise<string> {\n const storageRef = getStorageRef(path);\n await uploadBytes(storageRef, file, metadata);\n return getDownloadURL(storageRef);\n}\n\n/**\n * Upload a file with progress tracking\n */\nexport function uploadFileWithProgress(\n path: string,\n file: Blob | Uint8Array | ArrayBuffer,\n onProgress?: (progress: number) => void,\n metadata?: UploadMetadata\n): { task: UploadTask; promise: Promise<string> } {\n const storageRef = getStorageRef(path);\n const task = uploadBytesResumable(storageRef, file, metadata);\n \n if (onProgress) {\n task.on('state_changed', (snapshot) => {\n const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;\n onProgress(progress);\n });\n }\n \n const promise = new Promise<string>((resolve, reject) => {\n task.on(\n 'state_changed',\n null,\n (error) => reject(error),\n async () => {\n const url = await getDownloadURL(task.snapshot.ref);\n resolve(url);\n }\n );\n });\n \n return { task, promise };\n}\n\n/**\n * Get the download URL for a file\n */\nexport async function getFileURL(path: string): Promise<string> {\n const storageRef = getStorageRef(path);\n return getDownloadURL(storageRef);\n}\n\n/**\n * Delete a file from storage\n */\nexport async function deleteFile(path: string): Promise<void> {\n const storageRef = getStorageRef(path);\n return deleteObject(storageRef);\n}\n\n/**\n * List all files in a directory\n */\nexport async function listFiles(path: string): Promise<ListResult> {\n const storageRef = getStorageRef(path);\n return listAll(storageRef);\n}\n\n/**\n * Get metadata for a file\n */\nexport async function getFileMetadata(path: string): Promise<FullMetadata> {\n const storageRef = getStorageRef(path);\n return getMetadata(storageRef);\n}\n\n/**\n * Update metadata for a file\n */\nexport async function updateFileMetadata(\n path: string,\n metadata: Partial<UploadMetadata>\n): Promise<FullMetadata> {\n const storageRef = getStorageRef(path);\n return updateMetadata(storageRef, metadata);\n}\n\n/**\n * Generate a unique file path with timestamp\n */\nexport function generateFilePath(\n folder: string,\n filename: string,\n userId?: string\n): string {\n const timestamp = Date.now();\n const extension = filename.split('.').pop() || '';\n const baseName = filename.replace(/\\.[^/.]+$/, '');\n const sanitizedName = baseName.replace(/[^a-zA-Z0-9]/g, '_');\n \n if (userId) {\n return `${folder}/${userId}/${timestamp}_${sanitizedName}.${extension}`;\n }\n \n return `${folder}/${timestamp}_${sanitizedName}.${extension}`;\n}\n\n// Re-export types\nexport type {\n StorageReference,\n UploadTask,\n UploadMetadata,\n FullMetadata,\n ListResult,\n};\n\n","import { getAnalytics, logEvent, Analytics, isSupported } from 'firebase/analytics';\nimport { getFirebaseApp } from './config';\n\nlet _analytics: Analytics | null = null;\n\n/**\n * Get the Firebase Analytics instance\n * Only works in browser environment\n */\nexport async function getFirebaseAnalytics(): Promise<Analytics | null> {\n if (typeof window === 'undefined') {\n return null;\n }\n\n if (_analytics) {\n return _analytics;\n }\n\n const supported = await isSupported();\n if (!supported) {\n console.warn('[mw-core] Firebase Analytics is not supported in this environment');\n return null;\n }\n\n _analytics = getAnalytics(getFirebaseApp());\n return _analytics;\n}\n\n/**\n * Log a custom event to Firebase Analytics\n */\nexport async function trackEvent(\n eventName: string,\n eventParams?: Record<string, unknown>\n): Promise<void> {\n const analytics = await getFirebaseAnalytics();\n if (analytics) {\n logEvent(analytics, eventName, eventParams);\n }\n}\n\n/**\n * Track a page view\n */\nexport async function trackPageView(\n pagePath: string,\n pageTitle?: string\n): Promise<void> {\n await trackEvent('page_view', {\n page_path: pagePath,\n page_title: pageTitle,\n });\n}\n\n/**\n * Track a user action\n */\nexport async function trackUserAction(\n action: string,\n category: string,\n label?: string,\n value?: number\n): Promise<void> {\n await trackEvent(action, {\n event_category: category,\n event_label: label,\n value,\n });\n}\n\n/**\n * Track sign up event\n */\nexport async function trackSignUp(method: string): Promise<void> {\n await trackEvent('sign_up', { method });\n}\n\n/**\n * Track login event\n */\nexport async function trackLogin(method: string): Promise<void> {\n await trackEvent('login', { method });\n}\n\n// Re-export types\nexport type { Analytics };\n\n"]}
1
+ {"version":3,"sources":["../../src/firebase/config.ts","../../src/firebase/auth.ts","../../src/firebase/firestore.ts","../../src/firebase/storage.ts","../../src/firebase/analytics.ts"],"names":["auth","firebaseSignOut","firebaseDeleteUser","getAuth","firebaseReauthenticateWithCredential","firebaseReauthenticateWithPopup","firebaseUpdatePassword","db","doc","storage"],"mappings":"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","file":"index.mjs","sourcesContent":["import { initializeApp, getApps, getApp, FirebaseApp } from 'firebase/app';\nimport { getAuth, Auth } from 'firebase/auth';\nimport { getFirestore, Firestore } from 'firebase/firestore';\nimport { getStorage, FirebaseStorage } from 'firebase/storage';\n\n/**\n * Firebase configuration interface\n * All values should be provided via environment variables\n */\nexport interface FirebaseConfig {\n apiKey: string;\n authDomain: string;\n projectId: string;\n storageBucket: string;\n messagingSenderId: string;\n appId: string;\n measurementId?: string;\n}\n\n/**\n * Get Firebase configuration from environment variables\n * Works with Next.js NEXT_PUBLIC_ prefix\n */\nexport function getFirebaseConfig(): FirebaseConfig {\n const config: FirebaseConfig = {\n apiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY || '',\n authDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN || '',\n projectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID || '',\n storageBucket: process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET || '',\n messagingSenderId: process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID || '',\n appId: process.env.NEXT_PUBLIC_FIREBASE_APP_ID || '',\n measurementId: process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID,\n };\n\n // Validate required fields\n const requiredFields: (keyof FirebaseConfig)[] = [\n 'apiKey',\n 'authDomain',\n 'projectId',\n 'storageBucket',\n 'messagingSenderId',\n 'appId',\n ];\n\n const missingFields = requiredFields.filter((field) => !config[field]);\n\n if (missingFields.length > 0) {\n console.warn(\n `[mw-core] Missing Firebase config fields: ${missingFields.join(', ')}. ` +\n `Make sure to set NEXT_PUBLIC_FIREBASE_* environment variables.`\n );\n }\n\n return config;\n}\n\n/**\n * Initialize Firebase app (singleton pattern)\n * Safe to call multiple times - returns existing instance if already initialized\n */\nexport function initializeFirebase(config?: FirebaseConfig): FirebaseApp {\n if (getApps().length > 0) {\n return getApp();\n }\n\n const firebaseConfig = config || getFirebaseConfig();\n return initializeApp(firebaseConfig);\n}\n\n// Lazy initialization singletons\nlet _app: FirebaseApp | null = null;\nlet _auth: Auth | null = null;\nlet _db: Firestore | null = null;\nlet _storage: FirebaseStorage | null = null;\n\n/**\n * Get the Firebase app instance\n */\nexport function getFirebaseApp(): FirebaseApp {\n if (!_app) {\n _app = initializeFirebase();\n }\n return _app;\n}\n\n/**\n * Get the Firebase Auth instance\n */\nexport function getFirebaseAuth(): Auth {\n if (!_auth) {\n _auth = getAuth(getFirebaseApp());\n }\n return _auth;\n}\n\n/**\n * Get the Firestore database instance\n * Supports named databases via NEXT_PUBLIC_FIRESTORE_DATABASE_ID env var\n */\nexport function getFirebaseFirestore(): Firestore {\n if (!_db) {\n const databaseId = process.env.NEXT_PUBLIC_FIRESTORE_DATABASE_ID;\n if (databaseId) {\n _db = getFirestore(getFirebaseApp(), databaseId);\n } else {\n _db = getFirestore(getFirebaseApp());\n }\n }\n return _db;\n}\n\n/**\n * Get the Firebase Storage instance\n */\nexport function getFirebaseStorage(): FirebaseStorage {\n if (!_storage) {\n _storage = getStorage(getFirebaseApp());\n }\n return _storage;\n}\n\n// Convenience exports for direct access\nexport const app = typeof window !== 'undefined' ? getFirebaseApp() : null;\nexport const auth = typeof window !== 'undefined' ? getFirebaseAuth() : null;\nexport const db = typeof window !== 'undefined' ? getFirebaseFirestore() : null;\nexport const storage = typeof window !== 'undefined' ? getFirebaseStorage() : null;\n\n","import {\n signInWithEmailAndPassword,\n createUserWithEmailAndPassword,\n signOut as firebaseSignOut,\n sendPasswordResetEmail,\n sendEmailVerification,\n updateProfile,\n updatePassword as firebaseUpdatePassword,\n GoogleAuthProvider,\n EmailAuthProvider,\n signInWithPopup,\n signInWithRedirect,\n getRedirectResult,\n onAuthStateChanged,\n reauthenticateWithCredential as firebaseReauthenticateWithCredential,\n reauthenticateWithPopup as firebaseReauthenticateWithPopup,\n verifyBeforeUpdateEmail as firebaseVerifyBeforeUpdateEmail,\n deleteUser as firebaseDeleteUser,\n getAdditionalUserInfo as firebaseGetAdditionalUserInfo,\n User,\n UserCredential,\n Auth,\n AuthCredential,\n} from 'firebase/auth';\nimport { getFirebaseAuth } from './config';\n\n/**\n * Sign in with email and password\n */\nexport async function signInWithEmail(\n email: string,\n password: string\n): Promise<UserCredential> {\n const auth = getFirebaseAuth();\n return signInWithEmailAndPassword(auth, email, password);\n}\n\n/**\n * Create a new account with email and password\n */\nexport async function signUpWithEmail(\n email: string,\n password: string,\n displayName?: string\n): Promise<UserCredential> {\n const auth = getFirebaseAuth();\n const credential = await createUserWithEmailAndPassword(auth, email, password);\n \n if (displayName && credential.user) {\n await updateProfile(credential.user, { displayName });\n }\n \n return credential;\n}\n\n/**\n * Sign out the current user\n */\nexport async function signOut(): Promise<void> {\n const auth = getFirebaseAuth();\n return firebaseSignOut(auth);\n}\n\n/**\n * Send a password reset email\n */\nexport async function resetPassword(email: string): Promise<void> {\n const auth = getFirebaseAuth();\n return sendPasswordResetEmail(auth, email);\n}\n\n/**\n * Send email verification to the current user\n */\nexport async function sendVerificationEmail(user: User): Promise<void> {\n return sendEmailVerification(user);\n}\n\n/**\n * Update the current user's profile\n */\nexport async function updateUserProfile(\n user: User,\n profile: { displayName?: string; photoURL?: string }\n): Promise<void> {\n return updateProfile(user, profile);\n}\n\n/**\n * Sign in with Google using popup\n */\nexport async function signInWithGoogle(): Promise<UserCredential> {\n const auth = getFirebaseAuth();\n const provider = new GoogleAuthProvider();\n provider.addScope('email');\n provider.addScope('profile');\n return signInWithPopup(auth, provider);\n}\n\n/**\n * Sign in with Google using redirect (better for mobile)\n */\nexport async function signInWithGoogleRedirect(): Promise<void> {\n const auth = getFirebaseAuth();\n const provider = new GoogleAuthProvider();\n provider.addScope('email');\n provider.addScope('profile');\n return signInWithRedirect(auth, provider);\n}\n\n/**\n * Get the result of a redirect sign-in\n */\nexport async function getGoogleRedirectResult(): Promise<UserCredential | null> {\n const auth = getFirebaseAuth();\n return getRedirectResult(auth);\n}\n\n/**\n * Subscribe to auth state changes\n */\nexport function subscribeToAuthState(\n callback: (user: User | null) => void\n): () => void {\n const auth = getFirebaseAuth();\n return onAuthStateChanged(auth, callback);\n}\n\n/**\n * Get the current user (may be null if not authenticated)\n */\nexport function getCurrentUser(): User | null {\n const auth = getFirebaseAuth();\n return auth.currentUser;\n}\n\n/**\n * Wait for the auth state to be determined\n * Useful for SSR/initial load\n */\nexport function waitForAuthState(): Promise<User | null> {\n return new Promise((resolve) => {\n const auth = getFirebaseAuth();\n const unsubscribe = onAuthStateChanged(auth, (user) => {\n unsubscribe();\n resolve(user);\n });\n });\n}\n\n/**\n * Update the current user's password\n * Requires recent authentication\n */\nexport async function updatePassword(\n user: User,\n newPassword: string\n): Promise<void> {\n return firebaseUpdatePassword(user, newPassword);\n}\n\n/**\n * Re-authenticate user with email/password credential\n * Required before sensitive operations like password change, email change, account deletion\n */\nexport async function reauthenticateWithCredential(\n user: User,\n credential: AuthCredential\n): Promise<UserCredential> {\n return firebaseReauthenticateWithCredential(user, credential);\n}\n\n/**\n * Re-authenticate user with Google popup\n * Required before sensitive operations for Google-authenticated users\n */\nexport async function reauthenticateWithPopup(\n user: User\n): Promise<UserCredential> {\n const provider = new GoogleAuthProvider();\n return firebaseReauthenticateWithPopup(user, provider);\n}\n\n/**\n * Send verification email to new email address before updating\n * User must verify new email before it becomes active\n */\nexport async function verifyBeforeUpdateEmail(\n user: User,\n newEmail: string\n): Promise<void> {\n return firebaseVerifyBeforeUpdateEmail(user, newEmail);\n}\n\n/**\n * Delete the authenticated user\n * Requires recent authentication\n */\nexport async function deleteUser(user: User): Promise<void> {\n return firebaseDeleteUser(user);\n}\n\n/**\n * Get additional user info from credential (e.g., isNewUser)\n */\nexport function getAdditionalUserInfo(credential: UserCredential) {\n return firebaseGetAdditionalUserInfo(credential);\n}\n\n/**\n * Create email/password credential for re-authentication\n */\nexport function createEmailCredential(email: string, password: string): AuthCredential {\n return EmailAuthProvider.credential(email, password);\n}\n\n/**\n * Get the Firebase Auth instance\n */\nexport function getAuth(): Auth {\n return getFirebaseAuth();\n}\n\n/**\n * Convenience: Reauthenticate with password\n * @returns Promise<UserCredential>\n */\nexport async function reauthenticateWithPassword(\n user: User,\n password: string\n): Promise<UserCredential> {\n if (!user.email) throw new Error('User email not found');\n const credential = EmailAuthProvider.credential(user.email, password);\n return firebaseReauthenticateWithCredential(user, credential);\n}\n\n/**\n * Convenience: Reauthenticate with Google\n * @returns Promise<UserCredential> or false if user cancelled\n */\nexport async function reauthenticateWithGoogle(\n user: User\n): Promise<UserCredential | false> {\n try {\n const provider = new GoogleAuthProvider();\n return await firebaseReauthenticateWithPopup(user, provider);\n } catch (error: any) {\n if (error.code === 'auth/popup-closed-by-user' || error.code === 'auth/cancelled-popup-request') {\n return false; // User cancelled\n }\n throw error;\n }\n}\n\n/**\n * Update user email (requires recent authentication)\n */\nexport async function updateUserEmail(user: User, newEmail: string): Promise<void> {\n const { updateEmail: firebaseUpdateEmail } = await import('firebase/auth');\n return firebaseUpdateEmail(user, newEmail);\n}\n\n/**\n * Update user password (requires recent authentication)\n */\nexport async function updateUserPassword(user: User, newPassword: string): Promise<void> {\n return firebaseUpdatePassword(user, newPassword);\n}\n\n// Re-export useful types\nexport type { User, UserCredential, Auth, AuthCredential };\n\n// Re-export providers for direct use\nexport { GoogleAuthProvider, EmailAuthProvider };\n\n","import {\n collection,\n doc,\n getDoc,\n getDocs,\n setDoc,\n updateDoc,\n deleteDoc,\n addDoc,\n query,\n where,\n orderBy,\n limit,\n startAfter,\n onSnapshot,\n DocumentData,\n DocumentReference,\n CollectionReference,\n QueryConstraint,\n DocumentSnapshot,\n QuerySnapshot,\n Timestamp,\n serverTimestamp,\n FieldValue,\n WhereFilterOp,\n OrderByDirection,\n Unsubscribe,\n} from 'firebase/firestore';\nimport { getFirebaseFirestore } from './config';\n\n/**\n * Get a document reference\n */\nexport function getDocRef<T = DocumentData>(\n collectionPath: string,\n documentId: string\n): DocumentReference<T> {\n const db = getFirebaseFirestore();\n return doc(db, collectionPath, documentId) as DocumentReference<T>;\n}\n\n/**\n * Get a collection reference\n */\nexport function getCollectionRef<T = DocumentData>(\n collectionPath: string\n): CollectionReference<T> {\n const db = getFirebaseFirestore();\n return collection(db, collectionPath) as CollectionReference<T>;\n}\n\n/**\n * Get a single document by ID\n */\nexport async function getDocument<T = DocumentData>(\n collectionPath: string,\n documentId: string\n): Promise<T | null> {\n const docRef = getDocRef<T>(collectionPath, documentId);\n const docSnap = await getDoc(docRef);\n \n if (docSnap.exists()) {\n return { id: docSnap.id, ...docSnap.data() } as T;\n }\n \n return null;\n}\n\n/**\n * Get all documents in a collection\n */\nexport async function getCollection<T = DocumentData>(\n collectionPath: string,\n constraints: QueryConstraint[] = []\n): Promise<T[]> {\n const collectionRef = getCollectionRef<T>(collectionPath);\n const q = query(collectionRef, ...constraints);\n const querySnapshot = await getDocs(q);\n \n return querySnapshot.docs.map((doc) => ({\n id: doc.id,\n ...doc.data(),\n })) as T[];\n}\n\n/**\n * Add a new document with auto-generated ID\n */\nexport async function addDocument<T = DocumentData>(\n collectionPath: string,\n data: Omit<T, 'id'>\n): Promise<string> {\n const collectionRef = getCollectionRef(collectionPath);\n const docRef = await addDoc(collectionRef, {\n ...data,\n createdAt: serverTimestamp(),\n updatedAt: serverTimestamp(),\n });\n return docRef.id;\n}\n\n/**\n * Set/create a document with a specific ID\n */\nexport async function setDocument<T = DocumentData>(\n collectionPath: string,\n documentId: string,\n data: Omit<T, 'id'>,\n merge: boolean = false\n): Promise<void> {\n const docRef = getDocRef(collectionPath, documentId);\n await setDoc(\n docRef,\n {\n ...data,\n updatedAt: serverTimestamp(),\n ...(merge ? {} : { createdAt: serverTimestamp() }),\n },\n { merge }\n );\n}\n\n/**\n * Update specific fields in a document\n */\nexport async function updateDocument<T = DocumentData>(\n collectionPath: string,\n documentId: string,\n data: Partial<T>\n): Promise<void> {\n const docRef = getDocRef(collectionPath, documentId);\n await updateDoc(docRef, {\n ...data,\n updatedAt: serverTimestamp(),\n });\n}\n\n/**\n * Delete a document\n */\nexport async function deleteDocument(\n collectionPath: string,\n documentId: string\n): Promise<void> {\n const docRef = getDocRef(collectionPath, documentId);\n await deleteDoc(docRef);\n}\n\n/**\n * Subscribe to a single document\n */\nexport function subscribeToDocument<T = DocumentData>(\n collectionPath: string,\n documentId: string,\n callback: (data: T | null) => void\n): Unsubscribe {\n const docRef = getDocRef<T>(collectionPath, documentId);\n \n return onSnapshot(docRef, (docSnap) => {\n if (docSnap.exists()) {\n callback({ id: docSnap.id, ...docSnap.data() } as T);\n } else {\n callback(null);\n }\n });\n}\n\n/**\n * Subscribe to a collection\n */\nexport function subscribeToCollection<T = DocumentData>(\n collectionPath: string,\n callback: (data: T[]) => void,\n constraints: QueryConstraint[] = []\n): Unsubscribe {\n const collectionRef = getCollectionRef<T>(collectionPath);\n const q = query(collectionRef, ...constraints);\n \n return onSnapshot(q, (querySnapshot) => {\n const data = querySnapshot.docs.map((doc) => ({\n id: doc.id,\n ...doc.data(),\n })) as T[];\n callback(data);\n });\n}\n\n// Export query helpers for convenience\nexport {\n query,\n where,\n orderBy,\n limit,\n startAfter,\n Timestamp,\n serverTimestamp,\n};\n\n// Export raw Firebase functions for direct usage in AuthProvider\nexport {\n doc,\n setDoc,\n getDoc,\n onSnapshot,\n};\n\n// Re-export types\nexport type {\n DocumentData,\n DocumentReference,\n CollectionReference,\n QueryConstraint,\n DocumentSnapshot,\n QuerySnapshot,\n FieldValue,\n WhereFilterOp,\n OrderByDirection,\n Unsubscribe,\n};\n\n","import {\n ref,\n uploadBytes,\n uploadBytesResumable,\n getDownloadURL,\n deleteObject,\n listAll,\n getMetadata,\n updateMetadata,\n StorageReference,\n UploadTask,\n UploadMetadata,\n FullMetadata,\n ListResult,\n} from 'firebase/storage';\nimport { getFirebaseStorage } from './config';\n\n/**\n * Get a reference to a storage location\n */\nexport function getStorageRef(path: string): StorageReference {\n const storage = getFirebaseStorage();\n return ref(storage, path);\n}\n\n/**\n * Upload a file to storage\n */\nexport async function uploadFile(\n path: string,\n file: Blob | Uint8Array | ArrayBuffer,\n metadata?: UploadMetadata\n): Promise<string> {\n const storageRef = getStorageRef(path);\n await uploadBytes(storageRef, file, metadata);\n return getDownloadURL(storageRef);\n}\n\n/**\n * Upload a file with progress tracking\n */\nexport function uploadFileWithProgress(\n path: string,\n file: Blob | Uint8Array | ArrayBuffer,\n onProgress?: (progress: number) => void,\n metadata?: UploadMetadata\n): { task: UploadTask; promise: Promise<string> } {\n const storageRef = getStorageRef(path);\n const task = uploadBytesResumable(storageRef, file, metadata);\n \n if (onProgress) {\n task.on('state_changed', (snapshot) => {\n const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;\n onProgress(progress);\n });\n }\n \n const promise = new Promise<string>((resolve, reject) => {\n task.on(\n 'state_changed',\n null,\n (error) => reject(error),\n async () => {\n const url = await getDownloadURL(task.snapshot.ref);\n resolve(url);\n }\n );\n });\n \n return { task, promise };\n}\n\n/**\n * Get the download URL for a file\n */\nexport async function getFileURL(path: string): Promise<string> {\n const storageRef = getStorageRef(path);\n return getDownloadURL(storageRef);\n}\n\n/**\n * Delete a file from storage\n */\nexport async function deleteFile(path: string): Promise<void> {\n const storageRef = getStorageRef(path);\n return deleteObject(storageRef);\n}\n\n/**\n * List all files in a directory\n */\nexport async function listFiles(path: string): Promise<ListResult> {\n const storageRef = getStorageRef(path);\n return listAll(storageRef);\n}\n\n/**\n * Get metadata for a file\n */\nexport async function getFileMetadata(path: string): Promise<FullMetadata> {\n const storageRef = getStorageRef(path);\n return getMetadata(storageRef);\n}\n\n/**\n * Update metadata for a file\n */\nexport async function updateFileMetadata(\n path: string,\n metadata: Partial<UploadMetadata>\n): Promise<FullMetadata> {\n const storageRef = getStorageRef(path);\n return updateMetadata(storageRef, metadata);\n}\n\n/**\n * Generate a unique file path with timestamp\n */\nexport function generateFilePath(\n folder: string,\n filename: string,\n userId?: string\n): string {\n const timestamp = Date.now();\n const extension = filename.split('.').pop() || '';\n const baseName = filename.replace(/\\.[^/.]+$/, '');\n const sanitizedName = baseName.replace(/[^a-zA-Z0-9]/g, '_');\n \n if (userId) {\n return `${folder}/${userId}/${timestamp}_${sanitizedName}.${extension}`;\n }\n \n return `${folder}/${timestamp}_${sanitizedName}.${extension}`;\n}\n\n// Re-export types\nexport type {\n StorageReference,\n UploadTask,\n UploadMetadata,\n FullMetadata,\n ListResult,\n};\n\n","import { getAnalytics, logEvent, Analytics, isSupported } from 'firebase/analytics';\nimport { getFirebaseApp } from './config';\n\nlet _analytics: Analytics | null = null;\n\n/**\n * Get the Firebase Analytics instance\n * Only works in browser environment\n */\nexport async function getFirebaseAnalytics(): Promise<Analytics | null> {\n if (typeof window === 'undefined') {\n return null;\n }\n\n if (_analytics) {\n return _analytics;\n }\n\n const supported = await isSupported();\n if (!supported) {\n console.warn('[mw-core] Firebase Analytics is not supported in this environment');\n return null;\n }\n\n _analytics = getAnalytics(getFirebaseApp());\n return _analytics;\n}\n\n/**\n * Log a custom event to Firebase Analytics\n */\nexport async function trackEvent(\n eventName: string,\n eventParams?: Record<string, unknown>\n): Promise<void> {\n const analytics = await getFirebaseAnalytics();\n if (analytics) {\n logEvent(analytics, eventName, eventParams);\n }\n}\n\n/**\n * Track a page view\n */\nexport async function trackPageView(\n pagePath: string,\n pageTitle?: string\n): Promise<void> {\n await trackEvent('page_view', {\n page_path: pagePath,\n page_title: pageTitle,\n });\n}\n\n/**\n * Track a user action\n */\nexport async function trackUserAction(\n action: string,\n category: string,\n label?: string,\n value?: number\n): Promise<void> {\n await trackEvent(action, {\n event_category: category,\n event_label: label,\n value,\n });\n}\n\n/**\n * Track sign up event\n */\nexport async function trackSignUp(method: string): Promise<void> {\n await trackEvent('sign_up', { method });\n}\n\n/**\n * Track login event\n */\nexport async function trackLogin(method: string): Promise<void> {\n await trackEvent('login', { method });\n}\n\n// Re-export types\nexport type { Analytics };\n\n"]}
package/dist/index.d.mts CHANGED
@@ -1,10 +1,10 @@
1
- export { FirebaseConfig, addDocument, app, auth, db, deleteDocument, getCollection, getCollectionRef, getCurrentUser, getDocRef, getDocument, getFirebaseAnalytics, getFirebaseApp, getFirebaseAuth, getFirebaseConfig, getFirebaseFirestore, getFirebaseStorage, getGoogleRedirectResult, initializeFirebase, resetPassword, sendVerificationEmail, setDocument, signInWithEmail, signInWithGoogle, signInWithGoogleRedirect, signOut, signUpWithEmail, storage, subscribeToAuthState, subscribeToCollection, subscribeToDocument, trackEvent, trackLogin, trackPageView, trackSignUp, trackUserAction, updateDocument, updateUserProfile, waitForAuthState } from './firebase/index.mjs';
1
+ export { FirebaseConfig, addDocument, app, auth, db, deleteDocument, deleteUser, getAuth, getCollection, getCollectionRef, getCurrentUser, getDocRef, getDocument, getFirebaseAnalytics, getFirebaseApp, getFirebaseAuth, getFirebaseConfig, getFirebaseFirestore, getFirebaseStorage, getGoogleRedirectResult, initializeFirebase, reauthenticateWithGoogle, reauthenticateWithPassword, resetPassword, sendVerificationEmail, setDocument, signInWithEmail, signInWithGoogle, signInWithGoogleRedirect, signOut, signUpWithEmail, storage, subscribeToAuthState, subscribeToCollection, subscribeToDocument, trackEvent, trackLogin, trackPageView, trackSignUp, trackUserAction, updateDocument, updateUserEmail, updateUserPassword, updateUserProfile, waitForAuthState } from './firebase/index.mjs';
2
2
  export { d as deleteFile, g as generateFilePath, a as getFileMetadata, b as getFileURL, c as getStorageRef, l as listFiles, u as updateFileMetadata, e as uploadFile, f as uploadFileWithProgress } from './storage-BU_rfYCi.mjs';
3
3
  export { UseAuthReturn, UseStorageReturn, useAuth, useCollection, useDocument, useFirestoreMutation, useStorage } from './hooks/index.mjs';
4
4
  export { AdminRoute, AdminRouteProps, AuthContextValue, AuthProvider, AuthProviderProps, OwnerRoute, StaffRoute, UserData, useAuthContext, withAuth } from './context/index.mjs';
5
5
  export { ApiResponse, AsyncState, BaseDocument, ExtendedUser, FieldError, FilterOperator, FilterParam, KYCStatus, PaginatedResponse, PaginationParams, SortDirection, SortParams, Subscription, UserProfile, UserRole, ValidationResult } from './types/index.mjs';
6
6
  export { Analytics } from 'firebase/analytics';
7
- export { Auth, User, UserCredential } from 'firebase/auth';
7
+ export { Auth, AuthCredential, User, UserCredential } from 'firebase/auth';
8
8
  export { CollectionReference, DocumentData, DocumentReference, DocumentSnapshot, FieldValue, OrderByDirection, QueryConstraint, QuerySnapshot, Timestamp, Unsubscribe, WhereFilterOp, limit, orderBy, query, serverTimestamp, startAfter, where } from 'firebase/firestore';
9
9
  export { FullMetadata, ListResult, StorageReference, UploadMetadata, UploadTask } from 'firebase/storage';
10
10
  import 'firebase/app';
package/dist/index.d.ts CHANGED
@@ -1,10 +1,10 @@
1
- export { FirebaseConfig, addDocument, app, auth, db, deleteDocument, getCollection, getCollectionRef, getCurrentUser, getDocRef, getDocument, getFirebaseAnalytics, getFirebaseApp, getFirebaseAuth, getFirebaseConfig, getFirebaseFirestore, getFirebaseStorage, getGoogleRedirectResult, initializeFirebase, resetPassword, sendVerificationEmail, setDocument, signInWithEmail, signInWithGoogle, signInWithGoogleRedirect, signOut, signUpWithEmail, storage, subscribeToAuthState, subscribeToCollection, subscribeToDocument, trackEvent, trackLogin, trackPageView, trackSignUp, trackUserAction, updateDocument, updateUserProfile, waitForAuthState } from './firebase/index.js';
1
+ export { FirebaseConfig, addDocument, app, auth, db, deleteDocument, deleteUser, getAuth, getCollection, getCollectionRef, getCurrentUser, getDocRef, getDocument, getFirebaseAnalytics, getFirebaseApp, getFirebaseAuth, getFirebaseConfig, getFirebaseFirestore, getFirebaseStorage, getGoogleRedirectResult, initializeFirebase, reauthenticateWithGoogle, reauthenticateWithPassword, resetPassword, sendVerificationEmail, setDocument, signInWithEmail, signInWithGoogle, signInWithGoogleRedirect, signOut, signUpWithEmail, storage, subscribeToAuthState, subscribeToCollection, subscribeToDocument, trackEvent, trackLogin, trackPageView, trackSignUp, trackUserAction, updateDocument, updateUserEmail, updateUserPassword, updateUserProfile, waitForAuthState } from './firebase/index.js';
2
2
  export { d as deleteFile, g as generateFilePath, a as getFileMetadata, b as getFileURL, c as getStorageRef, l as listFiles, u as updateFileMetadata, e as uploadFile, f as uploadFileWithProgress } from './storage-BU_rfYCi.js';
3
3
  export { UseAuthReturn, UseStorageReturn, useAuth, useCollection, useDocument, useFirestoreMutation, useStorage } from './hooks/index.js';
4
4
  export { AdminRoute, AdminRouteProps, AuthContextValue, AuthProvider, AuthProviderProps, OwnerRoute, StaffRoute, UserData, useAuthContext, withAuth } from './context/index.js';
5
5
  export { ApiResponse, AsyncState, BaseDocument, ExtendedUser, FieldError, FilterOperator, FilterParam, KYCStatus, PaginatedResponse, PaginationParams, SortDirection, SortParams, Subscription, UserProfile, UserRole, ValidationResult } from './types/index.js';
6
6
  export { Analytics } from 'firebase/analytics';
7
- export { Auth, User, UserCredential } from 'firebase/auth';
7
+ export { Auth, AuthCredential, User, UserCredential } from 'firebase/auth';
8
8
  export { CollectionReference, DocumentData, DocumentReference, DocumentSnapshot, FieldValue, OrderByDirection, QueryConstraint, QuerySnapshot, Timestamp, Unsubscribe, WhereFilterOp, limit, orderBy, query, serverTimestamp, startAfter, where } from 'firebase/firestore';
9
9
  export { FullMetadata, ListResult, StorageReference, UploadMetadata, UploadTask } from 'firebase/storage';
10
10
  import 'firebase/app';