@digilogiclabs/saas-factory-auth 0.2.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/native/index.js +603 -0
- package/dist/components/native/index.js.map +1 -0
- package/dist/components/native/index.mjs +595 -0
- package/dist/components/native/index.mjs.map +1 -0
- package/dist/components/web/index.d.mts +39 -0
- package/dist/components/web/index.d.ts +39 -0
- package/dist/components/web/index.js +417 -0
- package/dist/components/web/index.js.map +1 -0
- package/dist/components/web/index.mjs +411 -0
- package/dist/components/web/index.mjs.map +1 -0
- package/dist/index.d.mts +582 -56
- package/dist/index.d.ts +582 -56
- package/dist/index.js +1833 -91
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1809 -89
- package/dist/index.mjs.map +1 -1
- package/package.json +139 -93
- package/src/components/native/index.d.ts +29 -0
- package/README.md +0 -148
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/supabase.ts","../src/store/authStore.ts","../src/hooks/useAuth.ts","../src/components/AuthProvider.tsx"],"names":["createClientComponentClient","create","useEffect","createContext","useContext"],"mappings":"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","file":"index.js","sourcesContent":["\nimport { createClientComponentClient } from '@supabase/auth-helpers-nextjs'\nimport type { Database } from './database.types'\n\nexport const createClient = () => {\n if (!process.env.NEXT_PUBLIC_SUPABASE_URL || !process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY) {\n throw new Error('Missing Supabase environment variables')\n }\n\n return createClientComponentClient<Database>()\n}\n\nexport const supabase = createClient()","import { create } from 'zustand'\nimport { AuthStore } from '../types'\nimport { supabase } from '../utils/supabase'\n\nexport const useAuthStore = create<AuthStore>((set) => ({\n user: null,\n loading: true,\n error: null,\n\n signIn: async (email: string, password: string) => {\n try {\n set({ loading: true, error: null })\n const { error } = await supabase.auth.signInWithPassword({\n email,\n password,\n })\n if (error) throw error\n } catch (error) {\n set({ error: error as Error })\n } finally {\n set({ loading: false })\n }\n },\n\n signUp: async (email: string, password: string) => {\n try {\n set({ loading: true, error: null })\n const { error } = await supabase.auth.signUp({\n email,\n password,\n })\n if (error) throw error\n } catch (error) {\n set({ error: error as Error })\n } finally {\n set({ loading: false })\n }\n },\n\n signOut: async () => {\n try {\n set({ loading: true, error: null })\n const { error } = await supabase.auth.signOut()\n if (error) throw error\n set({ user: null })\n } catch (error) {\n set({ error: error as Error })\n } finally {\n set({ loading: false })\n }\n },\n\n resetPassword: async (email: string) => {\n try {\n set({ loading: true, error: null })\n const { error } = await supabase.auth.resetPasswordForEmail(email)\n if (error) throw error\n } catch (error) {\n set({ error: error as Error })\n } finally {\n set({ loading: false })\n }\n },\n signInWithOAuth: async (provider: string, redirectTo?: string) => {\n try {\n set({ loading: true, error: null })\n const { error } = await supabase.auth.signInWithOAuth({\n provider: provider as any,\n options: {\n redirectTo\n }\n })\n if (error) throw error\n } catch (error) {\n set({ error: error as Error })\n } finally {\n set({ loading: false })\n }\n },\n\n signInWithMagicLink: async (email: string, redirectTo?: string) => {\n try {\n set({ loading: true, error: null })\n const { error } = await supabase.auth.signInWithOtp({\n email,\n options: {\n emailRedirectTo: redirectTo\n }\n })\n if (error) throw error\n } catch (error) {\n set({ error: error as Error })\n } finally {\n set({ loading: false })\n }\n },\n updateUser: (user) => set({ user }),\n setLoading: (loading) => set({ loading }),\n setError: (error) => set({ error }),\n}))\n\n// Example usage in a Next.js app:\n/*\nimport { AuthForm } from '@digilogiclabs/saas-factory-auth'\n\nexport default function LoginPage() {\n const router = useRouter()\n\n return (\n <AuthForm\n defaultMode=\"signIn\"\n onSuccess={() => router.push('/dashboard')}\n providers={['google', 'github']}\n redirectTo=\"https://your-app.com/auth/callback\"\n />\n )\n}\n*/","'use client'\n\nimport { useEffect } from 'react'\nimport { useAuthStore } from '../store/authStore'\nimport { supabase } from '../utils/supabase'\n\nexport const useAuth = () => {\n const store = useAuthStore()\n\n useEffect(() => {\n // Check active session\n supabase.auth.getSession().then(({ data: { session } }) => {\n store.updateUser(session?.user ?? null)\n store.setLoading(false)\n })\n\n // Listen for auth changes\n const {\n data: { subscription },\n } = supabase.auth.onAuthStateChange((_event, session) => {\n store.updateUser(session?.user ?? null)\n })\n\n return () => subscription.unsubscribe()\n }, [])\n\n return store\n}","'use client'\n\nimport { createContext, useContext, ReactNode } from 'react'\nimport { useAuth } from '../hooks/useAuth'\nimport type { AuthStore } from '../types'\n\nconst AuthContext = createContext<AuthStore | null>(null)\n\nexport const AuthProvider = ({ children }: { children: ReactNode }) => {\n const auth = useAuth()\n\n return <AuthContext.Provider value={auth}>{children}</AuthContext.Provider>\n}\n\nexport const useAuthContext = () => {\n const context = useContext(AuthContext)\n if (!context) {\n throw new Error('useAuthContext must be used within an AuthProvider')\n }\n return context\n}"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/storage.ts","../src/core/IAuthProvider.ts","../src/config/env.ts","../src/core/SupabaseAuthProvider.ts","../src/core/FirebaseAuthProvider.ts","../src/core/AuthProviderFactory.ts","../src/index.ts","../src/components/AuthProvider.tsx","../src/store/authStore.ts","../src/hooks/useAuth.ts","../src/hooks/useAuthForm.ts","../src/hooks/useProtectedRoute.ts","../src/hooks/useRBAC.ts","../src/utils/supabase.ts","../src/hooks/use2FA.ts","../src/hooks/useRedirectUrl.ts","../src/utils/authConfig.ts","../src/utils/password.ts","../src/utils/validation.ts","../src/utils/performance.ts","../src/utils/healthCheck.ts","../src/middleware/withAuth.ts","../src/server/verification.ts"],"names":["NativeAuthStorage","WebAuthStorage","createAuthStorage","isReactNative","AuthErrorType","AuthEvent","createClient","validateEmail","GoogleAuthProvider","GithubAuthProvider","FacebookAuthProvider","TwitterAuthProvider","FirebaseOAuthProvider","initializeApp","getAuth","signInWithEmailAndPassword","createUserWithEmailAndPassword","signInWithPopup","sendSignInLinkToEmail","firebaseSignOut","sendPasswordResetEmail","onAuthStateChanged","validateConfig","create","createContext","useState","useEffect","jsx","useContext","createClientComponentClient","error","useSearchParams","NextResponse","supabase","createMiddlewareClient","createServerComponentClient","cookies"],"mappings":"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","file":"index.js","sourcesContent":["// Abstract storage interface for cross-platform session persistence\r\nexport interface IAuthStorage {\r\n getItem(key: string): Promise<string | null>;\r\n setItem(key: string, value: string): Promise<void>;\r\n removeItem(key: string): Promise<void>;\r\n}\r\n\r\n// Web implementation using localStorage\r\nexport class WebAuthStorage implements IAuthStorage {\r\n async getItem(key: string): Promise<string | null> {\r\n if (typeof window === 'undefined') return null;\r\n return localStorage.getItem(key);\r\n }\r\n\r\n async setItem(key: string, value: string): Promise<void> {\r\n if (typeof window === 'undefined') return;\r\n localStorage.setItem(key, value);\r\n }\r\n\r\n async removeItem(key: string): Promise<void> {\r\n if (typeof window === 'undefined') return;\r\n localStorage.removeItem(key);\r\n }\r\n}\r\n\r\n// React Native implementation using AsyncStorage\r\nexport class NativeAuthStorage implements IAuthStorage {\r\n private AsyncStorage: any;\r\n\r\n constructor() {\r\n try {\r\n this.AsyncStorage = require('@react-native-async-storage/async-storage').default;\r\n } catch (error) {\r\n throw new Error('AsyncStorage is required for React Native. Install @react-native-async-storage/async-storage');\r\n }\r\n }\r\n\r\n async getItem(key: string): Promise<string | null> {\r\n return await this.AsyncStorage.getItem(key);\r\n }\r\n\r\n async setItem(key: string, value: string): Promise<void> {\r\n await this.AsyncStorage.setItem(key, value);\r\n }\r\n\r\n async removeItem(key: string): Promise<void> {\r\n await this.AsyncStorage.removeItem(key);\r\n }\r\n}\r\n\r\n// Factory function to get appropriate storage\r\nexport const createAuthStorage = (): IAuthStorage => {\r\n const isReactNative = typeof navigator !== 'undefined' && navigator.product === 'ReactNative';\r\n \r\n if (isReactNative) {\r\n return new NativeAuthStorage();\r\n } else {\r\n return new WebAuthStorage();\r\n }\r\n};\r\n\r\n","/**\r\n * Common user interface that abstracts user data across different authentication providers\r\n */\r\nexport interface CommonUser {\r\n /** Unique user identifier */\r\n id: string;\r\n /** User's email address */\r\n email: string | undefined;\r\n /** User's display name */\r\n displayName?: string | null;\r\n /** URL to user's profile photo */\r\n photoURL?: string | null;\r\n /** User roles for authorization */\r\n roles?: string[];\r\n /** Provider-specific metadata */\r\n metadata: Record<string, any>;\r\n}\r\n\r\n/**\r\n * Authentication session interface that wraps user data\r\n */\r\nexport interface AuthSession {\r\n /** Current authenticated user */\r\n user: CommonUser | null;\r\n /** Session expiration timestamp (optional) */\r\n expiresAt?: number;\r\n /** Access token (optional, provider-specific) */\r\n accessToken?: string;\r\n}\r\n\r\n/**\r\n * Authentication error types for better error handling\r\n */\r\nexport enum AuthErrorType {\r\n INVALID_CREDENTIALS = 'INVALID_CREDENTIALS',\r\n USER_NOT_FOUND = 'USER_NOT_FOUND',\r\n EMAIL_ALREADY_EXISTS = 'EMAIL_ALREADY_EXISTS',\r\n WEAK_PASSWORD = 'WEAK_PASSWORD',\r\n NETWORK_ERROR = 'NETWORK_ERROR',\r\n PROVIDER_ERROR = 'PROVIDER_ERROR',\r\n CONFIGURATION_ERROR = 'CONFIGURATION_ERROR',\r\n VALIDATION_ERROR = 'VALIDATION_ERROR'\r\n}\r\n\r\n/**\r\n * Custom authentication error class\r\n */\r\nexport class AuthError extends Error {\r\n public readonly timestamp: Date;\r\n public readonly code: string;\r\n\r\n constructor(\r\n public readonly type: AuthErrorType,\r\n message: string,\r\n public readonly originalError?: any,\r\n public readonly context?: Record<string, any>\r\n ) {\r\n super(message);\r\n this.name = 'AuthError';\r\n this.timestamp = new Date();\r\n this.code = type;\r\n \r\n // Ensure proper prototype chain for instanceof checks\r\n Object.setPrototypeOf(this, AuthError.prototype);\r\n \r\n // Capture stack trace if available\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, AuthError);\r\n }\r\n }\r\n\r\n /**\r\n * Convert error to JSON for logging/debugging\r\n */\r\n toJSON() {\r\n return {\r\n name: this.name,\r\n type: this.type,\r\n code: this.code,\r\n message: this.message,\r\n timestamp: this.timestamp.toISOString(),\r\n context: this.context,\r\n originalError: this.originalError ? {\r\n name: this.originalError.name,\r\n message: this.originalError.message,\r\n code: this.originalError.code\r\n } : undefined\r\n };\r\n }\r\n\r\n /**\r\n * Check if error is of a specific type\r\n */\r\n isType(type: AuthErrorType): boolean {\r\n return this.type === type;\r\n }\r\n\r\n /**\r\n * Check if error is retryable\r\n */\r\n isRetryable(): boolean {\r\n return [\r\n AuthErrorType.NETWORK_ERROR,\r\n AuthErrorType.PROVIDER_ERROR\r\n ].includes(this.type);\r\n }\r\n}\r\n\r\n/**\r\n * Authentication state change events\r\n */\r\nexport enum AuthEvent {\r\n SIGNED_IN = 'SIGNED_IN',\r\n SIGNED_OUT = 'SIGNED_OUT',\r\n TOKEN_REFRESHED = 'TOKEN_REFRESHED',\r\n USER_UPDATED = 'USER_UPDATED'\r\n}\r\n\r\n/**\r\n * OAuth provider types\r\n */\r\nexport type OAuthProvider = 'google' | 'github' | 'facebook' | 'twitter' | 'discord' | 'apple';\r\n\r\n/**\r\n * Authentication provider interface that abstracts authentication operations\r\n * across different backends (Supabase, Firebase, etc.)\r\n */\r\nexport interface IAuthProvider {\r\n /**\r\n * Sign in with email and password\r\n * @param email User's email address\r\n * @param password User's password (required for email/password authentication)\r\n * @returns Promise resolving to the authenticated user or null\r\n * @throws AuthError when authentication fails\r\n */\r\n signIn(email: string, password?: string): Promise<CommonUser | null>;\r\n\r\n /**\r\n * Sign up with email and password\r\n * @param email User's email address\r\n * @param password User's password (required for email/password authentication)\r\n * @returns Promise resolving to the created user or null\r\n * @throws AuthError when sign up fails\r\n */\r\n signUp(email: string, password?: string): Promise<CommonUser | null>;\r\n\r\n /**\r\n * Sign in with OAuth provider\r\n * @param provider OAuth provider name\r\n * @param redirectTo Optional redirect URL after authentication\r\n * @returns Promise that resolves when OAuth flow is initiated\r\n * @throws AuthError when OAuth flow fails to initiate\r\n */\r\n signInWithOAuth(provider: OAuthProvider, redirectTo?: string): Promise<void>;\r\n\r\n /**\r\n * Sign in with magic link (passwordless authentication)\r\n * @param email User's email address\r\n * @param redirectTo Optional redirect URL after email verification\r\n * @returns Promise that resolves when magic link is sent\r\n * @throws AuthError when magic link sending fails\r\n */\r\n signInWithMagicLink(email: string, redirectTo?: string): Promise<void>;\r\n\r\n /**\r\n * Sign out the current user\r\n * @returns Promise that resolves when sign out is complete\r\n * @throws AuthError when sign out fails\r\n */\r\n signOut(): Promise<void>;\r\n\r\n /**\r\n * Send password reset email\r\n * @param email User's email address\r\n * @returns Promise that resolves when reset email is sent\r\n * @throws AuthError when password reset fails\r\n */\r\n resetPassword(email: string): Promise<void>;\r\n\r\n /**\r\n * Get the current authenticated user\r\n * @returns Promise resolving to the current user or null if not authenticated\r\n * @throws AuthError when user retrieval fails\r\n */\r\n getUser(): Promise<CommonUser | null>;\r\n\r\n /**\r\n * Listen for authentication state changes\r\n * @param callback Function called when auth state changes\r\n * @returns Object containing subscription data for cleanup\r\n */\r\n onAuthStateChange(callback: (event: AuthEvent, session: AuthSession | null) => void): { \r\n data: { subscription: any } | { unsubscribe: () => void } \r\n };\r\n\r\n /**\r\n * Validate provider configuration\r\n * @returns Promise that resolves if configuration is valid\r\n * @throws AuthError when configuration is invalid\r\n */\r\n validateConfiguration?(): Promise<void>;\r\n}\r\n\r\n\r\n","interface AuthConfig {\r\n supabaseUrl?: string;\r\n supabaseAnonKey?: string;\r\n firebaseApiKey?: string;\r\n firebaseAuthDomain?: string;\r\n firebaseProjectId?: string;\r\n redirectUrl?: string;\r\n}\r\n\r\n// Platform detection\r\nconst isNextJS = typeof window !== 'undefined' && typeof process !== 'undefined';\r\nconst isExpo = typeof global !== 'undefined' && (global as any).__expo;\r\nconst isReactNative = typeof navigator !== 'undefined' && navigator.product === 'ReactNative';\r\n\r\nexport const getAuthConfig = (): AuthConfig => {\r\n let config: AuthConfig = {};\r\n\r\n if (isNextJS) {\r\n // Next.js environment variables\r\n config = {\r\n supabaseUrl: process.env.NEXT_PUBLIC_SUPABASE_URL,\r\n supabaseAnonKey: process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY,\r\n firebaseApiKey: process.env.NEXT_PUBLIC_FIREBASE_API_KEY,\r\n firebaseAuthDomain: process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN,\r\n firebaseProjectId: process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID,\r\n redirectUrl: process.env.NEXT_PUBLIC_AUTH_REDIRECT_URL,\r\n };\r\n } else if (isExpo) {\r\n // Expo Constants - will need to be configured in app.json\r\n try {\r\n const Constants = require('expo-constants').default;\r\n config = {\r\n supabaseUrl: Constants.expoConfig?.extra?.supabaseUrl,\r\n supabaseAnonKey: Constants.expoConfig?.extra?.supabaseAnonKey,\r\n firebaseApiKey: Constants.expoConfig?.extra?.firebaseApiKey,\r\n firebaseAuthDomain: Constants.expoConfig?.extra?.firebaseAuthDomain,\r\n firebaseProjectId: Constants.expoConfig?.extra?.firebaseProjectId,\r\n redirectUrl: Constants.expoConfig?.extra?.authRedirectUrl,\r\n };\r\n } catch (error) {\r\n console.warn('Expo Constants not available, using empty config');\r\n }\r\n } else if (isReactNative) {\r\n // React Native with react-native-config or similar\r\n try {\r\n const Config = require('react-native-config').default;\r\n config = {\r\n supabaseUrl: Config.SUPABASE_URL,\r\n supabaseAnonKey: Config.SUPABASE_ANON_KEY,\r\n firebaseApiKey: Config.FIREBASE_API_KEY,\r\n firebaseAuthDomain: Config.FIREBASE_AUTH_DOMAIN,\r\n firebaseProjectId: Config.FIREBASE_PROJECT_ID,\r\n redirectUrl: Config.AUTH_REDIRECT_URL,\r\n };\r\n } catch (error) {\r\n console.warn('react-native-config not available, using empty config');\r\n }\r\n }\r\n\r\n return config;\r\n};\r\n\r\nexport const validateConfig = (config: AuthConfig, provider: 'supabase' | 'firebase'): void => {\r\n if (provider === 'supabase') {\r\n if (!config.supabaseUrl || !config.supabaseAnonKey) {\r\n throw new Error(`Missing required Supabase configuration. Required: SUPABASE_URL, SUPABASE_ANON_KEY`);\r\n }\r\n } else if (provider === 'firebase') {\r\n if (!config.firebaseApiKey || !config.firebaseAuthDomain || !config.firebaseProjectId) {\r\n throw new Error(`Missing required Firebase configuration. Required: FIREBASE_API_KEY, FIREBASE_AUTH_DOMAIN, FIREBASE_PROJECT_ID`);\r\n }\r\n }\r\n};\r\n\r\nexport type { AuthConfig };\r\n\r\n","import { createClient, SupabaseClient, AuthError as SupabaseAuthError } from '@supabase/supabase-js';\r\nimport { \r\n IAuthProvider, \r\n CommonUser, \r\n AuthSession, \r\n AuthError, \r\n AuthErrorType, \r\n AuthEvent, \r\n OAuthProvider \r\n} from './IAuthProvider';\r\nimport { getAuthConfig, validateConfig } from '../config/env';\r\nimport { IAuthStorage } from '../config/storage';\r\nimport { User } from '@supabase/supabase-js';\r\n\r\n/**\r\n * Maps Supabase user to CommonUser interface\r\n */\r\nconst mapSupabaseUserToCommonUser = (supabaseUser: User | null): CommonUser | null => {\r\n if (!supabaseUser) return null;\r\n return {\r\n id: supabaseUser.id,\r\n email: supabaseUser.email,\r\n displayName: supabaseUser.user_metadata?.full_name || supabaseUser.user_metadata?.name || null,\r\n photoURL: supabaseUser.user_metadata?.avatar_url || null,\r\n metadata: supabaseUser.user_metadata || {},\r\n };\r\n};\r\n\r\n/**\r\n * Maps Supabase error to AuthError\r\n */\r\nconst mapSupabaseError = (error: any): AuthError => {\r\n const message = error.message || 'Unknown error occurred';\r\n \r\n if (message.includes('Invalid login credentials')) {\r\n return new AuthError(AuthErrorType.INVALID_CREDENTIALS, message, error);\r\n }\r\n if (message.includes('User not found')) {\r\n return new AuthError(AuthErrorType.USER_NOT_FOUND, message, error);\r\n }\r\n if (message.includes('User already registered')) {\r\n return new AuthError(AuthErrorType.EMAIL_ALREADY_EXISTS, message, error);\r\n }\r\n if (message.includes('Password should be')) {\r\n return new AuthError(AuthErrorType.WEAK_PASSWORD, message, error);\r\n }\r\n if (message.includes('network') || message.includes('fetch')) {\r\n return new AuthError(AuthErrorType.NETWORK_ERROR, message, error);\r\n }\r\n \r\n return new AuthError(AuthErrorType.PROVIDER_ERROR, message, error);\r\n};\r\n\r\n/**\r\n * Validates email format\r\n */\r\nconst validateEmail = (email: string): void => {\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n if (!emailRegex.test(email)) {\r\n throw new AuthError(AuthErrorType.VALIDATION_ERROR, 'Invalid email format');\r\n }\r\n};\r\n\r\n/**\r\n * Supabase authentication provider implementation\r\n */\r\nexport class SupabaseAuthProvider implements IAuthProvider {\r\n private client: SupabaseClient;\r\n private storage: IAuthStorage;\r\n\r\n constructor(storage: IAuthStorage) {\r\n this.storage = storage;\r\n const config = getAuthConfig();\r\n validateConfig(config, 'supabase');\r\n \r\n this.client = createClient(config.supabaseUrl!, config.supabaseAnonKey!, {\r\n auth: {\r\n storage: {\r\n getItem: (key: string) => this.storage.getItem(key),\r\n setItem: (key: string, value: string) => this.storage.setItem(key, value),\r\n removeItem: (key: string) => this.storage.removeItem(key),\r\n },\r\n autoRefreshToken: true,\r\n persistSession: true,\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Validates Supabase configuration\r\n */\r\n async validateConfiguration(): Promise<void> {\r\n try {\r\n const config = getAuthConfig();\r\n validateConfig(config, 'supabase');\r\n } catch (error) {\r\n throw new AuthError(\r\n AuthErrorType.CONFIGURATION_ERROR,\r\n error instanceof Error ? error.message : 'Invalid Supabase configuration'\r\n );\r\n }\r\n }\r\n\r\n async signIn(email: string, password?: string): Promise<CommonUser | null> {\r\n try {\r\n validateEmail(email);\r\n \r\n if (!password) {\r\n throw new AuthError(\r\n AuthErrorType.VALIDATION_ERROR,\r\n \"Password is required for email sign-in with Supabase\"\r\n );\r\n }\r\n\r\n const { data, error } = await this.client.auth.signInWithPassword({ email, password });\r\n \r\n if (error) {\r\n throw mapSupabaseError(error);\r\n }\r\n \r\n return mapSupabaseUserToCommonUser(data.user);\r\n } catch (error) {\r\n if (error instanceof AuthError) {\r\n throw error;\r\n }\r\n throw new AuthError(AuthErrorType.PROVIDER_ERROR, 'Sign in failed', error);\r\n }\r\n }\r\n\r\n async signUp(email: string, password?: string): Promise<CommonUser | null> {\r\n try {\r\n validateEmail(email);\r\n \r\n if (!password) {\r\n throw new AuthError(\r\n AuthErrorType.VALIDATION_ERROR,\r\n \"Password is required for email sign-up with Supabase\"\r\n );\r\n }\r\n\r\n const { data, error } = await this.client.auth.signUp({ email, password });\r\n \r\n if (error) {\r\n throw mapSupabaseError(error);\r\n }\r\n \r\n return mapSupabaseUserToCommonUser(data.user);\r\n } catch (error) {\r\n if (error instanceof AuthError) {\r\n throw error;\r\n }\r\n throw new AuthError(AuthErrorType.PROVIDER_ERROR, 'Sign up failed', error);\r\n }\r\n }\r\n\r\n async signInWithOAuth(provider: OAuthProvider, redirectTo?: string): Promise<void> {\r\n try {\r\n const { error } = await this.client.auth.signInWithOAuth({\r\n provider: provider as any,\r\n options: { redirectTo },\r\n });\r\n \r\n if (error) {\r\n throw mapSupabaseError(error);\r\n }\r\n } catch (error) {\r\n if (error instanceof AuthError) {\r\n throw error;\r\n }\r\n throw new AuthError(AuthErrorType.PROVIDER_ERROR, 'OAuth sign in failed', error);\r\n }\r\n }\r\n\r\n async signInWithMagicLink(email: string, redirectTo?: string): Promise<void> {\r\n try {\r\n validateEmail(email);\r\n \r\n const { error } = await this.client.auth.signInWithOtp({ \r\n email, \r\n options: { emailRedirectTo: redirectTo } \r\n });\r\n \r\n if (error) {\r\n throw mapSupabaseError(error);\r\n }\r\n } catch (error) {\r\n if (error instanceof AuthError) {\r\n throw error;\r\n }\r\n throw new AuthError(AuthErrorType.PROVIDER_ERROR, 'Magic link sign in failed', error);\r\n }\r\n }\r\n\r\n async signOut(): Promise<void> {\r\n try {\r\n const { error } = await this.client.auth.signOut();\r\n \r\n if (error) {\r\n throw mapSupabaseError(error);\r\n }\r\n } catch (error) {\r\n if (error instanceof AuthError) {\r\n throw error;\r\n }\r\n throw new AuthError(AuthErrorType.PROVIDER_ERROR, 'Sign out failed', error);\r\n }\r\n }\r\n\r\n async resetPassword(email: string): Promise<void> {\r\n try {\r\n validateEmail(email);\r\n \r\n const { error } = await this.client.auth.resetPasswordForEmail(email);\r\n \r\n if (error) {\r\n throw mapSupabaseError(error);\r\n }\r\n } catch (error) {\r\n if (error instanceof AuthError) {\r\n throw error;\r\n }\r\n throw new AuthError(AuthErrorType.PROVIDER_ERROR, 'Password reset failed', error);\r\n }\r\n }\r\n\r\n async getUser(): Promise<CommonUser | null> {\r\n try {\r\n const { data: { user }, error } = await this.client.auth.getUser();\r\n \r\n if (error) {\r\n throw mapSupabaseError(error);\r\n }\r\n \r\n return mapSupabaseUserToCommonUser(user);\r\n } catch (error) {\r\n if (error instanceof AuthError) {\r\n throw error;\r\n }\r\n throw new AuthError(AuthErrorType.PROVIDER_ERROR, 'Get user failed', error);\r\n }\r\n }\r\n\r\n onAuthStateChange(callback: (event: AuthEvent, session: AuthSession | null) => void): { data: { subscription: any } | { unsubscribe: () => void } } {\r\n const { data: { subscription } } = this.client.auth.onAuthStateChange((event, session) => {\r\n const commonUser = mapSupabaseUserToCommonUser(session?.user || null);\r\n let authEvent: AuthEvent;\r\n switch (event) {\r\n case 'SIGNED_IN':\r\n authEvent = AuthEvent.SIGNED_IN;\r\n break;\r\n case 'SIGNED_OUT':\r\n authEvent = AuthEvent.SIGNED_OUT;\r\n break;\r\n case 'TOKEN_REFRESHED':\r\n authEvent = AuthEvent.TOKEN_REFRESHED;\r\n break;\r\n case 'USER_UPDATED':\r\n authEvent = AuthEvent.USER_UPDATED;\r\n break;\r\n default:\r\n authEvent = AuthEvent.USER_UPDATED; // Default case, though ideally all events are covered\r\n }\r\n \r\n const authSession: AuthSession | null = commonUser ? {\r\n user: commonUser,\r\n expiresAt: session?.expires_at ? session.expires_at * 1000 : undefined,\r\n accessToken: session?.access_token\r\n } : null;\r\n \r\n callback(authEvent, authSession);\r\n });\r\n return { data: { subscription } };\r\n }\r\n}\r\n\r\n","import { initializeApp, FirebaseApp } from 'firebase/app';\r\nimport { \r\n getAuth, \r\n Auth, \r\n signInWithEmailAndPassword,\r\n createUserWithEmailAndPassword,\r\n signOut as firebaseSignOut,\r\n sendPasswordResetEmail,\r\n onAuthStateChanged,\r\n signInWithPopup,\r\n GoogleAuthProvider,\r\n GithubAuthProvider,\r\n FacebookAuthProvider,\r\n TwitterAuthProvider,\r\n OAuthProvider as FirebaseOAuthProvider,\r\n User as FirebaseUser,\r\n sendSignInLinkToEmail,\r\n isSignInWithEmailLink,\r\n signInWithEmailLink\r\n} from 'firebase/auth';\r\nimport { \r\n IAuthProvider, \r\n CommonUser, \r\n AuthSession, \r\n AuthError, \r\n AuthErrorType, \r\n AuthEvent, \r\n OAuthProvider \r\n} from './IAuthProvider';\r\nimport { getAuthConfig, validateConfig } from '../config/env';\r\nimport { IAuthStorage } from '../config/storage';\r\n\r\n/**\r\n * Maps Firebase user to CommonUser interface\r\n */\r\nconst mapFirebaseUserToCommonUser = (firebaseUser: FirebaseUser | null): CommonUser | null => {\r\n if (!firebaseUser) return null;\r\n return {\r\n id: firebaseUser.uid,\r\n email: firebaseUser.email || undefined,\r\n displayName: firebaseUser.displayName,\r\n photoURL: firebaseUser.photoURL,\r\n metadata: {\r\n phoneNumber: firebaseUser.phoneNumber,\r\n emailVerified: firebaseUser.emailVerified,\r\n isAnonymous: firebaseUser.isAnonymous,\r\n tenantId: firebaseUser.tenantId,\r\n providerData: firebaseUser.providerData,\r\n creationTime: firebaseUser.metadata?.creationTime,\r\n lastSignInTime: firebaseUser.metadata?.lastSignInTime,\r\n },\r\n };\r\n};\r\n\r\n/**\r\n * Maps Firebase error to AuthError\r\n */\r\nconst mapFirebaseError = (error: any): AuthError => {\r\n const code = error.code || '';\r\n const message = error.message || 'Unknown error occurred';\r\n \r\n switch (code) {\r\n case 'auth/invalid-email':\r\n case 'auth/user-disabled':\r\n case 'auth/user-not-found':\r\n case 'auth/wrong-password':\r\n case 'auth/invalid-credential':\r\n return new AuthError(AuthErrorType.INVALID_CREDENTIALS, message, error);\r\n \r\n case 'auth/email-already-in-use':\r\n return new AuthError(AuthErrorType.EMAIL_ALREADY_EXISTS, message, error);\r\n \r\n case 'auth/weak-password':\r\n return new AuthError(AuthErrorType.WEAK_PASSWORD, message, error);\r\n \r\n case 'auth/network-request-failed':\r\n case 'auth/timeout':\r\n return new AuthError(AuthErrorType.NETWORK_ERROR, message, error);\r\n \r\n case 'auth/configuration-not-found':\r\n case 'auth/invalid-api-key':\r\n return new AuthError(AuthErrorType.CONFIGURATION_ERROR, message, error);\r\n \r\n default:\r\n return new AuthError(AuthErrorType.PROVIDER_ERROR, message, error);\r\n }\r\n};\r\n\r\n/**\r\n * Validates email format\r\n */\r\nconst validateEmail = (email: string): void => {\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n if (!emailRegex.test(email)) {\r\n throw new AuthError(AuthErrorType.VALIDATION_ERROR, 'Invalid email format');\r\n }\r\n};\r\n\r\n/**\r\n * Gets OAuth provider instance for Firebase\r\n */\r\nconst getOAuthProvider = (provider: OAuthProvider): any => {\r\n switch (provider) {\r\n case 'google':\r\n return new GoogleAuthProvider();\r\n case 'github':\r\n return new GithubAuthProvider();\r\n case 'facebook':\r\n return new FacebookAuthProvider();\r\n case 'twitter':\r\n return new TwitterAuthProvider();\r\n case 'apple':\r\n const appleProvider = new FirebaseOAuthProvider('apple.com');\r\n return appleProvider;\r\n case 'discord':\r\n const discordProvider = new FirebaseOAuthProvider('discord.com');\r\n return discordProvider;\r\n default:\r\n throw new AuthError(\r\n AuthErrorType.VALIDATION_ERROR,\r\n `Unsupported OAuth provider for Firebase: ${provider}`\r\n );\r\n }\r\n};\r\n\r\n/**\r\n * Firebase authentication provider implementation\r\n */\r\nexport class FirebaseAuthProvider implements IAuthProvider {\r\n private app: FirebaseApp;\r\n private auth: Auth;\r\n private storage: IAuthStorage;\r\n\r\n constructor(storage: IAuthStorage) {\r\n this.storage = storage;\r\n const config = getAuthConfig();\r\n validateConfig(config, 'firebase');\r\n\r\n this.app = initializeApp({\r\n apiKey: config.firebaseApiKey!,\r\n authDomain: config.firebaseAuthDomain!,\r\n projectId: config.firebaseProjectId!,\r\n });\r\n\r\n this.auth = getAuth(this.app);\r\n }\r\n\r\n /**\r\n * Validates Firebase configuration\r\n */\r\n async validateConfiguration(): Promise<void> {\r\n try {\r\n const config = getAuthConfig();\r\n validateConfig(config, 'firebase');\r\n } catch (error) {\r\n throw new AuthError(\r\n AuthErrorType.CONFIGURATION_ERROR,\r\n error instanceof Error ? error.message : 'Invalid Firebase configuration'\r\n );\r\n }\r\n }\r\n\r\n async signIn(email: string, password?: string): Promise<CommonUser | null> {\r\n try {\r\n validateEmail(email);\r\n \r\n if (!password) {\r\n throw new AuthError(\r\n AuthErrorType.VALIDATION_ERROR,\r\n \"Password is required for email sign-in with Firebase\"\r\n );\r\n }\r\n\r\n const userCredential = await signInWithEmailAndPassword(this.auth, email, password);\r\n return mapFirebaseUserToCommonUser(userCredential.user);\r\n } catch (error) {\r\n if (error instanceof AuthError) {\r\n throw error;\r\n }\r\n throw mapFirebaseError(error);\r\n }\r\n }\r\n\r\n async signUp(email: string, password?: string): Promise<CommonUser | null> {\r\n try {\r\n validateEmail(email);\r\n \r\n if (!password) {\r\n throw new AuthError(\r\n AuthErrorType.VALIDATION_ERROR,\r\n \"Password is required for email sign-up with Firebase\"\r\n );\r\n }\r\n\r\n const userCredential = await createUserWithEmailAndPassword(this.auth, email, password);\r\n return mapFirebaseUserToCommonUser(userCredential.user);\r\n } catch (error) {\r\n if (error instanceof AuthError) {\r\n throw error;\r\n }\r\n throw mapFirebaseError(error);\r\n }\r\n }\r\n\r\n async signInWithOAuth(provider: OAuthProvider, redirectTo?: string): Promise<void> {\r\n try {\r\n const authProvider = getOAuthProvider(provider);\r\n \r\n // Firebase doesn't directly support redirectTo in signInWithPopup like Supabase\r\n // You might need to handle redirects manually or use signInWithRedirect\r\n if (redirectTo) {\r\n console.warn(\r\n \"redirectTo is not directly supported for Firebase signInWithPopup. \" +\r\n \"Consider using signInWithRedirect or handling redirects manually.\"\r\n );\r\n }\r\n \r\n await signInWithPopup(this.auth, authProvider);\r\n } catch (error) {\r\n if (error instanceof AuthError) {\r\n throw error;\r\n }\r\n throw mapFirebaseError(error);\r\n }\r\n }\r\n\r\n async signInWithMagicLink(email: string, redirectTo?: string): Promise<void> {\r\n try {\r\n validateEmail(email);\r\n \r\n if (!redirectTo) {\r\n throw new AuthError(\r\n AuthErrorType.VALIDATION_ERROR,\r\n \"redirectTo is required for Firebase magic link sign-in\"\r\n );\r\n }\r\n \r\n await sendSignInLinkToEmail(this.auth, email, { \r\n url: redirectTo, \r\n handleCodeInApp: true \r\n });\r\n } catch (error) {\r\n if (error instanceof AuthError) {\r\n throw error;\r\n }\r\n throw mapFirebaseError(error);\r\n }\r\n }\r\n\r\n async signOut(): Promise<void> {\r\n try {\r\n await firebaseSignOut(this.auth);\r\n } catch (error) {\r\n if (error instanceof AuthError) {\r\n throw error;\r\n }\r\n throw mapFirebaseError(error);\r\n }\r\n }\r\n\r\n async resetPassword(email: string): Promise<void> {\r\n try {\r\n validateEmail(email);\r\n \r\n await sendPasswordResetEmail(this.auth, email);\r\n } catch (error) {\r\n if (error instanceof AuthError) {\r\n throw error;\r\n }\r\n throw mapFirebaseError(error);\r\n }\r\n }\r\n\r\n async getUser(): Promise<CommonUser | null> {\r\n return mapFirebaseUserToCommonUser(this.auth.currentUser);\r\n }\r\n\r\n onAuthStateChange(callback: (event: AuthEvent, session: AuthSession | null) => void): { data: { subscription: any } | { unsubscribe: () => void } } {\r\n const unsubscribe = onAuthStateChanged(this.auth, (user) => {\r\n const commonUser = mapFirebaseUserToCommonUser(user);\r\n let authEvent: AuthEvent;\r\n // Determine event type based on user presence and previous state (if available)\r\n // This is a simplification; a more robust solution might track previous user state\r\n if (user) {\r\n authEvent = AuthEvent.SIGNED_IN; // Or USER_UPDATED if user was already signed in\r\n } else {\r\n authEvent = AuthEvent.SIGNED_OUT;\r\n }\r\n \r\n const authSession: AuthSession | null = commonUser ? {\r\n user: commonUser,\r\n // Firebase doesn't provide explicit expiration time in the same way as Supabase\r\n // You might need to get this from the ID token if needed\r\n expiresAt: undefined, // Explicitly undefined if not available\r\n accessToken: undefined // Explicitly undefined if not available\r\n } : null;\r\n \r\n callback(authEvent, authSession);\r\n });\r\n\r\n return { data: { subscription: { unsubscribe } } };\r\n }\r\n}\r\n\r\n","import { IAuthProvider, AuthError, AuthErrorType } from './IAuthProvider';\r\nimport { SupabaseAuthProvider } from './SupabaseAuthProvider';\r\nimport { FirebaseAuthProvider } from './FirebaseAuthProvider';\r\nimport { getAuthConfig, validateConfig } from '../config/env';\r\nimport { IAuthStorage, createAuthStorage } from '../config/storage';\r\n\r\n/**\r\n * Supported authentication provider types\r\n */\r\nexport type AuthProviderType = 'supabase' | 'firebase';\r\n\r\n/**\r\n * Configuration interface for provider factory\r\n */\r\nexport interface AuthProviderConfig {\r\n /** Provider type to use */\r\n type: AuthProviderType;\r\n /** Whether to validate configuration on creation */\r\n validateConfig?: boolean;\r\n /** Whether to use singleton pattern */\r\n useSingleton?: boolean;\r\n /** Custom storage implementation (optional) */\r\n storage?: IAuthStorage;\r\n}\r\n\r\n/**\r\n * Factory class for creating authentication providers with improved patterns\r\n */\r\nexport class AuthProviderFactory {\r\n private static instances: Map<AuthProviderType, IAuthProvider> = new Map();\r\n\r\n /**\r\n * Gets provider based on environment variables (auto-detection)\r\n * @param config Optional configuration overrides\r\n * @returns Authentication provider instance\r\n */\r\n static async getProviderFromEnvironment(config?: Partial<AuthProviderConfig>): Promise<IAuthProvider> {\r\n const detectedType = this.detectProviderFromEnvironment();\r\n \r\n return this.getProvider({\r\n type: detectedType,\r\n validateConfig: true,\r\n useSingleton: true,\r\n ...config\r\n });\r\n }\r\n\r\n /**\r\n * Gets provider instance with configuration\r\n * @param config Provider configuration\r\n * @returns Authentication provider instance\r\n */\r\n static async getProvider(config: AuthProviderConfig): Promise<IAuthProvider> {\r\n const { type, validateConfig = false, useSingleton = false, storage } = config;\r\n\r\n // Return singleton instance if requested and exists\r\n if (useSingleton && this.instances.has(type)) {\r\n const instance = this.instances.get(type)!;\r\n if (validateConfig && instance.validateConfiguration) {\r\n await instance.validateConfiguration();\r\n }\r\n return instance;\r\n }\r\n\r\n // Create new instance\r\n const provider = this.createProvider(type, storage);\r\n\r\n // Validate configuration if requested\r\n if (validateConfig && provider.validateConfiguration) {\r\n await provider.validateConfiguration();\r\n }\r\n\r\n // Store singleton if requested\r\n if (useSingleton) {\r\n this.instances.set(type, provider);\r\n }\r\n\r\n return provider;\r\n }\r\n\r\n /**\r\n * Creates a new provider instance without caching\r\n * @param type Provider type\r\n * @param storage Optional custom storage implementation\r\n * @returns Authentication provider instance\r\n */\r\n static createProvider(type: AuthProviderType, storage?: IAuthStorage): IAuthProvider {\r\n const authStorage = storage || createAuthStorage();\r\n \r\n switch (type) {\r\n case 'supabase':\r\n return new SupabaseAuthProvider(authStorage);\r\n case 'firebase':\r\n return new FirebaseAuthProvider(authStorage);\r\n default:\r\n throw new AuthError(\r\n AuthErrorType.CONFIGURATION_ERROR,\r\n `Unsupported authentication provider: ${type}. Supported providers: supabase, firebase`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Detects provider type from environment variables\r\n * @returns Detected provider type\r\n */\r\n private static detectProviderFromEnvironment(): AuthProviderType {\r\n const config = getAuthConfig();\r\n \r\n // Check for Supabase environment variables\r\n const hasSupabaseConfig = !!(config.supabaseUrl && config.supabaseAnonKey);\r\n\r\n // Check for Firebase environment variables\r\n const hasFirebaseConfig = !!(\r\n config.firebaseApiKey && \r\n config.firebaseAuthDomain && \r\n config.firebaseProjectId\r\n );\r\n\r\n // Explicit provider selection via environment variable\r\n const explicitProvider = this.getExplicitProvider();\r\n if (explicitProvider && this.isValidProviderType(explicitProvider)) {\r\n return explicitProvider;\r\n }\r\n\r\n // Auto-detection based on available configuration\r\n if (hasSupabaseConfig && !hasFirebaseConfig) {\r\n return 'supabase';\r\n }\r\n \r\n if (hasFirebaseConfig && !hasSupabaseConfig) {\r\n return 'firebase';\r\n }\r\n\r\n // Both configurations present - prefer explicit or default to Supabase\r\n if (hasSupabaseConfig && hasFirebaseConfig) {\r\n console.warn(\r\n 'Both Supabase and Firebase configurations detected. ' +\r\n 'Set AUTH_PROVIDER environment variable to explicitly choose a provider. ' +\r\n 'Defaulting to Supabase.'\r\n );\r\n return 'supabase';\r\n }\r\n\r\n // No configuration found\r\n throw new AuthError(\r\n AuthErrorType.CONFIGURATION_ERROR,\r\n 'No authentication provider configuration found. ' +\r\n 'Please configure either Supabase or Firebase environment variables.'\r\n );\r\n }\r\n\r\n /**\r\n * Gets explicit provider from environment variables (platform-agnostic)\r\n */\r\n private static getExplicitProvider(): string | undefined {\r\n // Try different environment variable patterns based on platform\r\n if (typeof process !== 'undefined' && process.env) {\r\n return process.env.NEXT_PUBLIC_AUTH_PROVIDER || process.env.AUTH_PROVIDER;\r\n }\r\n \r\n // For React Native with expo-constants\r\n try {\r\n const Constants = require('expo-constants').default;\r\n return Constants.expoConfig?.extra?.authProvider;\r\n } catch (error) {\r\n // Expo constants not available\r\n }\r\n \r\n // For React Native with react-native-config\r\n try {\r\n const Config = require('react-native-config').default;\r\n return Config.AUTH_PROVIDER;\r\n } catch (error) {\r\n // react-native-config not available\r\n }\r\n \r\n return undefined;\r\n }\r\n\r\n /**\r\n * Validates if a string is a valid provider type\r\n * @param type String to validate\r\n * @returns True if valid provider type\r\n */\r\n private static isValidProviderType(type: string): type is AuthProviderType {\r\n return type === 'supabase' || type === 'firebase';\r\n }\r\n\r\n /**\r\n * Gets list of supported provider types\r\n * @returns Array of supported provider types\r\n */\r\n static getSupportedProviders(): AuthProviderType[] {\r\n return ['supabase', 'firebase'];\r\n }\r\n\r\n /**\r\n * Checks if a provider type is supported\r\n * @param type Provider type to check\r\n * @returns True if supported\r\n */\r\n static isProviderSupported(type: string): type is AuthProviderType {\r\n return this.isValidProviderType(type);\r\n }\r\n\r\n /**\r\n * Clears singleton instances (useful for testing)\r\n */\r\n static clearInstances(): void {\r\n this.instances.clear();\r\n }\r\n\r\n /**\r\n * Gets current singleton instances (useful for debugging)\r\n * @returns Map of current instances\r\n */\r\n static getInstances(): Map<AuthProviderType, IAuthProvider> {\r\n return new Map(this.instances);\r\n }\r\n}\r\n\r\n","// Core exports\r\nexport * from './types'\r\nexport * from './core/IAuthProvider'\r\nexport * from './core/AuthProviderFactory'\r\nexport * from './core/SupabaseAuthProvider'\r\nexport * from './core/FirebaseAuthProvider'\r\n\r\n// Configuration exports\r\nexport * from './config/storage'\r\n\r\n// Hook exports\r\nexport * from './hooks/useAuth'\r\nexport * from './hooks/useAuthForm'\r\nexport * from './hooks/useProtectedRoute'\r\nexport * from './hooks/useRBAC'\r\nexport * from './hooks/use2FA'\r\nexport * from './hooks/useRedirectUrl'\r\n\r\n// Component exports\r\nexport * from './components/AuthProvider'\r\n\r\n// Store exports\r\nexport { createAuthStore } from './store/authStore'\r\n\r\n// Utility exports\r\nexport * from './utils/authConfig'\r\nexport * from './utils/password'\r\nexport * from './utils/validation'\r\nexport * from './utils/performance'\r\nexport * from './utils/healthCheck'\r\n\r\n// Note: utils/supabase is not exported by default to avoid breaking apps without Supabase config\r\n// Import directly from '@digilogiclabs/saas-factory-auth/utils/supabase' if needed\r\n\r\n// Middleware exports\r\nexport * from './middleware/withAuth'\r\n\r\n// Server exports\r\nexport * from './server/verification'\r\n\r\n","'use client'\r\n\r\nimport { createContext, ReactNode, useEffect, useState } from 'react'\r\nimport { AuthProviderFactory, AuthProviderType } from '../core/AuthProviderFactory'\r\nimport { IAuthProvider, AuthSession, AuthEvent } from '../core/IAuthProvider'\r\nimport { IAuthStorage, createAuthStorage } from '../config/storage'\r\nimport { createAuthStore } from '../store/authStore'\r\nimport { AuthStore } from '../types'\r\n\r\nexport const AuthContext = createContext<AuthStore | null>(null)\r\n\r\ninterface AuthProviderProps {\r\n children: ReactNode;\r\n providerType?: AuthProviderType; // Default to 'supabase'\r\n storage?: IAuthStorage; // Optional custom storage implementation\r\n}\r\n\r\nexport const AuthProvider = ({ children, providerType = 'supabase', storage }: AuthProviderProps) => {\r\n const [authProvider, setAuthProvider] = useState<IAuthProvider | null>(null);\r\n const [useAuthStore, setUseAuthStore] = useState<any>(null);\r\n\r\n useEffect(() => {\r\n const initializeProvider = async () => {\r\n try {\r\n const authStorage = storage || createAuthStorage();\r\n const provider = await AuthProviderFactory.getProvider({ \r\n type: providerType,\r\n validateConfig: true,\r\n useSingleton: true,\r\n storage: authStorage\r\n });\r\n setAuthProvider(provider);\r\n setUseAuthStore(createAuthStore({ authProvider: provider }));\r\n } catch (error) {\r\n console.error('Failed to initialize auth provider:', error);\r\n }\r\n };\r\n\r\n initializeProvider();\r\n }, [providerType, storage]);\r\n\r\n useEffect(() => {\r\n if (!authProvider || !useAuthStore) return;\r\n\r\n const subscriptionResult = authProvider.onAuthStateChange((event: AuthEvent, session: AuthSession | null) => {\r\n useAuthStore.getState().updateUser(session?.user || null);\r\n useAuthStore.getState().setLoading(false);\r\n });\r\n\r\n let unsubscribe: (() => void) | undefined;\r\n\r\n // Check if the subscription object has a 'data' property with a 'subscription' property\r\n if ('data' in subscriptionResult && subscriptionResult.data && 'subscription' in subscriptionResult.data && typeof subscriptionResult.data.subscription === 'object' && subscriptionResult.data.subscription !== null && 'unsubscribe' in subscriptionResult.data.subscription && typeof subscriptionResult.data.subscription.unsubscribe === 'function') {\r\n unsubscribe = subscriptionResult.data.subscription.unsubscribe as () => void;\r\n } else if ('data' in subscriptionResult && subscriptionResult.data && 'unsubscribe' in subscriptionResult.data && typeof subscriptionResult.data.unsubscribe === 'function') {\r\n // Handle the case where unsubscribe is directly under data\r\n unsubscribe = subscriptionResult.data.unsubscribe as () => void;\r\n } else if ('unsubscribe' in subscriptionResult && typeof subscriptionResult.unsubscribe === 'function') {\r\n // Handle the case where unsubscribe is directly on the result object (less likely based on IAuthProvider, but for robustness)\r\n unsubscribe = subscriptionResult.unsubscribe as () => void;\r\n }\r\n\r\n // Initial user check\r\n authProvider.getUser().then((user: any) => {\r\n useAuthStore.getState().updateUser(user);\r\n useAuthStore.getState().setLoading(false);\r\n }).catch((error: any) => {\r\n console.error('Failed to get initial user:', error);\r\n useAuthStore.getState().setLoading(false);\r\n });\r\n\r\n return () => {\r\n if (unsubscribe) {\r\n unsubscribe();\r\n }\r\n };\r\n }, [authProvider, useAuthStore]);\r\n\r\n if (!useAuthStore) {\r\n return <div>Loading authentication...</div>;\r\n }\r\n\r\n return <AuthContext.Provider value={useAuthStore.getState()}>{children}</AuthContext.Provider>\r\n}\r\n\r\n","import { create } from 'zustand'\r\nimport { AuthStore } from '../types'\r\nimport { IAuthProvider } from '../core/IAuthProvider'\r\n\r\ninterface AuthStoreProps {\r\n authProvider: IAuthProvider;\r\n}\r\n\r\nexport const createAuthStore = ({ authProvider }: AuthStoreProps) => create<AuthStore>((set) => ({\r\n user: null,\r\n loading: true,\r\n error: null,\r\n\r\n updateUser: (user) => set({ user }),\r\n setLoading: (loading) => set({ loading }),\r\n setError: (error) => set({ error }),\r\n\r\n signIn: async (email, password) => {\r\n set({ loading: true, error: null });\r\n try {\r\n const user = await authProvider.signIn(email, password);\r\n set({ user, loading: false });\r\n } catch (error: any) {\r\n set({ error, loading: false });\r\n throw error;\r\n }\r\n },\r\n\r\n signUp: async (email, password) => {\r\n set({ loading: true, error: null });\r\n try {\r\n const user = await authProvider.signUp(email, password);\r\n set({ user, loading: false });\r\n } catch (error: any) {\r\n set({ error, loading: false });\r\n throw error;\r\n }\r\n },\r\n\r\n signInWithOAuth: async (provider, redirectTo) => {\r\n set({ loading: true, error: null });\r\n try {\r\n await authProvider.signInWithOAuth(provider, redirectTo);\r\n set({ loading: false });\r\n } catch (error: any) {\r\n set({ error, loading: false });\r\n throw error;\r\n }\r\n },\r\n\r\n signInWithMagicLink: async (email, redirectTo) => {\r\n set({ loading: true, error: null });\r\n try {\r\n await authProvider.signInWithMagicLink(email, redirectTo);\r\n set({ loading: false });\r\n } catch (error: any) {\r\n set({ error, loading: false });\r\n throw error;\r\n }\r\n },\r\n\r\n signOut: async () => {\r\n set({ loading: true, error: null });\r\n try {\r\n await authProvider.signOut();\r\n set({ user: null, loading: false });\r\n } catch (error: any) {\r\n set({ error, loading: false });\r\n throw error;\r\n }\r\n },\r\n\r\n resetPassword: async (email) => {\r\n set({ loading: true, error: null });\r\n try {\r\n await authProvider.resetPassword(email);\r\n set({ loading: false });\r\n } catch (error: any) {\r\n set({ error, loading: false });\r\n throw error;\r\n }\r\n },\r\n\r\n getUser: async () => {\r\n try {\r\n return await authProvider.getUser();\r\n } catch (error: any) {\r\n set({ error });\r\n throw error;\r\n }\r\n },\r\n\r\n onAuthStateChange: (callback) => {\r\n return authProvider.onAuthStateChange(callback);\r\n },\r\n}));\r\n\r\n\r\n","\r\n'use client'\r\nimport { useEffect, useContext } from 'react'\r\nimport { AuthContext } from '../components/AuthProvider'\r\n\r\nexport const useAuth = () => {\r\n const store = useContext(AuthContext)\r\n\r\n if (!store) {\r\n throw new Error('useAuth must be used within an AuthProvider');\r\n }\r\n\r\n useEffect(() => {\r\n // The onAuthStateChange subscription is now handled within AuthProvider.tsx\r\n // Initial user check is also handled there.\r\n // No need to re-subscribe or re-check here.\r\n\r\n // Clean up function for the effect\r\n return () => {\r\n // Any cleanup specific to this hook can go here if needed\r\n };\r\n }, [store]); // Depend on store to re-run if the store instance changes\r\n\r\n return {\r\n ...store,\r\n }\r\n}\r\n\r\n\r\n","import { useState, useContext } from 'react';\r\nimport { AuthContext } from '../components/AuthProvider';\r\nimport { AuthError, AuthErrorType, OAuthProvider } from '../core/IAuthProvider';\r\n\r\nexport interface UseAuthFormOptions {\r\n onSuccess?: () => void;\r\n onError?: (error: AuthError) => void;\r\n redirectUrl?: string;\r\n}\r\n\r\nexport interface AuthFormState {\r\n email: string;\r\n password: string;\r\n confirmPassword: string;\r\n loading: boolean;\r\n error: string | null;\r\n message: string | null;\r\n}\r\n\r\nexport interface AuthFormActions {\r\n setEmail: (email: string) => void;\r\n setPassword: (password: string) => void;\r\n setConfirmPassword: (password: string) => void;\r\n handleSignIn: () => Promise<void>;\r\n handleSignUp: () => Promise<void>;\r\n handleOAuthSignIn: (provider: OAuthProvider) => Promise<void>;\r\n handlePasswordReset: () => Promise<void>;\r\n handleMagicLink: () => Promise<void>;\r\n clearError: () => void;\r\n clearMessage: () => void;\r\n}\r\n\r\nexport const useAuthForm = (options: UseAuthFormOptions = {}): AuthFormState & AuthFormActions => {\r\n const auth = useContext(AuthContext);\r\n const [email, setEmail] = useState('');\r\n const [password, setPassword] = useState('');\r\n const [confirmPassword, setConfirmPassword] = useState('');\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [message, setMessage] = useState<string | null>(null);\r\n\r\n if (!auth) {\r\n throw new Error('useAuthForm must be used within AuthProvider');\r\n }\r\n\r\n const clearError = () => setError(null);\r\n const clearMessage = () => setMessage(null);\r\n\r\n const handleSignIn = async () => {\r\n setLoading(true);\r\n setError(null);\r\n setMessage(null);\r\n \r\n try {\r\n await auth.signIn(email, password);\r\n options.onSuccess?.();\r\n } catch (err) {\r\n const authError = err instanceof AuthError ? err : new AuthError(AuthErrorType.PROVIDER_ERROR, (err as Error).message);\r\n setError(authError.message);\r\n options.onError?.(authError);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleSignUp = async () => {\r\n if (password !== confirmPassword) {\r\n setError('Passwords do not match');\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n setError(null);\r\n setMessage(null);\r\n \r\n try {\r\n await auth.signUp(email, password);\r\n setMessage('Check your email to confirm your account');\r\n options.onSuccess?.();\r\n } catch (err) {\r\n const authError = err instanceof AuthError ? err : new AuthError(AuthErrorType.PROVIDER_ERROR, (err as Error).message);\r\n setError(authError.message);\r\n options.onError?.(authError);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleOAuthSignIn = async (provider: OAuthProvider) => {\r\n setLoading(true);\r\n setError(null);\r\n \r\n try {\r\n await auth.signInWithOAuth(provider, options.redirectUrl);\r\n options.onSuccess?.();\r\n } catch (err) {\r\n const authError = err instanceof AuthError ? err : new AuthError(AuthErrorType.PROVIDER_ERROR, (err as Error).message);\r\n setError(authError.message);\r\n options.onError?.(authError);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handlePasswordReset = async () => {\r\n if (!email) {\r\n setError('Please enter your email address');\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n setError(null);\r\n setMessage(null);\r\n \r\n try {\r\n await auth.resetPassword(email);\r\n setMessage('Password reset email sent');\r\n } catch (err) {\r\n const authError = err instanceof AuthError ? err : new AuthError(AuthErrorType.PROVIDER_ERROR, (err as Error).message);\r\n setError(authError.message);\r\n options.onError?.(authError);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const handleMagicLink = async () => {\r\n if (!email) {\r\n setError('Please enter your email address');\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n setError(null);\r\n setMessage(null);\r\n \r\n try {\r\n await auth.signInWithMagicLink(email, options.redirectUrl);\r\n setMessage('Magic link sent to your email');\r\n } catch (err) {\r\n const authError = err instanceof AuthError ? err : new AuthError(AuthErrorType.PROVIDER_ERROR, (err as Error).message);\r\n setError(authError.message);\r\n options.onError?.(authError);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n return {\r\n // State\r\n email,\r\n password,\r\n confirmPassword,\r\n loading,\r\n error,\r\n message,\r\n // Actions\r\n setEmail,\r\n setPassword,\r\n setConfirmPassword,\r\n handleSignIn,\r\n handleSignUp,\r\n handleOAuthSignIn,\r\n handlePasswordReset,\r\n handleMagicLink,\r\n clearError,\r\n clearMessage,\r\n };\r\n};\r\n\r\n","import { useEffect, useContext } from 'react';\r\nimport { AuthContext } from '../components/AuthProvider';\r\n\r\nexport interface UseProtectedRouteOptions {\r\n redirectTo?: string;\r\n requiredRoles?: string[];\r\n onUnauthorized?: () => void;\r\n onUnauthenticated?: () => void;\r\n}\r\n\r\nexport const useProtectedRoute = (options: UseProtectedRouteOptions = {}) => {\r\n const auth = useContext(AuthContext);\r\n\r\n useEffect(() => {\r\n if (!auth || auth.loading) return;\r\n\r\n const checkAuth = async () => {\r\n const user = await auth.getUser();\r\n \r\n if (!user) {\r\n options.onUnauthenticated?.();\r\n return;\r\n }\r\n\r\n if (options.requiredRoles && options.requiredRoles.length > 0) {\r\n const userRoles = user.roles || [];\r\n const hasRequiredRole = options.requiredRoles.some(role => userRoles.includes(role));\r\n \r\n if (!hasRequiredRole) {\r\n options.onUnauthorized?.();\r\n return;\r\n }\r\n }\r\n };\r\n\r\n checkAuth();\r\n\r\n // Listen for auth state changes\r\n const unsubscribe = auth.onAuthStateChange((event, session) => {\r\n if (!session?.user) {\r\n options.onUnauthenticated?.();\r\n }\r\n });\r\n\r\n return () => {\r\n if (typeof unsubscribe === 'function') {\r\n unsubscribe();\r\n } else if (unsubscribe && 'data' in unsubscribe && unsubscribe.data?.subscription?.unsubscribe) {\r\n unsubscribe.data.subscription.unsubscribe();\r\n }\r\n };\r\n }, [auth, options]);\r\n\r\n return {\r\n user: auth?.user,\r\n loading: auth?.loading,\r\n isAuthenticated: !!auth?.user,\r\n };\r\n};\r\n\r\n","import { AuthContext } from \"../components/AuthProvider\"\r\nimport { useContext } from \"react\"\r\nimport { UserRole } from '../types'\r\n\r\nexport function useRBAC() {\r\n const auth = useContext(AuthContext)\r\n if (!auth) throw new Error(\"AuthContext not provided\")\r\n const { user } = auth\r\n \r\n const checkPermission = (permission: string): boolean => {\r\n const userRole = user?.metadata?.role as UserRole\r\n return userRole?.permissions?.includes(permission) ?? false\r\n }\r\n\r\n const hasRole = (role: string): boolean => {\r\n const userRole = user?.metadata?.role as UserRole\r\n return userRole?.role === role\r\n }\r\n\r\n return {\r\n checkPermission,\r\n hasRole\r\n }\r\n}","import { createClientComponentClient } from '@supabase/auth-helpers-nextjs'\r\nimport type { Database } from './database.types'\r\n\r\nexport const createClient = () => {\r\n if (!process.env.NEXT_PUBLIC_SUPABASE_URL || !process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY) {\r\n throw new Error('Missing Supabase environment variables')\r\n }\r\n\r\n return createClientComponentClient<Database>()\r\n}\r\n\r\n// Safe supabase client that only initializes when environment variables are available\r\nlet _supabaseClient: ReturnType<typeof createClientComponentClient<Database>> | null = null;\r\n\r\nexport const getSupabaseClient = () => {\r\n if (!_supabaseClient) {\r\n _supabaseClient = createClient();\r\n }\r\n return _supabaseClient;\r\n}\r\n\r\n// Only export supabase if environment variables are available\r\n// This prevents breaking existing apps that don't use Supabase\r\nexport const supabase = (() => {\r\n try {\r\n if (process.env.NEXT_PUBLIC_SUPABASE_URL && process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY) {\r\n return createClient();\r\n }\r\n } catch (error) {\r\n // Silently fail if environment variables are not available\r\n console.warn('Supabase client not initialized: environment variables not available');\r\n }\r\n return null;\r\n})();\r\n\r\n","import { useState } from 'react'\r\nimport { supabase } from '../utils/supabase'\r\n\r\nexport function use2FA() {\r\n const [loading, setLoading] = useState(false)\r\n const [error, setError] = useState<Error | null>(null)\r\n\r\n const setup2FA = async () => {\r\n if (!supabase) {\r\n throw new Error('Supabase client not initialized. Please check your environment variables.');\r\n }\r\n\r\n setLoading(true)\r\n setError(null)\r\n \r\n try {\r\n const { data, error } = await supabase.auth.mfa.enroll({\r\n factorType: 'totp'\r\n })\r\n \r\n if (error) throw error\r\n \r\n return data\r\n } catch (err) {\r\n const error = err as Error\r\n setError(error)\r\n throw error\r\n } finally {\r\n setLoading(false)\r\n }\r\n }\r\n\r\n const verify2FA = async (factorId: string, challengeId: string, code: string) => {\r\n if (!supabase) {\r\n throw new Error('Supabase client not initialized. Please check your environment variables.');\r\n }\r\n\r\n setLoading(true)\r\n setError(null)\r\n \r\n try {\r\n const { data, error } = await supabase.auth.mfa.verify({\r\n factorId,\r\n challengeId,\r\n code\r\n })\r\n \r\n if (error) throw error\r\n \r\n return data\r\n } catch (err) {\r\n const error = err as Error\r\n setError(error)\r\n throw error\r\n } finally {\r\n setLoading(false)\r\n }\r\n }\r\n\r\n const unenroll2FA = async (factorId: string) => {\r\n if (!supabase) {\r\n throw new Error('Supabase client not initialized. Please check your environment variables.');\r\n }\r\n\r\n setLoading(true)\r\n setError(null)\r\n \r\n try {\r\n const { data, error } = await supabase.auth.mfa.unenroll({\r\n factorId\r\n })\r\n \r\n if (error) throw error\r\n \r\n return data\r\n } catch (err) {\r\n const error = err as Error\r\n setError(error)\r\n throw error\r\n } finally {\r\n setLoading(false)\r\n }\r\n }\r\n\r\n return {\r\n setup2FA,\r\n verify2FA,\r\n unenroll2FA,\r\n loading,\r\n error\r\n }\r\n}\r\n\r\n","// packages/auth/src/hooks/useRedirectUrl.ts\r\nimport { useSearchParams } from 'next/navigation'\r\n\r\nexport function useRedirectUrl(defaultUrl = '/dashboard') {\r\n const searchParams = useSearchParams()\r\n return searchParams?.get('returnUrl') || defaultUrl\r\n}","import { AuthConfig } from \"../types\";\r\n\r\nexport const defaultAuthConfig: AuthConfig = {\r\n passwordRequirements: {\r\n minLength: 8,\r\n requireNumbers: true,\r\n requireSpecialChars: true,\r\n requireUppercase: true\r\n },\r\n maxLoginAttempts: 5,\r\n lockoutDuration: 15, // 15 minutes\r\n jwtExpiryTime: 3600, // 1 hour\r\n require2FA: false\r\n }","import { AuthConfig } from \"../types\"\r\n\r\nexport function validatePassword(password: string, config: AuthConfig['passwordRequirements']) {\r\n if (!config) return true\r\n \r\n const { minLength, requireNumbers, requireSpecialChars, requireUppercase } = config\r\n \r\n if (password.length < minLength) {\r\n throw new Error(`Password must be at least ${minLength} characters long`)\r\n }\r\n \r\n if (requireNumbers && !/\\d/.test(password)) {\r\n throw new Error('Password must contain at least one number')\r\n }\r\n \r\n if (requireSpecialChars && !/[!@#$%^&*(),.?\":{}|<>]/.test(password)) {\r\n throw new Error('Password must contain at least one special character')\r\n }\r\n \r\n if (requireUppercase && !/[A-Z]/.test(password)) {\r\n throw new Error('Password must contain at least one uppercase letter')\r\n }\r\n \r\n return true\r\n }\r\n ","import { AuthError, AuthErrorType } from '../core/IAuthProvider';\r\n\r\n/**\r\n * Email validation regex pattern\r\n */\r\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n\r\n/**\r\n * Validation utilities for authentication inputs\r\n */\r\nexport class ValidationUtils {\r\n /**\r\n * Validate email address format\r\n */\r\n static validateEmail(email: string): void {\r\n if (!email || typeof email !== 'string') {\r\n throw new AuthError(\r\n AuthErrorType.VALIDATION_ERROR,\r\n 'Email is required and must be a string',\r\n null,\r\n { field: 'email', value: email }\r\n );\r\n }\r\n\r\n if (!EMAIL_REGEX.test(email.trim())) {\r\n throw new AuthError(\r\n AuthErrorType.VALIDATION_ERROR,\r\n 'Invalid email format',\r\n null,\r\n { field: 'email', value: email }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Validate password strength\r\n */\r\n static validatePassword(password: string, requirements?: {\r\n minLength?: number;\r\n requireNumbers?: boolean;\r\n requireSpecialChars?: boolean;\r\n requireUppercase?: boolean;\r\n }): void {\r\n if (!password || typeof password !== 'string') {\r\n throw new AuthError(\r\n AuthErrorType.VALIDATION_ERROR,\r\n 'Password is required and must be a string',\r\n null,\r\n { field: 'password' }\r\n );\r\n }\r\n\r\n const {\r\n minLength = 8,\r\n requireNumbers = true,\r\n requireSpecialChars = true,\r\n requireUppercase = true\r\n } = requirements || {};\r\n\r\n if (password.length < minLength) {\r\n throw new AuthError(\r\n AuthErrorType.WEAK_PASSWORD,\r\n `Password must be at least ${minLength} characters long`,\r\n null,\r\n { field: 'password', requirement: 'minLength', expected: minLength, actual: password.length }\r\n );\r\n }\r\n\r\n if (requireNumbers && !/\\d/.test(password)) {\r\n throw new AuthError(\r\n AuthErrorType.WEAK_PASSWORD,\r\n 'Password must contain at least one number',\r\n null,\r\n { field: 'password', requirement: 'numbers' }\r\n );\r\n }\r\n\r\n if (requireSpecialChars && !/[!@#$%^&*(),.?\":{}|<>]/.test(password)) {\r\n throw new AuthError(\r\n AuthErrorType.WEAK_PASSWORD,\r\n 'Password must contain at least one special character',\r\n null,\r\n { field: 'password', requirement: 'specialChars' }\r\n );\r\n }\r\n\r\n if (requireUppercase && !/[A-Z]/.test(password)) {\r\n throw new AuthError(\r\n AuthErrorType.WEAK_PASSWORD,\r\n 'Password must contain at least one uppercase letter',\r\n null,\r\n { field: 'password', requirement: 'uppercase' }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Validate OAuth provider\r\n */\r\n static validateOAuthProvider(provider: string): void {\r\n if (!provider || typeof provider !== 'string') {\r\n throw new AuthError(\r\n AuthErrorType.VALIDATION_ERROR,\r\n 'OAuth provider is required and must be a string',\r\n null,\r\n { field: 'provider', value: provider }\r\n );\r\n }\r\n\r\n const validProviders = ['google', 'github', 'apple', 'facebook', 'twitter', 'discord'];\r\n if (!validProviders.includes(provider.toLowerCase())) {\r\n throw new AuthError(\r\n AuthErrorType.VALIDATION_ERROR,\r\n `Invalid OAuth provider: ${provider}. Supported providers: ${validProviders.join(', ')}`,\r\n null,\r\n { field: 'provider', value: provider, validProviders }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Validate URL format\r\n */\r\n static validateUrl(url: string, fieldName: string = 'url'): void {\r\n if (!url || typeof url !== 'string') {\r\n throw new AuthError(\r\n AuthErrorType.VALIDATION_ERROR,\r\n `${fieldName} is required and must be a string`,\r\n null,\r\n { field: fieldName, value: url }\r\n );\r\n }\r\n\r\n try {\r\n new URL(url);\r\n } catch (error) {\r\n throw new AuthError(\r\n AuthErrorType.VALIDATION_ERROR,\r\n `Invalid ${fieldName} format`,\r\n error,\r\n { field: fieldName, value: url }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Validate required string field\r\n */\r\n static validateRequiredString(value: any, fieldName: string): void {\r\n if (!value || typeof value !== 'string' || value.trim().length === 0) {\r\n throw new AuthError(\r\n AuthErrorType.VALIDATION_ERROR,\r\n `${fieldName} is required and must be a non-empty string`,\r\n null,\r\n { field: fieldName, value }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Sanitize email input\r\n */\r\n static sanitizeEmail(email: string): string {\r\n return email?.trim().toLowerCase() || '';\r\n }\r\n\r\n /**\r\n * Check if error is a validation error\r\n */\r\n static isValidationError(error: any): error is AuthError {\r\n return error instanceof AuthError && \r\n (error.type === AuthErrorType.VALIDATION_ERROR || \r\n error.type === AuthErrorType.WEAK_PASSWORD);\r\n }\r\n}\r\n\r\n/**\r\n * Decorator for validating method parameters\r\n */\r\nexport function validateParams(validations: Record<string, (value: any) => void>) {\r\n return function (target: any, propertyName: string, descriptor: PropertyDescriptor) {\r\n const method = descriptor.value;\r\n\r\n descriptor.value = function (...args: any[]) {\r\n const paramNames = getParameterNames(method);\r\n \r\n paramNames.forEach((paramName, index) => {\r\n if (validations[paramName] && args[index] !== undefined) {\r\n validations[paramName](args[index]);\r\n }\r\n });\r\n\r\n return method.apply(this, args);\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * Extract parameter names from function\r\n */\r\nfunction getParameterNames(func: Function): string[] {\r\n const funcStr = func.toString();\r\n const match = funcStr.match(/\\(([^)]*)\\)/);\r\n if (!match) return [];\r\n \r\n return match[1]\r\n .split(',')\r\n .map(param => param.trim().split(/\\s+/)[0])\r\n .filter(param => param.length > 0);\r\n}\r\n\r\n","/**\r\n * Performance optimization utilities for authentication operations\r\n */\r\n\r\n/**\r\n * Simple memoization utility for caching function results\r\n */\r\nexport function memoize<T extends (...args: any[]) => any>(\r\n fn: T,\r\n keyGenerator?: (...args: Parameters<T>) => string\r\n): T {\r\n const cache = new Map<string, ReturnType<T>>();\r\n\r\n return ((...args: Parameters<T>): ReturnType<T> => {\r\n const key = keyGenerator ? keyGenerator(...args) : JSON.stringify(args);\r\n \r\n if (cache.has(key)) {\r\n return cache.get(key)!;\r\n }\r\n\r\n const result = fn(...args);\r\n cache.set(key, result);\r\n return result;\r\n }) as T;\r\n}\r\n\r\n/**\r\n * Debounce utility for rate-limiting function calls\r\n */\r\nexport function debounce<T extends (...args: any[]) => any>(\r\n fn: T,\r\n delay: number\r\n): (...args: Parameters<T>) => void {\r\n let timeoutId: NodeJS.Timeout | number;\r\n\r\n return (...args: Parameters<T>) => {\r\n clearTimeout(timeoutId);\r\n timeoutId = setTimeout(() => fn(...args), delay);\r\n };\r\n}\r\n\r\n/**\r\n * Throttle utility for limiting function call frequency\r\n */\r\nexport function throttle<T extends (...args: any[]) => any>(\r\n fn: T,\r\n limit: number\r\n): (...args: Parameters<T>) => void {\r\n let inThrottle: boolean;\r\n\r\n return (...args: Parameters<T>) => {\r\n if (!inThrottle) {\r\n fn(...args);\r\n inThrottle = true;\r\n setTimeout(() => inThrottle = false, limit);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Retry utility with exponential backoff\r\n */\r\nexport async function retryWithBackoff<T>(\r\n fn: () => Promise<T>,\r\n maxRetries: number = 3,\r\n baseDelay: number = 1000,\r\n maxDelay: number = 10000\r\n): Promise<T> {\r\n let lastError: Error;\r\n\r\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n lastError = error as Error;\r\n \r\n if (attempt === maxRetries) {\r\n throw lastError;\r\n }\r\n\r\n const delay = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);\r\n await new Promise(resolve => setTimeout(resolve, delay));\r\n }\r\n }\r\n\r\n throw lastError!;\r\n}\r\n\r\n/**\r\n * Simple LRU cache implementation\r\n */\r\nexport class LRUCache<K, V> {\r\n private cache = new Map<K, V>();\r\n private maxSize: number;\r\n\r\n constructor(maxSize: number = 100) {\r\n this.maxSize = maxSize;\r\n }\r\n\r\n get(key: K): V | undefined {\r\n if (this.cache.has(key)) {\r\n // Move to end (most recently used)\r\n const value = this.cache.get(key)!;\r\n this.cache.delete(key);\r\n this.cache.set(key, value);\r\n return value;\r\n }\r\n return undefined;\r\n }\r\n\r\n set(key: K, value: V): void {\r\n if (this.cache.has(key)) {\r\n this.cache.delete(key);\r\n } else if (this.cache.size >= this.maxSize) {\r\n // Remove least recently used (first item)\r\n const firstKey = this.cache.keys().next().value as K;\r\n if (firstKey !== undefined) {\r\n this.cache.delete(firstKey);\r\n }\r\n }\r\n this.cache.set(key, value);\r\n }\r\n\r\n has(key: K): boolean {\r\n return this.cache.has(key);\r\n }\r\n\r\n clear(): void {\r\n this.cache.clear();\r\n }\r\n\r\n size(): number {\r\n return this.cache.size;\r\n }\r\n}\r\n\r\n/**\r\n * Performance monitoring utility\r\n */\r\nexport class PerformanceMonitor {\r\n private static timers = new Map<string, number>();\r\n\r\n static start(label: string): void {\r\n this.timers.set(label, performance.now());\r\n }\r\n\r\n static end(label: string): number {\r\n const startTime = this.timers.get(label);\r\n if (!startTime) {\r\n console.warn(`Performance timer '${label}' was not started`);\r\n return 0;\r\n }\r\n\r\n const duration = performance.now() - startTime;\r\n this.timers.delete(label);\r\n return duration;\r\n }\r\n\r\n static measure<T>(label: string, fn: () => T): T {\r\n this.start(label);\r\n try {\r\n const result = fn();\r\n return result;\r\n } finally {\r\n const duration = this.end(label);\r\n console.debug(`${label} took ${duration.toFixed(2)}ms`);\r\n }\r\n }\r\n\r\n static async measureAsync<T>(label: string, fn: () => Promise<T>): Promise<T> {\r\n this.start(label);\r\n try {\r\n const result = await fn();\r\n return result;\r\n } finally {\r\n const duration = this.end(label);\r\n console.debug(`${label} took ${duration.toFixed(2)}ms`);\r\n }\r\n }\r\n}\r\n\r\n","import { AuthProviderFactory } from '../core/AuthProviderFactory';\r\nimport { AuthError, AuthErrorType } from '../core/IAuthProvider';\r\nimport { getAuthConfig } from '../config/env';\r\n\r\n/**\r\n * Environment configuration interface\r\n */\r\ninterface EnvConfig {\r\n supabaseUrl?: string;\r\n supabaseAnonKey?: string;\r\n firebaseApiKey?: string;\r\n firebaseAuthDomain?: string;\r\n firebaseProjectId?: string;\r\n redirectUrl?: string;\r\n}\r\n\r\n/**\r\n * Health check result interface\r\n */\r\nexport interface HealthCheckResult {\r\n status: 'healthy' | 'warning' | 'error';\r\n message: string;\r\n details?: Record<string, any>;\r\n timestamp: Date;\r\n}\r\n\r\n/**\r\n * Comprehensive health check results\r\n */\r\nexport interface SystemHealthCheck {\r\n overall: 'healthy' | 'warning' | 'error';\r\n checks: {\r\n configuration: HealthCheckResult;\r\n provider: HealthCheckResult;\r\n storage: HealthCheckResult;\r\n network?: HealthCheckResult;\r\n };\r\n timestamp: Date;\r\n}\r\n\r\n/**\r\n * Health check utilities for authentication system\r\n */\r\nexport class HealthChecker {\r\n /**\r\n * Perform comprehensive system health check\r\n */\r\n static async performHealthCheck(): Promise<SystemHealthCheck> {\r\n const timestamp = new Date();\r\n const checks = {\r\n configuration: await this.checkConfiguration(),\r\n provider: await this.checkProvider(),\r\n storage: await this.checkStorage(),\r\n };\r\n\r\n // Determine overall health\r\n const statuses = Object.values(checks).map(check => check.status);\r\n let overall: 'healthy' | 'warning' | 'error' = 'healthy';\r\n \r\n if (statuses.includes('error')) {\r\n overall = 'error';\r\n } else if (statuses.includes('warning')) {\r\n overall = 'warning';\r\n }\r\n\r\n return {\r\n overall,\r\n checks,\r\n timestamp\r\n };\r\n }\r\n\r\n /**\r\n * Check configuration validity\r\n */\r\n static async checkConfiguration(): Promise<HealthCheckResult> {\r\n try {\r\n const config = getAuthConfig();\r\n const timestamp = new Date();\r\n\r\n // Determine provider type from available configuration\r\n let providerType: string | null = null;\r\n if (config.supabaseUrl && config.supabaseAnonKey) {\r\n providerType = 'supabase';\r\n } else if (config.firebaseApiKey && config.firebaseAuthDomain && config.firebaseProjectId) {\r\n providerType = 'firebase';\r\n }\r\n\r\n if (!providerType) {\r\n return {\r\n status: 'error',\r\n message: 'No valid authentication provider configuration found',\r\n details: { \r\n hasSupabaseConfig: !!(config.supabaseUrl && config.supabaseAnonKey),\r\n hasFirebaseConfig: !!(config.firebaseApiKey && config.firebaseAuthDomain && config.firebaseProjectId)\r\n },\r\n timestamp\r\n };\r\n }\r\n\r\n // Check provider-specific configuration\r\n if (providerType === 'supabase') {\r\n if (!config.supabaseUrl || !config.supabaseAnonKey) {\r\n return {\r\n status: 'error',\r\n message: 'Missing Supabase configuration (URL or anonymous key)',\r\n details: { \r\n hasUrl: !!config.supabaseUrl, \r\n hasAnonKey: !!config.supabaseAnonKey \r\n },\r\n timestamp\r\n };\r\n }\r\n } else if (providerType === 'firebase') {\r\n if (!config.firebaseApiKey || !config.firebaseAuthDomain || !config.firebaseProjectId) {\r\n return {\r\n status: 'error',\r\n message: 'Missing Firebase configuration (API key, auth domain, or project ID)',\r\n details: { \r\n hasApiKey: !!config.firebaseApiKey,\r\n hasAuthDomain: !!config.firebaseAuthDomain,\r\n hasProjectId: !!config.firebaseProjectId\r\n },\r\n timestamp\r\n };\r\n }\r\n }\r\n\r\n return {\r\n status: 'healthy',\r\n message: 'Configuration is valid',\r\n details: { \r\n provider: providerType,\r\n hasRedirectUrl: !!config.redirectUrl\r\n },\r\n timestamp\r\n };\r\n } catch (error) {\r\n return {\r\n status: 'error',\r\n message: `Configuration check failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n details: { error },\r\n timestamp: new Date()\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Check provider initialization\r\n */\r\n static async checkProvider(): Promise<HealthCheckResult> {\r\n try {\r\n const timestamp = new Date();\r\n const provider = await AuthProviderFactory.getProviderFromEnvironment();\r\n\r\n if (!provider) {\r\n return {\r\n status: 'error',\r\n message: 'Failed to initialize authentication provider',\r\n timestamp\r\n };\r\n }\r\n\r\n return {\r\n status: 'healthy',\r\n message: 'Authentication provider initialized successfully',\r\n details: { providerType: provider.constructor.name },\r\n timestamp\r\n };\r\n } catch (error) {\r\n return {\r\n status: 'error',\r\n message: `Provider initialization failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n details: { error },\r\n timestamp: new Date()\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Check storage functionality\r\n */\r\n static async checkStorage(): Promise<HealthCheckResult> {\r\n try {\r\n const timestamp = new Date();\r\n const { createAuthStorage } = await import('../config/storage');\r\n const storage = createAuthStorage();\r\n\r\n // Test storage operations\r\n const testKey = 'health-check-test';\r\n const testValue = 'test-value';\r\n\r\n await storage.setItem(testKey, testValue);\r\n const retrievedValue = await storage.getItem(testKey);\r\n await storage.removeItem(testKey);\r\n\r\n if (retrievedValue !== testValue) {\r\n return {\r\n status: 'error',\r\n message: 'Storage read/write test failed',\r\n details: { expected: testValue, actual: retrievedValue },\r\n timestamp\r\n };\r\n }\r\n\r\n return {\r\n status: 'healthy',\r\n message: 'Storage is functioning correctly',\r\n details: { storageType: storage.constructor.name },\r\n timestamp\r\n };\r\n } catch (error) {\r\n return {\r\n status: 'error',\r\n message: `Storage check failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n details: { error },\r\n timestamp: new Date()\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Check network connectivity to authentication services\r\n */\r\n static async checkNetworkConnectivity(): Promise<HealthCheckResult> {\r\n try {\r\n const timestamp = new Date();\r\n const config = getAuthConfig();\r\n\r\n // Determine provider type and check connectivity\r\n if (config.supabaseUrl && config.supabaseAnonKey) {\r\n const response = await fetch(`${config.supabaseUrl}/rest/v1/`, {\r\n method: 'HEAD',\r\n headers: {\r\n 'apikey': config.supabaseAnonKey\r\n }\r\n });\r\n\r\n if (!response.ok) {\r\n return {\r\n status: 'warning',\r\n message: `Supabase connectivity issue: ${response.status} ${response.statusText}`,\r\n details: { status: response.status, statusText: response.statusText },\r\n timestamp\r\n };\r\n }\r\n }\r\n\r\n return {\r\n status: 'healthy',\r\n message: 'Network connectivity is working',\r\n timestamp\r\n };\r\n } catch (error) {\r\n return {\r\n status: 'warning',\r\n message: `Network connectivity check failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\r\n details: { error },\r\n timestamp: new Date()\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Generate health check report\r\n */\r\n static generateReport(healthCheck: SystemHealthCheck): string {\r\n const { overall, checks, timestamp } = healthCheck;\r\n \r\n let report = `Authentication System Health Check Report\\n`;\r\n report += `Generated: ${timestamp.toISOString()}\\n`;\r\n report += `Overall Status: ${overall.toUpperCase()}\\n\\n`;\r\n\r\n Object.entries(checks).forEach(([checkName, result]) => {\r\n report += `${checkName.toUpperCase()} CHECK:\\n`;\r\n report += ` Status: ${result.status.toUpperCase()}\\n`;\r\n report += ` Message: ${result.message}\\n`;\r\n if (result.details) {\r\n report += ` Details: ${JSON.stringify(result.details, null, 2)}\\n`;\r\n }\r\n report += `\\n`;\r\n });\r\n\r\n return report;\r\n }\r\n\r\n /**\r\n * Quick health check for monitoring\r\n */\r\n static async quickCheck(): Promise<boolean> {\r\n try {\r\n const configCheck = await this.checkConfiguration();\r\n const providerCheck = await this.checkProvider();\r\n \r\n return configCheck.status !== 'error' && providerCheck.status !== 'error';\r\n } catch (error) {\r\n return false;\r\n }\r\n }\r\n}\r\n\r\n","import { createMiddlewareClient } from '@supabase/auth-helpers-nextjs'\r\nimport { createClient } from '@supabase/supabase-js'\r\nimport { NextResponse } from 'next/server'\r\nimport type { NextRequest } from 'next/server'\r\nimport { User } from '@supabase/supabase-js'\r\n\r\n// Lazy-loaded Supabase admin client\r\nlet supabaseAdmin: ReturnType<typeof createClient> | null = null;\r\n\r\nconst getSupabaseAdmin = () => {\r\n if (!supabaseAdmin) {\r\n if (!process.env.NEXT_PUBLIC_SUPABASE_URL || !process.env.SUPABASE_SERVICE_ROLE_KEY) {\r\n throw new Error('Missing required Supabase environment variables for admin client');\r\n }\r\n supabaseAdmin = createClient(\r\n process.env.NEXT_PUBLIC_SUPABASE_URL,\r\n process.env.SUPABASE_SERVICE_ROLE_KEY\r\n );\r\n }\r\n return supabaseAdmin;\r\n};\r\n\r\nexport function withAuth(\r\n middleware: (request: NextRequest) => Promise<NextResponse> | NextResponse,\r\n options: {\r\n publicRoutes?: string[]\r\n loginRoute?: string\r\n } = {}\r\n) {\r\n const {\r\n publicRoutes = ['/login', '/signup', '/reset-password'],\r\n loginRoute = '/login'\r\n } = options\r\n\r\n return async function middlewareWithAuth(req: NextRequest) {\r\n const res = NextResponse.next()\r\n const supabase = createMiddlewareClient({ req, res })\r\n const {\r\n data: { session },\r\n } = await supabase.auth.getSession()\r\n\r\n let user: User | null | undefined = session?.user\r\n\r\n // Bearer token fallback\r\n if (!user) {\r\n const authHeader = req.headers.get(\"authorization\")\r\n if (authHeader?.startsWith(\"Bearer \")) {\r\n const token = authHeader.substring(7)\r\n try {\r\n const admin = getSupabaseAdmin();\r\n const { data: { user: bearerUser } } = await admin.auth.getUser(token)\r\n user = bearerUser\r\n } catch (error) {\r\n console.error(\"Bearer token verification failed:\", error)\r\n }\r\n }\r\n }\r\n\r\n const isPublicRoute = publicRoutes.includes(req.nextUrl.pathname)\r\n const isLoginRoute = req.nextUrl.pathname === loginRoute\r\n\r\n // Handle public routes\r\n if (isPublicRoute) {\r\n if (user && isLoginRoute) {\r\n // Redirect authenticated users away from login\r\n const returnUrl = req.nextUrl.searchParams.get(\"returnUrl\")\r\n return NextResponse.redirect(new URL(returnUrl || \"/dashboard\", req.url))\r\n }\r\n return middleware(req)\r\n }\r\n\r\n // Handle protected routes\r\n if (!user) {\r\n const redirectUrl = new URL(loginRoute, req.url)\r\n redirectUrl.searchParams.set(\"returnUrl\", req.nextUrl.pathname)\r\n return NextResponse.redirect(redirectUrl)\r\n }\r\n\r\n // If user is authenticated, proceed with the middleware\r\n return middleware(req)\r\n }\r\n}\r\n\r\n","import { createServerComponentClient } from '@supabase/auth-helpers-nextjs'\r\nimport { cookies } from 'next/headers'\r\nimport type { Database } from '../utils/database.types'\r\n\r\nexport async function handleEmailVerification(token: string) {\r\n const supabase = createServerComponentClient<Database>({ cookies })\r\n \r\n try {\r\n const { error } = await supabase.auth.verifyOtp({\r\n token_hash: token,\r\n type: 'email'\r\n })\r\n \r\n if (error) throw error\r\n \r\n return { success: true }\r\n } catch (error) {\r\n return { success: false, error }\r\n }\r\n}"]}
|