@digilogiclabs/saas-factory-auth 5.1.1 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/platform/index.ts","../src/components/AuthProvider.tsx","../src/core/IAuthProvider.ts","../src/core/SupabaseAuthProvider.ts","../src/config/env.ts","../src/types.ts","../src/core/SupabaseSSRAuthProvider.ts","../src/core/FirebaseAuthProvider.ts","../src/native/runtime.ts","../src/config/storage.ts","../src/core/AuthProviderFactory.ts","../src/store/authStore.ts","../src/components/web/AuthForm/index.tsx","../src/hooks/useAuthForm.ts","../src/hooks/useAuth.ts","../src/components/web/LoginForm.tsx","../src/components/web/SignupForm.tsx","../src/utils/supabase.ts","../src/actions/index.ts","../src/middleware/withAuth.ts"],"sourcesContent":["// src/index.ts\n\n// ═══════════════════════════════════════════════════════════════\n// PLATFORM CORE RE-EXPORTS (IAuth interface and adapters)\n// These provide the unified platform-core authentication abstraction\n// Types are aliased to avoid conflicts with local types\n// ═══════════════════════════════════════════════════════════════\n\nexport {\n // IAuth interface and types (renamed to avoid conflicts with local types)\n type IAuth,\n type AuthUser as IAuthUser,\n type AuthSession as IAuthSession,\n type AuthResult as IAuthResult,\n type AuthError as IAuthError,\n type AuthErrorCode as IAuthErrorCode,\n type SignInWithEmailOptions,\n type SignUpWithEmailOptions,\n type ResetPasswordOptions,\n type UpdatePasswordOptions,\n type OAuthProvider as IAuthOAuthProvider,\n type OAuthOptions,\n type OAuthResult,\n type SignInWithPhoneOptions,\n type VerifyPhoneOtpOptions,\n type SignInWithMagicLinkOptions,\n type MfaFactorType,\n type MfaFactor,\n type MfaChallenge,\n type EnrollMfaOptions,\n type EnrollMfaResult,\n type VerifyMfaOptions,\n type UpdateUserOptions,\n type DeleteAccountOptions,\n type AuthEventType,\n type AuthStateChangeCallback,\n type AuthConfig as IAuthConfig,\n type AuthStorage,\n // Helpers\n createAuthError,\n isAuthError,\n AuthErrorMessages,\n generateSecureToken,\n // Memory adapter for testing\n MemoryAuth,\n} from \"@digilogiclabs/platform-core\";\n\n// Production adapters\nexport {\n SupabaseAuth,\n type SupabaseAuthConfig,\n} from \"@digilogiclabs/platform-core\";\n\n// ═══════════════════════════════════════════════════════════════\n// PLATFORM CORE INTEGRATION (observability)\n// ═══════════════════════════════════════════════════════════════\n\nexport {\n setPlatform,\n clearPlatform,\n hasPlatform,\n logAuthEvent,\n trackAuthMetric,\n} from \"./platform/index.js\";\n\n// ═══════════════════════════════════════════════════════════════\n// COMPONENTS\n// ═══════════════════════════════════════════════════════════════\n\nexport { AuthProvider } from \"./components/AuthProvider.js\";\nexport { LoginForm, SignupForm } from \"./components/web/index.js\";\n\n// ═══════════════════════════════════════════════════════════════\n// HOOKS\n// ═══════════════════════════════════════════════════════════════\n\nexport { useAuth } from \"./hooks/useAuth.js\";\n\n// ═══════════════════════════════════════════════════════════════\n// CORE\n// ═══════════════════════════════════════════════════════════════\n\nexport { AuthProviderFactory } from \"./core/AuthProviderFactory.js\";\nexport type { IAuthProvider } from \"./core/IAuthProvider.js\";\nexport { AuthError, AuthErrorType } from \"./core/IAuthProvider.js\";\n\n// SSR-aware Supabase provider for Next.js middleware authentication\nexport { SupabaseSSRAuthProvider } from \"./core/SupabaseSSRAuthProvider.js\";\n\n// ═══════════════════════════════════════════════════════════════\n// ACTIONS\n// ═══════════════════════════════════════════════════════════════\n\nexport {\n signUp,\n signIn,\n signOut,\n resetPassword,\n updateProfile,\n signInWithOAuth,\n signInWithMagicLink,\n} from \"./actions/index.js\";\n\n// ═══════════════════════════════════════════════════════════════\n// TYPES\n// ═══════════════════════════════════════════════════════════════\n\nexport type {\n User,\n AuthSession,\n OAuthProvider,\n AuthMode,\n UserRole,\n PasswordConfig,\n AuthConfig,\n AuthFormProps,\n AuthStore,\n} from \"./types.js\";\nexport { AuthEvent, AuthProviderType } from \"./types.js\";\n\n// ═══════════════════════════════════════════════════════════════\n// UTILITIES\n// ═══════════════════════════════════════════════════════════════\n\nexport { createClient as createSupabaseClient } from \"./utils/supabase.js\";\n\n// ═══════════════════════════════════════════════════════════════\n// MIDDLEWARE\n// ═══════════════════════════════════════════════════════════════\n\nexport { withAuth } from \"./middleware/withAuth.js\";\n","/**\n * Platform Core Integration\n *\n * Optional integration with @digilogiclabs/platform-core for:\n * - Email sending (password reset, verification)\n * - Logging (auth events)\n * - Metrics (auth success/failure tracking)\n */\n\nimport type { IEmail, ILogger, IMetrics } from \"@digilogiclabs/platform-core\";\n\ninterface PlatformServices {\n email?: IEmail;\n logger?: ILogger;\n metrics?: IMetrics;\n}\n\nlet platformServices: PlatformServices = {};\n\n/**\n * Set the platform services for auth package to use\n *\n * @example\n * ```typescript\n * import { createPlatform } from '@digilogiclabs/platform-core';\n * import { setPlatform } from '@digilogiclabs/saas-factory-auth';\n *\n * const platform = createPlatform();\n * setPlatform({\n * email: platform.email,\n * logger: platform.logger,\n * metrics: platform.metrics,\n * });\n * ```\n */\nexport function setPlatform(services: PlatformServices): void {\n platformServices = { ...platformServices, ...services };\n}\n\n/**\n * Clear platform services (useful for testing)\n */\nexport function clearPlatform(): void {\n platformServices = {};\n}\n\n/**\n * Get the configured email service\n */\nexport function getEmailService(): IEmail | undefined {\n return platformServices.email;\n}\n\n/**\n * Get the configured logger\n */\nexport function getLogger(): ILogger | undefined {\n return platformServices.logger;\n}\n\n/**\n * Get the configured metrics\n */\nexport function getMetrics(): IMetrics | undefined {\n return platformServices.metrics;\n}\n\n/**\n * Check if platform services are configured\n */\nexport function hasPlatform(): boolean {\n return Object.keys(platformServices).length > 0;\n}\n\n/**\n * Log an auth event if logger is configured\n */\nexport function logAuthEvent(\n level: \"debug\" | \"info\" | \"warn\" | \"error\",\n message: string,\n meta?: Record<string, unknown>,\n): void {\n const logger = platformServices.logger;\n if (logger) {\n logger[level](message, meta);\n }\n}\n\n/**\n * Track an auth metric if metrics are configured\n */\nexport function trackAuthMetric(\n name: string,\n value: number = 1,\n tags?: Record<string, string | number | boolean>,\n): void {\n const metrics = platformServices.metrics;\n if (metrics) {\n metrics.increment(`auth.${name}`, value, tags);\n }\n}\n\n/**\n * Send an email using platform-core if configured\n * Falls back to provider's email if not configured\n */\nexport async function sendAuthEmail(options: {\n to: string | { email: string; name?: string };\n subject: string;\n html: string;\n text?: string;\n}): Promise<boolean> {\n const email = platformServices.email;\n if (email) {\n try {\n // Convert string to EmailAddress format\n const toAddress =\n typeof options.to === \"string\" ? { email: options.to } : options.to;\n\n await email.send({\n to: toAddress,\n subject: options.subject,\n html: options.html,\n text: options.text,\n });\n trackAuthMetric(\"email.sent\", 1, { type: \"auth\" });\n return true;\n } catch (error) {\n const toEmail =\n typeof options.to === \"string\" ? options.to : options.to.email;\n logAuthEvent(\"error\", \"Failed to send auth email\", {\n error,\n to: toEmail,\n });\n trackAuthMetric(\"email.failed\", 1, { type: \"auth\" });\n return false;\n }\n }\n return false;\n}\n","\"use client\";\n\nimport React, { useEffect, useRef } from \"react\";\nimport { AuthProviderFactory } from \"../core/AuthProviderFactory\";\nimport { IAuthProvider } from \"../core/IAuthProvider\";\nimport { useAuthStore } from \"../store/authStore\";\nimport { AuthEvent } from \"../types\";\n\nexport interface AuthProviderProps {\n children: React.ReactNode;\n onAuthChange?: (event: AuthEvent) => void;\n autoSignIn?: boolean;\n}\n\nexport const AuthProvider: React.FC<AuthProviderProps> = ({\n children,\n onAuthChange,\n autoSignIn = true,\n}) => {\n const authProviderRef = useRef<IAuthProvider | null>(null);\n const unsubscribeRef = useRef<(() => void) | null>(null);\n\n // Get all store methods at component level (not in callbacks)\n const setUser = useAuthStore((state) => state.setUser);\n const setSession = useAuthStore((state) => state.setSession);\n const setLoading = useAuthStore((state) => state.setLoading);\n const setError = useAuthStore((state) => state.setError);\n const setAuthProvider = useAuthStore((state) => state.setAuthProvider);\n\n useEffect(() => {\n let mounted = true;\n\n const initializeAuth = async () => {\n try {\n // Create auth provider instance\n const provider = await AuthProviderFactory.getProviderFromEnvironment({\n validateConfig: true,\n useSingleton: true,\n });\n\n if (!mounted) return;\n\n authProviderRef.current = provider;\n\n // CRITICAL: Set the auth provider in the store so useAuth hook can use it\n setAuthProvider(provider);\n\n // Set up auth state listener with stable references\n const subscription = provider.onAuthStateChange((event, session) => {\n if (!mounted) return;\n\n // Update store state using stable references from component level\n if (session) {\n setUser(session.user);\n setSession(session);\n setError(null);\n } else {\n setUser(null);\n setSession(null);\n }\n\n // Call custom callback if provided\n if (onAuthChange) {\n onAuthChange(event);\n }\n\n // Set loading to false after auth state change\n setLoading(false);\n });\n\n // Store unsubscribe function\n if (subscription?.unsubscribe) {\n unsubscribeRef.current = subscription.unsubscribe;\n }\n\n // Get initial session if autoSignIn is enabled\n if (autoSignIn) {\n try {\n const currentSession = await provider.getSession();\n if (mounted) {\n if (currentSession) {\n setUser(currentSession.user);\n setSession(currentSession);\n } else {\n // No session, but not an error\n setUser(null);\n setSession(null);\n }\n setLoading(false);\n }\n } catch (error) {\n console.error(\"Failed to get initial session:\", error);\n if (mounted) {\n // Session fetch failed, but app can still work\n setError(\n error instanceof Error\n ? error\n : new Error(\"Failed to get session\"),\n );\n setLoading(false);\n }\n }\n } else {\n // Not auto-signing in, just set loading to false\n if (mounted) {\n setLoading(false);\n }\n }\n } catch (error) {\n console.error(\"Failed to initialize auth provider:\", error);\n if (mounted) {\n setError(\n error instanceof Error\n ? error\n : new Error(\"Failed to initialize auth\"),\n );\n setLoading(false);\n }\n }\n };\n\n initializeAuth();\n\n return () => {\n mounted = false;\n if (unsubscribeRef.current) {\n unsubscribeRef.current();\n unsubscribeRef.current = null;\n }\n };\n }, []); // Empty dependency array since we're using stable store setters\n\n return <>{children}</>;\n};\n","import { User, AuthSession, AuthEvent } from \"../types\";\n\n/**\n * Authentication error types for better error handling\n */\nexport enum AuthErrorType {\n INVALID_CREDENTIALS = \"INVALID_CREDENTIALS\",\n USER_NOT_FOUND = \"USER_NOT_FOUND\",\n EMAIL_ALREADY_EXISTS = \"EMAIL_ALREADY_EXISTS\",\n WEAK_PASSWORD = \"WEAK_PASSWORD\",\n NETWORK_ERROR = \"NETWORK_ERROR\",\n PROVIDER_ERROR = \"PROVIDER_ERROR\",\n CONFIGURATION_ERROR = \"CONFIGURATION_ERROR\",\n VALIDATION_ERROR = \"VALIDATION_ERROR\",\n UNKNOWN = \"UNKNOWN\",\n}\n\n/**\n * Custom authentication error class\n */\nexport class AuthError extends Error {\n public readonly timestamp: Date;\n public readonly code: string;\n\n constructor(\n public readonly type: AuthErrorType,\n message: string,\n public readonly originalError?: unknown,\n public readonly context?: Record<string, unknown>,\n ) {\n super(message);\n this.name = \"AuthError\";\n this.timestamp = new Date();\n this.code = type;\n\n // Ensure proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, AuthError.prototype);\n\n // Capture stack trace if available\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, AuthError);\n }\n }\n\n /**\n * Convert error to JSON for logging/debugging\n */\n toJSON() {\n const originalErrorDetails =\n this.originalError instanceof Error\n ? {\n name: this.originalError.name,\n message: this.originalError.message,\n stack: this.originalError.stack,\n }\n : this.originalError\n ? { message: String(this.originalError) }\n : undefined;\n\n return {\n name: this.name,\n type: this.type,\n code: this.code,\n message: this.message,\n timestamp: this.timestamp.toISOString(),\n context: this.context,\n originalError: originalErrorDetails,\n };\n }\n\n /**\n * Check if error is of a specific type\n */\n isType(type: AuthErrorType): boolean {\n return this.type === type;\n }\n\n /**\n * Check if error is retryable\n */\n isRetryable(): boolean {\n return [AuthErrorType.NETWORK_ERROR, AuthErrorType.PROVIDER_ERROR].includes(\n this.type,\n );\n }\n}\n\n/**\n * OAuth provider types - re-export from types for backward compatibility\n */\nexport type OAuthProvider =\n | \"google\"\n | \"github\"\n | \"facebook\"\n | \"twitter\"\n | \"discord\"\n | \"apple\"\n | \"microsoft\"\n | \"linkedin\"\n | \"spotify\"\n | \"twitch\"\n | \"slack\"\n | \"notion\";\n\n/**\n * Common user interface - alias for backward compatibility\n */\nexport type CommonUser = User;\n\n/**\n * Authentication provider interface that abstracts authentication operations\n * across different backends (Supabase, Firebase, etc.)\n */\nexport interface IAuthProvider {\n /**\n * Sign in with email and password\n * @param email User's email address\n * @param password User's password (required for email/password authentication)\n * @returns Promise resolving to an object containing user, session, and error\n */\n signIn(\n email: string,\n password: string,\n ): Promise<{\n user: User | null;\n session: AuthSession | null;\n error: AuthError | null;\n }>;\n\n /**\n * Sign up with email and password\n * @param email User's email address\n * @param password User's password (required for email/password authentication)\n * @returns Promise resolving to an object containing user, session, and error\n */\n signUp(\n email: string,\n password: string,\n ): Promise<{\n user: User | null;\n session: AuthSession | null;\n error: AuthError | null;\n }>;\n\n /**\n * Sign in with OAuth provider\n * @param provider OAuth provider name\n * @param redirectTo Optional redirect URL after authentication\n * @returns Promise that resolves when OAuth flow is initiated\n */\n signInWithOAuth(provider: OAuthProvider, redirectTo?: string): Promise<void>;\n\n /**\n * Sign in with magic link (passwordless authentication)\n * @param email User's email address\n * @param redirectTo Optional redirect URL after email verification\n * @returns Promise that resolves when magic link is sent\n */\n signInWithMagicLink(email: string, redirectTo?: string): Promise<void>;\n\n /**\n * Sign out the current user\n * @returns Promise resolving to an object containing error\n */\n signOut(): Promise<{ error: AuthError | null }>;\n\n /**\n * Get the current authenticated user\n * @returns Promise resolving to the current user or null if not authenticated\n */\n getUser(): Promise<User | null>;\n\n /**\n * Get the current authentication session\n * @returns Promise resolving to the current session or null if not authenticated\n */\n getSession(): Promise<AuthSession | null>;\n\n /**\n * Send password reset email\n * @param email User's email address\n * @returns Promise resolving to an object containing error\n */\n resetPassword(email: string): Promise<{ error: AuthError | null }>;\n\n /**\n * Update user profile information\n * @param updates Partial user data to update\n * @returns Promise resolving to updated user and error information\n */\n updateProfile(updates: {\n name?: string;\n firstName?: string;\n lastName?: string;\n fullName?: string;\n avatar?: string;\n phone?: string;\n website?: string;\n bio?: string;\n [key: string]: unknown;\n }): Promise<{ user: User | null; error: AuthError | null }>;\n\n /**\n * Listen for authentication state changes\n * @param callback Function called when auth state changes\n * @returns Object containing subscription data for cleanup\n */\n onAuthStateChange(\n callback: (event: AuthEvent, session: AuthSession | null) => void,\n ): { unsubscribe: () => void };\n\n /**\n * Validate provider configuration\n * @returns Promise that resolves if configuration is valid\n */\n validateConfiguration?(): Promise<void>;\n}\n\n// Re-export types for convenience\nexport type { User, AuthSession, AuthEvent };\n","import {\n createClient,\n SupabaseClient,\n User as SupabaseUser,\n Session as SupabaseSession,\n} from \"@supabase/supabase-js\";\nimport {\n IAuthProvider,\n AuthError,\n AuthErrorType,\n OAuthProvider,\n} from \"./IAuthProvider\";\nimport { getAuthConfig, validateConfig } from \"../config/env\";\nimport { IAuthStorage } from \"../config/storage\";\nimport { User, AuthSession, AuthEvent } from \"../types\";\n\n/**\n * Maps Supabase user to User interface with comprehensive profile support\n */\nconst mapSupabaseUserToUser = (\n supabaseUser: SupabaseUser | null,\n): User | null => {\n if (!supabaseUser) return null;\n\n const metadata = supabaseUser.user_metadata || {};\n\n return {\n id: supabaseUser.id,\n email: supabaseUser.email,\n emailVerified: supabaseUser.email_confirmed_at ? true : false,\n\n // Name fields with fallback logic\n name: metadata.name || metadata.full_name || metadata.display_name || null,\n firstName: metadata.firstName || metadata.first_name || null,\n lastName: metadata.lastName || metadata.last_name || null,\n fullName: metadata.fullName || metadata.full_name || metadata.name || null,\n\n // Profile fields\n avatar: metadata.avatar || metadata.avatar_url || metadata.picture || null,\n phone: metadata.phone || metadata.phone_number || null,\n website: metadata.website || null,\n bio: metadata.bio || null,\n\n // Additional metadata\n locale: metadata.locale || null,\n timezone: metadata.timezone || null,\n dateOfBirth: metadata.dateOfBirth || metadata.date_of_birth || null,\n\n // Timestamps\n createdAt: supabaseUser.created_at,\n updatedAt: supabaseUser.updated_at,\n lastSignInAt: supabaseUser.last_sign_in_at,\n\n // OAuth provider data\n providerData:\n supabaseUser.identities?.reduce((acc, identity) => {\n if (identity.provider && identity.identity_data) {\n acc[identity.provider] = {\n id: identity.id,\n username:\n identity.identity_data.user_name ||\n identity.identity_data.login ||\n null,\n raw: identity.identity_data,\n };\n }\n return acc;\n }, {} as any) || {},\n\n // Include all other metadata for backward compatibility\n ...metadata,\n };\n};\n\n/**\n * Maps Supabase error to AuthError with better network error detection\n */\nconst mapSupabaseError = (error: unknown): AuthError => {\n if (error instanceof AuthError) {\n return error;\n }\n\n // Handle cases where error is not an object or doesn't have a message\n if (typeof error !== \"object\" || error === null || !(\"message\" in error)) {\n return new AuthError(\n AuthErrorType.UNKNOWN,\n \"An unknown error occurred\",\n error,\n );\n }\n\n const err = error as { message: string; code?: string };\n const message = err.message || \"Unknown error occurred\";\n const code = err.code;\n\n // Check for network/DNS errors first\n if (\n code === \"ERR_NAME_NOT_RESOLVED\" ||\n message.includes(\"ERR_NAME_NOT_RESOLVED\")\n ) {\n return new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"Invalid Supabase URL. Please check your NEXT_PUBLIC_SUPABASE_URL configuration.\",\n err,\n );\n }\n\n if (message.includes(\"Failed to fetch\") || message.includes(\"NetworkError\")) {\n return new AuthError(\n AuthErrorType.NETWORK_ERROR,\n \"Network error. Please check your internet connection and Supabase URL.\",\n err,\n );\n }\n\n if (message.includes(\"Invalid login credentials\")) {\n return new AuthError(AuthErrorType.INVALID_CREDENTIALS, message, err);\n }\n if (message.includes(\"User not found\")) {\n return new AuthError(AuthErrorType.USER_NOT_FOUND, message, err);\n }\n if (message.includes(\"User already registered\")) {\n return new AuthError(AuthErrorType.EMAIL_ALREADY_EXISTS, message, err);\n }\n if (message.includes(\"Password should be\")) {\n return new AuthError(AuthErrorType.WEAK_PASSWORD, message, err);\n }\n if (message.includes(\"network\") || message.includes(\"fetch\")) {\n return new AuthError(AuthErrorType.NETWORK_ERROR, message, err);\n }\n\n return new AuthError(AuthErrorType.PROVIDER_ERROR, message, err);\n};\n\n/**\n * Validates email format\n */\nconst validateEmail = (email: string): void => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email)) {\n throw new AuthError(AuthErrorType.VALIDATION_ERROR, \"Invalid email format\");\n }\n};\n\n/**\n * Validates Supabase URL format\n */\nconst validateSupabaseUrl = (url: string): void => {\n // Check if URL is properly formatted\n if (!url || !url.startsWith(\"http\")) {\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"Supabase URL must start with http:// or https://\",\n );\n }\n\n // Check if it's a valid Supabase domain\n const urlObj = new URL(url);\n if (\n !urlObj.hostname.endsWith(\".supabase.co\") &&\n !urlObj.hostname.includes(\"localhost\")\n ) {\n console.warn(\"Warning: URL does not appear to be a valid Supabase URL\");\n }\n\n // Check for common mistakes\n if (url.includes(\"supabase.co/\") && !url.includes(\".supabase.co\")) {\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"Invalid Supabase URL format. Should be: https://[project-ref].supabase.co\",\n );\n }\n};\n\n/**\n * Supabase authentication provider implementation\n */\nexport class SupabaseAuthProvider implements IAuthProvider {\n private client: SupabaseClient;\n private storage: IAuthStorage;\n\n constructor(storage: IAuthStorage) {\n this.storage = storage;\n const config = getAuthConfig();\n\n // Validate configuration\n validateConfig(config, \"supabase\");\n\n // Additional URL validation\n try {\n validateSupabaseUrl(config.supabaseUrl!);\n } catch (error) {\n console.error(\"Supabase URL validation failed:\", error);\n throw error;\n }\n\n // Create Supabase client\n try {\n this.client = createClient(config.supabaseUrl!, config.supabaseAnonKey!, {\n auth: {\n storage: {\n getItem: (key: string) => this.storage.getItem(key),\n setItem: (key: string, value: string) =>\n this.storage.setItem(key, value),\n removeItem: (key: string) => this.storage.removeItem(key),\n },\n autoRefreshToken: true,\n persistSession: true,\n detectSessionInUrl: true,\n },\n });\n } catch (error) {\n console.error(\"Failed to create Supabase client:\", error);\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"Failed to initialize Supabase client. Please check your configuration.\",\n error,\n );\n }\n }\n\n /**\n * Validates Supabase configuration\n */\n async validateConfiguration(): Promise<void> {\n try {\n const config = getAuthConfig();\n validateConfig(config, \"supabase\");\n validateSupabaseUrl(config.supabaseUrl!);\n\n // Try to make a test request to verify connectivity\n const { error } = await this.client.auth.getSession();\n if (error && error.message.includes(\"ERR_NAME_NOT_RESOLVED\")) {\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"Cannot connect to Supabase. Please verify your NEXT_PUBLIC_SUPABASE_URL is correct.\",\n error,\n );\n }\n } catch (error) {\n if (error instanceof AuthError) {\n throw error;\n }\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n error instanceof Error\n ? error.message\n : \"Invalid Supabase configuration\",\n );\n }\n }\n\n async signIn(\n email: string,\n password: string,\n ): Promise<{\n user: User | null;\n session: AuthSession | null;\n error: AuthError | null;\n }> {\n try {\n validateEmail(email);\n\n const { data, error } = await this.client.auth.signInWithPassword({\n email,\n password,\n });\n\n if (error) {\n return { user: null, session: null, error: mapSupabaseError(error) };\n }\n\n const user = mapSupabaseUserToUser(data.user);\n const session: AuthSession | null = data.session\n ? {\n user: user!,\n access_token: data.session.access_token,\n refresh_token: data.session.refresh_token,\n expires_at: data.session.expires_at,\n }\n : null;\n\n return { user, session, error: null };\n } catch (error) {\n return {\n user: null,\n session: null,\n error: mapSupabaseError(error),\n };\n }\n }\n\n async signUp(\n email: string,\n password: string,\n ): Promise<{\n user: User | null;\n session: AuthSession | null;\n error: AuthError | null;\n }> {\n try {\n validateEmail(email);\n const { data, error } = await this.client.auth.signUp({\n email,\n password,\n });\n if (error) {\n return { user: null, session: null, error: mapSupabaseError(error) };\n }\n const user = mapSupabaseUserToUser(data.user);\n const session: AuthSession | null = data.session\n ? {\n user: user!,\n access_token: data.session.access_token,\n refresh_token: data.session.refresh_token,\n expires_at: data.session.expires_at,\n }\n : null;\n return { user, session, error: null };\n } catch (error) {\n return { user: null, session: null, error: mapSupabaseError(error) };\n }\n }\n\n async signInWithOAuth(\n provider: OAuthProvider,\n redirectTo?: string,\n ): Promise<void> {\n try {\n const options: { redirectTo?: string } = {};\n if (redirectTo) {\n options.redirectTo = redirectTo;\n }\n\n // Map our OAuthProvider types to Supabase's supported providers\n let supabaseProvider: string = provider;\n\n // Handle providers that might need mapping\n switch (provider) {\n case \"microsoft\":\n supabaseProvider = \"azure\"; // Supabase uses 'azure' for Microsoft\n break;\n case \"apple\":\n case \"google\":\n case \"github\":\n case \"facebook\":\n case \"twitter\":\n case \"discord\":\n case \"linkedin\":\n case \"spotify\":\n case \"twitch\":\n case \"slack\":\n case \"notion\":\n supabaseProvider = provider; // These are supported directly\n break;\n default:\n throw new AuthError(\n AuthErrorType.PROVIDER_ERROR,\n `OAuth provider '${provider}' is not supported by Supabase`,\n );\n }\n\n const { error } = await this.client.auth.signInWithOAuth({\n provider: supabaseProvider as any, // Type assertion needed due to Supabase's strict typing\n options,\n });\n\n if (error) {\n throw mapSupabaseError(error);\n }\n } catch (error) {\n throw mapSupabaseError(error);\n }\n }\n\n async signInWithMagicLink(email: string, redirectTo?: string): Promise<void> {\n try {\n validateEmail(email);\n const options: { emailRedirectTo?: string } = {};\n if (redirectTo) {\n options.emailRedirectTo = redirectTo;\n }\n const { error } = await this.client.auth.signInWithOtp({\n email,\n options,\n });\n if (error) {\n throw mapSupabaseError(error);\n }\n } catch (error) {\n throw mapSupabaseError(error);\n }\n }\n\n async signOut(): Promise<{ error: AuthError | null }> {\n try {\n const { error } = await this.client.auth.signOut();\n if (error) {\n return { error: mapSupabaseError(error) };\n }\n return { error: null };\n } catch (error) {\n return { error: mapSupabaseError(error) };\n }\n }\n\n async getUser(): Promise<User | null> {\n try {\n const {\n data: { user },\n error,\n } = await this.client.auth.getUser();\n if (error) {\n throw mapSupabaseError(error);\n }\n return mapSupabaseUserToUser(user);\n } catch (error) {\n throw mapSupabaseError(error);\n }\n }\n\n async getSession(): Promise<AuthSession | null> {\n try {\n const {\n data: { session },\n error,\n } = await this.client.auth.getSession();\n\n if (error) {\n // Don't throw for \"Auth session missing\" during initialization\n if (error.message === \"Auth session missing!\") {\n return null;\n }\n throw mapSupabaseError(error);\n }\n\n if (!session) return null;\n\n const user = mapSupabaseUserToUser(session.user);\n return {\n user: user!,\n access_token: session.access_token,\n refresh_token: session.refresh_token,\n expires_at: session.expires_at,\n };\n } catch (error) {\n if (error instanceof AuthError) {\n throw error;\n }\n throw new AuthError(\n AuthErrorType.PROVIDER_ERROR,\n \"Get session failed\",\n error,\n );\n }\n }\n\n onAuthStateChange(\n callback: (event: AuthEvent, session: AuthSession | null) => void,\n ): { unsubscribe: () => void } {\n const {\n data: { subscription },\n } = this.client.auth.onAuthStateChange(\n (event, session: SupabaseSession | null) => {\n // Map Supabase events to our AuthEvent enum\n let authEvent: AuthEvent;\n switch (event) {\n case \"SIGNED_IN\":\n authEvent = AuthEvent.SIGNED_IN;\n break;\n case \"SIGNED_OUT\":\n authEvent = AuthEvent.SIGNED_OUT;\n break;\n case \"TOKEN_REFRESHED\":\n authEvent = AuthEvent.TOKEN_REFRESHED;\n break;\n case \"USER_UPDATED\":\n authEvent = AuthEvent.USER_UPDATED;\n break;\n case \"INITIAL_SESSION\":\n // Handle initial session event\n authEvent = session ? AuthEvent.SIGNED_IN : AuthEvent.SIGNED_OUT;\n break;\n case \"MFA_CHALLENGE_VERIFIED\":\n authEvent = AuthEvent.USER_UPDATED;\n break;\n case \"PASSWORD_RECOVERY\":\n authEvent = AuthEvent.USER_UPDATED;\n break;\n default:\n console.warn(`Unhandled Supabase auth event: ${event}`);\n authEvent = AuthEvent.USER_UPDATED;\n }\n\n // Map session to our format\n const user = mapSupabaseUserToUser(session?.user || null);\n const authSession: AuthSession | null =\n user && session\n ? {\n user: user,\n access_token: session.access_token,\n refresh_token: session.refresh_token,\n expires_at: session.expires_at,\n }\n : null;\n\n // Call the callback with mapped values\n callback(authEvent, authSession);\n },\n );\n\n return { unsubscribe: () => subscription.unsubscribe() };\n }\n\n async resetPassword(email: string): Promise<{ error: AuthError | null }> {\n try {\n validateEmail(email);\n const { error } = await this.client.auth.resetPasswordForEmail(email);\n if (error) {\n return { error: mapSupabaseError(error) };\n }\n return { error: null };\n } catch (error) {\n return { error: mapSupabaseError(error) };\n }\n }\n\n async updateProfile(updates: {\n name?: string;\n firstName?: string;\n lastName?: string;\n fullName?: string;\n avatar?: string;\n phone?: string;\n website?: string;\n bio?: string;\n [key: string]: unknown;\n }): Promise<{ user: User | null; error: AuthError | null }> {\n try {\n // Get current session to ensure user is authenticated\n const {\n data: { session },\n error: sessionError,\n } = await this.client.auth.getSession();\n\n if (sessionError || !session?.user) {\n return {\n user: null,\n error: new AuthError(\n AuthErrorType.INVALID_CREDENTIALS,\n \"User must be authenticated to update profile\",\n ),\n };\n }\n\n // Prepare the user metadata update with current metadata as base\n const userMetadata: Record<string, unknown> = {\n ...session.user.user_metadata,\n };\n\n // Handle name fields with intelligent merging\n if (updates.name !== undefined) {\n userMetadata.name = updates.name;\n userMetadata.display_name = updates.name; // Also set display_name for compatibility\n }\n\n if (updates.firstName !== undefined) {\n userMetadata.firstName = updates.firstName;\n userMetadata.first_name = updates.firstName; // Supabase convention\n }\n\n if (updates.lastName !== undefined) {\n userMetadata.lastName = updates.lastName;\n userMetadata.last_name = updates.lastName; // Supabase convention\n }\n\n if (updates.fullName !== undefined) {\n userMetadata.fullName = updates.fullName;\n userMetadata.full_name = updates.fullName; // Supabase convention\n userMetadata.name = updates.fullName; // Primary name field\n userMetadata.display_name = updates.fullName; // Display name\n }\n\n // If firstName and lastName are provided but no fullName, construct it\n if (\n (updates.firstName !== undefined || updates.lastName !== undefined) &&\n updates.fullName === undefined\n ) {\n const firstName =\n updates.firstName ||\n userMetadata.firstName ||\n userMetadata.first_name ||\n \"\";\n const lastName =\n updates.lastName ||\n userMetadata.lastName ||\n userMetadata.last_name ||\n \"\";\n const constructedFullName = `${firstName} ${lastName}`.trim();\n if (constructedFullName) {\n userMetadata.full_name = constructedFullName;\n userMetadata.fullName = constructedFullName;\n userMetadata.name = constructedFullName;\n }\n }\n\n // Profile fields with multiple format support\n if (updates.avatar !== undefined) {\n userMetadata.avatar = updates.avatar;\n userMetadata.avatar_url = updates.avatar; // Supabase/OAuth convention\n userMetadata.picture = updates.avatar; // OAuth provider convention\n }\n\n if (updates.phone !== undefined) {\n userMetadata.phone = updates.phone;\n userMetadata.phone_number = updates.phone; // Alternative format\n }\n\n if (updates.website !== undefined) {\n userMetadata.website = updates.website;\n }\n\n if (updates.bio !== undefined) {\n userMetadata.bio = updates.bio;\n }\n\n // Handle any additional custom fields\n const knownFields = [\n \"name\",\n \"firstName\",\n \"lastName\",\n \"fullName\",\n \"avatar\",\n \"phone\",\n \"website\",\n \"bio\",\n ];\n Object.keys(updates).forEach((key) => {\n if (!knownFields.includes(key)) {\n userMetadata[key] = updates[key];\n }\n });\n\n // Update user metadata in Supabase\n const { data, error } = await this.client.auth.updateUser({\n data: userMetadata,\n });\n\n if (error) {\n return { user: null, error: mapSupabaseError(error) };\n }\n\n // Return updated user with enhanced mapping\n const updatedUser = mapSupabaseUserToUser(data.user);\n return { user: updatedUser, error: null };\n } catch (error) {\n return { user: null, error: mapSupabaseError(error) };\n }\n }\n}\n","import { AuthConfig } from \"../types\";\n\n/**\n * Gets authentication configuration from environment variables\n */\nexport const getAuthConfig = (): Partial<AuthConfig> => {\n const config: Partial<AuthConfig> = {};\n\n // For Next.js/Web environments\n if (typeof process !== \"undefined\" && process.env) {\n const supabaseUrl =\n process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL;\n const supabaseAnonKey =\n process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY ||\n process.env.SUPABASE_ANON_KEY;\n const firebaseApiKey =\n process.env.NEXT_PUBLIC_FIREBASE_API_KEY || process.env.FIREBASE_API_KEY;\n const firebaseAuthDomain =\n process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN ||\n process.env.FIREBASE_AUTH_DOMAIN;\n const firebaseProjectId =\n process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID ||\n process.env.FIREBASE_PROJECT_ID;\n\n if (supabaseUrl) config.supabaseUrl = supabaseUrl;\n if (supabaseAnonKey) config.supabaseAnonKey = supabaseAnonKey;\n if (firebaseApiKey) config.firebaseApiKey = firebaseApiKey;\n if (firebaseAuthDomain) config.firebaseAuthDomain = firebaseAuthDomain;\n if (firebaseProjectId) config.firebaseProjectId = firebaseProjectId;\n\n return config;\n }\n\n // For React Native with expo-constants\n try {\n const Constants = new Function(\n \"return require('expo-constants').default\",\n )();\n const expoConfig = Constants.expoConfig?.extra || {};\n if (expoConfig.supabaseUrl) config.supabaseUrl = expoConfig.supabaseUrl;\n if (expoConfig.supabaseAnonKey)\n config.supabaseAnonKey = expoConfig.supabaseAnonKey;\n if (expoConfig.firebaseApiKey)\n config.firebaseApiKey = expoConfig.firebaseApiKey;\n if (expoConfig.firebaseAuthDomain)\n config.firebaseAuthDomain = expoConfig.firebaseAuthDomain;\n if (expoConfig.firebaseProjectId)\n config.firebaseProjectId = expoConfig.firebaseProjectId;\n return config;\n } catch {\n // Expo constants not available\n }\n\n // For React Native with react-native-config\n try {\n const RNConfig = new Function(\n \"return require('react-native-config').default\",\n )();\n if (RNConfig.SUPABASE_URL) config.supabaseUrl = RNConfig.SUPABASE_URL;\n if (RNConfig.SUPABASE_ANON_KEY)\n config.supabaseAnonKey = RNConfig.SUPABASE_ANON_KEY;\n if (RNConfig.FIREBASE_API_KEY)\n config.firebaseApiKey = RNConfig.FIREBASE_API_KEY;\n if (RNConfig.FIREBASE_AUTH_DOMAIN)\n config.firebaseAuthDomain = RNConfig.FIREBASE_AUTH_DOMAIN;\n if (RNConfig.FIREBASE_PROJECT_ID)\n config.firebaseProjectId = RNConfig.FIREBASE_PROJECT_ID;\n return config;\n } catch {\n // react-native-config not available\n }\n\n // Fallback to empty config\n return {};\n};\n\n/**\n * Validates configuration for a specific provider\n */\nexport const validateConfig = (\n config: Partial<AuthConfig>,\n provider: \"supabase\" | \"firebase\",\n): void => {\n if (provider === \"supabase\") {\n if (!config.supabaseUrl || !config.supabaseAnonKey) {\n throw new Error(\n \"Supabase configuration is incomplete. \" +\n \"Please ensure NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY are set.\",\n );\n }\n }\n\n if (provider === \"firebase\") {\n if (\n !config.firebaseApiKey ||\n !config.firebaseAuthDomain ||\n !config.firebaseProjectId\n ) {\n throw new Error(\n \"Firebase configuration is incomplete. \" +\n \"Please ensure NEXT_PUBLIC_FIREBASE_API_KEY, NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN, \" +\n \"and NEXT_PUBLIC_FIREBASE_PROJECT_ID are set.\",\n );\n }\n }\n};\n","/**\n * Base user profile information\n */\nexport interface UserProfile {\n /** User's display name */\n name?: string | null;\n /** User's first name */\n firstName?: string | null;\n /** User's last name */\n lastName?: string | null;\n /** User's full name */\n fullName?: string | null;\n /** User's avatar/profile picture URL */\n avatar?: string | null;\n /** User's phone number */\n phone?: string | null;\n /** User's date of birth */\n dateOfBirth?: string | null;\n /** User's preferred language */\n locale?: string | null;\n /** User's timezone */\n timezone?: string | null;\n /** User's website URL */\n website?: string | null;\n /** User's bio/description */\n bio?: string | null;\n}\n\n/**\n * User metadata from OAuth providers\n */\nexport interface UserMetadata {\n /** Provider-specific user data */\n [provider: string]: {\n /** Provider's unique user ID */\n id?: string;\n /** Username on the provider */\n username?: string;\n /** Provider-specific data */\n raw?: Record<string, unknown>;\n };\n}\n\n/**\n * User interface representing authenticated user data\n */\nexport interface User extends UserProfile {\n /** Unique user identifier */\n id: string;\n /** User's email address */\n email?: string | undefined;\n /** User's email verification status */\n emailVerified?: boolean;\n /** User roles for RBAC */\n roles?: UserRole[];\n /** User permissions */\n permissions?: string[];\n /** Account creation timestamp */\n createdAt?: string | Date;\n /** Last update timestamp */\n updatedAt?: string | Date;\n /** Last sign-in timestamp */\n lastSignInAt?: string | Date;\n /** OAuth provider metadata */\n providerData?: UserMetadata;\n /** Custom user attributes */\n customClaims?: Record<string, unknown>;\n /** Two-factor authentication enabled */\n twoFactorEnabled?: boolean;\n /** User account status */\n status?: \"active\" | \"inactive\" | \"suspended\" | \"pending\";\n /** Provider-specific data for backward compatibility */\n [key: string]: unknown;\n}\n\n/**\n * Authentication session containing user and token information\n */\nexport interface AuthSession {\n user: User;\n access_token: string;\n refresh_token?: string | undefined;\n expires_at?: number | undefined;\n token_type?: string | undefined;\n issued_at?: number | undefined;\n refreshed_at?: number | undefined;\n}\n\n/**\n * Authentication events that can occur during auth state changes\n */\nexport enum AuthEvent {\n SIGNED_IN = \"SIGNED_IN\",\n SIGNED_OUT = \"SIGNED_OUT\",\n TOKEN_REFRESHED = \"TOKEN_REFRESHED\",\n USER_UPDATED = \"USER_UPDATED\",\n}\n\n/**\n * Supported authentication provider types\n */\nexport enum AuthProviderType {\n SUPABASE = \"supabase\",\n FIREBASE = \"firebase\",\n}\n\n/**\n * OAuth provider types supported by the auth system\n */\nexport type OAuthProvider =\n | \"google\"\n | \"github\"\n | \"facebook\"\n | \"twitter\"\n | \"discord\"\n | \"apple\"\n | \"microsoft\"\n | \"linkedin\"\n | \"spotify\"\n | \"twitch\"\n | \"slack\"\n | \"notion\";\n\n/**\n * Authentication form modes\n */\nexport type AuthMode = \"signIn\" | \"signUp\" | \"resetPassword\" | \"magicLink\";\n\n/**\n * User roles for RBAC (Role-Based Access Control)\n */\nexport type UserRole =\n | \"admin\"\n | \"user\"\n | \"moderator\"\n | \"guest\"\n | \"owner\"\n | \"editor\"\n | \"viewer\"\n | \"contributor\"\n | \"manager\"\n | \"developer\"\n | \"analyst\"\n | \"support\";\n\n/**\n * Password validation configuration\n */\nexport interface PasswordConfig {\n minLength?: number;\n requireUppercase?: boolean;\n requireLowercase?: boolean;\n requireNumbers?: boolean;\n requireSpecialChars?: boolean;\n}\n\n/**\n * Authentication configuration interface\n */\nexport interface AuthConfig {\n // Supabase configuration\n supabaseUrl?: string;\n supabaseAnonKey?: string;\n\n // Firebase configuration\n firebaseApiKey?: string;\n firebaseAuthDomain?: string;\n firebaseProjectId?: string;\n\n // General auth settings\n redirectTo?: string;\n redirectUrl?: string; // Alias for redirectTo\n autoRefreshToken?: boolean;\n persistSession?: boolean;\n maxLoginAttempts?: number;\n lockoutDuration?: number;\n jwtExpiryTime?: number;\n require2FA?: boolean;\n\n // Password requirements (both names for backward compatibility)\n password?: PasswordConfig;\n passwordRequirements?: PasswordConfig;\n}\n\n/**\n * OAuth result data for React Native deep linking\n */\nexport interface AuthResult {\n user: User | null;\n session: AuthSession | null;\n error?: Error | null;\n}\n\n/**\n * Props for AuthForm component\n */\nexport interface AuthFormProps {\n defaultMode?: AuthMode;\n onSuccess?: (() => void) | undefined;\n onError?: ((error: Error) => void) | undefined;\n redirectTo?: string | undefined;\n redirectUrl?: string | undefined; // Alias for redirectTo (React Native compatibility)\n providers?: OAuthProvider[] | undefined;\n allowMagicLink?: boolean | undefined;\n className?: string | undefined;\n // React Native specific props\n onOAuthSuccess?: ((result: AuthResult) => void) | undefined;\n appScheme?: string | undefined; // For React Native deep linking\n}\n\n/**\n * Zustand store interface for authentication state and actions\n * This represents the actual store hook that components will use\n */\nimport { IAuthProvider } from \"./core/IAuthProvider\";\n\nexport interface AuthStore {\n // State\n user: User | null;\n session: AuthSession | null; // Added session to the store\n loading: boolean;\n error: Error | null; // Changed error type to Error | null\n\n // Basic auth actions\n setUser: (user: User | null) => void; // Renamed from updateUser\n setSession: (session: AuthSession | null) => void; // Added setSession\n setLoading: (loading: boolean) => void;\n setError: (error: Error | null) => void; // Changed error type to Error | null\n setAuthProvider: (provider: IAuthProvider) => void; // Added setAuthProvider\n signIn: (email: string, password: string) => Promise<void>;\n signUp: (email: string, password: string) => Promise<void>;\n signOut: () => Promise<void>;\n resetPassword: (email: string) => Promise<void>;\n updateProfile: (updates: {\n name?: string;\n firstName?: string;\n lastName?: string;\n fullName?: string;\n avatar?: string;\n phone?: string;\n website?: string;\n bio?: string;\n [key: string]: unknown;\n }) => Promise<User | null>;\n\n // Extended auth methods (needed by UI components)\n signInWithOAuth: (\n provider: OAuthProvider,\n redirectTo?: string,\n ) => Promise<void>;\n signInWithMagicLink: (email: string, redirectTo?: string) => Promise<void>;\n getUser: () => Promise<User | null>;\n getSession: () => Promise<AuthSession | null>;\n refreshSession: () => Promise<AuthSession | null>;\n onAuthStateChange: (\n callback: (event: AuthEvent, session: AuthSession | null) => void,\n ) => { unsubscribe: () => void };\n}\n","import { createBrowserClient } from \"@supabase/ssr\";\nimport type {\n SupabaseClient,\n User as SupabaseUser,\n Session as SupabaseSession,\n} from \"@supabase/supabase-js\";\nimport {\n IAuthProvider,\n AuthError,\n AuthErrorType,\n OAuthProvider,\n} from \"./IAuthProvider\";\nimport { getAuthConfig, validateConfig } from \"../config/env\";\nimport { User, AuthSession, AuthEvent } from \"../types\";\n\n/**\n * Maps Supabase user to User interface with comprehensive profile support\n */\nconst mapSupabaseUserToUser = (\n supabaseUser: SupabaseUser | null,\n): User | null => {\n if (!supabaseUser) return null;\n\n const metadata = supabaseUser.user_metadata || {};\n\n return {\n id: supabaseUser.id,\n email: supabaseUser.email,\n emailVerified: supabaseUser.email_confirmed_at ? true : false,\n\n // Name fields with fallback logic\n name: metadata.name || metadata.full_name || metadata.display_name || null,\n firstName: metadata.firstName || metadata.first_name || null,\n lastName: metadata.lastName || metadata.last_name || null,\n fullName: metadata.fullName || metadata.full_name || metadata.name || null,\n\n // Profile fields\n avatar: metadata.avatar || metadata.avatar_url || metadata.picture || null,\n phone: metadata.phone || metadata.phone_number || null,\n website: metadata.website || null,\n bio: metadata.bio || null,\n\n // Additional metadata\n locale: metadata.locale || null,\n timezone: metadata.timezone || null,\n dateOfBirth: metadata.dateOfBirth || metadata.date_of_birth || null,\n\n // Timestamps\n createdAt: supabaseUser.created_at,\n updatedAt: supabaseUser.updated_at,\n lastSignInAt: supabaseUser.last_sign_in_at,\n\n // OAuth provider data\n providerData:\n supabaseUser.identities?.reduce(\n (acc, identity) => {\n if (identity.provider && identity.identity_data) {\n acc[identity.provider] = {\n id: identity.id,\n username: (identity.identity_data.user_name ||\n identity.identity_data.login ||\n undefined) as string | undefined,\n raw: identity.identity_data,\n };\n }\n return acc;\n },\n {} as Record<\n string,\n { id?: string; username?: string; raw?: Record<string, unknown> }\n >,\n ) || {},\n\n // Include all other metadata for backward compatibility\n ...metadata,\n };\n};\n\n/**\n * Maps Supabase error to AuthError with better network error detection\n */\nconst mapSupabaseError = (error: unknown): AuthError => {\n if (error instanceof AuthError) {\n return error;\n }\n\n // Handle cases where error is not an object or doesn't have a message\n if (typeof error !== \"object\" || error === null || !(\"message\" in error)) {\n return new AuthError(\n AuthErrorType.UNKNOWN,\n \"An unknown error occurred\",\n error,\n );\n }\n\n const err = error as { message: string; code?: string };\n const message = err.message || \"Unknown error occurred\";\n const code = err.code;\n\n // Check for network/DNS errors first\n if (\n code === \"ERR_NAME_NOT_RESOLVED\" ||\n message.includes(\"ERR_NAME_NOT_RESOLVED\")\n ) {\n return new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"Invalid Supabase URL. Please check your NEXT_PUBLIC_SUPABASE_URL configuration.\",\n err,\n );\n }\n\n if (message.includes(\"Failed to fetch\") || message.includes(\"NetworkError\")) {\n return new AuthError(\n AuthErrorType.NETWORK_ERROR,\n \"Network error. Please check your internet connection and Supabase URL.\",\n err,\n );\n }\n\n if (message.includes(\"Invalid login credentials\")) {\n return new AuthError(AuthErrorType.INVALID_CREDENTIALS, message, err);\n }\n if (message.includes(\"User not found\")) {\n return new AuthError(AuthErrorType.USER_NOT_FOUND, message, err);\n }\n if (message.includes(\"User already registered\")) {\n return new AuthError(AuthErrorType.EMAIL_ALREADY_EXISTS, message, err);\n }\n if (message.includes(\"Password should be\")) {\n return new AuthError(AuthErrorType.WEAK_PASSWORD, message, err);\n }\n if (message.includes(\"network\") || message.includes(\"fetch\")) {\n return new AuthError(AuthErrorType.NETWORK_ERROR, message, err);\n }\n\n return new AuthError(AuthErrorType.PROVIDER_ERROR, message, err);\n};\n\n/**\n * Validates email format\n */\nconst validateEmail = (email: string): void => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email)) {\n throw new AuthError(AuthErrorType.VALIDATION_ERROR, \"Invalid email format\");\n }\n};\n\n/**\n * Validates Supabase URL format\n */\nconst validateSupabaseUrl = (url: string): void => {\n // Check if URL is properly formatted\n if (!url || !url.startsWith(\"http\")) {\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"Supabase URL must start with http:// or https://\",\n );\n }\n\n // Check if it's a valid Supabase domain\n const urlObj = new URL(url);\n if (\n !urlObj.hostname.endsWith(\".supabase.co\") &&\n !urlObj.hostname.includes(\"localhost\")\n ) {\n console.warn(\"Warning: URL does not appear to be a valid Supabase URL\");\n }\n\n // Check for common mistakes\n if (url.includes(\"supabase.co/\") && !url.includes(\".supabase.co\")) {\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"Invalid Supabase URL format. Should be: https://[project-ref].supabase.co\",\n );\n }\n};\n\n/**\n * SSR-aware Supabase authentication provider implementation.\n *\n * This provider uses @supabase/ssr's createBrowserClient which properly handles\n * httpOnly cookies for server-side rendering frameworks like Next.js.\n *\n * Use this provider when:\n * - Your app uses Next.js with middleware authentication\n * - You need server-side session validation\n * - You're using Supabase SSR features\n *\n * @example\n * ```typescript\n * import { SupabaseSSRAuthProvider } from '@digilogiclabs/saas-factory-auth';\n *\n * // In your auth configuration\n * const provider = new SupabaseSSRAuthProvider();\n * ```\n */\nexport class SupabaseSSRAuthProvider implements IAuthProvider {\n private client: SupabaseClient;\n\n constructor() {\n const config = getAuthConfig();\n\n // Validate configuration\n validateConfig(config, \"supabase\");\n\n // Additional URL validation\n try {\n validateSupabaseUrl(config.supabaseUrl!);\n } catch (error) {\n console.error(\"Supabase URL validation failed:\", error);\n throw error;\n }\n\n // Create SSR-aware Supabase client using createBrowserClient\n // This client automatically handles httpOnly cookies for middleware auth\n try {\n this.client = createBrowserClient(\n config.supabaseUrl!,\n config.supabaseAnonKey!,\n );\n } catch (error) {\n console.error(\"Failed to create Supabase SSR client:\", error);\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"Failed to initialize Supabase SSR client. Please check your configuration.\",\n error,\n );\n }\n }\n\n /**\n * Validates Supabase configuration\n */\n async validateConfiguration(): Promise<void> {\n try {\n const config = getAuthConfig();\n validateConfig(config, \"supabase\");\n validateSupabaseUrl(config.supabaseUrl!);\n\n // Try to make a test request to verify connectivity\n const { error } = await this.client.auth.getSession();\n if (error && error.message.includes(\"ERR_NAME_NOT_RESOLVED\")) {\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"Cannot connect to Supabase. Please verify your NEXT_PUBLIC_SUPABASE_URL is correct.\",\n error,\n );\n }\n } catch (error) {\n if (error instanceof AuthError) {\n throw error;\n }\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n error instanceof Error\n ? error.message\n : \"Invalid Supabase configuration\",\n );\n }\n }\n\n async signIn(\n email: string,\n password: string,\n ): Promise<{\n user: User | null;\n session: AuthSession | null;\n error: AuthError | null;\n }> {\n try {\n validateEmail(email);\n\n const { data, error } = await this.client.auth.signInWithPassword({\n email,\n password,\n });\n\n if (error) {\n return { user: null, session: null, error: mapSupabaseError(error) };\n }\n\n const user = mapSupabaseUserToUser(data.user);\n const session: AuthSession | null = data.session\n ? {\n user: user!,\n access_token: data.session.access_token,\n refresh_token: data.session.refresh_token,\n expires_at: data.session.expires_at,\n }\n : null;\n\n return { user, session, error: null };\n } catch (error) {\n return {\n user: null,\n session: null,\n error: mapSupabaseError(error),\n };\n }\n }\n\n async signUp(\n email: string,\n password: string,\n ): Promise<{\n user: User | null;\n session: AuthSession | null;\n error: AuthError | null;\n }> {\n try {\n validateEmail(email);\n const { data, error } = await this.client.auth.signUp({\n email,\n password,\n });\n if (error) {\n return { user: null, session: null, error: mapSupabaseError(error) };\n }\n const user = mapSupabaseUserToUser(data.user);\n const session: AuthSession | null = data.session\n ? {\n user: user!,\n access_token: data.session.access_token,\n refresh_token: data.session.refresh_token,\n expires_at: data.session.expires_at,\n }\n : null;\n return { user, session, error: null };\n } catch (error) {\n return { user: null, session: null, error: mapSupabaseError(error) };\n }\n }\n\n async signInWithOAuth(\n provider: OAuthProvider,\n redirectTo?: string,\n ): Promise<void> {\n try {\n const options: { redirectTo?: string } = {};\n if (redirectTo) {\n options.redirectTo = redirectTo;\n }\n\n // Map our OAuthProvider types to Supabase's supported providers\n let supabaseProvider: string = provider;\n\n // Handle providers that might need mapping\n switch (provider) {\n case \"microsoft\":\n supabaseProvider = \"azure\"; // Supabase uses 'azure' for Microsoft\n break;\n case \"apple\":\n case \"google\":\n case \"github\":\n case \"facebook\":\n case \"twitter\":\n case \"discord\":\n case \"linkedin\":\n case \"spotify\":\n case \"twitch\":\n case \"slack\":\n case \"notion\":\n supabaseProvider = provider; // These are supported directly\n break;\n default:\n throw new AuthError(\n AuthErrorType.PROVIDER_ERROR,\n `OAuth provider '${provider}' is not supported by Supabase`,\n );\n }\n\n const { error } = await this.client.auth.signInWithOAuth({\n provider: supabaseProvider as Parameters<\n typeof this.client.auth.signInWithOAuth\n >[0][\"provider\"],\n options,\n });\n\n if (error) {\n throw mapSupabaseError(error);\n }\n } catch (error) {\n throw mapSupabaseError(error);\n }\n }\n\n async signInWithMagicLink(email: string, redirectTo?: string): Promise<void> {\n try {\n validateEmail(email);\n const options: { emailRedirectTo?: string } = {};\n if (redirectTo) {\n options.emailRedirectTo = redirectTo;\n }\n const { error } = await this.client.auth.signInWithOtp({\n email,\n options,\n });\n if (error) {\n throw mapSupabaseError(error);\n }\n } catch (error) {\n throw mapSupabaseError(error);\n }\n }\n\n async signOut(): Promise<{ error: AuthError | null }> {\n try {\n const { error } = await this.client.auth.signOut();\n if (error) {\n return { error: mapSupabaseError(error) };\n }\n return { error: null };\n } catch (error) {\n return { error: mapSupabaseError(error) };\n }\n }\n\n async getUser(): Promise<User | null> {\n try {\n const {\n data: { user },\n error,\n } = await this.client.auth.getUser();\n if (error) {\n throw mapSupabaseError(error);\n }\n return mapSupabaseUserToUser(user);\n } catch (error) {\n throw mapSupabaseError(error);\n }\n }\n\n async getSession(): Promise<AuthSession | null> {\n try {\n const {\n data: { session },\n error,\n } = await this.client.auth.getSession();\n\n if (error) {\n // Don't throw for \"Auth session missing\" during initialization\n if (error.message === \"Auth session missing!\") {\n return null;\n }\n throw mapSupabaseError(error);\n }\n\n if (!session) return null;\n\n const user = mapSupabaseUserToUser(session.user);\n return {\n user: user!,\n access_token: session.access_token,\n refresh_token: session.refresh_token,\n expires_at: session.expires_at,\n };\n } catch (error) {\n if (error instanceof AuthError) {\n throw error;\n }\n throw new AuthError(\n AuthErrorType.PROVIDER_ERROR,\n \"Get session failed\",\n error,\n );\n }\n }\n\n onAuthStateChange(\n callback: (event: AuthEvent, session: AuthSession | null) => void,\n ): { unsubscribe: () => void } {\n const {\n data: { subscription },\n } = this.client.auth.onAuthStateChange(\n (event, session: SupabaseSession | null) => {\n // Map Supabase events to our AuthEvent enum\n let authEvent: AuthEvent;\n switch (event) {\n case \"SIGNED_IN\":\n authEvent = AuthEvent.SIGNED_IN;\n break;\n case \"SIGNED_OUT\":\n authEvent = AuthEvent.SIGNED_OUT;\n break;\n case \"TOKEN_REFRESHED\":\n authEvent = AuthEvent.TOKEN_REFRESHED;\n break;\n case \"USER_UPDATED\":\n authEvent = AuthEvent.USER_UPDATED;\n break;\n case \"INITIAL_SESSION\":\n // Handle initial session event\n authEvent = session ? AuthEvent.SIGNED_IN : AuthEvent.SIGNED_OUT;\n break;\n case \"MFA_CHALLENGE_VERIFIED\":\n authEvent = AuthEvent.USER_UPDATED;\n break;\n case \"PASSWORD_RECOVERY\":\n authEvent = AuthEvent.USER_UPDATED;\n break;\n default:\n console.warn(`Unhandled Supabase auth event: ${event}`);\n authEvent = AuthEvent.USER_UPDATED;\n }\n\n // Map session to our format\n const user = mapSupabaseUserToUser(session?.user || null);\n const authSession: AuthSession | null =\n user && session\n ? {\n user: user,\n access_token: session.access_token,\n refresh_token: session.refresh_token,\n expires_at: session.expires_at,\n }\n : null;\n\n // Call the callback with mapped values\n callback(authEvent, authSession);\n },\n );\n\n return { unsubscribe: () => subscription.unsubscribe() };\n }\n\n async resetPassword(email: string): Promise<{ error: AuthError | null }> {\n try {\n validateEmail(email);\n const { error } = await this.client.auth.resetPasswordForEmail(email);\n if (error) {\n return { error: mapSupabaseError(error) };\n }\n return { error: null };\n } catch (error) {\n return { error: mapSupabaseError(error) };\n }\n }\n\n async updateProfile(updates: {\n name?: string;\n firstName?: string;\n lastName?: string;\n fullName?: string;\n avatar?: string;\n phone?: string;\n website?: string;\n bio?: string;\n [key: string]: unknown;\n }): Promise<{ user: User | null; error: AuthError | null }> {\n try {\n // Get current session to ensure user is authenticated\n const {\n data: { session },\n error: sessionError,\n } = await this.client.auth.getSession();\n\n if (sessionError || !session?.user) {\n return {\n user: null,\n error: new AuthError(\n AuthErrorType.INVALID_CREDENTIALS,\n \"User must be authenticated to update profile\",\n ),\n };\n }\n\n // Prepare the user metadata update with current metadata as base\n const userMetadata: Record<string, unknown> = {\n ...session.user.user_metadata,\n };\n\n // Handle name fields with intelligent merging\n if (updates.name !== undefined) {\n userMetadata.name = updates.name;\n userMetadata.display_name = updates.name; // Also set display_name for compatibility\n }\n\n if (updates.firstName !== undefined) {\n userMetadata.firstName = updates.firstName;\n userMetadata.first_name = updates.firstName; // Supabase convention\n }\n\n if (updates.lastName !== undefined) {\n userMetadata.lastName = updates.lastName;\n userMetadata.last_name = updates.lastName; // Supabase convention\n }\n\n if (updates.fullName !== undefined) {\n userMetadata.fullName = updates.fullName;\n userMetadata.full_name = updates.fullName; // Supabase convention\n userMetadata.name = updates.fullName; // Primary name field\n userMetadata.display_name = updates.fullName; // Display name\n }\n\n // If firstName and lastName are provided but no fullName, construct it\n if (\n (updates.firstName !== undefined || updates.lastName !== undefined) &&\n updates.fullName === undefined\n ) {\n const firstName =\n updates.firstName ||\n userMetadata.firstName ||\n userMetadata.first_name ||\n \"\";\n const lastName =\n updates.lastName ||\n userMetadata.lastName ||\n userMetadata.last_name ||\n \"\";\n const constructedFullName = `${firstName} ${lastName}`.trim();\n if (constructedFullName) {\n userMetadata.full_name = constructedFullName;\n userMetadata.fullName = constructedFullName;\n userMetadata.name = constructedFullName;\n }\n }\n\n // Profile fields with multiple format support\n if (updates.avatar !== undefined) {\n userMetadata.avatar = updates.avatar;\n userMetadata.avatar_url = updates.avatar; // Supabase/OAuth convention\n userMetadata.picture = updates.avatar; // OAuth provider convention\n }\n\n if (updates.phone !== undefined) {\n userMetadata.phone = updates.phone;\n userMetadata.phone_number = updates.phone; // Alternative format\n }\n\n if (updates.website !== undefined) {\n userMetadata.website = updates.website;\n }\n\n if (updates.bio !== undefined) {\n userMetadata.bio = updates.bio;\n }\n\n // Handle any additional custom fields\n const knownFields = [\n \"name\",\n \"firstName\",\n \"lastName\",\n \"fullName\",\n \"avatar\",\n \"phone\",\n \"website\",\n \"bio\",\n ];\n Object.keys(updates).forEach((key) => {\n if (!knownFields.includes(key)) {\n userMetadata[key] = updates[key];\n }\n });\n\n // Update user metadata in Supabase\n const { data, error } = await this.client.auth.updateUser({\n data: userMetadata,\n });\n\n if (error) {\n return { user: null, error: mapSupabaseError(error) };\n }\n\n // Return updated user with enhanced mapping\n const updatedUser = mapSupabaseUserToUser(data.user);\n return { user: updatedUser, error: null };\n } catch (error) {\n return { user: null, error: mapSupabaseError(error) };\n }\n }\n\n /**\n * Get the underlying Supabase client for advanced operations.\n * Use with caution - prefer the IAuthProvider methods when possible.\n */\n getClient(): SupabaseClient {\n return this.client;\n }\n}\n","import { initializeApp, FirebaseApp } from \"firebase/app\";\nimport {\n getAuth,\n Auth,\n signInWithEmailAndPassword,\n createUserWithEmailAndPassword,\n signOut as firebaseSignOut,\n sendPasswordResetEmail,\n onAuthStateChanged,\n signInWithPopup,\n GoogleAuthProvider,\n GithubAuthProvider,\n FacebookAuthProvider,\n TwitterAuthProvider,\n OAuthProvider as FirebaseOAuthProvider,\n User as FirebaseUser,\n sendSignInLinkToEmail,\n browserLocalPersistence,\n setPersistence,\n updateProfile as firebaseUpdateProfile,\n} from \"firebase/auth\";\nimport {\n IAuthProvider,\n AuthError,\n AuthErrorType,\n OAuthProvider,\n} from \"./IAuthProvider\";\nimport { getAuthConfig, validateConfig } from \"../config/env\";\nimport { IAuthStorage } from \"../config/storage\";\nimport { User, AuthSession, AuthEvent } from \"../types\";\n\n/**\n * Maps Firebase user to User interface\n */\nconst mapFirebaseUserToUser = (\n firebaseUser: FirebaseUser | null,\n): User | null => {\n if (!firebaseUser) return null;\n return {\n id: firebaseUser.uid,\n email: firebaseUser.email || undefined,\n name: firebaseUser.displayName,\n avatar: firebaseUser.photoURL,\n // Add other Firebase-specific metadata if needed\n phoneNumber: firebaseUser.phoneNumber,\n emailVerified: firebaseUser.emailVerified,\n isAnonymous: firebaseUser.isAnonymous,\n tenantId: firebaseUser.tenantId,\n providerData: firebaseUser.providerData as unknown as User[\"providerData\"],\n creationTime: firebaseUser.metadata?.creationTime,\n lastSignInTime: firebaseUser.metadata?.lastSignInTime,\n };\n};\n\n/**\n * Helper to get access token from Firebase user\n */\nconst getFirebaseAccessToken = async (user: FirebaseUser): Promise<string> => {\n try {\n return await user.getIdToken();\n } catch (error) {\n console.warn(\"Failed to get Firebase ID token:\", error);\n return \"\";\n }\n};\n\n/**\n * Maps Firebase error to AuthError\n */\nconst mapFirebaseError = (error: {\n code?: string;\n message?: string;\n}): AuthError => {\n const code = error.code || \"\";\n const message = error.message || \"Unknown error occurred\";\n\n switch (code) {\n case \"auth/invalid-email\":\n case \"auth/user-disabled\":\n case \"auth/user-not-found\":\n case \"auth/wrong-password\":\n case \"auth/invalid-credential\":\n return new AuthError(AuthErrorType.INVALID_CREDENTIALS, message, error);\n\n case \"auth/email-already-in-use\":\n return new AuthError(AuthErrorType.EMAIL_ALREADY_EXISTS, message, error);\n\n case \"auth/weak-password\":\n return new AuthError(AuthErrorType.WEAK_PASSWORD, message, error);\n\n case \"auth/network-request-failed\":\n case \"auth/timeout\":\n return new AuthError(AuthErrorType.NETWORK_ERROR, message, error);\n\n case \"auth/configuration-not-found\":\n case \"auth/invalid-api-key\":\n return new AuthError(AuthErrorType.CONFIGURATION_ERROR, message, error);\n\n default:\n return new AuthError(AuthErrorType.PROVIDER_ERROR, message, error);\n }\n};\n\n/**\n * Validates email format\n */\nconst validateEmail = (email: string): void => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email)) {\n throw new AuthError(AuthErrorType.VALIDATION_ERROR, \"Invalid email format\");\n }\n};\n\ntype FirebaseOAuthProviderType =\n | GoogleAuthProvider\n | GithubAuthProvider\n | FacebookAuthProvider\n | TwitterAuthProvider\n | FirebaseOAuthProvider;\n\n/**\n * Gets OAuth provider instance for Firebase\n */\nconst getOAuthProvider = (\n provider: OAuthProvider,\n): FirebaseOAuthProviderType => {\n switch (provider) {\n case \"google\":\n return new GoogleAuthProvider();\n case \"github\":\n return new GithubAuthProvider();\n case \"facebook\":\n return new FacebookAuthProvider();\n case \"twitter\":\n return new TwitterAuthProvider();\n case \"apple\": {\n const appleProvider = new FirebaseOAuthProvider(\"apple.com\");\n return appleProvider;\n }\n case \"discord\": {\n const discordProvider = new FirebaseOAuthProvider(\"discord.com\");\n return discordProvider;\n }\n default:\n throw new AuthError(\n AuthErrorType.VALIDATION_ERROR,\n `Unsupported OAuth provider for Firebase: ${provider}`,\n );\n }\n};\n\n/**\n * Firebase authentication provider implementation\n */\nexport class FirebaseAuthProvider implements IAuthProvider {\n private app: FirebaseApp;\n private auth: Auth;\n private storage: IAuthStorage;\n\n constructor(storage: IAuthStorage) {\n this.storage = storage;\n const config = getAuthConfig();\n validateConfig(config, \"firebase\");\n\n this.app = initializeApp({\n apiKey: config.firebaseApiKey!,\n authDomain: config.firebaseAuthDomain!,\n projectId: config.firebaseProjectId!,\n });\n\n this.auth = getAuth(this.app);\n // Explicitly set persistence for clarity and control\n // For web, browserLocalPersistence is often the default, but explicit is better.\n // For React Native, a custom storage solution would be needed here.\n // @ts-expect-error - `setPersistence` is available in web but not all environments.\n setPersistence(this.auth, this.storage || browserLocalPersistence).catch(\n (error) => {\n console.error(\"Failed to set Firebase auth persistence:\", error);\n },\n );\n }\n\n /**\n * Validates Firebase configuration\n */\n async validateConfiguration(): Promise<void> {\n try {\n const config = getAuthConfig();\n validateConfig(config, \"firebase\");\n } catch (error) {\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n error instanceof Error\n ? error.message\n : \"Invalid Firebase configuration\",\n );\n }\n }\n\n async signIn(\n email: string,\n password: string,\n ): Promise<{\n user: User | null;\n session: AuthSession | null;\n error: AuthError | null;\n }> {\n try {\n validateEmail(email);\n\n const userCredential = await signInWithEmailAndPassword(\n this.auth,\n email,\n password,\n );\n const user = mapFirebaseUserToUser(userCredential.user);\n const accessToken = await getFirebaseAccessToken(userCredential.user);\n\n const session: AuthSession | null = user\n ? {\n user: user,\n access_token: accessToken,\n refresh_token: undefined, // Firebase doesn't expose refresh token directly\n expires_at: undefined, // Firebase handles token expiration internally\n }\n : null;\n\n return { user, session, error: null };\n } catch (error) {\n return {\n user: null,\n session: null,\n error: mapFirebaseError(error as { code?: string; message?: string }),\n };\n }\n }\n\n async signUp(\n email: string,\n password: string,\n ): Promise<{\n user: User | null;\n session: AuthSession | null;\n error: AuthError | null;\n }> {\n try {\n validateEmail(email);\n\n const userCredential = await createUserWithEmailAndPassword(\n this.auth,\n email,\n password,\n );\n const user = mapFirebaseUserToUser(userCredential.user);\n const accessToken = await getFirebaseAccessToken(userCredential.user);\n\n const session: AuthSession | null = user\n ? {\n user: user,\n access_token: accessToken,\n refresh_token: undefined,\n expires_at: undefined,\n }\n : null;\n\n return { user, session, error: null };\n } catch (error) {\n return {\n user: null,\n session: null,\n error: mapFirebaseError(error as { code?: string; message?: string }),\n };\n }\n }\n\n async signInWithOAuth(\n provider: OAuthProvider,\n redirectTo?: string,\n ): Promise<void> {\n try {\n const authProvider = getOAuthProvider(provider);\n\n if (redirectTo) {\n console.warn(\n \"redirectTo is not directly supported for Firebase signInWithPopup. \" +\n \"Consider using signInWithRedirect or handling redirects manually.\",\n );\n }\n\n await signInWithPopup(this.auth, authProvider);\n } catch (error) {\n if (error instanceof AuthError) {\n throw error;\n }\n throw mapFirebaseError(error as { code?: string; message?: string });\n }\n }\n\n async signInWithMagicLink(email: string, redirectTo?: string): Promise<void> {\n try {\n validateEmail(email);\n\n if (!redirectTo) {\n throw new AuthError(\n AuthErrorType.VALIDATION_ERROR,\n \"redirectTo is required for Firebase magic link sign-in\",\n );\n }\n\n await sendSignInLinkToEmail(this.auth, email, {\n url: redirectTo,\n handleCodeInApp: true,\n });\n } catch (error) {\n if (error instanceof AuthError) {\n throw error;\n }\n throw mapFirebaseError(error as { code?: string; message?: string });\n }\n }\n\n async signOut(): Promise<{ error: AuthError | null }> {\n try {\n await firebaseSignOut(this.auth);\n return { error: null };\n } catch (error) {\n return { error: mapFirebaseError(error as Error) };\n }\n }\n\n async resetPassword(email: string): Promise<{ error: AuthError | null }> {\n try {\n validateEmail(email);\n\n await sendPasswordResetEmail(this.auth, email);\n return { error: null };\n } catch (error) {\n return {\n error: mapFirebaseError(error as { code?: string; message?: string }),\n };\n }\n }\n\n async getUser(): Promise<User | null> {\n return mapFirebaseUserToUser(this.auth.currentUser);\n }\n\n async getSession(): Promise<AuthSession | null> {\n try {\n const currentUser = this.auth.currentUser;\n if (!currentUser) return null;\n\n const idTokenResult = await currentUser.getIdTokenResult();\n const user = mapFirebaseUserToUser(currentUser);\n\n return {\n user: user!,\n access_token: idTokenResult.token,\n refresh_token: undefined, // Firebase doesn't expose refresh token in IdTokenResult\n expires_at: idTokenResult.expirationTime\n ? new Date(idTokenResult.expirationTime).getTime()\n : undefined,\n };\n } catch (error) {\n throw mapFirebaseError(error as { code?: string; message?: string });\n }\n }\n\n onAuthStateChange(\n callback: (event: AuthEvent, session: AuthSession | null) => void,\n ): { unsubscribe: () => void } {\n const unsubscribe = onAuthStateChanged(this.auth, async (user) => {\n const mappedUser = mapFirebaseUserToUser(user);\n let authEvent: AuthEvent;\n let authSession: AuthSession | null = null;\n\n if (user) {\n authEvent = AuthEvent.SIGNED_IN;\n try {\n const idTokenResult = await user.getIdTokenResult();\n authSession = {\n user: mappedUser!,\n access_token: idTokenResult.token,\n refresh_token: undefined, // Firebase doesn't expose refresh token\n expires_at: idTokenResult.expirationTime\n ? new Date(idTokenResult.expirationTime).getTime()\n : undefined,\n };\n } catch (error) {\n console.error(\n \"Error getting Firebase session in onAuthStateChange:\",\n error,\n );\n // Fallback to basic session\n const accessToken = await getFirebaseAccessToken(user);\n authSession = {\n user: mappedUser!,\n access_token: accessToken,\n refresh_token: undefined,\n expires_at: undefined,\n };\n }\n } else {\n authEvent = AuthEvent.SIGNED_OUT;\n }\n\n callback(authEvent, authSession);\n });\n\n return { unsubscribe };\n }\n\n async updateProfile(updates: {\n name?: string;\n firstName?: string;\n lastName?: string;\n fullName?: string;\n avatar?: string;\n phone?: string;\n website?: string;\n bio?: string;\n [key: string]: unknown;\n }): Promise<{ user: User | null; error: AuthError | null }> {\n try {\n const currentUser = this.auth.currentUser;\n\n if (!currentUser) {\n return {\n user: null,\n error: new AuthError(\n AuthErrorType.INVALID_CREDENTIALS,\n \"User must be authenticated to update profile\",\n ),\n };\n }\n\n // Prepare Firebase profile update (displayName, photoURL are the main supported fields)\n const profileUpdate: {\n displayName?: string | null;\n photoURL?: string | null;\n } = {};\n\n // Firebase native profile fields\n if (updates.name !== undefined) {\n profileUpdate.displayName = updates.name;\n } else if (updates.fullName !== undefined) {\n profileUpdate.displayName = updates.fullName;\n } else if (updates.firstName || updates.lastName) {\n // Combine firstName and lastName if fullName not provided\n const firstName = updates.firstName || \"\";\n const lastName = updates.lastName || \"\";\n profileUpdate.displayName = `${firstName} ${lastName}`.trim() || null;\n }\n\n if (updates.avatar !== undefined) {\n profileUpdate.photoURL = updates.avatar;\n }\n\n // Update Firebase profile for displayName and photoURL\n if (Object.keys(profileUpdate).length > 0) {\n await firebaseUpdateProfile(currentUser, profileUpdate);\n }\n\n // Note: Firebase doesn't have built-in support for extended user metadata like Supabase\n // Additional fields like phone, website, bio, etc., would need to be stored in Firestore\n // or Firebase Realtime Database separately. For now, we'll warn about unsupported fields.\n\n const unsupportedFields = Object.keys(updates).filter(\n (key) =>\n ![\"name\", \"firstName\", \"lastName\", \"fullName\", \"avatar\"].includes(\n key,\n ),\n );\n\n if (unsupportedFields.length > 0) {\n console.warn(\n `Firebase updateProfile: The following fields are not natively supported by Firebase Auth and were ignored: ${unsupportedFields.join(\", \")}.` +\n \" Consider storing extended user data in Firestore or Firebase Realtime Database.\",\n );\n }\n\n // Return updated user\n const updatedUser = mapFirebaseUserToUser(currentUser);\n return { user: updatedUser, error: null };\n } catch (error) {\n return {\n user: null,\n error: mapFirebaseError(error as { code?: string; message?: string }),\n };\n }\n }\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype LinkingType = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ReactNativeModule = any;\n\nexport type AsyncStorageModule = {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\ninterface NativeRuntimeModules {\n reactNative?: ReactNativeModule;\n linking?: LinkingType;\n asyncStorage?: AsyncStorageModule | null;\n}\n\nlet nativeModules: NativeRuntimeModules = {};\n\nexport const registerNativeRuntime = (modules: NativeRuntimeModules): void => {\n nativeModules = { ...nativeModules, ...modules };\n};\n\nexport const getReactNativeRuntime = (): ReactNativeModule | undefined => {\n return nativeModules.reactNative;\n};\n\nexport const getLinkingModule = (): LinkingType | null => {\n if (nativeModules.linking) {\n return nativeModules.linking;\n }\n return nativeModules.reactNative?.Linking ?? null;\n};\n\nexport const getAsyncStorageModule = (): AsyncStorageModule | null => {\n if (nativeModules.asyncStorage) {\n return nativeModules.asyncStorage;\n }\n return nativeModules.reactNative?.AsyncStorage ?? null;\n};\n\nexport const hasRegisteredNativeRuntime = (): boolean => {\n return !!nativeModules.reactNative || !!nativeModules.asyncStorage;\n};\n","import {\n getAsyncStorageModule,\n getReactNativeRuntime,\n hasRegisteredNativeRuntime,\n} from \"../native/runtime\";\n\n/**\n * Storage interface for cross-platform compatibility\n */\nexport interface IAuthStorage {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\n/**\n * Web browser localStorage implementation\n */\nclass BrowserStorage implements IAuthStorage {\n async getItem(key: string): Promise<string | null> {\n try {\n return localStorage.getItem(key);\n } catch {\n console.warn(\"localStorage not available\");\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n try {\n localStorage.setItem(key, value);\n } catch {\n console.warn(\"localStorage setItem failed\");\n }\n }\n\n async removeItem(key: string): Promise<void> {\n try {\n localStorage.removeItem(key);\n } catch {\n console.warn(\"localStorage removeItem failed\");\n }\n }\n}\n\n// Minimal interface for AsyncStorage to avoid `any` type\ninterface AsyncStorage {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\n/**\n * React Native AsyncStorage implementation with improved error handling\n */\nclass ReactNativeStorage implements IAuthStorage {\n private AsyncStorage: AsyncStorage | null = null;\n private initialized = false;\n private warnedUnavailable = false;\n\n constructor() {\n this.initializeAsyncStorage();\n }\n\n private initializeAsyncStorage(force = false) {\n if (!force && this.initialized && this.AsyncStorage) {\n return;\n }\n\n const registeredStorage = getAsyncStorageModule();\n\n if (registeredStorage) {\n this.AsyncStorage = registeredStorage;\n this.initialized = true;\n this.warnedUnavailable = false;\n return;\n }\n\n const legacyStorage = getReactNativeRuntime()?.AsyncStorage ?? null;\n\n if (legacyStorage) {\n this.AsyncStorage = legacyStorage;\n this.initialized = true;\n this.warnedUnavailable = false;\n return;\n }\n\n this.AsyncStorage = null;\n this.initialized = false;\n\n if (!this.warnedUnavailable) {\n console.warn(\n \"AsyncStorage not available - falling back to memory storage\",\n );\n this.warnedUnavailable = true;\n }\n }\n\n private ensureInitialized(): void {\n if (!this.initialized || !this.AsyncStorage) {\n this.initializeAsyncStorage(true);\n }\n }\n\n async getItem(key: string): Promise<string | null> {\n this.ensureInitialized();\n\n if (!this.AsyncStorage || !this.initialized) {\n console.warn(\"AsyncStorage not initialized\");\n return null;\n }\n\n try {\n const value = await this.AsyncStorage.getItem(key);\n return value;\n } catch (error) {\n console.warn(\"AsyncStorage getItem failed:\", error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n this.ensureInitialized();\n\n if (!this.AsyncStorage || !this.initialized) {\n console.warn(\"AsyncStorage not initialized\");\n return;\n }\n\n try {\n await this.AsyncStorage.setItem(key, value);\n } catch (error) {\n console.warn(\"AsyncStorage setItem failed:\", error);\n }\n }\n\n async removeItem(key: string): Promise<void> {\n this.ensureInitialized();\n\n if (!this.AsyncStorage || !this.initialized) {\n console.warn(\"AsyncStorage not initialized\");\n return;\n }\n\n try {\n await this.AsyncStorage.removeItem(key);\n } catch (error) {\n console.warn(\"AsyncStorage removeItem failed:\", error);\n }\n }\n\n /**\n * Check if AsyncStorage is available and initialized\n */\n isAvailable(): boolean {\n this.ensureInitialized();\n return this.initialized && this.AsyncStorage !== null;\n }\n\n /**\n * Clear all stored authentication data\n */\n async clearAuthData(): Promise<void> {\n this.ensureInitialized();\n\n if (!this.AsyncStorage || !this.initialized) return;\n\n try {\n const authKeys = [\n \"supabase.auth.token\",\n \"firebase.auth.token\",\n \"auth.session\",\n \"auth.user\",\n \"auth.provider\",\n ];\n\n await Promise.all(authKeys.map((key) => this.removeItem(key)));\n } catch (error) {\n console.warn(\"Failed to clear auth data:\", error);\n }\n }\n}\n\n/**\n * In-memory storage fallback (for SSR or when other storage is unavailable)\n */\nclass MemoryStorage implements IAuthStorage {\n private storage: Map<string, string> = new Map();\n\n async getItem(key: string): Promise<string | null> {\n return this.storage.get(key) || null;\n }\n\n async setItem(key: string, value: string): Promise<void> {\n this.storage.set(key, value);\n }\n\n async removeItem(key: string): Promise<void> {\n this.storage.delete(key);\n }\n}\n\n/**\n * Detect if we're running in React Native environment\n */\nexport const isReactNative = (): boolean => {\n if (hasRegisteredNativeRuntime()) {\n return true;\n }\n\n if (typeof navigator !== \"undefined\" && navigator.product === \"ReactNative\") {\n return true;\n }\n\n type ReactNativeGlobal = {\n navigator?: { product?: string };\n ReactNativeVersion?: unknown;\n HermesInternal?: unknown;\n nativeFabricUIManager?: unknown;\n __turboModuleProxy?: unknown;\n __DEV__?: boolean;\n window?: unknown;\n document?: unknown;\n };\n\n const globalRef =\n typeof globalThis !== \"undefined\"\n ? (globalThis as ReactNativeGlobal)\n : undefined;\n\n if (globalRef?.navigator?.product === \"ReactNative\") {\n return true;\n }\n\n if (globalRef?.ReactNativeVersion) {\n return true;\n }\n\n if (globalRef?.HermesInternal) {\n return true;\n }\n\n if (globalRef?.nativeFabricUIManager || globalRef?.__turboModuleProxy) {\n return true;\n }\n\n if (\n globalRef?.__DEV__ !== undefined &&\n typeof globalRef.window === \"undefined\" &&\n typeof globalRef.document === \"undefined\"\n ) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Auto-detects platform and returns appropriate storage implementation\n */\nexport const createAuthStorage = (): IAuthStorage => {\n // Check if we're in React Native first (before browser check)\n if (isReactNative()) {\n return new ReactNativeStorage();\n }\n\n // Check if we're in a browser environment\n if (typeof window !== \"undefined\" && window.localStorage) {\n return new BrowserStorage();\n }\n\n // Check for Next.js SSR or Node.js environment\n if (typeof process !== \"undefined\" && process.versions?.node) {\n return new MemoryStorage();\n }\n\n // Fallback to memory storage\n return new MemoryStorage();\n};\n\n/**\n * Get platform-specific storage with additional React Native utilities\n */\nexport const getAuthStorage = (): IAuthStorage & {\n isAvailable?: () => boolean;\n clearAuthData?: () => Promise<void>;\n} => {\n const storage = createAuthStorage();\n\n // Add utility methods for React Native storage\n if (isReactNative() && storage instanceof ReactNativeStorage) {\n return storage as ReactNativeStorage;\n }\n\n return storage;\n};\n","import { IAuthProvider, AuthError, AuthErrorType } from \"./IAuthProvider\";\nimport { SupabaseAuthProvider } from \"./SupabaseAuthProvider\";\nimport { SupabaseSSRAuthProvider } from \"./SupabaseSSRAuthProvider\";\nimport { FirebaseAuthProvider } from \"./FirebaseAuthProvider\";\nimport { getAuthConfig } from \"../config/env\";\nimport { IAuthStorage, createAuthStorage } from \"../config/storage\";\n\n/**\n * Supported authentication provider types\n */\nexport type AuthProviderType = \"supabase\" | \"supabase-ssr\" | \"firebase\";\n\n/**\n * Configuration interface for provider factory\n */\nexport interface AuthProviderConfig {\n /** Provider type to use */\n type: AuthProviderType;\n /** Whether to validate configuration on creation */\n validateConfig?: boolean;\n /** Whether to use singleton pattern */\n useSingleton?: boolean;\n /** Custom storage implementation (optional, not used for SSR provider) */\n storage?: IAuthStorage;\n /**\n * Enable SSR mode for Supabase provider.\n * When true, uses createBrowserClient from @supabase/ssr which handles\n * httpOnly cookies for middleware authentication in Next.js.\n *\n * @default false\n */\n ssr?: boolean;\n}\n\n/**\n * Factory class for creating authentication providers with improved patterns\n */\nexport class AuthProviderFactory {\n private static instances: Map<AuthProviderType, IAuthProvider> = new Map();\n\n /**\n * Gets provider based on environment variables (auto-detection)\n * @param config Optional configuration overrides\n * @returns Authentication provider instance\n */\n static async getProviderFromEnvironment(\n config?: Partial<AuthProviderConfig>,\n ): Promise<IAuthProvider> {\n const detectedType = this.detectProviderFromEnvironment();\n\n return this.getProvider({\n type: detectedType,\n validateConfig: true,\n useSingleton: true,\n ...config,\n });\n }\n\n /**\n * Gets provider instance with configuration\n * @param config Provider configuration\n * @returns Authentication provider instance\n */\n static async getProvider(config: AuthProviderConfig): Promise<IAuthProvider> {\n const {\n type,\n validateConfig = false,\n useSingleton = false,\n storage,\n ssr,\n } = config;\n\n // Determine the effective type for singleton caching\n // When ssr=true with supabase, treat as 'supabase-ssr' for caching purposes\n const effectiveType: AuthProviderType =\n type === \"supabase\" && ssr ? \"supabase-ssr\" : type;\n\n // Return singleton instance if requested and exists\n if (useSingleton && this.instances.has(effectiveType)) {\n const instance = this.instances.get(effectiveType)!;\n if (validateConfig && instance.validateConfiguration) {\n await instance.validateConfiguration();\n }\n return instance;\n }\n\n // Create new instance\n const provider = this.createProvider(type, storage, ssr);\n\n // Validate configuration if requested\n if (validateConfig && provider.validateConfiguration) {\n await provider.validateConfiguration();\n }\n\n // Store singleton if requested\n if (useSingleton) {\n this.instances.set(effectiveType, provider);\n }\n\n return provider;\n }\n\n /**\n * Creates a new provider instance without caching\n * @param type Provider type\n * @param storage Optional custom storage implementation\n * @param ssr Whether to use SSR mode (for Supabase)\n * @returns Authentication provider instance\n */\n static createProvider(\n type: AuthProviderType,\n storage?: IAuthStorage,\n ssr?: boolean,\n ): IAuthProvider {\n const authStorage = storage || createAuthStorage();\n\n switch (type) {\n case \"supabase\":\n // Use SSR provider if ssr flag is set\n if (ssr) {\n return new SupabaseSSRAuthProvider();\n }\n return new SupabaseAuthProvider(authStorage);\n case \"supabase-ssr\":\n // Explicit SSR provider type\n return new SupabaseSSRAuthProvider();\n case \"firebase\":\n return new FirebaseAuthProvider(authStorage);\n default:\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n `Unsupported authentication provider: ${type}. Supported providers: supabase, supabase-ssr, firebase`,\n );\n }\n }\n\n /**\n * Detects provider type from environment variables\n * @returns Detected provider type\n */\n private static detectProviderFromEnvironment(): AuthProviderType {\n const config = getAuthConfig();\n\n // Check for Supabase environment variables\n const hasSupabaseConfig = !!(config.supabaseUrl && config.supabaseAnonKey);\n\n // Check for Firebase environment variables\n const hasFirebaseConfig = !!(\n config.firebaseApiKey &&\n config.firebaseAuthDomain &&\n config.firebaseProjectId\n );\n\n // Explicit provider selection via environment variable\n const explicitProvider = this.getExplicitProvider();\n if (explicitProvider && this.isValidProviderType(explicitProvider)) {\n return explicitProvider;\n }\n\n // Auto-detection based on available configuration\n if (hasSupabaseConfig && !hasFirebaseConfig) {\n return \"supabase\";\n }\n\n if (hasFirebaseConfig && !hasSupabaseConfig) {\n return \"firebase\";\n }\n\n // Both configurations present - prefer explicit or default to Supabase\n if (hasSupabaseConfig && hasFirebaseConfig) {\n console.warn(\n \"Both Supabase and Firebase configurations detected. \" +\n \"Set AUTH_PROVIDER environment variable to explicitly choose a provider. \" +\n \"Defaulting to Supabase.\",\n );\n return \"supabase\";\n }\n\n // No configuration found\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"No authentication provider configuration found. \" +\n \"Please configure either Supabase or Firebase environment variables.\",\n );\n }\n\n /**\n * Gets explicit provider from environment variables (platform-agnostic)\n */\n private static getExplicitProvider(): string | undefined {\n // Try different environment variable patterns based on platform\n if (typeof process !== \"undefined\" && process.env) {\n return process.env.NEXT_PUBLIC_AUTH_PROVIDER || process.env.AUTH_PROVIDER;\n }\n\n // For React Native with expo-constants\n try {\n const Constants = new Function(\n \"return require('expo-constants').default\",\n )();\n return Constants.expoConfig?.extra?.authProvider;\n } catch {\n // Expo constants not available\n }\n\n // For React Native with react-native-config\n try {\n const Config = new Function(\n \"return require('react-native-config').default\",\n )();\n return Config.AUTH_PROVIDER;\n } catch {\n // react-native-config not available\n }\n\n return undefined;\n }\n\n /**\n * Validates if a string is a valid provider type\n * @param type String to validate\n * @returns True if valid provider type\n */\n private static isValidProviderType(type: string): type is AuthProviderType {\n return (\n type === \"supabase\" || type === \"supabase-ssr\" || type === \"firebase\"\n );\n }\n\n /**\n * Gets list of supported provider types\n * @returns Array of supported provider types\n */\n static getSupportedProviders(): AuthProviderType[] {\n return [\"supabase\", \"supabase-ssr\", \"firebase\"];\n }\n\n /**\n * Checks if a provider type is supported\n * @param type Provider type to check\n * @returns True if supported\n */\n static isProviderSupported(type: string): type is AuthProviderType {\n return this.isValidProviderType(type);\n }\n\n /**\n * Clears singleton instances (useful for testing)\n */\n static clearInstances(): void {\n this.instances.clear();\n }\n\n /**\n * Gets current singleton instances (useful for debugging)\n * @returns Map of current instances\n */\n static getInstances(): Map<AuthProviderType, IAuthProvider> {\n return new Map(this.instances);\n }\n}\n","import { create } from \"zustand\";\nimport { persist, devtools, createJSONStorage } from \"zustand/middleware\";\nimport { immer } from \"zustand/middleware/immer\";\nimport {\n AuthStore,\n OAuthProvider,\n AuthEvent,\n AuthSession,\n User,\n} from \"../types\";\nimport { IAuthProvider } from \"../core/IAuthProvider\";\n\nexport interface AuthState extends AuthStore {\n authProvider: IAuthProvider | null;\n setAuthProvider: (provider: IAuthProvider) => void;\n setSession: (session: AuthSession | null) => void;\n}\n\nexport const useAuthStore = create<AuthState>()(\n devtools(\n persist(\n immer((set: (fn: (state: AuthState) => void) => void, get) => ({\n // State\n user: null,\n session: null, // Added session to the store\n loading: true,\n error: null,\n authProvider: null, // Initialize authProvider as null\n\n // Basic state actions\n setUser: (user: User | null) =>\n set((state) => {\n state.user = user;\n state.error = null;\n }),\n setSession: (session: AuthSession | null) =>\n set((state) => {\n state.session = session;\n }), // Setter for session\n setLoading: (loading: boolean) =>\n set((state) => {\n state.loading = loading;\n }),\n setError: (error: Error | null) =>\n set((state) => {\n state.error = error;\n }),\n setAuthProvider: (provider: IAuthProvider) =>\n set((state) => {\n state.authProvider = provider;\n }),\n\n // Authentication actions\n signIn: async (email, password) => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n set((state) => {\n state.loading = true;\n state.error = null;\n });\n try {\n const { user, error } = await provider.signIn(email, password);\n if (error) throw error;\n set((state) => {\n state.user = user;\n state.loading = false;\n });\n } catch (error: unknown) {\n set((state) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n state.loading = false;\n });\n throw error;\n }\n },\n\n signUp: async (email, password) => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n set((state) => {\n state.loading = true;\n state.error = null;\n });\n try {\n const { user, error } = await provider.signUp(email, password);\n if (error) throw error;\n set((state) => {\n state.user = user;\n state.loading = false;\n });\n } catch (error: unknown) {\n set((state) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n state.loading = false;\n });\n throw error;\n }\n },\n\n signOut: async () => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n set((state) => {\n state.loading = true;\n state.error = null;\n });\n try {\n const { error } = await provider.signOut();\n if (error) throw error;\n set((state) => {\n state.user = null;\n state.session = null;\n state.loading = false;\n }); // Clear session on sign out\n } catch (error: unknown) {\n set((state) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n state.loading = false;\n });\n throw error;\n }\n },\n\n resetPassword: async (email) => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n set((state) => {\n state.loading = true;\n state.error = null;\n });\n try {\n const { error } = await provider.resetPassword(email);\n if (error) throw error;\n set((state) => {\n state.loading = false;\n });\n } catch (error: unknown) {\n set((state) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n state.loading = false;\n });\n throw error;\n }\n },\n\n updateProfile: async (updates: {\n name?: string;\n firstName?: string;\n lastName?: string;\n fullName?: string;\n avatar?: string;\n phone?: string;\n website?: string;\n bio?: string;\n [key: string]: unknown;\n }) => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n set((state) => {\n state.loading = true;\n state.error = null;\n });\n try {\n const { user, error } = await provider.updateProfile(updates);\n if (error) throw error;\n\n // Update the user in store and session if it exists\n set((state) => {\n state.user = user;\n if (state.session && user) {\n state.session.user = user;\n }\n state.loading = false;\n });\n\n return user;\n } catch (error: unknown) {\n set((state) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n state.loading = false;\n });\n throw error;\n }\n },\n\n // Extended auth methods (delegated to provider)\n signInWithOAuth: async (\n providerName: OAuthProvider,\n redirectTo?: string,\n ) => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n set((state) => {\n state.loading = true;\n state.error = null;\n });\n try {\n await provider.signInWithOAuth(providerName, redirectTo);\n set((state) => {\n state.loading = false;\n });\n } catch (error: unknown) {\n set((state) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n state.loading = false;\n });\n throw error;\n }\n },\n\n signInWithMagicLink: async (email: string, redirectTo?: string) => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n set((state) => {\n state.loading = true;\n state.error = null;\n });\n try {\n await provider.signInWithMagicLink(email, redirectTo);\n set((state) => {\n state.loading = false;\n });\n } catch (error: unknown) {\n set((state) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n state.loading = false;\n });\n throw error;\n }\n },\n\n getUser: async () => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n try {\n const user = await provider.getUser();\n set((state) => {\n state.user = user;\n });\n return user;\n } catch (error: unknown) {\n set((state) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n });\n throw error;\n }\n },\n\n getSession: async () => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n try {\n return await provider.getSession();\n } catch (error: unknown) {\n set((state) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n });\n throw error;\n }\n },\n\n refreshSession: async () => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n try {\n const session = await provider.getSession();\n if (session) {\n set((state) => {\n state.session = session;\n state.user = session.user;\n });\n }\n return session;\n } catch (error: unknown) {\n set((state) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n });\n throw error;\n }\n },\n\n onAuthStateChange: (\n callback: (event: AuthEvent, session: AuthSession | null) => void,\n ) => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n return provider.onAuthStateChange(callback);\n },\n })),\n {\n name: \"auth-storage\",\n storage: createJSONStorage(() => localStorage),\n partialize: (state) =>\n Object.fromEntries(\n Object.entries(state).filter(([key]) =>\n [\"user\", \"session\"].includes(key),\n ),\n ),\n },\n ),\n ),\n);\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { useAuthForm } from \"../../../hooks/useAuthForm\";\nimport { AuthFormProps, AuthMode, OAuthProvider } from \"../../../types\";\n\nexport const AuthForm: React.FC<AuthFormProps> = ({\n defaultMode = \"signIn\",\n onSuccess,\n onError,\n redirectTo,\n providers = [\"google\", \"github\"],\n allowMagicLink = true,\n}) => {\n const [mode, setMode] = useState<AuthMode>(defaultMode);\n const {\n email,\n password,\n setEmail,\n setPassword,\n handleSignIn,\n handleSignUp,\n handlePasswordReset,\n handleMagicLink,\n handleOAuthSignIn,\n loading,\n error,\n message,\n } = useAuthForm({\n onSuccess: onSuccess ?? (() => {}),\n onError: onError ?? (() => {}),\n redirectUrl: redirectTo,\n });\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n switch (mode) {\n case \"signIn\":\n await handleSignIn();\n break;\n case \"signUp\":\n await handleSignUp();\n break;\n case \"resetPassword\":\n await handlePasswordReset();\n break;\n case \"magicLink\":\n await handleMagicLink();\n break;\n }\n };\n\n const providerDisplayNames: { [key: string]: string } = {\n google: \"Google\",\n github: \"GitHub\",\n // Add more providers here as needed\n };\n\n return (\n <div className=\"w-full max-w-md space-y-8\">\n <div>\n <h2 className=\"text-2xl font-bold text-center\">\n {mode === \"signIn\" && \"Sign in to your account\"}\n {mode === \"signUp\" && \"Create a new account\"}\n {mode === \"resetPassword\" && \"Reset your password\"}\n {mode === \"magicLink\" && \"Sign in with magic link\"}\n </h2>\n </div>\n\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n <div>\n <label htmlFor=\"email\" className=\"block text-sm font-medium\">\n Email address\n </label>\n <input\n id=\"email\"\n type=\"email\"\n required\n autoComplete=\"email\"\n aria-required=\"true\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\n style={{ minHeight: \"44px\" }}\n />\n </div>\n\n {(mode === \"signIn\" || mode === \"signUp\") && (\n <div>\n <label htmlFor=\"password\" className=\"block text-sm font-medium\">\n Password\n </label>\n <input\n id=\"password\"\n type=\"password\"\n required\n autoComplete={mode === \"signUp\" ? \"new-password\" : \"current-password\"}\n aria-required=\"true\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\n style={{ minHeight: \"44px\" }}\n />\n </div>\n )}\n\n {error && (\n <div className=\"text-sm text-red-600\" role=\"alert\" aria-live=\"assertive\">\n {error}\n </div>\n )}\n\n {message && (\n <div className=\"text-sm text-green-600\" role=\"status\" aria-live=\"polite\">\n {message}\n </div>\n )}\n\n <button\n type=\"submit\"\n disabled={loading}\n className=\"w-full py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50\"\n >\n {loading\n ? \"Loading...\"\n : mode === \"signIn\"\n ? \"Sign in\"\n : mode === \"signUp\"\n ? \"Sign up\"\n : mode === \"resetPassword\"\n ? \"Reset password\"\n : \"Send magic link\"}\n </button>\n </form>\n\n {providers.length > 0 && (\n <div className=\"mt-6\">\n <div className=\"relative\">\n <div className=\"absolute inset-0 flex items-center\">\n <div className=\"w-full border-t border-gray-300\" />\n </div>\n <div className=\"relative flex justify-center text-sm\">\n <span className=\"px-2 bg-white text-gray-500\">\n Or continue with\n </span>\n </div>\n </div>\n\n <div className=\"mt-6 grid grid-cols-2 gap-3\">\n {providers.map((provider) => (\n <button\n key={provider}\n onClick={() => handleOAuthSignIn(provider as OAuthProvider)}\n className=\"w-full inline-flex justify-center py-2 px-4 border border-gray-300 rounded-md shadow-sm bg-white text-sm font-medium text-gray-500 hover:bg-gray-50\"\n >\n {providerDisplayNames[provider] ||\n provider.charAt(0).toUpperCase() + provider.slice(1)}\n </button>\n ))}\n </div>\n </div>\n )}\n\n <div className=\"text-sm text-center space-x-4\">\n {mode !== \"signIn\" && (\n <button\n type=\"button\"\n onClick={() => setMode(\"signIn\")}\n className=\"text-blue-600 hover:text-blue-500\"\n >\n Sign in\n </button>\n )}\n {mode !== \"signUp\" && (\n <button\n type=\"button\"\n onClick={() => setMode(\"signUp\")}\n className=\"text-blue-600 hover:text-blue-500\"\n >\n Sign up\n </button>\n )}\n {mode !== \"resetPassword\" && (\n <button\n type=\"button\"\n onClick={() => setMode(\"resetPassword\")}\n className=\"text-blue-600 hover:text-blue-500\"\n >\n Forgot password?\n </button>\n )}\n {allowMagicLink && mode !== \"magicLink\" && (\n <button\n type=\"button\"\n onClick={() => setMode(\"magicLink\")}\n className=\"text-blue-600 hover:text-blue-500\"\n >\n Magic link\n </button>\n )}\n </div>\n </div>\n );\n};\n","import { useState } from \"react\";\nimport { AuthError, AuthErrorType } from \"../core/IAuthProvider\";\nimport { OAuthProvider } from \"../types\";\n\nexport interface UseAuthFormOptions {\n onSuccess?: () => void;\n onError?: (error: AuthError) => void;\n redirectUrl?: string | undefined;\n}\n\nexport interface AuthFormState {\n email: string;\n password: string;\n confirmPassword: string;\n loading: boolean;\n error: string | null;\n message: string | null;\n}\n\nexport interface AuthFormActions {\n setEmail: (email: string) => void;\n setPassword: (password: string) => void;\n setConfirmPassword: (password: string) => void;\n handleSignIn: () => Promise<void>;\n handleSignUp: () => Promise<void>;\n handleOAuthSignIn: (provider: OAuthProvider) => Promise<void>;\n handlePasswordReset: () => Promise<void>;\n handleMagicLink: () => Promise<void>;\n clearError: () => void;\n clearMessage: () => void;\n}\n\nimport { useAuth } from \"./useAuth\"; // Import the useAuth hook\n\nexport const useAuthForm = (\n options: UseAuthFormOptions = {},\n): AuthFormState & AuthFormActions => {\n const auth = useAuth(); // Use the useAuth hook to get the AuthStore instance\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [confirmPassword, setConfirmPassword] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [message, setMessage] = useState<string | null>(null);\n\n // No need for the if (!auth) check here, as useAuth already handles it.\n\n const clearError = () => setError(null);\n const clearMessage = () => setMessage(null);\n\n const handleSignIn = async () => {\n setLoading(true);\n setError(null);\n setMessage(null);\n\n try {\n await auth.signIn(email, password);\n options.onSuccess?.();\n } catch (err) {\n const authError =\n err instanceof AuthError\n ? err\n : new AuthError(AuthErrorType.PROVIDER_ERROR, (err as Error).message);\n setError(authError.message);\n options.onError?.(authError);\n } finally {\n setLoading(false);\n }\n };\n\n const handleSignUp = async () => {\n if (password !== confirmPassword) {\n setError(\"Passwords do not match\");\n return;\n }\n\n setLoading(true);\n setError(null);\n setMessage(null);\n\n try {\n await auth.signUp(email, password);\n setMessage(\"Check your email to confirm your account\");\n options.onSuccess?.();\n } catch (err) {\n const authError =\n err instanceof AuthError\n ? err\n : new AuthError(AuthErrorType.PROVIDER_ERROR, (err as Error).message);\n setError(authError.message);\n options.onError?.(authError);\n } finally {\n setLoading(false);\n }\n };\n\n const handleOAuthSignIn = async (provider: OAuthProvider) => {\n setLoading(true);\n setError(null);\n\n try {\n await auth.signInWithOAuth(provider, options.redirectUrl);\n options.onSuccess?.();\n } catch (err) {\n const authError =\n err instanceof AuthError\n ? err\n : new AuthError(AuthErrorType.PROVIDER_ERROR, (err as Error).message);\n setError(authError.message);\n options.onError?.(authError);\n } finally {\n setLoading(false);\n }\n };\n\n const handlePasswordReset = async () => {\n if (!email) {\n setError(\"Please enter your email address\");\n return;\n }\n\n setLoading(true);\n setError(null);\n setMessage(null);\n\n try {\n await auth.resetPassword(email);\n setMessage(\"Password reset email sent\");\n } catch (err) {\n const authError =\n err instanceof AuthError\n ? err\n : new AuthError(AuthErrorType.PROVIDER_ERROR, (err as Error).message);\n setError(authError.message);\n options.onError?.(authError);\n } finally {\n setLoading(false);\n }\n };\n\n const handleMagicLink = async () => {\n if (!email) {\n setError(\"Please enter your email address\");\n return;\n }\n\n setLoading(true);\n setError(null);\n setMessage(null);\n\n try {\n await auth.signInWithMagicLink(email, options.redirectUrl);\n setMessage(\"Magic link sent to your email\");\n } catch (err) {\n const authError =\n err instanceof AuthError\n ? err\n : new AuthError(AuthErrorType.PROVIDER_ERROR, (err as Error).message);\n setError(authError.message);\n options.onError?.(authError);\n } finally {\n setLoading(false);\n }\n };\n\n return {\n // State\n email,\n password,\n confirmPassword,\n loading,\n error,\n message,\n // Actions\n setEmail,\n setPassword,\n setConfirmPassword,\n handleSignIn,\n handleSignUp,\n handleOAuthSignIn,\n handlePasswordReset,\n handleMagicLink,\n clearError,\n clearMessage,\n };\n};\n","\"use client\";\nimport { useAuthStore } from \"../store/authStore\";\n\nexport const useAuth = () => {\n // Get the entire store state and methods\n const authState = useAuthStore();\n\n // Check if the auth provider is initialized\n if (!authState.authProvider && !authState.loading) {\n console.warn(\n \"Auth provider not initialized. Make sure to wrap your app with <AuthProvider> component.\",\n );\n }\n\n return authState;\n};\n","\"use client\";\n\nimport React from \"react\";\nimport { AuthForm } from \"./AuthForm\";\nimport { AuthFormProps } from \"../../types\";\n\nexport interface LoginFormProps extends Omit<AuthFormProps, \"defaultMode\"> {\n /**\n * Override the redirect URL after successful login\n */\n redirectTo?: string;\n /**\n * Show magic link option\n */\n allowMagicLink?: boolean;\n /**\n * Show password reset link\n */\n allowPasswordReset?: boolean;\n /**\n * Show signup link\n */\n allowSignup?: boolean;\n /**\n * Custom className for styling\n */\n className?: string;\n}\n\nexport const LoginForm: React.FC<LoginFormProps> = ({\n redirectTo,\n allowMagicLink = true,\n allowPasswordReset = true,\n allowSignup = true,\n providers = [\"google\", \"github\"],\n onSuccess,\n onError,\n className,\n ...props\n}) => {\n return (\n <div className={className}>\n <AuthForm\n defaultMode=\"signIn\"\n redirectTo={redirectTo}\n providers={providers}\n allowMagicLink={allowMagicLink}\n onSuccess={onSuccess}\n onError={onError}\n {...props}\n />\n\n {/* Additional login-specific UI can be added here */}\n <div className=\"mt-4 text-center space-y-2\">\n {allowPasswordReset && (\n <div className=\"text-sm\">\n <a\n href=\"/auth/reset-password\"\n className=\"text-blue-600 hover:text-blue-500\"\n >\n Forgot your password?\n </a>\n </div>\n )}\n\n {allowSignup && (\n <div className=\"text-sm\">\n Don't have an account?{\" \"}\n <a\n href=\"/auth/signup\"\n className=\"text-blue-600 hover:text-blue-500 font-medium\"\n >\n Sign up\n </a>\n </div>\n )}\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport React from \"react\";\nimport { AuthForm } from \"./AuthForm\";\nimport { AuthFormProps } from \"../../types\";\n\nexport interface SignupFormProps extends Omit<AuthFormProps, \"defaultMode\"> {\n /**\n * Override the redirect URL after successful signup\n */\n redirectTo?: string;\n /**\n * Show login link\n */\n allowLogin?: boolean;\n /**\n * Require terms of service acceptance\n */\n requireTerms?: boolean;\n /**\n * Terms of service URL\n */\n termsUrl?: string;\n /**\n * Privacy policy URL\n */\n privacyUrl?: string;\n /**\n * Custom className for styling\n */\n className?: string;\n}\n\nexport const SignupForm: React.FC<SignupFormProps> = ({\n redirectTo,\n allowLogin = true,\n requireTerms = false,\n termsUrl = \"/terms\",\n privacyUrl = \"/privacy\",\n providers = [\"google\", \"github\"],\n onSuccess,\n onError,\n className,\n ...props\n}) => {\n return (\n <div className={className}>\n <AuthForm\n defaultMode=\"signUp\"\n redirectTo={redirectTo}\n providers={providers}\n onSuccess={onSuccess}\n onError={onError}\n {...props}\n />\n\n {/* Terms of service acceptance */}\n {requireTerms && (\n <div className=\"mt-4 text-center\">\n <p className=\"text-xs text-gray-600\">\n By signing up, you agree to our{\" \"}\n <a href={termsUrl} className=\"text-blue-600 hover:text-blue-500\">\n Terms of Service\n </a>{\" \"}\n and{\" \"}\n <a href={privacyUrl} className=\"text-blue-600 hover:text-blue-500\">\n Privacy Policy\n </a>\n </p>\n </div>\n )}\n\n {/* Additional signup-specific UI */}\n <div className=\"mt-4 text-center\">\n {allowLogin && (\n <div className=\"text-sm\">\n Already have an account?{\" \"}\n <a\n href=\"/auth/login\"\n className=\"text-blue-600 hover:text-blue-500 font-medium\"\n >\n Sign in\n </a>\n </div>\n )}\n </div>\n </div>\n );\n};\n","import { createBrowserClient } from \"@supabase/ssr\";\nimport type { Database } from \"./database.types\";\n\nexport const createClient = () => {\n if (\n !process.env.NEXT_PUBLIC_SUPABASE_URL ||\n !process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY\n ) {\n throw new Error(\"Missing Supabase environment variables\");\n }\n\n return createBrowserClient<Database>(\n process.env.NEXT_PUBLIC_SUPABASE_URL,\n process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,\n );\n};\n\n// Only export supabase if environment variables are available\n// This prevents breaking existing apps that don't use Supabase\nexport const supabase = (() => {\n try {\n if (\n process.env.NEXT_PUBLIC_SUPABASE_URL &&\n process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY\n ) {\n return createClient();\n }\n } catch {\n // Silently fail if environment variables are not available\n console.warn(\n \"Supabase client not initialized: environment variables not available\",\n );\n }\n return null;\n})();\n","// src/actions/index.ts\nimport { useAuthStore } from \"../store/authStore.js\";\nimport { OAuthProvider, User } from \"../types.js\";\n\n/**\n * Authentication actions for templates\n * These are convenient wrapper functions around the store methods\n */\n\n/**\n * Sign up with email and password\n */\nexport const signUp = async (\n email: string,\n password: string,\n): Promise<void> => {\n const store = useAuthStore.getState();\n return store.signUp(email, password);\n};\n\n/**\n * Sign in with email and password\n */\nexport const signIn = async (\n email: string,\n password: string,\n): Promise<void> => {\n const store = useAuthStore.getState();\n return store.signIn(email, password);\n};\n\n/**\n * Sign out the current user\n */\nexport const signOut = async (): Promise<void> => {\n const store = useAuthStore.getState();\n return store.signOut();\n};\n\n/**\n * Reset password for given email\n */\nexport const resetPassword = async (email: string): Promise<void> => {\n const store = useAuthStore.getState();\n return store.resetPassword(email);\n};\n\n/**\n * Update user profile\n * Fully implemented with Supabase-first approach and Firebase fallback\n */\nexport const updateProfile = async (updates: {\n name?: string;\n firstName?: string;\n lastName?: string;\n fullName?: string;\n avatar?: string;\n phone?: string;\n website?: string;\n bio?: string;\n [key: string]: unknown;\n}): Promise<User | null> => {\n const store = useAuthStore.getState();\n\n if (!store.user) {\n throw new Error(\"No user logged in\");\n }\n\n // Use the store's updateProfile method which handles provider communication\n return await store.updateProfile(updates);\n};\n\n/**\n * Sign in with OAuth provider\n */\nexport const signInWithOAuth = async (\n provider: OAuthProvider,\n redirectTo?: string,\n): Promise<void> => {\n const store = useAuthStore.getState();\n return store.signInWithOAuth(provider, redirectTo);\n};\n\n/**\n * Sign in with magic link\n */\nexport const signInWithMagicLink = async (\n email: string,\n redirectTo?: string,\n): Promise<void> => {\n const store = useAuthStore.getState();\n return store.signInWithMagicLink(email, redirectTo);\n};\n","import { createServerClient, type CookieOptions } from \"@supabase/ssr\";\nimport { NextResponse, type NextRequest } from \"next/server.js\";\n\nexport function withAuth(request: NextRequest) {\n let response = NextResponse.next({\n request: {\n headers: request.headers,\n },\n });\n\n const supabase = createServerClient(\n process.env.NEXT_PUBLIC_SUPABASE_URL!,\n process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,\n {\n cookies: {\n get(name: string) {\n return request.cookies.get(name)?.value;\n },\n set(name: string, value: string, options: CookieOptions) {\n request.cookies.set({\n name,\n value,\n ...options,\n });\n response = NextResponse.next({\n request: {\n headers: request.headers,\n },\n });\n response.cookies.set({\n name,\n value,\n ...options,\n });\n },\n remove(name: string, options: CookieOptions) {\n request.cookies.set({\n name,\n value: \"\",\n ...options,\n });\n response = NextResponse.next({\n request: {\n headers: request.headers,\n },\n });\n response.cookies.set({\n name,\n value: \"\",\n ...options,\n });\n },\n },\n },\n );\n\n return { response, supabase };\n}\n"],"mappings":"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","names":["createClient","import_platform_core","AuthErrorType","AuthEvent","AuthProviderType","mapSupabaseUserToUser","mapSupabaseError","validateEmail","validateSupabaseUrl","validateEmail","FirebaseOAuthProvider","firebaseSignOut","firebaseUpdateProfile","validateConfig","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_ssr","createClient","import_ssr","supabase"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/platform/index.ts","../src/components/AuthProvider.tsx","../src/core/IAuthProvider.ts","../src/core/SupabaseAuthProvider.ts","../src/config/env.ts","../src/types.ts","../src/core/SupabaseSSRAuthProvider.ts","../src/core/FirebaseAuthProvider.ts","../src/native/runtime.ts","../src/config/storage.ts","../src/core/AuthProviderFactory.ts","../src/store/authStore.ts","../src/components/web/AuthForm/index.tsx","../src/hooks/useAuthForm.ts","../src/hooks/useAuth.ts","../src/components/web/LoginForm.tsx","../src/components/web/SignupForm.tsx","../src/utils/supabase.ts","../src/actions/index.ts","../src/middleware/withAuth.ts"],"sourcesContent":["// src/index.ts\n\n// ═══════════════════════════════════════════════════════════════\n// PLATFORM CORE RE-EXPORTS (IAuth interface and adapters)\n// These provide the unified platform-core authentication abstraction\n// Types are aliased to avoid conflicts with local types\n// ═══════════════════════════════════════════════════════════════\n\nexport {\n // IAuth interface and types (renamed to avoid conflicts with local types)\n type IAuth,\n type AuthUser as IAuthUser,\n type AuthSession as IAuthSession,\n type AuthResult as IAuthResult,\n type AuthError as IAuthError,\n type AuthErrorCode as IAuthErrorCode,\n type SignInWithEmailOptions,\n type SignUpWithEmailOptions,\n type ResetPasswordOptions,\n type UpdatePasswordOptions,\n type OAuthProvider as IAuthOAuthProvider,\n type OAuthOptions,\n type OAuthResult,\n type SignInWithPhoneOptions,\n type VerifyPhoneOtpOptions,\n type SignInWithMagicLinkOptions,\n type MfaFactorType,\n type MfaFactor,\n type MfaChallenge,\n type EnrollMfaOptions,\n type EnrollMfaResult,\n type VerifyMfaOptions,\n type UpdateUserOptions,\n type DeleteAccountOptions,\n type AuthEventType,\n type AuthStateChangeCallback,\n type AuthConfig as IAuthConfig,\n type AuthStorage,\n // Helpers\n createAuthError,\n isAuthError,\n AuthErrorMessages,\n generateSecureToken,\n // Memory adapter for testing\n MemoryAuth,\n} from \"@digilogiclabs/platform-core\";\n\n// Production adapters\nexport {\n SupabaseAuth,\n type SupabaseAuthConfig,\n} from \"@digilogiclabs/platform-core\";\n\n// ═══════════════════════════════════════════════════════════════\n// PLATFORM CORE INTEGRATION (observability)\n// ═══════════════════════════════════════════════════════════════\n\nexport {\n setPlatform,\n clearPlatform,\n hasPlatform,\n logAuthEvent,\n trackAuthMetric,\n} from \"./platform/index.js\";\n\n// ═══════════════════════════════════════════════════════════════\n// COMPONENTS\n// ═══════════════════════════════════════════════════════════════\n\nexport { AuthProvider } from \"./components/AuthProvider.js\";\nexport { LoginForm, SignupForm } from \"./components/web/index.js\";\n\n// ═══════════════════════════════════════════════════════════════\n// HOOKS\n// ═══════════════════════════════════════════════════════════════\n\nexport { useAuth } from \"./hooks/useAuth.js\";\n\n// ═══════════════════════════════════════════════════════════════\n// CORE\n// ═══════════════════════════════════════════════════════════════\n\nexport { AuthProviderFactory } from \"./core/AuthProviderFactory.js\";\nexport type { IAuthProvider } from \"./core/IAuthProvider.js\";\nexport { AuthError, AuthErrorType } from \"./core/IAuthProvider.js\";\n\n// SSR-aware Supabase provider for Next.js middleware authentication\nexport { SupabaseSSRAuthProvider } from \"./core/SupabaseSSRAuthProvider.js\";\n\n// ═══════════════════════════════════════════════════════════════\n// ACTIONS\n// ═══════════════════════════════════════════════════════════════\n\nexport {\n signUp,\n signIn,\n signOut,\n resetPassword,\n updateProfile,\n signInWithOAuth,\n signInWithMagicLink,\n} from \"./actions/index.js\";\n\n// ═══════════════════════════════════════════════════════════════\n// TYPES\n// ═══════════════════════════════════════════════════════════════\n\nexport type {\n User,\n AuthSession,\n OAuthProvider,\n AuthMode,\n UserRole,\n PasswordConfig,\n AuthConfig,\n AuthFormProps,\n AuthStore,\n} from \"./types.js\";\nexport { AuthEvent, AuthProviderType } from \"./types.js\";\n\n// ═══════════════════════════════════════════════════════════════\n// UTILITIES\n// ═══════════════════════════════════════════════════════════════\n\nexport { createClient as createSupabaseClient } from \"./utils/supabase.js\";\n\n// ═══════════════════════════════════════════════════════════════\n// MIDDLEWARE\n// ═══════════════════════════════════════════════════════════════\n\nexport { withAuth } from \"./middleware/withAuth.js\";\n","/**\n * Platform Core Integration\n *\n * Optional integration with @digilogiclabs/platform-core for:\n * - Email sending (password reset, verification)\n * - Logging (auth events)\n * - Metrics (auth success/failure tracking)\n */\n\nimport type { IEmail, ILogger, IMetrics } from \"@digilogiclabs/platform-core\";\n\ninterface PlatformServices {\n email?: IEmail;\n logger?: ILogger;\n metrics?: IMetrics;\n}\n\nlet platformServices: PlatformServices = {};\n\n/**\n * Set the platform services for auth package to use\n *\n * @example\n * ```typescript\n * import { createPlatform } from '@digilogiclabs/platform-core';\n * import { setPlatform } from '@digilogiclabs/saas-factory-auth';\n *\n * const platform = createPlatform();\n * setPlatform({\n * email: platform.email,\n * logger: platform.logger,\n * metrics: platform.metrics,\n * });\n * ```\n */\nexport function setPlatform(services: PlatformServices): void {\n platformServices = { ...platformServices, ...services };\n}\n\n/**\n * Clear platform services (useful for testing)\n */\nexport function clearPlatform(): void {\n platformServices = {};\n}\n\n/**\n * Get the configured email service\n */\nexport function getEmailService(): IEmail | undefined {\n return platformServices.email;\n}\n\n/**\n * Get the configured logger\n */\nexport function getLogger(): ILogger | undefined {\n return platformServices.logger;\n}\n\n/**\n * Get the configured metrics\n */\nexport function getMetrics(): IMetrics | undefined {\n return platformServices.metrics;\n}\n\n/**\n * Check if platform services are configured\n */\nexport function hasPlatform(): boolean {\n return Object.keys(platformServices).length > 0;\n}\n\n/**\n * Log an auth event if logger is configured\n */\nexport function logAuthEvent(\n level: \"debug\" | \"info\" | \"warn\" | \"error\",\n message: string,\n meta?: Record<string, unknown>,\n): void {\n const logger = platformServices.logger;\n if (logger) {\n logger[level](message, meta);\n }\n}\n\n/**\n * Track an auth metric if metrics are configured\n */\nexport function trackAuthMetric(\n name: string,\n value: number = 1,\n tags?: Record<string, string | number | boolean>,\n): void {\n const metrics = platformServices.metrics;\n if (metrics) {\n metrics.increment(`auth.${name}`, value, tags);\n }\n}\n\n/**\n * Send an email using platform-core if configured\n * Falls back to provider's email if not configured\n */\nexport async function sendAuthEmail(options: {\n to: string | { email: string; name?: string };\n subject: string;\n html: string;\n text?: string;\n}): Promise<boolean> {\n const email = platformServices.email;\n if (email) {\n try {\n // Convert string to EmailAddress format\n const toAddress =\n typeof options.to === \"string\" ? { email: options.to } : options.to;\n\n await email.send({\n to: toAddress,\n subject: options.subject,\n html: options.html,\n text: options.text,\n });\n trackAuthMetric(\"email.sent\", 1, { type: \"auth\" });\n return true;\n } catch (error) {\n const toEmail =\n typeof options.to === \"string\" ? options.to : options.to.email;\n logAuthEvent(\"error\", \"Failed to send auth email\", {\n error,\n to: toEmail,\n });\n trackAuthMetric(\"email.failed\", 1, { type: \"auth\" });\n return false;\n }\n }\n return false;\n}\n","\"use client\";\n\nimport React, { useEffect, useRef } from \"react\";\nimport { AuthProviderFactory } from \"../core/AuthProviderFactory\";\nimport { IAuthProvider } from \"../core/IAuthProvider\";\nimport { useAuthStore } from \"../store/authStore\";\nimport { AuthEvent } from \"../types\";\n\nexport interface AuthProviderProps {\n children: React.ReactNode;\n onAuthChange?: (event: AuthEvent) => void;\n autoSignIn?: boolean;\n}\n\nexport const AuthProvider: React.FC<AuthProviderProps> = ({\n children,\n onAuthChange,\n autoSignIn = true,\n}) => {\n const authProviderRef = useRef<IAuthProvider | null>(null);\n const unsubscribeRef = useRef<(() => void) | null>(null);\n\n // Get all store methods at component level (not in callbacks)\n const setUser = useAuthStore((state) => state.setUser);\n const setSession = useAuthStore((state) => state.setSession);\n const setLoading = useAuthStore((state) => state.setLoading);\n const setError = useAuthStore((state) => state.setError);\n const setAuthProvider = useAuthStore((state) => state.setAuthProvider);\n\n useEffect(() => {\n let mounted = true;\n\n const initializeAuth = async () => {\n try {\n // Create auth provider instance\n const provider = await AuthProviderFactory.getProviderFromEnvironment({\n validateConfig: true,\n useSingleton: true,\n });\n\n if (!mounted) return;\n\n authProviderRef.current = provider;\n\n // CRITICAL: Set the auth provider in the store so useAuth hook can use it\n setAuthProvider(provider);\n\n // Set up auth state listener with stable references\n const subscription = provider.onAuthStateChange((event, session) => {\n if (!mounted) return;\n\n // Update store state using stable references from component level\n if (session) {\n setUser(session.user);\n setSession(session);\n setError(null);\n } else {\n setUser(null);\n setSession(null);\n }\n\n // Call custom callback if provided\n if (onAuthChange) {\n onAuthChange(event);\n }\n\n // Set loading to false after auth state change\n setLoading(false);\n });\n\n // Store unsubscribe function\n if (subscription?.unsubscribe) {\n unsubscribeRef.current = subscription.unsubscribe;\n }\n\n // Get initial session if autoSignIn is enabled\n if (autoSignIn) {\n try {\n const currentSession = await provider.getSession();\n if (mounted) {\n if (currentSession) {\n setUser(currentSession.user);\n setSession(currentSession);\n } else {\n // No session, but not an error\n setUser(null);\n setSession(null);\n }\n setLoading(false);\n }\n } catch (error) {\n console.error(\"Failed to get initial session:\", error);\n if (mounted) {\n // Session fetch failed, but app can still work\n setError(\n error instanceof Error\n ? error\n : new Error(\"Failed to get session\"),\n );\n setLoading(false);\n }\n }\n } else {\n // Not auto-signing in, just set loading to false\n if (mounted) {\n setLoading(false);\n }\n }\n } catch (error) {\n console.error(\"Failed to initialize auth provider:\", error);\n if (mounted) {\n setError(\n error instanceof Error\n ? error\n : new Error(\"Failed to initialize auth\"),\n );\n setLoading(false);\n }\n }\n };\n\n initializeAuth();\n\n return () => {\n mounted = false;\n if (unsubscribeRef.current) {\n unsubscribeRef.current();\n unsubscribeRef.current = null;\n }\n };\n }, []); // Empty dependency array since we're using stable store setters\n\n return <>{children}</>;\n};\n","import { User, AuthSession, AuthEvent } from \"../types\";\n\n/**\n * Authentication error types for better error handling\n */\nexport enum AuthErrorType {\n INVALID_CREDENTIALS = \"INVALID_CREDENTIALS\",\n USER_NOT_FOUND = \"USER_NOT_FOUND\",\n EMAIL_ALREADY_EXISTS = \"EMAIL_ALREADY_EXISTS\",\n WEAK_PASSWORD = \"WEAK_PASSWORD\",\n NETWORK_ERROR = \"NETWORK_ERROR\",\n PROVIDER_ERROR = \"PROVIDER_ERROR\",\n CONFIGURATION_ERROR = \"CONFIGURATION_ERROR\",\n VALIDATION_ERROR = \"VALIDATION_ERROR\",\n UNKNOWN = \"UNKNOWN\",\n}\n\n/**\n * Custom authentication error class\n */\nexport class AuthError extends Error {\n public readonly timestamp: Date;\n public readonly code: string;\n\n constructor(\n public readonly type: AuthErrorType,\n message: string,\n public readonly originalError?: unknown,\n public readonly context?: Record<string, unknown>,\n ) {\n super(message);\n this.name = \"AuthError\";\n this.timestamp = new Date();\n this.code = type;\n\n // Ensure proper prototype chain for instanceof checks\n Object.setPrototypeOf(this, AuthError.prototype);\n\n // Capture stack trace if available\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, AuthError);\n }\n }\n\n /**\n * Convert error to JSON for logging/debugging\n */\n toJSON() {\n const originalErrorDetails =\n this.originalError instanceof Error\n ? {\n name: this.originalError.name,\n message: this.originalError.message,\n stack: this.originalError.stack,\n }\n : this.originalError\n ? { message: String(this.originalError) }\n : undefined;\n\n return {\n name: this.name,\n type: this.type,\n code: this.code,\n message: this.message,\n timestamp: this.timestamp.toISOString(),\n context: this.context,\n originalError: originalErrorDetails,\n };\n }\n\n /**\n * Check if error is of a specific type\n */\n isType(type: AuthErrorType): boolean {\n return this.type === type;\n }\n\n /**\n * Check if error is retryable\n */\n isRetryable(): boolean {\n return [AuthErrorType.NETWORK_ERROR, AuthErrorType.PROVIDER_ERROR].includes(\n this.type,\n );\n }\n}\n\n/**\n * OAuth provider types - re-export from types for backward compatibility\n */\nexport type OAuthProvider =\n | \"google\"\n | \"github\"\n | \"facebook\"\n | \"twitter\"\n | \"discord\"\n | \"apple\"\n | \"microsoft\"\n | \"linkedin\"\n | \"spotify\"\n | \"twitch\"\n | \"slack\"\n | \"notion\";\n\n/**\n * Common user interface - alias for backward compatibility\n */\nexport type CommonUser = User;\n\n/**\n * Authentication provider interface that abstracts authentication operations\n * across different backends (Supabase, Firebase, etc.)\n */\nexport interface IAuthProvider {\n /**\n * Sign in with email and password\n * @param email User's email address\n * @param password User's password (required for email/password authentication)\n * @returns Promise resolving to an object containing user, session, and error\n */\n signIn(\n email: string,\n password: string,\n ): Promise<{\n user: User | null;\n session: AuthSession | null;\n error: AuthError | null;\n }>;\n\n /**\n * Sign up with email and password\n * @param email User's email address\n * @param password User's password (required for email/password authentication)\n * @returns Promise resolving to an object containing user, session, and error\n */\n signUp(\n email: string,\n password: string,\n ): Promise<{\n user: User | null;\n session: AuthSession | null;\n error: AuthError | null;\n }>;\n\n /**\n * Sign in with OAuth provider\n * @param provider OAuth provider name\n * @param redirectTo Optional redirect URL after authentication\n * @returns Promise that resolves when OAuth flow is initiated\n */\n signInWithOAuth(provider: OAuthProvider, redirectTo?: string): Promise<void>;\n\n /**\n * Sign in with magic link (passwordless authentication)\n * @param email User's email address\n * @param redirectTo Optional redirect URL after email verification\n * @returns Promise that resolves when magic link is sent\n */\n signInWithMagicLink(email: string, redirectTo?: string): Promise<void>;\n\n /**\n * Sign out the current user\n * @returns Promise resolving to an object containing error\n */\n signOut(): Promise<{ error: AuthError | null }>;\n\n /**\n * Get the current authenticated user\n * @returns Promise resolving to the current user or null if not authenticated\n */\n getUser(): Promise<User | null>;\n\n /**\n * Get the current authentication session\n * @returns Promise resolving to the current session or null if not authenticated\n */\n getSession(): Promise<AuthSession | null>;\n\n /**\n * Send password reset email\n * @param email User's email address\n * @returns Promise resolving to an object containing error\n */\n resetPassword(email: string): Promise<{ error: AuthError | null }>;\n\n /**\n * Update user profile information\n * @param updates Partial user data to update\n * @returns Promise resolving to updated user and error information\n */\n updateProfile(updates: {\n name?: string;\n firstName?: string;\n lastName?: string;\n fullName?: string;\n avatar?: string;\n phone?: string;\n website?: string;\n bio?: string;\n [key: string]: unknown;\n }): Promise<{ user: User | null; error: AuthError | null }>;\n\n /**\n * Listen for authentication state changes\n * @param callback Function called when auth state changes\n * @returns Object containing subscription data for cleanup\n */\n onAuthStateChange(\n callback: (event: AuthEvent, session: AuthSession | null) => void,\n ): { unsubscribe: () => void };\n\n /**\n * Validate provider configuration\n * @returns Promise that resolves if configuration is valid\n */\n validateConfiguration?(): Promise<void>;\n}\n\n// Re-export types for convenience\nexport type { User, AuthSession, AuthEvent };\n","import {\n createClient,\n SupabaseClient,\n User as SupabaseUser,\n Session as SupabaseSession,\n} from \"@supabase/supabase-js\";\nimport {\n IAuthProvider,\n AuthError,\n AuthErrorType,\n OAuthProvider,\n} from \"./IAuthProvider\";\nimport { getAuthConfig, validateConfig } from \"../config/env\";\nimport { IAuthStorage } from \"../config/storage\";\nimport { User, AuthSession, AuthEvent } from \"../types\";\n\n/**\n * Maps Supabase user to User interface with comprehensive profile support\n */\nconst mapSupabaseUserToUser = (\n supabaseUser: SupabaseUser | null,\n): User | null => {\n if (!supabaseUser) return null;\n\n const metadata = supabaseUser.user_metadata || {};\n\n return {\n id: supabaseUser.id,\n email: supabaseUser.email,\n emailVerified: supabaseUser.email_confirmed_at ? true : false,\n\n // Name fields with fallback logic\n name: metadata.name || metadata.full_name || metadata.display_name || null,\n firstName: metadata.firstName || metadata.first_name || null,\n lastName: metadata.lastName || metadata.last_name || null,\n fullName: metadata.fullName || metadata.full_name || metadata.name || null,\n\n // Profile fields\n avatar: metadata.avatar || metadata.avatar_url || metadata.picture || null,\n phone: metadata.phone || metadata.phone_number || null,\n website: metadata.website || null,\n bio: metadata.bio || null,\n\n // Additional metadata\n locale: metadata.locale || null,\n timezone: metadata.timezone || null,\n dateOfBirth: metadata.dateOfBirth || metadata.date_of_birth || null,\n\n // Timestamps\n createdAt: supabaseUser.created_at,\n updatedAt: supabaseUser.updated_at,\n lastSignInAt: supabaseUser.last_sign_in_at,\n\n // OAuth provider data\n providerData:\n supabaseUser.identities?.reduce((acc, identity) => {\n if (identity.provider && identity.identity_data) {\n acc[identity.provider] = {\n id: identity.id,\n username:\n identity.identity_data.user_name ||\n identity.identity_data.login ||\n null,\n raw: identity.identity_data,\n };\n }\n return acc;\n }, {} as any) || {},\n\n // Include all other metadata for backward compatibility\n ...metadata,\n };\n};\n\n/**\n * Maps Supabase error to AuthError with better network error detection\n */\nconst mapSupabaseError = (error: unknown): AuthError => {\n if (error instanceof AuthError) {\n return error;\n }\n\n // Handle cases where error is not an object or doesn't have a message\n if (typeof error !== \"object\" || error === null || !(\"message\" in error)) {\n return new AuthError(\n AuthErrorType.UNKNOWN,\n \"An unknown error occurred\",\n error,\n );\n }\n\n const err = error as { message: string; code?: string };\n const message = err.message || \"Unknown error occurred\";\n const code = err.code;\n\n // Check for network/DNS errors first\n if (\n code === \"ERR_NAME_NOT_RESOLVED\" ||\n message.includes(\"ERR_NAME_NOT_RESOLVED\")\n ) {\n return new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"Invalid Supabase URL. Please check your NEXT_PUBLIC_SUPABASE_URL configuration.\",\n err,\n );\n }\n\n if (message.includes(\"Failed to fetch\") || message.includes(\"NetworkError\")) {\n return new AuthError(\n AuthErrorType.NETWORK_ERROR,\n \"Network error. Please check your internet connection and Supabase URL.\",\n err,\n );\n }\n\n if (message.includes(\"Invalid login credentials\")) {\n return new AuthError(AuthErrorType.INVALID_CREDENTIALS, message, err);\n }\n if (message.includes(\"User not found\")) {\n return new AuthError(AuthErrorType.USER_NOT_FOUND, message, err);\n }\n if (message.includes(\"User already registered\")) {\n return new AuthError(AuthErrorType.EMAIL_ALREADY_EXISTS, message, err);\n }\n if (message.includes(\"Password should be\")) {\n return new AuthError(AuthErrorType.WEAK_PASSWORD, message, err);\n }\n if (message.includes(\"network\") || message.includes(\"fetch\")) {\n return new AuthError(AuthErrorType.NETWORK_ERROR, message, err);\n }\n\n return new AuthError(AuthErrorType.PROVIDER_ERROR, message, err);\n};\n\n/**\n * Validates email format\n */\nconst validateEmail = (email: string): void => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email)) {\n throw new AuthError(AuthErrorType.VALIDATION_ERROR, \"Invalid email format\");\n }\n};\n\n/**\n * Validates Supabase URL format\n */\nconst validateSupabaseUrl = (url: string): void => {\n // Check if URL is properly formatted\n if (!url || !url.startsWith(\"http\")) {\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"Supabase URL must start with http:// or https://\",\n );\n }\n\n // Check if it's a valid Supabase domain\n const urlObj = new URL(url);\n if (\n !urlObj.hostname.endsWith(\".supabase.co\") &&\n !urlObj.hostname.includes(\"localhost\")\n ) {\n console.warn(\"Warning: URL does not appear to be a valid Supabase URL\");\n }\n\n // Check for common mistakes\n if (url.includes(\"supabase.co/\") && !url.includes(\".supabase.co\")) {\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"Invalid Supabase URL format. Should be: https://[project-ref].supabase.co\",\n );\n }\n};\n\n/**\n * Supabase authentication provider implementation\n */\nexport class SupabaseAuthProvider implements IAuthProvider {\n private client: SupabaseClient;\n private storage: IAuthStorage;\n\n constructor(storage: IAuthStorage) {\n this.storage = storage;\n const config = getAuthConfig();\n\n // Validate configuration\n validateConfig(config, \"supabase\");\n\n // Additional URL validation\n try {\n validateSupabaseUrl(config.supabaseUrl!);\n } catch (error) {\n console.error(\"Supabase URL validation failed:\", error);\n throw error;\n }\n\n // Create Supabase client\n try {\n this.client = createClient(config.supabaseUrl!, config.supabaseAnonKey!, {\n auth: {\n storage: {\n getItem: (key: string) => this.storage.getItem(key),\n setItem: (key: string, value: string) =>\n this.storage.setItem(key, value),\n removeItem: (key: string) => this.storage.removeItem(key),\n },\n autoRefreshToken: true,\n persistSession: true,\n detectSessionInUrl: true,\n },\n });\n } catch (error) {\n console.error(\"Failed to create Supabase client:\", error);\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"Failed to initialize Supabase client. Please check your configuration.\",\n error,\n );\n }\n }\n\n /**\n * Validates Supabase configuration\n */\n async validateConfiguration(): Promise<void> {\n try {\n const config = getAuthConfig();\n validateConfig(config, \"supabase\");\n validateSupabaseUrl(config.supabaseUrl!);\n\n // Try to make a test request to verify connectivity\n const { error } = await this.client.auth.getSession();\n if (error && error.message.includes(\"ERR_NAME_NOT_RESOLVED\")) {\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"Cannot connect to Supabase. Please verify your NEXT_PUBLIC_SUPABASE_URL is correct.\",\n error,\n );\n }\n } catch (error) {\n if (error instanceof AuthError) {\n throw error;\n }\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n error instanceof Error\n ? error.message\n : \"Invalid Supabase configuration\",\n );\n }\n }\n\n async signIn(\n email: string,\n password: string,\n ): Promise<{\n user: User | null;\n session: AuthSession | null;\n error: AuthError | null;\n }> {\n try {\n validateEmail(email);\n\n const { data, error } = await this.client.auth.signInWithPassword({\n email,\n password,\n });\n\n if (error) {\n return { user: null, session: null, error: mapSupabaseError(error) };\n }\n\n const user = mapSupabaseUserToUser(data.user);\n const session: AuthSession | null = data.session\n ? {\n user: user!,\n access_token: data.session.access_token,\n refresh_token: data.session.refresh_token,\n expires_at: data.session.expires_at,\n }\n : null;\n\n return { user, session, error: null };\n } catch (error) {\n return {\n user: null,\n session: null,\n error: mapSupabaseError(error),\n };\n }\n }\n\n async signUp(\n email: string,\n password: string,\n ): Promise<{\n user: User | null;\n session: AuthSession | null;\n error: AuthError | null;\n }> {\n try {\n validateEmail(email);\n const { data, error } = await this.client.auth.signUp({\n email,\n password,\n });\n if (error) {\n return { user: null, session: null, error: mapSupabaseError(error) };\n }\n const user = mapSupabaseUserToUser(data.user);\n const session: AuthSession | null = data.session\n ? {\n user: user!,\n access_token: data.session.access_token,\n refresh_token: data.session.refresh_token,\n expires_at: data.session.expires_at,\n }\n : null;\n return { user, session, error: null };\n } catch (error) {\n return { user: null, session: null, error: mapSupabaseError(error) };\n }\n }\n\n async signInWithOAuth(\n provider: OAuthProvider,\n redirectTo?: string,\n ): Promise<void> {\n try {\n const options: { redirectTo?: string } = {};\n if (redirectTo) {\n options.redirectTo = redirectTo;\n }\n\n // Map our OAuthProvider types to Supabase's supported providers\n let supabaseProvider: string = provider;\n\n // Handle providers that might need mapping\n switch (provider) {\n case \"microsoft\":\n supabaseProvider = \"azure\"; // Supabase uses 'azure' for Microsoft\n break;\n case \"apple\":\n case \"google\":\n case \"github\":\n case \"facebook\":\n case \"twitter\":\n case \"discord\":\n case \"linkedin\":\n case \"spotify\":\n case \"twitch\":\n case \"slack\":\n case \"notion\":\n supabaseProvider = provider; // These are supported directly\n break;\n default:\n throw new AuthError(\n AuthErrorType.PROVIDER_ERROR,\n `OAuth provider '${provider}' is not supported by Supabase`,\n );\n }\n\n const { error } = await this.client.auth.signInWithOAuth({\n provider: supabaseProvider as any, // Type assertion needed due to Supabase's strict typing\n options,\n });\n\n if (error) {\n throw mapSupabaseError(error);\n }\n } catch (error) {\n throw mapSupabaseError(error);\n }\n }\n\n async signInWithMagicLink(email: string, redirectTo?: string): Promise<void> {\n try {\n validateEmail(email);\n const options: { emailRedirectTo?: string } = {};\n if (redirectTo) {\n options.emailRedirectTo = redirectTo;\n }\n const { error } = await this.client.auth.signInWithOtp({\n email,\n options,\n });\n if (error) {\n throw mapSupabaseError(error);\n }\n } catch (error) {\n throw mapSupabaseError(error);\n }\n }\n\n async signOut(): Promise<{ error: AuthError | null }> {\n try {\n const { error } = await this.client.auth.signOut();\n if (error) {\n return { error: mapSupabaseError(error) };\n }\n return { error: null };\n } catch (error) {\n return { error: mapSupabaseError(error) };\n }\n }\n\n async getUser(): Promise<User | null> {\n try {\n const {\n data: { user },\n error,\n } = await this.client.auth.getUser();\n if (error) {\n throw mapSupabaseError(error);\n }\n return mapSupabaseUserToUser(user);\n } catch (error) {\n throw mapSupabaseError(error);\n }\n }\n\n async getSession(): Promise<AuthSession | null> {\n try {\n const {\n data: { session },\n error,\n } = await this.client.auth.getSession();\n\n if (error) {\n // Don't throw for \"Auth session missing\" during initialization\n if (error.message === \"Auth session missing!\") {\n return null;\n }\n throw mapSupabaseError(error);\n }\n\n if (!session) return null;\n\n const user = mapSupabaseUserToUser(session.user);\n return {\n user: user!,\n access_token: session.access_token,\n refresh_token: session.refresh_token,\n expires_at: session.expires_at,\n };\n } catch (error) {\n if (error instanceof AuthError) {\n throw error;\n }\n throw new AuthError(\n AuthErrorType.PROVIDER_ERROR,\n \"Get session failed\",\n error,\n );\n }\n }\n\n onAuthStateChange(\n callback: (event: AuthEvent, session: AuthSession | null) => void,\n ): { unsubscribe: () => void } {\n const {\n data: { subscription },\n } = this.client.auth.onAuthStateChange(\n (event, session: SupabaseSession | null) => {\n // Map Supabase events to our AuthEvent enum\n let authEvent: AuthEvent;\n switch (event) {\n case \"SIGNED_IN\":\n authEvent = AuthEvent.SIGNED_IN;\n break;\n case \"SIGNED_OUT\":\n authEvent = AuthEvent.SIGNED_OUT;\n break;\n case \"TOKEN_REFRESHED\":\n authEvent = AuthEvent.TOKEN_REFRESHED;\n break;\n case \"USER_UPDATED\":\n authEvent = AuthEvent.USER_UPDATED;\n break;\n case \"INITIAL_SESSION\":\n // Handle initial session event\n authEvent = session ? AuthEvent.SIGNED_IN : AuthEvent.SIGNED_OUT;\n break;\n case \"MFA_CHALLENGE_VERIFIED\":\n authEvent = AuthEvent.USER_UPDATED;\n break;\n case \"PASSWORD_RECOVERY\":\n authEvent = AuthEvent.USER_UPDATED;\n break;\n default:\n console.warn(`Unhandled Supabase auth event: ${event}`);\n authEvent = AuthEvent.USER_UPDATED;\n }\n\n // Map session to our format\n const user = mapSupabaseUserToUser(session?.user || null);\n const authSession: AuthSession | null =\n user && session\n ? {\n user: user,\n access_token: session.access_token,\n refresh_token: session.refresh_token,\n expires_at: session.expires_at,\n }\n : null;\n\n // Call the callback with mapped values\n callback(authEvent, authSession);\n },\n );\n\n return { unsubscribe: () => subscription.unsubscribe() };\n }\n\n async resetPassword(email: string): Promise<{ error: AuthError | null }> {\n try {\n validateEmail(email);\n const { error } = await this.client.auth.resetPasswordForEmail(email);\n if (error) {\n return { error: mapSupabaseError(error) };\n }\n return { error: null };\n } catch (error) {\n return { error: mapSupabaseError(error) };\n }\n }\n\n async updateProfile(updates: {\n name?: string;\n firstName?: string;\n lastName?: string;\n fullName?: string;\n avatar?: string;\n phone?: string;\n website?: string;\n bio?: string;\n [key: string]: unknown;\n }): Promise<{ user: User | null; error: AuthError | null }> {\n try {\n // Get current session to ensure user is authenticated\n const {\n data: { session },\n error: sessionError,\n } = await this.client.auth.getSession();\n\n if (sessionError || !session?.user) {\n return {\n user: null,\n error: new AuthError(\n AuthErrorType.INVALID_CREDENTIALS,\n \"User must be authenticated to update profile\",\n ),\n };\n }\n\n // Prepare the user metadata update with current metadata as base\n const userMetadata: Record<string, unknown> = {\n ...session.user.user_metadata,\n };\n\n // Handle name fields with intelligent merging\n if (updates.name !== undefined) {\n userMetadata.name = updates.name;\n userMetadata.display_name = updates.name; // Also set display_name for compatibility\n }\n\n if (updates.firstName !== undefined) {\n userMetadata.firstName = updates.firstName;\n userMetadata.first_name = updates.firstName; // Supabase convention\n }\n\n if (updates.lastName !== undefined) {\n userMetadata.lastName = updates.lastName;\n userMetadata.last_name = updates.lastName; // Supabase convention\n }\n\n if (updates.fullName !== undefined) {\n userMetadata.fullName = updates.fullName;\n userMetadata.full_name = updates.fullName; // Supabase convention\n userMetadata.name = updates.fullName; // Primary name field\n userMetadata.display_name = updates.fullName; // Display name\n }\n\n // If firstName and lastName are provided but no fullName, construct it\n if (\n (updates.firstName !== undefined || updates.lastName !== undefined) &&\n updates.fullName === undefined\n ) {\n const firstName =\n updates.firstName ||\n userMetadata.firstName ||\n userMetadata.first_name ||\n \"\";\n const lastName =\n updates.lastName ||\n userMetadata.lastName ||\n userMetadata.last_name ||\n \"\";\n const constructedFullName = `${firstName} ${lastName}`.trim();\n if (constructedFullName) {\n userMetadata.full_name = constructedFullName;\n userMetadata.fullName = constructedFullName;\n userMetadata.name = constructedFullName;\n }\n }\n\n // Profile fields with multiple format support\n if (updates.avatar !== undefined) {\n userMetadata.avatar = updates.avatar;\n userMetadata.avatar_url = updates.avatar; // Supabase/OAuth convention\n userMetadata.picture = updates.avatar; // OAuth provider convention\n }\n\n if (updates.phone !== undefined) {\n userMetadata.phone = updates.phone;\n userMetadata.phone_number = updates.phone; // Alternative format\n }\n\n if (updates.website !== undefined) {\n userMetadata.website = updates.website;\n }\n\n if (updates.bio !== undefined) {\n userMetadata.bio = updates.bio;\n }\n\n // Handle any additional custom fields\n const knownFields = [\n \"name\",\n \"firstName\",\n \"lastName\",\n \"fullName\",\n \"avatar\",\n \"phone\",\n \"website\",\n \"bio\",\n ];\n Object.keys(updates).forEach((key) => {\n if (!knownFields.includes(key)) {\n userMetadata[key] = updates[key];\n }\n });\n\n // Update user metadata in Supabase\n const { data, error } = await this.client.auth.updateUser({\n data: userMetadata,\n });\n\n if (error) {\n return { user: null, error: mapSupabaseError(error) };\n }\n\n // Return updated user with enhanced mapping\n const updatedUser = mapSupabaseUserToUser(data.user);\n return { user: updatedUser, error: null };\n } catch (error) {\n return { user: null, error: mapSupabaseError(error) };\n }\n }\n}\n","import { AuthConfig } from \"../types\";\n\n/**\n * Gets authentication configuration from environment variables\n */\nexport const getAuthConfig = (): Partial<AuthConfig> => {\n const config: Partial<AuthConfig> = {};\n\n // For Next.js/Web environments\n if (typeof process !== \"undefined\" && process.env) {\n const supabaseUrl =\n process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL;\n const supabaseAnonKey =\n process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY ||\n process.env.SUPABASE_ANON_KEY;\n const firebaseApiKey =\n process.env.NEXT_PUBLIC_FIREBASE_API_KEY || process.env.FIREBASE_API_KEY;\n const firebaseAuthDomain =\n process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN ||\n process.env.FIREBASE_AUTH_DOMAIN;\n const firebaseProjectId =\n process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID ||\n process.env.FIREBASE_PROJECT_ID;\n\n if (supabaseUrl) config.supabaseUrl = supabaseUrl;\n if (supabaseAnonKey) config.supabaseAnonKey = supabaseAnonKey;\n if (firebaseApiKey) config.firebaseApiKey = firebaseApiKey;\n if (firebaseAuthDomain) config.firebaseAuthDomain = firebaseAuthDomain;\n if (firebaseProjectId) config.firebaseProjectId = firebaseProjectId;\n\n return config;\n }\n\n // For React Native with expo-constants\n try {\n const Constants = new Function(\n \"return require('expo-constants').default\",\n )();\n const expoConfig = Constants.expoConfig?.extra || {};\n if (expoConfig.supabaseUrl) config.supabaseUrl = expoConfig.supabaseUrl;\n if (expoConfig.supabaseAnonKey)\n config.supabaseAnonKey = expoConfig.supabaseAnonKey;\n if (expoConfig.firebaseApiKey)\n config.firebaseApiKey = expoConfig.firebaseApiKey;\n if (expoConfig.firebaseAuthDomain)\n config.firebaseAuthDomain = expoConfig.firebaseAuthDomain;\n if (expoConfig.firebaseProjectId)\n config.firebaseProjectId = expoConfig.firebaseProjectId;\n return config;\n } catch {\n // Expo constants not available\n }\n\n // For React Native with react-native-config\n try {\n const RNConfig = new Function(\n \"return require('react-native-config').default\",\n )();\n if (RNConfig.SUPABASE_URL) config.supabaseUrl = RNConfig.SUPABASE_URL;\n if (RNConfig.SUPABASE_ANON_KEY)\n config.supabaseAnonKey = RNConfig.SUPABASE_ANON_KEY;\n if (RNConfig.FIREBASE_API_KEY)\n config.firebaseApiKey = RNConfig.FIREBASE_API_KEY;\n if (RNConfig.FIREBASE_AUTH_DOMAIN)\n config.firebaseAuthDomain = RNConfig.FIREBASE_AUTH_DOMAIN;\n if (RNConfig.FIREBASE_PROJECT_ID)\n config.firebaseProjectId = RNConfig.FIREBASE_PROJECT_ID;\n return config;\n } catch {\n // react-native-config not available\n }\n\n // Fallback to empty config\n return {};\n};\n\n/**\n * Validates configuration for a specific provider\n */\nexport const validateConfig = (\n config: Partial<AuthConfig>,\n provider: \"supabase\" | \"firebase\",\n): void => {\n if (provider === \"supabase\") {\n if (!config.supabaseUrl || !config.supabaseAnonKey) {\n throw new Error(\n \"Supabase configuration is incomplete. \" +\n \"Please ensure NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY are set.\",\n );\n }\n }\n\n if (provider === \"firebase\") {\n if (\n !config.firebaseApiKey ||\n !config.firebaseAuthDomain ||\n !config.firebaseProjectId\n ) {\n throw new Error(\n \"Firebase configuration is incomplete. \" +\n \"Please ensure NEXT_PUBLIC_FIREBASE_API_KEY, NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN, \" +\n \"and NEXT_PUBLIC_FIREBASE_PROJECT_ID are set.\",\n );\n }\n }\n};\n","/**\n * Base user profile information\n */\nexport interface UserProfile {\n /** User's display name */\n name?: string | null;\n /** User's first name */\n firstName?: string | null;\n /** User's last name */\n lastName?: string | null;\n /** User's full name */\n fullName?: string | null;\n /** User's avatar/profile picture URL */\n avatar?: string | null;\n /** User's phone number */\n phone?: string | null;\n /** User's date of birth */\n dateOfBirth?: string | null;\n /** User's preferred language */\n locale?: string | null;\n /** User's timezone */\n timezone?: string | null;\n /** User's website URL */\n website?: string | null;\n /** User's bio/description */\n bio?: string | null;\n}\n\n/**\n * User metadata from OAuth providers\n */\nexport interface UserMetadata {\n /** Provider-specific user data */\n [provider: string]: {\n /** Provider's unique user ID */\n id?: string;\n /** Username on the provider */\n username?: string;\n /** Provider-specific data */\n raw?: Record<string, unknown>;\n };\n}\n\n/**\n * User interface representing authenticated user data\n */\nexport interface User extends UserProfile {\n /** Unique user identifier */\n id: string;\n /** User's email address */\n email?: string | undefined;\n /** User's email verification status */\n emailVerified?: boolean;\n /** User roles for RBAC */\n roles?: UserRole[];\n /** User permissions */\n permissions?: string[];\n /** Account creation timestamp */\n createdAt?: string | Date;\n /** Last update timestamp */\n updatedAt?: string | Date;\n /** Last sign-in timestamp */\n lastSignInAt?: string | Date;\n /** OAuth provider metadata */\n providerData?: UserMetadata;\n /** Custom user attributes */\n customClaims?: Record<string, unknown>;\n /** Two-factor authentication enabled */\n twoFactorEnabled?: boolean;\n /** User account status */\n status?: \"active\" | \"inactive\" | \"suspended\" | \"pending\";\n /** Provider-specific data for backward compatibility */\n [key: string]: unknown;\n}\n\n/**\n * Authentication session containing user and token information\n */\nexport interface AuthSession {\n user: User;\n access_token: string;\n refresh_token?: string | undefined;\n expires_at?: number | undefined;\n token_type?: string | undefined;\n issued_at?: number | undefined;\n refreshed_at?: number | undefined;\n}\n\n/**\n * Authentication events that can occur during auth state changes\n */\nexport enum AuthEvent {\n SIGNED_IN = \"SIGNED_IN\",\n SIGNED_OUT = \"SIGNED_OUT\",\n TOKEN_REFRESHED = \"TOKEN_REFRESHED\",\n USER_UPDATED = \"USER_UPDATED\",\n}\n\n/**\n * Supported authentication provider types\n */\nexport enum AuthProviderType {\n SUPABASE = \"supabase\",\n FIREBASE = \"firebase\",\n}\n\n/**\n * OAuth provider types supported by the auth system\n */\nexport type OAuthProvider =\n | \"google\"\n | \"github\"\n | \"facebook\"\n | \"twitter\"\n | \"discord\"\n | \"apple\"\n | \"microsoft\"\n | \"linkedin\"\n | \"spotify\"\n | \"twitch\"\n | \"slack\"\n | \"notion\";\n\n/**\n * Authentication form modes\n */\nexport type AuthMode = \"signIn\" | \"signUp\" | \"resetPassword\" | \"magicLink\";\n\n/**\n * User roles for RBAC (Role-Based Access Control)\n */\nexport type UserRole =\n | \"admin\"\n | \"user\"\n | \"moderator\"\n | \"guest\"\n | \"owner\"\n | \"editor\"\n | \"viewer\"\n | \"contributor\"\n | \"manager\"\n | \"developer\"\n | \"analyst\"\n | \"support\";\n\n/**\n * Password validation configuration\n */\nexport interface PasswordConfig {\n minLength?: number;\n requireUppercase?: boolean;\n requireLowercase?: boolean;\n requireNumbers?: boolean;\n requireSpecialChars?: boolean;\n}\n\n/**\n * Authentication configuration interface\n */\nexport interface AuthConfig {\n // Supabase configuration\n supabaseUrl?: string;\n supabaseAnonKey?: string;\n\n // Firebase configuration\n firebaseApiKey?: string;\n firebaseAuthDomain?: string;\n firebaseProjectId?: string;\n\n // General auth settings\n redirectTo?: string;\n redirectUrl?: string; // Alias for redirectTo\n autoRefreshToken?: boolean;\n persistSession?: boolean;\n maxLoginAttempts?: number;\n lockoutDuration?: number;\n jwtExpiryTime?: number;\n require2FA?: boolean;\n\n // Password requirements (both names for backward compatibility)\n password?: PasswordConfig;\n passwordRequirements?: PasswordConfig;\n}\n\n/**\n * OAuth result data for React Native deep linking\n */\nexport interface AuthResult {\n user: User | null;\n session: AuthSession | null;\n error?: Error | null;\n}\n\n/**\n * Props for AuthForm component\n */\nexport interface AuthFormProps {\n defaultMode?: AuthMode;\n onSuccess?: (() => void) | undefined;\n onError?: ((error: Error) => void) | undefined;\n redirectTo?: string | undefined;\n redirectUrl?: string | undefined; // Alias for redirectTo (React Native compatibility)\n providers?: OAuthProvider[] | undefined;\n allowMagicLink?: boolean | undefined;\n className?: string | undefined;\n // React Native specific props\n onOAuthSuccess?: ((result: AuthResult) => void) | undefined;\n appScheme?: string | undefined; // For React Native deep linking\n}\n\n/**\n * Zustand store interface for authentication state and actions\n * This represents the actual store hook that components will use\n */\nimport { IAuthProvider } from \"./core/IAuthProvider\";\n\nexport interface AuthStore {\n // State\n user: User | null;\n session: AuthSession | null; // Added session to the store\n loading: boolean;\n error: Error | null; // Changed error type to Error | null\n\n // Basic auth actions\n setUser: (user: User | null) => void; // Renamed from updateUser\n setSession: (session: AuthSession | null) => void; // Added setSession\n setLoading: (loading: boolean) => void;\n setError: (error: Error | null) => void; // Changed error type to Error | null\n setAuthProvider: (provider: IAuthProvider) => void; // Added setAuthProvider\n signIn: (email: string, password: string) => Promise<void>;\n signUp: (email: string, password: string) => Promise<void>;\n signOut: () => Promise<void>;\n resetPassword: (email: string) => Promise<void>;\n updateProfile: (updates: {\n name?: string;\n firstName?: string;\n lastName?: string;\n fullName?: string;\n avatar?: string;\n phone?: string;\n website?: string;\n bio?: string;\n [key: string]: unknown;\n }) => Promise<User | null>;\n\n // Extended auth methods (needed by UI components)\n signInWithOAuth: (\n provider: OAuthProvider,\n redirectTo?: string,\n ) => Promise<void>;\n signInWithMagicLink: (email: string, redirectTo?: string) => Promise<void>;\n getUser: () => Promise<User | null>;\n getSession: () => Promise<AuthSession | null>;\n refreshSession: () => Promise<AuthSession | null>;\n onAuthStateChange: (\n callback: (event: AuthEvent, session: AuthSession | null) => void,\n ) => { unsubscribe: () => void };\n}\n","import { createBrowserClient } from \"@supabase/ssr\";\nimport type {\n SupabaseClient,\n User as SupabaseUser,\n Session as SupabaseSession,\n} from \"@supabase/supabase-js\";\nimport {\n IAuthProvider,\n AuthError,\n AuthErrorType,\n OAuthProvider,\n} from \"./IAuthProvider\";\nimport { getAuthConfig, validateConfig } from \"../config/env\";\nimport { User, AuthSession, AuthEvent } from \"../types\";\n\n/**\n * Maps Supabase user to User interface with comprehensive profile support\n */\nconst mapSupabaseUserToUser = (\n supabaseUser: SupabaseUser | null,\n): User | null => {\n if (!supabaseUser) return null;\n\n const metadata = supabaseUser.user_metadata || {};\n\n return {\n id: supabaseUser.id,\n email: supabaseUser.email,\n emailVerified: supabaseUser.email_confirmed_at ? true : false,\n\n // Name fields with fallback logic\n name: metadata.name || metadata.full_name || metadata.display_name || null,\n firstName: metadata.firstName || metadata.first_name || null,\n lastName: metadata.lastName || metadata.last_name || null,\n fullName: metadata.fullName || metadata.full_name || metadata.name || null,\n\n // Profile fields\n avatar: metadata.avatar || metadata.avatar_url || metadata.picture || null,\n phone: metadata.phone || metadata.phone_number || null,\n website: metadata.website || null,\n bio: metadata.bio || null,\n\n // Additional metadata\n locale: metadata.locale || null,\n timezone: metadata.timezone || null,\n dateOfBirth: metadata.dateOfBirth || metadata.date_of_birth || null,\n\n // Timestamps\n createdAt: supabaseUser.created_at,\n updatedAt: supabaseUser.updated_at,\n lastSignInAt: supabaseUser.last_sign_in_at,\n\n // OAuth provider data\n providerData:\n supabaseUser.identities?.reduce(\n (acc, identity) => {\n if (identity.provider && identity.identity_data) {\n acc[identity.provider] = {\n id: identity.id,\n username: (identity.identity_data.user_name ||\n identity.identity_data.login ||\n undefined) as string | undefined,\n raw: identity.identity_data,\n };\n }\n return acc;\n },\n {} as Record<\n string,\n { id?: string; username?: string; raw?: Record<string, unknown> }\n >,\n ) || {},\n\n // Include all other metadata for backward compatibility\n ...metadata,\n };\n};\n\n/**\n * Maps Supabase error to AuthError with better network error detection\n */\nconst mapSupabaseError = (error: unknown): AuthError => {\n if (error instanceof AuthError) {\n return error;\n }\n\n // Handle cases where error is not an object or doesn't have a message\n if (typeof error !== \"object\" || error === null || !(\"message\" in error)) {\n return new AuthError(\n AuthErrorType.UNKNOWN,\n \"An unknown error occurred\",\n error,\n );\n }\n\n const err = error as { message: string; code?: string };\n const message = err.message || \"Unknown error occurred\";\n const code = err.code;\n\n // Check for network/DNS errors first\n if (\n code === \"ERR_NAME_NOT_RESOLVED\" ||\n message.includes(\"ERR_NAME_NOT_RESOLVED\")\n ) {\n return new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"Invalid Supabase URL. Please check your NEXT_PUBLIC_SUPABASE_URL configuration.\",\n err,\n );\n }\n\n if (message.includes(\"Failed to fetch\") || message.includes(\"NetworkError\")) {\n return new AuthError(\n AuthErrorType.NETWORK_ERROR,\n \"Network error. Please check your internet connection and Supabase URL.\",\n err,\n );\n }\n\n if (message.includes(\"Invalid login credentials\")) {\n return new AuthError(AuthErrorType.INVALID_CREDENTIALS, message, err);\n }\n if (message.includes(\"User not found\")) {\n return new AuthError(AuthErrorType.USER_NOT_FOUND, message, err);\n }\n if (message.includes(\"User already registered\")) {\n return new AuthError(AuthErrorType.EMAIL_ALREADY_EXISTS, message, err);\n }\n if (message.includes(\"Password should be\")) {\n return new AuthError(AuthErrorType.WEAK_PASSWORD, message, err);\n }\n if (message.includes(\"network\") || message.includes(\"fetch\")) {\n return new AuthError(AuthErrorType.NETWORK_ERROR, message, err);\n }\n\n return new AuthError(AuthErrorType.PROVIDER_ERROR, message, err);\n};\n\n/**\n * Validates email format\n */\nconst validateEmail = (email: string): void => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email)) {\n throw new AuthError(AuthErrorType.VALIDATION_ERROR, \"Invalid email format\");\n }\n};\n\n/**\n * Validates Supabase URL format\n */\nconst validateSupabaseUrl = (url: string): void => {\n // Check if URL is properly formatted\n if (!url || !url.startsWith(\"http\")) {\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"Supabase URL must start with http:// or https://\",\n );\n }\n\n // Check if it's a valid Supabase domain\n const urlObj = new URL(url);\n if (\n !urlObj.hostname.endsWith(\".supabase.co\") &&\n !urlObj.hostname.includes(\"localhost\")\n ) {\n console.warn(\"Warning: URL does not appear to be a valid Supabase URL\");\n }\n\n // Check for common mistakes\n if (url.includes(\"supabase.co/\") && !url.includes(\".supabase.co\")) {\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"Invalid Supabase URL format. Should be: https://[project-ref].supabase.co\",\n );\n }\n};\n\n/**\n * SSR-aware Supabase authentication provider implementation.\n *\n * This provider uses @supabase/ssr's createBrowserClient which properly handles\n * httpOnly cookies for server-side rendering frameworks like Next.js.\n *\n * Use this provider when:\n * - Your app uses Next.js with middleware authentication\n * - You need server-side session validation\n * - You're using Supabase SSR features\n *\n * @example\n * ```typescript\n * import { SupabaseSSRAuthProvider } from '@digilogiclabs/saas-factory-auth';\n *\n * // In your auth configuration\n * const provider = new SupabaseSSRAuthProvider();\n * ```\n */\nexport class SupabaseSSRAuthProvider implements IAuthProvider {\n private client: SupabaseClient;\n\n constructor() {\n const config = getAuthConfig();\n\n // Validate configuration\n validateConfig(config, \"supabase\");\n\n // Additional URL validation\n try {\n validateSupabaseUrl(config.supabaseUrl!);\n } catch (error) {\n console.error(\"Supabase URL validation failed:\", error);\n throw error;\n }\n\n // Create SSR-aware Supabase client using createBrowserClient\n // This client automatically handles httpOnly cookies for middleware auth\n try {\n this.client = createBrowserClient(\n config.supabaseUrl!,\n config.supabaseAnonKey!,\n );\n } catch (error) {\n console.error(\"Failed to create Supabase SSR client:\", error);\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"Failed to initialize Supabase SSR client. Please check your configuration.\",\n error,\n );\n }\n }\n\n /**\n * Validates Supabase configuration\n */\n async validateConfiguration(): Promise<void> {\n try {\n const config = getAuthConfig();\n validateConfig(config, \"supabase\");\n validateSupabaseUrl(config.supabaseUrl!);\n\n // Try to make a test request to verify connectivity\n const { error } = await this.client.auth.getSession();\n if (error && error.message.includes(\"ERR_NAME_NOT_RESOLVED\")) {\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"Cannot connect to Supabase. Please verify your NEXT_PUBLIC_SUPABASE_URL is correct.\",\n error,\n );\n }\n } catch (error) {\n if (error instanceof AuthError) {\n throw error;\n }\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n error instanceof Error\n ? error.message\n : \"Invalid Supabase configuration\",\n );\n }\n }\n\n async signIn(\n email: string,\n password: string,\n ): Promise<{\n user: User | null;\n session: AuthSession | null;\n error: AuthError | null;\n }> {\n try {\n validateEmail(email);\n\n const { data, error } = await this.client.auth.signInWithPassword({\n email,\n password,\n });\n\n if (error) {\n return { user: null, session: null, error: mapSupabaseError(error) };\n }\n\n const user = mapSupabaseUserToUser(data.user);\n const session: AuthSession | null = data.session\n ? {\n user: user!,\n access_token: data.session.access_token,\n refresh_token: data.session.refresh_token,\n expires_at: data.session.expires_at,\n }\n : null;\n\n return { user, session, error: null };\n } catch (error) {\n return {\n user: null,\n session: null,\n error: mapSupabaseError(error),\n };\n }\n }\n\n async signUp(\n email: string,\n password: string,\n ): Promise<{\n user: User | null;\n session: AuthSession | null;\n error: AuthError | null;\n }> {\n try {\n validateEmail(email);\n const { data, error } = await this.client.auth.signUp({\n email,\n password,\n });\n if (error) {\n return { user: null, session: null, error: mapSupabaseError(error) };\n }\n const user = mapSupabaseUserToUser(data.user);\n const session: AuthSession | null = data.session\n ? {\n user: user!,\n access_token: data.session.access_token,\n refresh_token: data.session.refresh_token,\n expires_at: data.session.expires_at,\n }\n : null;\n return { user, session, error: null };\n } catch (error) {\n return { user: null, session: null, error: mapSupabaseError(error) };\n }\n }\n\n async signInWithOAuth(\n provider: OAuthProvider,\n redirectTo?: string,\n ): Promise<void> {\n try {\n const options: { redirectTo?: string } = {};\n if (redirectTo) {\n options.redirectTo = redirectTo;\n }\n\n // Map our OAuthProvider types to Supabase's supported providers\n let supabaseProvider: string = provider;\n\n // Handle providers that might need mapping\n switch (provider) {\n case \"microsoft\":\n supabaseProvider = \"azure\"; // Supabase uses 'azure' for Microsoft\n break;\n case \"apple\":\n case \"google\":\n case \"github\":\n case \"facebook\":\n case \"twitter\":\n case \"discord\":\n case \"linkedin\":\n case \"spotify\":\n case \"twitch\":\n case \"slack\":\n case \"notion\":\n supabaseProvider = provider; // These are supported directly\n break;\n default:\n throw new AuthError(\n AuthErrorType.PROVIDER_ERROR,\n `OAuth provider '${provider}' is not supported by Supabase`,\n );\n }\n\n const { error } = await this.client.auth.signInWithOAuth({\n provider: supabaseProvider as Parameters<\n typeof this.client.auth.signInWithOAuth\n >[0][\"provider\"],\n options,\n });\n\n if (error) {\n throw mapSupabaseError(error);\n }\n } catch (error) {\n throw mapSupabaseError(error);\n }\n }\n\n async signInWithMagicLink(email: string, redirectTo?: string): Promise<void> {\n try {\n validateEmail(email);\n const options: { emailRedirectTo?: string } = {};\n if (redirectTo) {\n options.emailRedirectTo = redirectTo;\n }\n const { error } = await this.client.auth.signInWithOtp({\n email,\n options,\n });\n if (error) {\n throw mapSupabaseError(error);\n }\n } catch (error) {\n throw mapSupabaseError(error);\n }\n }\n\n async signOut(): Promise<{ error: AuthError | null }> {\n try {\n const { error } = await this.client.auth.signOut();\n if (error) {\n return { error: mapSupabaseError(error) };\n }\n return { error: null };\n } catch (error) {\n return { error: mapSupabaseError(error) };\n }\n }\n\n async getUser(): Promise<User | null> {\n try {\n const {\n data: { user },\n error,\n } = await this.client.auth.getUser();\n if (error) {\n throw mapSupabaseError(error);\n }\n return mapSupabaseUserToUser(user);\n } catch (error) {\n throw mapSupabaseError(error);\n }\n }\n\n async getSession(): Promise<AuthSession | null> {\n try {\n const {\n data: { session },\n error,\n } = await this.client.auth.getSession();\n\n if (error) {\n // Don't throw for \"Auth session missing\" during initialization\n if (error.message === \"Auth session missing!\") {\n return null;\n }\n throw mapSupabaseError(error);\n }\n\n if (!session) return null;\n\n const user = mapSupabaseUserToUser(session.user);\n return {\n user: user!,\n access_token: session.access_token,\n refresh_token: session.refresh_token,\n expires_at: session.expires_at,\n };\n } catch (error) {\n if (error instanceof AuthError) {\n throw error;\n }\n throw new AuthError(\n AuthErrorType.PROVIDER_ERROR,\n \"Get session failed\",\n error,\n );\n }\n }\n\n onAuthStateChange(\n callback: (event: AuthEvent, session: AuthSession | null) => void,\n ): { unsubscribe: () => void } {\n const {\n data: { subscription },\n } = this.client.auth.onAuthStateChange(\n (event, session: SupabaseSession | null) => {\n // Map Supabase events to our AuthEvent enum\n let authEvent: AuthEvent;\n switch (event) {\n case \"SIGNED_IN\":\n authEvent = AuthEvent.SIGNED_IN;\n break;\n case \"SIGNED_OUT\":\n authEvent = AuthEvent.SIGNED_OUT;\n break;\n case \"TOKEN_REFRESHED\":\n authEvent = AuthEvent.TOKEN_REFRESHED;\n break;\n case \"USER_UPDATED\":\n authEvent = AuthEvent.USER_UPDATED;\n break;\n case \"INITIAL_SESSION\":\n // Handle initial session event\n authEvent = session ? AuthEvent.SIGNED_IN : AuthEvent.SIGNED_OUT;\n break;\n case \"MFA_CHALLENGE_VERIFIED\":\n authEvent = AuthEvent.USER_UPDATED;\n break;\n case \"PASSWORD_RECOVERY\":\n authEvent = AuthEvent.USER_UPDATED;\n break;\n default:\n console.warn(`Unhandled Supabase auth event: ${event}`);\n authEvent = AuthEvent.USER_UPDATED;\n }\n\n // Map session to our format\n const user = mapSupabaseUserToUser(session?.user || null);\n const authSession: AuthSession | null =\n user && session\n ? {\n user: user,\n access_token: session.access_token,\n refresh_token: session.refresh_token,\n expires_at: session.expires_at,\n }\n : null;\n\n // Call the callback with mapped values\n callback(authEvent, authSession);\n },\n );\n\n return { unsubscribe: () => subscription.unsubscribe() };\n }\n\n async resetPassword(email: string): Promise<{ error: AuthError | null }> {\n try {\n validateEmail(email);\n const { error } = await this.client.auth.resetPasswordForEmail(email);\n if (error) {\n return { error: mapSupabaseError(error) };\n }\n return { error: null };\n } catch (error) {\n return { error: mapSupabaseError(error) };\n }\n }\n\n async updateProfile(updates: {\n name?: string;\n firstName?: string;\n lastName?: string;\n fullName?: string;\n avatar?: string;\n phone?: string;\n website?: string;\n bio?: string;\n [key: string]: unknown;\n }): Promise<{ user: User | null; error: AuthError | null }> {\n try {\n // Get current session to ensure user is authenticated\n const {\n data: { session },\n error: sessionError,\n } = await this.client.auth.getSession();\n\n if (sessionError || !session?.user) {\n return {\n user: null,\n error: new AuthError(\n AuthErrorType.INVALID_CREDENTIALS,\n \"User must be authenticated to update profile\",\n ),\n };\n }\n\n // Prepare the user metadata update with current metadata as base\n const userMetadata: Record<string, unknown> = {\n ...session.user.user_metadata,\n };\n\n // Handle name fields with intelligent merging\n if (updates.name !== undefined) {\n userMetadata.name = updates.name;\n userMetadata.display_name = updates.name; // Also set display_name for compatibility\n }\n\n if (updates.firstName !== undefined) {\n userMetadata.firstName = updates.firstName;\n userMetadata.first_name = updates.firstName; // Supabase convention\n }\n\n if (updates.lastName !== undefined) {\n userMetadata.lastName = updates.lastName;\n userMetadata.last_name = updates.lastName; // Supabase convention\n }\n\n if (updates.fullName !== undefined) {\n userMetadata.fullName = updates.fullName;\n userMetadata.full_name = updates.fullName; // Supabase convention\n userMetadata.name = updates.fullName; // Primary name field\n userMetadata.display_name = updates.fullName; // Display name\n }\n\n // If firstName and lastName are provided but no fullName, construct it\n if (\n (updates.firstName !== undefined || updates.lastName !== undefined) &&\n updates.fullName === undefined\n ) {\n const firstName =\n updates.firstName ||\n userMetadata.firstName ||\n userMetadata.first_name ||\n \"\";\n const lastName =\n updates.lastName ||\n userMetadata.lastName ||\n userMetadata.last_name ||\n \"\";\n const constructedFullName = `${firstName} ${lastName}`.trim();\n if (constructedFullName) {\n userMetadata.full_name = constructedFullName;\n userMetadata.fullName = constructedFullName;\n userMetadata.name = constructedFullName;\n }\n }\n\n // Profile fields with multiple format support\n if (updates.avatar !== undefined) {\n userMetadata.avatar = updates.avatar;\n userMetadata.avatar_url = updates.avatar; // Supabase/OAuth convention\n userMetadata.picture = updates.avatar; // OAuth provider convention\n }\n\n if (updates.phone !== undefined) {\n userMetadata.phone = updates.phone;\n userMetadata.phone_number = updates.phone; // Alternative format\n }\n\n if (updates.website !== undefined) {\n userMetadata.website = updates.website;\n }\n\n if (updates.bio !== undefined) {\n userMetadata.bio = updates.bio;\n }\n\n // Handle any additional custom fields\n const knownFields = [\n \"name\",\n \"firstName\",\n \"lastName\",\n \"fullName\",\n \"avatar\",\n \"phone\",\n \"website\",\n \"bio\",\n ];\n Object.keys(updates).forEach((key) => {\n if (!knownFields.includes(key)) {\n userMetadata[key] = updates[key];\n }\n });\n\n // Update user metadata in Supabase\n const { data, error } = await this.client.auth.updateUser({\n data: userMetadata,\n });\n\n if (error) {\n return { user: null, error: mapSupabaseError(error) };\n }\n\n // Return updated user with enhanced mapping\n const updatedUser = mapSupabaseUserToUser(data.user);\n return { user: updatedUser, error: null };\n } catch (error) {\n return { user: null, error: mapSupabaseError(error) };\n }\n }\n\n /**\n * Get the underlying Supabase client for advanced operations.\n * Use with caution - prefer the IAuthProvider methods when possible.\n */\n getClient(): SupabaseClient {\n return this.client;\n }\n}\n","import { initializeApp, FirebaseApp } from \"firebase/app\";\nimport {\n getAuth,\n Auth,\n signInWithEmailAndPassword,\n createUserWithEmailAndPassword,\n signOut as firebaseSignOut,\n sendPasswordResetEmail,\n onAuthStateChanged,\n signInWithPopup,\n GoogleAuthProvider,\n GithubAuthProvider,\n FacebookAuthProvider,\n TwitterAuthProvider,\n OAuthProvider as FirebaseOAuthProvider,\n User as FirebaseUser,\n sendSignInLinkToEmail,\n browserLocalPersistence,\n setPersistence,\n updateProfile as firebaseUpdateProfile,\n} from \"firebase/auth\";\nimport {\n IAuthProvider,\n AuthError,\n AuthErrorType,\n OAuthProvider,\n} from \"./IAuthProvider\";\nimport { getAuthConfig, validateConfig } from \"../config/env\";\nimport { IAuthStorage } from \"../config/storage\";\nimport { User, AuthSession, AuthEvent } from \"../types\";\n\n/**\n * Maps Firebase user to User interface\n */\nconst mapFirebaseUserToUser = (\n firebaseUser: FirebaseUser | null,\n): User | null => {\n if (!firebaseUser) return null;\n return {\n id: firebaseUser.uid,\n email: firebaseUser.email || undefined,\n name: firebaseUser.displayName,\n avatar: firebaseUser.photoURL,\n // Add other Firebase-specific metadata if needed\n phoneNumber: firebaseUser.phoneNumber,\n emailVerified: firebaseUser.emailVerified,\n isAnonymous: firebaseUser.isAnonymous,\n tenantId: firebaseUser.tenantId,\n providerData: firebaseUser.providerData as unknown as User[\"providerData\"],\n creationTime: firebaseUser.metadata?.creationTime,\n lastSignInTime: firebaseUser.metadata?.lastSignInTime,\n };\n};\n\n/**\n * Helper to get access token from Firebase user\n */\nconst getFirebaseAccessToken = async (user: FirebaseUser): Promise<string> => {\n try {\n return await user.getIdToken();\n } catch (error) {\n console.warn(\"Failed to get Firebase ID token:\", error);\n return \"\";\n }\n};\n\n/**\n * Maps Firebase error to AuthError\n */\nconst mapFirebaseError = (error: {\n code?: string;\n message?: string;\n}): AuthError => {\n const code = error.code || \"\";\n const message = error.message || \"Unknown error occurred\";\n\n switch (code) {\n case \"auth/invalid-email\":\n case \"auth/user-disabled\":\n case \"auth/user-not-found\":\n case \"auth/wrong-password\":\n case \"auth/invalid-credential\":\n return new AuthError(AuthErrorType.INVALID_CREDENTIALS, message, error);\n\n case \"auth/email-already-in-use\":\n return new AuthError(AuthErrorType.EMAIL_ALREADY_EXISTS, message, error);\n\n case \"auth/weak-password\":\n return new AuthError(AuthErrorType.WEAK_PASSWORD, message, error);\n\n case \"auth/network-request-failed\":\n case \"auth/timeout\":\n return new AuthError(AuthErrorType.NETWORK_ERROR, message, error);\n\n case \"auth/configuration-not-found\":\n case \"auth/invalid-api-key\":\n return new AuthError(AuthErrorType.CONFIGURATION_ERROR, message, error);\n\n default:\n return new AuthError(AuthErrorType.PROVIDER_ERROR, message, error);\n }\n};\n\n/**\n * Validates email format\n */\nconst validateEmail = (email: string): void => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(email)) {\n throw new AuthError(AuthErrorType.VALIDATION_ERROR, \"Invalid email format\");\n }\n};\n\ntype FirebaseOAuthProviderType =\n | GoogleAuthProvider\n | GithubAuthProvider\n | FacebookAuthProvider\n | TwitterAuthProvider\n | FirebaseOAuthProvider;\n\n/**\n * Gets OAuth provider instance for Firebase\n */\nconst getOAuthProvider = (\n provider: OAuthProvider,\n): FirebaseOAuthProviderType => {\n switch (provider) {\n case \"google\":\n return new GoogleAuthProvider();\n case \"github\":\n return new GithubAuthProvider();\n case \"facebook\":\n return new FacebookAuthProvider();\n case \"twitter\":\n return new TwitterAuthProvider();\n case \"apple\": {\n const appleProvider = new FirebaseOAuthProvider(\"apple.com\");\n return appleProvider;\n }\n case \"discord\": {\n const discordProvider = new FirebaseOAuthProvider(\"discord.com\");\n return discordProvider;\n }\n default:\n throw new AuthError(\n AuthErrorType.VALIDATION_ERROR,\n `Unsupported OAuth provider for Firebase: ${provider}`,\n );\n }\n};\n\n/**\n * Firebase authentication provider implementation\n */\nexport class FirebaseAuthProvider implements IAuthProvider {\n private app: FirebaseApp;\n private auth: Auth;\n private storage: IAuthStorage;\n\n constructor(storage: IAuthStorage) {\n this.storage = storage;\n const config = getAuthConfig();\n validateConfig(config, \"firebase\");\n\n this.app = initializeApp({\n apiKey: config.firebaseApiKey!,\n authDomain: config.firebaseAuthDomain!,\n projectId: config.firebaseProjectId!,\n });\n\n this.auth = getAuth(this.app);\n // Explicitly set persistence for clarity and control\n // For web, browserLocalPersistence is often the default, but explicit is better.\n // For React Native, a custom storage solution would be needed here.\n // @ts-expect-error - `setPersistence` is available in web but not all environments.\n setPersistence(this.auth, this.storage || browserLocalPersistence).catch(\n (error) => {\n console.error(\"Failed to set Firebase auth persistence:\", error);\n },\n );\n }\n\n /**\n * Validates Firebase configuration\n */\n async validateConfiguration(): Promise<void> {\n try {\n const config = getAuthConfig();\n validateConfig(config, \"firebase\");\n } catch (error) {\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n error instanceof Error\n ? error.message\n : \"Invalid Firebase configuration\",\n );\n }\n }\n\n async signIn(\n email: string,\n password: string,\n ): Promise<{\n user: User | null;\n session: AuthSession | null;\n error: AuthError | null;\n }> {\n try {\n validateEmail(email);\n\n const userCredential = await signInWithEmailAndPassword(\n this.auth,\n email,\n password,\n );\n const user = mapFirebaseUserToUser(userCredential.user);\n const accessToken = await getFirebaseAccessToken(userCredential.user);\n\n const session: AuthSession | null = user\n ? {\n user: user,\n access_token: accessToken,\n refresh_token: undefined, // Firebase doesn't expose refresh token directly\n expires_at: undefined, // Firebase handles token expiration internally\n }\n : null;\n\n return { user, session, error: null };\n } catch (error) {\n return {\n user: null,\n session: null,\n error: mapFirebaseError(error as { code?: string; message?: string }),\n };\n }\n }\n\n async signUp(\n email: string,\n password: string,\n ): Promise<{\n user: User | null;\n session: AuthSession | null;\n error: AuthError | null;\n }> {\n try {\n validateEmail(email);\n\n const userCredential = await createUserWithEmailAndPassword(\n this.auth,\n email,\n password,\n );\n const user = mapFirebaseUserToUser(userCredential.user);\n const accessToken = await getFirebaseAccessToken(userCredential.user);\n\n const session: AuthSession | null = user\n ? {\n user: user,\n access_token: accessToken,\n refresh_token: undefined,\n expires_at: undefined,\n }\n : null;\n\n return { user, session, error: null };\n } catch (error) {\n return {\n user: null,\n session: null,\n error: mapFirebaseError(error as { code?: string; message?: string }),\n };\n }\n }\n\n async signInWithOAuth(\n provider: OAuthProvider,\n redirectTo?: string,\n ): Promise<void> {\n try {\n const authProvider = getOAuthProvider(provider);\n\n if (redirectTo) {\n console.warn(\n \"redirectTo is not directly supported for Firebase signInWithPopup. \" +\n \"Consider using signInWithRedirect or handling redirects manually.\",\n );\n }\n\n await signInWithPopup(this.auth, authProvider);\n } catch (error) {\n if (error instanceof AuthError) {\n throw error;\n }\n throw mapFirebaseError(error as { code?: string; message?: string });\n }\n }\n\n async signInWithMagicLink(email: string, redirectTo?: string): Promise<void> {\n try {\n validateEmail(email);\n\n if (!redirectTo) {\n throw new AuthError(\n AuthErrorType.VALIDATION_ERROR,\n \"redirectTo is required for Firebase magic link sign-in\",\n );\n }\n\n await sendSignInLinkToEmail(this.auth, email, {\n url: redirectTo,\n handleCodeInApp: true,\n });\n } catch (error) {\n if (error instanceof AuthError) {\n throw error;\n }\n throw mapFirebaseError(error as { code?: string; message?: string });\n }\n }\n\n async signOut(): Promise<{ error: AuthError | null }> {\n try {\n await firebaseSignOut(this.auth);\n return { error: null };\n } catch (error) {\n return { error: mapFirebaseError(error as Error) };\n }\n }\n\n async resetPassword(email: string): Promise<{ error: AuthError | null }> {\n try {\n validateEmail(email);\n\n await sendPasswordResetEmail(this.auth, email);\n return { error: null };\n } catch (error) {\n return {\n error: mapFirebaseError(error as { code?: string; message?: string }),\n };\n }\n }\n\n async getUser(): Promise<User | null> {\n return mapFirebaseUserToUser(this.auth.currentUser);\n }\n\n async getSession(): Promise<AuthSession | null> {\n try {\n const currentUser = this.auth.currentUser;\n if (!currentUser) return null;\n\n const idTokenResult = await currentUser.getIdTokenResult();\n const user = mapFirebaseUserToUser(currentUser);\n\n return {\n user: user!,\n access_token: idTokenResult.token,\n refresh_token: undefined, // Firebase doesn't expose refresh token in IdTokenResult\n expires_at: idTokenResult.expirationTime\n ? new Date(idTokenResult.expirationTime).getTime()\n : undefined,\n };\n } catch (error) {\n throw mapFirebaseError(error as { code?: string; message?: string });\n }\n }\n\n onAuthStateChange(\n callback: (event: AuthEvent, session: AuthSession | null) => void,\n ): { unsubscribe: () => void } {\n const unsubscribe = onAuthStateChanged(this.auth, async (user) => {\n const mappedUser = mapFirebaseUserToUser(user);\n let authEvent: AuthEvent;\n let authSession: AuthSession | null = null;\n\n if (user) {\n authEvent = AuthEvent.SIGNED_IN;\n try {\n const idTokenResult = await user.getIdTokenResult();\n authSession = {\n user: mappedUser!,\n access_token: idTokenResult.token,\n refresh_token: undefined, // Firebase doesn't expose refresh token\n expires_at: idTokenResult.expirationTime\n ? new Date(idTokenResult.expirationTime).getTime()\n : undefined,\n };\n } catch (error) {\n console.error(\n \"Error getting Firebase session in onAuthStateChange:\",\n error,\n );\n // Fallback to basic session\n const accessToken = await getFirebaseAccessToken(user);\n authSession = {\n user: mappedUser!,\n access_token: accessToken,\n refresh_token: undefined,\n expires_at: undefined,\n };\n }\n } else {\n authEvent = AuthEvent.SIGNED_OUT;\n }\n\n callback(authEvent, authSession);\n });\n\n return { unsubscribe };\n }\n\n async updateProfile(updates: {\n name?: string;\n firstName?: string;\n lastName?: string;\n fullName?: string;\n avatar?: string;\n phone?: string;\n website?: string;\n bio?: string;\n [key: string]: unknown;\n }): Promise<{ user: User | null; error: AuthError | null }> {\n try {\n const currentUser = this.auth.currentUser;\n\n if (!currentUser) {\n return {\n user: null,\n error: new AuthError(\n AuthErrorType.INVALID_CREDENTIALS,\n \"User must be authenticated to update profile\",\n ),\n };\n }\n\n // Prepare Firebase profile update (displayName, photoURL are the main supported fields)\n const profileUpdate: {\n displayName?: string | null;\n photoURL?: string | null;\n } = {};\n\n // Firebase native profile fields\n if (updates.name !== undefined) {\n profileUpdate.displayName = updates.name;\n } else if (updates.fullName !== undefined) {\n profileUpdate.displayName = updates.fullName;\n } else if (updates.firstName || updates.lastName) {\n // Combine firstName and lastName if fullName not provided\n const firstName = updates.firstName || \"\";\n const lastName = updates.lastName || \"\";\n profileUpdate.displayName = `${firstName} ${lastName}`.trim() || null;\n }\n\n if (updates.avatar !== undefined) {\n profileUpdate.photoURL = updates.avatar;\n }\n\n // Update Firebase profile for displayName and photoURL\n if (Object.keys(profileUpdate).length > 0) {\n await firebaseUpdateProfile(currentUser, profileUpdate);\n }\n\n // Note: Firebase doesn't have built-in support for extended user metadata like Supabase\n // Additional fields like phone, website, bio, etc., would need to be stored in Firestore\n // or Firebase Realtime Database separately. For now, we'll warn about unsupported fields.\n\n const unsupportedFields = Object.keys(updates).filter(\n (key) =>\n ![\"name\", \"firstName\", \"lastName\", \"fullName\", \"avatar\"].includes(\n key,\n ),\n );\n\n if (unsupportedFields.length > 0) {\n console.warn(\n `Firebase updateProfile: The following fields are not natively supported by Firebase Auth and were ignored: ${unsupportedFields.join(\", \")}.` +\n \" Consider storing extended user data in Firestore or Firebase Realtime Database.\",\n );\n }\n\n // Return updated user\n const updatedUser = mapFirebaseUserToUser(currentUser);\n return { user: updatedUser, error: null };\n } catch (error) {\n return {\n user: null,\n error: mapFirebaseError(error as { code?: string; message?: string }),\n };\n }\n }\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype LinkingType = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ReactNativeModule = any;\n\nexport type AsyncStorageModule = {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n};\n\ninterface NativeRuntimeModules {\n reactNative?: ReactNativeModule;\n linking?: LinkingType;\n asyncStorage?: AsyncStorageModule | null;\n}\n\nlet nativeModules: NativeRuntimeModules = {};\n\nexport const registerNativeRuntime = (modules: NativeRuntimeModules): void => {\n nativeModules = { ...nativeModules, ...modules };\n};\n\nexport const getReactNativeRuntime = (): ReactNativeModule | undefined => {\n return nativeModules.reactNative;\n};\n\nexport const getLinkingModule = (): LinkingType | null => {\n if (nativeModules.linking) {\n return nativeModules.linking;\n }\n return nativeModules.reactNative?.Linking ?? null;\n};\n\nexport const getAsyncStorageModule = (): AsyncStorageModule | null => {\n if (nativeModules.asyncStorage) {\n return nativeModules.asyncStorage;\n }\n return nativeModules.reactNative?.AsyncStorage ?? null;\n};\n\nexport const hasRegisteredNativeRuntime = (): boolean => {\n return !!nativeModules.reactNative || !!nativeModules.asyncStorage;\n};\n","import {\n getAsyncStorageModule,\n getReactNativeRuntime,\n hasRegisteredNativeRuntime,\n} from \"../native/runtime\";\n\n/**\n * Storage interface for cross-platform compatibility\n */\nexport interface IAuthStorage {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\n/**\n * Web browser localStorage implementation\n */\nclass BrowserStorage implements IAuthStorage {\n async getItem(key: string): Promise<string | null> {\n try {\n return localStorage.getItem(key);\n } catch {\n console.warn(\"localStorage not available\");\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n try {\n localStorage.setItem(key, value);\n } catch {\n console.warn(\"localStorage setItem failed\");\n }\n }\n\n async removeItem(key: string): Promise<void> {\n try {\n localStorage.removeItem(key);\n } catch {\n console.warn(\"localStorage removeItem failed\");\n }\n }\n}\n\n// Minimal interface for AsyncStorage to avoid `any` type\ninterface AsyncStorage {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n}\n\n/**\n * React Native AsyncStorage implementation with improved error handling\n */\nclass ReactNativeStorage implements IAuthStorage {\n private AsyncStorage: AsyncStorage | null = null;\n private initialized = false;\n private warnedUnavailable = false;\n\n constructor() {\n this.initializeAsyncStorage();\n }\n\n private initializeAsyncStorage(force = false) {\n if (!force && this.initialized && this.AsyncStorage) {\n return;\n }\n\n const registeredStorage = getAsyncStorageModule();\n\n if (registeredStorage) {\n this.AsyncStorage = registeredStorage;\n this.initialized = true;\n this.warnedUnavailable = false;\n return;\n }\n\n const legacyStorage = getReactNativeRuntime()?.AsyncStorage ?? null;\n\n if (legacyStorage) {\n this.AsyncStorage = legacyStorage;\n this.initialized = true;\n this.warnedUnavailable = false;\n return;\n }\n\n this.AsyncStorage = null;\n this.initialized = false;\n\n if (!this.warnedUnavailable) {\n console.warn(\n \"AsyncStorage not available - falling back to memory storage\",\n );\n this.warnedUnavailable = true;\n }\n }\n\n private ensureInitialized(): void {\n if (!this.initialized || !this.AsyncStorage) {\n this.initializeAsyncStorage(true);\n }\n }\n\n async getItem(key: string): Promise<string | null> {\n this.ensureInitialized();\n\n if (!this.AsyncStorage || !this.initialized) {\n console.warn(\"AsyncStorage not initialized\");\n return null;\n }\n\n try {\n const value = await this.AsyncStorage.getItem(key);\n return value;\n } catch (error) {\n console.warn(\"AsyncStorage getItem failed:\", error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n this.ensureInitialized();\n\n if (!this.AsyncStorage || !this.initialized) {\n console.warn(\"AsyncStorage not initialized\");\n return;\n }\n\n try {\n await this.AsyncStorage.setItem(key, value);\n } catch (error) {\n console.warn(\"AsyncStorage setItem failed:\", error);\n }\n }\n\n async removeItem(key: string): Promise<void> {\n this.ensureInitialized();\n\n if (!this.AsyncStorage || !this.initialized) {\n console.warn(\"AsyncStorage not initialized\");\n return;\n }\n\n try {\n await this.AsyncStorage.removeItem(key);\n } catch (error) {\n console.warn(\"AsyncStorage removeItem failed:\", error);\n }\n }\n\n /**\n * Check if AsyncStorage is available and initialized\n */\n isAvailable(): boolean {\n this.ensureInitialized();\n return this.initialized && this.AsyncStorage !== null;\n }\n\n /**\n * Clear all stored authentication data\n */\n async clearAuthData(): Promise<void> {\n this.ensureInitialized();\n\n if (!this.AsyncStorage || !this.initialized) return;\n\n try {\n const authKeys = [\n \"supabase.auth.token\",\n \"firebase.auth.token\",\n \"auth.session\",\n \"auth.user\",\n \"auth.provider\",\n ];\n\n await Promise.all(authKeys.map((key) => this.removeItem(key)));\n } catch (error) {\n console.warn(\"Failed to clear auth data:\", error);\n }\n }\n}\n\n/**\n * In-memory storage fallback (for SSR or when other storage is unavailable)\n */\nclass MemoryStorage implements IAuthStorage {\n private storage: Map<string, string> = new Map();\n\n async getItem(key: string): Promise<string | null> {\n return this.storage.get(key) || null;\n }\n\n async setItem(key: string, value: string): Promise<void> {\n this.storage.set(key, value);\n }\n\n async removeItem(key: string): Promise<void> {\n this.storage.delete(key);\n }\n}\n\n/**\n * Detect if we're running in React Native environment\n */\nexport const isReactNative = (): boolean => {\n if (hasRegisteredNativeRuntime()) {\n return true;\n }\n\n if (typeof navigator !== \"undefined\" && navigator.product === \"ReactNative\") {\n return true;\n }\n\n type ReactNativeGlobal = {\n navigator?: { product?: string };\n ReactNativeVersion?: unknown;\n HermesInternal?: unknown;\n nativeFabricUIManager?: unknown;\n __turboModuleProxy?: unknown;\n __DEV__?: boolean;\n window?: unknown;\n document?: unknown;\n };\n\n const globalRef =\n typeof globalThis !== \"undefined\"\n ? (globalThis as ReactNativeGlobal)\n : undefined;\n\n if (globalRef?.navigator?.product === \"ReactNative\") {\n return true;\n }\n\n if (globalRef?.ReactNativeVersion) {\n return true;\n }\n\n if (globalRef?.HermesInternal) {\n return true;\n }\n\n if (globalRef?.nativeFabricUIManager || globalRef?.__turboModuleProxy) {\n return true;\n }\n\n if (\n globalRef?.__DEV__ !== undefined &&\n typeof globalRef.window === \"undefined\" &&\n typeof globalRef.document === \"undefined\"\n ) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Auto-detects platform and returns appropriate storage implementation\n */\nexport const createAuthStorage = (): IAuthStorage => {\n // Check if we're in React Native first (before browser check)\n if (isReactNative()) {\n return new ReactNativeStorage();\n }\n\n // Check if we're in a browser environment\n if (typeof window !== \"undefined\" && window.localStorage) {\n return new BrowserStorage();\n }\n\n // Check for Next.js SSR or Node.js environment\n if (typeof process !== \"undefined\" && process.versions?.node) {\n return new MemoryStorage();\n }\n\n // Fallback to memory storage\n return new MemoryStorage();\n};\n\n/**\n * Get platform-specific storage with additional React Native utilities\n */\nexport const getAuthStorage = (): IAuthStorage & {\n isAvailable?: () => boolean;\n clearAuthData?: () => Promise<void>;\n} => {\n const storage = createAuthStorage();\n\n // Add utility methods for React Native storage\n if (isReactNative() && storage instanceof ReactNativeStorage) {\n return storage as ReactNativeStorage;\n }\n\n return storage;\n};\n","import { IAuthProvider, AuthError, AuthErrorType } from \"./IAuthProvider\";\nimport { SupabaseAuthProvider } from \"./SupabaseAuthProvider\";\nimport { SupabaseSSRAuthProvider } from \"./SupabaseSSRAuthProvider\";\nimport { FirebaseAuthProvider } from \"./FirebaseAuthProvider\";\nimport { getAuthConfig } from \"../config/env\";\nimport { IAuthStorage, createAuthStorage } from \"../config/storage\";\n\n/**\n * Supported authentication provider types\n */\nexport type AuthProviderType = \"supabase\" | \"supabase-ssr\" | \"firebase\";\n\n/**\n * Configuration interface for provider factory\n */\nexport interface AuthProviderConfig {\n /** Provider type to use */\n type: AuthProviderType;\n /** Whether to validate configuration on creation */\n validateConfig?: boolean;\n /** Whether to use singleton pattern */\n useSingleton?: boolean;\n /** Custom storage implementation (optional, not used for SSR provider) */\n storage?: IAuthStorage;\n /**\n * Enable SSR mode for Supabase provider.\n * When true, uses createBrowserClient from @supabase/ssr which handles\n * httpOnly cookies for middleware authentication in Next.js.\n *\n * @default false\n */\n ssr?: boolean;\n}\n\n/**\n * Factory class for creating authentication providers with improved patterns\n */\nexport class AuthProviderFactory {\n private static instances: Map<AuthProviderType, IAuthProvider> = new Map();\n\n /**\n * Gets provider based on environment variables (auto-detection)\n * @param config Optional configuration overrides\n * @returns Authentication provider instance\n */\n static async getProviderFromEnvironment(\n config?: Partial<AuthProviderConfig>,\n ): Promise<IAuthProvider> {\n const detectedType = this.detectProviderFromEnvironment();\n\n return this.getProvider({\n type: detectedType,\n validateConfig: true,\n useSingleton: true,\n ...config,\n });\n }\n\n /**\n * Gets provider instance with configuration\n * @param config Provider configuration\n * @returns Authentication provider instance\n */\n static async getProvider(config: AuthProviderConfig): Promise<IAuthProvider> {\n const {\n type,\n validateConfig = false,\n useSingleton = false,\n storage,\n ssr,\n } = config;\n\n // Determine the effective type for singleton caching\n // When ssr=true with supabase, treat as 'supabase-ssr' for caching purposes\n const effectiveType: AuthProviderType =\n type === \"supabase\" && ssr ? \"supabase-ssr\" : type;\n\n // Return singleton instance if requested and exists\n if (useSingleton && this.instances.has(effectiveType)) {\n const instance = this.instances.get(effectiveType)!;\n if (validateConfig && instance.validateConfiguration) {\n await instance.validateConfiguration();\n }\n return instance;\n }\n\n // Create new instance\n const provider = this.createProvider(type, storage, ssr);\n\n // Validate configuration if requested\n if (validateConfig && provider.validateConfiguration) {\n await provider.validateConfiguration();\n }\n\n // Store singleton if requested\n if (useSingleton) {\n this.instances.set(effectiveType, provider);\n }\n\n return provider;\n }\n\n /**\n * Creates a new provider instance without caching\n * @param type Provider type\n * @param storage Optional custom storage implementation\n * @param ssr Whether to use SSR mode (for Supabase)\n * @returns Authentication provider instance\n */\n static createProvider(\n type: AuthProviderType,\n storage?: IAuthStorage,\n ssr?: boolean,\n ): IAuthProvider {\n const authStorage = storage || createAuthStorage();\n\n switch (type) {\n case \"supabase\":\n // Use SSR provider if ssr flag is set\n if (ssr) {\n return new SupabaseSSRAuthProvider();\n }\n return new SupabaseAuthProvider(authStorage);\n case \"supabase-ssr\":\n // Explicit SSR provider type\n return new SupabaseSSRAuthProvider();\n case \"firebase\":\n return new FirebaseAuthProvider(authStorage);\n default:\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n `Unsupported authentication provider: ${type}. Supported providers: supabase, supabase-ssr, firebase`,\n );\n }\n }\n\n /**\n * Detects provider type from environment variables\n * @returns Detected provider type\n */\n private static detectProviderFromEnvironment(): AuthProviderType {\n const config = getAuthConfig();\n\n // Check for Supabase environment variables\n const hasSupabaseConfig = !!(config.supabaseUrl && config.supabaseAnonKey);\n\n // Check for Firebase environment variables\n const hasFirebaseConfig = !!(\n config.firebaseApiKey &&\n config.firebaseAuthDomain &&\n config.firebaseProjectId\n );\n\n // Explicit provider selection via environment variable\n const explicitProvider = this.getExplicitProvider();\n if (explicitProvider && this.isValidProviderType(explicitProvider)) {\n return explicitProvider;\n }\n\n // Auto-detection based on available configuration\n if (hasSupabaseConfig && !hasFirebaseConfig) {\n return \"supabase\";\n }\n\n if (hasFirebaseConfig && !hasSupabaseConfig) {\n return \"firebase\";\n }\n\n // Both configurations present - prefer explicit or default to Supabase\n if (hasSupabaseConfig && hasFirebaseConfig) {\n console.warn(\n \"Both Supabase and Firebase configurations detected. \" +\n \"Set AUTH_PROVIDER environment variable to explicitly choose a provider. \" +\n \"Defaulting to Supabase.\",\n );\n return \"supabase\";\n }\n\n // No configuration found\n throw new AuthError(\n AuthErrorType.CONFIGURATION_ERROR,\n \"No authentication provider configuration found. \" +\n \"Please configure either Supabase or Firebase environment variables.\",\n );\n }\n\n /**\n * Gets explicit provider from environment variables (platform-agnostic)\n */\n private static getExplicitProvider(): string | undefined {\n // Try different environment variable patterns based on platform\n if (typeof process !== \"undefined\" && process.env) {\n return process.env.NEXT_PUBLIC_AUTH_PROVIDER || process.env.AUTH_PROVIDER;\n }\n\n // For React Native with expo-constants\n try {\n const Constants = new Function(\n \"return require('expo-constants').default\",\n )();\n return Constants.expoConfig?.extra?.authProvider;\n } catch {\n // Expo constants not available\n }\n\n // For React Native with react-native-config\n try {\n const Config = new Function(\n \"return require('react-native-config').default\",\n )();\n return Config.AUTH_PROVIDER;\n } catch {\n // react-native-config not available\n }\n\n return undefined;\n }\n\n /**\n * Validates if a string is a valid provider type\n * @param type String to validate\n * @returns True if valid provider type\n */\n private static isValidProviderType(type: string): type is AuthProviderType {\n return (\n type === \"supabase\" || type === \"supabase-ssr\" || type === \"firebase\"\n );\n }\n\n /**\n * Gets list of supported provider types\n * @returns Array of supported provider types\n */\n static getSupportedProviders(): AuthProviderType[] {\n return [\"supabase\", \"supabase-ssr\", \"firebase\"];\n }\n\n /**\n * Checks if a provider type is supported\n * @param type Provider type to check\n * @returns True if supported\n */\n static isProviderSupported(type: string): type is AuthProviderType {\n return this.isValidProviderType(type);\n }\n\n /**\n * Clears singleton instances (useful for testing)\n */\n static clearInstances(): void {\n this.instances.clear();\n }\n\n /**\n * Gets current singleton instances (useful for debugging)\n * @returns Map of current instances\n */\n static getInstances(): Map<AuthProviderType, IAuthProvider> {\n return new Map(this.instances);\n }\n}\n","import { create } from \"zustand\";\nimport { persist, devtools, createJSONStorage } from \"zustand/middleware\";\nimport { immer } from \"zustand/middleware/immer\";\nimport {\n AuthStore,\n OAuthProvider,\n AuthEvent,\n AuthSession,\n User,\n} from \"../types\";\nimport { IAuthProvider } from \"../core/IAuthProvider\";\n\nexport interface AuthState extends AuthStore {\n authProvider: IAuthProvider | null;\n setAuthProvider: (provider: IAuthProvider) => void;\n setSession: (session: AuthSession | null) => void;\n}\n\nexport const useAuthStore = create<AuthState>()(\n devtools(\n persist(\n immer((set: (fn: (state: AuthState) => void) => void, get) => ({\n // State\n user: null,\n session: null, // Added session to the store\n loading: true,\n error: null,\n authProvider: null, // Initialize authProvider as null\n\n // Basic state actions\n setUser: (user: User | null) =>\n set((state) => {\n state.user = user;\n state.error = null;\n }),\n setSession: (session: AuthSession | null) =>\n set((state) => {\n state.session = session;\n }), // Setter for session\n setLoading: (loading: boolean) =>\n set((state) => {\n state.loading = loading;\n }),\n setError: (error: Error | null) =>\n set((state) => {\n state.error = error;\n }),\n setAuthProvider: (provider: IAuthProvider) =>\n set((state) => {\n state.authProvider = provider;\n }),\n\n // Authentication actions\n signIn: async (email, password) => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n set((state) => {\n state.loading = true;\n state.error = null;\n });\n try {\n const { user, error } = await provider.signIn(email, password);\n if (error) throw error;\n set((state) => {\n state.user = user;\n state.loading = false;\n });\n } catch (error: unknown) {\n set((state) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n state.loading = false;\n });\n throw error;\n }\n },\n\n signUp: async (email, password) => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n set((state) => {\n state.loading = true;\n state.error = null;\n });\n try {\n const { user, error } = await provider.signUp(email, password);\n if (error) throw error;\n set((state) => {\n state.user = user;\n state.loading = false;\n });\n } catch (error: unknown) {\n set((state) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n state.loading = false;\n });\n throw error;\n }\n },\n\n signOut: async () => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n set((state) => {\n state.loading = true;\n state.error = null;\n });\n try {\n const { error } = await provider.signOut();\n if (error) throw error;\n set((state) => {\n state.user = null;\n state.session = null;\n state.loading = false;\n }); // Clear session on sign out\n } catch (error: unknown) {\n set((state) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n state.loading = false;\n });\n throw error;\n }\n },\n\n resetPassword: async (email) => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n set((state) => {\n state.loading = true;\n state.error = null;\n });\n try {\n const { error } = await provider.resetPassword(email);\n if (error) throw error;\n set((state) => {\n state.loading = false;\n });\n } catch (error: unknown) {\n set((state) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n state.loading = false;\n });\n throw error;\n }\n },\n\n updateProfile: async (updates: {\n name?: string;\n firstName?: string;\n lastName?: string;\n fullName?: string;\n avatar?: string;\n phone?: string;\n website?: string;\n bio?: string;\n [key: string]: unknown;\n }) => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n set((state) => {\n state.loading = true;\n state.error = null;\n });\n try {\n const { user, error } = await provider.updateProfile(updates);\n if (error) throw error;\n\n // Update the user in store and session if it exists\n set((state) => {\n state.user = user;\n if (state.session && user) {\n state.session.user = user;\n }\n state.loading = false;\n });\n\n return user;\n } catch (error: unknown) {\n set((state) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n state.loading = false;\n });\n throw error;\n }\n },\n\n // Extended auth methods (delegated to provider)\n signInWithOAuth: async (\n providerName: OAuthProvider,\n redirectTo?: string,\n ) => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n set((state) => {\n state.loading = true;\n state.error = null;\n });\n try {\n await provider.signInWithOAuth(providerName, redirectTo);\n set((state) => {\n state.loading = false;\n });\n } catch (error: unknown) {\n set((state) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n state.loading = false;\n });\n throw error;\n }\n },\n\n signInWithMagicLink: async (email: string, redirectTo?: string) => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n set((state) => {\n state.loading = true;\n state.error = null;\n });\n try {\n await provider.signInWithMagicLink(email, redirectTo);\n set((state) => {\n state.loading = false;\n });\n } catch (error: unknown) {\n set((state) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n state.loading = false;\n });\n throw error;\n }\n },\n\n getUser: async () => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n try {\n const user = await provider.getUser();\n set((state) => {\n state.user = user;\n });\n return user;\n } catch (error: unknown) {\n set((state) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n });\n throw error;\n }\n },\n\n getSession: async () => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n try {\n return await provider.getSession();\n } catch (error: unknown) {\n set((state) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n });\n throw error;\n }\n },\n\n refreshSession: async () => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n try {\n const session = await provider.getSession();\n if (session) {\n set((state) => {\n state.session = session;\n state.user = session.user;\n });\n }\n return session;\n } catch (error: unknown) {\n set((state) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n });\n throw error;\n }\n },\n\n onAuthStateChange: (\n callback: (event: AuthEvent, session: AuthSession | null) => void,\n ) => {\n const provider = get().authProvider;\n if (!provider) throw new Error(\"Auth provider not initialized.\");\n return provider.onAuthStateChange(callback);\n },\n })),\n {\n name: \"auth-storage\",\n storage: createJSONStorage(() => localStorage),\n partialize: (state) =>\n Object.fromEntries(\n Object.entries(state).filter(([key]) =>\n [\"user\", \"session\"].includes(key),\n ),\n ),\n },\n ),\n ),\n);\n","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { useAuthForm } from \"../../../hooks/useAuthForm\";\nimport { AuthFormProps, AuthMode, OAuthProvider } from \"../../../types\";\n\nexport const AuthForm: React.FC<AuthFormProps> = ({\n defaultMode = \"signIn\",\n onSuccess,\n onError,\n redirectTo,\n providers = [\"google\", \"github\"],\n allowMagicLink = true,\n}) => {\n const [mode, setMode] = useState<AuthMode>(defaultMode);\n const {\n email,\n password,\n setEmail,\n setPassword,\n handleSignIn,\n handleSignUp,\n handlePasswordReset,\n handleMagicLink,\n handleOAuthSignIn,\n loading,\n error,\n message,\n } = useAuthForm({\n onSuccess: onSuccess ?? (() => {}),\n onError: onError ?? (() => {}),\n redirectUrl: redirectTo,\n });\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n switch (mode) {\n case \"signIn\":\n await handleSignIn();\n break;\n case \"signUp\":\n await handleSignUp();\n break;\n case \"resetPassword\":\n await handlePasswordReset();\n break;\n case \"magicLink\":\n await handleMagicLink();\n break;\n }\n };\n\n const providerDisplayNames: { [key: string]: string } = {\n google: \"Google\",\n github: \"GitHub\",\n // Add more providers here as needed\n };\n\n return (\n <div className=\"w-full max-w-md space-y-8\">\n <div>\n <h2 className=\"text-2xl font-bold text-center\">\n {mode === \"signIn\" && \"Sign in to your account\"}\n {mode === \"signUp\" && \"Create a new account\"}\n {mode === \"resetPassword\" && \"Reset your password\"}\n {mode === \"magicLink\" && \"Sign in with magic link\"}\n </h2>\n </div>\n\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n <div>\n <label htmlFor=\"email\" className=\"block text-sm font-medium\">\n Email address\n </label>\n <input\n id=\"email\"\n type=\"email\"\n required\n autoComplete=\"email\"\n aria-required=\"true\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\n style={{ minHeight: \"44px\" }}\n />\n </div>\n\n {(mode === \"signIn\" || mode === \"signUp\") && (\n <div>\n <label htmlFor=\"password\" className=\"block text-sm font-medium\">\n Password\n </label>\n <input\n id=\"password\"\n type=\"password\"\n required\n autoComplete={\n mode === \"signUp\" ? \"new-password\" : \"current-password\"\n }\n aria-required=\"true\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\n style={{ minHeight: \"44px\" }}\n />\n </div>\n )}\n\n {error && (\n <div\n className=\"text-sm text-red-600\"\n role=\"alert\"\n aria-live=\"assertive\"\n >\n {error}\n </div>\n )}\n\n {message && (\n <div\n className=\"text-sm text-green-600\"\n role=\"status\"\n aria-live=\"polite\"\n >\n {message}\n </div>\n )}\n\n <button\n type=\"submit\"\n disabled={loading}\n className=\"w-full py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50\"\n >\n {loading\n ? \"Loading...\"\n : mode === \"signIn\"\n ? \"Sign in\"\n : mode === \"signUp\"\n ? \"Sign up\"\n : mode === \"resetPassword\"\n ? \"Reset password\"\n : \"Send magic link\"}\n </button>\n </form>\n\n {providers.length > 0 && (\n <div className=\"mt-6\">\n <div className=\"relative\">\n <div className=\"absolute inset-0 flex items-center\">\n <div className=\"w-full border-t border-gray-300\" />\n </div>\n <div className=\"relative flex justify-center text-sm\">\n <span className=\"px-2 bg-white text-gray-500\">\n Or continue with\n </span>\n </div>\n </div>\n\n <div className=\"mt-6 grid grid-cols-2 gap-3\">\n {providers.map((provider) => (\n <button\n key={provider}\n onClick={() => handleOAuthSignIn(provider as OAuthProvider)}\n className=\"w-full inline-flex justify-center py-2 px-4 border border-gray-300 rounded-md shadow-sm bg-white text-sm font-medium text-gray-500 hover:bg-gray-50\"\n >\n {providerDisplayNames[provider] ||\n provider.charAt(0).toUpperCase() + provider.slice(1)}\n </button>\n ))}\n </div>\n </div>\n )}\n\n <div className=\"text-sm text-center space-x-4\">\n {mode !== \"signIn\" && (\n <button\n type=\"button\"\n onClick={() => setMode(\"signIn\")}\n className=\"text-blue-600 hover:text-blue-500\"\n >\n Sign in\n </button>\n )}\n {mode !== \"signUp\" && (\n <button\n type=\"button\"\n onClick={() => setMode(\"signUp\")}\n className=\"text-blue-600 hover:text-blue-500\"\n >\n Sign up\n </button>\n )}\n {mode !== \"resetPassword\" && (\n <button\n type=\"button\"\n onClick={() => setMode(\"resetPassword\")}\n className=\"text-blue-600 hover:text-blue-500\"\n >\n Forgot password?\n </button>\n )}\n {allowMagicLink && mode !== \"magicLink\" && (\n <button\n type=\"button\"\n onClick={() => setMode(\"magicLink\")}\n className=\"text-blue-600 hover:text-blue-500\"\n >\n Magic link\n </button>\n )}\n </div>\n </div>\n );\n};\n","import { useState } from \"react\";\nimport { AuthError, AuthErrorType } from \"../core/IAuthProvider\";\nimport { OAuthProvider } from \"../types\";\n\nexport interface UseAuthFormOptions {\n onSuccess?: () => void;\n onError?: (error: AuthError) => void;\n redirectUrl?: string | undefined;\n}\n\nexport interface AuthFormState {\n email: string;\n password: string;\n confirmPassword: string;\n loading: boolean;\n error: string | null;\n message: string | null;\n}\n\nexport interface AuthFormActions {\n setEmail: (email: string) => void;\n setPassword: (password: string) => void;\n setConfirmPassword: (password: string) => void;\n handleSignIn: () => Promise<void>;\n handleSignUp: () => Promise<void>;\n handleOAuthSignIn: (provider: OAuthProvider) => Promise<void>;\n handlePasswordReset: () => Promise<void>;\n handleMagicLink: () => Promise<void>;\n clearError: () => void;\n clearMessage: () => void;\n}\n\nimport { useAuth } from \"./useAuth\"; // Import the useAuth hook\n\nexport const useAuthForm = (\n options: UseAuthFormOptions = {},\n): AuthFormState & AuthFormActions => {\n const auth = useAuth(); // Use the useAuth hook to get the AuthStore instance\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [confirmPassword, setConfirmPassword] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [message, setMessage] = useState<string | null>(null);\n\n // No need for the if (!auth) check here, as useAuth already handles it.\n\n const clearError = () => setError(null);\n const clearMessage = () => setMessage(null);\n\n const handleSignIn = async () => {\n setLoading(true);\n setError(null);\n setMessage(null);\n\n try {\n await auth.signIn(email, password);\n options.onSuccess?.();\n } catch (err) {\n const authError =\n err instanceof AuthError\n ? err\n : new AuthError(AuthErrorType.PROVIDER_ERROR, (err as Error).message);\n setError(authError.message);\n options.onError?.(authError);\n } finally {\n setLoading(false);\n }\n };\n\n const handleSignUp = async () => {\n if (password !== confirmPassword) {\n setError(\"Passwords do not match\");\n return;\n }\n\n setLoading(true);\n setError(null);\n setMessage(null);\n\n try {\n await auth.signUp(email, password);\n setMessage(\"Check your email to confirm your account\");\n options.onSuccess?.();\n } catch (err) {\n const authError =\n err instanceof AuthError\n ? err\n : new AuthError(AuthErrorType.PROVIDER_ERROR, (err as Error).message);\n setError(authError.message);\n options.onError?.(authError);\n } finally {\n setLoading(false);\n }\n };\n\n const handleOAuthSignIn = async (provider: OAuthProvider) => {\n setLoading(true);\n setError(null);\n\n try {\n await auth.signInWithOAuth(provider, options.redirectUrl);\n options.onSuccess?.();\n } catch (err) {\n const authError =\n err instanceof AuthError\n ? err\n : new AuthError(AuthErrorType.PROVIDER_ERROR, (err as Error).message);\n setError(authError.message);\n options.onError?.(authError);\n } finally {\n setLoading(false);\n }\n };\n\n const handlePasswordReset = async () => {\n if (!email) {\n setError(\"Please enter your email address\");\n return;\n }\n\n setLoading(true);\n setError(null);\n setMessage(null);\n\n try {\n await auth.resetPassword(email);\n setMessage(\"Password reset email sent\");\n } catch (err) {\n const authError =\n err instanceof AuthError\n ? err\n : new AuthError(AuthErrorType.PROVIDER_ERROR, (err as Error).message);\n setError(authError.message);\n options.onError?.(authError);\n } finally {\n setLoading(false);\n }\n };\n\n const handleMagicLink = async () => {\n if (!email) {\n setError(\"Please enter your email address\");\n return;\n }\n\n setLoading(true);\n setError(null);\n setMessage(null);\n\n try {\n await auth.signInWithMagicLink(email, options.redirectUrl);\n setMessage(\"Magic link sent to your email\");\n } catch (err) {\n const authError =\n err instanceof AuthError\n ? err\n : new AuthError(AuthErrorType.PROVIDER_ERROR, (err as Error).message);\n setError(authError.message);\n options.onError?.(authError);\n } finally {\n setLoading(false);\n }\n };\n\n return {\n // State\n email,\n password,\n confirmPassword,\n loading,\n error,\n message,\n // Actions\n setEmail,\n setPassword,\n setConfirmPassword,\n handleSignIn,\n handleSignUp,\n handleOAuthSignIn,\n handlePasswordReset,\n handleMagicLink,\n clearError,\n clearMessage,\n };\n};\n","\"use client\";\nimport { useAuthStore } from \"../store/authStore\";\n\nexport const useAuth = () => {\n // Get the entire store state and methods\n const authState = useAuthStore();\n\n // Check if the auth provider is initialized\n if (!authState.authProvider && !authState.loading) {\n console.warn(\n \"Auth provider not initialized. Make sure to wrap your app with <AuthProvider> component.\",\n );\n }\n\n return authState;\n};\n","\"use client\";\n\nimport React from \"react\";\nimport { AuthForm } from \"./AuthForm\";\nimport { AuthFormProps } from \"../../types\";\n\nexport interface LoginFormProps extends Omit<AuthFormProps, \"defaultMode\"> {\n /**\n * Override the redirect URL after successful login\n */\n redirectTo?: string;\n /**\n * Show magic link option\n */\n allowMagicLink?: boolean;\n /**\n * Show password reset link\n */\n allowPasswordReset?: boolean;\n /**\n * Show signup link\n */\n allowSignup?: boolean;\n /**\n * Custom className for styling\n */\n className?: string;\n}\n\nexport const LoginForm: React.FC<LoginFormProps> = ({\n redirectTo,\n allowMagicLink = true,\n allowPasswordReset = true,\n allowSignup = true,\n providers = [\"google\", \"github\"],\n onSuccess,\n onError,\n className,\n ...props\n}) => {\n return (\n <div className={className}>\n <AuthForm\n defaultMode=\"signIn\"\n redirectTo={redirectTo}\n providers={providers}\n allowMagicLink={allowMagicLink}\n onSuccess={onSuccess}\n onError={onError}\n {...props}\n />\n\n {/* Additional login-specific UI can be added here */}\n <div className=\"mt-4 text-center space-y-2\">\n {allowPasswordReset && (\n <div className=\"text-sm\">\n <a\n href=\"/auth/reset-password\"\n className=\"text-blue-600 hover:text-blue-500\"\n >\n Forgot your password?\n </a>\n </div>\n )}\n\n {allowSignup && (\n <div className=\"text-sm\">\n Don't have an account?{\" \"}\n <a\n href=\"/auth/signup\"\n className=\"text-blue-600 hover:text-blue-500 font-medium\"\n >\n Sign up\n </a>\n </div>\n )}\n </div>\n </div>\n );\n};\n","\"use client\";\n\nimport React from \"react\";\nimport { AuthForm } from \"./AuthForm\";\nimport { AuthFormProps } from \"../../types\";\n\nexport interface SignupFormProps extends Omit<AuthFormProps, \"defaultMode\"> {\n /**\n * Override the redirect URL after successful signup\n */\n redirectTo?: string;\n /**\n * Show login link\n */\n allowLogin?: boolean;\n /**\n * Require terms of service acceptance\n */\n requireTerms?: boolean;\n /**\n * Terms of service URL\n */\n termsUrl?: string;\n /**\n * Privacy policy URL\n */\n privacyUrl?: string;\n /**\n * Custom className for styling\n */\n className?: string;\n}\n\nexport const SignupForm: React.FC<SignupFormProps> = ({\n redirectTo,\n allowLogin = true,\n requireTerms = false,\n termsUrl = \"/terms\",\n privacyUrl = \"/privacy\",\n providers = [\"google\", \"github\"],\n onSuccess,\n onError,\n className,\n ...props\n}) => {\n return (\n <div className={className}>\n <AuthForm\n defaultMode=\"signUp\"\n redirectTo={redirectTo}\n providers={providers}\n onSuccess={onSuccess}\n onError={onError}\n {...props}\n />\n\n {/* Terms of service acceptance */}\n {requireTerms && (\n <div className=\"mt-4 text-center\">\n <p className=\"text-xs text-gray-600\">\n By signing up, you agree to our{\" \"}\n <a href={termsUrl} className=\"text-blue-600 hover:text-blue-500\">\n Terms of Service\n </a>{\" \"}\n and{\" \"}\n <a href={privacyUrl} className=\"text-blue-600 hover:text-blue-500\">\n Privacy Policy\n </a>\n </p>\n </div>\n )}\n\n {/* Additional signup-specific UI */}\n <div className=\"mt-4 text-center\">\n {allowLogin && (\n <div className=\"text-sm\">\n Already have an account?{\" \"}\n <a\n href=\"/auth/login\"\n className=\"text-blue-600 hover:text-blue-500 font-medium\"\n >\n Sign in\n </a>\n </div>\n )}\n </div>\n </div>\n );\n};\n","import { createBrowserClient } from \"@supabase/ssr\";\nimport type { Database } from \"./database.types\";\n\nexport const createClient = () => {\n if (\n !process.env.NEXT_PUBLIC_SUPABASE_URL ||\n !process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY\n ) {\n throw new Error(\"Missing Supabase environment variables\");\n }\n\n return createBrowserClient<Database>(\n process.env.NEXT_PUBLIC_SUPABASE_URL,\n process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,\n );\n};\n\n// Only export supabase if environment variables are available\n// This prevents breaking existing apps that don't use Supabase\nexport const supabase = (() => {\n try {\n if (\n process.env.NEXT_PUBLIC_SUPABASE_URL &&\n process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY\n ) {\n return createClient();\n }\n } catch {\n // Silently fail if environment variables are not available\n console.warn(\n \"Supabase client not initialized: environment variables not available\",\n );\n }\n return null;\n})();\n","// src/actions/index.ts\nimport { useAuthStore } from \"../store/authStore.js\";\nimport { OAuthProvider, User } from \"../types.js\";\n\n/**\n * Authentication actions for templates\n * These are convenient wrapper functions around the store methods\n */\n\n/**\n * Sign up with email and password\n */\nexport const signUp = async (\n email: string,\n password: string,\n): Promise<void> => {\n const store = useAuthStore.getState();\n return store.signUp(email, password);\n};\n\n/**\n * Sign in with email and password\n */\nexport const signIn = async (\n email: string,\n password: string,\n): Promise<void> => {\n const store = useAuthStore.getState();\n return store.signIn(email, password);\n};\n\n/**\n * Sign out the current user\n */\nexport const signOut = async (): Promise<void> => {\n const store = useAuthStore.getState();\n return store.signOut();\n};\n\n/**\n * Reset password for given email\n */\nexport const resetPassword = async (email: string): Promise<void> => {\n const store = useAuthStore.getState();\n return store.resetPassword(email);\n};\n\n/**\n * Update user profile\n * Fully implemented with Supabase-first approach and Firebase fallback\n */\nexport const updateProfile = async (updates: {\n name?: string;\n firstName?: string;\n lastName?: string;\n fullName?: string;\n avatar?: string;\n phone?: string;\n website?: string;\n bio?: string;\n [key: string]: unknown;\n}): Promise<User | null> => {\n const store = useAuthStore.getState();\n\n if (!store.user) {\n throw new Error(\"No user logged in\");\n }\n\n // Use the store's updateProfile method which handles provider communication\n return await store.updateProfile(updates);\n};\n\n/**\n * Sign in with OAuth provider\n */\nexport const signInWithOAuth = async (\n provider: OAuthProvider,\n redirectTo?: string,\n): Promise<void> => {\n const store = useAuthStore.getState();\n return store.signInWithOAuth(provider, redirectTo);\n};\n\n/**\n * Sign in with magic link\n */\nexport const signInWithMagicLink = async (\n email: string,\n redirectTo?: string,\n): Promise<void> => {\n const store = useAuthStore.getState();\n return store.signInWithMagicLink(email, redirectTo);\n};\n","import { createServerClient, type CookieOptions } from \"@supabase/ssr\";\nimport { NextResponse, type NextRequest } from \"next/server.js\";\n\nexport function withAuth(request: NextRequest) {\n let response = NextResponse.next({\n request: {\n headers: request.headers,\n },\n });\n\n const supabase = createServerClient(\n process.env.NEXT_PUBLIC_SUPABASE_URL!,\n process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,\n {\n cookies: {\n get(name: string) {\n return request.cookies.get(name)?.value;\n },\n set(name: string, value: string, options: CookieOptions) {\n request.cookies.set({\n name,\n value,\n ...options,\n });\n response = NextResponse.next({\n request: {\n headers: request.headers,\n },\n });\n response.cookies.set({\n name,\n value,\n ...options,\n });\n },\n remove(name: string, options: CookieOptions) {\n request.cookies.set({\n name,\n value: \"\",\n ...options,\n });\n response = NextResponse.next({\n request: {\n headers: request.headers,\n },\n });\n response.cookies.set({\n name,\n value: \"\",\n ...options,\n });\n },\n },\n },\n );\n\n return { response, supabase };\n}\n"],"mappings":"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","names":["createClient","import_platform_core","AuthErrorType","AuthEvent","AuthProviderType","mapSupabaseUserToUser","mapSupabaseError","validateEmail","validateSupabaseUrl","validateEmail","FirebaseOAuthProvider","firebaseSignOut","firebaseUpdateProfile","validateConfig","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_ssr","createClient","import_ssr","supabase"]}