supabase-service-manager
Version:
TypeScript library for user authentication, profile management, and basic CRUD operations using Supabase, designed for vanilla JavaScript consumption
1 lines • 35 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../src/types/result.ts","../src/services/auth.service.ts","../src/services/user.service.ts","../src/services/crud.service.ts","../src/core/service-manager.ts","../src/index.ts"],"sourcesContent":["/**\n * @fileoverview Result pattern types for error handling without exceptions\n * @category Types\n */\n\n/**\n * Success result containing data\n */\nexport interface Success<T> {\n success: true;\n data: T;\n}\n\n/**\n * Failure result containing error\n */\nexport interface Failure<E = Error> {\n success: false;\n error: E;\n}\n\n/**\n * Result type that can be either success or failure\n * @template T - Type of success data\n * @template E - Type of error (defaults to Error)\n */\nexport type Result<T, E = Error> = Success<T> | Failure<E>;\n\n/**\n * Creates a success result\n * @param data - The success data\n * @returns Success result\n */\nexport function createSuccess<T>(data: T): Success<T> {\n return {\n success: true,\n data,\n };\n}\n\n/**\n * Creates a failure result\n * @param error - The error\n * @returns Failure result\n */\nexport function createFailure<E = Error>(error: E): Failure<E> {\n return {\n success: false,\n error,\n };\n}\n\n/**\n * Type guard to check if result is successful\n * @param result - Result to check\n * @returns True if result is successful\n */\nexport function isSuccess<T, E>(result: Result<T, E>): result is Success<T> {\n return result.success === true;\n}\n\n/**\n * Type guard to check if result is a failure\n * @param result - Result to check\n * @returns True if result is a failure\n */\nexport function isFailure<T, E>(result: Result<T, E>): result is Failure<E> {\n return result.success === false;\n}\n","/**\n * @fileoverview Authentication service for user authentication operations\n * @category Authentication\n */\n\nimport {createClient, type SupabaseClient} from \"@supabase/supabase-js\";\nimport type {SupabaseConfig, AuthSession, SignUpResult, SignInResult} from \"../types/auth\";\nimport type {User, UserProfileUpdate} from \"../types/user\";\nimport type {Result} from \"../types/result\";\nimport {createSuccess, createFailure} from \"../types/result\";\n\n/**\n * Authentication service handling user authentication operations\n */\nexport class AuthService {\n private supabase: SupabaseClient;\n\n /**\n * Initialize the authentication service\n * @param config - Supabase configuration\n */\n constructor(config: SupabaseConfig) {\n this.supabase = createClient(config.url, config.anonKey);\n }\n\n /**\n * Sign up a new user with email and password\n * @param email - User's email address\n * @param password - User's password\n * @param profile - Optional profile data to set during signup\n * @returns Promise resolving to Result with user and verification status\n */\n async signUp(email: string, password: string, profile?: UserProfileUpdate): Promise<Result<SignUpResult>> {\n try {\n const {data, error} = await this.supabase.auth.signUp({\n email,\n password,\n options: {\n data: profile || {},\n },\n });\n\n if (error) {\n return createFailure(new Error(error.message));\n }\n\n if (!data.user) {\n return createFailure(new Error(\"User creation failed\"));\n }\n\n const user = this.mapSupabaseUserToUser(data.user);\n const needsVerification = !data.user.email_confirmed_at;\n\n return createSuccess({\n user,\n needsVerification,\n });\n } catch (error) {\n return createFailure(error instanceof Error ? error : new Error(\"Sign up failed\"));\n }\n }\n\n /**\n * Sign in an existing user with email and password\n * @param email - User's email address\n * @param password - User's password\n * @returns Promise resolving to Result with user and session\n */\n async signIn(email: string, password: string): Promise<Result<SignInResult>> {\n try {\n const {data, error} = await this.supabase.auth.signInWithPassword({\n email,\n password,\n });\n\n if (error) {\n return createFailure(new Error(error.message));\n }\n\n if (!data.user || !data.session) {\n return createFailure(new Error(\"Sign in failed\"));\n }\n\n const user = this.mapSupabaseUserToUser(data.user);\n const session = this.mapSupabaseSessionToAuthSession(data.session, user);\n\n return createSuccess({\n user,\n session,\n });\n } catch (error) {\n return createFailure(error instanceof Error ? error : new Error(\"Sign in failed\"));\n }\n }\n\n /**\n * Sign out the current user\n * @returns Promise resolving to Result indicating success or failure\n */\n async signOut(): Promise<Result<void>> {\n try {\n const {error} = await this.supabase.auth.signOut();\n\n if (error) {\n return createFailure(new Error(error.message));\n }\n\n return createSuccess(undefined);\n } catch (error) {\n return createFailure(error instanceof Error ? error : new Error(\"Sign out failed\"));\n }\n }\n\n /**\n * Get the current authenticated user\n * @returns Promise resolving to Result with current user or null\n */\n async getCurrentUser(): Promise<Result<User | null>> {\n try {\n const {\n data: {user},\n error,\n } = await this.supabase.auth.getUser();\n\n if (error) {\n return createFailure(new Error(error.message));\n }\n\n if (!user) {\n return createSuccess(null);\n }\n\n const mappedUser = this.mapSupabaseUserToUser(user);\n return createSuccess(mappedUser);\n } catch (error) {\n return createFailure(error instanceof Error ? error : new Error(\"Failed to get current user\"));\n }\n }\n\n /**\n * Get the current authentication session\n * @returns Promise resolving to Result with current session or null\n */\n async getCurrentSession(): Promise<Result<AuthSession | null>> {\n try {\n const {\n data: {session},\n error,\n } = await this.supabase.auth.getSession();\n\n if (error) {\n return createFailure(new Error(error.message));\n }\n\n if (!session) {\n return createSuccess(null);\n }\n\n const user = this.mapSupabaseUserToUser(session.user);\n const authSession = this.mapSupabaseSessionToAuthSession(session, user);\n\n return createSuccess(authSession);\n } catch (error) {\n return createFailure(error instanceof Error ? error : new Error(\"Failed to get current session\"));\n }\n }\n\n /**\n * Resend email verification for the current user\n * @returns Promise resolving to Result indicating success or failure\n */\n async resendVerificationEmail(): Promise<Result<void>> {\n try {\n const {\n data: {user},\n } = await this.supabase.auth.getUser();\n\n if (!user) {\n return createFailure(new Error(\"No authenticated user found\"));\n }\n\n const {error} = await this.supabase.auth.resend({\n type: \"signup\",\n email: user.email!,\n });\n\n if (error) {\n return createFailure(new Error(error.message));\n }\n\n return createSuccess(undefined);\n } catch (error) {\n return createFailure(error instanceof Error ? error : new Error(\"Failed to resend verification email\"));\n }\n }\n\n // TODO: extract as utility function\n /**\n * Map Supabase user object to our User interface\n * @param supabaseUser - Supabase user object\n * @returns Mapped User object\n */\n private mapSupabaseUserToUser(supabaseUser: any): User {\n return {\n id: supabaseUser.id,\n email: supabaseUser.email,\n firstName: supabaseUser.user_metadata?.firstName || supabaseUser.user_metadata?.first_name,\n lastName: supabaseUser.user_metadata?.lastName || supabaseUser.user_metadata?.last_name,\n avatar: supabaseUser.user_metadata?.avatar || supabaseUser.user_metadata?.avatar_url,\n emailVerified: !!supabaseUser.email_confirmed_at,\n createdAt: supabaseUser.created_at,\n updatedAt: supabaseUser.updated_at,\n };\n }\n\n /**\n * Map Supabase session to our AuthSession interface\n * @param supabaseSession - Supabase session object\n * @param user - Mapped user object\n * @returns Mapped AuthSession object\n */\n private mapSupabaseSessionToAuthSession(supabaseSession: any, user: User): AuthSession {\n return {\n user,\n accessToken: supabaseSession.access_token,\n refreshToken: supabaseSession.refresh_token,\n expiresAt: supabaseSession.expires_at,\n };\n }\n}\n","/**\n * @fileoverview User profile management service\n * @category Profile Management\n */\n\nimport type {SupabaseClient} from \"@supabase/supabase-js\";\nimport type {User, UserProfileUpdate} from \"../types/user\";\nimport type {Result} from \"../types/result\";\nimport {createSuccess, createFailure} from \"../types/result\";\n\n/**\n * User service handling profile management operations\n */\nexport class UserService {\n private supabase: SupabaseClient;\n\n /**\n * Initialize the user service\n * @param supabaseClient - Configured Supabase client\n */\n constructor(supabaseClient: SupabaseClient) {\n this.supabase = supabaseClient;\n }\n\n /**\n * Update the current user's profile information\n * @param updates - Profile fields to update\n * @returns Promise resolving to Result with updated user\n */\n async updateProfile(updates: UserProfileUpdate): Promise<Result<User>> {\n try {\n // Get current user first\n const {\n data: {user},\n error: getUserError,\n } = await this.supabase.auth.getUser();\n\n if (getUserError) {\n return createFailure(new Error(getUserError.message));\n }\n\n if (!user) {\n return createFailure(new Error(\"No authenticated user found\"));\n }\n\n // Update user metadata\n const {data, error} = await this.supabase.auth.updateUser({\n data: {\n ...user.user_metadata,\n ...updates,\n },\n });\n\n if (error) {\n return createFailure(new Error(error.message));\n }\n\n if (!data.user) {\n return createFailure(new Error(\"Profile update failed\"));\n }\n\n const updatedUser = this.mapSupabaseUserToUser(data.user);\n return createSuccess(updatedUser);\n } catch (error) {\n return createFailure(error instanceof Error ? error : new Error(\"Profile update failed\"));\n }\n }\n\n /**\n * Get the current authenticated user with fresh data\n * @returns Promise resolving to Result with current user or null\n */\n async getCurrentUser(): Promise<Result<User | null>> {\n try {\n const {\n data: {user},\n error,\n } = await this.supabase.auth.getUser();\n\n if (error) {\n return createFailure(new Error(error.message));\n }\n\n if (!user) {\n return createSuccess(null);\n }\n\n const mappedUser = this.mapSupabaseUserToUser(user);\n return createSuccess(mappedUser);\n } catch (error) {\n return createFailure(error instanceof Error ? error : new Error(\"Failed to get current user\"));\n }\n }\n\n // TODO: extract as utility function\n /**\n * Map Supabase user object to our User interface\n * @param supabaseUser - Supabase user object\n * @returns Mapped User object\n */\n private mapSupabaseUserToUser(supabaseUser: any): User {\n return {\n id: supabaseUser.id,\n email: supabaseUser.email,\n firstName: supabaseUser.user_metadata?.firstName || supabaseUser.user_metadata?.first_name,\n lastName: supabaseUser.user_metadata?.lastName || supabaseUser.user_metadata?.last_name,\n avatar: supabaseUser.user_metadata?.avatar || supabaseUser.user_metadata?.avatar_url,\n emailVerified: !!supabaseUser.email_confirmed_at,\n createdAt: supabaseUser.created_at,\n updatedAt: supabaseUser.updated_at,\n };\n }\n}\n","/**\n * @fileoverview Basic CRUD operations service\n * @category CRUD Operations\n */\n\nimport {SupabaseClient} from \"@supabase/supabase-js\";\nimport type {Result} from \"../types/result\";\nimport {createSuccess, createFailure} from \"../types/result\";\n\n/**\n * CRUD service handling basic database operations\n */\nexport class CrudService {\n private supabase: SupabaseClient;\n\n /**\n * Initialize the CRUD service\n * @param supabaseClient - Configured Supabase client\n */\n constructor(supabaseClient: SupabaseClient) {\n this.supabase = supabaseClient;\n }\n\n /**\n * Create a new record in the specified table\n * @param table - Table name\n * @param data - Data to insert\n * @returns Promise resolving to Result with created record\n */\n async create(table: string, data: Record<string, any>): Promise<Result<any>> {\n try {\n const {data: result, error} = await this.supabase.from(table).insert(data).select().single();\n\n if (error) {\n return createFailure(new Error(error.message));\n }\n\n return createSuccess(result);\n } catch (error) {\n return createFailure(error instanceof Error ? error : new Error(\"Create operation failed\"));\n }\n }\n\n /**\n * Read a record by ID from the specified table\n * @param table - Table name\n * @param id - Record ID\n * @returns Promise resolving to Result with record or null\n */\n async read(table: string, id: string): Promise<Result<any | null>> {\n try {\n const {data, error} = await this.supabase.from(table).select(\"*\").eq(\"id\", id).single();\n\n if (error) {\n // Handle \"not found\" as success with null\n if (error.code === \"PGRST116\") {\n return createSuccess(null);\n }\n return createFailure(new Error(error.message));\n }\n\n return createSuccess(data);\n } catch (error) {\n return createFailure(error instanceof Error ? error : new Error(\"Read operation failed\"));\n }\n }\n\n /**\n * Update a record by ID in the specified table\n * @param table - Table name\n * @param id - Record ID\n * @param data - Data to update\n * @returns Promise resolving to Result with updated record\n */\n async update(table: string, id: string, data: Record<string, any>): Promise<Result<any>> {\n try {\n const {data: result, error} = await this.supabase.from(table).update(data).eq(\"id\", id).select().single();\n\n if (error) {\n return createFailure(new Error(error.message));\n }\n\n return createSuccess(result);\n } catch (error) {\n return createFailure(error instanceof Error ? error : new Error(\"Update operation failed\"));\n }\n }\n\n /**\n * Delete a record by ID from the specified table\n * @param table - Table name\n * @param id - Record ID\n * @returns Promise resolving to Result indicating success or failure\n */\n async delete(table: string, id: string): Promise<Result<void>> {\n try {\n const {error} = await this.supabase.from(table).delete().eq(\"id\", id);\n\n if (error) {\n return createFailure(new Error(error.message));\n }\n\n return createSuccess(undefined);\n } catch (error) {\n return createFailure(error instanceof Error ? error : new Error(\"Delete operation failed\"));\n }\n }\n\n /**\n * List records from the specified table with optional basic filtering\n * @param table - Table name\n * @param filters - Optional filters to apply\n * @returns Promise resolving to Result with array of records\n */\n async list(table: string, filters?: Record<string, any>): Promise<Result<any[]>> {\n try {\n let query = this.supabase.from(table).select(\"*\");\n\n // Apply basic filters if provided\n if (filters) {\n Object.entries(filters).forEach(([key, value]) => {\n query = query.eq(key, value);\n });\n }\n\n const {data, error} = await query;\n\n if (error) {\n return createFailure(new Error(error.message));\n }\n\n return createSuccess(data || []);\n } catch (error) {\n return createFailure(error instanceof Error ? error : new Error(\"List operation failed\"));\n }\n }\n}\n","/**\n * @fileoverview Main ServiceManager class integrating all services\n * @category Main\n */\n\nimport {createClient, type SupabaseClient} from \"@supabase/supabase-js\";\nimport {AuthService} from \"../services/auth.service\";\nimport {UserService} from \"../services/user.service\";\nimport {CrudService} from \"../services/crud.service\";\nimport type {ServiceManagerConfig, AuthSession, SignUpResult, SignInResult} from \"../types/auth\";\nimport type {User, UserProfileUpdate} from \"../types/user\";\nimport type {Result} from \"../types/result\";\n\n/**\n * Main ServiceManager class providing user authentication, profile management, and basic CRUD operations\n *\n * @example\n * ```typescript\n * const serviceManager = new ServiceManager({\n * supabase: {\n * url: \"your-supabase-url\",\n * anonKey: \"your-anon-key\",\n * },\n * });\n *\n * // Sign up a new user\n * const signUpResult = await serviceManager.signUp(\"user@example.com\", \"password123\");\n * if (signUpResult.success) {\n * console.log(\"User created:\", signUpResult.data.user);\n * }\n *\n * // Create a database record\n * const createResult = await serviceManager.create(\"social_links\", {\n * user_id: signUpResult.data.user.id,\n * platform: \"twitter\",\n * url: \"https://twitter.com/username\"\n * });\n * ```\n */\nexport class ServiceManager {\n private supabase: SupabaseClient;\n private authService: AuthService;\n private userService: UserService;\n private crudService: CrudService;\n\n /**\n * Initialize the ServiceManager with Supabase configuration\n * @param config - ServiceManager configuration containing Supabase settings\n */\n constructor(config: ServiceManagerConfig) {\n this.supabase = createClient(config.supabase.url, config.supabase.anonKey);\n this.authService = new AuthService(config.supabase);\n this.userService = new UserService(this.supabase);\n this.crudService = new CrudService(this.supabase);\n }\n\n // Authentication Methods\n\n /**\n * Sign up a new user with email and password\n * @param email - User's email address\n * @param password - User's password\n * @param profile - Optional profile data to set during signup\n * @returns Promise resolving to Result with user and verification status\n *\n * @example\n * ```typescript\n * const result = await serviceManager.signUp(\"user@example.com\", \"password123\", {\n * firstName: \"John\",\n * lastName: \"Doe\"\n * });\n *\n * if (result.success) {\n * if (result.data.needsVerification) {\n * console.log(\"Please check your email for verification\");\n * }\n * console.log(\"User created:\", result.data.user);\n * } else {\n * console.error(\"Sign up failed:\", result.error.message);\n * }\n * ```\n */\n async signUp(email: string, password: string, profile?: UserProfileUpdate): Promise<Result<SignUpResult>> {\n return this.authService.signUp(email, password, profile);\n }\n\n /**\n * Sign in an existing user with email and password\n * @param email - User's email address\n * @param password - User's password\n * @returns Promise resolving to Result with user and session\n *\n * @example\n * ```typescript\n * const result = await serviceManager.signIn(\"user@example.com\", \"password123\");\n *\n * if (result.success) {\n * console.log(\"Signed in:\", result.data.user);\n * console.log(\"Session expires at:\", new Date(result.data.session.expiresAt));\n * } else {\n * console.error(\"Sign in failed:\", result.error.message);\n * }\n * ```\n */\n async signIn(email: string, password: string): Promise<Result<SignInResult>> {\n return this.authService.signIn(email, password);\n }\n\n /**\n * Sign out the current user\n * @returns Promise resolving to Result indicating success or failure\n *\n * @example\n * ```typescript\n * const result = await serviceManager.signOut();\n *\n * if (result.success) {\n * console.log(\"Successfully signed out\");\n * } else {\n * console.error(\"Sign out failed:\", result.error.message);\n * }\n * ```\n */\n async signOut(): Promise<Result<void>> {\n return this.authService.signOut();\n }\n\n /**\n * Resend email verification for the current user\n * @returns Promise resolving to Result indicating success or failure\n *\n * @example\n * ```typescript\n * const result = await serviceManager.resendVerificationEmail();\n *\n * if (result.success) {\n * console.log(\"Verification email sent\");\n * } else {\n * console.error(\"Failed to send verification email:\", result.error.message);\n * }\n * ```\n */\n async resendVerificationEmail(): Promise<Result<void>> {\n return this.authService.resendVerificationEmail();\n }\n\n // Profile Management Methods\n\n /**\n * Update the current user's profile information\n * @param updates - Profile fields to update (firstName, lastName, avatar)\n * @returns Promise resolving to Result with updated user\n *\n * @example\n * ```typescript\n * const result = await serviceManager.updateProfile({\n * firstName: \"John\",\n * lastName: \"Doe\",\n * avatar: \"https://example.com/avatar.jpg\"\n * });\n *\n * if (result.success) {\n * console.log(\"Profile updated:\", result.data);\n * } else {\n * console.error(\"Profile update failed:\", result.error.message);\n * }\n * ```\n */\n async updateProfile(updates: UserProfileUpdate): Promise<Result<User>> {\n return this.userService.updateProfile(updates);\n }\n\n /**\n * Get the current authenticated user\n * @returns Promise resolving to Result with current user or null\n *\n * @example\n * ```typescript\n * const result = await serviceManager.getCurrentUser();\n *\n * if (result.success) {\n * if (result.data) {\n * console.log(\"Current user:\", result.data);\n * } else {\n * console.log(\"No user is currently signed in\");\n * }\n * } else {\n * console.error(\"Failed to get current user:\", result.error.message);\n * }\n * ```\n */\n async getCurrentUser(): Promise<Result<User | null>> {\n return this.userService.getCurrentUser();\n }\n\n /**\n * Get the current authentication session\n * @returns Promise resolving to Result with current session or null\n *\n * @example\n * ```typescript\n * const result = await serviceManager.getCurrentSession();\n *\n * if (result.success) {\n * if (result.data) {\n * console.log(\"Current session:\", result.data);\n * console.log(\"Expires at:\", new Date(result.data.expiresAt));\n * } else {\n * console.log(\"No active session\");\n * }\n * } else {\n * console.error(\"Failed to get current session:\", result.error.message);\n * }\n * ```\n */\n async getCurrentSession(): Promise<Result<AuthSession | null>> {\n return this.authService.getCurrentSession();\n }\n\n // Basic CRUD Operations\n\n /**\n * Create a new record in the specified table\n * @param table - Table name\n * @param data - Data to insert\n * @returns Promise resolving to Result with created record\n *\n * @example\n * ```typescript\n * const result = await serviceManager.create(\"social_links\", {\n * user_id: \"user-id\",\n * platform: \"twitter\",\n * url: \"https://twitter.com/username\"\n * });\n *\n * if (result.success) {\n * console.log(\"Record created:\", result.data);\n * } else {\n * console.error(\"Create failed:\", result.error.message);\n * }\n * ```\n */\n async create(table: string, data: Record<string, any>): Promise<Result<any>> {\n return this.crudService.create(table, data);\n }\n\n /**\n * Read a record by ID from the specified table\n * @param table - Table name\n * @param id - Record ID\n * @returns Promise resolving to Result with record or null\n *\n * @example\n * ```typescript\n * const result = await serviceManager.read(\"social_links\", \"link-id\");\n *\n * if (result.success) {\n * if (result.data) {\n * console.log(\"Record found:\", result.data);\n * } else {\n * console.log(\"Record not found\");\n * }\n * } else {\n * console.error(\"Read failed:\", result.error.message);\n * }\n * ```\n */\n async read(table: string, id: string): Promise<Result<any | null>> {\n return this.crudService.read(table, id);\n }\n\n /**\n * Update a record by ID in the specified table\n * @param table - Table name\n * @param id - Record ID\n * @param data - Data to update\n * @returns Promise resolving to Result with updated record\n *\n * @example\n * ```typescript\n * const result = await serviceManager.update(\"social_links\", \"link-id\", {\n * url: \"https://twitter.com/newusername\"\n * });\n *\n * if (result.success) {\n * console.log(\"Record updated:\", result.data);\n * } else {\n * console.error(\"Update failed:\", result.error.message);\n * }\n * ```\n */\n async update(table: string, id: string, data: Record<string, any>): Promise<Result<any>> {\n return this.crudService.update(table, id, data);\n }\n\n /**\n * Delete a record by ID from the specified table\n * @param table - Table name\n * @param id - Record ID\n * @returns Promise resolving to Result indicating success or failure\n *\n * @example\n * ```typescript\n * const result = await serviceManager.delete(\"social_links\", \"link-id\");\n *\n * if (result.success) {\n * console.log(\"Record deleted successfully\");\n * } else {\n * console.error(\"Delete failed:\", result.error.message);\n * }\n * ```\n */\n async delete(table: string, id: string): Promise<Result<void>> {\n return this.crudService.delete(table, id);\n }\n\n /**\n * List records from the specified table with optional basic filtering\n * @param table - Table name\n * @param filters - Optional filters to apply (key-value pairs for exact matches)\n * @returns Promise resolving to Result with array of records\n *\n * @example\n * ```typescript\n * // List all records\n * const allResult = await serviceManager.list(\"social_links\");\n *\n * // List with filters\n * const filteredResult = await serviceManager.list(\"social_links\", {\n * user_id: \"user-id\",\n * platform: \"twitter\"\n * });\n *\n * if (filteredResult.success) {\n * console.log(\"Records found:\", filteredResult.data);\n * } else {\n * console.error(\"List failed:\", filteredResult.error.message);\n * }\n * ```\n */\n async list(table: string, filters?: Record<string, any>): Promise<Result<any[]>> {\n return this.crudService.list(table, filters);\n }\n}\n","// Supabase Service Manager Library\n// Main entry point\n\n// Main class export\nexport {ServiceManager} from \"./core/service-manager\";\n\n// Type exports\nexport * from \"./types/result\";\nexport * from \"./types/user\";\nexport * from \"./types/auth\";\n\n// TODO: Uncomment these exports as modules are implemented\n// export * from './core/user-manager';\n\n// Service exports for advanced usage\nexport {AuthService} from \"./services/auth.service\";\nexport {UserService} from \"./services/user.service\";\nexport {CrudService} from \"./services/crud.service\";\n\n// Library metadata\nexport const version = \"1.0.0\";\n"],"names":["createSuccess","data","success","createFailure","error","AuthService","constructor","config","this","supabase","createClient","url","anonKey","signUp","email","password","profile","auth","options","Error","message","user","mapSupabaseUserToUser","needsVerification","email_confirmed_at","signIn","signInWithPassword","session","mapSupabaseSessionToAuthSession","signOut","getCurrentUser","getUser","getCurrentSession","getSession","resendVerificationEmail","resend","type","supabaseUser","id","firstName","_a","user_metadata","_b","first_name","lastName","_c","_d","last_name","avatar","_e","_f","avatar_url","emailVerified","createdAt","created_at","updatedAt","updated_at","supabaseSession","accessToken","access_token","refreshToken","refresh_token","expiresAt","expires_at","UserService","supabaseClient","updateProfile","updates","getUserError","updateUser","CrudService","create","table","result","from","insert","select","single","read","eq","code","update","delete","list","filters","query","Object","entries","forEach","key","value","authService","userService","crudService"],"mappings":"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"}