@fluxbase/sdk 0.0.1-rc.36 → 0.0.1-rc.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +126 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +64 -5
- package/dist/index.d.ts +64 -5
- package/dist/index.js +126 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/fetch.ts","../src/utils/error-handling.ts","../src/auth.ts","../src/realtime.ts","../src/storage.ts","../src/functions.ts","../src/settings.ts","../src/ddl.ts","../src/oauth.ts","../src/impersonation.ts","../src/management.ts","../src/admin.ts","../src/query-builder.ts","../src/client.ts"],"names":["fetch","queryString","path"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * HTTP client for making requests to the Fluxbase API\n */\n\nimport type { FluxbaseError, HttpMethod } from './types'\n\nexport interface FetchOptions {\n method: HttpMethod\n headers?: Record<string, string>\n body?: unknown\n timeout?: number\n}\n\nexport class FluxbaseFetch {\n private baseUrl: string\n private defaultHeaders: Record<string, string>\n private timeout: number\n private debug: boolean\n\n constructor(\n baseUrl: string,\n options: {\n headers?: Record<string, string>\n timeout?: number\n debug?: boolean\n } = {}\n ) {\n this.baseUrl = baseUrl.replace(/\\/$/, '') // Remove trailing slash\n this.defaultHeaders = {\n 'Content-Type': 'application/json',\n ...options.headers,\n }\n this.timeout = options.timeout ?? 30000\n this.debug = options.debug ?? false\n }\n\n /**\n * Update the authorization header\n */\n setAuthToken(token: string | null) {\n if (token) {\n this.defaultHeaders['Authorization'] = `Bearer ${token}`\n } else {\n delete this.defaultHeaders['Authorization']\n }\n }\n\n /**\n * Make an HTTP request\n */\n async request<T = unknown>(path: string, options: FetchOptions): Promise<T> {\n const url = `${this.baseUrl}${path}`\n const headers = { ...this.defaultHeaders, ...options.headers }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), options.timeout ?? this.timeout)\n\n if (this.debug) {\n console.log(`[Fluxbase SDK] ${options.method} ${url}`, options.body)\n }\n\n try {\n const response = await fetch(url, {\n method: options.method,\n headers,\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n // Parse response\n const contentType = response.headers.get('content-type')\n let data: unknown\n\n if (contentType?.includes('application/json')) {\n data = await response.json()\n } else {\n data = await response.text()\n }\n\n if (this.debug) {\n console.log(`[Fluxbase SDK] Response:`, response.status, data)\n }\n\n // Handle errors\n if (!response.ok) {\n const error = new Error(\n typeof data === 'object' && data && 'error' in data\n ? String(data.error)\n : response.statusText\n ) as FluxbaseError\n\n error.status = response.status\n error.details = data\n\n throw error\n }\n\n return data as T\n } catch (err) {\n clearTimeout(timeoutId)\n\n if (err instanceof Error) {\n if (err.name === 'AbortError') {\n const timeoutError = new Error('Request timeout') as FluxbaseError\n timeoutError.status = 408\n throw timeoutError\n }\n\n throw err\n }\n\n throw new Error('Unknown error occurred')\n }\n }\n\n /**\n * GET request\n */\n async get<T = unknown>(path: string, options: Omit<FetchOptions, 'method'> = {}): Promise<T> {\n return this.request<T>(path, { ...options, method: 'GET' })\n }\n\n /**\n * POST request\n */\n async post<T = unknown>(path: string, body?: unknown, options: Omit<FetchOptions, 'method' | 'body'> = {}): Promise<T> {\n return this.request<T>(path, { ...options, method: 'POST', body })\n }\n\n /**\n * PUT request\n */\n async put<T = unknown>(path: string, body?: unknown, options: Omit<FetchOptions, 'method' | 'body'> = {}): Promise<T> {\n return this.request<T>(path, { ...options, method: 'PUT', body })\n }\n\n /**\n * PATCH request\n */\n async patch<T = unknown>(path: string, body?: unknown, options: Omit<FetchOptions, 'method' | 'body'> = {}): Promise<T> {\n return this.request<T>(path, { ...options, method: 'PATCH', body })\n }\n\n /**\n * DELETE request\n */\n async delete<T = unknown>(path: string, options: Omit<FetchOptions, 'method'> = {}): Promise<T> {\n return this.request<T>(path, { ...options, method: 'DELETE' })\n }\n\n /**\n * HEAD request\n */\n async head(path: string, options: Omit<FetchOptions, 'method'> = {}): Promise<Headers> {\n const url = `${this.baseUrl}${path}`\n const headers = { ...this.defaultHeaders, ...options.headers }\n\n const response = await fetch(url, {\n method: 'HEAD',\n headers,\n })\n\n return response.headers\n }\n}\n","import type { FluxbaseResponse, VoidResponse } from '../types'\n\n/**\n * Wraps an async operation with try-catch, returning Fluxbase response format\n * @param operation The async operation to wrap\n * @returns Promise resolving to { data, error: null } on success or { data: null, error } on failure\n */\nexport async function wrapAsync<T>(\n operation: () => Promise<T>\n): Promise<FluxbaseResponse<T>> {\n try {\n const data = await operation()\n return { data, error: null }\n } catch (error) {\n return {\n data: null,\n error: error instanceof Error ? error : new Error(String(error))\n }\n }\n}\n\n/**\n * Wraps void async operations (operations that don't return data)\n * @param operation The async void operation to wrap\n * @returns Promise resolving to { error: null } on success or { error } on failure\n */\nexport async function wrapAsyncVoid(\n operation: () => Promise<void>\n): Promise<VoidResponse> {\n try {\n await operation()\n return { error: null }\n } catch (error) {\n return {\n error: error instanceof Error ? error : new Error(String(error))\n }\n }\n}\n\n/**\n * Wraps synchronous operations (for consistency)\n * @param operation The sync operation to wrap\n * @returns { data, error: null } on success or { data: null, error } on failure\n */\nexport function wrapSync<T>(\n operation: () => T\n): FluxbaseResponse<T> {\n try {\n const data = operation()\n return { data, error: null }\n } catch (error) {\n return {\n data: null,\n error: error instanceof Error ? error : new Error(String(error))\n }\n }\n}\n","/**\n * Authentication module for Fluxbase SDK\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n AuthResponse,\n AuthResponseData,\n AuthSession,\n SignInCredentials,\n SignUpCredentials,\n User,\n TwoFactorSetupResponse,\n TwoFactorEnableResponse,\n TwoFactorLoginResponse,\n TwoFactorStatusResponse,\n TwoFactorDisableResponse,\n TwoFactorVerifyRequest,\n SignInWith2FAResponse,\n PasswordResetResponse,\n VerifyResetTokenResponse,\n ResetPasswordResponse,\n MagicLinkOptions,\n MagicLinkResponse,\n AnonymousSignInResponse,\n OAuthProvidersResponse,\n OAuthOptions,\n OAuthUrlResponse,\n AuthChangeEvent,\n AuthStateChangeCallback,\n AuthSubscription,\n FluxbaseAuthResponse,\n FluxbaseResponse,\n UserResponse,\n DataResponse,\n VoidResponse,\n SignInWithOtpCredentials,\n VerifyOtpParams,\n ResendOtpParams,\n OTPResponse,\n UserIdentitiesResponse,\n LinkIdentityCredentials,\n UnlinkIdentityParams,\n ReauthenticateResponse,\n SignInWithIdTokenCredentials,\n} from \"./types\";\nimport { wrapAsync, wrapAsyncVoid } from \"./utils/error-handling\";\n\nconst AUTH_STORAGE_KEY = \"fluxbase.auth.session\";\n\nexport class FluxbaseAuth {\n private fetch: FluxbaseFetch;\n private session: AuthSession | null = null;\n private persist: boolean;\n private autoRefresh: boolean;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private stateChangeListeners: Set<AuthStateChangeCallback> = new Set();\n\n constructor(fetch: FluxbaseFetch, autoRefresh = true, persist = true) {\n this.fetch = fetch;\n this.persist = persist;\n this.autoRefresh = autoRefresh;\n\n // Load session from storage if persisted\n if (this.persist && typeof localStorage !== \"undefined\") {\n const stored = localStorage.getItem(AUTH_STORAGE_KEY);\n if (stored) {\n try {\n this.session = JSON.parse(stored);\n if (this.session) {\n this.fetch.setAuthToken(this.session.access_token);\n this.scheduleTokenRefresh();\n }\n } catch {\n // Invalid stored session, ignore\n localStorage.removeItem(AUTH_STORAGE_KEY);\n }\n }\n }\n }\n\n /**\n * Get the current session (Supabase-compatible)\n * Returns the session from the client-side cache without making a network request\n */\n async getSession(): Promise<\n FluxbaseResponse<{ session: AuthSession | null }>\n > {\n return { data: { session: this.session }, error: null };\n }\n\n /**\n * Get the current user (Supabase-compatible)\n * Returns the user from the client-side session without making a network request\n * For server-side validation, use getCurrentUser() instead\n */\n async getUser(): Promise<FluxbaseResponse<{ user: User | null }>> {\n return { data: { user: this.session?.user ?? null }, error: null };\n }\n\n /**\n * Get the current access token\n */\n getAccessToken(): string | null {\n return this.session?.access_token ?? null;\n }\n\n /**\n * Listen to auth state changes (Supabase-compatible)\n * @param callback - Function called when auth state changes\n * @returns Object containing subscription data\n *\n * @example\n * ```typescript\n * const { data: { subscription } } = client.auth.onAuthStateChange((event, session) => {\n * console.log('Auth event:', event, session)\n * })\n *\n * // Later, to unsubscribe:\n * subscription.unsubscribe()\n * ```\n */\n onAuthStateChange(callback: AuthStateChangeCallback): {\n data: { subscription: AuthSubscription };\n } {\n this.stateChangeListeners.add(callback);\n\n const subscription: AuthSubscription = {\n unsubscribe: () => {\n this.stateChangeListeners.delete(callback);\n },\n };\n\n return { data: { subscription } };\n }\n\n /**\n * Sign in with email and password (Supabase-compatible)\n * Returns { user, session } if successful, or SignInWith2FAResponse if 2FA is required\n */\n async signIn(\n credentials: SignInCredentials,\n ): Promise<FluxbaseResponse<AuthResponseData | SignInWith2FAResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<\n AuthResponse | SignInWith2FAResponse\n >(\"/api/v1/auth/signin\", credentials);\n\n // Check if 2FA is required\n if (\"requires_2fa\" in response && response.requires_2fa) {\n return response as SignInWith2FAResponse;\n }\n\n // Normal sign in without 2FA\n const authResponse = response as AuthResponse;\n const session: AuthSession = {\n ...authResponse,\n expires_at: Date.now() + authResponse.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: session.user, session };\n });\n }\n\n /**\n * Sign in with email and password (Supabase-compatible)\n * Alias for signIn() to maintain compatibility with common authentication patterns\n * Returns { user, session } if successful, or SignInWith2FAResponse if 2FA is required\n */\n async signInWithPassword(\n credentials: SignInCredentials,\n ): Promise<FluxbaseResponse<AuthResponseData | SignInWith2FAResponse>> {\n return this.signIn(credentials);\n }\n\n /**\n * Sign up with email and password (Supabase-compatible)\n * Returns session when email confirmation is disabled\n * Returns null session when email confirmation is required\n */\n async signUp(credentials: SignUpCredentials): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/signup\",\n credentials,\n );\n\n // Check if session tokens are provided (no email confirmation required)\n if (response.access_token && response.refresh_token) {\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: response.user, session };\n }\n\n // Email confirmation required - return user without session\n return { user: response.user, session: null };\n });\n }\n\n /**\n * Sign out the current user\n */\n async signOut(): Promise<VoidResponse> {\n return wrapAsyncVoid(async () => {\n try {\n await this.fetch.post(\"/api/v1/auth/signout\");\n } finally {\n this.clearSession();\n }\n });\n }\n\n /**\n * Refresh the session (Supabase-compatible)\n * Returns a new session with refreshed tokens\n */\n async refreshSession(): Promise<\n FluxbaseResponse<{ user: User; session: AuthSession }>\n > {\n return wrapAsync(async () => {\n if (!this.session?.refresh_token) {\n throw new Error(\"No refresh token available\");\n }\n\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/refresh\",\n {\n refresh_token: this.session.refresh_token,\n },\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session, \"TOKEN_REFRESHED\");\n return { user: session.user, session };\n });\n }\n\n /**\n * Refresh the session (Supabase-compatible alias)\n * Alias for refreshSession() to maintain compatibility with Supabase naming\n * Returns a new session with refreshed tokens\n */\n async refreshToken(): Promise<\n FluxbaseResponse<{ user: User; session: AuthSession }>\n > {\n return this.refreshSession();\n }\n\n /**\n * Get the current user from the server\n */\n async getCurrentUser(): Promise<UserResponse> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n const user = await this.fetch.get<User>(\"/api/v1/auth/user\");\n return { user };\n });\n }\n\n /**\n * Update the current user\n */\n async updateUser(\n data: Partial<Pick<User, \"email\" | \"metadata\">>,\n ): Promise<UserResponse> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n const user = await this.fetch.patch<User>(\"/api/v1/auth/user\", data);\n\n // Update session with new user data\n if (this.session) {\n this.session.user = user;\n this.saveSession();\n this.emitAuthChange(\"USER_UPDATED\", this.session);\n }\n\n return { user };\n });\n }\n\n /**\n * Set the session manually (Supabase-compatible)\n * Useful for restoring a session from storage or SSR scenarios\n * @param session - Object containing access_token and refresh_token\n * @returns Promise with session data\n */\n async setSession(session: {\n access_token: string;\n refresh_token: string;\n }): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n // Create a full auth session from the tokens\n const authSession: AuthSession = {\n access_token: session.access_token,\n refresh_token: session.refresh_token,\n user: null as any, // Will be populated by getCurrentUser\n expires_in: 3600, // Default, will be updated on refresh\n expires_at: Date.now() + 3600 * 1000,\n };\n\n // Set the token so we can make authenticated requests\n this.fetch.setAuthToken(session.access_token);\n\n // Fetch the current user to populate the session\n const user = await this.fetch.get<User>(\"/api/v1/auth/user\");\n authSession.user = user;\n\n // Store the session\n this.setSessionInternal(authSession, \"SIGNED_IN\");\n\n return { user, session: authSession };\n });\n }\n\n /**\n * Setup 2FA for the current user (Supabase-compatible)\n * Enrolls a new MFA factor and returns TOTP details\n * @param issuer - Optional custom issuer name for the QR code (e.g., \"MyApp\"). If not provided, uses server default.\n * @returns Promise with factor id, type, and TOTP setup details\n */\n async setup2FA(\n issuer?: string,\n ): Promise<DataResponse<TwoFactorSetupResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<TwoFactorSetupResponse>(\n \"/api/v1/auth/2fa/setup\",\n issuer ? { issuer } : undefined,\n );\n });\n }\n\n /**\n * Enable 2FA after verifying the TOTP code (Supabase-compatible)\n * Verifies the TOTP code and returns new tokens with MFA session\n * @param code - TOTP code from authenticator app\n * @returns Promise with access_token, refresh_token, and user\n */\n async enable2FA(\n code: string,\n ): Promise<DataResponse<TwoFactorEnableResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<TwoFactorEnableResponse>(\n \"/api/v1/auth/2fa/enable\",\n { code },\n );\n });\n }\n\n /**\n * Disable 2FA for the current user (Supabase-compatible)\n * Unenrolls the MFA factor\n * @param password - User password for confirmation\n * @returns Promise with unenrolled factor id\n */\n async disable2FA(\n password: string,\n ): Promise<DataResponse<TwoFactorDisableResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<TwoFactorDisableResponse>(\n \"/api/v1/auth/2fa/disable\",\n { password },\n );\n });\n }\n\n /**\n * Check 2FA status for the current user (Supabase-compatible)\n * Lists all enrolled MFA factors\n * @returns Promise with all factors and TOTP factors\n */\n async get2FAStatus(): Promise<DataResponse<TwoFactorStatusResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.get<TwoFactorStatusResponse>(\n \"/api/v1/auth/2fa/status\",\n );\n });\n }\n\n /**\n * Verify 2FA code during login (Supabase-compatible)\n * Call this after signIn returns requires_2fa: true\n * @param request - User ID and TOTP code\n * @returns Promise with access_token, refresh_token, and user\n */\n async verify2FA(\n request: TwoFactorVerifyRequest,\n ): Promise<DataResponse<TwoFactorLoginResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<TwoFactorLoginResponse>(\n \"/api/v1/auth/2fa/verify\",\n request,\n );\n\n // Create session from the response tokens\n if (response.access_token && response.refresh_token) {\n const session: AuthSession = {\n user: response.user,\n access_token: response.access_token,\n refresh_token: response.refresh_token,\n expires_in: response.expires_in || 3600,\n expires_at: Date.now() + (response.expires_in || 3600) * 1000,\n };\n\n this.setSessionInternal(session, \"MFA_CHALLENGE_VERIFIED\");\n }\n\n return response;\n });\n }\n\n /**\n * Send password reset email (Supabase-compatible)\n * Sends a password reset link to the provided email address\n * @param email - Email address to send reset link to\n * @returns Promise with OTP-style response\n */\n async sendPasswordReset(\n email: string,\n ): Promise<DataResponse<PasswordResetResponse>> {\n return wrapAsync(async () => {\n await this.fetch.post(\"/api/v1/auth/password/reset\", { email });\n // Return Supabase-compatible OTP response\n return { user: null, session: null };\n });\n }\n\n /**\n * Supabase-compatible alias for sendPasswordReset()\n * @param email - Email address to send reset link to\n * @param _options - Optional redirect configuration (currently not used)\n * @returns Promise with OTP-style response\n */\n async resetPasswordForEmail(\n email: string,\n _options?: { redirectTo?: string },\n ): Promise<DataResponse<PasswordResetResponse>> {\n return this.sendPasswordReset(email);\n }\n\n /**\n * Verify password reset token\n * Check if a password reset token is valid before allowing password reset\n * @param token - Password reset token to verify\n */\n async verifyResetToken(\n token: string,\n ): Promise<DataResponse<VerifyResetTokenResponse>> {\n return wrapAsync(async () => {\n return await this.fetch.post<VerifyResetTokenResponse>(\n \"/api/v1/auth/password/reset/verify\",\n {\n token,\n },\n );\n });\n }\n\n /**\n * Reset password with token (Supabase-compatible)\n * Complete the password reset process with a valid token\n * @param token - Password reset token\n * @param newPassword - New password to set\n * @returns Promise with user and new session\n */\n async resetPassword(\n token: string,\n newPassword: string,\n ): Promise<DataResponse<ResetPasswordResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/password/reset/confirm\",\n {\n token,\n new_password: newPassword,\n },\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session, \"PASSWORD_RECOVERY\");\n return { user: session.user, session };\n });\n }\n\n /**\n * Send magic link for passwordless authentication (Supabase-compatible)\n * @param email - Email address to send magic link to\n * @param options - Optional configuration for magic link\n * @returns Promise with OTP-style response\n */\n async sendMagicLink(\n email: string,\n options?: MagicLinkOptions,\n ): Promise<DataResponse<MagicLinkResponse>> {\n return wrapAsync(async () => {\n await this.fetch.post(\"/api/v1/auth/magiclink\", {\n email,\n redirect_to: options?.redirect_to,\n });\n // Return Supabase-compatible OTP response\n return { user: null, session: null };\n });\n }\n\n /**\n * Verify magic link token and sign in\n * @param token - Magic link token from email\n */\n async verifyMagicLink(token: string): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/magiclink/verify\",\n {\n token,\n },\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: session.user, session };\n });\n }\n\n /**\n * Sign in anonymously\n * Creates a temporary anonymous user session\n */\n async signInAnonymously(): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AnonymousSignInResponse>(\n \"/api/v1/auth/signin/anonymous\",\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: session.user, session };\n });\n }\n\n /**\n * Get list of enabled OAuth providers\n */\n async getOAuthProviders(): Promise<DataResponse<OAuthProvidersResponse>> {\n return wrapAsync(async () => {\n return await this.fetch.get<OAuthProvidersResponse>(\n \"/api/v1/auth/oauth/providers\",\n );\n });\n }\n\n /**\n * Get OAuth authorization URL for a provider\n * @param provider - OAuth provider name (e.g., 'google', 'github')\n * @param options - Optional OAuth configuration\n */\n async getOAuthUrl(\n provider: string,\n options?: OAuthOptions,\n ): Promise<DataResponse<OAuthUrlResponse>> {\n return wrapAsync(async () => {\n const params = new URLSearchParams();\n if (options?.redirect_to) {\n params.append(\"redirect_to\", options.redirect_to);\n }\n if (options?.scopes && options.scopes.length > 0) {\n params.append(\"scopes\", options.scopes.join(\",\"));\n }\n\n const queryString = params.toString();\n const url = queryString\n ? `/api/v1/auth/oauth/${provider}/authorize?${queryString}`\n : `/api/v1/auth/oauth/${provider}/authorize`;\n\n const response = await this.fetch.get<OAuthUrlResponse>(url);\n return response;\n });\n }\n\n /**\n * Exchange OAuth authorization code for session\n * This is typically called in your OAuth callback handler\n * @param code - Authorization code from OAuth callback\n */\n async exchangeCodeForSession(code: string): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/oauth/callback\",\n { code },\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: session.user, session };\n });\n }\n\n /**\n * Convenience method to initiate OAuth sign-in\n * Redirects the user to the OAuth provider's authorization page\n * @param provider - OAuth provider name (e.g., 'google', 'github')\n * @param options - Optional OAuth configuration\n */\n async signInWithOAuth(\n provider: string,\n options?: OAuthOptions,\n ): Promise<DataResponse<{ provider: string; url: string }>> {\n return wrapAsync(async () => {\n const result = await this.getOAuthUrl(provider, options);\n\n if (result.error) {\n throw result.error;\n }\n\n const url = result.data.url;\n\n if (typeof window !== \"undefined\") {\n window.location.href = url;\n } else {\n throw new Error(\n \"signInWithOAuth can only be called in a browser environment\",\n );\n }\n\n return { provider, url };\n });\n }\n\n /**\n * Sign in with OTP (One-Time Password) - Supabase-compatible\n * Sends a one-time password via email or SMS for passwordless authentication\n * @param credentials - Email or phone number and optional configuration\n * @returns Promise with OTP-style response\n */\n async signInWithOtp(\n credentials: SignInWithOtpCredentials,\n ): Promise<DataResponse<OTPResponse>> {\n return wrapAsync(async () => {\n await this.fetch.post(\"/api/v1/auth/otp/signin\", credentials);\n // Return Supabase-compatible OTP response\n return { user: null, session: null };\n });\n }\n\n /**\n * Verify OTP (One-Time Password) - Supabase-compatible\n * Verify OTP tokens for various authentication flows\n * @param params - OTP verification parameters including token and type\n * @returns Promise with user and session if successful\n */\n async verifyOtp(params: VerifyOtpParams): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/otp/verify\",\n params,\n );\n\n // Check if session tokens are provided\n if (response.access_token && response.refresh_token) {\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: response.user, session };\n }\n\n // Email confirmation required - return user without session\n return { user: response.user, session: null };\n });\n }\n\n /**\n * Resend OTP (One-Time Password) - Supabase-compatible\n * Resend OTP code when user doesn't receive it\n * @param params - Resend parameters including type and email/phone\n * @returns Promise with OTP-style response\n */\n async resendOtp(params: ResendOtpParams): Promise<DataResponse<OTPResponse>> {\n return wrapAsync(async () => {\n await this.fetch.post(\"/api/v1/auth/otp/resend\", params);\n // Return Supabase-compatible OTP response\n return { user: null, session: null };\n });\n }\n\n /**\n * Get user identities (linked OAuth providers) - Supabase-compatible\n * Lists all OAuth identities linked to the current user\n * @returns Promise with list of user identities\n */\n async getUserIdentities(): Promise<DataResponse<UserIdentitiesResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.get<UserIdentitiesResponse>(\n \"/api/v1/auth/user/identities\",\n );\n });\n }\n\n /**\n * Link an OAuth identity to current user - Supabase-compatible\n * Links an additional OAuth provider to the existing account\n * @param credentials - Provider to link\n * @returns Promise with OAuth URL to complete linking\n */\n async linkIdentity(\n credentials: LinkIdentityCredentials,\n ): Promise<DataResponse<OAuthUrlResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<OAuthUrlResponse>(\n \"/api/v1/auth/user/identities\",\n credentials,\n );\n });\n }\n\n /**\n * Unlink an OAuth identity from current user - Supabase-compatible\n * Removes a linked OAuth provider from the account\n * @param params - Identity to unlink\n * @returns Promise with void response\n */\n async unlinkIdentity(params: UnlinkIdentityParams): Promise<VoidResponse> {\n return wrapAsyncVoid(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n await this.fetch.delete(\n `/api/v1/auth/user/identities/${params.identity.id}`,\n );\n });\n }\n\n /**\n * Reauthenticate to get security nonce - Supabase-compatible\n * Get a security nonce for sensitive operations (password change, etc.)\n * @returns Promise with nonce for reauthentication\n */\n async reauthenticate(): Promise<DataResponse<ReauthenticateResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<ReauthenticateResponse>(\n \"/api/v1/auth/reauthenticate\",\n );\n });\n }\n\n /**\n * Sign in with ID token (for native mobile apps) - Supabase-compatible\n * Authenticate using native mobile app ID tokens (Google, Apple)\n * @param credentials - Provider, ID token, and optional nonce\n * @returns Promise with user and session\n */\n async signInWithIdToken(\n credentials: SignInWithIdTokenCredentials,\n ): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/signin/idtoken\",\n credentials,\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: session.user, session };\n });\n }\n\n /**\n * Internal: Set the session and persist it\n */\n private setSessionInternal(\n session: AuthSession,\n event: AuthChangeEvent = \"SIGNED_IN\",\n ) {\n this.session = session;\n this.fetch.setAuthToken(session.access_token);\n this.saveSession();\n this.scheduleTokenRefresh();\n this.emitAuthChange(event, session);\n }\n\n /**\n * Internal: Clear the session\n */\n private clearSession() {\n this.session = null;\n this.fetch.setAuthToken(null);\n\n if (this.persist && typeof localStorage !== \"undefined\") {\n localStorage.removeItem(AUTH_STORAGE_KEY);\n }\n\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n\n this.emitAuthChange(\"SIGNED_OUT\", null);\n }\n\n /**\n * Internal: Save session to storage\n */\n private saveSession() {\n if (this.persist && typeof localStorage !== \"undefined\" && this.session) {\n localStorage.setItem(AUTH_STORAGE_KEY, JSON.stringify(this.session));\n }\n }\n\n /**\n * Internal: Schedule automatic token refresh\n */\n private scheduleTokenRefresh() {\n if (!this.autoRefresh || !this.session?.expires_at) {\n return;\n }\n\n // Clear existing timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n }\n\n // Refresh 1 minute before expiry\n const refreshAt = this.session.expires_at - 60 * 1000;\n const delay = refreshAt - Date.now();\n\n if (delay > 0) {\n this.refreshTimer = setTimeout(async () => {\n const result = await this.refreshSession();\n if (result.error) {\n console.error(\"Failed to refresh token:\", result.error);\n this.clearSession();\n }\n }, delay);\n }\n }\n\n /**\n * Internal: Emit auth state change event to all listeners\n */\n private emitAuthChange(event: AuthChangeEvent, session: AuthSession | null) {\n this.stateChangeListeners.forEach((callback) => {\n try {\n callback(event, session);\n } catch (error) {\n console.error(\"Error in auth state change listener:\", error);\n }\n });\n }\n}\n","/**\n * Realtime subscriptions using WebSockets\n */\n\nimport type {\n RealtimeCallback,\n RealtimePostgresChangesPayload,\n RealtimeMessage,\n PostgresChangesConfig,\n RealtimeChannelConfig,\n PresenceState,\n RealtimePresencePayload,\n PresenceCallback,\n BroadcastMessage,\n RealtimeBroadcastPayload,\n BroadcastCallback,\n} from \"./types\";\n\nexport class RealtimeChannel {\n private ws: WebSocket | null = null;\n private url: string;\n private token: string | null;\n private channelName: string;\n private callbacks: Map<string, Set<RealtimeCallback>> = new Map();\n private presenceCallbacks: Map<string, Set<PresenceCallback>> = new Map();\n private broadcastCallbacks: Map<string, Set<BroadcastCallback>> = new Map();\n private subscriptionConfig: PostgresChangesConfig | null = null;\n private _presenceState: Record<string, PresenceState[]> = {};\n private myPresenceKey: string | null = null;\n private config: RealtimeChannelConfig;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 10;\n private reconnectDelay = 1000;\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n private pendingAcks: Map<\n string,\n { resolve: (value: string) => void; reject: (reason: any) => void; timeout: ReturnType<typeof setTimeout> }\n > = new Map();\n private messageIdCounter = 0;\n\n constructor(\n url: string,\n channelName: string,\n token: string | null = null,\n config: RealtimeChannelConfig = {}\n ) {\n this.url = url;\n this.channelName = channelName;\n this.token = token;\n this.config = config;\n }\n\n /**\n * Listen to postgres_changes with optional row-level filtering\n *\n * @param event - 'postgres_changes'\n * @param config - Configuration including optional filter\n * @param callback - Function to call when changes occur\n * @returns This channel for chaining\n *\n * @example\n * ```typescript\n * channel.on('postgres_changes', {\n * event: '*',\n * schema: 'public',\n * table: 'jobs',\n * filter: 'created_by=eq.user123'\n * }, (payload) => {\n * console.log('Job updated:', payload)\n * })\n * ```\n */\n on(\n event: \"postgres_changes\",\n config: PostgresChangesConfig,\n callback: RealtimeCallback,\n ): this;\n\n /**\n * Listen to a specific event type (backwards compatibility)\n *\n * @param event - The event type (INSERT, UPDATE, DELETE, or '*' for all)\n * @param callback - The callback function\n * @returns This channel for chaining\n *\n * @example\n * ```typescript\n * channel.on('INSERT', (payload) => {\n * console.log('New record inserted:', payload.new_record)\n * })\n * ```\n */\n on(\n event: \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\",\n callback: RealtimeCallback,\n ): this;\n\n /**\n * Listen to broadcast messages\n *\n * @param event - 'broadcast'\n * @param config - Configuration with event name\n * @param callback - Function to call when broadcast received\n * @returns This channel for chaining\n *\n * @example\n * ```typescript\n * channel.on('broadcast', { event: 'cursor-pos' }, (payload) => {\n * console.log('Cursor moved:', payload)\n * })\n * ```\n */\n on(\n event: \"broadcast\",\n config: { event: string },\n callback: BroadcastCallback,\n ): this;\n\n /**\n * Listen to presence events\n *\n * @param event - 'presence'\n * @param config - Configuration with event type (sync, join, leave)\n * @param callback - Function to call when presence changes\n * @returns This channel for chaining\n *\n * @example\n * ```typescript\n * channel.on('presence', { event: 'sync' }, (payload) => {\n * console.log('Presence synced:', payload)\n * })\n * ```\n */\n on(\n event: \"presence\",\n config: { event: \"sync\" | \"join\" | \"leave\" },\n callback: PresenceCallback,\n ): this;\n\n // Implementation\n on(\n event:\n | \"postgres_changes\"\n | \"INSERT\"\n | \"UPDATE\"\n | \"DELETE\"\n | \"*\"\n | \"broadcast\"\n | \"presence\",\n configOrCallback:\n | PostgresChangesConfig\n | RealtimeCallback\n | { event: string }\n | { event: \"sync\" | \"join\" | \"leave\" },\n callback?: RealtimeCallback | BroadcastCallback | PresenceCallback,\n ): this {\n if (\n event === \"postgres_changes\" &&\n typeof configOrCallback !== \"function\"\n ) {\n // on('postgres_changes', config, callback)\n const config = configOrCallback as PostgresChangesConfig;\n this.subscriptionConfig = config;\n const actualCallback = callback!;\n\n const eventType = config.event;\n if (!this.callbacks.has(eventType)) {\n this.callbacks.set(eventType, new Set());\n }\n this.callbacks.get(eventType)!.add(actualCallback as RealtimeCallback);\n } else if (event === \"broadcast\" && typeof configOrCallback !== \"function\") {\n // on('broadcast', { event }, callback)\n const config = configOrCallback as { event: string };\n const actualCallback = callback as BroadcastCallback;\n\n if (!this.broadcastCallbacks.has(config.event)) {\n this.broadcastCallbacks.set(config.event, new Set());\n }\n this.broadcastCallbacks.get(config.event)!.add(actualCallback);\n } else if (event === \"presence\" && typeof configOrCallback !== \"function\") {\n // on('presence', { event }, callback)\n const config = configOrCallback as { event: \"sync\" | \"join\" | \"leave\" };\n const actualCallback = callback as PresenceCallback;\n\n if (!this.presenceCallbacks.has(config.event)) {\n this.presenceCallbacks.set(config.event, new Set());\n }\n this.presenceCallbacks.get(config.event)!.add(actualCallback);\n } else {\n // on('INSERT'|'UPDATE'|'DELETE'|'*', callback)\n const actualEvent = event as \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\";\n const actualCallback = configOrCallback as RealtimeCallback;\n\n if (!this.callbacks.has(actualEvent)) {\n this.callbacks.set(actualEvent, new Set());\n }\n this.callbacks.get(actualEvent)!.add(actualCallback);\n }\n\n return this;\n }\n\n /**\n * Remove a callback\n */\n off(\n event: \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\",\n callback: RealtimeCallback,\n ): this {\n const callbacks = this.callbacks.get(event);\n if (callbacks) {\n callbacks.delete(callback);\n }\n return this;\n }\n\n /**\n * Subscribe to the channel\n * @param callback - Optional status callback (Supabase-compatible)\n * @param _timeout - Optional timeout in milliseconds (currently unused)\n */\n subscribe(\n callback?: (\n status: \"SUBSCRIBED\" | \"CHANNEL_ERROR\" | \"TIMED_OUT\" | \"CLOSED\",\n err?: Error,\n ) => void,\n _timeout?: number,\n ): this {\n this.connect();\n\n // Call callback with SUBSCRIBED status after connection\n if (callback) {\n // Wait for connection to open\n const checkConnection = () => {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n callback(\"SUBSCRIBED\");\n } else if (this.ws && this.ws.readyState === WebSocket.CLOSED) {\n callback(\"CHANNEL_ERROR\", new Error(\"Failed to connect\"));\n } else {\n setTimeout(checkConnection, 100);\n }\n };\n setTimeout(checkConnection, 100);\n }\n\n return this;\n }\n\n /**\n * Unsubscribe from the channel\n * @param timeout - Optional timeout in milliseconds\n * @returns Promise resolving to status string (Supabase-compatible)\n */\n async unsubscribe(timeout?: number): Promise<\"ok\" | \"timed out\" | \"error\"> {\n return new Promise((resolve) => {\n if (this.ws) {\n this.sendMessage({\n type: \"unsubscribe\",\n channel: this.channelName,\n });\n\n // Wait for disconnect\n const startTime = Date.now();\n const maxWait = timeout || 5000;\n\n const checkDisconnect = () => {\n if (!this.ws || this.ws.readyState === WebSocket.CLOSED) {\n this.disconnect();\n resolve(\"ok\");\n } else if (Date.now() - startTime > maxWait) {\n this.disconnect();\n resolve(\"timed out\");\n } else {\n setTimeout(checkDisconnect, 100);\n }\n };\n\n setTimeout(checkDisconnect, 100);\n } else {\n resolve(\"ok\");\n }\n });\n }\n\n /**\n * Send a broadcast message to all subscribers on this channel\n *\n * @param message - Broadcast message with type, event, and payload\n * @returns Promise resolving to status\n *\n * @example\n * ```typescript\n * await channel.send({\n * type: 'broadcast',\n * event: 'cursor-pos',\n * payload: { x: 100, y: 200 }\n * })\n * ```\n */\n async send(message: BroadcastMessage): Promise<\"ok\" | \"error\"> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return \"error\";\n }\n\n try {\n // Generate message ID if acknowledgment is requested\n const messageId = this.config.broadcast?.ack\n ? `msg_${Date.now()}_${++this.messageIdCounter}`\n : undefined;\n\n this.ws.send(\n JSON.stringify({\n type: \"broadcast\",\n channel: this.channelName,\n event: message.event,\n payload: message.payload,\n ...(messageId && { messageId }),\n })\n );\n\n // Handle acknowledgment if configured\n if (this.config.broadcast?.ack && messageId) {\n // Wait for ack response with timeout (default 5 seconds)\n const ackTimeout = this.config.broadcast.ackTimeout || 5000;\n return await new Promise<\"ok\" | \"error\">((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingAcks.delete(messageId);\n reject(new Error(\"Acknowledgment timeout\"));\n }, ackTimeout);\n\n this.pendingAcks.set(messageId, {\n resolve: (value) => {\n clearTimeout(timeout);\n this.pendingAcks.delete(messageId);\n resolve(value as \"ok\" | \"error\");\n },\n reject: (reason) => {\n clearTimeout(timeout);\n this.pendingAcks.delete(messageId);\n reject(reason);\n },\n timeout,\n });\n }).catch((error) => {\n console.error(\"[Fluxbase Realtime] Acknowledgment error:\", error);\n return \"error\" as const;\n });\n }\n\n return \"ok\";\n } catch (error) {\n console.error(\"[Fluxbase Realtime] Failed to send broadcast:\", error);\n return \"error\";\n }\n }\n\n /**\n * Track user presence on this channel\n *\n * @param state - Presence state to track\n * @returns Promise resolving to status\n *\n * @example\n * ```typescript\n * await channel.track({\n * user_id: 123,\n * status: 'online'\n * })\n * ```\n */\n async track(state: PresenceState): Promise<\"ok\" | \"error\"> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return \"error\";\n }\n\n try {\n // Generate presence key if not set\n if (!this.myPresenceKey) {\n this.myPresenceKey =\n this.config.presence?.key || `presence-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n this.ws.send(\n JSON.stringify({\n type: \"presence\",\n channel: this.channelName,\n event: \"track\",\n payload: {\n key: this.myPresenceKey,\n state,\n },\n })\n );\n\n return \"ok\";\n } catch (error) {\n console.error(\"[Fluxbase Realtime] Failed to track presence:\", error);\n return \"error\";\n }\n }\n\n /**\n * Stop tracking presence on this channel\n *\n * @returns Promise resolving to status\n *\n * @example\n * ```typescript\n * await channel.untrack()\n * ```\n */\n async untrack(): Promise<\"ok\" | \"error\"> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return \"error\";\n }\n\n if (!this.myPresenceKey) {\n return \"ok\"; // Already not tracking\n }\n\n try {\n this.ws.send(\n JSON.stringify({\n type: \"presence\",\n channel: this.channelName,\n event: \"untrack\",\n payload: {\n key: this.myPresenceKey,\n },\n })\n );\n\n this.myPresenceKey = null;\n return \"ok\";\n } catch (error) {\n console.error(\"[Fluxbase Realtime] Failed to untrack presence:\", error);\n return \"error\";\n }\n }\n\n /**\n * Get current presence state for all users on this channel\n *\n * @returns Current presence state\n *\n * @example\n * ```typescript\n * const state = channel.presenceState()\n * console.log('Online users:', Object.keys(state).length)\n * ```\n */\n presenceState(): Record<string, PresenceState[]> {\n return { ...this._presenceState };\n }\n\n /**\n * Internal: Connect to WebSocket\n */\n private connect() {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n return;\n }\n\n // Build WebSocket URL\n const wsUrl = new URL(this.url);\n wsUrl.protocol = wsUrl.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n wsUrl.pathname = \"/realtime\";\n\n if (this.token) {\n wsUrl.searchParams.set(\"token\", this.token);\n }\n\n this.ws = new WebSocket(wsUrl.toString());\n\n this.ws.onopen = () => {\n console.log(\"[Fluxbase Realtime] Connected\");\n this.reconnectAttempts = 0;\n\n // Subscribe to channel with optional config\n const subscribeMessage: RealtimeMessage = {\n type: \"subscribe\",\n channel: this.channelName,\n };\n\n // Add subscription config if using new postgres_changes API\n if (this.subscriptionConfig) {\n subscribeMessage.config = this.subscriptionConfig;\n }\n\n this.sendMessage(subscribeMessage);\n\n // Start heartbeat\n this.startHeartbeat();\n };\n\n this.ws.onmessage = (event) => {\n try {\n const message: RealtimeMessage = JSON.parse(event.data);\n this.handleMessage(message);\n } catch (err) {\n console.error(\"[Fluxbase Realtime] Failed to parse message:\", err);\n }\n };\n\n this.ws.onerror = (error) => {\n console.error(\"[Fluxbase Realtime] WebSocket error:\", error);\n };\n\n this.ws.onclose = () => {\n console.log(\"[Fluxbase Realtime] Disconnected\");\n this.stopHeartbeat();\n this.attemptReconnect();\n };\n }\n\n /**\n * Internal: Disconnect WebSocket\n */\n private disconnect() {\n this.stopHeartbeat();\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n\n /**\n * Internal: Send a message\n */\n private sendMessage(message: RealtimeMessage) {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(message));\n }\n }\n\n /**\n * Internal: Handle incoming message\n */\n private handleMessage(message: RealtimeMessage) {\n switch (message.type) {\n case \"heartbeat\":\n // Echo heartbeat back\n this.ws?.send(JSON.stringify({ type: \"heartbeat\" }));\n break;\n\n case \"broadcast\":\n if (message.broadcast) {\n this.handleBroadcastMessage(message.broadcast);\n } else if (message.payload) {\n // Legacy postgres_changes format\n this.handlePostgresChanges(message.payload);\n }\n break;\n\n case \"presence\":\n if (message.presence) {\n this.handlePresenceMessage(message.presence);\n }\n break;\n\n case \"ack\":\n // Handle broadcast acknowledgment\n if (message.messageId && this.pendingAcks.has(message.messageId)) {\n const ackHandler = this.pendingAcks.get(message.messageId);\n if (ackHandler) {\n ackHandler.resolve(message.status || \"ok\");\n }\n } else {\n // Log subscription acknowledgments or other acks\n console.log(\"[Fluxbase Realtime] Acknowledged:\", message);\n }\n break;\n\n case \"error\":\n console.error(\"[Fluxbase Realtime] Error:\", message.error);\n break;\n }\n }\n\n /**\n * Internal: Handle broadcast message\n */\n private handleBroadcastMessage(message: any) {\n const event = message.event;\n const payload: RealtimeBroadcastPayload = {\n event,\n payload: message.payload,\n };\n\n // Filter self-messages if configured\n if (!this.config.broadcast?.self && message.self) {\n return;\n }\n\n // Call event-specific callbacks\n const callbacks = this.broadcastCallbacks.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => callback(payload));\n }\n\n // Call wildcard callbacks\n const wildcardCallbacks = this.broadcastCallbacks.get(\"*\");\n if (wildcardCallbacks) {\n wildcardCallbacks.forEach((callback) => callback(payload));\n }\n }\n\n /**\n * Internal: Handle presence message\n */\n private handlePresenceMessage(message: any) {\n const event = message.event as \"sync\" | \"join\" | \"leave\";\n const payload: RealtimePresencePayload = {\n event,\n key: message.key,\n newPresences: message.newPresences,\n leftPresences: message.leftPresences,\n currentPresences: message.currentPresences || this._presenceState,\n };\n\n // Update local presence state\n if (message.currentPresences) {\n this._presenceState = message.currentPresences;\n }\n\n // Call event-specific callbacks\n const callbacks = this.presenceCallbacks.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => callback(payload));\n }\n }\n\n /**\n * Internal: Handle postgres_changes message\n */\n private handlePostgresChanges(payload: any) {\n // Convert to Supabase-compatible format\n const supabasePayload: RealtimePostgresChangesPayload = {\n eventType: payload.type || payload.eventType,\n schema: payload.schema,\n table: payload.table,\n commit_timestamp:\n payload.timestamp ||\n payload.commit_timestamp ||\n new Date().toISOString(),\n new: payload.new_record || payload.new || {},\n old: payload.old_record || payload.old || {},\n errors: payload.errors || null,\n };\n\n // Call event-specific callbacks\n const callbacks = this.callbacks.get(supabasePayload.eventType);\n if (callbacks) {\n callbacks.forEach((callback) => callback(supabasePayload));\n }\n\n // Call wildcard callbacks\n const wildcardCallbacks = this.callbacks.get(\"*\");\n if (wildcardCallbacks) {\n wildcardCallbacks.forEach((callback) => callback(supabasePayload));\n }\n }\n\n /**\n * Internal: Start heartbeat interval\n */\n private startHeartbeat() {\n this.heartbeatInterval = setInterval(() => {\n this.sendMessage({ type: \"heartbeat\" });\n }, 30000); // 30 seconds\n }\n\n /**\n * Internal: Stop heartbeat interval\n */\n private stopHeartbeat() {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n }\n\n /**\n * Internal: Attempt to reconnect\n */\n private attemptReconnect() {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.error(\"[Fluxbase Realtime] Max reconnect attempts reached\");\n return;\n }\n\n this.reconnectAttempts++;\n const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);\n\n console.log(\n `[Fluxbase Realtime] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`,\n );\n\n setTimeout(() => {\n this.connect();\n }, delay);\n }\n}\n\nexport class FluxbaseRealtime {\n private url: string;\n private token: string | null;\n private channels: Map<string, RealtimeChannel> = new Map();\n\n constructor(url: string, token: string | null = null) {\n this.url = url;\n this.token = token;\n }\n\n /**\n * Create or get a channel with optional configuration\n *\n * @param channelName - Channel name (e.g., 'table:public.products')\n * @param config - Optional channel configuration\n * @returns RealtimeChannel instance\n *\n * @example\n * ```typescript\n * const channel = realtime.channel('room-1', {\n * broadcast: { self: true, ack: true },\n * presence: { key: 'user-123' }\n * })\n * ```\n */\n channel(\n channelName: string,\n config?: RealtimeChannelConfig\n ): RealtimeChannel {\n // Create a unique key based on name and config\n const configKey = config ? JSON.stringify(config) : \"\";\n const key = `${channelName}:${configKey}`;\n\n if (this.channels.has(key)) {\n return this.channels.get(key)!;\n }\n\n const channel = new RealtimeChannel(\n this.url,\n channelName,\n this.token,\n config\n );\n this.channels.set(key, channel);\n return channel;\n }\n\n /**\n * Remove a specific channel\n *\n * @param channel - The channel to remove\n * @returns Promise resolving to status\n *\n * @example\n * ```typescript\n * const channel = realtime.channel('room-1')\n * await realtime.removeChannel(channel)\n * ```\n */\n async removeChannel(\n channel: RealtimeChannel\n ): Promise<\"ok\" | \"error\"> {\n // Unsubscribe the channel\n await channel.unsubscribe();\n\n // Remove from channels map\n for (const [key, ch] of this.channels.entries()) {\n if (ch === channel) {\n this.channels.delete(key);\n return \"ok\";\n }\n }\n\n return \"error\";\n }\n\n /**\n * Remove all channels\n */\n removeAllChannels() {\n this.channels.forEach((channel) => channel.unsubscribe());\n this.channels.clear();\n }\n\n /**\n * Update auth token for all channels\n * @param token - The new auth token\n */\n setAuth(token: string | null) {\n this.token = token;\n // Note: Existing channels won't be updated, only new ones\n // For existing channels to update, they need to reconnect\n }\n}\n","/**\n * Storage client for file operations\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n FileObject,\n UploadOptions,\n UploadProgress,\n ListOptions,\n SignedUrlOptions,\n ShareFileOptions,\n FileShare,\n BucketSettings,\n Bucket,\n} from \"./types\";\n\nexport class StorageBucket {\n private fetch: FluxbaseFetch;\n private bucketName: string;\n\n constructor(fetch: FluxbaseFetch, bucketName: string) {\n this.fetch = fetch;\n this.bucketName = bucketName;\n }\n\n /**\n * Upload a file to the bucket\n * @param path - The path/key for the file\n * @param file - The file to upload (File, Blob, or ArrayBuffer)\n * @param options - Upload options\n */\n async upload(\n path: string,\n file: File | Blob | ArrayBuffer,\n options?: UploadOptions,\n ): Promise<{ data: { id: string; path: string; fullPath: string } | null; error: Error | null }> {\n try {\n // Prepare FormData (common to both code paths)\n const formData = new FormData();\n\n // Convert to Blob if ArrayBuffer\n const blob = file instanceof ArrayBuffer ? new Blob([file]) : file;\n\n formData.append(\"file\", blob);\n\n if (options?.contentType) {\n formData.append(\"content_type\", options.contentType);\n }\n\n if (options?.metadata) {\n formData.append(\"metadata\", JSON.stringify(options.metadata));\n }\n\n if (options?.cacheControl) {\n formData.append(\"cache_control\", options.cacheControl);\n }\n\n if (options?.upsert !== undefined) {\n formData.append(\"upsert\", String(options.upsert));\n }\n\n let response: any;\n\n // Use XMLHttpRequest for progress tracking if callback is provided\n if (options?.onUploadProgress) {\n response = await this.uploadWithProgress(path, formData, options.onUploadProgress);\n } else {\n // Use standard fetch for uploads without progress tracking\n response = await this.fetch.request<any>(\n `/api/v1/storage/${this.bucketName}/${path}`,\n {\n method: \"POST\",\n body: formData,\n headers: {}, // Let browser set Content-Type for FormData\n },\n );\n }\n\n // Return Supabase-compatible response format\n return {\n data: {\n id: response.id || response.key || path,\n path: path,\n fullPath: `${this.bucketName}/${path}`\n },\n error: null\n };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Upload with progress tracking using XMLHttpRequest\n * @private\n */\n private uploadWithProgress(\n path: string,\n formData: FormData,\n onProgress: (progress: UploadProgress) => void,\n ): Promise<any> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n const url = `${this.fetch[\"baseUrl\"]}/api/v1/storage/${this.bucketName}/${path}`;\n\n // Track upload progress\n xhr.upload.addEventListener('progress', (event) => {\n if (event.lengthComputable) {\n const percentage = Math.round((event.loaded / event.total) * 100);\n onProgress({\n loaded: event.loaded,\n total: event.total,\n percentage,\n });\n }\n });\n\n // Handle completion\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const response = JSON.parse(xhr.responseText);\n resolve(response);\n } catch (e) {\n resolve(xhr.responseText);\n }\n } else {\n try {\n const errorData = JSON.parse(xhr.responseText);\n reject(new Error(errorData.error || xhr.statusText));\n } catch (e) {\n reject(new Error(xhr.statusText));\n }\n }\n });\n\n // Handle errors\n xhr.addEventListener('error', () => {\n reject(new Error('Upload failed'));\n });\n\n xhr.addEventListener('abort', () => {\n reject(new Error('Upload aborted'));\n });\n\n // Open and send request\n xhr.open('POST', url);\n\n // Set authorization header if present\n const headers = this.fetch[\"defaultHeaders\"];\n for (const [key, value] of Object.entries(headers)) {\n // Don't set Content-Type header - let browser handle it for FormData\n if (key.toLowerCase() !== 'content-type') {\n xhr.setRequestHeader(key, value);\n }\n }\n\n xhr.send(formData);\n });\n }\n\n /**\n * Download a file from the bucket\n * @param path - The path/key of the file\n */\n async download(\n path: string,\n ): Promise<{ data: Blob | null; error: Error | null }> {\n try {\n const response = await fetch(\n `${this.fetch[\"baseUrl\"]}/api/v1/storage/${this.bucketName}/${path}`,\n {\n headers: this.fetch[\"defaultHeaders\"],\n },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to download file: ${response.statusText}`);\n }\n\n const blob = await response.blob();\n return { data: blob, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List files in the bucket\n * Supports both Supabase-style list(path, options) and Fluxbase-style list(options)\n * @param pathOrOptions - The folder path or list options\n * @param maybeOptions - List options when first param is a path\n */\n async list(\n pathOrOptions?: string | ListOptions,\n maybeOptions?: ListOptions,\n ): Promise<{ data: FileObject[] | null; error: Error | null }> {\n try {\n const params = new URLSearchParams();\n\n // Determine if first arg is path or options\n let prefix: string | undefined;\n let options: ListOptions | undefined;\n\n if (typeof pathOrOptions === 'string') {\n // Supabase-style: list('path/', { limit: 10 })\n prefix = pathOrOptions;\n options = maybeOptions;\n } else {\n // Fluxbase-style: list({ prefix: 'path/', limit: 10 })\n options = pathOrOptions;\n prefix = options?.prefix;\n }\n\n if (prefix) {\n params.set(\"prefix\", prefix);\n }\n\n if (options?.limit) {\n params.set(\"limit\", String(options.limit));\n }\n\n if (options?.offset) {\n params.set(\"offset\", String(options.offset));\n }\n\n const queryString = params.toString();\n const path = `/api/v1/storage/${this.bucketName}${queryString ? `?${queryString}` : \"\"}`;\n\n const response = await this.fetch.get<{ files: any[] }>(path);\n\n // Convert to FileObject format\n const files: FileObject[] = (response.files || []).map((file: any) => ({\n name: file.key || file.name,\n id: file.id,\n bucket_id: file.bucket || this.bucketName,\n created_at: file.last_modified || file.created_at,\n updated_at: file.updated_at,\n last_accessed_at: file.last_accessed_at,\n metadata: file.metadata,\n }));\n\n return { data: files, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Remove files from the bucket\n * @param paths - Array of file paths to remove\n */\n async remove(paths: string[]): Promise<{ data: FileObject[] | null; error: Error | null }> {\n try {\n const removedFiles: FileObject[] = [];\n\n // Delete files one by one (could be optimized with batch endpoint)\n for (const path of paths) {\n await this.fetch.delete(`/api/v1/storage/${this.bucketName}/${path}`);\n // Add to removed files list\n removedFiles.push({\n name: path,\n bucket_id: this.bucketName,\n });\n }\n\n return { data: removedFiles, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Get a public URL for a file\n * @param path - The file path\n */\n getPublicUrl(path: string): { data: { publicUrl: string } } {\n const publicUrl = `${this.fetch[\"baseUrl\"]}/api/v1/storage/${this.bucketName}/${path}`;\n return { data: { publicUrl } };\n }\n\n /**\n * Create a signed URL for temporary access to a file\n * @param path - The file path\n * @param options - Signed URL options\n */\n async createSignedUrl(\n path: string,\n options?: SignedUrlOptions,\n ): Promise<{ data: { signedUrl: string } | null; error: Error | null }> {\n try {\n const expiresIn = options?.expiresIn || 3600; // Default 1 hour\n\n const data = await this.fetch.post<{ signed_url: string }>(\n `/api/v1/storage/${this.bucketName}/sign/${path}`,\n { expires_in: expiresIn },\n );\n\n return { data: { signedUrl: data.signed_url }, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Move a file to a new location\n * @param fromPath - Current file path\n * @param toPath - New file path\n */\n async move(\n fromPath: string,\n toPath: string,\n ): Promise<{ data: { message: string } | null; error: Error | null }> {\n try {\n await this.fetch.post(\n `/api/v1/storage/${this.bucketName}/move`,\n {\n from_path: fromPath,\n to_path: toPath,\n },\n );\n\n return {\n data: { message: 'Successfully moved' },\n error: null\n };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Copy a file to a new location\n * @param fromPath - Source file path\n * @param toPath - Destination file path\n */\n async copy(\n fromPath: string,\n toPath: string,\n ): Promise<{ data: { path: string } | null; error: Error | null }> {\n try {\n await this.fetch.post(\n `/api/v1/storage/${this.bucketName}/copy`,\n {\n from_path: fromPath,\n to_path: toPath,\n },\n );\n\n return {\n data: { path: toPath },\n error: null\n };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Share a file with another user (RLS)\n * @param path - The file path\n * @param options - Share options (userId and permission)\n */\n async share(\n path: string,\n options: ShareFileOptions,\n ): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.post(\n `/api/v1/storage/${this.bucketName}/${path}/share`,\n {\n user_id: options.userId,\n permission: options.permission,\n },\n );\n\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Revoke file access from a user (RLS)\n * @param path - The file path\n * @param userId - The user ID to revoke access from\n */\n async revokeShare(\n path: string,\n userId: string,\n ): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.delete(\n `/api/v1/storage/${this.bucketName}/${path}/share/${userId}`,\n );\n\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List users a file is shared with (RLS)\n * @param path - The file path\n */\n async listShares(\n path: string,\n ): Promise<{ data: FileShare[] | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<{ shares: FileShare[] }>(\n `/api/v1/storage/${this.bucketName}/${path}/shares`,\n );\n\n return { data: data.shares || [], error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n}\n\nexport class FluxbaseStorage {\n private fetch: FluxbaseFetch;\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch;\n }\n\n /**\n * Get a reference to a storage bucket\n * @param bucketName - The name of the bucket\n */\n from(bucketName: string): StorageBucket {\n return new StorageBucket(this.fetch, bucketName);\n }\n\n /**\n * List all buckets\n */\n async listBuckets(): Promise<{\n data: Array<{ name: string; created_at: string }> | null;\n error: Error | null;\n }> {\n try {\n const data = await this.fetch.get<{\n buckets: Array<{ name: string; created_at: string }>;\n }>(\"/api/v1/storage/buckets\");\n\n return { data: data.buckets || [], error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Create a new bucket\n * @param bucketName - The name of the bucket to create\n */\n async createBucket(\n bucketName: string,\n ): Promise<{ data: { name: string } | null; error: Error | null }> {\n try {\n await this.fetch.post(`/api/v1/storage/buckets/${bucketName}`);\n return { data: { name: bucketName }, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Delete a bucket\n * @param bucketName - The name of the bucket to delete\n */\n async deleteBucket(\n bucketName: string,\n ): Promise<{ data: { message: string } | null; error: Error | null }> {\n try {\n await this.fetch.delete(`/api/v1/storage/buckets/${bucketName}`);\n return { data: { message: 'Successfully deleted' }, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Empty a bucket (delete all files)\n * @param bucketName - The name of the bucket to empty\n */\n async emptyBucket(\n bucketName: string,\n ): Promise<{ data: { message: string } | null; error: Error | null }> {\n try {\n // List all files and delete them\n const bucket = this.from(bucketName);\n const { data: objects, error: listError } = await bucket.list();\n\n if (listError) {\n return { data: null, error: listError };\n }\n\n if (objects && objects.length > 0) {\n const paths = objects.map((obj) => obj.name);\n const { error: removeError } = await bucket.remove(paths);\n\n if (removeError) {\n return { data: null, error: removeError };\n }\n }\n\n return { data: { message: 'Successfully emptied' }, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Update bucket settings (RLS - requires admin or service key)\n * @param bucketName - The name of the bucket\n * @param settings - Bucket settings to update\n */\n async updateBucketSettings(\n bucketName: string,\n settings: BucketSettings,\n ): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.put(`/api/v1/storage/buckets/${bucketName}`, settings);\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Get bucket details\n * @param bucketName - The name of the bucket\n */\n async getBucket(\n bucketName: string,\n ): Promise<{ data: Bucket | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<Bucket>(\n `/api/v1/storage/buckets/${bucketName}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n}\n","/**\n * Edge Functions module for Fluxbase SDK\n * Compatible with Supabase Functions API\n *\n * @example\n * ```typescript\n * // Invoke a function\n * const { data, error } = await client.functions.invoke('hello-world', {\n * body: { name: 'Alice' }\n * })\n *\n * // With custom headers\n * const { data, error } = await client.functions.invoke('api-call', {\n * body: { query: 'data' },\n * headers: { 'X-Custom-Header': 'value' },\n * method: 'POST'\n * })\n * ```\n */\n\nimport type { FluxbaseFetch } from './fetch'\nimport type {\n FunctionInvokeOptions,\n EdgeFunction,\n CreateFunctionRequest,\n UpdateFunctionRequest,\n EdgeFunctionExecution,\n} from './types'\n\n/**\n * Edge Functions client for invoking and managing serverless functions\n * API-compatible with Supabase Functions\n *\n * @category Functions\n */\nexport class FluxbaseFunctions {\n private fetch: FluxbaseFetch\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch\n }\n\n /**\n * Invoke an edge function\n *\n * This method is fully compatible with Supabase's functions.invoke() API.\n *\n * @param functionName - The name of the function to invoke\n * @param options - Invocation options including body, headers, and HTTP method\n * @returns Promise resolving to { data, error } tuple\n *\n * @example\n * ```typescript\n * // Simple invocation\n * const { data, error } = await client.functions.invoke('hello', {\n * body: { name: 'World' }\n * })\n *\n * // With GET method\n * const { data, error } = await client.functions.invoke('get-data', {\n * method: 'GET'\n * })\n *\n * // With custom headers\n * const { data, error } = await client.functions.invoke('api-proxy', {\n * body: { query: 'search' },\n * headers: { 'Authorization': 'Bearer token' },\n * method: 'POST'\n * })\n * ```\n */\n async invoke<T = any>(\n functionName: string,\n options?: FunctionInvokeOptions\n ): Promise<{ data: T | null; error: Error | null }> {\n try {\n const method = options?.method || 'POST'\n const headers = options?.headers || {}\n const body = options?.body\n\n // Use the Fluxbase backend endpoint\n const endpoint = `/api/v1/functions/${functionName}/invoke`\n\n let response: T\n\n // Route to appropriate HTTP method\n switch (method) {\n case 'GET':\n response = await this.fetch.get<T>(endpoint, { headers })\n break\n case 'DELETE':\n response = await this.fetch.delete<T>(endpoint, { headers })\n break\n case 'PUT':\n response = await this.fetch.put<T>(endpoint, body, { headers })\n break\n case 'PATCH':\n response = await this.fetch.patch<T>(endpoint, body, { headers })\n break\n case 'POST':\n default:\n response = await this.fetch.post<T>(endpoint, body, { headers })\n break\n }\n\n return { data: response, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Create a new edge function\n *\n * @param request - Function configuration and code\n * @returns Promise resolving to { data, error } tuple with created function metadata\n *\n * @example\n * ```typescript\n * const { data, error } = await client.functions.create({\n * name: 'my-function',\n * code: 'export default async function handler(req) { return { hello: \"world\" } }',\n * enabled: true\n * })\n * ```\n */\n async create(\n request: CreateFunctionRequest\n ): Promise<{ data: EdgeFunction | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<EdgeFunction>('/api/v1/functions', request)\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * List all edge functions\n *\n * @returns Promise resolving to { data, error } tuple with array of functions\n *\n * @example\n * ```typescript\n * const { data, error } = await client.functions.list()\n * if (data) {\n * console.log('Functions:', data.map(f => f.name))\n * }\n * ```\n */\n async list(): Promise<{ data: EdgeFunction[] | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<EdgeFunction[]>('/api/v1/functions')\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Get details of a specific edge function\n *\n * @param name - Function name\n * @returns Promise resolving to { data, error } tuple with function metadata\n *\n * @example\n * ```typescript\n * const { data, error } = await client.functions.get('my-function')\n * if (data) {\n * console.log('Function version:', data.version)\n * }\n * ```\n */\n async get(name: string): Promise<{ data: EdgeFunction | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<EdgeFunction>(`/api/v1/functions/${name}`)\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Update an existing edge function\n *\n * @param name - Function name\n * @param updates - Fields to update\n * @returns Promise resolving to { data, error } tuple with updated function metadata\n *\n * @example\n * ```typescript\n * const { data, error } = await client.functions.update('my-function', {\n * enabled: false,\n * description: 'Updated description'\n * })\n * ```\n */\n async update(\n name: string,\n updates: UpdateFunctionRequest\n ): Promise<{ data: EdgeFunction | null; error: Error | null }> {\n try {\n const data = await this.fetch.put<EdgeFunction>(`/api/v1/functions/${name}`, updates)\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Delete an edge function\n *\n * @param name - Function name\n * @returns Promise resolving to { data, error } tuple\n *\n * @example\n * ```typescript\n * const { data, error } = await client.functions.delete('my-function')\n * ```\n */\n async delete(name: string): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.delete(`/api/v1/functions/${name}`)\n return { data: null, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Get execution history for an edge function\n *\n * @param name - Function name\n * @param limit - Maximum number of executions to return (optional)\n * @returns Promise resolving to { data, error } tuple with execution records\n *\n * @example\n * ```typescript\n * const { data, error } = await client.functions.getExecutions('my-function', 10)\n * if (data) {\n * data.forEach(exec => {\n * console.log(`${exec.executed_at}: ${exec.status} (${exec.duration_ms}ms)`)\n * })\n * }\n * ```\n */\n async getExecutions(\n name: string,\n limit?: number\n ): Promise<{ data: EdgeFunctionExecution[] | null; error: Error | null }> {\n try {\n const params = limit ? `?limit=${limit}` : ''\n const data = await this.fetch.get<EdgeFunctionExecution[]>(\n `/api/v1/functions/${name}/executions${params}`\n )\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n}\n","import type { FluxbaseFetch } from \"./fetch\";\nimport type {\n SystemSetting,\n UpdateSystemSettingRequest,\n ListSystemSettingsResponse,\n AppSettings,\n UpdateAppSettingsRequest,\n CustomSetting,\n EmailTemplate,\n EmailTemplateType,\n UpdateEmailTemplateRequest,\n ListEmailTemplatesResponse,\n} from \"./types\";\n\n/**\n * System Settings Manager\n *\n * Manages low-level system settings with key-value storage.\n * For application-level settings, use AppSettingsManager instead.\n *\n * @example\n * ```typescript\n * const settings = client.admin.settings.system\n *\n * // List all system settings\n * const { settings } = await settings.list()\n *\n * // Get specific setting\n * const setting = await settings.get('app.auth.enable_signup')\n *\n * // Update setting\n * await settings.update('app.auth.enable_signup', {\n * value: { value: true },\n * description: 'Enable user signup'\n * })\n *\n * // Delete setting\n * await settings.delete('app.auth.enable_signup')\n * ```\n */\nexport class SystemSettingsManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * List all system settings\n *\n * @returns Promise resolving to ListSystemSettingsResponse\n *\n * @example\n * ```typescript\n * const response = await client.admin.settings.system.list()\n * console.log(response.settings)\n * ```\n */\n async list(): Promise<ListSystemSettingsResponse> {\n const settings = await this.fetch.get<SystemSetting[]>(\n \"/api/v1/admin/system/settings\",\n );\n return { settings: Array.isArray(settings) ? settings : [] };\n }\n\n /**\n * Get a specific system setting by key\n *\n * @param key - Setting key (e.g., 'app.auth.enable_signup')\n * @returns Promise resolving to SystemSetting\n *\n * @example\n * ```typescript\n * const setting = await client.admin.settings.system.get('app.auth.enable_signup')\n * console.log(setting.value)\n * ```\n */\n async get(key: string): Promise<SystemSetting> {\n return await this.fetch.get<SystemSetting>(\n `/api/v1/admin/system/settings/${key}`,\n );\n }\n\n /**\n * Update or create a system setting\n *\n * @param key - Setting key\n * @param request - Update request with value and optional description\n * @returns Promise resolving to SystemSetting\n *\n * @example\n * ```typescript\n * const updated = await client.admin.settings.system.update('app.auth.enable_signup', {\n * value: { value: true },\n * description: 'Enable user signup'\n * })\n * ```\n */\n async update(\n key: string,\n request: UpdateSystemSettingRequest,\n ): Promise<SystemSetting> {\n return await this.fetch.put<SystemSetting>(\n `/api/v1/admin/system/settings/${key}`,\n request,\n );\n }\n\n /**\n * Delete a system setting\n *\n * @param key - Setting key to delete\n * @returns Promise<void>\n *\n * @example\n * ```typescript\n * await client.admin.settings.system.delete('app.auth.enable_signup')\n * ```\n */\n async delete(key: string): Promise<void> {\n await this.fetch.delete(`/api/v1/admin/system/settings/${key}`);\n }\n}\n\n/**\n * Application Settings Manager\n *\n * Manages high-level application settings with a structured API.\n * Provides type-safe access to authentication, features, email, and security settings.\n *\n * @example\n * ```typescript\n * const settings = client.admin.settings.app\n *\n * // Get all app settings\n * const appSettings = await settings.get()\n * console.log(appSettings.authentication.enable_signup)\n *\n * // Update specific settings\n * const updated = await settings.update({\n * authentication: {\n * enable_signup: true,\n * password_min_length: 12\n * }\n * })\n *\n * // Reset to defaults\n * await settings.reset()\n * ```\n */\nexport class AppSettingsManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Get all application settings\n *\n * Returns structured settings for authentication, features, email, and security.\n *\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * const settings = await client.admin.settings.app.get()\n *\n * console.log('Signup enabled:', settings.authentication.enable_signup)\n * console.log('Realtime enabled:', settings.features.enable_realtime)\n * console.log('Email provider:', settings.email.provider)\n * ```\n */\n async get(): Promise<AppSettings> {\n return await this.fetch.get<AppSettings>(\"/api/v1/admin/app/settings\");\n }\n\n /**\n * Update application settings\n *\n * Supports partial updates - only provide the fields you want to change.\n *\n * @param request - Settings to update (partial update supported)\n * @returns Promise resolving to AppSettings - Updated settings\n *\n * @example\n * ```typescript\n * // Update authentication settings\n * const updated = await client.admin.settings.app.update({\n * authentication: {\n * enable_signup: true,\n * password_min_length: 12\n * }\n * })\n *\n * // Update multiple categories\n * await client.admin.settings.app.update({\n * authentication: { enable_signup: false },\n * features: { enable_realtime: true },\n * security: { enable_global_rate_limit: true }\n * })\n * ```\n */\n async update(request: UpdateAppSettingsRequest): Promise<AppSettings> {\n return await this.fetch.put<AppSettings>(\n \"/api/v1/admin/app/settings\",\n request,\n );\n }\n\n /**\n * Reset all application settings to defaults\n *\n * This will delete all custom settings and return to default values.\n *\n * @returns Promise resolving to AppSettings - Default settings\n *\n * @example\n * ```typescript\n * const defaults = await client.admin.settings.app.reset()\n * console.log('Settings reset to defaults:', defaults)\n * ```\n */\n async reset(): Promise<AppSettings> {\n return await this.fetch.post<AppSettings>(\n \"/api/v1/admin/app/settings/reset\",\n {},\n );\n }\n\n /**\n * Enable user signup\n *\n * Convenience method to enable user registration.\n *\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.enableSignup()\n * ```\n */\n async enableSignup(): Promise<AppSettings> {\n return await this.update({\n authentication: { enable_signup: true },\n });\n }\n\n /**\n * Disable user signup\n *\n * Convenience method to disable user registration.\n *\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.disableSignup()\n * ```\n */\n async disableSignup(): Promise<AppSettings> {\n return await this.update({\n authentication: { enable_signup: false },\n });\n }\n\n /**\n * Update password minimum length\n *\n * Convenience method to set password requirements.\n *\n * @param length - Minimum password length (8-128 characters)\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setPasswordMinLength(12)\n * ```\n */\n async setPasswordMinLength(length: number): Promise<AppSettings> {\n if (length < 8 || length > 128) {\n throw new Error(\n \"Password minimum length must be between 8 and 128 characters\",\n );\n }\n\n return await this.update({\n authentication: { password_min_length: length },\n });\n }\n\n /**\n * Enable or disable a feature\n *\n * Convenience method to toggle feature flags.\n *\n * @param feature - Feature name ('realtime' | 'storage' | 'functions')\n * @param enabled - Whether to enable or disable the feature\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * // Enable realtime\n * await client.admin.settings.app.setFeature('realtime', true)\n *\n * // Disable storage\n * await client.admin.settings.app.setFeature('storage', false)\n * ```\n */\n async setFeature(\n feature: \"realtime\" | \"storage\" | \"functions\",\n enabled: boolean,\n ): Promise<AppSettings> {\n const featureKey =\n feature === \"realtime\"\n ? \"enable_realtime\"\n : feature === \"storage\"\n ? \"enable_storage\"\n : \"enable_functions\";\n\n return await this.update({\n features: { [featureKey]: enabled },\n });\n }\n\n /**\n * Enable or disable global rate limiting\n *\n * Convenience method to toggle global rate limiting.\n *\n * @param enabled - Whether to enable rate limiting\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setRateLimiting(true)\n * ```\n */\n async setRateLimiting(enabled: boolean): Promise<AppSettings> {\n return await this.update({\n security: { enable_global_rate_limit: enabled },\n });\n }\n\n /**\n * Configure SMTP email provider\n *\n * Convenience method to set up SMTP email delivery.\n *\n * @param config - SMTP configuration\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.configureSMTP({\n * host: 'smtp.gmail.com',\n * port: 587,\n * username: 'your-email@gmail.com',\n * password: 'your-app-password',\n * use_tls: true,\n * from_address: 'noreply@yourapp.com',\n * from_name: 'Your App'\n * })\n * ```\n */\n async configureSMTP(config: {\n host: string;\n port: number;\n username: string;\n password: string;\n use_tls: boolean;\n from_address?: string;\n from_name?: string;\n reply_to_address?: string;\n }): Promise<AppSettings> {\n return await this.update({\n email: {\n enabled: true,\n provider: \"smtp\",\n from_address: config.from_address,\n from_name: config.from_name,\n reply_to_address: config.reply_to_address,\n smtp: {\n host: config.host,\n port: config.port,\n username: config.username,\n password: config.password,\n use_tls: config.use_tls,\n },\n },\n });\n }\n\n /**\n * Configure SendGrid email provider\n *\n * Convenience method to set up SendGrid email delivery.\n *\n * @param apiKey - SendGrid API key\n * @param options - Optional from address, name, and reply-to\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.configureSendGrid('SG.xxx', {\n * from_address: 'noreply@yourapp.com',\n * from_name: 'Your App'\n * })\n * ```\n */\n async configureSendGrid(\n apiKey: string,\n options?: {\n from_address?: string;\n from_name?: string;\n reply_to_address?: string;\n },\n ): Promise<AppSettings> {\n return await this.update({\n email: {\n enabled: true,\n provider: \"sendgrid\",\n from_address: options?.from_address,\n from_name: options?.from_name,\n reply_to_address: options?.reply_to_address,\n sendgrid: {\n api_key: apiKey,\n },\n },\n });\n }\n\n /**\n * Configure Mailgun email provider\n *\n * Convenience method to set up Mailgun email delivery.\n *\n * @param apiKey - Mailgun API key\n * @param domain - Mailgun domain\n * @param options - Optional EU region flag and email addresses\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.configureMailgun('key-xxx', 'mg.yourapp.com', {\n * eu_region: false,\n * from_address: 'noreply@yourapp.com',\n * from_name: 'Your App'\n * })\n * ```\n */\n async configureMailgun(\n apiKey: string,\n domain: string,\n options?: {\n eu_region?: boolean;\n from_address?: string;\n from_name?: string;\n reply_to_address?: string;\n },\n ): Promise<AppSettings> {\n return await this.update({\n email: {\n enabled: true,\n provider: \"mailgun\",\n from_address: options?.from_address,\n from_name: options?.from_name,\n reply_to_address: options?.reply_to_address,\n mailgun: {\n api_key: apiKey,\n domain: domain,\n eu_region: options?.eu_region ?? false,\n },\n },\n });\n }\n\n /**\n * Configure AWS SES email provider\n *\n * Convenience method to set up AWS SES email delivery.\n *\n * @param accessKeyId - AWS access key ID\n * @param secretAccessKey - AWS secret access key\n * @param region - AWS region (e.g., 'us-east-1')\n * @param options - Optional email addresses\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.configureSES(\n * 'AKIAIOSFODNN7EXAMPLE',\n * 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',\n * 'us-east-1',\n * {\n * from_address: 'noreply@yourapp.com',\n * from_name: 'Your App'\n * }\n * )\n * ```\n */\n async configureSES(\n accessKeyId: string,\n secretAccessKey: string,\n region: string,\n options?: {\n from_address?: string;\n from_name?: string;\n reply_to_address?: string;\n },\n ): Promise<AppSettings> {\n return await this.update({\n email: {\n enabled: true,\n provider: \"ses\",\n from_address: options?.from_address,\n from_name: options?.from_name,\n reply_to_address: options?.reply_to_address,\n ses: {\n access_key_id: accessKeyId,\n secret_access_key: secretAccessKey,\n region: region,\n },\n },\n });\n }\n\n /**\n * Enable or disable email functionality\n *\n * Convenience method to toggle email system on/off.\n *\n * @param enabled - Whether to enable email\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setEmailEnabled(true)\n * ```\n */\n async setEmailEnabled(enabled: boolean): Promise<AppSettings> {\n return await this.update({\n email: { enabled },\n });\n }\n\n /**\n * Configure password complexity requirements\n *\n * Convenience method to set password validation rules.\n *\n * @param requirements - Password complexity requirements\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setPasswordComplexity({\n * min_length: 12,\n * require_uppercase: true,\n * require_lowercase: true,\n * require_number: true,\n * require_special: true\n * })\n * ```\n */\n async setPasswordComplexity(requirements: {\n min_length?: number;\n require_uppercase?: boolean;\n require_lowercase?: boolean;\n require_number?: boolean;\n require_special?: boolean;\n }): Promise<AppSettings> {\n return await this.update({\n authentication: {\n password_min_length: requirements.min_length,\n password_require_uppercase: requirements.require_uppercase,\n password_require_lowercase: requirements.require_lowercase,\n password_require_number: requirements.require_number,\n password_require_special: requirements.require_special,\n },\n });\n }\n\n /**\n * Configure session settings\n *\n * Convenience method to set session timeout and limits.\n *\n * @param timeoutMinutes - Session timeout in minutes (0 for no timeout)\n * @param maxSessionsPerUser - Maximum concurrent sessions per user (0 for unlimited)\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * // 30 minute sessions, max 3 devices per user\n * await client.admin.settings.app.setSessionSettings(30, 3)\n * ```\n */\n async setSessionSettings(\n timeoutMinutes: number,\n maxSessionsPerUser: number,\n ): Promise<AppSettings> {\n return await this.update({\n authentication: {\n session_timeout_minutes: timeoutMinutes,\n max_sessions_per_user: maxSessionsPerUser,\n },\n });\n }\n\n /**\n * Enable or disable email verification requirement\n *\n * Convenience method to require email verification for new signups.\n *\n * @param required - Whether to require email verification\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setEmailVerificationRequired(true)\n * ```\n */\n async setEmailVerificationRequired(required: boolean): Promise<AppSettings> {\n return await this.update({\n authentication: { require_email_verification: required },\n });\n }\n\n // ===================================================================\n // CUSTOM SETTINGS METHODS\n // Flexible key-value storage for application-specific configuration\n // ===================================================================\n\n /**\n * Get a specific custom setting's value only (without metadata)\n *\n * Convenience method that returns just the value field instead of the full CustomSetting object.\n *\n * @param key - Setting key (e.g., 'billing.tiers', 'features.beta_enabled')\n * @returns Promise resolving to the setting's value\n *\n * @example\n * ```typescript\n * const tiers = await client.admin.settings.app.getSetting('billing.tiers')\n * console.log(tiers) // { free: 1000, pro: 10000, enterprise: 100000 }\n * ```\n */\n async getSetting(key: string): Promise<any> {\n const setting = await this.fetch.get<CustomSetting>(\n `/api/v1/admin/settings/custom/${key}`,\n );\n return setting.value;\n }\n\n /**\n * Get multiple custom settings' values by keys\n *\n * Fetches multiple settings in a single request and returns only their values.\n *\n * @param keys - Array of setting keys to fetch\n * @returns Promise resolving to object mapping keys to values\n *\n * @example\n * ```typescript\n * const values = await client.admin.settings.app.getSettings([\n * 'billing.tiers',\n * 'features.beta_enabled'\n * ])\n * console.log(values)\n * // {\n * // 'billing.tiers': { free: 1000, pro: 10000 },\n * // 'features.beta_enabled': { enabled: true }\n * // }\n * ```\n */\n async getSettings(keys: string[]): Promise<Record<string, any>> {\n const response = await this.fetch.post<CustomSetting[]>(\n \"/api/v1/settings/batch\",\n { keys },\n );\n return response.reduce(\n (acc, setting) => {\n acc[setting.key] = setting.value;\n return acc;\n },\n {} as Record<string, any>,\n );\n }\n\n /**\n * Set or create a custom setting\n *\n * Creates a new custom setting or updates an existing one.\n *\n * @param key - Setting key\n * @param value - Setting value (any JSON-serializable value)\n * @param options - Optional configuration (description, is_public, is_secret, etc.)\n * @returns Promise resolving to CustomSetting\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setSetting('billing.tiers', {\n * free: 1000,\n * pro: 10000,\n * enterprise: 100000\n * }, {\n * description: 'API quotas per billing tier',\n * is_public: false\n * })\n * ```\n */\n async setSetting(\n key: string,\n value: any,\n options?: {\n description?: string;\n is_public?: boolean;\n is_secret?: boolean;\n value_type?: string;\n },\n ): Promise<CustomSetting> {\n // Try to update first, if not found, create\n try {\n return await this.fetch.put<CustomSetting>(\n `/api/v1/admin/settings/custom/${key}`,\n {\n value,\n description: options?.description,\n is_public: options?.is_public,\n is_secret: options?.is_secret,\n },\n );\n } catch (error: any) {\n // If not found (404), create new setting\n if (error.status === 404 || error.message?.includes(\"not found\")) {\n return await this.fetch.post<CustomSetting>(\n \"/api/v1/admin/settings/custom\",\n {\n key,\n value,\n value_type: options?.value_type || \"json\",\n description: options?.description,\n is_public: options?.is_public ?? false,\n is_secret: options?.is_secret ?? false,\n },\n );\n }\n throw error;\n }\n }\n\n /**\n * List all custom settings\n *\n * @returns Promise resolving to array of CustomSetting objects\n *\n * @example\n * ```typescript\n * const settings = await client.admin.settings.app.listSettings()\n * settings.forEach(s => console.log(s.key, s.value))\n * ```\n */\n async listSettings(): Promise<CustomSetting[]> {\n return await this.fetch.get<CustomSetting[]>(\n \"/api/v1/admin/settings/custom\",\n );\n }\n\n /**\n * Delete a custom setting\n *\n * @param key - Setting key to delete\n * @returns Promise<void>\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.deleteSetting('billing.tiers')\n * ```\n */\n async deleteSetting(key: string): Promise<void> {\n await this.fetch.delete(`/api/v1/admin/settings/custom/${key}`);\n }\n}\n\n/**\n * Email Template Manager\n *\n * Manages email templates for authentication and user communication.\n * Supports customizing templates for magic links, email verification, password resets, and user invitations.\n *\n * @example\n * ```typescript\n * const templates = client.admin.emailTemplates\n *\n * // List all templates\n * const { templates: allTemplates } = await templates.list()\n *\n * // Get specific template\n * const magicLink = await templates.get('magic_link')\n *\n * // Update template\n * await templates.update('magic_link', {\n * subject: 'Sign in to ' + '{{.AppName}}',\n * html_body: '<html>Custom template with ' + '{{.MagicLink}}' + '</html>',\n * text_body: 'Click here: ' + '{{.MagicLink}}'\n * })\n *\n * // Test template (sends to specified email)\n * await templates.test('magic_link', 'test@example.com')\n *\n * // Reset to default\n * await templates.reset('magic_link')\n * ```\n */\nexport class EmailTemplateManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * List all email templates\n *\n * @returns Promise resolving to ListEmailTemplatesResponse\n *\n * @example\n * ```typescript\n * const response = await client.admin.emailTemplates.list()\n * console.log(response.templates)\n * ```\n */\n async list(): Promise<ListEmailTemplatesResponse> {\n const templates = await this.fetch.get<EmailTemplate[]>(\n \"/api/v1/admin/email/templates\",\n );\n return { templates: Array.isArray(templates) ? templates : [] };\n }\n\n /**\n * Get a specific email template by type\n *\n * @param type - Template type (magic_link | verify_email | reset_password | invite_user)\n * @returns Promise resolving to EmailTemplate\n *\n * @example\n * ```typescript\n * const template = await client.admin.emailTemplates.get('magic_link')\n * console.log(template.subject)\n * console.log(template.html_body)\n * ```\n */\n async get(type: EmailTemplateType): Promise<EmailTemplate> {\n return await this.fetch.get<EmailTemplate>(\n `/api/v1/admin/email/templates/${type}`,\n );\n }\n\n /**\n * Update an email template\n *\n * Available template variables:\n * - magic_link: `{{.MagicLink}}`, `{{.AppName}}`, `{{.ExpiryMinutes}}`\n * - verify_email: `{{.VerificationLink}}`, `{{.AppName}}`\n * - reset_password: `{{.ResetLink}}`, `{{.AppName}}`, `{{.ExpiryMinutes}}`\n * - invite_user: `{{.InviteLink}}`, `{{.AppName}}`, `{{.InviterName}}`\n *\n * @param type - Template type to update\n * @param request - Update request with subject, html_body, and optional text_body\n * @returns Promise resolving to EmailTemplate\n *\n * @example\n * ```typescript\n * const updated = await client.admin.emailTemplates.update('magic_link', {\n * subject: 'Your Magic Link - Sign in to ' + '{{.AppName}}',\n * html_body: '<html><body><h1>Welcome!</h1><a href=\"' + '{{.MagicLink}}' + '\">Sign In</a></body></html>',\n * text_body: 'Click here to sign in: ' + '{{.MagicLink}}'\n * })\n * ```\n */\n async update(\n type: EmailTemplateType,\n request: UpdateEmailTemplateRequest,\n ): Promise<EmailTemplate> {\n return await this.fetch.put<EmailTemplate>(\n `/api/v1/admin/email/templates/${type}`,\n request,\n );\n }\n\n /**\n * Reset an email template to default\n *\n * Removes any customizations and restores the template to its original state.\n *\n * @param type - Template type to reset\n * @returns Promise resolving to EmailTemplate - The default template\n *\n * @example\n * ```typescript\n * const defaultTemplate = await client.admin.emailTemplates.reset('magic_link')\n * ```\n */\n async reset(type: EmailTemplateType): Promise<EmailTemplate> {\n return await this.fetch.post<EmailTemplate>(\n `/api/v1/admin/email/templates/${type}/reset`,\n {},\n );\n }\n\n /**\n * Send a test email using the template\n *\n * Useful for previewing template changes before deploying to production.\n *\n * @param type - Template type to test\n * @param recipientEmail - Email address to send test to\n * @returns Promise<void>\n *\n * @example\n * ```typescript\n * await client.admin.emailTemplates.test('magic_link', 'test@example.com')\n * ```\n */\n async test(type: EmailTemplateType, recipientEmail: string): Promise<void> {\n await this.fetch.post(`/api/v1/admin/email/templates/${type}/test`, {\n recipient_email: recipientEmail,\n });\n }\n}\n\n/**\n * Settings Manager\n *\n * Provides access to system-level and application-level settings.\n * AppSettingsManager now handles both structured framework settings and custom key-value settings.\n *\n * @example\n * ```typescript\n * const settings = client.admin.settings\n *\n * // Access system settings\n * const systemSettings = await settings.system.list()\n *\n * // Access app settings (structured)\n * const appSettings = await settings.app.get()\n * await settings.app.enableSignup()\n *\n * // Access custom settings (key-value)\n * await settings.app.setSetting('billing.tiers', { free: 1000, pro: 10000 })\n * const tiers = await settings.app.getSetting('billing.tiers')\n * ```\n */\nexport class FluxbaseSettings {\n public system: SystemSettingsManager;\n public app: AppSettingsManager;\n\n constructor(fetch: FluxbaseFetch) {\n this.system = new SystemSettingsManager(fetch);\n this.app = new AppSettingsManager(fetch);\n }\n}\n\n/**\n * Public Settings Client\n *\n * Provides read-only access to public settings for non-admin users.\n * Access is controlled by RLS policies on the app.settings table.\n *\n * @example\n * ```typescript\n * const client = new FluxbaseClient(url, userToken)\n *\n * // Get single public setting\n * const betaEnabled = await client.settings.get('features.beta_enabled')\n * console.log(betaEnabled) // { enabled: true }\n *\n * // Get multiple public settings\n * const values = await client.settings.getMany([\n * 'features.beta_enabled',\n * 'features.dark_mode',\n * 'public.app_version'\n * ])\n * console.log(values)\n * // {\n * // 'features.beta_enabled': { enabled: true },\n * // 'features.dark_mode': { enabled: false },\n * // 'public.app_version': '1.0.0'\n * // }\n * ```\n */\nexport class SettingsClient {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Get a single setting's value\n *\n * Returns only the value field of the setting.\n * Access is controlled by RLS policies - will return 403 if the user\n * doesn't have permission to read the setting.\n *\n * @param key - Setting key (e.g., 'features.beta_enabled')\n * @returns Promise resolving to the setting's value\n * @throws Error if setting doesn't exist or user lacks permission\n *\n * @example\n * ```typescript\n * // Get public setting (any user)\n * const value = await client.settings.get('features.beta_enabled')\n * console.log(value) // { enabled: true }\n *\n * // Get restricted setting (requires permission)\n * try {\n * const secret = await client.settings.get('internal.api_key')\n * } catch (error) {\n * console.error('Access denied:', error)\n * }\n * ```\n */\n async get(key: string): Promise<any> {\n const response = await this.fetch.get<{ value: any }>(\n `/api/v1/settings/${encodeURIComponent(key)}`,\n );\n return response.value;\n }\n\n /**\n * Get multiple settings' values by keys\n *\n * Fetches multiple settings in a single request.\n * Only returns settings the user has permission to read based on RLS policies.\n * Settings the user can't access will be omitted from the result (no error thrown).\n *\n * @param keys - Array of setting keys to fetch\n * @returns Promise resolving to object mapping keys to values\n *\n * @example\n * ```typescript\n * const values = await client.settings.getMany([\n * 'features.beta_enabled', // public - will be returned\n * 'features.dark_mode', // public - will be returned\n * 'internal.api_key' // secret - will be omitted\n * ])\n * console.log(values)\n * // {\n * // 'features.beta_enabled': { enabled: true },\n * // 'features.dark_mode': { enabled: false }\n * // // 'internal.api_key' is omitted (no error)\n * // }\n * ```\n */\n async getMany(keys: string[]): Promise<Record<string, any>> {\n const response = await this.fetch.post<Array<{ key: string; value: any }>>(\n \"/api/v1/settings/batch\",\n { keys },\n );\n return response.reduce(\n (acc, setting) => {\n acc[setting.key] = setting.value;\n return acc;\n },\n {} as Record<string, any>,\n );\n }\n}\n","import type { FluxbaseFetch } from './fetch'\nimport type {\n CreateSchemaRequest,\n CreateSchemaResponse,\n CreateTableRequest,\n CreateTableResponse,\n DeleteTableResponse,\n ListSchemasResponse,\n ListTablesResponse,\n CreateColumnRequest,\n} from './types'\n\n/**\n * DDL (Data Definition Language) Manager\n *\n * Provides methods for managing database schemas and tables programmatically.\n * This includes creating schemas, creating tables with custom columns, listing\n * schemas and tables, and deleting tables.\n *\n * @example\n * ```typescript\n * const ddl = client.admin.ddl\n *\n * // Create a new schema\n * await ddl.createSchema('analytics')\n *\n * // Create a table with columns\n * await ddl.createTable('analytics', 'events', [\n * { name: 'id', type: 'UUID', primaryKey: true, defaultValue: 'gen_random_uuid()' },\n * { name: 'user_id', type: 'UUID', nullable: false },\n * { name: 'event_name', type: 'TEXT', nullable: false },\n * { name: 'event_data', type: 'JSONB' },\n * { name: 'created_at', type: 'TIMESTAMPTZ', defaultValue: 'NOW()' }\n * ])\n *\n * // List all schemas\n * const { schemas } = await ddl.listSchemas()\n *\n * // List all tables in a schema\n * const { tables } = await ddl.listTables('analytics')\n *\n * // Delete a table\n * await ddl.deleteTable('analytics', 'events')\n * ```\n */\nexport class DDLManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Create a new database schema\n *\n * Creates a new schema in the database. Schemas are used to organize tables\n * into logical groups and provide namespace isolation.\n *\n * @param name - Schema name (must be valid PostgreSQL identifier)\n * @returns Promise resolving to CreateSchemaResponse\n *\n * @example\n * ```typescript\n * // Create a schema for analytics data\n * const result = await client.admin.ddl.createSchema('analytics')\n * console.log(result.message) // \"Schema created successfully\"\n * console.log(result.schema) // \"analytics\"\n * ```\n */\n async createSchema(name: string): Promise<CreateSchemaResponse> {\n const request: CreateSchemaRequest = { name }\n return await this.fetch.post<CreateSchemaResponse>('/api/v1/admin/ddl/schemas', request)\n }\n\n /**\n * List all database schemas\n *\n * Retrieves a list of all schemas in the database. This includes both\n * system schemas (like 'public', 'pg_catalog') and user-created schemas.\n *\n * @returns Promise resolving to ListSchemasResponse\n *\n * @example\n * ```typescript\n * const { schemas } = await client.admin.ddl.listSchemas()\n *\n * schemas.forEach(schema => {\n * console.log(`Schema: ${schema.name}, Owner: ${schema.owner}`)\n * })\n * ```\n */\n async listSchemas(): Promise<ListSchemasResponse> {\n return await this.fetch.get<ListSchemasResponse>('/api/v1/admin/ddl/schemas')\n }\n\n /**\n * Create a new table in a schema\n *\n * Creates a new table with the specified columns. Supports various column\n * options including primary keys, nullability, data types, and default values.\n *\n * @param schema - Schema name where the table will be created\n * @param name - Table name (must be valid PostgreSQL identifier)\n * @param columns - Array of column definitions\n * @returns Promise resolving to CreateTableResponse\n *\n * @example\n * ```typescript\n * // Create a users table\n * await client.admin.ddl.createTable('public', 'users', [\n * {\n * name: 'id',\n * type: 'UUID',\n * primaryKey: true,\n * defaultValue: 'gen_random_uuid()'\n * },\n * {\n * name: 'email',\n * type: 'TEXT',\n * nullable: false\n * },\n * {\n * name: 'name',\n * type: 'TEXT'\n * },\n * {\n * name: 'created_at',\n * type: 'TIMESTAMPTZ',\n * nullable: false,\n * defaultValue: 'NOW()'\n * }\n * ])\n * ```\n *\n * @example\n * ```typescript\n * // Create a products table with JSONB metadata\n * await client.admin.ddl.createTable('public', 'products', [\n * { name: 'id', type: 'SERIAL', primaryKey: true },\n * { name: 'name', type: 'TEXT', nullable: false },\n * { name: 'price', type: 'DECIMAL(10,2)', nullable: false },\n * { name: 'metadata', type: 'JSONB' },\n * { name: 'in_stock', type: 'BOOLEAN', defaultValue: 'true' }\n * ])\n * ```\n */\n async createTable(schema: string, name: string, columns: CreateColumnRequest[]): Promise<CreateTableResponse> {\n const request: CreateTableRequest = { schema, name, columns }\n return await this.fetch.post<CreateTableResponse>('/api/v1/admin/ddl/tables', request)\n }\n\n /**\n * List all tables in the database or a specific schema\n *\n * Retrieves a list of all tables. If a schema is specified, only tables\n * from that schema are returned. Otherwise, all tables from all schemas\n * are returned.\n *\n * @param schema - Optional schema name to filter tables\n * @returns Promise resolving to ListTablesResponse\n *\n * @example\n * ```typescript\n * // List all tables in the public schema\n * const { tables } = await client.admin.ddl.listTables('public')\n *\n * tables.forEach(table => {\n * console.log(`Table: ${table.schema}.${table.name}`)\n * table.columns?.forEach(col => {\n * console.log(` - ${col.name}: ${col.type}`)\n * })\n * })\n * ```\n *\n * @example\n * ```typescript\n * // List all tables across all schemas\n * const { tables } = await client.admin.ddl.listTables()\n *\n * const tablesBySchema = tables.reduce((acc, table) => {\n * if (!acc[table.schema]) acc[table.schema] = []\n * acc[table.schema].push(table.name)\n * return acc\n * }, {} as Record<string, string[]>)\n *\n * console.log(tablesBySchema)\n * ```\n */\n async listTables(schema?: string): Promise<ListTablesResponse> {\n const params = schema ? `?schema=${encodeURIComponent(schema)}` : ''\n return await this.fetch.get<ListTablesResponse>(`/api/v1/admin/ddl/tables${params}`)\n }\n\n /**\n * Delete a table from a schema\n *\n * Permanently deletes a table and all its data. This operation cannot be undone.\n *\n * @param schema - Schema name containing the table\n * @param name - Table name to delete\n * @returns Promise resolving to DeleteTableResponse\n *\n * @example\n * ```typescript\n * // Delete a table\n * const result = await client.admin.ddl.deleteTable('public', 'old_data')\n * console.log(result.message) // \"Table deleted successfully\"\n * ```\n *\n * @example\n * ```typescript\n * // Safe deletion with confirmation\n * const confirm = await askUser('Are you sure you want to delete this table?')\n * if (confirm) {\n * await client.admin.ddl.deleteTable('analytics', 'events')\n * console.log('Table deleted')\n * }\n * ```\n */\n async deleteTable(schema: string, name: string): Promise<DeleteTableResponse> {\n return await this.fetch.delete<DeleteTableResponse>(\n `/api/v1/admin/ddl/tables/${encodeURIComponent(schema)}/${encodeURIComponent(name)}`\n )\n }\n}\n","import type { FluxbaseFetch } from './fetch'\nimport type {\n OAuthProvider,\n CreateOAuthProviderRequest,\n CreateOAuthProviderResponse,\n UpdateOAuthProviderRequest,\n UpdateOAuthProviderResponse,\n DeleteOAuthProviderResponse,\n AuthSettings,\n UpdateAuthSettingsRequest,\n UpdateAuthSettingsResponse,\n} from './types'\n\n/**\n * OAuth Provider Manager\n *\n * Manages OAuth provider configurations for third-party authentication.\n * Supports both built-in providers (Google, GitHub, etc.) and custom OAuth2 providers.\n *\n * @example\n * ```typescript\n * const oauth = client.admin.oauth\n *\n * // List all OAuth providers\n * const { providers } = await oauth.listProviders()\n *\n * // Create a new provider\n * await oauth.createProvider({\n * provider_name: 'github',\n * display_name: 'GitHub',\n * enabled: true,\n * client_id: 'your-client-id',\n * client_secret: 'your-client-secret',\n * redirect_url: 'https://yourapp.com/auth/callback',\n * scopes: ['user:email', 'read:user'],\n * is_custom: false\n * })\n *\n * // Update a provider\n * await oauth.updateProvider('provider-id', {\n * enabled: false\n * })\n *\n * // Delete a provider\n * await oauth.deleteProvider('provider-id')\n * ```\n */\nexport class OAuthProviderManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * List all OAuth providers\n *\n * Retrieves all configured OAuth providers including both enabled and disabled providers.\n * Note: Client secrets are not included in the response for security reasons.\n *\n * @returns Promise resolving to ListOAuthProvidersResponse\n *\n * @example\n * ```typescript\n * const { providers } = await client.admin.oauth.listProviders()\n *\n * providers.forEach(provider => {\n * console.log(`${provider.display_name}: ${provider.enabled ? 'enabled' : 'disabled'}`)\n * })\n * ```\n */\n async listProviders(): Promise<OAuthProvider[]> {\n const providers = await this.fetch.get<OAuthProvider[]>('/api/v1/admin/oauth/providers')\n return Array.isArray(providers) ? providers : []\n }\n\n /**\n * Get a specific OAuth provider by ID\n *\n * Retrieves detailed configuration for a single OAuth provider.\n * Note: Client secret is not included in the response.\n *\n * @param providerId - Provider ID (UUID)\n * @returns Promise resolving to OAuthProvider\n *\n * @example\n * ```typescript\n * const provider = await client.admin.oauth.getProvider('provider-uuid')\n *\n * console.log('Provider:', provider.display_name)\n * console.log('Scopes:', provider.scopes.join(', '))\n * console.log('Redirect URL:', provider.redirect_url)\n * ```\n */\n async getProvider(providerId: string): Promise<OAuthProvider> {\n return await this.fetch.get<OAuthProvider>(`/api/v1/admin/oauth/providers/${providerId}`)\n }\n\n /**\n * Create a new OAuth provider\n *\n * Creates a new OAuth provider configuration. For built-in providers (Google, GitHub, etc.),\n * set `is_custom` to false. For custom OAuth2 providers, set `is_custom` to true and provide\n * the authorization, token, and user info URLs.\n *\n * @param request - OAuth provider configuration\n * @returns Promise resolving to CreateOAuthProviderResponse\n *\n * @example\n * ```typescript\n * // Create GitHub provider\n * const result = await client.admin.oauth.createProvider({\n * provider_name: 'github',\n * display_name: 'GitHub',\n * enabled: true,\n * client_id: process.env.GITHUB_CLIENT_ID,\n * client_secret: process.env.GITHUB_CLIENT_SECRET,\n * redirect_url: 'https://yourapp.com/auth/callback',\n * scopes: ['user:email', 'read:user'],\n * is_custom: false\n * })\n *\n * console.log('Provider created:', result.id)\n * ```\n *\n * @example\n * ```typescript\n * // Create custom OAuth2 provider\n * await client.admin.oauth.createProvider({\n * provider_name: 'custom_sso',\n * display_name: 'Custom SSO',\n * enabled: true,\n * client_id: 'client-id',\n * client_secret: 'client-secret',\n * redirect_url: 'https://yourapp.com/auth/callback',\n * scopes: ['openid', 'profile', 'email'],\n * is_custom: true,\n * authorization_url: 'https://sso.example.com/oauth/authorize',\n * token_url: 'https://sso.example.com/oauth/token',\n * user_info_url: 'https://sso.example.com/oauth/userinfo'\n * })\n * ```\n */\n async createProvider(request: CreateOAuthProviderRequest): Promise<CreateOAuthProviderResponse> {\n return await this.fetch.post<CreateOAuthProviderResponse>('/api/v1/admin/oauth/providers', request)\n }\n\n /**\n * Update an existing OAuth provider\n *\n * Updates an OAuth provider configuration. All fields are optional - only provided fields\n * will be updated. To update the client secret, provide a non-empty value.\n *\n * @param providerId - Provider ID (UUID)\n * @param request - Fields to update\n * @returns Promise resolving to UpdateOAuthProviderResponse\n *\n * @example\n * ```typescript\n * // Disable a provider\n * await client.admin.oauth.updateProvider('provider-id', {\n * enabled: false\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Update scopes and redirect URL\n * await client.admin.oauth.updateProvider('provider-id', {\n * scopes: ['user:email', 'read:user', 'read:org'],\n * redirect_url: 'https://newdomain.com/auth/callback'\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Rotate client secret\n * await client.admin.oauth.updateProvider('provider-id', {\n * client_id: 'new-client-id',\n * client_secret: 'new-client-secret'\n * })\n * ```\n */\n async updateProvider(\n providerId: string,\n request: UpdateOAuthProviderRequest\n ): Promise<UpdateOAuthProviderResponse> {\n return await this.fetch.put<UpdateOAuthProviderResponse>(\n `/api/v1/admin/oauth/providers/${providerId}`,\n request\n )\n }\n\n /**\n * Delete an OAuth provider\n *\n * Permanently deletes an OAuth provider configuration. This will prevent users from\n * authenticating with this provider.\n *\n * @param providerId - Provider ID (UUID) to delete\n * @returns Promise resolving to DeleteOAuthProviderResponse\n *\n * @example\n * ```typescript\n * await client.admin.oauth.deleteProvider('provider-id')\n * console.log('Provider deleted')\n * ```\n *\n * @example\n * ```typescript\n * // Safe deletion with confirmation\n * const provider = await client.admin.oauth.getProvider('provider-id')\n * const confirmed = await confirm(`Delete ${provider.display_name}?`)\n *\n * if (confirmed) {\n * await client.admin.oauth.deleteProvider('provider-id')\n * }\n * ```\n */\n async deleteProvider(providerId: string): Promise<DeleteOAuthProviderResponse> {\n return await this.fetch.delete<DeleteOAuthProviderResponse>(\n `/api/v1/admin/oauth/providers/${providerId}`\n )\n }\n\n /**\n * Enable an OAuth provider\n *\n * Convenience method to enable a provider.\n *\n * @param providerId - Provider ID (UUID)\n * @returns Promise resolving to UpdateOAuthProviderResponse\n *\n * @example\n * ```typescript\n * await client.admin.oauth.enableProvider('provider-id')\n * ```\n */\n async enableProvider(providerId: string): Promise<UpdateOAuthProviderResponse> {\n return await this.updateProvider(providerId, { enabled: true })\n }\n\n /**\n * Disable an OAuth provider\n *\n * Convenience method to disable a provider.\n *\n * @param providerId - Provider ID (UUID)\n * @returns Promise resolving to UpdateOAuthProviderResponse\n *\n * @example\n * ```typescript\n * await client.admin.oauth.disableProvider('provider-id')\n * ```\n */\n async disableProvider(providerId: string): Promise<UpdateOAuthProviderResponse> {\n return await this.updateProvider(providerId, { enabled: false })\n }\n}\n\n/**\n * Authentication Settings Manager\n *\n * Manages global authentication settings including password requirements, session timeouts,\n * and signup configuration.\n *\n * @example\n * ```typescript\n * const authSettings = client.admin.authSettings\n *\n * // Get current settings\n * const settings = await authSettings.get()\n *\n * // Update settings\n * await authSettings.update({\n * password_min_length: 12,\n * password_require_uppercase: true,\n * session_timeout_minutes: 120\n * })\n * ```\n */\nexport class AuthSettingsManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Get current authentication settings\n *\n * Retrieves all authentication configuration settings.\n *\n * @returns Promise resolving to AuthSettings\n *\n * @example\n * ```typescript\n * const settings = await client.admin.authSettings.get()\n *\n * console.log('Password min length:', settings.password_min_length)\n * console.log('Signup enabled:', settings.enable_signup)\n * console.log('Session timeout:', settings.session_timeout_minutes, 'minutes')\n * ```\n */\n async get(): Promise<AuthSettings> {\n return await this.fetch.get<AuthSettings>('/api/v1/admin/auth/settings')\n }\n\n /**\n * Update authentication settings\n *\n * Updates one or more authentication settings. All fields are optional - only provided\n * fields will be updated.\n *\n * @param request - Settings to update\n * @returns Promise resolving to UpdateAuthSettingsResponse\n *\n * @example\n * ```typescript\n * // Strengthen password requirements\n * await client.admin.authSettings.update({\n * password_min_length: 16,\n * password_require_uppercase: true,\n * password_require_lowercase: true,\n * password_require_number: true,\n * password_require_special: true\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Extend session timeout\n * await client.admin.authSettings.update({\n * session_timeout_minutes: 240,\n * max_sessions_per_user: 10\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Disable email verification during development\n * await client.admin.authSettings.update({\n * require_email_verification: false\n * })\n * ```\n */\n async update(request: UpdateAuthSettingsRequest): Promise<UpdateAuthSettingsResponse> {\n return await this.fetch.put<UpdateAuthSettingsResponse>('/api/v1/admin/auth/settings', request)\n }\n}\n\n/**\n * OAuth Configuration Manager\n *\n * Root manager providing access to OAuth provider and authentication settings management.\n *\n * @example\n * ```typescript\n * const oauth = client.admin.oauth\n *\n * // Manage OAuth providers\n * const providers = await oauth.providers.listProviders()\n *\n * // Manage auth settings\n * const settings = await oauth.authSettings.get()\n * ```\n */\nexport class FluxbaseOAuth {\n public providers: OAuthProviderManager\n public authSettings: AuthSettingsManager\n\n constructor(fetch: FluxbaseFetch) {\n this.providers = new OAuthProviderManager(fetch)\n this.authSettings = new AuthSettingsManager(fetch)\n }\n}\n","import type { FluxbaseFetch } from './fetch'\nimport type {\n ImpersonateUserRequest,\n ImpersonateAnonRequest,\n ImpersonateServiceRequest,\n StartImpersonationResponse,\n StopImpersonationResponse,\n GetImpersonationResponse,\n ListImpersonationSessionsOptions,\n ListImpersonationSessionsResponse,\n} from './types'\n\n/**\n * Impersonation Manager\n *\n * Manages user impersonation for debugging, testing RLS policies, and customer support.\n * Allows admins to view data as different users, anonymous visitors, or with service role permissions.\n *\n * All impersonation sessions are logged in the audit trail for security and compliance.\n *\n * @example\n * ```typescript\n * const impersonation = client.admin.impersonation\n *\n * // Impersonate a specific user\n * const { session, access_token } = await impersonation.impersonateUser({\n * target_user_id: 'user-uuid',\n * reason: 'Support ticket #1234'\n * })\n *\n * // Impersonate anonymous user\n * await impersonation.impersonateAnon({\n * reason: 'Testing public data access'\n * })\n *\n * // Impersonate with service role\n * await impersonation.impersonateService({\n * reason: 'Administrative query'\n * })\n *\n * // Stop impersonation\n * await impersonation.stop()\n * ```\n */\nexport class ImpersonationManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Impersonate a specific user\n *\n * Start an impersonation session as a specific user. This allows you to see data\n * exactly as that user would see it, respecting all RLS policies and permissions.\n *\n * @param request - Impersonation request with target user ID and reason\n * @returns Promise resolving to impersonation session with access token\n *\n * @example\n * ```typescript\n * const result = await client.admin.impersonation.impersonateUser({\n * target_user_id: 'user-123',\n * reason: 'Support ticket #5678 - user reports missing data'\n * })\n *\n * console.log('Impersonating:', result.target_user.email)\n * console.log('Session ID:', result.session.id)\n *\n * // Use the access token for subsequent requests\n * // (typically handled automatically by the SDK)\n * ```\n */\n async impersonateUser(request: ImpersonateUserRequest): Promise<StartImpersonationResponse> {\n return await this.fetch.post<StartImpersonationResponse>('/api/v1/auth/impersonate', request)\n }\n\n /**\n * Impersonate anonymous user\n *\n * Start an impersonation session as an unauthenticated user. This allows you to see\n * what data is publicly accessible and test RLS policies for anonymous access.\n *\n * @param request - Impersonation request with reason\n * @returns Promise resolving to impersonation session with access token\n *\n * @example\n * ```typescript\n * await client.admin.impersonation.impersonateAnon({\n * reason: 'Testing public data access for blog posts'\n * })\n *\n * // Now all queries will use anonymous permissions\n * const publicPosts = await client.from('posts').select('*')\n * console.log('Public posts:', publicPosts.length)\n * ```\n */\n async impersonateAnon(request: ImpersonateAnonRequest): Promise<StartImpersonationResponse> {\n return await this.fetch.post<StartImpersonationResponse>('/api/v1/auth/impersonate/anon', request)\n }\n\n /**\n * Impersonate with service role\n *\n * Start an impersonation session with service-level permissions. This provides elevated\n * access that may bypass RLS policies, useful for administrative operations.\n *\n * @param request - Impersonation request with reason\n * @returns Promise resolving to impersonation session with access token\n *\n * @example\n * ```typescript\n * await client.admin.impersonation.impersonateService({\n * reason: 'Administrative data cleanup'\n * })\n *\n * // Now all queries will use service role permissions\n * const allRecords = await client.from('sensitive_data').select('*')\n * console.log('All records:', allRecords.length)\n * ```\n */\n async impersonateService(request: ImpersonateServiceRequest): Promise<StartImpersonationResponse> {\n return await this.fetch.post<StartImpersonationResponse>('/api/v1/auth/impersonate/service', request)\n }\n\n /**\n * Stop impersonation\n *\n * Ends the current impersonation session and returns to admin context.\n * The session is marked as ended in the audit trail.\n *\n * @returns Promise resolving to stop confirmation\n *\n * @example\n * ```typescript\n * await client.admin.impersonation.stop()\n * console.log('Impersonation ended')\n *\n * // Subsequent queries will use admin permissions\n * ```\n */\n async stop(): Promise<StopImpersonationResponse> {\n return await this.fetch.delete<StopImpersonationResponse>('/api/v1/auth/impersonate')\n }\n\n /**\n * Get current impersonation session\n *\n * Retrieves information about the active impersonation session, if any.\n *\n * @returns Promise resolving to current impersonation session or null\n *\n * @example\n * ```typescript\n * const current = await client.admin.impersonation.getCurrent()\n *\n * if (current.session) {\n * console.log('Currently impersonating:', current.target_user?.email)\n * console.log('Reason:', current.session.reason)\n * console.log('Started:', current.session.started_at)\n * } else {\n * console.log('No active impersonation')\n * }\n * ```\n */\n async getCurrent(): Promise<GetImpersonationResponse> {\n return await this.fetch.get<GetImpersonationResponse>('/api/v1/auth/impersonate')\n }\n\n /**\n * List impersonation sessions (audit trail)\n *\n * Retrieves a list of impersonation sessions for audit and compliance purposes.\n * Can be filtered by admin user, target user, type, and active status.\n *\n * @param options - Filter and pagination options\n * @returns Promise resolving to list of impersonation sessions\n *\n * @example\n * ```typescript\n * // List all sessions\n * const { sessions, total } = await client.admin.impersonation.listSessions()\n * console.log(`Total sessions: ${total}`)\n *\n * // List active sessions only\n * const active = await client.admin.impersonation.listSessions({\n * is_active: true\n * })\n * console.log('Active sessions:', active.sessions.length)\n *\n * // List sessions for a specific admin\n * const adminSessions = await client.admin.impersonation.listSessions({\n * admin_user_id: 'admin-uuid',\n * limit: 50\n * })\n *\n * // List user impersonation sessions only\n * const userSessions = await client.admin.impersonation.listSessions({\n * impersonation_type: 'user',\n * offset: 0,\n * limit: 100\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Audit trail: Find who impersonated a specific user\n * const userHistory = await client.admin.impersonation.listSessions({\n * target_user_id: 'user-uuid'\n * })\n *\n * userHistory.sessions.forEach(session => {\n * console.log(`Admin ${session.admin_user_id} impersonated user`)\n * console.log(`Reason: ${session.reason}`)\n * console.log(`Duration: ${session.started_at} - ${session.ended_at}`)\n * })\n * ```\n */\n async listSessions(options: ListImpersonationSessionsOptions = {}): Promise<ListImpersonationSessionsResponse> {\n const params = new URLSearchParams()\n\n if (options.limit !== undefined) {\n params.append('limit', String(options.limit))\n }\n if (options.offset !== undefined) {\n params.append('offset', String(options.offset))\n }\n if (options.admin_user_id) {\n params.append('admin_user_id', options.admin_user_id)\n }\n if (options.target_user_id) {\n params.append('target_user_id', options.target_user_id)\n }\n if (options.impersonation_type) {\n params.append('impersonation_type', options.impersonation_type)\n }\n if (options.is_active !== undefined) {\n params.append('is_active', String(options.is_active))\n }\n\n const queryString = params.toString()\n const url = queryString ? `/api/v1/auth/impersonate/sessions?${queryString}` : '/api/v1/auth/impersonate/sessions'\n\n return await this.fetch.get<ListImpersonationSessionsResponse>(url)\n }\n}\n","import type { FluxbaseFetch } from './fetch'\nimport type {\n // API Keys\n APIKey,\n CreateAPIKeyRequest,\n CreateAPIKeyResponse,\n DeleteAPIKeyResponse,\n ListAPIKeysResponse,\n RevokeAPIKeyResponse,\n UpdateAPIKeyRequest,\n // Webhooks\n CreateWebhookRequest,\n DeleteWebhookResponse,\n ListWebhookDeliveriesResponse,\n ListWebhooksResponse,\n TestWebhookResponse,\n UpdateWebhookRequest,\n Webhook,\n // Invitations\n AcceptInvitationRequest,\n AcceptInvitationResponse,\n CreateInvitationRequest,\n CreateInvitationResponse,\n ListInvitationsOptions,\n ListInvitationsResponse,\n RevokeInvitationResponse,\n ValidateInvitationResponse,\n} from './types'\n\n/**\n * API Keys management client\n *\n * Provides methods for managing API keys for service-to-service authentication.\n * API keys allow external services to authenticate without user credentials.\n *\n * @example\n * ```typescript\n * const client = createClient({ url: 'http://localhost:8080' })\n * await client.auth.login({ email: 'user@example.com', password: 'password' })\n *\n * // Create an API key\n * const { api_key, key } = await client.management.apiKeys.create({\n * name: 'Production Service',\n * scopes: ['read:users', 'write:users'],\n * rate_limit_per_minute: 100\n * })\n *\n * // List API keys\n * const { api_keys } = await client.management.apiKeys.list()\n * ```\n *\n * @category Management\n */\nexport class APIKeysManager {\n private fetch: FluxbaseFetch\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch\n }\n\n /**\n * Create a new API key\n *\n * @param request - API key configuration\n * @returns Created API key with the full key value (only shown once)\n *\n * @example\n * ```typescript\n * const { api_key, key } = await client.management.apiKeys.create({\n * name: 'Production Service',\n * description: 'API key for production service',\n * scopes: ['read:users', 'write:users'],\n * rate_limit_per_minute: 100,\n * expires_at: '2025-12-31T23:59:59Z'\n * })\n *\n * // Store the key securely - it won't be shown again\n * console.log('API Key:', key)\n * ```\n */\n async create(request: CreateAPIKeyRequest): Promise<CreateAPIKeyResponse> {\n return await this.fetch.post<CreateAPIKeyResponse>('/api/v1/api-keys', request)\n }\n\n /**\n * List all API keys for the authenticated user\n *\n * @returns List of API keys (without full key values)\n *\n * @example\n * ```typescript\n * const { api_keys, total } = await client.management.apiKeys.list()\n *\n * api_keys.forEach(key => {\n * console.log(`${key.name}: ${key.key_prefix}... (expires: ${key.expires_at})`)\n * })\n * ```\n */\n async list(): Promise<ListAPIKeysResponse> {\n return await this.fetch.get<ListAPIKeysResponse>('/api/v1/api-keys')\n }\n\n /**\n * Get a specific API key by ID\n *\n * @param keyId - API key ID\n * @returns API key details\n *\n * @example\n * ```typescript\n * const apiKey = await client.management.apiKeys.get('key-uuid')\n * console.log('Last used:', apiKey.last_used_at)\n * ```\n */\n async get(keyId: string): Promise<APIKey> {\n return await this.fetch.get<APIKey>(`/api/v1/api-keys/${keyId}`)\n }\n\n /**\n * Update an API key\n *\n * @param keyId - API key ID\n * @param updates - Fields to update\n * @returns Updated API key\n *\n * @example\n * ```typescript\n * const updated = await client.management.apiKeys.update('key-uuid', {\n * name: 'Updated Name',\n * rate_limit_per_minute: 200\n * })\n * ```\n */\n async update(keyId: string, updates: UpdateAPIKeyRequest): Promise<APIKey> {\n return await this.fetch.patch<APIKey>(`/api/v1/api-keys/${keyId}`, updates)\n }\n\n /**\n * Revoke an API key\n *\n * Revoked keys can no longer be used but remain in the system for audit purposes.\n *\n * @param keyId - API key ID\n * @returns Revocation confirmation\n *\n * @example\n * ```typescript\n * await client.management.apiKeys.revoke('key-uuid')\n * console.log('API key revoked')\n * ```\n */\n async revoke(keyId: string): Promise<RevokeAPIKeyResponse> {\n return await this.fetch.post<RevokeAPIKeyResponse>(`/api/v1/api-keys/${keyId}/revoke`, {})\n }\n\n /**\n * Delete an API key\n *\n * Permanently removes the API key from the system.\n *\n * @param keyId - API key ID\n * @returns Deletion confirmation\n *\n * @example\n * ```typescript\n * await client.management.apiKeys.delete('key-uuid')\n * console.log('API key deleted')\n * ```\n */\n async delete(keyId: string): Promise<DeleteAPIKeyResponse> {\n return await this.fetch.delete<DeleteAPIKeyResponse>(`/api/v1/api-keys/${keyId}`)\n }\n}\n\n/**\n * Webhooks management client\n *\n * Provides methods for managing webhooks to receive real-time event notifications.\n * Webhooks allow your application to be notified when events occur in Fluxbase.\n *\n * @example\n * ```typescript\n * const client = createClient({ url: 'http://localhost:8080' })\n * await client.auth.login({ email: 'user@example.com', password: 'password' })\n *\n * // Create a webhook\n * const webhook = await client.management.webhooks.create({\n * url: 'https://myapp.com/webhook',\n * events: ['user.created', 'user.updated'],\n * secret: 'my-webhook-secret'\n * })\n *\n * // Test the webhook\n * const result = await client.management.webhooks.test(webhook.id)\n * ```\n *\n * @category Management\n */\nexport class WebhooksManager {\n private fetch: FluxbaseFetch\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch\n }\n\n /**\n * Create a new webhook\n *\n * @param request - Webhook configuration\n * @returns Created webhook\n *\n * @example\n * ```typescript\n * const webhook = await client.management.webhooks.create({\n * url: 'https://myapp.com/webhook',\n * events: ['user.created', 'user.updated', 'user.deleted'],\n * description: 'User events webhook',\n * secret: 'my-webhook-secret'\n * })\n * ```\n */\n async create(request: CreateWebhookRequest): Promise<Webhook> {\n return await this.fetch.post<Webhook>('/api/v1/webhooks', request)\n }\n\n /**\n * List all webhooks for the authenticated user\n *\n * @returns List of webhooks\n *\n * @example\n * ```typescript\n * const { webhooks, total } = await client.management.webhooks.list()\n *\n * webhooks.forEach(webhook => {\n * console.log(`${webhook.url}: ${webhook.is_active ? 'active' : 'inactive'}`)\n * })\n * ```\n */\n async list(): Promise<ListWebhooksResponse> {\n return await this.fetch.get<ListWebhooksResponse>('/api/v1/webhooks')\n }\n\n /**\n * Get a specific webhook by ID\n *\n * @param webhookId - Webhook ID\n * @returns Webhook details\n *\n * @example\n * ```typescript\n * const webhook = await client.management.webhooks.get('webhook-uuid')\n * console.log('Events:', webhook.events)\n * ```\n */\n async get(webhookId: string): Promise<Webhook> {\n return await this.fetch.get<Webhook>(`/api/v1/webhooks/${webhookId}`)\n }\n\n /**\n * Update a webhook\n *\n * @param webhookId - Webhook ID\n * @param updates - Fields to update\n * @returns Updated webhook\n *\n * @example\n * ```typescript\n * const updated = await client.management.webhooks.update('webhook-uuid', {\n * events: ['user.created', 'user.deleted'],\n * is_active: false\n * })\n * ```\n */\n async update(webhookId: string, updates: UpdateWebhookRequest): Promise<Webhook> {\n return await this.fetch.patch<Webhook>(`/api/v1/webhooks/${webhookId}`, updates)\n }\n\n /**\n * Delete a webhook\n *\n * @param webhookId - Webhook ID\n * @returns Deletion confirmation\n *\n * @example\n * ```typescript\n * await client.management.webhooks.delete('webhook-uuid')\n * console.log('Webhook deleted')\n * ```\n */\n async delete(webhookId: string): Promise<DeleteWebhookResponse> {\n return await this.fetch.delete<DeleteWebhookResponse>(`/api/v1/webhooks/${webhookId}`)\n }\n\n /**\n * Test a webhook by sending a test payload\n *\n * @param webhookId - Webhook ID\n * @returns Test result with status and response\n *\n * @example\n * ```typescript\n * const result = await client.management.webhooks.test('webhook-uuid')\n *\n * if (result.success) {\n * console.log('Webhook test successful')\n * } else {\n * console.error('Webhook test failed:', result.error)\n * }\n * ```\n */\n async test(webhookId: string): Promise<TestWebhookResponse> {\n return await this.fetch.post<TestWebhookResponse>(`/api/v1/webhooks/${webhookId}/test`, {})\n }\n\n /**\n * List webhook delivery history\n *\n * @param webhookId - Webhook ID\n * @param limit - Maximum number of deliveries to return (default: 50)\n * @returns List of webhook deliveries\n *\n * @example\n * ```typescript\n * const { deliveries } = await client.management.webhooks.listDeliveries('webhook-uuid', 100)\n *\n * deliveries.forEach(delivery => {\n * console.log(`Event: ${delivery.event}, Status: ${delivery.status_code}`)\n * })\n * ```\n */\n async listDeliveries(webhookId: string, limit: number = 50): Promise<ListWebhookDeliveriesResponse> {\n return await this.fetch.get<ListWebhookDeliveriesResponse>(\n `/api/v1/webhooks/${webhookId}/deliveries?limit=${limit}`,\n )\n }\n}\n\n/**\n * Invitations management client\n *\n * Provides methods for creating and managing user invitations.\n * Invitations allow admins to invite new users to join the dashboard.\n *\n * @example\n * ```typescript\n * const client = createClient({ url: 'http://localhost:8080' })\n * await client.admin.login({ email: 'admin@example.com', password: 'password' })\n *\n * // Create an invitation\n * const invitation = await client.management.invitations.create({\n * email: 'newuser@example.com',\n * role: 'dashboard_user'\n * })\n *\n * console.log('Invite link:', invitation.invite_link)\n * ```\n *\n * @category Management\n */\nexport class InvitationsManager {\n private fetch: FluxbaseFetch\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch\n }\n\n /**\n * Create a new invitation (admin only)\n *\n * @param request - Invitation details\n * @returns Created invitation with invite link\n *\n * @example\n * ```typescript\n * const invitation = await client.management.invitations.create({\n * email: 'newuser@example.com',\n * role: 'dashboard_user',\n * expiry_duration: 604800 // 7 days in seconds\n * })\n *\n * // Share the invite link\n * console.log('Send this link to the user:', invitation.invite_link)\n * ```\n */\n async create(request: CreateInvitationRequest): Promise<CreateInvitationResponse> {\n return await this.fetch.post<CreateInvitationResponse>('/api/v1/admin/invitations', request)\n }\n\n /**\n * List all invitations (admin only)\n *\n * @param options - Filter options\n * @returns List of invitations\n *\n * @example\n * ```typescript\n * // List pending invitations only\n * const { invitations } = await client.management.invitations.list({\n * include_accepted: false,\n * include_expired: false\n * })\n *\n * // List all invitations including accepted and expired\n * const all = await client.management.invitations.list({\n * include_accepted: true,\n * include_expired: true\n * })\n * ```\n */\n async list(options: ListInvitationsOptions = {}): Promise<ListInvitationsResponse> {\n const params = new URLSearchParams()\n\n if (options.include_accepted !== undefined) {\n params.append('include_accepted', String(options.include_accepted))\n }\n if (options.include_expired !== undefined) {\n params.append('include_expired', String(options.include_expired))\n }\n\n const queryString = params.toString()\n const url = queryString ? `/api/v1/admin/invitations?${queryString}` : '/api/v1/admin/invitations'\n\n return await this.fetch.get<ListInvitationsResponse>(url)\n }\n\n /**\n * Validate an invitation token (public endpoint)\n *\n * @param token - Invitation token\n * @returns Validation result with invitation details\n *\n * @example\n * ```typescript\n * const result = await client.management.invitations.validate('invitation-token')\n *\n * if (result.valid) {\n * console.log('Valid invitation for:', result.invitation?.email)\n * } else {\n * console.error('Invalid:', result.error)\n * }\n * ```\n */\n async validate(token: string): Promise<ValidateInvitationResponse> {\n return await this.fetch.get<ValidateInvitationResponse>(`/api/v1/invitations/${token}/validate`)\n }\n\n /**\n * Accept an invitation and create a new user (public endpoint)\n *\n * @param token - Invitation token\n * @param request - User details (password and name)\n * @returns Created user with authentication tokens\n *\n * @example\n * ```typescript\n * const response = await client.management.invitations.accept('invitation-token', {\n * password: 'SecurePassword123!',\n * name: 'John Doe'\n * })\n *\n * // Store tokens\n * localStorage.setItem('access_token', response.access_token)\n * console.log('Welcome:', response.user.name)\n * ```\n */\n async accept(token: string, request: AcceptInvitationRequest): Promise<AcceptInvitationResponse> {\n return await this.fetch.post<AcceptInvitationResponse>(`/api/v1/invitations/${token}/accept`, request)\n }\n\n /**\n * Revoke an invitation (admin only)\n *\n * @param token - Invitation token\n * @returns Revocation confirmation\n *\n * @example\n * ```typescript\n * await client.management.invitations.revoke('invitation-token')\n * console.log('Invitation revoked')\n * ```\n */\n async revoke(token: string): Promise<RevokeInvitationResponse> {\n return await this.fetch.delete<RevokeInvitationResponse>(`/api/v1/admin/invitations/${token}`)\n }\n}\n\n/**\n * Management client for API keys, webhooks, and invitations\n *\n * @category Management\n */\nexport class FluxbaseManagement {\n /** API Keys management */\n public apiKeys: APIKeysManager\n\n /** Webhooks management */\n public webhooks: WebhooksManager\n\n /** Invitations management */\n public invitations: InvitationsManager\n\n constructor(fetch: FluxbaseFetch) {\n this.apiKeys = new APIKeysManager(fetch)\n this.webhooks = new WebhooksManager(fetch)\n this.invitations = new InvitationsManager(fetch)\n }\n}\n","import type { FluxbaseFetch } from \"./fetch\";\nimport type {\n AdminAuthResponse,\n AdminLoginRequest,\n AdminMeResponse,\n AdminRefreshRequest,\n AdminRefreshResponse,\n AdminSetupRequest,\n AdminSetupStatusResponse,\n DeleteUserResponse,\n EnrichedUser,\n InviteUserRequest,\n InviteUserResponse,\n ListUsersOptions,\n ListUsersResponse,\n ResetUserPasswordResponse,\n DataResponse,\n VoidResponse,\n} from \"./types\";\nimport { wrapAsync, wrapAsyncVoid } from \"./utils/error-handling\";\nimport { FluxbaseSettings, EmailTemplateManager } from \"./settings\";\nimport { DDLManager } from \"./ddl\";\nimport { FluxbaseOAuth } from \"./oauth\";\nimport { ImpersonationManager } from \"./impersonation\";\nimport { FluxbaseManagement } from \"./management\";\n\n/**\n * Admin client for managing Fluxbase instance\n */\nexport class FluxbaseAdmin {\n private fetch: FluxbaseFetch;\n private adminToken: string | null = null;\n\n /**\n * Settings manager for system and application settings\n */\n public settings: FluxbaseSettings;\n\n /**\n * DDL manager for database schema and table operations\n */\n public ddl: DDLManager;\n\n /**\n * OAuth configuration manager for provider and auth settings\n */\n public oauth: FluxbaseOAuth;\n\n /**\n * Impersonation manager for user impersonation and audit trail\n */\n public impersonation: ImpersonationManager;\n\n /**\n * Management namespace for API keys, webhooks, and invitations\n */\n public management: FluxbaseManagement;\n\n /**\n * Email template manager for customizing authentication and notification emails\n */\n public emailTemplates: EmailTemplateManager;\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch;\n this.settings = new FluxbaseSettings(fetch);\n this.ddl = new DDLManager(fetch);\n this.oauth = new FluxbaseOAuth(fetch);\n this.impersonation = new ImpersonationManager(fetch);\n this.management = new FluxbaseManagement(fetch);\n this.emailTemplates = new EmailTemplateManager(fetch);\n }\n\n /**\n * Set admin authentication token\n */\n setToken(token: string) {\n this.adminToken = token;\n this.fetch.setAuthToken(token);\n }\n\n /**\n * Get current admin token\n */\n getToken(): string | null {\n return this.adminToken;\n }\n\n /**\n * Clear admin token\n */\n clearToken() {\n this.adminToken = null;\n this.fetch.setAuthToken(null);\n }\n\n // ============================================================================\n // Admin Authentication\n // ============================================================================\n\n /**\n * Check if initial admin setup is needed\n *\n * @returns Setup status indicating if initial setup is required\n *\n * @example\n * ```typescript\n * const status = await admin.getSetupStatus();\n * if (status.needs_setup) {\n * console.log('Initial setup required');\n * }\n * ```\n */\n async getSetupStatus(): Promise<DataResponse<AdminSetupStatusResponse>> {\n return wrapAsync(async () => {\n return await this.fetch.get<AdminSetupStatusResponse>(\n \"/api/v1/admin/setup/status\",\n );\n });\n }\n\n /**\n * Perform initial admin setup\n *\n * Creates the first admin user and completes initial setup.\n * This endpoint can only be called once.\n *\n * @param email - Admin email address\n * @param password - Admin password (minimum 12 characters)\n * @param name - Admin display name\n * @returns Authentication response with tokens\n *\n * @example\n * ```typescript\n * const response = await admin.setup({\n * email: 'admin@example.com',\n * password: 'SecurePassword123!',\n * name: 'Admin User'\n * });\n *\n * // Store tokens\n * localStorage.setItem('admin_token', response.access_token);\n * ```\n */\n async setup(request: AdminSetupRequest): Promise<DataResponse<AdminAuthResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AdminAuthResponse>(\n \"/api/v1/admin/setup\",\n request,\n );\n this.setToken(response.access_token);\n return response;\n });\n }\n\n /**\n * Admin login\n *\n * Authenticate as an admin user\n *\n * @param email - Admin email\n * @param password - Admin password\n * @returns Authentication response with tokens\n *\n * @example\n * ```typescript\n * const response = await admin.login({\n * email: 'admin@example.com',\n * password: 'password123'\n * });\n *\n * // Token is automatically set in the client\n * console.log('Logged in as:', response.user.email);\n * ```\n */\n async login(request: AdminLoginRequest): Promise<DataResponse<AdminAuthResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AdminAuthResponse>(\n \"/api/v1/admin/login\",\n request,\n );\n this.setToken(response.access_token);\n return response;\n });\n }\n\n /**\n * Refresh admin access token\n *\n * @param refreshToken - Refresh token\n * @returns New access and refresh tokens\n *\n * @example\n * ```typescript\n * const refreshToken = localStorage.getItem('admin_refresh_token');\n * const response = await admin.refreshToken({ refresh_token: refreshToken });\n *\n * // Update stored tokens\n * localStorage.setItem('admin_token', response.access_token);\n * localStorage.setItem('admin_refresh_token', response.refresh_token);\n * ```\n */\n async refreshToken(\n request: AdminRefreshRequest,\n ): Promise<DataResponse<AdminRefreshResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AdminRefreshResponse>(\n \"/api/v1/admin/refresh\",\n request,\n );\n this.setToken(response.access_token);\n return response;\n });\n }\n\n /**\n * Admin logout\n *\n * Invalidates the current admin session\n *\n * @example\n * ```typescript\n * await admin.logout();\n * localStorage.removeItem('admin_token');\n * ```\n */\n async logout(): Promise<VoidResponse> {\n return wrapAsyncVoid(async () => {\n await this.fetch.post<{ message: string }>(\"/api/v1/admin/logout\", {});\n this.clearToken();\n });\n }\n\n /**\n * Get current admin user information\n *\n * @returns Current admin user details\n *\n * @example\n * ```typescript\n * const { user } = await admin.me();\n * console.log('Logged in as:', user.email);\n * console.log('Role:', user.role);\n * ```\n */\n async me(): Promise<DataResponse<AdminMeResponse>> {\n return wrapAsync(async () => {\n return await this.fetch.get<AdminMeResponse>(\"/api/v1/admin/me\");\n });\n }\n\n // ============================================================================\n // User Management\n // ============================================================================\n\n /**\n * List all users\n *\n * @param options - Filter and pagination options\n * @returns List of users with metadata\n *\n * @example\n * ```typescript\n * // List all users\n * const { users, total } = await admin.listUsers();\n *\n * // List with filters\n * const result = await admin.listUsers({\n * exclude_admins: true,\n * search: 'john',\n * limit: 50,\n * type: 'app'\n * });\n * ```\n */\n async listUsers(options: ListUsersOptions = {}): Promise<DataResponse<ListUsersResponse>> {\n return wrapAsync(async () => {\n const params = new URLSearchParams();\n\n if (options.exclude_admins !== undefined) {\n params.append(\"exclude_admins\", String(options.exclude_admins));\n }\n if (options.search) {\n params.append(\"search\", options.search);\n }\n if (options.limit !== undefined) {\n params.append(\"limit\", String(options.limit));\n }\n if (options.type) {\n params.append(\"type\", options.type);\n }\n\n const queryString = params.toString();\n const url = queryString\n ? `/api/v1/admin/users?${queryString}`\n : \"/api/v1/admin/users\";\n\n return await this.fetch.get<ListUsersResponse>(url);\n });\n }\n\n /**\n * Get a user by ID\n *\n * Fetch a single user's details by their user ID\n *\n * @param userId - User ID to fetch\n * @param type - User type ('app' or 'dashboard')\n * @returns User details with metadata\n *\n * @example\n * ```typescript\n * // Get an app user\n * const user = await admin.getUserById('user-123');\n *\n * // Get a dashboard user\n * const dashboardUser = await admin.getUserById('admin-456', 'dashboard');\n * console.log('User email:', dashboardUser.email);\n * console.log('Last login:', dashboardUser.last_login_at);\n * ```\n */\n async getUserById(\n userId: string,\n type: \"app\" | \"dashboard\" = \"app\",\n ): Promise<DataResponse<EnrichedUser>> {\n return wrapAsync(async () => {\n const url = `/api/v1/admin/users/${userId}?type=${type}`;\n return await this.fetch.get<EnrichedUser>(url);\n });\n }\n\n /**\n * Invite a new user\n *\n * Creates a new user and optionally sends an invitation email\n *\n * @param request - User invitation details\n * @param type - User type ('app' or 'dashboard')\n * @returns Created user and invitation details\n *\n * @example\n * ```typescript\n * const response = await admin.inviteUser({\n * email: 'newuser@example.com',\n * role: 'user',\n * send_email: true\n * });\n *\n * console.log('User invited:', response.user.email);\n * console.log('Invitation link:', response.invitation_link);\n * ```\n */\n async inviteUser(\n request: InviteUserRequest,\n type: \"app\" | \"dashboard\" = \"app\",\n ): Promise<DataResponse<InviteUserResponse>> {\n return wrapAsync(async () => {\n const url = `/api/v1/admin/users/invite?type=${type}`;\n return await this.fetch.post<InviteUserResponse>(url, request);\n });\n }\n\n /**\n * Delete a user\n *\n * Permanently deletes a user and all associated data\n *\n * @param userId - User ID to delete\n * @param type - User type ('app' or 'dashboard')\n * @returns Deletion confirmation\n *\n * @example\n * ```typescript\n * await admin.deleteUser('user-uuid');\n * console.log('User deleted');\n * ```\n */\n async deleteUser(\n userId: string,\n type: \"app\" | \"dashboard\" = \"app\",\n ): Promise<DataResponse<DeleteUserResponse>> {\n return wrapAsync(async () => {\n const url = `/api/v1/admin/users/${userId}?type=${type}`;\n return await this.fetch.delete<DeleteUserResponse>(url);\n });\n }\n\n /**\n * Update user role\n *\n * Changes a user's role\n *\n * @param userId - User ID\n * @param role - New role\n * @param type - User type ('app' or 'dashboard')\n * @returns Updated user\n *\n * @example\n * ```typescript\n * const user = await admin.updateUserRole('user-uuid', 'admin');\n * console.log('User role updated:', user.role);\n * ```\n */\n async updateUserRole(\n userId: string,\n role: string,\n type: \"app\" | \"dashboard\" = \"app\",\n ): Promise<DataResponse<EnrichedUser>> {\n return wrapAsync(async () => {\n const url = `/api/v1/admin/users/${userId}/role?type=${type}`;\n return await this.fetch.patch<EnrichedUser>(url, { role });\n });\n }\n\n /**\n * Reset user password\n *\n * Generates a new password for the user and optionally sends it via email\n *\n * @param userId - User ID\n * @param type - User type ('app' or 'dashboard')\n * @returns Reset confirmation message\n *\n * @example\n * ```typescript\n * const response = await admin.resetUserPassword('user-uuid');\n * console.log(response.message);\n * ```\n */\n async resetUserPassword(\n userId: string,\n type: \"app\" | \"dashboard\" = \"app\",\n ): Promise<DataResponse<ResetUserPasswordResponse>> {\n return wrapAsync(async () => {\n const url = `/api/v1/admin/users/${userId}/reset-password?type=${type}`;\n return await this.fetch.post<ResetUserPasswordResponse>(url, {});\n });\n }\n}\n","/**\n * PostgreSQL query builder for Fluxbase SDK\n * Inspired by Supabase's PostgREST client\n */\n\nimport type { FluxbaseFetch } from './fetch'\nimport type { FilterOperator, OrderBy, PostgrestResponse, UpsertOptions } from './types'\n\nexport class QueryBuilder<T = unknown> implements PromiseLike<PostgrestResponse<T>> {\n private fetch: FluxbaseFetch\n private table: string\n private selectQuery: string = '*'\n private filters: Array<{ column: string; operator: FilterOperator; value: unknown }> = []\n private orFilters: string[] = []\n private andFilters: string[] = []\n private orderBys: OrderBy[] = []\n private limitValue?: number\n private offsetValue?: number\n private singleRow: boolean = false\n private maybeSingleRow: boolean = false\n private groupByColumns?: string[]\n private operationType: 'select' | 'insert' | 'update' | 'delete' = 'select'\n private insertData?: Partial<T> | Array<Partial<T>>\n private updateData?: Partial<T>\n\n constructor(fetch: FluxbaseFetch, table: string) {\n this.fetch = fetch\n this.table = table\n }\n\n /**\n * Select columns to return\n * @example select('*')\n * @example select('id, name, email')\n * @example select('id, name, posts(title, content)')\n */\n select(columns: string = '*'): this {\n this.selectQuery = columns\n return this\n }\n\n /**\n * Insert a single row or multiple rows\n */\n insert(data: Partial<T> | Array<Partial<T>>): this {\n this.operationType = 'insert'\n this.insertData = data\n return this\n }\n\n /**\n * Upsert (insert or update) rows (Supabase-compatible)\n * @param data - Row(s) to upsert\n * @param options - Upsert options (onConflict, ignoreDuplicates, defaultToNull)\n */\n async upsert(data: Partial<T> | Array<Partial<T>>, options?: UpsertOptions): Promise<PostgrestResponse<T>> {\n const body = Array.isArray(data) ? data : data\n\n // Build Prefer header based on options\n const preferValues: string[] = []\n\n if (options?.ignoreDuplicates) {\n preferValues.push('resolution=ignore-duplicates')\n } else {\n preferValues.push('resolution=merge-duplicates')\n }\n\n if (options?.defaultToNull) {\n preferValues.push('missing=default')\n }\n\n const headers: Record<string, string> = {\n Prefer: preferValues.join(','),\n }\n\n // Add onConflict as query parameter if specified\n let path = `/api/v1/tables/${this.table}`\n if (options?.onConflict) {\n path += `?on_conflict=${encodeURIComponent(options.onConflict)}`\n }\n\n const response = await this.fetch.post<T>(path, body, { headers })\n\n return {\n data: response,\n error: null,\n count: Array.isArray(data) ? data.length : 1,\n status: 201,\n statusText: 'Created',\n }\n }\n\n /**\n * Update rows matching the filters\n */\n update(data: Partial<T>): this {\n this.operationType = 'update'\n this.updateData = data\n return this\n }\n\n /**\n * Delete rows matching the filters\n */\n delete(): this {\n this.operationType = 'delete'\n return this\n }\n\n /**\n * Equal to\n */\n eq(column: string, value: unknown): this {\n this.filters.push({ column, operator: 'eq', value })\n return this\n }\n\n /**\n * Not equal to\n */\n neq(column: string, value: unknown): this {\n this.filters.push({ column, operator: 'neq', value })\n return this\n }\n\n /**\n * Greater than\n */\n gt(column: string, value: unknown): this {\n this.filters.push({ column, operator: 'gt', value })\n return this\n }\n\n /**\n * Greater than or equal to\n */\n gte(column: string, value: unknown): this {\n this.filters.push({ column, operator: 'gte', value })\n return this\n }\n\n /**\n * Less than\n */\n lt(column: string, value: unknown): this {\n this.filters.push({ column, operator: 'lt', value })\n return this\n }\n\n /**\n * Less than or equal to\n */\n lte(column: string, value: unknown): this {\n this.filters.push({ column, operator: 'lte', value })\n return this\n }\n\n /**\n * Pattern matching (case-sensitive)\n */\n like(column: string, pattern: string): this {\n this.filters.push({ column, operator: 'like', value: pattern })\n return this\n }\n\n /**\n * Pattern matching (case-insensitive)\n */\n ilike(column: string, pattern: string): this {\n this.filters.push({ column, operator: 'ilike', value: pattern })\n return this\n }\n\n /**\n * Check if value is null or not null\n */\n is(column: string, value: null | boolean): this {\n this.filters.push({ column, operator: 'is', value })\n return this\n }\n\n /**\n * Check if value is in array\n */\n in(column: string, values: unknown[]): this {\n this.filters.push({ column, operator: 'in', value: values })\n return this\n }\n\n /**\n * Contains (for arrays and JSONB)\n */\n contains(column: string, value: unknown): this {\n this.filters.push({ column, operator: 'cs', value })\n return this\n }\n\n /**\n * Full-text search\n */\n textSearch(column: string, query: string): this {\n this.filters.push({ column, operator: 'fts', value: query })\n return this\n }\n\n /**\n * Negate a filter condition (Supabase-compatible)\n * @example not('status', 'eq', 'deleted')\n * @example not('completed_at', 'is', null)\n */\n not(column: string, operator: FilterOperator, value: unknown): this {\n this.filters.push({ column, operator: 'not' as FilterOperator, value: `${operator}.${this.formatValue(value)}` })\n return this\n }\n\n /**\n * Apply OR logic to filters (Supabase-compatible)\n * @example or('status.eq.active,status.eq.pending')\n * @example or('id.eq.2,name.eq.Han')\n */\n or(filters: string): this {\n this.orFilters.push(filters)\n return this\n }\n\n /**\n * Apply AND logic to filters (Supabase-compatible)\n * Groups multiple conditions that must all be true\n * @example and('status.eq.active,verified.eq.true')\n * @example and('age.gte.18,age.lte.65')\n */\n and(filters: string): this {\n this.andFilters.push(filters)\n return this\n }\n\n /**\n * Match multiple columns with exact values (Supabase-compatible)\n * Shorthand for multiple .eq() calls\n * @example match({ id: 1, status: 'active', role: 'admin' })\n */\n match(conditions: Record<string, unknown>): this {\n for (const [column, value] of Object.entries(conditions)) {\n this.eq(column, value)\n }\n return this\n }\n\n /**\n * Generic filter method using PostgREST syntax (Supabase-compatible)\n * @example filter('name', 'in', '(\"Han\",\"Yoda\")')\n * @example filter('age', 'gte', '18')\n */\n filter(column: string, operator: FilterOperator, value: unknown): this {\n this.filters.push({ column, operator, value })\n return this\n }\n\n /**\n * Check if column is contained by value (Supabase-compatible)\n * For arrays and JSONB\n * @example containedBy('tags', '[\"news\",\"update\"]')\n */\n containedBy(column: string, value: unknown): this {\n this.filters.push({ column, operator: 'cd', value })\n return this\n }\n\n /**\n * Check if arrays have common elements (Supabase-compatible)\n * @example overlaps('tags', '[\"news\",\"sports\"]')\n */\n overlaps(column: string, value: unknown): this {\n this.filters.push({ column, operator: 'ov', value })\n return this\n }\n\n /**\n * Order results\n */\n order(column: string, options?: { ascending?: boolean; nullsFirst?: boolean }): this {\n this.orderBys.push({\n column,\n direction: options?.ascending === false ? 'desc' : 'asc',\n nulls: options?.nullsFirst ? 'first' : 'last',\n })\n return this\n }\n\n /**\n * Limit number of rows returned\n */\n limit(count: number): this {\n this.limitValue = count\n return this\n }\n\n /**\n * Skip rows\n */\n offset(count: number): this {\n this.offsetValue = count\n return this\n }\n\n /**\n * Return a single row (adds limit(1))\n * Errors if no rows found\n */\n single(): this {\n this.singleRow = true\n this.limitValue = 1\n return this\n }\n\n /**\n * Return a single row or null (adds limit(1))\n * Does not error if no rows found (Supabase-compatible)\n * @example\n * ```typescript\n * // Returns null instead of erroring when no row exists\n * const { data, error } = await client\n * .from('users')\n * .select('*')\n * .eq('id', 999)\n * .maybeSingle()\n * // data will be null if no row found\n * ```\n */\n maybeSingle(): this {\n this.maybeSingleRow = true\n this.limitValue = 1\n return this\n }\n\n /**\n * Range selection (pagination)\n */\n range(from: number, to: number): this {\n this.offsetValue = from\n this.limitValue = to - from + 1\n return this\n }\n\n /**\n * Group results by one or more columns (for use with aggregations)\n *\n * @param columns - Column name(s) to group by\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Group by single column\n * const { data } = await client.from('orders')\n * .count('*')\n * .groupBy('status')\n * .execute()\n *\n * // Group by multiple columns\n * const { data } = await client.from('sales')\n * .sum('amount')\n * .groupBy(['region', 'product_category'])\n * .execute()\n * ```\n *\n * @category Aggregation\n */\n groupBy(columns: string | string[]): this {\n this.groupByColumns = Array.isArray(columns) ? columns : [columns]\n return this\n }\n\n /**\n * Count rows or a specific column\n *\n * @param column - Column to count (default: '*' for row count)\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Count all rows\n * const { data } = await client.from('users').count().execute()\n * // Returns: { count: 150 }\n *\n * // Count non-null values in a column\n * const { data } = await client.from('orders').count('completed_at').execute()\n *\n * // Count with grouping\n * const { data } = await client.from('products')\n * .count('*')\n * .groupBy('category')\n * .execute()\n * // Returns: [{ category: 'electronics', count: 45 }, { category: 'books', count: 23 }]\n * ```\n *\n * @category Aggregation\n */\n count(column: string = '*'): this {\n this.selectQuery = `count(${column})`\n return this\n }\n\n /**\n * Calculate the sum of a numeric column\n *\n * @param column - Column to sum\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Sum all prices\n * const { data } = await client.from('products').sum('price').execute()\n * // Returns: { sum_price: 15420.50 }\n *\n * // Sum by category\n * const { data } = await client.from('orders')\n * .sum('total')\n * .groupBy('status')\n * .execute()\n * // Returns: [{ status: 'completed', sum_total: 12500 }, { status: 'pending', sum_total: 3200 }]\n * ```\n *\n * @category Aggregation\n */\n sum(column: string): this {\n this.selectQuery = `sum(${column})`\n return this\n }\n\n /**\n * Calculate the average of a numeric column\n *\n * @param column - Column to average\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Average price\n * const { data } = await client.from('products').avg('price').execute()\n * // Returns: { avg_price: 129.99 }\n *\n * // Average by category\n * const { data } = await client.from('products')\n * .avg('price')\n * .groupBy('category')\n * .execute()\n * ```\n *\n * @category Aggregation\n */\n avg(column: string): this {\n this.selectQuery = `avg(${column})`\n return this\n }\n\n /**\n * Find the minimum value in a column\n *\n * @param column - Column to find minimum value\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Find lowest price\n * const { data } = await client.from('products').min('price').execute()\n * // Returns: { min_price: 9.99 }\n *\n * // Find earliest date\n * const { data } = await client.from('orders').min('created_at').execute()\n * ```\n *\n * @category Aggregation\n */\n min(column: string): this {\n this.selectQuery = `min(${column})`\n return this\n }\n\n /**\n * Find the maximum value in a column\n *\n * @param column - Column to find maximum value\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Find highest price\n * const { data } = await client.from('products').max('price').execute()\n * // Returns: { max_price: 1999.99 }\n *\n * // Find most recent order\n * const { data } = await client.from('orders').max('created_at').execute()\n * ```\n *\n * @category Aggregation\n */\n max(column: string): this {\n this.selectQuery = `max(${column})`\n return this\n }\n\n /**\n * Insert multiple rows in a single request (batch insert)\n *\n * This is a convenience method that explicitly shows intent for batch operations.\n * Internally calls `insert()` with an array.\n *\n * @param rows - Array of row objects to insert\n * @returns Promise with the inserted rows\n *\n * @example\n * ```typescript\n * // Insert multiple users at once\n * const { data } = await client.from('users').insertMany([\n * { name: 'Alice', email: 'alice@example.com' },\n * { name: 'Bob', email: 'bob@example.com' },\n * { name: 'Charlie', email: 'charlie@example.com' }\n * ])\n * ```\n *\n * @category Batch Operations\n */\n async insertMany(rows: Array<Partial<T>>): Promise<PostgrestResponse<T>> {\n return this.insert(rows).execute()\n }\n\n /**\n * Update multiple rows matching the filters (batch update)\n *\n * Updates all rows that match the current query filters.\n * This is a convenience method that explicitly shows intent for batch operations.\n *\n * @param data - Data to update matching rows with\n * @returns Promise with the updated rows\n *\n * @example\n * ```typescript\n * // Apply discount to all electronics\n * const { data } = await client.from('products')\n * .eq('category', 'electronics')\n * .updateMany({ discount: 10, updated_at: new Date() })\n *\n * // Mark all pending orders as processing\n * const { data } = await client.from('orders')\n * .eq('status', 'pending')\n * .updateMany({ status: 'processing' })\n * ```\n *\n * @category Batch Operations\n */\n async updateMany(data: Partial<T>): Promise<PostgrestResponse<T>> {\n return this.update(data).execute()\n }\n\n /**\n * Delete multiple rows matching the filters (batch delete)\n *\n * Deletes all rows that match the current query filters.\n * This is a convenience method that explicitly shows intent for batch operations.\n *\n * @returns Promise confirming deletion\n *\n * @example\n * ```typescript\n * // Delete all inactive users\n * await client.from('users')\n * .eq('active', false)\n * .deleteMany()\n *\n * // Delete old logs\n * await client.from('logs')\n * .lt('created_at', '2024-01-01')\n * .deleteMany()\n * ```\n *\n * @category Batch Operations\n */\n async deleteMany(): Promise<PostgrestResponse<null>> {\n return this.delete().execute() as Promise<PostgrestResponse<null>>\n }\n\n /**\n * Execute the query and return results\n */\n async execute(): Promise<PostgrestResponse<T>> {\n try {\n // Handle INSERT operation\n if (this.operationType === 'insert') {\n if (!this.insertData) {\n throw new Error('Insert data is required for insert operation')\n }\n const body = Array.isArray(this.insertData) ? this.insertData : this.insertData\n const response = await this.fetch.post<T>(`/api/v1/tables/${this.table}`, body)\n\n return {\n data: response,\n error: null,\n count: Array.isArray(this.insertData) ? this.insertData.length : 1,\n status: 201,\n statusText: 'Created',\n }\n }\n\n // Handle UPDATE operation\n if (this.operationType === 'update') {\n if (!this.updateData) {\n throw new Error('Update data is required for update operation')\n }\n const queryString = this.buildQueryString()\n const path = `/api/v1/tables/${this.table}${queryString}`\n const response = await this.fetch.patch<T>(path, this.updateData)\n\n return {\n data: response,\n error: null,\n count: null,\n status: 200,\n statusText: 'OK',\n }\n }\n\n // Handle DELETE operation\n if (this.operationType === 'delete') {\n const queryString = this.buildQueryString()\n const path = `/api/v1/tables/${this.table}${queryString}`\n await this.fetch.delete(path)\n\n return {\n data: null,\n error: null,\n count: null,\n status: 204,\n statusText: 'No Content',\n } as PostgrestResponse<T>\n }\n\n // Handle SELECT operation (default)\n const queryString = this.buildQueryString()\n const path = `/api/v1/tables/${this.table}${queryString}`\n const data = await this.fetch.get<T | T[]>(path)\n\n // Handle single row response\n if (this.singleRow) {\n if (Array.isArray(data) && data.length === 0) {\n return {\n data: null,\n error: { message: 'No rows found', code: 'PGRST116' },\n count: 0,\n status: 404,\n statusText: 'Not Found',\n }\n }\n const singleData = Array.isArray(data) ? data[0] : data\n return {\n data: singleData as T,\n error: null,\n count: 1,\n status: 200,\n statusText: 'OK',\n }\n }\n\n // Handle maybeSingle row response (returns null instead of error when no rows found)\n if (this.maybeSingleRow) {\n if (Array.isArray(data) && data.length === 0) {\n return {\n data: null,\n error: null,\n count: 0,\n status: 200,\n statusText: 'OK',\n }\n }\n const singleData = Array.isArray(data) ? data[0] : data\n return {\n data: singleData as T,\n error: null,\n count: 1,\n status: 200,\n statusText: 'OK',\n }\n }\n\n return {\n data: data as T,\n error: null,\n count: Array.isArray(data) ? data.length : null,\n status: 200,\n statusText: 'OK',\n }\n } catch (err) {\n const error = err as Error\n return {\n data: null,\n error: {\n message: error.message,\n code: 'PGRST000',\n },\n count: null,\n status: 500,\n statusText: 'Internal Server Error',\n }\n }\n }\n\n /**\n * Execute the query and throw an error if one occurs (Supabase-compatible)\n * Returns the data directly instead of { data, error } wrapper\n *\n * @throws {Error} If the query fails or returns an error\n * @example\n * ```typescript\n * // Throws error instead of returning { data, error }\n * try {\n * const user = await client\n * .from('users')\n * .select('*')\n * .eq('id', 1)\n * .single()\n * .throwOnError()\n * } catch (error) {\n * console.error('Query failed:', error)\n * }\n * ```\n */\n async throwOnError(): Promise<T> {\n const response = await this.execute()\n\n if (response.error) {\n const error = new Error(response.error.message)\n // Preserve error code if available\n if (response.error.code) {\n (error as any).code = response.error.code\n }\n throw error\n }\n\n return response.data as T\n }\n\n /**\n * Make QueryBuilder awaitable (implements PromiseLike)\n * This allows using `await client.from('table').select()` without calling `.execute()`\n *\n * @example\n * ```typescript\n * // Without .execute() (new way)\n * const { data } = await client.from('users').select('*')\n *\n * // With .execute() (old way, still supported)\n * const { data } = await client.from('users').select('*').execute()\n * ```\n */\n then<TResult1 = PostgrestResponse<T>, TResult2 = never>(\n onfulfilled?: ((value: PostgrestResponse<T>) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n ): PromiseLike<TResult1 | TResult2> {\n return this.execute().then(onfulfilled, onrejected)\n }\n\n /**\n * Build the query string from filters, ordering, etc.\n */\n private buildQueryString(): string {\n const params = new URLSearchParams()\n\n // Select\n if (this.selectQuery && this.selectQuery !== '*') {\n params.append('select', this.selectQuery)\n }\n\n // Filters\n for (const filter of this.filters) {\n params.append(filter.column, `${filter.operator}.${this.formatValue(filter.value)}`)\n }\n\n // OR Filters\n for (const orFilter of this.orFilters) {\n params.append('or', `(${orFilter})`)\n }\n\n // AND Filters\n for (const andFilter of this.andFilters) {\n params.append('and', `(${andFilter})`)\n }\n\n // Group By\n if (this.groupByColumns && this.groupByColumns.length > 0) {\n params.append('group_by', this.groupByColumns.join(','))\n }\n\n // Order\n if (this.orderBys.length > 0) {\n const orderStr = this.orderBys\n .map((o) => `${o.column}.${o.direction}${o.nulls ? `.nulls${o.nulls}` : ''}`)\n .join(',')\n params.append('order', orderStr)\n }\n\n // Limit\n if (this.limitValue !== undefined) {\n params.append('limit', String(this.limitValue))\n }\n\n // Offset\n if (this.offsetValue !== undefined) {\n params.append('offset', String(this.offsetValue))\n }\n\n const queryString = params.toString()\n return queryString ? `?${queryString}` : ''\n }\n\n /**\n * Format a value for the query string\n */\n private formatValue(value: unknown): string {\n if (value === null) {\n return 'null'\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false'\n }\n if (Array.isArray(value)) {\n return `(${value.map((v) => this.formatValue(v)).join(',')})`\n }\n if (typeof value === 'object') {\n return JSON.stringify(value)\n }\n return String(value)\n }\n}\n","/**\n * Main Fluxbase client for interacting with the Fluxbase backend.\n *\n * This client provides access to all Fluxbase features including:\n * - Database operations via PostgREST-compatible API\n * - Authentication and user management\n * - Real-time subscriptions via WebSockets\n * - File storage and management\n * - Edge functions for serverless compute\n * - PostgreSQL function calls (RPC)\n *\n * @example\n * ```typescript\n * import { createClient } from '@fluxbase/sdk'\n *\n * const client = createClient({\n * url: 'http://localhost:8080',\n * auth: {\n * token: 'your-jwt-token',\n * autoRefresh: true\n * }\n * })\n *\n * // Query database\n * const { data } = await client.from('users').select('*').execute()\n *\n * // Invoke edge function\n * const { data, error } = await client.functions.invoke('hello-world', {\n * body: { name: 'Alice' }\n * })\n *\n * // Subscribe to realtime changes\n * client.realtime.subscribe('users', (payload) => {\n * console.log('Change:', payload)\n * })\n * ```\n *\n * @category Client\n */\n\nimport { FluxbaseFetch } from \"./fetch\";\nimport { FluxbaseAuth } from \"./auth\";\nimport { FluxbaseRealtime } from \"./realtime\";\nimport { FluxbaseStorage } from \"./storage\";\nimport { FluxbaseFunctions } from \"./functions\";\nimport { FluxbaseAdmin } from \"./admin\";\nimport { FluxbaseManagement } from \"./management\";\nimport { SettingsClient } from \"./settings\";\nimport { QueryBuilder } from \"./query-builder\";\nimport type { FluxbaseClientOptions } from \"./types\";\n\n/**\n * Main Fluxbase client class\n * @category Client\n */\nexport class FluxbaseClient<\n Database = any,\n _SchemaName extends string & keyof Database = any,\n> {\n /** Internal HTTP client for making requests */\n private fetch: FluxbaseFetch;\n\n /** Authentication module for user management */\n public auth: FluxbaseAuth;\n\n /** Realtime module for WebSocket subscriptions */\n public realtime: FluxbaseRealtime;\n\n /** Storage module for file operations */\n public storage: FluxbaseStorage;\n\n /** Functions module for invoking and managing edge functions */\n public functions: FluxbaseFunctions;\n\n /** Admin module for instance management (requires admin authentication) */\n public admin: FluxbaseAdmin;\n\n /** Management module for API keys, webhooks, and invitations */\n public management: FluxbaseManagement;\n\n /** Settings module for reading public application settings (respects RLS policies) */\n public settings: SettingsClient;\n\n /**\n * Create a new Fluxbase client instance\n *\n * @param fluxbaseUrl - The URL of your Fluxbase instance\n * @param fluxbaseKey - The anon key (JWT token with \"anon\" role). Generate using scripts/generate-keys.sh\n * @param options - Additional client configuration options\n *\n * @example\n * ```typescript\n * const client = new FluxbaseClient(\n * 'http://localhost:8080',\n * 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...', // Anon JWT token\n * { timeout: 30000 }\n * )\n * ```\n */\n constructor(\n protected fluxbaseUrl: string,\n protected fluxbaseKey: string,\n options?: FluxbaseClientOptions,\n ) {\n // Prepare headers with anon key\n const headers = {\n apikey: fluxbaseKey,\n Authorization: `Bearer ${fluxbaseKey}`,\n ...options?.headers,\n };\n\n // Initialize HTTP client\n this.fetch = new FluxbaseFetch(fluxbaseUrl, {\n headers,\n timeout: options?.timeout,\n debug: options?.debug,\n });\n\n // Initialize auth module\n this.auth = new FluxbaseAuth(\n this.fetch,\n options?.auth?.autoRefresh ?? true,\n options?.auth?.persist ?? true,\n );\n\n // Set auth token if provided\n if (options?.auth?.token) {\n this.fetch.setAuthToken(options.auth.token);\n }\n\n // Initialize realtime module\n this.realtime = new FluxbaseRealtime(\n fluxbaseUrl,\n options?.auth?.token || null,\n );\n\n // Initialize storage module\n this.storage = new FluxbaseStorage(this.fetch);\n\n // Initialize functions module\n this.functions = new FluxbaseFunctions(this.fetch);\n\n // Initialize admin module\n this.admin = new FluxbaseAdmin(this.fetch);\n\n // Initialize management module\n this.management = new FluxbaseManagement(this.fetch);\n\n // Initialize settings module (public read-only access with RLS)\n this.settings = new SettingsClient(this.fetch);\n\n // Subscribe to auth changes to update realtime token\n this.setupAuthSync();\n }\n\n /**\n * Create a query builder for a database table\n *\n * @param table - The table name (can include schema, e.g., 'public.users')\n * @returns A query builder instance for constructing and executing queries\n *\n * @example\n * ```typescript\n * // Simple select\n * const { data } = await client.from('users').select('*').execute()\n *\n * // With filters\n * const { data } = await client.from('products')\n * .select('id, name, price')\n * .gt('price', 100)\n * .eq('category', 'electronics')\n * .execute()\n *\n * // Insert\n * await client.from('users').insert({ name: 'John', email: 'john@example.com' }).execute()\n * ```\n *\n * @category Database\n */\n from<T = any>(table: string): QueryBuilder<T> {\n return new QueryBuilder<T>(this.fetch, table);\n }\n\n /**\n * Call a PostgreSQL function (Remote Procedure Call)\n *\n * @param functionName - The name of the PostgreSQL function to call\n * @param params - Optional parameters to pass to the function\n * @returns Promise containing the function result or error\n *\n * @example\n * ```typescript\n * // Call a function without parameters\n * const { data, error } = await client.rpc('get_total_users')\n *\n * // Call a function with parameters\n * const { data, error } = await client.rpc('calculate_discount', {\n * product_id: 123,\n * coupon_code: 'SAVE20'\n * })\n * ```\n *\n * @category Database\n */\n async rpc<T = any>(\n functionName: string,\n params?: Record<string, unknown>,\n ): Promise<{ data: T | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<T>(\n `/api/v1/rpc/${functionName}`,\n params || {},\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Sync auth state with realtime connections\n * @internal\n */\n private setupAuthSync() {\n // When auth token changes, update realtime\n const originalSetAuthToken = this.fetch.setAuthToken.bind(this.fetch);\n this.fetch.setAuthToken = (token: string | null) => {\n originalSetAuthToken(token);\n this.realtime.setAuth(token);\n };\n }\n\n /**\n * Get the current authentication token\n *\n * @returns The current JWT access token, or null if not authenticated\n *\n * @category Authentication\n */\n getAuthToken(): string | null {\n return this.auth.getAccessToken();\n }\n\n /**\n * Set a new authentication token\n *\n * This updates both the HTTP client and realtime connection with the new token.\n *\n * @param token - The JWT access token to set, or null to clear authentication\n *\n * @category Authentication\n */\n setAuthToken(token: string | null) {\n this.fetch.setAuthToken(token);\n this.realtime.setAuth(token);\n }\n\n /**\n * Create or get a realtime channel (Supabase-compatible)\n *\n * @param name - Channel name\n * @param config - Optional channel configuration\n * @returns RealtimeChannel instance\n *\n * @example\n * ```typescript\n * const channel = client.channel('room-1', {\n * broadcast: { self: true },\n * presence: { key: 'user-123' }\n * })\n * .on('broadcast', { event: 'message' }, (payload) => {\n * console.log('Message:', payload)\n * })\n * .subscribe()\n * ```\n *\n * @category Realtime\n */\n channel(name: string, config?: import(\"./types\").RealtimeChannelConfig) {\n return this.realtime.channel(name, config);\n }\n\n /**\n * Remove a realtime channel (Supabase-compatible)\n *\n * @param channel - The channel to remove\n * @returns Promise resolving to status\n *\n * @example\n * ```typescript\n * const channel = client.channel('room-1')\n * await client.removeChannel(channel)\n * ```\n *\n * @category Realtime\n */\n removeChannel(channel: import(\"./realtime\").RealtimeChannel) {\n return this.realtime.removeChannel(channel);\n }\n\n /**\n * Get the internal HTTP client\n *\n * Use this for advanced scenarios like making custom API calls or admin operations.\n *\n * @returns The internal FluxbaseFetch instance\n *\n * @example\n * ```typescript\n * // Make a custom API call\n * const data = await client.http.get('/api/custom-endpoint')\n * ```\n *\n * @category Advanced\n */\n get http(): FluxbaseFetch {\n return this.fetch;\n }\n}\n\n/**\n * Create a new Fluxbase client instance (Supabase-compatible)\n *\n * This function signature is identical to Supabase's createClient, making migration seamless.\n *\n * @param fluxbaseUrl - The URL of your Fluxbase instance\n * @param fluxbaseKey - The anon key (JWT token with \"anon\" role). Generate using: `./scripts/generate-keys.sh` (option 3)\n * @param options - Optional client configuration\n * @returns A configured Fluxbase client instance with full TypeScript support\n *\n * @example\n * ```typescript\n * import { createClient } from '@fluxbase/sdk'\n *\n * // Initialize with anon key (identical to Supabase)\n * const client = createClient(\n * 'http://localhost:8080',\n * 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' // Anon JWT token\n * )\n *\n * // With additional options\n * const client = createClient(\n * 'http://localhost:8080',\n * 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',\n * { timeout: 30000, debug: true }\n * )\n *\n * // With TypeScript database types\n * const client = createClient<Database>(\n * 'http://localhost:8080',\n * 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'\n * )\n * ```\n *\n * @category Client\n */\nexport function createClient<\n Database = any,\n SchemaName extends string & keyof Database = any,\n>(\n fluxbaseUrl: string,\n fluxbaseKey: string,\n options?: FluxbaseClientOptions,\n): FluxbaseClient<Database, SchemaName> {\n return new FluxbaseClient<Database, SchemaName>(\n fluxbaseUrl,\n fluxbaseKey,\n options,\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/fetch.ts","../src/utils/error-handling.ts","../src/auth.ts","../src/realtime.ts","../src/storage.ts","../src/functions.ts","../src/settings.ts","../src/ddl.ts","../src/oauth.ts","../src/impersonation.ts","../src/management.ts","../src/admin.ts","../src/query-builder.ts","../src/client.ts"],"names":["fetch","queryString","path"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * HTTP client for making requests to the Fluxbase API\n */\n\nimport type { FluxbaseError, HttpMethod } from './types'\n\nexport interface FetchOptions {\n method: HttpMethod\n headers?: Record<string, string>\n body?: unknown\n timeout?: number\n}\n\nexport class FluxbaseFetch {\n private baseUrl: string\n private defaultHeaders: Record<string, string>\n private timeout: number\n private debug: boolean\n\n constructor(\n baseUrl: string,\n options: {\n headers?: Record<string, string>\n timeout?: number\n debug?: boolean\n } = {}\n ) {\n this.baseUrl = baseUrl.replace(/\\/$/, '') // Remove trailing slash\n this.defaultHeaders = {\n 'Content-Type': 'application/json',\n ...options.headers,\n }\n this.timeout = options.timeout ?? 30000\n this.debug = options.debug ?? false\n }\n\n /**\n * Update the authorization header\n */\n setAuthToken(token: string | null) {\n if (token) {\n this.defaultHeaders['Authorization'] = `Bearer ${token}`\n } else {\n delete this.defaultHeaders['Authorization']\n }\n }\n\n /**\n * Make an HTTP request\n */\n async request<T = unknown>(path: string, options: FetchOptions): Promise<T> {\n const url = `${this.baseUrl}${path}`\n const headers = { ...this.defaultHeaders, ...options.headers }\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), options.timeout ?? this.timeout)\n\n if (this.debug) {\n console.log(`[Fluxbase SDK] ${options.method} ${url}`, options.body)\n }\n\n try {\n const response = await fetch(url, {\n method: options.method,\n headers,\n body: options.body ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n // Parse response\n const contentType = response.headers.get('content-type')\n let data: unknown\n\n if (contentType?.includes('application/json')) {\n data = await response.json()\n } else {\n data = await response.text()\n }\n\n if (this.debug) {\n console.log(`[Fluxbase SDK] Response:`, response.status, data)\n }\n\n // Handle errors\n if (!response.ok) {\n const error = new Error(\n typeof data === 'object' && data && 'error' in data\n ? String(data.error)\n : response.statusText\n ) as FluxbaseError\n\n error.status = response.status\n error.details = data\n\n throw error\n }\n\n return data as T\n } catch (err) {\n clearTimeout(timeoutId)\n\n if (err instanceof Error) {\n if (err.name === 'AbortError') {\n const timeoutError = new Error('Request timeout') as FluxbaseError\n timeoutError.status = 408\n throw timeoutError\n }\n\n throw err\n }\n\n throw new Error('Unknown error occurred')\n }\n }\n\n /**\n * GET request\n */\n async get<T = unknown>(path: string, options: Omit<FetchOptions, 'method'> = {}): Promise<T> {\n return this.request<T>(path, { ...options, method: 'GET' })\n }\n\n /**\n * POST request\n */\n async post<T = unknown>(path: string, body?: unknown, options: Omit<FetchOptions, 'method' | 'body'> = {}): Promise<T> {\n return this.request<T>(path, { ...options, method: 'POST', body })\n }\n\n /**\n * PUT request\n */\n async put<T = unknown>(path: string, body?: unknown, options: Omit<FetchOptions, 'method' | 'body'> = {}): Promise<T> {\n return this.request<T>(path, { ...options, method: 'PUT', body })\n }\n\n /**\n * PATCH request\n */\n async patch<T = unknown>(path: string, body?: unknown, options: Omit<FetchOptions, 'method' | 'body'> = {}): Promise<T> {\n return this.request<T>(path, { ...options, method: 'PATCH', body })\n }\n\n /**\n * DELETE request\n */\n async delete<T = unknown>(path: string, options: Omit<FetchOptions, 'method'> = {}): Promise<T> {\n return this.request<T>(path, { ...options, method: 'DELETE' })\n }\n\n /**\n * HEAD request\n */\n async head(path: string, options: Omit<FetchOptions, 'method'> = {}): Promise<Headers> {\n const url = `${this.baseUrl}${path}`\n const headers = { ...this.defaultHeaders, ...options.headers }\n\n const response = await fetch(url, {\n method: 'HEAD',\n headers,\n })\n\n return response.headers\n }\n}\n","import type { FluxbaseResponse, VoidResponse } from '../types'\n\n/**\n * Wraps an async operation with try-catch, returning Fluxbase response format\n * @param operation The async operation to wrap\n * @returns Promise resolving to { data, error: null } on success or { data: null, error } on failure\n */\nexport async function wrapAsync<T>(\n operation: () => Promise<T>\n): Promise<FluxbaseResponse<T>> {\n try {\n const data = await operation()\n return { data, error: null }\n } catch (error) {\n return {\n data: null,\n error: error instanceof Error ? error : new Error(String(error))\n }\n }\n}\n\n/**\n * Wraps void async operations (operations that don't return data)\n * @param operation The async void operation to wrap\n * @returns Promise resolving to { error: null } on success or { error } on failure\n */\nexport async function wrapAsyncVoid(\n operation: () => Promise<void>\n): Promise<VoidResponse> {\n try {\n await operation()\n return { error: null }\n } catch (error) {\n return {\n error: error instanceof Error ? error : new Error(String(error))\n }\n }\n}\n\n/**\n * Wraps synchronous operations (for consistency)\n * @param operation The sync operation to wrap\n * @returns { data, error: null } on success or { data: null, error } on failure\n */\nexport function wrapSync<T>(\n operation: () => T\n): FluxbaseResponse<T> {\n try {\n const data = operation()\n return { data, error: null }\n } catch (error) {\n return {\n data: null,\n error: error instanceof Error ? error : new Error(String(error))\n }\n }\n}\n","/**\n * Authentication module for Fluxbase SDK\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n AuthResponse,\n AuthResponseData,\n AuthSession,\n SignInCredentials,\n SignUpCredentials,\n UpdateUserAttributes,\n User,\n TwoFactorSetupResponse,\n TwoFactorEnableResponse,\n TwoFactorLoginResponse,\n TwoFactorStatusResponse,\n TwoFactorDisableResponse,\n TwoFactorVerifyRequest,\n SignInWith2FAResponse,\n PasswordResetResponse,\n VerifyResetTokenResponse,\n ResetPasswordResponse,\n MagicLinkOptions,\n MagicLinkResponse,\n AnonymousSignInResponse,\n OAuthProvidersResponse,\n OAuthOptions,\n OAuthUrlResponse,\n AuthChangeEvent,\n AuthStateChangeCallback,\n AuthSubscription,\n FluxbaseAuthResponse,\n FluxbaseResponse,\n UserResponse,\n DataResponse,\n VoidResponse,\n SignInWithOtpCredentials,\n VerifyOtpParams,\n ResendOtpParams,\n OTPResponse,\n UserIdentitiesResponse,\n LinkIdentityCredentials,\n UnlinkIdentityParams,\n ReauthenticateResponse,\n SignInWithIdTokenCredentials,\n} from \"./types\";\nimport { wrapAsync, wrapAsyncVoid } from \"./utils/error-handling\";\n\nconst AUTH_STORAGE_KEY = \"fluxbase.auth.session\";\n\nexport class FluxbaseAuth {\n private fetch: FluxbaseFetch;\n private session: AuthSession | null = null;\n private persist: boolean;\n private autoRefresh: boolean;\n private refreshTimer: ReturnType<typeof setTimeout> | null = null;\n private stateChangeListeners: Set<AuthStateChangeCallback> = new Set();\n\n constructor(fetch: FluxbaseFetch, autoRefresh = true, persist = true) {\n this.fetch = fetch;\n this.persist = persist;\n this.autoRefresh = autoRefresh;\n\n // Load session from storage if persisted\n if (this.persist && typeof localStorage !== \"undefined\") {\n const stored = localStorage.getItem(AUTH_STORAGE_KEY);\n if (stored) {\n try {\n this.session = JSON.parse(stored);\n if (this.session) {\n this.fetch.setAuthToken(this.session.access_token);\n this.scheduleTokenRefresh();\n }\n } catch {\n // Invalid stored session, ignore\n localStorage.removeItem(AUTH_STORAGE_KEY);\n }\n }\n }\n }\n\n /**\n * Get the current session (Supabase-compatible)\n * Returns the session from the client-side cache without making a network request\n */\n async getSession(): Promise<\n FluxbaseResponse<{ session: AuthSession | null }>\n > {\n return { data: { session: this.session }, error: null };\n }\n\n /**\n * Get the current user (Supabase-compatible)\n * Returns the user from the client-side session without making a network request\n * For server-side validation, use getCurrentUser() instead\n */\n async getUser(): Promise<FluxbaseResponse<{ user: User | null }>> {\n return { data: { user: this.session?.user ?? null }, error: null };\n }\n\n /**\n * Get the current access token\n */\n getAccessToken(): string | null {\n return this.session?.access_token ?? null;\n }\n\n /**\n * Listen to auth state changes (Supabase-compatible)\n * @param callback - Function called when auth state changes\n * @returns Object containing subscription data\n *\n * @example\n * ```typescript\n * const { data: { subscription } } = client.auth.onAuthStateChange((event, session) => {\n * console.log('Auth event:', event, session)\n * })\n *\n * // Later, to unsubscribe:\n * subscription.unsubscribe()\n * ```\n */\n onAuthStateChange(callback: AuthStateChangeCallback): {\n data: { subscription: AuthSubscription };\n } {\n this.stateChangeListeners.add(callback);\n\n const subscription: AuthSubscription = {\n unsubscribe: () => {\n this.stateChangeListeners.delete(callback);\n },\n };\n\n return { data: { subscription } };\n }\n\n /**\n * Sign in with email and password (Supabase-compatible)\n * Returns { user, session } if successful, or SignInWith2FAResponse if 2FA is required\n */\n async signIn(\n credentials: SignInCredentials,\n ): Promise<FluxbaseResponse<AuthResponseData | SignInWith2FAResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<\n AuthResponse | SignInWith2FAResponse\n >(\"/api/v1/auth/signin\", credentials);\n\n // Check if 2FA is required\n if (\"requires_2fa\" in response && response.requires_2fa) {\n return response as SignInWith2FAResponse;\n }\n\n // Normal sign in without 2FA\n const authResponse = response as AuthResponse;\n const session: AuthSession = {\n ...authResponse,\n expires_at: Date.now() + authResponse.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: session.user, session };\n });\n }\n\n /**\n * Sign in with email and password (Supabase-compatible)\n * Alias for signIn() to maintain compatibility with common authentication patterns\n * Returns { user, session } if successful, or SignInWith2FAResponse if 2FA is required\n */\n async signInWithPassword(\n credentials: SignInCredentials,\n ): Promise<FluxbaseResponse<AuthResponseData | SignInWith2FAResponse>> {\n return this.signIn(credentials);\n }\n\n /**\n * Sign up with email and password (Supabase-compatible)\n * Returns session when email confirmation is disabled\n * Returns null session when email confirmation is required\n */\n async signUp(credentials: SignUpCredentials): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n // Transform Supabase-style options.data to backend's user_metadata format\n const requestBody: any = {\n email: credentials.email,\n password: credentials.password,\n };\n\n // Map options.data to user_metadata for the backend\n if (credentials.options?.data) {\n requestBody.user_metadata = credentials.options.data;\n }\n\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/signup\",\n requestBody,\n );\n\n // Check if session tokens are provided (no email confirmation required)\n if (response.access_token && response.refresh_token) {\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: response.user, session };\n }\n\n // Email confirmation required - return user without session\n return { user: response.user, session: null };\n });\n }\n\n /**\n * Sign out the current user\n */\n async signOut(): Promise<VoidResponse> {\n return wrapAsyncVoid(async () => {\n try {\n await this.fetch.post(\"/api/v1/auth/signout\");\n } finally {\n this.clearSession();\n }\n });\n }\n\n /**\n * Refresh the session (Supabase-compatible)\n * Returns a new session with refreshed tokens\n */\n async refreshSession(): Promise<\n FluxbaseResponse<{ user: User; session: AuthSession }>\n > {\n return wrapAsync(async () => {\n if (!this.session?.refresh_token) {\n throw new Error(\"No refresh token available\");\n }\n\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/refresh\",\n {\n refresh_token: this.session.refresh_token,\n },\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session, \"TOKEN_REFRESHED\");\n return { user: session.user, session };\n });\n }\n\n /**\n * Refresh the session (Supabase-compatible alias)\n * Alias for refreshSession() to maintain compatibility with Supabase naming\n * Returns a new session with refreshed tokens\n */\n async refreshToken(): Promise<\n FluxbaseResponse<{ user: User; session: AuthSession }>\n > {\n return this.refreshSession();\n }\n\n /**\n * Get the current user from the server\n */\n async getCurrentUser(): Promise<UserResponse> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n const user = await this.fetch.get<User>(\"/api/v1/auth/user\");\n return { user };\n });\n }\n\n /**\n * Update the current user (Supabase-compatible)\n * @param attributes - User attributes to update (email, password, data for metadata)\n */\n async updateUser(\n attributes: UpdateUserAttributes,\n ): Promise<UserResponse> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n // Transform Supabase-style 'data' to backend's 'user_metadata' format\n const requestBody: any = {};\n\n if (attributes.email) {\n requestBody.email = attributes.email;\n }\n\n if (attributes.password) {\n requestBody.password = attributes.password;\n }\n\n if (attributes.data) {\n requestBody.user_metadata = attributes.data;\n }\n\n if (attributes.nonce) {\n requestBody.nonce = attributes.nonce;\n }\n\n const user = await this.fetch.patch<User>(\"/api/v1/auth/user\", requestBody);\n\n // Update session with new user data\n if (this.session) {\n this.session.user = user;\n this.saveSession();\n this.emitAuthChange(\"USER_UPDATED\", this.session);\n }\n\n return { user };\n });\n }\n\n /**\n * Set the session manually (Supabase-compatible)\n * Useful for restoring a session from storage or SSR scenarios\n * @param session - Object containing access_token and refresh_token\n * @returns Promise with session data\n */\n async setSession(session: {\n access_token: string;\n refresh_token: string;\n }): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n // Create a full auth session from the tokens\n const authSession: AuthSession = {\n access_token: session.access_token,\n refresh_token: session.refresh_token,\n user: null as any, // Will be populated by getCurrentUser\n expires_in: 3600, // Default, will be updated on refresh\n expires_at: Date.now() + 3600 * 1000,\n };\n\n // Set the token so we can make authenticated requests\n this.fetch.setAuthToken(session.access_token);\n\n // Fetch the current user to populate the session\n const user = await this.fetch.get<User>(\"/api/v1/auth/user\");\n authSession.user = user;\n\n // Store the session\n this.setSessionInternal(authSession, \"SIGNED_IN\");\n\n return { user, session: authSession };\n });\n }\n\n /**\n * Setup 2FA for the current user (Supabase-compatible)\n * Enrolls a new MFA factor and returns TOTP details\n * @param issuer - Optional custom issuer name for the QR code (e.g., \"MyApp\"). If not provided, uses server default.\n * @returns Promise with factor id, type, and TOTP setup details\n */\n async setup2FA(\n issuer?: string,\n ): Promise<DataResponse<TwoFactorSetupResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<TwoFactorSetupResponse>(\n \"/api/v1/auth/2fa/setup\",\n issuer ? { issuer } : undefined,\n );\n });\n }\n\n /**\n * Enable 2FA after verifying the TOTP code (Supabase-compatible)\n * Verifies the TOTP code and returns new tokens with MFA session\n * @param code - TOTP code from authenticator app\n * @returns Promise with access_token, refresh_token, and user\n */\n async enable2FA(\n code: string,\n ): Promise<DataResponse<TwoFactorEnableResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<TwoFactorEnableResponse>(\n \"/api/v1/auth/2fa/enable\",\n { code },\n );\n });\n }\n\n /**\n * Disable 2FA for the current user (Supabase-compatible)\n * Unenrolls the MFA factor\n * @param password - User password for confirmation\n * @returns Promise with unenrolled factor id\n */\n async disable2FA(\n password: string,\n ): Promise<DataResponse<TwoFactorDisableResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<TwoFactorDisableResponse>(\n \"/api/v1/auth/2fa/disable\",\n { password },\n );\n });\n }\n\n /**\n * Check 2FA status for the current user (Supabase-compatible)\n * Lists all enrolled MFA factors\n * @returns Promise with all factors and TOTP factors\n */\n async get2FAStatus(): Promise<DataResponse<TwoFactorStatusResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.get<TwoFactorStatusResponse>(\n \"/api/v1/auth/2fa/status\",\n );\n });\n }\n\n /**\n * Verify 2FA code during login (Supabase-compatible)\n * Call this after signIn returns requires_2fa: true\n * @param request - User ID and TOTP code\n * @returns Promise with access_token, refresh_token, and user\n */\n async verify2FA(\n request: TwoFactorVerifyRequest,\n ): Promise<DataResponse<TwoFactorLoginResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<TwoFactorLoginResponse>(\n \"/api/v1/auth/2fa/verify\",\n request,\n );\n\n // Create session from the response tokens\n if (response.access_token && response.refresh_token) {\n const session: AuthSession = {\n user: response.user,\n access_token: response.access_token,\n refresh_token: response.refresh_token,\n expires_in: response.expires_in || 3600,\n expires_at: Date.now() + (response.expires_in || 3600) * 1000,\n };\n\n this.setSessionInternal(session, \"MFA_CHALLENGE_VERIFIED\");\n }\n\n return response;\n });\n }\n\n /**\n * Send password reset email (Supabase-compatible)\n * Sends a password reset link to the provided email address\n * @param email - Email address to send reset link to\n * @returns Promise with OTP-style response\n */\n async sendPasswordReset(\n email: string,\n ): Promise<DataResponse<PasswordResetResponse>> {\n return wrapAsync(async () => {\n await this.fetch.post(\"/api/v1/auth/password/reset\", { email });\n // Return Supabase-compatible OTP response\n return { user: null, session: null };\n });\n }\n\n /**\n * Supabase-compatible alias for sendPasswordReset()\n * @param email - Email address to send reset link to\n * @param _options - Optional redirect configuration (currently not used)\n * @returns Promise with OTP-style response\n */\n async resetPasswordForEmail(\n email: string,\n _options?: { redirectTo?: string },\n ): Promise<DataResponse<PasswordResetResponse>> {\n return this.sendPasswordReset(email);\n }\n\n /**\n * Verify password reset token\n * Check if a password reset token is valid before allowing password reset\n * @param token - Password reset token to verify\n */\n async verifyResetToken(\n token: string,\n ): Promise<DataResponse<VerifyResetTokenResponse>> {\n return wrapAsync(async () => {\n return await this.fetch.post<VerifyResetTokenResponse>(\n \"/api/v1/auth/password/reset/verify\",\n {\n token,\n },\n );\n });\n }\n\n /**\n * Reset password with token (Supabase-compatible)\n * Complete the password reset process with a valid token\n * @param token - Password reset token\n * @param newPassword - New password to set\n * @returns Promise with user and new session\n */\n async resetPassword(\n token: string,\n newPassword: string,\n ): Promise<DataResponse<ResetPasswordResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/password/reset/confirm\",\n {\n token,\n new_password: newPassword,\n },\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session, \"PASSWORD_RECOVERY\");\n return { user: session.user, session };\n });\n }\n\n /**\n * Send magic link for passwordless authentication (Supabase-compatible)\n * @param email - Email address to send magic link to\n * @param options - Optional configuration for magic link\n * @returns Promise with OTP-style response\n */\n async sendMagicLink(\n email: string,\n options?: MagicLinkOptions,\n ): Promise<DataResponse<MagicLinkResponse>> {\n return wrapAsync(async () => {\n await this.fetch.post(\"/api/v1/auth/magiclink\", {\n email,\n redirect_to: options?.redirect_to,\n });\n // Return Supabase-compatible OTP response\n return { user: null, session: null };\n });\n }\n\n /**\n * Verify magic link token and sign in\n * @param token - Magic link token from email\n */\n async verifyMagicLink(token: string): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/magiclink/verify\",\n {\n token,\n },\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: session.user, session };\n });\n }\n\n /**\n * Sign in anonymously\n * Creates a temporary anonymous user session\n */\n async signInAnonymously(): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AnonymousSignInResponse>(\n \"/api/v1/auth/signin/anonymous\",\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: session.user, session };\n });\n }\n\n /**\n * Get list of enabled OAuth providers\n */\n async getOAuthProviders(): Promise<DataResponse<OAuthProvidersResponse>> {\n return wrapAsync(async () => {\n return await this.fetch.get<OAuthProvidersResponse>(\n \"/api/v1/auth/oauth/providers\",\n );\n });\n }\n\n /**\n * Get OAuth authorization URL for a provider\n * @param provider - OAuth provider name (e.g., 'google', 'github')\n * @param options - Optional OAuth configuration\n */\n async getOAuthUrl(\n provider: string,\n options?: OAuthOptions,\n ): Promise<DataResponse<OAuthUrlResponse>> {\n return wrapAsync(async () => {\n const params = new URLSearchParams();\n if (options?.redirect_to) {\n params.append(\"redirect_to\", options.redirect_to);\n }\n if (options?.scopes && options.scopes.length > 0) {\n params.append(\"scopes\", options.scopes.join(\",\"));\n }\n\n const queryString = params.toString();\n const url = queryString\n ? `/api/v1/auth/oauth/${provider}/authorize?${queryString}`\n : `/api/v1/auth/oauth/${provider}/authorize`;\n\n const response = await this.fetch.get<OAuthUrlResponse>(url);\n return response;\n });\n }\n\n /**\n * Exchange OAuth authorization code for session\n * This is typically called in your OAuth callback handler\n * @param code - Authorization code from OAuth callback\n */\n async exchangeCodeForSession(code: string): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/oauth/callback\",\n { code },\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: session.user, session };\n });\n }\n\n /**\n * Convenience method to initiate OAuth sign-in\n * Redirects the user to the OAuth provider's authorization page\n * @param provider - OAuth provider name (e.g., 'google', 'github')\n * @param options - Optional OAuth configuration\n */\n async signInWithOAuth(\n provider: string,\n options?: OAuthOptions,\n ): Promise<DataResponse<{ provider: string; url: string }>> {\n return wrapAsync(async () => {\n const result = await this.getOAuthUrl(provider, options);\n\n if (result.error) {\n throw result.error;\n }\n\n const url = result.data.url;\n\n if (typeof window !== \"undefined\") {\n window.location.href = url;\n } else {\n throw new Error(\n \"signInWithOAuth can only be called in a browser environment\",\n );\n }\n\n return { provider, url };\n });\n }\n\n /**\n * Sign in with OTP (One-Time Password) - Supabase-compatible\n * Sends a one-time password via email or SMS for passwordless authentication\n * @param credentials - Email or phone number and optional configuration\n * @returns Promise with OTP-style response\n */\n async signInWithOtp(\n credentials: SignInWithOtpCredentials,\n ): Promise<DataResponse<OTPResponse>> {\n return wrapAsync(async () => {\n await this.fetch.post(\"/api/v1/auth/otp/signin\", credentials);\n // Return Supabase-compatible OTP response\n return { user: null, session: null };\n });\n }\n\n /**\n * Verify OTP (One-Time Password) - Supabase-compatible\n * Verify OTP tokens for various authentication flows\n * @param params - OTP verification parameters including token and type\n * @returns Promise with user and session if successful\n */\n async verifyOtp(params: VerifyOtpParams): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/otp/verify\",\n params,\n );\n\n // Check if session tokens are provided\n if (response.access_token && response.refresh_token) {\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: response.user, session };\n }\n\n // Email confirmation required - return user without session\n return { user: response.user, session: null };\n });\n }\n\n /**\n * Resend OTP (One-Time Password) - Supabase-compatible\n * Resend OTP code when user doesn't receive it\n * @param params - Resend parameters including type and email/phone\n * @returns Promise with OTP-style response\n */\n async resendOtp(params: ResendOtpParams): Promise<DataResponse<OTPResponse>> {\n return wrapAsync(async () => {\n await this.fetch.post(\"/api/v1/auth/otp/resend\", params);\n // Return Supabase-compatible OTP response\n return { user: null, session: null };\n });\n }\n\n /**\n * Get user identities (linked OAuth providers) - Supabase-compatible\n * Lists all OAuth identities linked to the current user\n * @returns Promise with list of user identities\n */\n async getUserIdentities(): Promise<DataResponse<UserIdentitiesResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.get<UserIdentitiesResponse>(\n \"/api/v1/auth/user/identities\",\n );\n });\n }\n\n /**\n * Link an OAuth identity to current user - Supabase-compatible\n * Links an additional OAuth provider to the existing account\n * @param credentials - Provider to link\n * @returns Promise with OAuth URL to complete linking\n */\n async linkIdentity(\n credentials: LinkIdentityCredentials,\n ): Promise<DataResponse<OAuthUrlResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<OAuthUrlResponse>(\n \"/api/v1/auth/user/identities\",\n credentials,\n );\n });\n }\n\n /**\n * Unlink an OAuth identity from current user - Supabase-compatible\n * Removes a linked OAuth provider from the account\n * @param params - Identity to unlink\n * @returns Promise with void response\n */\n async unlinkIdentity(params: UnlinkIdentityParams): Promise<VoidResponse> {\n return wrapAsyncVoid(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n await this.fetch.delete(\n `/api/v1/auth/user/identities/${params.identity.id}`,\n );\n });\n }\n\n /**\n * Reauthenticate to get security nonce - Supabase-compatible\n * Get a security nonce for sensitive operations (password change, etc.)\n * @returns Promise with nonce for reauthentication\n */\n async reauthenticate(): Promise<DataResponse<ReauthenticateResponse>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<ReauthenticateResponse>(\n \"/api/v1/auth/reauthenticate\",\n );\n });\n }\n\n /**\n * Sign in with ID token (for native mobile apps) - Supabase-compatible\n * Authenticate using native mobile app ID tokens (Google, Apple)\n * @param credentials - Provider, ID token, and optional nonce\n * @returns Promise with user and session\n */\n async signInWithIdToken(\n credentials: SignInWithIdTokenCredentials,\n ): Promise<FluxbaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/signin/idtoken\",\n credentials,\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSessionInternal(session);\n return { user: session.user, session };\n });\n }\n\n /**\n * Internal: Set the session and persist it\n */\n private setSessionInternal(\n session: AuthSession,\n event: AuthChangeEvent = \"SIGNED_IN\",\n ) {\n this.session = session;\n this.fetch.setAuthToken(session.access_token);\n this.saveSession();\n this.scheduleTokenRefresh();\n this.emitAuthChange(event, session);\n }\n\n /**\n * Internal: Clear the session\n */\n private clearSession() {\n this.session = null;\n this.fetch.setAuthToken(null);\n\n if (this.persist && typeof localStorage !== \"undefined\") {\n localStorage.removeItem(AUTH_STORAGE_KEY);\n }\n\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n\n this.emitAuthChange(\"SIGNED_OUT\", null);\n }\n\n /**\n * Internal: Save session to storage\n */\n private saveSession() {\n if (this.persist && typeof localStorage !== \"undefined\" && this.session) {\n localStorage.setItem(AUTH_STORAGE_KEY, JSON.stringify(this.session));\n }\n }\n\n /**\n * Internal: Schedule automatic token refresh\n */\n private scheduleTokenRefresh() {\n if (!this.autoRefresh || !this.session?.expires_at) {\n return;\n }\n\n // Clear existing timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n }\n\n // Refresh 1 minute before expiry\n const refreshAt = this.session.expires_at - 60 * 1000;\n const delay = refreshAt - Date.now();\n\n if (delay > 0) {\n this.refreshTimer = setTimeout(async () => {\n const result = await this.refreshSession();\n if (result.error) {\n console.error(\"Failed to refresh token:\", result.error);\n this.clearSession();\n }\n }, delay);\n }\n }\n\n /**\n * Internal: Emit auth state change event to all listeners\n */\n private emitAuthChange(event: AuthChangeEvent, session: AuthSession | null) {\n this.stateChangeListeners.forEach((callback) => {\n try {\n callback(event, session);\n } catch (error) {\n console.error(\"Error in auth state change listener:\", error);\n }\n });\n }\n}\n","/**\n * Realtime subscriptions using WebSockets\n */\n\nimport type {\n RealtimeCallback,\n RealtimePostgresChangesPayload,\n RealtimeMessage,\n PostgresChangesConfig,\n RealtimeChannelConfig,\n PresenceState,\n RealtimePresencePayload,\n PresenceCallback,\n BroadcastMessage,\n RealtimeBroadcastPayload,\n BroadcastCallback,\n} from \"./types\";\n\nexport class RealtimeChannel {\n private ws: WebSocket | null = null;\n private url: string;\n private token: string | null;\n private channelName: string;\n private callbacks: Map<string, Set<RealtimeCallback>> = new Map();\n private presenceCallbacks: Map<string, Set<PresenceCallback>> = new Map();\n private broadcastCallbacks: Map<string, Set<BroadcastCallback>> = new Map();\n private subscriptionConfig: PostgresChangesConfig | null = null;\n private _presenceState: Record<string, PresenceState[]> = {};\n private myPresenceKey: string | null = null;\n private config: RealtimeChannelConfig;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 10;\n private reconnectDelay = 1000;\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n private pendingAcks: Map<\n string,\n { resolve: (value: string) => void; reject: (reason: any) => void; timeout: ReturnType<typeof setTimeout> }\n > = new Map();\n private messageIdCounter = 0;\n\n constructor(\n url: string,\n channelName: string,\n token: string | null = null,\n config: RealtimeChannelConfig = {}\n ) {\n this.url = url;\n this.channelName = channelName;\n this.token = token;\n this.config = config;\n }\n\n /**\n * Listen to postgres_changes with optional row-level filtering\n *\n * @param event - 'postgres_changes'\n * @param config - Configuration including optional filter\n * @param callback - Function to call when changes occur\n * @returns This channel for chaining\n *\n * @example\n * ```typescript\n * channel.on('postgres_changes', {\n * event: '*',\n * schema: 'public',\n * table: 'jobs',\n * filter: 'created_by=eq.user123'\n * }, (payload) => {\n * console.log('Job updated:', payload)\n * })\n * ```\n */\n on(\n event: \"postgres_changes\",\n config: PostgresChangesConfig,\n callback: RealtimeCallback,\n ): this;\n\n /**\n * Listen to a specific event type (backwards compatibility)\n *\n * @param event - The event type (INSERT, UPDATE, DELETE, or '*' for all)\n * @param callback - The callback function\n * @returns This channel for chaining\n *\n * @example\n * ```typescript\n * channel.on('INSERT', (payload) => {\n * console.log('New record inserted:', payload.new_record)\n * })\n * ```\n */\n on(\n event: \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\",\n callback: RealtimeCallback,\n ): this;\n\n /**\n * Listen to broadcast messages\n *\n * @param event - 'broadcast'\n * @param config - Configuration with event name\n * @param callback - Function to call when broadcast received\n * @returns This channel for chaining\n *\n * @example\n * ```typescript\n * channel.on('broadcast', { event: 'cursor-pos' }, (payload) => {\n * console.log('Cursor moved:', payload)\n * })\n * ```\n */\n on(\n event: \"broadcast\",\n config: { event: string },\n callback: BroadcastCallback,\n ): this;\n\n /**\n * Listen to presence events\n *\n * @param event - 'presence'\n * @param config - Configuration with event type (sync, join, leave)\n * @param callback - Function to call when presence changes\n * @returns This channel for chaining\n *\n * @example\n * ```typescript\n * channel.on('presence', { event: 'sync' }, (payload) => {\n * console.log('Presence synced:', payload)\n * })\n * ```\n */\n on(\n event: \"presence\",\n config: { event: \"sync\" | \"join\" | \"leave\" },\n callback: PresenceCallback,\n ): this;\n\n // Implementation\n on(\n event:\n | \"postgres_changes\"\n | \"INSERT\"\n | \"UPDATE\"\n | \"DELETE\"\n | \"*\"\n | \"broadcast\"\n | \"presence\",\n configOrCallback:\n | PostgresChangesConfig\n | RealtimeCallback\n | { event: string }\n | { event: \"sync\" | \"join\" | \"leave\" },\n callback?: RealtimeCallback | BroadcastCallback | PresenceCallback,\n ): this {\n if (\n event === \"postgres_changes\" &&\n typeof configOrCallback !== \"function\"\n ) {\n // on('postgres_changes', config, callback)\n const config = configOrCallback as PostgresChangesConfig;\n this.subscriptionConfig = config;\n const actualCallback = callback!;\n\n const eventType = config.event;\n if (!this.callbacks.has(eventType)) {\n this.callbacks.set(eventType, new Set());\n }\n this.callbacks.get(eventType)!.add(actualCallback as RealtimeCallback);\n } else if (event === \"broadcast\" && typeof configOrCallback !== \"function\") {\n // on('broadcast', { event }, callback)\n const config = configOrCallback as { event: string };\n const actualCallback = callback as BroadcastCallback;\n\n if (!this.broadcastCallbacks.has(config.event)) {\n this.broadcastCallbacks.set(config.event, new Set());\n }\n this.broadcastCallbacks.get(config.event)!.add(actualCallback);\n } else if (event === \"presence\" && typeof configOrCallback !== \"function\") {\n // on('presence', { event }, callback)\n const config = configOrCallback as { event: \"sync\" | \"join\" | \"leave\" };\n const actualCallback = callback as PresenceCallback;\n\n if (!this.presenceCallbacks.has(config.event)) {\n this.presenceCallbacks.set(config.event, new Set());\n }\n this.presenceCallbacks.get(config.event)!.add(actualCallback);\n } else {\n // on('INSERT'|'UPDATE'|'DELETE'|'*', callback)\n const actualEvent = event as \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\";\n const actualCallback = configOrCallback as RealtimeCallback;\n\n if (!this.callbacks.has(actualEvent)) {\n this.callbacks.set(actualEvent, new Set());\n }\n this.callbacks.get(actualEvent)!.add(actualCallback);\n }\n\n return this;\n }\n\n /**\n * Remove a callback\n */\n off(\n event: \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\",\n callback: RealtimeCallback,\n ): this {\n const callbacks = this.callbacks.get(event);\n if (callbacks) {\n callbacks.delete(callback);\n }\n return this;\n }\n\n /**\n * Subscribe to the channel\n * @param callback - Optional status callback (Supabase-compatible)\n * @param _timeout - Optional timeout in milliseconds (currently unused)\n */\n subscribe(\n callback?: (\n status: \"SUBSCRIBED\" | \"CHANNEL_ERROR\" | \"TIMED_OUT\" | \"CLOSED\",\n err?: Error,\n ) => void,\n _timeout?: number,\n ): this {\n this.connect();\n\n // Call callback with SUBSCRIBED status after connection\n if (callback) {\n // Wait for connection to open\n const checkConnection = () => {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n callback(\"SUBSCRIBED\");\n } else if (this.ws && this.ws.readyState === WebSocket.CLOSED) {\n callback(\"CHANNEL_ERROR\", new Error(\"Failed to connect\"));\n } else {\n setTimeout(checkConnection, 100);\n }\n };\n setTimeout(checkConnection, 100);\n }\n\n return this;\n }\n\n /**\n * Unsubscribe from the channel\n * @param timeout - Optional timeout in milliseconds\n * @returns Promise resolving to status string (Supabase-compatible)\n */\n async unsubscribe(timeout?: number): Promise<\"ok\" | \"timed out\" | \"error\"> {\n return new Promise((resolve) => {\n if (this.ws) {\n this.sendMessage({\n type: \"unsubscribe\",\n channel: this.channelName,\n });\n\n // Wait for disconnect\n const startTime = Date.now();\n const maxWait = timeout || 5000;\n\n const checkDisconnect = () => {\n if (!this.ws || this.ws.readyState === WebSocket.CLOSED) {\n this.disconnect();\n resolve(\"ok\");\n } else if (Date.now() - startTime > maxWait) {\n this.disconnect();\n resolve(\"timed out\");\n } else {\n setTimeout(checkDisconnect, 100);\n }\n };\n\n setTimeout(checkDisconnect, 100);\n } else {\n resolve(\"ok\");\n }\n });\n }\n\n /**\n * Send a broadcast message to all subscribers on this channel\n *\n * @param message - Broadcast message with type, event, and payload\n * @returns Promise resolving to status\n *\n * @example\n * ```typescript\n * await channel.send({\n * type: 'broadcast',\n * event: 'cursor-pos',\n * payload: { x: 100, y: 200 }\n * })\n * ```\n */\n async send(message: BroadcastMessage): Promise<\"ok\" | \"error\"> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return \"error\";\n }\n\n try {\n // Generate message ID if acknowledgment is requested\n const messageId = this.config.broadcast?.ack\n ? `msg_${Date.now()}_${++this.messageIdCounter}`\n : undefined;\n\n this.ws.send(\n JSON.stringify({\n type: \"broadcast\",\n channel: this.channelName,\n event: message.event,\n payload: message.payload,\n ...(messageId && { messageId }),\n })\n );\n\n // Handle acknowledgment if configured\n if (this.config.broadcast?.ack && messageId) {\n // Wait for ack response with timeout (default 5 seconds)\n const ackTimeout = this.config.broadcast.ackTimeout || 5000;\n return await new Promise<\"ok\" | \"error\">((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingAcks.delete(messageId);\n reject(new Error(\"Acknowledgment timeout\"));\n }, ackTimeout);\n\n this.pendingAcks.set(messageId, {\n resolve: (value) => {\n clearTimeout(timeout);\n this.pendingAcks.delete(messageId);\n resolve(value as \"ok\" | \"error\");\n },\n reject: (reason) => {\n clearTimeout(timeout);\n this.pendingAcks.delete(messageId);\n reject(reason);\n },\n timeout,\n });\n }).catch((error) => {\n console.error(\"[Fluxbase Realtime] Acknowledgment error:\", error);\n return \"error\" as const;\n });\n }\n\n return \"ok\";\n } catch (error) {\n console.error(\"[Fluxbase Realtime] Failed to send broadcast:\", error);\n return \"error\";\n }\n }\n\n /**\n * Track user presence on this channel\n *\n * @param state - Presence state to track\n * @returns Promise resolving to status\n *\n * @example\n * ```typescript\n * await channel.track({\n * user_id: 123,\n * status: 'online'\n * })\n * ```\n */\n async track(state: PresenceState): Promise<\"ok\" | \"error\"> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return \"error\";\n }\n\n try {\n // Generate presence key if not set\n if (!this.myPresenceKey) {\n this.myPresenceKey =\n this.config.presence?.key || `presence-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n this.ws.send(\n JSON.stringify({\n type: \"presence\",\n channel: this.channelName,\n event: \"track\",\n payload: {\n key: this.myPresenceKey,\n state,\n },\n })\n );\n\n return \"ok\";\n } catch (error) {\n console.error(\"[Fluxbase Realtime] Failed to track presence:\", error);\n return \"error\";\n }\n }\n\n /**\n * Stop tracking presence on this channel\n *\n * @returns Promise resolving to status\n *\n * @example\n * ```typescript\n * await channel.untrack()\n * ```\n */\n async untrack(): Promise<\"ok\" | \"error\"> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return \"error\";\n }\n\n if (!this.myPresenceKey) {\n return \"ok\"; // Already not tracking\n }\n\n try {\n this.ws.send(\n JSON.stringify({\n type: \"presence\",\n channel: this.channelName,\n event: \"untrack\",\n payload: {\n key: this.myPresenceKey,\n },\n })\n );\n\n this.myPresenceKey = null;\n return \"ok\";\n } catch (error) {\n console.error(\"[Fluxbase Realtime] Failed to untrack presence:\", error);\n return \"error\";\n }\n }\n\n /**\n * Get current presence state for all users on this channel\n *\n * @returns Current presence state\n *\n * @example\n * ```typescript\n * const state = channel.presenceState()\n * console.log('Online users:', Object.keys(state).length)\n * ```\n */\n presenceState(): Record<string, PresenceState[]> {\n return { ...this._presenceState };\n }\n\n /**\n * Internal: Connect to WebSocket\n */\n private connect() {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n return;\n }\n\n // Build WebSocket URL\n const wsUrl = new URL(this.url);\n wsUrl.protocol = wsUrl.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n wsUrl.pathname = \"/realtime\";\n\n if (this.token) {\n wsUrl.searchParams.set(\"token\", this.token);\n }\n\n this.ws = new WebSocket(wsUrl.toString());\n\n this.ws.onopen = () => {\n console.log(\"[Fluxbase Realtime] Connected\");\n this.reconnectAttempts = 0;\n\n // Subscribe to channel with optional config\n const subscribeMessage: RealtimeMessage = {\n type: \"subscribe\",\n channel: this.channelName,\n };\n\n // Add subscription config if using new postgres_changes API\n if (this.subscriptionConfig) {\n subscribeMessage.config = this.subscriptionConfig;\n }\n\n this.sendMessage(subscribeMessage);\n\n // Start heartbeat\n this.startHeartbeat();\n };\n\n this.ws.onmessage = (event) => {\n try {\n const message: RealtimeMessage = JSON.parse(event.data);\n this.handleMessage(message);\n } catch (err) {\n console.error(\"[Fluxbase Realtime] Failed to parse message:\", err);\n }\n };\n\n this.ws.onerror = (error) => {\n console.error(\"[Fluxbase Realtime] WebSocket error:\", error);\n };\n\n this.ws.onclose = () => {\n console.log(\"[Fluxbase Realtime] Disconnected\");\n this.stopHeartbeat();\n this.attemptReconnect();\n };\n }\n\n /**\n * Internal: Disconnect WebSocket\n */\n private disconnect() {\n this.stopHeartbeat();\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n\n /**\n * Internal: Send a message\n */\n private sendMessage(message: RealtimeMessage) {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(message));\n }\n }\n\n /**\n * Internal: Handle incoming message\n */\n private handleMessage(message: RealtimeMessage) {\n switch (message.type) {\n case \"heartbeat\":\n // Echo heartbeat back\n this.ws?.send(JSON.stringify({ type: \"heartbeat\" }));\n break;\n\n case \"broadcast\":\n if (message.broadcast) {\n this.handleBroadcastMessage(message.broadcast);\n } else if (message.payload) {\n // Legacy postgres_changes format\n this.handlePostgresChanges(message.payload);\n }\n break;\n\n case \"presence\":\n if (message.presence) {\n this.handlePresenceMessage(message.presence);\n }\n break;\n\n case \"ack\":\n // Handle broadcast acknowledgment\n if (message.messageId && this.pendingAcks.has(message.messageId)) {\n const ackHandler = this.pendingAcks.get(message.messageId);\n if (ackHandler) {\n ackHandler.resolve(message.status || \"ok\");\n }\n } else {\n // Log subscription acknowledgments or other acks\n console.log(\"[Fluxbase Realtime] Acknowledged:\", message);\n }\n break;\n\n case \"error\":\n console.error(\"[Fluxbase Realtime] Error:\", message.error);\n break;\n }\n }\n\n /**\n * Internal: Handle broadcast message\n */\n private handleBroadcastMessage(message: any) {\n const event = message.event;\n const payload: RealtimeBroadcastPayload = {\n event,\n payload: message.payload,\n };\n\n // Filter self-messages if configured\n if (!this.config.broadcast?.self && message.self) {\n return;\n }\n\n // Call event-specific callbacks\n const callbacks = this.broadcastCallbacks.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => callback(payload));\n }\n\n // Call wildcard callbacks\n const wildcardCallbacks = this.broadcastCallbacks.get(\"*\");\n if (wildcardCallbacks) {\n wildcardCallbacks.forEach((callback) => callback(payload));\n }\n }\n\n /**\n * Internal: Handle presence message\n */\n private handlePresenceMessage(message: any) {\n const event = message.event as \"sync\" | \"join\" | \"leave\";\n const payload: RealtimePresencePayload = {\n event,\n key: message.key,\n newPresences: message.newPresences,\n leftPresences: message.leftPresences,\n currentPresences: message.currentPresences || this._presenceState,\n };\n\n // Update local presence state\n if (message.currentPresences) {\n this._presenceState = message.currentPresences;\n }\n\n // Call event-specific callbacks\n const callbacks = this.presenceCallbacks.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => callback(payload));\n }\n }\n\n /**\n * Internal: Handle postgres_changes message\n */\n private handlePostgresChanges(payload: any) {\n // Convert to Supabase-compatible format\n const supabasePayload: RealtimePostgresChangesPayload = {\n eventType: payload.type || payload.eventType,\n schema: payload.schema,\n table: payload.table,\n commit_timestamp:\n payload.timestamp ||\n payload.commit_timestamp ||\n new Date().toISOString(),\n new: payload.new_record || payload.new || {},\n old: payload.old_record || payload.old || {},\n errors: payload.errors || null,\n };\n\n // Call event-specific callbacks\n const callbacks = this.callbacks.get(supabasePayload.eventType);\n if (callbacks) {\n callbacks.forEach((callback) => callback(supabasePayload));\n }\n\n // Call wildcard callbacks\n const wildcardCallbacks = this.callbacks.get(\"*\");\n if (wildcardCallbacks) {\n wildcardCallbacks.forEach((callback) => callback(supabasePayload));\n }\n }\n\n /**\n * Internal: Start heartbeat interval\n */\n private startHeartbeat() {\n this.heartbeatInterval = setInterval(() => {\n this.sendMessage({ type: \"heartbeat\" });\n }, 30000); // 30 seconds\n }\n\n /**\n * Internal: Stop heartbeat interval\n */\n private stopHeartbeat() {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n }\n\n /**\n * Internal: Attempt to reconnect\n */\n private attemptReconnect() {\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.error(\"[Fluxbase Realtime] Max reconnect attempts reached\");\n return;\n }\n\n this.reconnectAttempts++;\n const delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);\n\n console.log(\n `[Fluxbase Realtime] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`,\n );\n\n setTimeout(() => {\n this.connect();\n }, delay);\n }\n}\n\nexport class FluxbaseRealtime {\n private url: string;\n private token: string | null;\n private channels: Map<string, RealtimeChannel> = new Map();\n\n constructor(url: string, token: string | null = null) {\n this.url = url;\n this.token = token;\n }\n\n /**\n * Create or get a channel with optional configuration\n *\n * @param channelName - Channel name (e.g., 'table:public.products')\n * @param config - Optional channel configuration\n * @returns RealtimeChannel instance\n *\n * @example\n * ```typescript\n * const channel = realtime.channel('room-1', {\n * broadcast: { self: true, ack: true },\n * presence: { key: 'user-123' }\n * })\n * ```\n */\n channel(\n channelName: string,\n config?: RealtimeChannelConfig\n ): RealtimeChannel {\n // Create a unique key based on name and config\n const configKey = config ? JSON.stringify(config) : \"\";\n const key = `${channelName}:${configKey}`;\n\n if (this.channels.has(key)) {\n return this.channels.get(key)!;\n }\n\n const channel = new RealtimeChannel(\n this.url,\n channelName,\n this.token,\n config\n );\n this.channels.set(key, channel);\n return channel;\n }\n\n /**\n * Remove a specific channel\n *\n * @param channel - The channel to remove\n * @returns Promise resolving to status\n *\n * @example\n * ```typescript\n * const channel = realtime.channel('room-1')\n * await realtime.removeChannel(channel)\n * ```\n */\n async removeChannel(\n channel: RealtimeChannel\n ): Promise<\"ok\" | \"error\"> {\n // Unsubscribe the channel\n await channel.unsubscribe();\n\n // Remove from channels map\n for (const [key, ch] of this.channels.entries()) {\n if (ch === channel) {\n this.channels.delete(key);\n return \"ok\";\n }\n }\n\n return \"error\";\n }\n\n /**\n * Remove all channels\n */\n removeAllChannels() {\n this.channels.forEach((channel) => channel.unsubscribe());\n this.channels.clear();\n }\n\n /**\n * Update auth token for all channels\n * @param token - The new auth token\n */\n setAuth(token: string | null) {\n this.token = token;\n // Note: Existing channels won't be updated, only new ones\n // For existing channels to update, they need to reconnect\n }\n}\n","/**\n * Storage client for file operations\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n FileObject,\n UploadOptions,\n UploadProgress,\n ListOptions,\n SignedUrlOptions,\n ShareFileOptions,\n FileShare,\n BucketSettings,\n Bucket,\n} from \"./types\";\n\nexport class StorageBucket {\n private fetch: FluxbaseFetch;\n private bucketName: string;\n\n constructor(fetch: FluxbaseFetch, bucketName: string) {\n this.fetch = fetch;\n this.bucketName = bucketName;\n }\n\n /**\n * Upload a file to the bucket\n * @param path - The path/key for the file\n * @param file - The file to upload (File, Blob, or ArrayBuffer)\n * @param options - Upload options\n */\n async upload(\n path: string,\n file: File | Blob | ArrayBuffer,\n options?: UploadOptions,\n ): Promise<{ data: { id: string; path: string; fullPath: string } | null; error: Error | null }> {\n try {\n // Prepare FormData (common to both code paths)\n const formData = new FormData();\n\n // Convert to Blob if ArrayBuffer\n const blob = file instanceof ArrayBuffer ? new Blob([file]) : file;\n\n formData.append(\"file\", blob);\n\n if (options?.contentType) {\n formData.append(\"content_type\", options.contentType);\n }\n\n if (options?.metadata) {\n formData.append(\"metadata\", JSON.stringify(options.metadata));\n }\n\n if (options?.cacheControl) {\n formData.append(\"cache_control\", options.cacheControl);\n }\n\n if (options?.upsert !== undefined) {\n formData.append(\"upsert\", String(options.upsert));\n }\n\n let response: any;\n\n // Use XMLHttpRequest for progress tracking if callback is provided\n if (options?.onUploadProgress) {\n response = await this.uploadWithProgress(path, formData, options.onUploadProgress);\n } else {\n // Use standard fetch for uploads without progress tracking\n response = await this.fetch.request<any>(\n `/api/v1/storage/${this.bucketName}/${path}`,\n {\n method: \"POST\",\n body: formData,\n headers: {}, // Let browser set Content-Type for FormData\n },\n );\n }\n\n // Return Supabase-compatible response format\n return {\n data: {\n id: response.id || response.key || path,\n path: path,\n fullPath: `${this.bucketName}/${path}`\n },\n error: null\n };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Upload with progress tracking using XMLHttpRequest\n * @private\n */\n private uploadWithProgress(\n path: string,\n formData: FormData,\n onProgress: (progress: UploadProgress) => void,\n ): Promise<any> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n const url = `${this.fetch[\"baseUrl\"]}/api/v1/storage/${this.bucketName}/${path}`;\n\n // Track upload progress\n xhr.upload.addEventListener('progress', (event) => {\n if (event.lengthComputable) {\n const percentage = Math.round((event.loaded / event.total) * 100);\n onProgress({\n loaded: event.loaded,\n total: event.total,\n percentage,\n });\n }\n });\n\n // Handle completion\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const response = JSON.parse(xhr.responseText);\n resolve(response);\n } catch (e) {\n resolve(xhr.responseText);\n }\n } else {\n try {\n const errorData = JSON.parse(xhr.responseText);\n reject(new Error(errorData.error || xhr.statusText));\n } catch (e) {\n reject(new Error(xhr.statusText));\n }\n }\n });\n\n // Handle errors\n xhr.addEventListener('error', () => {\n reject(new Error('Upload failed'));\n });\n\n xhr.addEventListener('abort', () => {\n reject(new Error('Upload aborted'));\n });\n\n // Open and send request\n xhr.open('POST', url);\n\n // Set authorization header if present\n const headers = this.fetch[\"defaultHeaders\"];\n for (const [key, value] of Object.entries(headers)) {\n // Don't set Content-Type header - let browser handle it for FormData\n if (key.toLowerCase() !== 'content-type') {\n xhr.setRequestHeader(key, value);\n }\n }\n\n xhr.send(formData);\n });\n }\n\n /**\n * Download a file from the bucket\n * @param path - The path/key of the file\n */\n async download(\n path: string,\n ): Promise<{ data: Blob | null; error: Error | null }> {\n try {\n const response = await fetch(\n `${this.fetch[\"baseUrl\"]}/api/v1/storage/${this.bucketName}/${path}`,\n {\n headers: this.fetch[\"defaultHeaders\"],\n },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to download file: ${response.statusText}`);\n }\n\n const blob = await response.blob();\n return { data: blob, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List files in the bucket\n * Supports both Supabase-style list(path, options) and Fluxbase-style list(options)\n * @param pathOrOptions - The folder path or list options\n * @param maybeOptions - List options when first param is a path\n */\n async list(\n pathOrOptions?: string | ListOptions,\n maybeOptions?: ListOptions,\n ): Promise<{ data: FileObject[] | null; error: Error | null }> {\n try {\n const params = new URLSearchParams();\n\n // Determine if first arg is path or options\n let prefix: string | undefined;\n let options: ListOptions | undefined;\n\n if (typeof pathOrOptions === 'string') {\n // Supabase-style: list('path/', { limit: 10 })\n prefix = pathOrOptions;\n options = maybeOptions;\n } else {\n // Fluxbase-style: list({ prefix: 'path/', limit: 10 })\n options = pathOrOptions;\n prefix = options?.prefix;\n }\n\n if (prefix) {\n params.set(\"prefix\", prefix);\n }\n\n if (options?.limit) {\n params.set(\"limit\", String(options.limit));\n }\n\n if (options?.offset) {\n params.set(\"offset\", String(options.offset));\n }\n\n const queryString = params.toString();\n const path = `/api/v1/storage/${this.bucketName}${queryString ? `?${queryString}` : \"\"}`;\n\n const response = await this.fetch.get<{ files: any[] }>(path);\n\n // Convert to FileObject format\n const files: FileObject[] = (response.files || []).map((file: any) => ({\n name: file.key || file.name,\n id: file.id,\n bucket_id: file.bucket || this.bucketName,\n created_at: file.last_modified || file.created_at,\n updated_at: file.updated_at,\n last_accessed_at: file.last_accessed_at,\n metadata: file.metadata,\n }));\n\n return { data: files, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Remove files from the bucket\n * @param paths - Array of file paths to remove\n */\n async remove(paths: string[]): Promise<{ data: FileObject[] | null; error: Error | null }> {\n try {\n const removedFiles: FileObject[] = [];\n\n // Delete files one by one (could be optimized with batch endpoint)\n for (const path of paths) {\n await this.fetch.delete(`/api/v1/storage/${this.bucketName}/${path}`);\n // Add to removed files list\n removedFiles.push({\n name: path,\n bucket_id: this.bucketName,\n });\n }\n\n return { data: removedFiles, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Get a public URL for a file\n * @param path - The file path\n */\n getPublicUrl(path: string): { data: { publicUrl: string } } {\n const publicUrl = `${this.fetch[\"baseUrl\"]}/api/v1/storage/${this.bucketName}/${path}`;\n return { data: { publicUrl } };\n }\n\n /**\n * Create a signed URL for temporary access to a file\n * @param path - The file path\n * @param options - Signed URL options\n */\n async createSignedUrl(\n path: string,\n options?: SignedUrlOptions,\n ): Promise<{ data: { signedUrl: string } | null; error: Error | null }> {\n try {\n const expiresIn = options?.expiresIn || 3600; // Default 1 hour\n\n const data = await this.fetch.post<{ signed_url: string }>(\n `/api/v1/storage/${this.bucketName}/sign/${path}`,\n { expires_in: expiresIn },\n );\n\n return { data: { signedUrl: data.signed_url }, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Move a file to a new location\n * @param fromPath - Current file path\n * @param toPath - New file path\n */\n async move(\n fromPath: string,\n toPath: string,\n ): Promise<{ data: { message: string } | null; error: Error | null }> {\n try {\n await this.fetch.post(\n `/api/v1/storage/${this.bucketName}/move`,\n {\n from_path: fromPath,\n to_path: toPath,\n },\n );\n\n return {\n data: { message: 'Successfully moved' },\n error: null\n };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Copy a file to a new location\n * @param fromPath - Source file path\n * @param toPath - Destination file path\n */\n async copy(\n fromPath: string,\n toPath: string,\n ): Promise<{ data: { path: string } | null; error: Error | null }> {\n try {\n await this.fetch.post(\n `/api/v1/storage/${this.bucketName}/copy`,\n {\n from_path: fromPath,\n to_path: toPath,\n },\n );\n\n return {\n data: { path: toPath },\n error: null\n };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Share a file with another user (RLS)\n * @param path - The file path\n * @param options - Share options (userId and permission)\n */\n async share(\n path: string,\n options: ShareFileOptions,\n ): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.post(\n `/api/v1/storage/${this.bucketName}/${path}/share`,\n {\n user_id: options.userId,\n permission: options.permission,\n },\n );\n\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Revoke file access from a user (RLS)\n * @param path - The file path\n * @param userId - The user ID to revoke access from\n */\n async revokeShare(\n path: string,\n userId: string,\n ): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.delete(\n `/api/v1/storage/${this.bucketName}/${path}/share/${userId}`,\n );\n\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * List users a file is shared with (RLS)\n * @param path - The file path\n */\n async listShares(\n path: string,\n ): Promise<{ data: FileShare[] | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<{ shares: FileShare[] }>(\n `/api/v1/storage/${this.bucketName}/${path}/shares`,\n );\n\n return { data: data.shares || [], error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n}\n\nexport class FluxbaseStorage {\n private fetch: FluxbaseFetch;\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch;\n }\n\n /**\n * Get a reference to a storage bucket\n * @param bucketName - The name of the bucket\n */\n from(bucketName: string): StorageBucket {\n return new StorageBucket(this.fetch, bucketName);\n }\n\n /**\n * List all buckets\n */\n async listBuckets(): Promise<{\n data: Array<{ name: string; created_at: string }> | null;\n error: Error | null;\n }> {\n try {\n const data = await this.fetch.get<{\n buckets: Array<{ name: string; created_at: string }>;\n }>(\"/api/v1/storage/buckets\");\n\n return { data: data.buckets || [], error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Create a new bucket\n * @param bucketName - The name of the bucket to create\n */\n async createBucket(\n bucketName: string,\n ): Promise<{ data: { name: string } | null; error: Error | null }> {\n try {\n await this.fetch.post(`/api/v1/storage/buckets/${bucketName}`);\n return { data: { name: bucketName }, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Delete a bucket\n * @param bucketName - The name of the bucket to delete\n */\n async deleteBucket(\n bucketName: string,\n ): Promise<{ data: { message: string } | null; error: Error | null }> {\n try {\n await this.fetch.delete(`/api/v1/storage/buckets/${bucketName}`);\n return { data: { message: 'Successfully deleted' }, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Empty a bucket (delete all files)\n * @param bucketName - The name of the bucket to empty\n */\n async emptyBucket(\n bucketName: string,\n ): Promise<{ data: { message: string } | null; error: Error | null }> {\n try {\n // List all files and delete them\n const bucket = this.from(bucketName);\n const { data: objects, error: listError } = await bucket.list();\n\n if (listError) {\n return { data: null, error: listError };\n }\n\n if (objects && objects.length > 0) {\n const paths = objects.map((obj) => obj.name);\n const { error: removeError } = await bucket.remove(paths);\n\n if (removeError) {\n return { data: null, error: removeError };\n }\n }\n\n return { data: { message: 'Successfully emptied' }, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Update bucket settings (RLS - requires admin or service key)\n * @param bucketName - The name of the bucket\n * @param settings - Bucket settings to update\n */\n async updateBucketSettings(\n bucketName: string,\n settings: BucketSettings,\n ): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.put(`/api/v1/storage/buckets/${bucketName}`, settings);\n return { data: null, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Get bucket details\n * @param bucketName - The name of the bucket\n */\n async getBucket(\n bucketName: string,\n ): Promise<{ data: Bucket | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<Bucket>(\n `/api/v1/storage/buckets/${bucketName}`,\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n}\n","/**\n * Edge Functions module for Fluxbase SDK\n * Compatible with Supabase Functions API\n *\n * @example\n * ```typescript\n * // Invoke a function\n * const { data, error } = await client.functions.invoke('hello-world', {\n * body: { name: 'Alice' }\n * })\n *\n * // With custom headers\n * const { data, error } = await client.functions.invoke('api-call', {\n * body: { query: 'data' },\n * headers: { 'X-Custom-Header': 'value' },\n * method: 'POST'\n * })\n * ```\n */\n\nimport type { FluxbaseFetch } from './fetch'\nimport type {\n FunctionInvokeOptions,\n EdgeFunction,\n CreateFunctionRequest,\n UpdateFunctionRequest,\n EdgeFunctionExecution,\n} from './types'\n\n/**\n * Edge Functions client for invoking and managing serverless functions\n * API-compatible with Supabase Functions\n *\n * @category Functions\n */\nexport class FluxbaseFunctions {\n private fetch: FluxbaseFetch\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch\n }\n\n /**\n * Invoke an edge function\n *\n * This method is fully compatible with Supabase's functions.invoke() API.\n *\n * @param functionName - The name of the function to invoke\n * @param options - Invocation options including body, headers, and HTTP method\n * @returns Promise resolving to { data, error } tuple\n *\n * @example\n * ```typescript\n * // Simple invocation\n * const { data, error } = await client.functions.invoke('hello', {\n * body: { name: 'World' }\n * })\n *\n * // With GET method\n * const { data, error } = await client.functions.invoke('get-data', {\n * method: 'GET'\n * })\n *\n * // With custom headers\n * const { data, error } = await client.functions.invoke('api-proxy', {\n * body: { query: 'search' },\n * headers: { 'Authorization': 'Bearer token' },\n * method: 'POST'\n * })\n * ```\n */\n async invoke<T = any>(\n functionName: string,\n options?: FunctionInvokeOptions\n ): Promise<{ data: T | null; error: Error | null }> {\n try {\n const method = options?.method || 'POST'\n const headers = options?.headers || {}\n const body = options?.body\n\n // Use the Fluxbase backend endpoint\n const endpoint = `/api/v1/functions/${functionName}/invoke`\n\n let response: T\n\n // Route to appropriate HTTP method\n switch (method) {\n case 'GET':\n response = await this.fetch.get<T>(endpoint, { headers })\n break\n case 'DELETE':\n response = await this.fetch.delete<T>(endpoint, { headers })\n break\n case 'PUT':\n response = await this.fetch.put<T>(endpoint, body, { headers })\n break\n case 'PATCH':\n response = await this.fetch.patch<T>(endpoint, body, { headers })\n break\n case 'POST':\n default:\n response = await this.fetch.post<T>(endpoint, body, { headers })\n break\n }\n\n return { data: response, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Create a new edge function\n *\n * @param request - Function configuration and code\n * @returns Promise resolving to { data, error } tuple with created function metadata\n *\n * @example\n * ```typescript\n * const { data, error } = await client.functions.create({\n * name: 'my-function',\n * code: 'export default async function handler(req) { return { hello: \"world\" } }',\n * enabled: true\n * })\n * ```\n */\n async create(\n request: CreateFunctionRequest\n ): Promise<{ data: EdgeFunction | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<EdgeFunction>('/api/v1/functions', request)\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * List all edge functions\n *\n * @returns Promise resolving to { data, error } tuple with array of functions\n *\n * @example\n * ```typescript\n * const { data, error } = await client.functions.list()\n * if (data) {\n * console.log('Functions:', data.map(f => f.name))\n * }\n * ```\n */\n async list(): Promise<{ data: EdgeFunction[] | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<EdgeFunction[]>('/api/v1/functions')\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Get details of a specific edge function\n *\n * @param name - Function name\n * @returns Promise resolving to { data, error } tuple with function metadata\n *\n * @example\n * ```typescript\n * const { data, error } = await client.functions.get('my-function')\n * if (data) {\n * console.log('Function version:', data.version)\n * }\n * ```\n */\n async get(name: string): Promise<{ data: EdgeFunction | null; error: Error | null }> {\n try {\n const data = await this.fetch.get<EdgeFunction>(`/api/v1/functions/${name}`)\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Update an existing edge function\n *\n * @param name - Function name\n * @param updates - Fields to update\n * @returns Promise resolving to { data, error } tuple with updated function metadata\n *\n * @example\n * ```typescript\n * const { data, error } = await client.functions.update('my-function', {\n * enabled: false,\n * description: 'Updated description'\n * })\n * ```\n */\n async update(\n name: string,\n updates: UpdateFunctionRequest\n ): Promise<{ data: EdgeFunction | null; error: Error | null }> {\n try {\n const data = await this.fetch.put<EdgeFunction>(`/api/v1/functions/${name}`, updates)\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Delete an edge function\n *\n * @param name - Function name\n * @returns Promise resolving to { data, error } tuple\n *\n * @example\n * ```typescript\n * const { data, error } = await client.functions.delete('my-function')\n * ```\n */\n async delete(name: string): Promise<{ data: null; error: Error | null }> {\n try {\n await this.fetch.delete(`/api/v1/functions/${name}`)\n return { data: null, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n\n /**\n * Get execution history for an edge function\n *\n * @param name - Function name\n * @param limit - Maximum number of executions to return (optional)\n * @returns Promise resolving to { data, error } tuple with execution records\n *\n * @example\n * ```typescript\n * const { data, error } = await client.functions.getExecutions('my-function', 10)\n * if (data) {\n * data.forEach(exec => {\n * console.log(`${exec.executed_at}: ${exec.status} (${exec.duration_ms}ms)`)\n * })\n * }\n * ```\n */\n async getExecutions(\n name: string,\n limit?: number\n ): Promise<{ data: EdgeFunctionExecution[] | null; error: Error | null }> {\n try {\n const params = limit ? `?limit=${limit}` : ''\n const data = await this.fetch.get<EdgeFunctionExecution[]>(\n `/api/v1/functions/${name}/executions${params}`\n )\n return { data, error: null }\n } catch (error) {\n return { data: null, error: error as Error }\n }\n }\n}\n","import type { FluxbaseFetch } from \"./fetch\";\nimport type {\n SystemSetting,\n UpdateSystemSettingRequest,\n ListSystemSettingsResponse,\n AppSettings,\n UpdateAppSettingsRequest,\n CustomSetting,\n EmailTemplate,\n EmailTemplateType,\n UpdateEmailTemplateRequest,\n ListEmailTemplatesResponse,\n} from \"./types\";\n\n/**\n * System Settings Manager\n *\n * Manages low-level system settings with key-value storage.\n * For application-level settings, use AppSettingsManager instead.\n *\n * @example\n * ```typescript\n * const settings = client.admin.settings.system\n *\n * // List all system settings\n * const { settings } = await settings.list()\n *\n * // Get specific setting\n * const setting = await settings.get('app.auth.enable_signup')\n *\n * // Update setting\n * await settings.update('app.auth.enable_signup', {\n * value: { value: true },\n * description: 'Enable user signup'\n * })\n *\n * // Delete setting\n * await settings.delete('app.auth.enable_signup')\n * ```\n */\nexport class SystemSettingsManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * List all system settings\n *\n * @returns Promise resolving to ListSystemSettingsResponse\n *\n * @example\n * ```typescript\n * const response = await client.admin.settings.system.list()\n * console.log(response.settings)\n * ```\n */\n async list(): Promise<ListSystemSettingsResponse> {\n const settings = await this.fetch.get<SystemSetting[]>(\n \"/api/v1/admin/system/settings\",\n );\n return { settings: Array.isArray(settings) ? settings : [] };\n }\n\n /**\n * Get a specific system setting by key\n *\n * @param key - Setting key (e.g., 'app.auth.enable_signup')\n * @returns Promise resolving to SystemSetting\n *\n * @example\n * ```typescript\n * const setting = await client.admin.settings.system.get('app.auth.enable_signup')\n * console.log(setting.value)\n * ```\n */\n async get(key: string): Promise<SystemSetting> {\n return await this.fetch.get<SystemSetting>(\n `/api/v1/admin/system/settings/${key}`,\n );\n }\n\n /**\n * Update or create a system setting\n *\n * @param key - Setting key\n * @param request - Update request with value and optional description\n * @returns Promise resolving to SystemSetting\n *\n * @example\n * ```typescript\n * const updated = await client.admin.settings.system.update('app.auth.enable_signup', {\n * value: { value: true },\n * description: 'Enable user signup'\n * })\n * ```\n */\n async update(\n key: string,\n request: UpdateSystemSettingRequest,\n ): Promise<SystemSetting> {\n return await this.fetch.put<SystemSetting>(\n `/api/v1/admin/system/settings/${key}`,\n request,\n );\n }\n\n /**\n * Delete a system setting\n *\n * @param key - Setting key to delete\n * @returns Promise<void>\n *\n * @example\n * ```typescript\n * await client.admin.settings.system.delete('app.auth.enable_signup')\n * ```\n */\n async delete(key: string): Promise<void> {\n await this.fetch.delete(`/api/v1/admin/system/settings/${key}`);\n }\n}\n\n/**\n * Application Settings Manager\n *\n * Manages high-level application settings with a structured API.\n * Provides type-safe access to authentication, features, email, and security settings.\n *\n * @example\n * ```typescript\n * const settings = client.admin.settings.app\n *\n * // Get all app settings\n * const appSettings = await settings.get()\n * console.log(appSettings.authentication.enable_signup)\n *\n * // Update specific settings\n * const updated = await settings.update({\n * authentication: {\n * enable_signup: true,\n * password_min_length: 12\n * }\n * })\n *\n * // Reset to defaults\n * await settings.reset()\n * ```\n */\nexport class AppSettingsManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Get all application settings\n *\n * Returns structured settings for authentication, features, email, and security.\n *\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * const settings = await client.admin.settings.app.get()\n *\n * console.log('Signup enabled:', settings.authentication.enable_signup)\n * console.log('Realtime enabled:', settings.features.enable_realtime)\n * console.log('Email provider:', settings.email.provider)\n * ```\n */\n async get(): Promise<AppSettings> {\n return await this.fetch.get<AppSettings>(\"/api/v1/admin/app/settings\");\n }\n\n /**\n * Update application settings\n *\n * Supports partial updates - only provide the fields you want to change.\n *\n * @param request - Settings to update (partial update supported)\n * @returns Promise resolving to AppSettings - Updated settings\n *\n * @example\n * ```typescript\n * // Update authentication settings\n * const updated = await client.admin.settings.app.update({\n * authentication: {\n * enable_signup: true,\n * password_min_length: 12\n * }\n * })\n *\n * // Update multiple categories\n * await client.admin.settings.app.update({\n * authentication: { enable_signup: false },\n * features: { enable_realtime: true },\n * security: { enable_global_rate_limit: true }\n * })\n * ```\n */\n async update(request: UpdateAppSettingsRequest): Promise<AppSettings> {\n return await this.fetch.put<AppSettings>(\n \"/api/v1/admin/app/settings\",\n request,\n );\n }\n\n /**\n * Reset all application settings to defaults\n *\n * This will delete all custom settings and return to default values.\n *\n * @returns Promise resolving to AppSettings - Default settings\n *\n * @example\n * ```typescript\n * const defaults = await client.admin.settings.app.reset()\n * console.log('Settings reset to defaults:', defaults)\n * ```\n */\n async reset(): Promise<AppSettings> {\n return await this.fetch.post<AppSettings>(\n \"/api/v1/admin/app/settings/reset\",\n {},\n );\n }\n\n /**\n * Enable user signup\n *\n * Convenience method to enable user registration.\n *\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.enableSignup()\n * ```\n */\n async enableSignup(): Promise<AppSettings> {\n return await this.update({\n authentication: { enable_signup: true },\n });\n }\n\n /**\n * Disable user signup\n *\n * Convenience method to disable user registration.\n *\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.disableSignup()\n * ```\n */\n async disableSignup(): Promise<AppSettings> {\n return await this.update({\n authentication: { enable_signup: false },\n });\n }\n\n /**\n * Update password minimum length\n *\n * Convenience method to set password requirements.\n *\n * @param length - Minimum password length (8-128 characters)\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setPasswordMinLength(12)\n * ```\n */\n async setPasswordMinLength(length: number): Promise<AppSettings> {\n if (length < 8 || length > 128) {\n throw new Error(\n \"Password minimum length must be between 8 and 128 characters\",\n );\n }\n\n return await this.update({\n authentication: { password_min_length: length },\n });\n }\n\n /**\n * Enable or disable a feature\n *\n * Convenience method to toggle feature flags.\n *\n * @param feature - Feature name ('realtime' | 'storage' | 'functions')\n * @param enabled - Whether to enable or disable the feature\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * // Enable realtime\n * await client.admin.settings.app.setFeature('realtime', true)\n *\n * // Disable storage\n * await client.admin.settings.app.setFeature('storage', false)\n * ```\n */\n async setFeature(\n feature: \"realtime\" | \"storage\" | \"functions\",\n enabled: boolean,\n ): Promise<AppSettings> {\n const featureKey =\n feature === \"realtime\"\n ? \"enable_realtime\"\n : feature === \"storage\"\n ? \"enable_storage\"\n : \"enable_functions\";\n\n return await this.update({\n features: { [featureKey]: enabled },\n });\n }\n\n /**\n * Enable or disable global rate limiting\n *\n * Convenience method to toggle global rate limiting.\n *\n * @param enabled - Whether to enable rate limiting\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setRateLimiting(true)\n * ```\n */\n async setRateLimiting(enabled: boolean): Promise<AppSettings> {\n return await this.update({\n security: { enable_global_rate_limit: enabled },\n });\n }\n\n /**\n * Configure SMTP email provider\n *\n * Convenience method to set up SMTP email delivery.\n *\n * @param config - SMTP configuration\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.configureSMTP({\n * host: 'smtp.gmail.com',\n * port: 587,\n * username: 'your-email@gmail.com',\n * password: 'your-app-password',\n * use_tls: true,\n * from_address: 'noreply@yourapp.com',\n * from_name: 'Your App'\n * })\n * ```\n */\n async configureSMTP(config: {\n host: string;\n port: number;\n username: string;\n password: string;\n use_tls: boolean;\n from_address?: string;\n from_name?: string;\n reply_to_address?: string;\n }): Promise<AppSettings> {\n return await this.update({\n email: {\n enabled: true,\n provider: \"smtp\",\n from_address: config.from_address,\n from_name: config.from_name,\n reply_to_address: config.reply_to_address,\n smtp: {\n host: config.host,\n port: config.port,\n username: config.username,\n password: config.password,\n use_tls: config.use_tls,\n },\n },\n });\n }\n\n /**\n * Configure SendGrid email provider\n *\n * Convenience method to set up SendGrid email delivery.\n *\n * @param apiKey - SendGrid API key\n * @param options - Optional from address, name, and reply-to\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.configureSendGrid('SG.xxx', {\n * from_address: 'noreply@yourapp.com',\n * from_name: 'Your App'\n * })\n * ```\n */\n async configureSendGrid(\n apiKey: string,\n options?: {\n from_address?: string;\n from_name?: string;\n reply_to_address?: string;\n },\n ): Promise<AppSettings> {\n return await this.update({\n email: {\n enabled: true,\n provider: \"sendgrid\",\n from_address: options?.from_address,\n from_name: options?.from_name,\n reply_to_address: options?.reply_to_address,\n sendgrid: {\n api_key: apiKey,\n },\n },\n });\n }\n\n /**\n * Configure Mailgun email provider\n *\n * Convenience method to set up Mailgun email delivery.\n *\n * @param apiKey - Mailgun API key\n * @param domain - Mailgun domain\n * @param options - Optional EU region flag and email addresses\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.configureMailgun('key-xxx', 'mg.yourapp.com', {\n * eu_region: false,\n * from_address: 'noreply@yourapp.com',\n * from_name: 'Your App'\n * })\n * ```\n */\n async configureMailgun(\n apiKey: string,\n domain: string,\n options?: {\n eu_region?: boolean;\n from_address?: string;\n from_name?: string;\n reply_to_address?: string;\n },\n ): Promise<AppSettings> {\n return await this.update({\n email: {\n enabled: true,\n provider: \"mailgun\",\n from_address: options?.from_address,\n from_name: options?.from_name,\n reply_to_address: options?.reply_to_address,\n mailgun: {\n api_key: apiKey,\n domain: domain,\n eu_region: options?.eu_region ?? false,\n },\n },\n });\n }\n\n /**\n * Configure AWS SES email provider\n *\n * Convenience method to set up AWS SES email delivery.\n *\n * @param accessKeyId - AWS access key ID\n * @param secretAccessKey - AWS secret access key\n * @param region - AWS region (e.g., 'us-east-1')\n * @param options - Optional email addresses\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.configureSES(\n * 'AKIAIOSFODNN7EXAMPLE',\n * 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',\n * 'us-east-1',\n * {\n * from_address: 'noreply@yourapp.com',\n * from_name: 'Your App'\n * }\n * )\n * ```\n */\n async configureSES(\n accessKeyId: string,\n secretAccessKey: string,\n region: string,\n options?: {\n from_address?: string;\n from_name?: string;\n reply_to_address?: string;\n },\n ): Promise<AppSettings> {\n return await this.update({\n email: {\n enabled: true,\n provider: \"ses\",\n from_address: options?.from_address,\n from_name: options?.from_name,\n reply_to_address: options?.reply_to_address,\n ses: {\n access_key_id: accessKeyId,\n secret_access_key: secretAccessKey,\n region: region,\n },\n },\n });\n }\n\n /**\n * Enable or disable email functionality\n *\n * Convenience method to toggle email system on/off.\n *\n * @param enabled - Whether to enable email\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setEmailEnabled(true)\n * ```\n */\n async setEmailEnabled(enabled: boolean): Promise<AppSettings> {\n return await this.update({\n email: { enabled },\n });\n }\n\n /**\n * Configure password complexity requirements\n *\n * Convenience method to set password validation rules.\n *\n * @param requirements - Password complexity requirements\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setPasswordComplexity({\n * min_length: 12,\n * require_uppercase: true,\n * require_lowercase: true,\n * require_number: true,\n * require_special: true\n * })\n * ```\n */\n async setPasswordComplexity(requirements: {\n min_length?: number;\n require_uppercase?: boolean;\n require_lowercase?: boolean;\n require_number?: boolean;\n require_special?: boolean;\n }): Promise<AppSettings> {\n return await this.update({\n authentication: {\n password_min_length: requirements.min_length,\n password_require_uppercase: requirements.require_uppercase,\n password_require_lowercase: requirements.require_lowercase,\n password_require_number: requirements.require_number,\n password_require_special: requirements.require_special,\n },\n });\n }\n\n /**\n * Configure session settings\n *\n * Convenience method to set session timeout and limits.\n *\n * @param timeoutMinutes - Session timeout in minutes (0 for no timeout)\n * @param maxSessionsPerUser - Maximum concurrent sessions per user (0 for unlimited)\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * // 30 minute sessions, max 3 devices per user\n * await client.admin.settings.app.setSessionSettings(30, 3)\n * ```\n */\n async setSessionSettings(\n timeoutMinutes: number,\n maxSessionsPerUser: number,\n ): Promise<AppSettings> {\n return await this.update({\n authentication: {\n session_timeout_minutes: timeoutMinutes,\n max_sessions_per_user: maxSessionsPerUser,\n },\n });\n }\n\n /**\n * Enable or disable email verification requirement\n *\n * Convenience method to require email verification for new signups.\n *\n * @param required - Whether to require email verification\n * @returns Promise resolving to AppSettings\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setEmailVerificationRequired(true)\n * ```\n */\n async setEmailVerificationRequired(required: boolean): Promise<AppSettings> {\n return await this.update({\n authentication: { require_email_verification: required },\n });\n }\n\n // ===================================================================\n // CUSTOM SETTINGS METHODS\n // Flexible key-value storage for application-specific configuration\n // ===================================================================\n\n /**\n * Get a specific custom setting's value only (without metadata)\n *\n * Convenience method that returns just the value field instead of the full CustomSetting object.\n *\n * @param key - Setting key (e.g., 'billing.tiers', 'features.beta_enabled')\n * @returns Promise resolving to the setting's value\n *\n * @example\n * ```typescript\n * const tiers = await client.admin.settings.app.getSetting('billing.tiers')\n * console.log(tiers) // { free: 1000, pro: 10000, enterprise: 100000 }\n * ```\n */\n async getSetting(key: string): Promise<any> {\n const setting = await this.fetch.get<CustomSetting>(\n `/api/v1/admin/settings/custom/${key}`,\n );\n return setting.value;\n }\n\n /**\n * Get multiple custom settings' values by keys\n *\n * Fetches multiple settings in a single request and returns only their values.\n *\n * @param keys - Array of setting keys to fetch\n * @returns Promise resolving to object mapping keys to values\n *\n * @example\n * ```typescript\n * const values = await client.admin.settings.app.getSettings([\n * 'billing.tiers',\n * 'features.beta_enabled'\n * ])\n * console.log(values)\n * // {\n * // 'billing.tiers': { free: 1000, pro: 10000 },\n * // 'features.beta_enabled': { enabled: true }\n * // }\n * ```\n */\n async getSettings(keys: string[]): Promise<Record<string, any>> {\n const response = await this.fetch.post<CustomSetting[]>(\n \"/api/v1/settings/batch\",\n { keys },\n );\n return response.reduce(\n (acc, setting) => {\n acc[setting.key] = setting.value;\n return acc;\n },\n {} as Record<string, any>,\n );\n }\n\n /**\n * Set or create a custom setting\n *\n * Creates a new custom setting or updates an existing one.\n *\n * @param key - Setting key\n * @param value - Setting value (any JSON-serializable value)\n * @param options - Optional configuration (description, is_public, is_secret, etc.)\n * @returns Promise resolving to CustomSetting\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.setSetting('billing.tiers', {\n * free: 1000,\n * pro: 10000,\n * enterprise: 100000\n * }, {\n * description: 'API quotas per billing tier',\n * is_public: false\n * })\n * ```\n */\n async setSetting(\n key: string,\n value: any,\n options?: {\n description?: string;\n is_public?: boolean;\n is_secret?: boolean;\n value_type?: string;\n },\n ): Promise<CustomSetting> {\n // Try to update first, if not found, create\n try {\n return await this.fetch.put<CustomSetting>(\n `/api/v1/admin/settings/custom/${key}`,\n {\n value,\n description: options?.description,\n is_public: options?.is_public,\n is_secret: options?.is_secret,\n },\n );\n } catch (error: any) {\n // If not found (404), create new setting\n if (error.status === 404 || error.message?.includes(\"not found\")) {\n return await this.fetch.post<CustomSetting>(\n \"/api/v1/admin/settings/custom\",\n {\n key,\n value,\n value_type: options?.value_type || \"json\",\n description: options?.description,\n is_public: options?.is_public ?? false,\n is_secret: options?.is_secret ?? false,\n },\n );\n }\n throw error;\n }\n }\n\n /**\n * List all custom settings\n *\n * @returns Promise resolving to array of CustomSetting objects\n *\n * @example\n * ```typescript\n * const settings = await client.admin.settings.app.listSettings()\n * settings.forEach(s => console.log(s.key, s.value))\n * ```\n */\n async listSettings(): Promise<CustomSetting[]> {\n return await this.fetch.get<CustomSetting[]>(\n \"/api/v1/admin/settings/custom\",\n );\n }\n\n /**\n * Delete a custom setting\n *\n * @param key - Setting key to delete\n * @returns Promise<void>\n *\n * @example\n * ```typescript\n * await client.admin.settings.app.deleteSetting('billing.tiers')\n * ```\n */\n async deleteSetting(key: string): Promise<void> {\n await this.fetch.delete(`/api/v1/admin/settings/custom/${key}`);\n }\n}\n\n/**\n * Email Template Manager\n *\n * Manages email templates for authentication and user communication.\n * Supports customizing templates for magic links, email verification, password resets, and user invitations.\n *\n * @example\n * ```typescript\n * const templates = client.admin.emailTemplates\n *\n * // List all templates\n * const { templates: allTemplates } = await templates.list()\n *\n * // Get specific template\n * const magicLink = await templates.get('magic_link')\n *\n * // Update template\n * await templates.update('magic_link', {\n * subject: 'Sign in to ' + '{{.AppName}}',\n * html_body: '<html>Custom template with ' + '{{.MagicLink}}' + '</html>',\n * text_body: 'Click here: ' + '{{.MagicLink}}'\n * })\n *\n * // Test template (sends to specified email)\n * await templates.test('magic_link', 'test@example.com')\n *\n * // Reset to default\n * await templates.reset('magic_link')\n * ```\n */\nexport class EmailTemplateManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * List all email templates\n *\n * @returns Promise resolving to ListEmailTemplatesResponse\n *\n * @example\n * ```typescript\n * const response = await client.admin.emailTemplates.list()\n * console.log(response.templates)\n * ```\n */\n async list(): Promise<ListEmailTemplatesResponse> {\n const templates = await this.fetch.get<EmailTemplate[]>(\n \"/api/v1/admin/email/templates\",\n );\n return { templates: Array.isArray(templates) ? templates : [] };\n }\n\n /**\n * Get a specific email template by type\n *\n * @param type - Template type (magic_link | verify_email | reset_password | invite_user)\n * @returns Promise resolving to EmailTemplate\n *\n * @example\n * ```typescript\n * const template = await client.admin.emailTemplates.get('magic_link')\n * console.log(template.subject)\n * console.log(template.html_body)\n * ```\n */\n async get(type: EmailTemplateType): Promise<EmailTemplate> {\n return await this.fetch.get<EmailTemplate>(\n `/api/v1/admin/email/templates/${type}`,\n );\n }\n\n /**\n * Update an email template\n *\n * Available template variables:\n * - magic_link: `{{.MagicLink}}`, `{{.AppName}}`, `{{.ExpiryMinutes}}`\n * - verify_email: `{{.VerificationLink}}`, `{{.AppName}}`\n * - reset_password: `{{.ResetLink}}`, `{{.AppName}}`, `{{.ExpiryMinutes}}`\n * - invite_user: `{{.InviteLink}}`, `{{.AppName}}`, `{{.InviterName}}`\n *\n * @param type - Template type to update\n * @param request - Update request with subject, html_body, and optional text_body\n * @returns Promise resolving to EmailTemplate\n *\n * @example\n * ```typescript\n * const updated = await client.admin.emailTemplates.update('magic_link', {\n * subject: 'Your Magic Link - Sign in to ' + '{{.AppName}}',\n * html_body: '<html><body><h1>Welcome!</h1><a href=\"' + '{{.MagicLink}}' + '\">Sign In</a></body></html>',\n * text_body: 'Click here to sign in: ' + '{{.MagicLink}}'\n * })\n * ```\n */\n async update(\n type: EmailTemplateType,\n request: UpdateEmailTemplateRequest,\n ): Promise<EmailTemplate> {\n return await this.fetch.put<EmailTemplate>(\n `/api/v1/admin/email/templates/${type}`,\n request,\n );\n }\n\n /**\n * Reset an email template to default\n *\n * Removes any customizations and restores the template to its original state.\n *\n * @param type - Template type to reset\n * @returns Promise resolving to EmailTemplate - The default template\n *\n * @example\n * ```typescript\n * const defaultTemplate = await client.admin.emailTemplates.reset('magic_link')\n * ```\n */\n async reset(type: EmailTemplateType): Promise<EmailTemplate> {\n return await this.fetch.post<EmailTemplate>(\n `/api/v1/admin/email/templates/${type}/reset`,\n {},\n );\n }\n\n /**\n * Send a test email using the template\n *\n * Useful for previewing template changes before deploying to production.\n *\n * @param type - Template type to test\n * @param recipientEmail - Email address to send test to\n * @returns Promise<void>\n *\n * @example\n * ```typescript\n * await client.admin.emailTemplates.test('magic_link', 'test@example.com')\n * ```\n */\n async test(type: EmailTemplateType, recipientEmail: string): Promise<void> {\n await this.fetch.post(`/api/v1/admin/email/templates/${type}/test`, {\n recipient_email: recipientEmail,\n });\n }\n}\n\n/**\n * Settings Manager\n *\n * Provides access to system-level and application-level settings.\n * AppSettingsManager now handles both structured framework settings and custom key-value settings.\n *\n * @example\n * ```typescript\n * const settings = client.admin.settings\n *\n * // Access system settings\n * const systemSettings = await settings.system.list()\n *\n * // Access app settings (structured)\n * const appSettings = await settings.app.get()\n * await settings.app.enableSignup()\n *\n * // Access custom settings (key-value)\n * await settings.app.setSetting('billing.tiers', { free: 1000, pro: 10000 })\n * const tiers = await settings.app.getSetting('billing.tiers')\n * ```\n */\nexport class FluxbaseSettings {\n public system: SystemSettingsManager;\n public app: AppSettingsManager;\n\n constructor(fetch: FluxbaseFetch) {\n this.system = new SystemSettingsManager(fetch);\n this.app = new AppSettingsManager(fetch);\n }\n}\n\n/**\n * Public Settings Client\n *\n * Provides read-only access to public settings for non-admin users.\n * Access is controlled by RLS policies on the app.settings table.\n *\n * @example\n * ```typescript\n * const client = new FluxbaseClient(url, userToken)\n *\n * // Get single public setting\n * const betaEnabled = await client.settings.get('features.beta_enabled')\n * console.log(betaEnabled) // { enabled: true }\n *\n * // Get multiple public settings\n * const values = await client.settings.getMany([\n * 'features.beta_enabled',\n * 'features.dark_mode',\n * 'public.app_version'\n * ])\n * console.log(values)\n * // {\n * // 'features.beta_enabled': { enabled: true },\n * // 'features.dark_mode': { enabled: false },\n * // 'public.app_version': '1.0.0'\n * // }\n * ```\n */\nexport class SettingsClient {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Get a single setting's value\n *\n * Returns only the value field of the setting.\n * Access is controlled by RLS policies - will return 403 if the user\n * doesn't have permission to read the setting.\n *\n * @param key - Setting key (e.g., 'features.beta_enabled')\n * @returns Promise resolving to the setting's value\n * @throws Error if setting doesn't exist or user lacks permission\n *\n * @example\n * ```typescript\n * // Get public setting (any user)\n * const value = await client.settings.get('features.beta_enabled')\n * console.log(value) // { enabled: true }\n *\n * // Get restricted setting (requires permission)\n * try {\n * const secret = await client.settings.get('internal.api_key')\n * } catch (error) {\n * console.error('Access denied:', error)\n * }\n * ```\n */\n async get(key: string): Promise<any> {\n const response = await this.fetch.get<{ value: any }>(\n `/api/v1/settings/${encodeURIComponent(key)}`,\n );\n return response.value;\n }\n\n /**\n * Get multiple settings' values by keys\n *\n * Fetches multiple settings in a single request.\n * Only returns settings the user has permission to read based on RLS policies.\n * Settings the user can't access will be omitted from the result (no error thrown).\n *\n * @param keys - Array of setting keys to fetch\n * @returns Promise resolving to object mapping keys to values\n *\n * @example\n * ```typescript\n * const values = await client.settings.getMany([\n * 'features.beta_enabled', // public - will be returned\n * 'features.dark_mode', // public - will be returned\n * 'internal.api_key' // secret - will be omitted\n * ])\n * console.log(values)\n * // {\n * // 'features.beta_enabled': { enabled: true },\n * // 'features.dark_mode': { enabled: false }\n * // // 'internal.api_key' is omitted (no error)\n * // }\n * ```\n */\n async getMany(keys: string[]): Promise<Record<string, any>> {\n const response = await this.fetch.post<Array<{ key: string; value: any }>>(\n \"/api/v1/settings/batch\",\n { keys },\n );\n return response.reduce(\n (acc, setting) => {\n acc[setting.key] = setting.value;\n return acc;\n },\n {} as Record<string, any>,\n );\n }\n}\n","import type { FluxbaseFetch } from './fetch'\nimport type {\n CreateSchemaRequest,\n CreateSchemaResponse,\n CreateTableRequest,\n CreateTableResponse,\n DeleteTableResponse,\n ListSchemasResponse,\n ListTablesResponse,\n CreateColumnRequest,\n} from './types'\n\n/**\n * DDL (Data Definition Language) Manager\n *\n * Provides methods for managing database schemas and tables programmatically.\n * This includes creating schemas, creating tables with custom columns, listing\n * schemas and tables, and deleting tables.\n *\n * @example\n * ```typescript\n * const ddl = client.admin.ddl\n *\n * // Create a new schema\n * await ddl.createSchema('analytics')\n *\n * // Create a table with columns\n * await ddl.createTable('analytics', 'events', [\n * { name: 'id', type: 'UUID', primaryKey: true, defaultValue: 'gen_random_uuid()' },\n * { name: 'user_id', type: 'UUID', nullable: false },\n * { name: 'event_name', type: 'TEXT', nullable: false },\n * { name: 'event_data', type: 'JSONB' },\n * { name: 'created_at', type: 'TIMESTAMPTZ', defaultValue: 'NOW()' }\n * ])\n *\n * // List all schemas\n * const { schemas } = await ddl.listSchemas()\n *\n * // List all tables in a schema\n * const { tables } = await ddl.listTables('analytics')\n *\n * // Delete a table\n * await ddl.deleteTable('analytics', 'events')\n * ```\n */\nexport class DDLManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Create a new database schema\n *\n * Creates a new schema in the database. Schemas are used to organize tables\n * into logical groups and provide namespace isolation.\n *\n * @param name - Schema name (must be valid PostgreSQL identifier)\n * @returns Promise resolving to CreateSchemaResponse\n *\n * @example\n * ```typescript\n * // Create a schema for analytics data\n * const result = await client.admin.ddl.createSchema('analytics')\n * console.log(result.message) // \"Schema created successfully\"\n * console.log(result.schema) // \"analytics\"\n * ```\n */\n async createSchema(name: string): Promise<CreateSchemaResponse> {\n const request: CreateSchemaRequest = { name }\n return await this.fetch.post<CreateSchemaResponse>('/api/v1/admin/ddl/schemas', request)\n }\n\n /**\n * List all database schemas\n *\n * Retrieves a list of all schemas in the database. This includes both\n * system schemas (like 'public', 'pg_catalog') and user-created schemas.\n *\n * @returns Promise resolving to ListSchemasResponse\n *\n * @example\n * ```typescript\n * const { schemas } = await client.admin.ddl.listSchemas()\n *\n * schemas.forEach(schema => {\n * console.log(`Schema: ${schema.name}, Owner: ${schema.owner}`)\n * })\n * ```\n */\n async listSchemas(): Promise<ListSchemasResponse> {\n return await this.fetch.get<ListSchemasResponse>('/api/v1/admin/ddl/schemas')\n }\n\n /**\n * Create a new table in a schema\n *\n * Creates a new table with the specified columns. Supports various column\n * options including primary keys, nullability, data types, and default values.\n *\n * @param schema - Schema name where the table will be created\n * @param name - Table name (must be valid PostgreSQL identifier)\n * @param columns - Array of column definitions\n * @returns Promise resolving to CreateTableResponse\n *\n * @example\n * ```typescript\n * // Create a users table\n * await client.admin.ddl.createTable('public', 'users', [\n * {\n * name: 'id',\n * type: 'UUID',\n * primaryKey: true,\n * defaultValue: 'gen_random_uuid()'\n * },\n * {\n * name: 'email',\n * type: 'TEXT',\n * nullable: false\n * },\n * {\n * name: 'name',\n * type: 'TEXT'\n * },\n * {\n * name: 'created_at',\n * type: 'TIMESTAMPTZ',\n * nullable: false,\n * defaultValue: 'NOW()'\n * }\n * ])\n * ```\n *\n * @example\n * ```typescript\n * // Create a products table with JSONB metadata\n * await client.admin.ddl.createTable('public', 'products', [\n * { name: 'id', type: 'SERIAL', primaryKey: true },\n * { name: 'name', type: 'TEXT', nullable: false },\n * { name: 'price', type: 'DECIMAL(10,2)', nullable: false },\n * { name: 'metadata', type: 'JSONB' },\n * { name: 'in_stock', type: 'BOOLEAN', defaultValue: 'true' }\n * ])\n * ```\n */\n async createTable(schema: string, name: string, columns: CreateColumnRequest[]): Promise<CreateTableResponse> {\n const request: CreateTableRequest = { schema, name, columns }\n return await this.fetch.post<CreateTableResponse>('/api/v1/admin/ddl/tables', request)\n }\n\n /**\n * List all tables in the database or a specific schema\n *\n * Retrieves a list of all tables. If a schema is specified, only tables\n * from that schema are returned. Otherwise, all tables from all schemas\n * are returned.\n *\n * @param schema - Optional schema name to filter tables\n * @returns Promise resolving to ListTablesResponse\n *\n * @example\n * ```typescript\n * // List all tables in the public schema\n * const { tables } = await client.admin.ddl.listTables('public')\n *\n * tables.forEach(table => {\n * console.log(`Table: ${table.schema}.${table.name}`)\n * table.columns?.forEach(col => {\n * console.log(` - ${col.name}: ${col.type}`)\n * })\n * })\n * ```\n *\n * @example\n * ```typescript\n * // List all tables across all schemas\n * const { tables } = await client.admin.ddl.listTables()\n *\n * const tablesBySchema = tables.reduce((acc, table) => {\n * if (!acc[table.schema]) acc[table.schema] = []\n * acc[table.schema].push(table.name)\n * return acc\n * }, {} as Record<string, string[]>)\n *\n * console.log(tablesBySchema)\n * ```\n */\n async listTables(schema?: string): Promise<ListTablesResponse> {\n const params = schema ? `?schema=${encodeURIComponent(schema)}` : ''\n return await this.fetch.get<ListTablesResponse>(`/api/v1/admin/ddl/tables${params}`)\n }\n\n /**\n * Delete a table from a schema\n *\n * Permanently deletes a table and all its data. This operation cannot be undone.\n *\n * @param schema - Schema name containing the table\n * @param name - Table name to delete\n * @returns Promise resolving to DeleteTableResponse\n *\n * @example\n * ```typescript\n * // Delete a table\n * const result = await client.admin.ddl.deleteTable('public', 'old_data')\n * console.log(result.message) // \"Table deleted successfully\"\n * ```\n *\n * @example\n * ```typescript\n * // Safe deletion with confirmation\n * const confirm = await askUser('Are you sure you want to delete this table?')\n * if (confirm) {\n * await client.admin.ddl.deleteTable('analytics', 'events')\n * console.log('Table deleted')\n * }\n * ```\n */\n async deleteTable(schema: string, name: string): Promise<DeleteTableResponse> {\n return await this.fetch.delete<DeleteTableResponse>(\n `/api/v1/admin/ddl/tables/${encodeURIComponent(schema)}/${encodeURIComponent(name)}`\n )\n }\n}\n","import type { FluxbaseFetch } from './fetch'\nimport type {\n OAuthProvider,\n CreateOAuthProviderRequest,\n CreateOAuthProviderResponse,\n UpdateOAuthProviderRequest,\n UpdateOAuthProviderResponse,\n DeleteOAuthProviderResponse,\n AuthSettings,\n UpdateAuthSettingsRequest,\n UpdateAuthSettingsResponse,\n} from './types'\n\n/**\n * OAuth Provider Manager\n *\n * Manages OAuth provider configurations for third-party authentication.\n * Supports both built-in providers (Google, GitHub, etc.) and custom OAuth2 providers.\n *\n * @example\n * ```typescript\n * const oauth = client.admin.oauth\n *\n * // List all OAuth providers\n * const { providers } = await oauth.listProviders()\n *\n * // Create a new provider\n * await oauth.createProvider({\n * provider_name: 'github',\n * display_name: 'GitHub',\n * enabled: true,\n * client_id: 'your-client-id',\n * client_secret: 'your-client-secret',\n * redirect_url: 'https://yourapp.com/auth/callback',\n * scopes: ['user:email', 'read:user'],\n * is_custom: false\n * })\n *\n * // Update a provider\n * await oauth.updateProvider('provider-id', {\n * enabled: false\n * })\n *\n * // Delete a provider\n * await oauth.deleteProvider('provider-id')\n * ```\n */\nexport class OAuthProviderManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * List all OAuth providers\n *\n * Retrieves all configured OAuth providers including both enabled and disabled providers.\n * Note: Client secrets are not included in the response for security reasons.\n *\n * @returns Promise resolving to ListOAuthProvidersResponse\n *\n * @example\n * ```typescript\n * const { providers } = await client.admin.oauth.listProviders()\n *\n * providers.forEach(provider => {\n * console.log(`${provider.display_name}: ${provider.enabled ? 'enabled' : 'disabled'}`)\n * })\n * ```\n */\n async listProviders(): Promise<OAuthProvider[]> {\n const providers = await this.fetch.get<OAuthProvider[]>('/api/v1/admin/oauth/providers')\n return Array.isArray(providers) ? providers : []\n }\n\n /**\n * Get a specific OAuth provider by ID\n *\n * Retrieves detailed configuration for a single OAuth provider.\n * Note: Client secret is not included in the response.\n *\n * @param providerId - Provider ID (UUID)\n * @returns Promise resolving to OAuthProvider\n *\n * @example\n * ```typescript\n * const provider = await client.admin.oauth.getProvider('provider-uuid')\n *\n * console.log('Provider:', provider.display_name)\n * console.log('Scopes:', provider.scopes.join(', '))\n * console.log('Redirect URL:', provider.redirect_url)\n * ```\n */\n async getProvider(providerId: string): Promise<OAuthProvider> {\n return await this.fetch.get<OAuthProvider>(`/api/v1/admin/oauth/providers/${providerId}`)\n }\n\n /**\n * Create a new OAuth provider\n *\n * Creates a new OAuth provider configuration. For built-in providers (Google, GitHub, etc.),\n * set `is_custom` to false. For custom OAuth2 providers, set `is_custom` to true and provide\n * the authorization, token, and user info URLs.\n *\n * @param request - OAuth provider configuration\n * @returns Promise resolving to CreateOAuthProviderResponse\n *\n * @example\n * ```typescript\n * // Create GitHub provider\n * const result = await client.admin.oauth.createProvider({\n * provider_name: 'github',\n * display_name: 'GitHub',\n * enabled: true,\n * client_id: process.env.GITHUB_CLIENT_ID,\n * client_secret: process.env.GITHUB_CLIENT_SECRET,\n * redirect_url: 'https://yourapp.com/auth/callback',\n * scopes: ['user:email', 'read:user'],\n * is_custom: false\n * })\n *\n * console.log('Provider created:', result.id)\n * ```\n *\n * @example\n * ```typescript\n * // Create custom OAuth2 provider\n * await client.admin.oauth.createProvider({\n * provider_name: 'custom_sso',\n * display_name: 'Custom SSO',\n * enabled: true,\n * client_id: 'client-id',\n * client_secret: 'client-secret',\n * redirect_url: 'https://yourapp.com/auth/callback',\n * scopes: ['openid', 'profile', 'email'],\n * is_custom: true,\n * authorization_url: 'https://sso.example.com/oauth/authorize',\n * token_url: 'https://sso.example.com/oauth/token',\n * user_info_url: 'https://sso.example.com/oauth/userinfo'\n * })\n * ```\n */\n async createProvider(request: CreateOAuthProviderRequest): Promise<CreateOAuthProviderResponse> {\n return await this.fetch.post<CreateOAuthProviderResponse>('/api/v1/admin/oauth/providers', request)\n }\n\n /**\n * Update an existing OAuth provider\n *\n * Updates an OAuth provider configuration. All fields are optional - only provided fields\n * will be updated. To update the client secret, provide a non-empty value.\n *\n * @param providerId - Provider ID (UUID)\n * @param request - Fields to update\n * @returns Promise resolving to UpdateOAuthProviderResponse\n *\n * @example\n * ```typescript\n * // Disable a provider\n * await client.admin.oauth.updateProvider('provider-id', {\n * enabled: false\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Update scopes and redirect URL\n * await client.admin.oauth.updateProvider('provider-id', {\n * scopes: ['user:email', 'read:user', 'read:org'],\n * redirect_url: 'https://newdomain.com/auth/callback'\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Rotate client secret\n * await client.admin.oauth.updateProvider('provider-id', {\n * client_id: 'new-client-id',\n * client_secret: 'new-client-secret'\n * })\n * ```\n */\n async updateProvider(\n providerId: string,\n request: UpdateOAuthProviderRequest\n ): Promise<UpdateOAuthProviderResponse> {\n return await this.fetch.put<UpdateOAuthProviderResponse>(\n `/api/v1/admin/oauth/providers/${providerId}`,\n request\n )\n }\n\n /**\n * Delete an OAuth provider\n *\n * Permanently deletes an OAuth provider configuration. This will prevent users from\n * authenticating with this provider.\n *\n * @param providerId - Provider ID (UUID) to delete\n * @returns Promise resolving to DeleteOAuthProviderResponse\n *\n * @example\n * ```typescript\n * await client.admin.oauth.deleteProvider('provider-id')\n * console.log('Provider deleted')\n * ```\n *\n * @example\n * ```typescript\n * // Safe deletion with confirmation\n * const provider = await client.admin.oauth.getProvider('provider-id')\n * const confirmed = await confirm(`Delete ${provider.display_name}?`)\n *\n * if (confirmed) {\n * await client.admin.oauth.deleteProvider('provider-id')\n * }\n * ```\n */\n async deleteProvider(providerId: string): Promise<DeleteOAuthProviderResponse> {\n return await this.fetch.delete<DeleteOAuthProviderResponse>(\n `/api/v1/admin/oauth/providers/${providerId}`\n )\n }\n\n /**\n * Enable an OAuth provider\n *\n * Convenience method to enable a provider.\n *\n * @param providerId - Provider ID (UUID)\n * @returns Promise resolving to UpdateOAuthProviderResponse\n *\n * @example\n * ```typescript\n * await client.admin.oauth.enableProvider('provider-id')\n * ```\n */\n async enableProvider(providerId: string): Promise<UpdateOAuthProviderResponse> {\n return await this.updateProvider(providerId, { enabled: true })\n }\n\n /**\n * Disable an OAuth provider\n *\n * Convenience method to disable a provider.\n *\n * @param providerId - Provider ID (UUID)\n * @returns Promise resolving to UpdateOAuthProviderResponse\n *\n * @example\n * ```typescript\n * await client.admin.oauth.disableProvider('provider-id')\n * ```\n */\n async disableProvider(providerId: string): Promise<UpdateOAuthProviderResponse> {\n return await this.updateProvider(providerId, { enabled: false })\n }\n}\n\n/**\n * Authentication Settings Manager\n *\n * Manages global authentication settings including password requirements, session timeouts,\n * and signup configuration.\n *\n * @example\n * ```typescript\n * const authSettings = client.admin.authSettings\n *\n * // Get current settings\n * const settings = await authSettings.get()\n *\n * // Update settings\n * await authSettings.update({\n * password_min_length: 12,\n * password_require_uppercase: true,\n * session_timeout_minutes: 120\n * })\n * ```\n */\nexport class AuthSettingsManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Get current authentication settings\n *\n * Retrieves all authentication configuration settings.\n *\n * @returns Promise resolving to AuthSettings\n *\n * @example\n * ```typescript\n * const settings = await client.admin.authSettings.get()\n *\n * console.log('Password min length:', settings.password_min_length)\n * console.log('Signup enabled:', settings.enable_signup)\n * console.log('Session timeout:', settings.session_timeout_minutes, 'minutes')\n * ```\n */\n async get(): Promise<AuthSettings> {\n return await this.fetch.get<AuthSettings>('/api/v1/admin/auth/settings')\n }\n\n /**\n * Update authentication settings\n *\n * Updates one or more authentication settings. All fields are optional - only provided\n * fields will be updated.\n *\n * @param request - Settings to update\n * @returns Promise resolving to UpdateAuthSettingsResponse\n *\n * @example\n * ```typescript\n * // Strengthen password requirements\n * await client.admin.authSettings.update({\n * password_min_length: 16,\n * password_require_uppercase: true,\n * password_require_lowercase: true,\n * password_require_number: true,\n * password_require_special: true\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Extend session timeout\n * await client.admin.authSettings.update({\n * session_timeout_minutes: 240,\n * max_sessions_per_user: 10\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Disable email verification during development\n * await client.admin.authSettings.update({\n * require_email_verification: false\n * })\n * ```\n */\n async update(request: UpdateAuthSettingsRequest): Promise<UpdateAuthSettingsResponse> {\n return await this.fetch.put<UpdateAuthSettingsResponse>('/api/v1/admin/auth/settings', request)\n }\n}\n\n/**\n * OAuth Configuration Manager\n *\n * Root manager providing access to OAuth provider and authentication settings management.\n *\n * @example\n * ```typescript\n * const oauth = client.admin.oauth\n *\n * // Manage OAuth providers\n * const providers = await oauth.providers.listProviders()\n *\n * // Manage auth settings\n * const settings = await oauth.authSettings.get()\n * ```\n */\nexport class FluxbaseOAuth {\n public providers: OAuthProviderManager\n public authSettings: AuthSettingsManager\n\n constructor(fetch: FluxbaseFetch) {\n this.providers = new OAuthProviderManager(fetch)\n this.authSettings = new AuthSettingsManager(fetch)\n }\n}\n","import type { FluxbaseFetch } from './fetch'\nimport type {\n ImpersonateUserRequest,\n ImpersonateAnonRequest,\n ImpersonateServiceRequest,\n StartImpersonationResponse,\n StopImpersonationResponse,\n GetImpersonationResponse,\n ListImpersonationSessionsOptions,\n ListImpersonationSessionsResponse,\n} from './types'\n\n/**\n * Impersonation Manager\n *\n * Manages user impersonation for debugging, testing RLS policies, and customer support.\n * Allows admins to view data as different users, anonymous visitors, or with service role permissions.\n *\n * All impersonation sessions are logged in the audit trail for security and compliance.\n *\n * @example\n * ```typescript\n * const impersonation = client.admin.impersonation\n *\n * // Impersonate a specific user\n * const { session, access_token } = await impersonation.impersonateUser({\n * target_user_id: 'user-uuid',\n * reason: 'Support ticket #1234'\n * })\n *\n * // Impersonate anonymous user\n * await impersonation.impersonateAnon({\n * reason: 'Testing public data access'\n * })\n *\n * // Impersonate with service role\n * await impersonation.impersonateService({\n * reason: 'Administrative query'\n * })\n *\n * // Stop impersonation\n * await impersonation.stop()\n * ```\n */\nexport class ImpersonationManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Impersonate a specific user\n *\n * Start an impersonation session as a specific user. This allows you to see data\n * exactly as that user would see it, respecting all RLS policies and permissions.\n *\n * @param request - Impersonation request with target user ID and reason\n * @returns Promise resolving to impersonation session with access token\n *\n * @example\n * ```typescript\n * const result = await client.admin.impersonation.impersonateUser({\n * target_user_id: 'user-123',\n * reason: 'Support ticket #5678 - user reports missing data'\n * })\n *\n * console.log('Impersonating:', result.target_user.email)\n * console.log('Session ID:', result.session.id)\n *\n * // Use the access token for subsequent requests\n * // (typically handled automatically by the SDK)\n * ```\n */\n async impersonateUser(request: ImpersonateUserRequest): Promise<StartImpersonationResponse> {\n return await this.fetch.post<StartImpersonationResponse>('/api/v1/auth/impersonate', request)\n }\n\n /**\n * Impersonate anonymous user\n *\n * Start an impersonation session as an unauthenticated user. This allows you to see\n * what data is publicly accessible and test RLS policies for anonymous access.\n *\n * @param request - Impersonation request with reason\n * @returns Promise resolving to impersonation session with access token\n *\n * @example\n * ```typescript\n * await client.admin.impersonation.impersonateAnon({\n * reason: 'Testing public data access for blog posts'\n * })\n *\n * // Now all queries will use anonymous permissions\n * const publicPosts = await client.from('posts').select('*')\n * console.log('Public posts:', publicPosts.length)\n * ```\n */\n async impersonateAnon(request: ImpersonateAnonRequest): Promise<StartImpersonationResponse> {\n return await this.fetch.post<StartImpersonationResponse>('/api/v1/auth/impersonate/anon', request)\n }\n\n /**\n * Impersonate with service role\n *\n * Start an impersonation session with service-level permissions. This provides elevated\n * access that may bypass RLS policies, useful for administrative operations.\n *\n * @param request - Impersonation request with reason\n * @returns Promise resolving to impersonation session with access token\n *\n * @example\n * ```typescript\n * await client.admin.impersonation.impersonateService({\n * reason: 'Administrative data cleanup'\n * })\n *\n * // Now all queries will use service role permissions\n * const allRecords = await client.from('sensitive_data').select('*')\n * console.log('All records:', allRecords.length)\n * ```\n */\n async impersonateService(request: ImpersonateServiceRequest): Promise<StartImpersonationResponse> {\n return await this.fetch.post<StartImpersonationResponse>('/api/v1/auth/impersonate/service', request)\n }\n\n /**\n * Stop impersonation\n *\n * Ends the current impersonation session and returns to admin context.\n * The session is marked as ended in the audit trail.\n *\n * @returns Promise resolving to stop confirmation\n *\n * @example\n * ```typescript\n * await client.admin.impersonation.stop()\n * console.log('Impersonation ended')\n *\n * // Subsequent queries will use admin permissions\n * ```\n */\n async stop(): Promise<StopImpersonationResponse> {\n return await this.fetch.delete<StopImpersonationResponse>('/api/v1/auth/impersonate')\n }\n\n /**\n * Get current impersonation session\n *\n * Retrieves information about the active impersonation session, if any.\n *\n * @returns Promise resolving to current impersonation session or null\n *\n * @example\n * ```typescript\n * const current = await client.admin.impersonation.getCurrent()\n *\n * if (current.session) {\n * console.log('Currently impersonating:', current.target_user?.email)\n * console.log('Reason:', current.session.reason)\n * console.log('Started:', current.session.started_at)\n * } else {\n * console.log('No active impersonation')\n * }\n * ```\n */\n async getCurrent(): Promise<GetImpersonationResponse> {\n return await this.fetch.get<GetImpersonationResponse>('/api/v1/auth/impersonate')\n }\n\n /**\n * List impersonation sessions (audit trail)\n *\n * Retrieves a list of impersonation sessions for audit and compliance purposes.\n * Can be filtered by admin user, target user, type, and active status.\n *\n * @param options - Filter and pagination options\n * @returns Promise resolving to list of impersonation sessions\n *\n * @example\n * ```typescript\n * // List all sessions\n * const { sessions, total } = await client.admin.impersonation.listSessions()\n * console.log(`Total sessions: ${total}`)\n *\n * // List active sessions only\n * const active = await client.admin.impersonation.listSessions({\n * is_active: true\n * })\n * console.log('Active sessions:', active.sessions.length)\n *\n * // List sessions for a specific admin\n * const adminSessions = await client.admin.impersonation.listSessions({\n * admin_user_id: 'admin-uuid',\n * limit: 50\n * })\n *\n * // List user impersonation sessions only\n * const userSessions = await client.admin.impersonation.listSessions({\n * impersonation_type: 'user',\n * offset: 0,\n * limit: 100\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Audit trail: Find who impersonated a specific user\n * const userHistory = await client.admin.impersonation.listSessions({\n * target_user_id: 'user-uuid'\n * })\n *\n * userHistory.sessions.forEach(session => {\n * console.log(`Admin ${session.admin_user_id} impersonated user`)\n * console.log(`Reason: ${session.reason}`)\n * console.log(`Duration: ${session.started_at} - ${session.ended_at}`)\n * })\n * ```\n */\n async listSessions(options: ListImpersonationSessionsOptions = {}): Promise<ListImpersonationSessionsResponse> {\n const params = new URLSearchParams()\n\n if (options.limit !== undefined) {\n params.append('limit', String(options.limit))\n }\n if (options.offset !== undefined) {\n params.append('offset', String(options.offset))\n }\n if (options.admin_user_id) {\n params.append('admin_user_id', options.admin_user_id)\n }\n if (options.target_user_id) {\n params.append('target_user_id', options.target_user_id)\n }\n if (options.impersonation_type) {\n params.append('impersonation_type', options.impersonation_type)\n }\n if (options.is_active !== undefined) {\n params.append('is_active', String(options.is_active))\n }\n\n const queryString = params.toString()\n const url = queryString ? `/api/v1/auth/impersonate/sessions?${queryString}` : '/api/v1/auth/impersonate/sessions'\n\n return await this.fetch.get<ListImpersonationSessionsResponse>(url)\n }\n}\n","import type { FluxbaseFetch } from './fetch'\nimport type {\n // API Keys\n APIKey,\n CreateAPIKeyRequest,\n CreateAPIKeyResponse,\n DeleteAPIKeyResponse,\n ListAPIKeysResponse,\n RevokeAPIKeyResponse,\n UpdateAPIKeyRequest,\n // Webhooks\n CreateWebhookRequest,\n DeleteWebhookResponse,\n ListWebhookDeliveriesResponse,\n ListWebhooksResponse,\n TestWebhookResponse,\n UpdateWebhookRequest,\n Webhook,\n // Invitations\n AcceptInvitationRequest,\n AcceptInvitationResponse,\n CreateInvitationRequest,\n CreateInvitationResponse,\n ListInvitationsOptions,\n ListInvitationsResponse,\n RevokeInvitationResponse,\n ValidateInvitationResponse,\n} from './types'\n\n/**\n * API Keys management client\n *\n * Provides methods for managing API keys for service-to-service authentication.\n * API keys allow external services to authenticate without user credentials.\n *\n * @example\n * ```typescript\n * const client = createClient({ url: 'http://localhost:8080' })\n * await client.auth.login({ email: 'user@example.com', password: 'password' })\n *\n * // Create an API key\n * const { api_key, key } = await client.management.apiKeys.create({\n * name: 'Production Service',\n * scopes: ['read:users', 'write:users'],\n * rate_limit_per_minute: 100\n * })\n *\n * // List API keys\n * const { api_keys } = await client.management.apiKeys.list()\n * ```\n *\n * @category Management\n */\nexport class APIKeysManager {\n private fetch: FluxbaseFetch\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch\n }\n\n /**\n * Create a new API key\n *\n * @param request - API key configuration\n * @returns Created API key with the full key value (only shown once)\n *\n * @example\n * ```typescript\n * const { api_key, key } = await client.management.apiKeys.create({\n * name: 'Production Service',\n * description: 'API key for production service',\n * scopes: ['read:users', 'write:users'],\n * rate_limit_per_minute: 100,\n * expires_at: '2025-12-31T23:59:59Z'\n * })\n *\n * // Store the key securely - it won't be shown again\n * console.log('API Key:', key)\n * ```\n */\n async create(request: CreateAPIKeyRequest): Promise<CreateAPIKeyResponse> {\n return await this.fetch.post<CreateAPIKeyResponse>('/api/v1/api-keys', request)\n }\n\n /**\n * List all API keys for the authenticated user\n *\n * @returns List of API keys (without full key values)\n *\n * @example\n * ```typescript\n * const { api_keys, total } = await client.management.apiKeys.list()\n *\n * api_keys.forEach(key => {\n * console.log(`${key.name}: ${key.key_prefix}... (expires: ${key.expires_at})`)\n * })\n * ```\n */\n async list(): Promise<ListAPIKeysResponse> {\n return await this.fetch.get<ListAPIKeysResponse>('/api/v1/api-keys')\n }\n\n /**\n * Get a specific API key by ID\n *\n * @param keyId - API key ID\n * @returns API key details\n *\n * @example\n * ```typescript\n * const apiKey = await client.management.apiKeys.get('key-uuid')\n * console.log('Last used:', apiKey.last_used_at)\n * ```\n */\n async get(keyId: string): Promise<APIKey> {\n return await this.fetch.get<APIKey>(`/api/v1/api-keys/${keyId}`)\n }\n\n /**\n * Update an API key\n *\n * @param keyId - API key ID\n * @param updates - Fields to update\n * @returns Updated API key\n *\n * @example\n * ```typescript\n * const updated = await client.management.apiKeys.update('key-uuid', {\n * name: 'Updated Name',\n * rate_limit_per_minute: 200\n * })\n * ```\n */\n async update(keyId: string, updates: UpdateAPIKeyRequest): Promise<APIKey> {\n return await this.fetch.patch<APIKey>(`/api/v1/api-keys/${keyId}`, updates)\n }\n\n /**\n * Revoke an API key\n *\n * Revoked keys can no longer be used but remain in the system for audit purposes.\n *\n * @param keyId - API key ID\n * @returns Revocation confirmation\n *\n * @example\n * ```typescript\n * await client.management.apiKeys.revoke('key-uuid')\n * console.log('API key revoked')\n * ```\n */\n async revoke(keyId: string): Promise<RevokeAPIKeyResponse> {\n return await this.fetch.post<RevokeAPIKeyResponse>(`/api/v1/api-keys/${keyId}/revoke`, {})\n }\n\n /**\n * Delete an API key\n *\n * Permanently removes the API key from the system.\n *\n * @param keyId - API key ID\n * @returns Deletion confirmation\n *\n * @example\n * ```typescript\n * await client.management.apiKeys.delete('key-uuid')\n * console.log('API key deleted')\n * ```\n */\n async delete(keyId: string): Promise<DeleteAPIKeyResponse> {\n return await this.fetch.delete<DeleteAPIKeyResponse>(`/api/v1/api-keys/${keyId}`)\n }\n}\n\n/**\n * Webhooks management client\n *\n * Provides methods for managing webhooks to receive real-time event notifications.\n * Webhooks allow your application to be notified when events occur in Fluxbase.\n *\n * @example\n * ```typescript\n * const client = createClient({ url: 'http://localhost:8080' })\n * await client.auth.login({ email: 'user@example.com', password: 'password' })\n *\n * // Create a webhook\n * const webhook = await client.management.webhooks.create({\n * url: 'https://myapp.com/webhook',\n * events: ['user.created', 'user.updated'],\n * secret: 'my-webhook-secret'\n * })\n *\n * // Test the webhook\n * const result = await client.management.webhooks.test(webhook.id)\n * ```\n *\n * @category Management\n */\nexport class WebhooksManager {\n private fetch: FluxbaseFetch\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch\n }\n\n /**\n * Create a new webhook\n *\n * @param request - Webhook configuration\n * @returns Created webhook\n *\n * @example\n * ```typescript\n * const webhook = await client.management.webhooks.create({\n * url: 'https://myapp.com/webhook',\n * events: ['user.created', 'user.updated', 'user.deleted'],\n * description: 'User events webhook',\n * secret: 'my-webhook-secret'\n * })\n * ```\n */\n async create(request: CreateWebhookRequest): Promise<Webhook> {\n return await this.fetch.post<Webhook>('/api/v1/webhooks', request)\n }\n\n /**\n * List all webhooks for the authenticated user\n *\n * @returns List of webhooks\n *\n * @example\n * ```typescript\n * const { webhooks, total } = await client.management.webhooks.list()\n *\n * webhooks.forEach(webhook => {\n * console.log(`${webhook.url}: ${webhook.is_active ? 'active' : 'inactive'}`)\n * })\n * ```\n */\n async list(): Promise<ListWebhooksResponse> {\n return await this.fetch.get<ListWebhooksResponse>('/api/v1/webhooks')\n }\n\n /**\n * Get a specific webhook by ID\n *\n * @param webhookId - Webhook ID\n * @returns Webhook details\n *\n * @example\n * ```typescript\n * const webhook = await client.management.webhooks.get('webhook-uuid')\n * console.log('Events:', webhook.events)\n * ```\n */\n async get(webhookId: string): Promise<Webhook> {\n return await this.fetch.get<Webhook>(`/api/v1/webhooks/${webhookId}`)\n }\n\n /**\n * Update a webhook\n *\n * @param webhookId - Webhook ID\n * @param updates - Fields to update\n * @returns Updated webhook\n *\n * @example\n * ```typescript\n * const updated = await client.management.webhooks.update('webhook-uuid', {\n * events: ['user.created', 'user.deleted'],\n * is_active: false\n * })\n * ```\n */\n async update(webhookId: string, updates: UpdateWebhookRequest): Promise<Webhook> {\n return await this.fetch.patch<Webhook>(`/api/v1/webhooks/${webhookId}`, updates)\n }\n\n /**\n * Delete a webhook\n *\n * @param webhookId - Webhook ID\n * @returns Deletion confirmation\n *\n * @example\n * ```typescript\n * await client.management.webhooks.delete('webhook-uuid')\n * console.log('Webhook deleted')\n * ```\n */\n async delete(webhookId: string): Promise<DeleteWebhookResponse> {\n return await this.fetch.delete<DeleteWebhookResponse>(`/api/v1/webhooks/${webhookId}`)\n }\n\n /**\n * Test a webhook by sending a test payload\n *\n * @param webhookId - Webhook ID\n * @returns Test result with status and response\n *\n * @example\n * ```typescript\n * const result = await client.management.webhooks.test('webhook-uuid')\n *\n * if (result.success) {\n * console.log('Webhook test successful')\n * } else {\n * console.error('Webhook test failed:', result.error)\n * }\n * ```\n */\n async test(webhookId: string): Promise<TestWebhookResponse> {\n return await this.fetch.post<TestWebhookResponse>(`/api/v1/webhooks/${webhookId}/test`, {})\n }\n\n /**\n * List webhook delivery history\n *\n * @param webhookId - Webhook ID\n * @param limit - Maximum number of deliveries to return (default: 50)\n * @returns List of webhook deliveries\n *\n * @example\n * ```typescript\n * const { deliveries } = await client.management.webhooks.listDeliveries('webhook-uuid', 100)\n *\n * deliveries.forEach(delivery => {\n * console.log(`Event: ${delivery.event}, Status: ${delivery.status_code}`)\n * })\n * ```\n */\n async listDeliveries(webhookId: string, limit: number = 50): Promise<ListWebhookDeliveriesResponse> {\n return await this.fetch.get<ListWebhookDeliveriesResponse>(\n `/api/v1/webhooks/${webhookId}/deliveries?limit=${limit}`,\n )\n }\n}\n\n/**\n * Invitations management client\n *\n * Provides methods for creating and managing user invitations.\n * Invitations allow admins to invite new users to join the dashboard.\n *\n * @example\n * ```typescript\n * const client = createClient({ url: 'http://localhost:8080' })\n * await client.admin.login({ email: 'admin@example.com', password: 'password' })\n *\n * // Create an invitation\n * const invitation = await client.management.invitations.create({\n * email: 'newuser@example.com',\n * role: 'dashboard_user'\n * })\n *\n * console.log('Invite link:', invitation.invite_link)\n * ```\n *\n * @category Management\n */\nexport class InvitationsManager {\n private fetch: FluxbaseFetch\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch\n }\n\n /**\n * Create a new invitation (admin only)\n *\n * @param request - Invitation details\n * @returns Created invitation with invite link\n *\n * @example\n * ```typescript\n * const invitation = await client.management.invitations.create({\n * email: 'newuser@example.com',\n * role: 'dashboard_user',\n * expiry_duration: 604800 // 7 days in seconds\n * })\n *\n * // Share the invite link\n * console.log('Send this link to the user:', invitation.invite_link)\n * ```\n */\n async create(request: CreateInvitationRequest): Promise<CreateInvitationResponse> {\n return await this.fetch.post<CreateInvitationResponse>('/api/v1/admin/invitations', request)\n }\n\n /**\n * List all invitations (admin only)\n *\n * @param options - Filter options\n * @returns List of invitations\n *\n * @example\n * ```typescript\n * // List pending invitations only\n * const { invitations } = await client.management.invitations.list({\n * include_accepted: false,\n * include_expired: false\n * })\n *\n * // List all invitations including accepted and expired\n * const all = await client.management.invitations.list({\n * include_accepted: true,\n * include_expired: true\n * })\n * ```\n */\n async list(options: ListInvitationsOptions = {}): Promise<ListInvitationsResponse> {\n const params = new URLSearchParams()\n\n if (options.include_accepted !== undefined) {\n params.append('include_accepted', String(options.include_accepted))\n }\n if (options.include_expired !== undefined) {\n params.append('include_expired', String(options.include_expired))\n }\n\n const queryString = params.toString()\n const url = queryString ? `/api/v1/admin/invitations?${queryString}` : '/api/v1/admin/invitations'\n\n return await this.fetch.get<ListInvitationsResponse>(url)\n }\n\n /**\n * Validate an invitation token (public endpoint)\n *\n * @param token - Invitation token\n * @returns Validation result with invitation details\n *\n * @example\n * ```typescript\n * const result = await client.management.invitations.validate('invitation-token')\n *\n * if (result.valid) {\n * console.log('Valid invitation for:', result.invitation?.email)\n * } else {\n * console.error('Invalid:', result.error)\n * }\n * ```\n */\n async validate(token: string): Promise<ValidateInvitationResponse> {\n return await this.fetch.get<ValidateInvitationResponse>(`/api/v1/invitations/${token}/validate`)\n }\n\n /**\n * Accept an invitation and create a new user (public endpoint)\n *\n * @param token - Invitation token\n * @param request - User details (password and name)\n * @returns Created user with authentication tokens\n *\n * @example\n * ```typescript\n * const response = await client.management.invitations.accept('invitation-token', {\n * password: 'SecurePassword123!',\n * name: 'John Doe'\n * })\n *\n * // Store tokens\n * localStorage.setItem('access_token', response.access_token)\n * console.log('Welcome:', response.user.name)\n * ```\n */\n async accept(token: string, request: AcceptInvitationRequest): Promise<AcceptInvitationResponse> {\n return await this.fetch.post<AcceptInvitationResponse>(`/api/v1/invitations/${token}/accept`, request)\n }\n\n /**\n * Revoke an invitation (admin only)\n *\n * @param token - Invitation token\n * @returns Revocation confirmation\n *\n * @example\n * ```typescript\n * await client.management.invitations.revoke('invitation-token')\n * console.log('Invitation revoked')\n * ```\n */\n async revoke(token: string): Promise<RevokeInvitationResponse> {\n return await this.fetch.delete<RevokeInvitationResponse>(`/api/v1/admin/invitations/${token}`)\n }\n}\n\n/**\n * Management client for API keys, webhooks, and invitations\n *\n * @category Management\n */\nexport class FluxbaseManagement {\n /** API Keys management */\n public apiKeys: APIKeysManager\n\n /** Webhooks management */\n public webhooks: WebhooksManager\n\n /** Invitations management */\n public invitations: InvitationsManager\n\n constructor(fetch: FluxbaseFetch) {\n this.apiKeys = new APIKeysManager(fetch)\n this.webhooks = new WebhooksManager(fetch)\n this.invitations = new InvitationsManager(fetch)\n }\n}\n","import type { FluxbaseFetch } from \"./fetch\";\nimport type {\n AdminAuthResponse,\n AdminLoginRequest,\n AdminMeResponse,\n AdminRefreshRequest,\n AdminRefreshResponse,\n AdminSetupRequest,\n AdminSetupStatusResponse,\n DeleteUserResponse,\n EnrichedUser,\n InviteUserRequest,\n InviteUserResponse,\n ListUsersOptions,\n ListUsersResponse,\n ResetUserPasswordResponse,\n DataResponse,\n VoidResponse,\n} from \"./types\";\nimport { wrapAsync, wrapAsyncVoid } from \"./utils/error-handling\";\nimport { FluxbaseSettings, EmailTemplateManager } from \"./settings\";\nimport { DDLManager } from \"./ddl\";\nimport { FluxbaseOAuth } from \"./oauth\";\nimport { ImpersonationManager } from \"./impersonation\";\nimport { FluxbaseManagement } from \"./management\";\n\n/**\n * Admin client for managing Fluxbase instance\n */\nexport class FluxbaseAdmin {\n private fetch: FluxbaseFetch;\n private adminToken: string | null = null;\n\n /**\n * Settings manager for system and application settings\n */\n public settings: FluxbaseSettings;\n\n /**\n * DDL manager for database schema and table operations\n */\n public ddl: DDLManager;\n\n /**\n * OAuth configuration manager for provider and auth settings\n */\n public oauth: FluxbaseOAuth;\n\n /**\n * Impersonation manager for user impersonation and audit trail\n */\n public impersonation: ImpersonationManager;\n\n /**\n * Management namespace for API keys, webhooks, and invitations\n */\n public management: FluxbaseManagement;\n\n /**\n * Email template manager for customizing authentication and notification emails\n */\n public emailTemplates: EmailTemplateManager;\n\n constructor(fetch: FluxbaseFetch) {\n this.fetch = fetch;\n this.settings = new FluxbaseSettings(fetch);\n this.ddl = new DDLManager(fetch);\n this.oauth = new FluxbaseOAuth(fetch);\n this.impersonation = new ImpersonationManager(fetch);\n this.management = new FluxbaseManagement(fetch);\n this.emailTemplates = new EmailTemplateManager(fetch);\n }\n\n /**\n * Set admin authentication token\n */\n setToken(token: string) {\n this.adminToken = token;\n this.fetch.setAuthToken(token);\n }\n\n /**\n * Get current admin token\n */\n getToken(): string | null {\n return this.adminToken;\n }\n\n /**\n * Clear admin token\n */\n clearToken() {\n this.adminToken = null;\n this.fetch.setAuthToken(null);\n }\n\n // ============================================================================\n // Admin Authentication\n // ============================================================================\n\n /**\n * Check if initial admin setup is needed\n *\n * @returns Setup status indicating if initial setup is required\n *\n * @example\n * ```typescript\n * const status = await admin.getSetupStatus();\n * if (status.needs_setup) {\n * console.log('Initial setup required');\n * }\n * ```\n */\n async getSetupStatus(): Promise<DataResponse<AdminSetupStatusResponse>> {\n return wrapAsync(async () => {\n return await this.fetch.get<AdminSetupStatusResponse>(\n \"/api/v1/admin/setup/status\",\n );\n });\n }\n\n /**\n * Perform initial admin setup\n *\n * Creates the first admin user and completes initial setup.\n * This endpoint can only be called once.\n *\n * @param email - Admin email address\n * @param password - Admin password (minimum 12 characters)\n * @param name - Admin display name\n * @returns Authentication response with tokens\n *\n * @example\n * ```typescript\n * const response = await admin.setup({\n * email: 'admin@example.com',\n * password: 'SecurePassword123!',\n * name: 'Admin User'\n * });\n *\n * // Store tokens\n * localStorage.setItem('admin_token', response.access_token);\n * ```\n */\n async setup(request: AdminSetupRequest): Promise<DataResponse<AdminAuthResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AdminAuthResponse>(\n \"/api/v1/admin/setup\",\n request,\n );\n this.setToken(response.access_token);\n return response;\n });\n }\n\n /**\n * Admin login\n *\n * Authenticate as an admin user\n *\n * @param email - Admin email\n * @param password - Admin password\n * @returns Authentication response with tokens\n *\n * @example\n * ```typescript\n * const response = await admin.login({\n * email: 'admin@example.com',\n * password: 'password123'\n * });\n *\n * // Token is automatically set in the client\n * console.log('Logged in as:', response.user.email);\n * ```\n */\n async login(request: AdminLoginRequest): Promise<DataResponse<AdminAuthResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AdminAuthResponse>(\n \"/api/v1/admin/login\",\n request,\n );\n this.setToken(response.access_token);\n return response;\n });\n }\n\n /**\n * Refresh admin access token\n *\n * @param refreshToken - Refresh token\n * @returns New access and refresh tokens\n *\n * @example\n * ```typescript\n * const refreshToken = localStorage.getItem('admin_refresh_token');\n * const response = await admin.refreshToken({ refresh_token: refreshToken });\n *\n * // Update stored tokens\n * localStorage.setItem('admin_token', response.access_token);\n * localStorage.setItem('admin_refresh_token', response.refresh_token);\n * ```\n */\n async refreshToken(\n request: AdminRefreshRequest,\n ): Promise<DataResponse<AdminRefreshResponse>> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AdminRefreshResponse>(\n \"/api/v1/admin/refresh\",\n request,\n );\n this.setToken(response.access_token);\n return response;\n });\n }\n\n /**\n * Admin logout\n *\n * Invalidates the current admin session\n *\n * @example\n * ```typescript\n * await admin.logout();\n * localStorage.removeItem('admin_token');\n * ```\n */\n async logout(): Promise<VoidResponse> {\n return wrapAsyncVoid(async () => {\n await this.fetch.post<{ message: string }>(\"/api/v1/admin/logout\", {});\n this.clearToken();\n });\n }\n\n /**\n * Get current admin user information\n *\n * @returns Current admin user details\n *\n * @example\n * ```typescript\n * const { user } = await admin.me();\n * console.log('Logged in as:', user.email);\n * console.log('Role:', user.role);\n * ```\n */\n async me(): Promise<DataResponse<AdminMeResponse>> {\n return wrapAsync(async () => {\n return await this.fetch.get<AdminMeResponse>(\"/api/v1/admin/me\");\n });\n }\n\n // ============================================================================\n // User Management\n // ============================================================================\n\n /**\n * List all users\n *\n * @param options - Filter and pagination options\n * @returns List of users with metadata\n *\n * @example\n * ```typescript\n * // List all users\n * const { users, total } = await admin.listUsers();\n *\n * // List with filters\n * const result = await admin.listUsers({\n * exclude_admins: true,\n * search: 'john',\n * limit: 50,\n * type: 'app'\n * });\n * ```\n */\n async listUsers(options: ListUsersOptions = {}): Promise<DataResponse<ListUsersResponse>> {\n return wrapAsync(async () => {\n const params = new URLSearchParams();\n\n if (options.exclude_admins !== undefined) {\n params.append(\"exclude_admins\", String(options.exclude_admins));\n }\n if (options.search) {\n params.append(\"search\", options.search);\n }\n if (options.limit !== undefined) {\n params.append(\"limit\", String(options.limit));\n }\n if (options.type) {\n params.append(\"type\", options.type);\n }\n\n const queryString = params.toString();\n const url = queryString\n ? `/api/v1/admin/users?${queryString}`\n : \"/api/v1/admin/users\";\n\n return await this.fetch.get<ListUsersResponse>(url);\n });\n }\n\n /**\n * Get a user by ID\n *\n * Fetch a single user's details by their user ID\n *\n * @param userId - User ID to fetch\n * @param type - User type ('app' or 'dashboard')\n * @returns User details with metadata\n *\n * @example\n * ```typescript\n * // Get an app user\n * const user = await admin.getUserById('user-123');\n *\n * // Get a dashboard user\n * const dashboardUser = await admin.getUserById('admin-456', 'dashboard');\n * console.log('User email:', dashboardUser.email);\n * console.log('Last login:', dashboardUser.last_login_at);\n * ```\n */\n async getUserById(\n userId: string,\n type: \"app\" | \"dashboard\" = \"app\",\n ): Promise<DataResponse<EnrichedUser>> {\n return wrapAsync(async () => {\n const url = `/api/v1/admin/users/${userId}?type=${type}`;\n return await this.fetch.get<EnrichedUser>(url);\n });\n }\n\n /**\n * Invite a new user\n *\n * Creates a new user and optionally sends an invitation email\n *\n * @param request - User invitation details\n * @param type - User type ('app' or 'dashboard')\n * @returns Created user and invitation details\n *\n * @example\n * ```typescript\n * const response = await admin.inviteUser({\n * email: 'newuser@example.com',\n * role: 'user',\n * send_email: true\n * });\n *\n * console.log('User invited:', response.user.email);\n * console.log('Invitation link:', response.invitation_link);\n * ```\n */\n async inviteUser(\n request: InviteUserRequest,\n type: \"app\" | \"dashboard\" = \"app\",\n ): Promise<DataResponse<InviteUserResponse>> {\n return wrapAsync(async () => {\n const url = `/api/v1/admin/users/invite?type=${type}`;\n return await this.fetch.post<InviteUserResponse>(url, request);\n });\n }\n\n /**\n * Delete a user\n *\n * Permanently deletes a user and all associated data\n *\n * @param userId - User ID to delete\n * @param type - User type ('app' or 'dashboard')\n * @returns Deletion confirmation\n *\n * @example\n * ```typescript\n * await admin.deleteUser('user-uuid');\n * console.log('User deleted');\n * ```\n */\n async deleteUser(\n userId: string,\n type: \"app\" | \"dashboard\" = \"app\",\n ): Promise<DataResponse<DeleteUserResponse>> {\n return wrapAsync(async () => {\n const url = `/api/v1/admin/users/${userId}?type=${type}`;\n return await this.fetch.delete<DeleteUserResponse>(url);\n });\n }\n\n /**\n * Update user role\n *\n * Changes a user's role\n *\n * @param userId - User ID\n * @param role - New role\n * @param type - User type ('app' or 'dashboard')\n * @returns Updated user\n *\n * @example\n * ```typescript\n * const user = await admin.updateUserRole('user-uuid', 'admin');\n * console.log('User role updated:', user.role);\n * ```\n */\n async updateUserRole(\n userId: string,\n role: string,\n type: \"app\" | \"dashboard\" = \"app\",\n ): Promise<DataResponse<EnrichedUser>> {\n return wrapAsync(async () => {\n const url = `/api/v1/admin/users/${userId}/role?type=${type}`;\n return await this.fetch.patch<EnrichedUser>(url, { role });\n });\n }\n\n /**\n * Reset user password\n *\n * Generates a new password for the user and optionally sends it via email\n *\n * @param userId - User ID\n * @param type - User type ('app' or 'dashboard')\n * @returns Reset confirmation message\n *\n * @example\n * ```typescript\n * const response = await admin.resetUserPassword('user-uuid');\n * console.log(response.message);\n * ```\n */\n async resetUserPassword(\n userId: string,\n type: \"app\" | \"dashboard\" = \"app\",\n ): Promise<DataResponse<ResetUserPasswordResponse>> {\n return wrapAsync(async () => {\n const url = `/api/v1/admin/users/${userId}/reset-password?type=${type}`;\n return await this.fetch.post<ResetUserPasswordResponse>(url, {});\n });\n }\n}\n","/**\n * PostgreSQL query builder for Fluxbase SDK\n * Inspired by Supabase's PostgREST client\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n FilterOperator,\n OrderBy,\n PostgrestResponse,\n UpsertOptions,\n} from \"./types\";\n\nexport class QueryBuilder<T = unknown>\n implements PromiseLike<PostgrestResponse<T>>\n{\n private fetch: FluxbaseFetch;\n private table: string;\n private selectQuery: string = \"*\";\n private filters: Array<{\n column: string;\n operator: FilterOperator;\n value: unknown;\n }> = [];\n private orFilters: string[] = [];\n private andFilters: string[] = [];\n private orderBys: OrderBy[] = [];\n private limitValue?: number;\n private offsetValue?: number;\n private singleRow: boolean = false;\n private maybeSingleRow: boolean = false;\n private groupByColumns?: string[];\n private operationType: \"select\" | \"insert\" | \"update\" | \"delete\" = \"select\";\n private insertData?: Partial<T> | Array<Partial<T>>;\n private updateData?: Partial<T>;\n\n constructor(fetch: FluxbaseFetch, table: string) {\n this.fetch = fetch;\n this.table = table;\n }\n\n /**\n * Select columns to return\n * @example select('*')\n * @example select('id, name, email')\n * @example select('id, name, posts(title, content)')\n */\n select(columns: string = \"*\"): this {\n this.selectQuery = columns;\n return this;\n }\n\n /**\n * Insert a single row or multiple rows\n */\n insert(data: Partial<T> | Array<Partial<T>>): this {\n this.operationType = \"insert\";\n this.insertData = data;\n return this;\n }\n\n /**\n * Upsert (insert or update) rows (Supabase-compatible)\n * @param data - Row(s) to upsert\n * @param options - Upsert options (onConflict, ignoreDuplicates, defaultToNull)\n */\n async upsert(\n data: Partial<T> | Array<Partial<T>>,\n options?: UpsertOptions,\n ): Promise<PostgrestResponse<T>> {\n const body = Array.isArray(data) ? data : data;\n\n // Build Prefer header based on options\n const preferValues: string[] = [];\n\n if (options?.ignoreDuplicates) {\n preferValues.push(\"resolution=ignore-duplicates\");\n } else {\n preferValues.push(\"resolution=merge-duplicates\");\n }\n\n if (options?.defaultToNull) {\n preferValues.push(\"missing=default\");\n }\n\n const headers: Record<string, string> = {\n Prefer: preferValues.join(\",\"),\n };\n\n // Add onConflict as query parameter if specified\n let path = `/api/v1/tables/${this.table}`;\n if (options?.onConflict) {\n path += `?on_conflict=${encodeURIComponent(options.onConflict)}`;\n }\n\n const response = await this.fetch.post<T>(path, body, { headers });\n\n return {\n data: response,\n error: null,\n count: Array.isArray(data) ? data.length : 1,\n status: 201,\n statusText: \"Created\",\n };\n }\n\n /**\n * Update rows matching the filters\n */\n update(data: Partial<T>): this {\n this.operationType = \"update\";\n this.updateData = data;\n return this;\n }\n\n /**\n * Delete rows matching the filters\n */\n delete(): this {\n this.operationType = \"delete\";\n return this;\n }\n\n /**\n * Equal to\n */\n eq(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"eq\", value });\n return this;\n }\n\n /**\n * Not equal to\n */\n neq(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"neq\", value });\n return this;\n }\n\n /**\n * Greater than\n */\n gt(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"gt\", value });\n return this;\n }\n\n /**\n * Greater than or equal to\n */\n gte(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"gte\", value });\n return this;\n }\n\n /**\n * Less than\n */\n lt(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"lt\", value });\n return this;\n }\n\n /**\n * Less than or equal to\n */\n lte(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"lte\", value });\n return this;\n }\n\n /**\n * Pattern matching (case-sensitive)\n */\n like(column: string, pattern: string): this {\n this.filters.push({ column, operator: \"like\", value: pattern });\n return this;\n }\n\n /**\n * Pattern matching (case-insensitive)\n */\n ilike(column: string, pattern: string): this {\n this.filters.push({ column, operator: \"ilike\", value: pattern });\n return this;\n }\n\n /**\n * Check if value is null or not null\n */\n is(column: string, value: null | boolean): this {\n this.filters.push({ column, operator: \"is\", value });\n return this;\n }\n\n /**\n * Check if value is in array\n */\n in(column: string, values: unknown[]): this {\n this.filters.push({ column, operator: \"in\", value: values });\n return this;\n }\n\n /**\n * Contains (for arrays and JSONB)\n */\n contains(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"cs\", value });\n return this;\n }\n\n /**\n * Full-text search\n */\n textSearch(column: string, query: string): this {\n this.filters.push({ column, operator: \"fts\", value: query });\n return this;\n }\n\n /**\n * Negate a filter condition (Supabase-compatible)\n * @example not('status', 'eq', 'deleted')\n * @example not('completed_at', 'is', null)\n */\n not(column: string, operator: FilterOperator, value: unknown): this {\n this.filters.push({\n column,\n operator: \"not\" as FilterOperator,\n value: `${operator}.${this.formatValue(value)}`,\n });\n return this;\n }\n\n /**\n * Apply OR logic to filters (Supabase-compatible)\n * @example or('status.eq.active,status.eq.pending')\n * @example or('id.eq.2,name.eq.Han')\n */\n or(filters: string): this {\n this.orFilters.push(filters);\n return this;\n }\n\n /**\n * Apply AND logic to filters (Supabase-compatible)\n * Groups multiple conditions that must all be true\n * @example and('status.eq.active,verified.eq.true')\n * @example and('age.gte.18,age.lte.65')\n */\n and(filters: string): this {\n this.andFilters.push(filters);\n return this;\n }\n\n /**\n * Match multiple columns with exact values (Supabase-compatible)\n * Shorthand for multiple .eq() calls\n * @example match({ id: 1, status: 'active', role: 'admin' })\n */\n match(conditions: Record<string, unknown>): this {\n for (const [column, value] of Object.entries(conditions)) {\n this.eq(column, value);\n }\n return this;\n }\n\n /**\n * Generic filter method using PostgREST syntax (Supabase-compatible)\n * @example filter('name', 'in', '(\"Han\",\"Yoda\")')\n * @example filter('age', 'gte', '18')\n */\n filter(column: string, operator: FilterOperator, value: unknown): this {\n this.filters.push({ column, operator, value });\n return this;\n }\n\n /**\n * Check if column is contained by value (Supabase-compatible)\n * For arrays and JSONB\n * @example containedBy('tags', '[\"news\",\"update\"]')\n */\n containedBy(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"cd\", value });\n return this;\n }\n\n /**\n * Check if arrays have common elements (Supabase-compatible)\n * @example overlaps('tags', '[\"news\",\"sports\"]')\n */\n overlaps(column: string, value: unknown): this {\n this.filters.push({ column, operator: \"ov\", value });\n return this;\n }\n\n // PostGIS Spatial Query Methods\n\n /**\n * Check if geometries intersect (PostGIS ST_Intersects)\n * @param column - Column containing geometry/geography data\n * @param geojson - GeoJSON object to test intersection with\n * @example intersects('location', { type: 'Point', coordinates: [-122.4, 37.8] })\n */\n intersects(column: string, geojson: unknown): this {\n this.filters.push({\n column,\n operator: \"st_intersects\" as FilterOperator,\n value: geojson,\n });\n return this;\n }\n\n /**\n * Check if geometry A contains geometry B (PostGIS ST_Contains)\n * @param column - Column containing geometry/geography data\n * @param geojson - GeoJSON object to test containment\n * @example contains('region', { type: 'Point', coordinates: [-122.4, 37.8] })\n */\n stContains(column: string, geojson: unknown): this {\n this.filters.push({\n column,\n operator: \"st_contains\" as FilterOperator,\n value: geojson,\n });\n return this;\n }\n\n /**\n * Check if geometry A is within geometry B (PostGIS ST_Within)\n * @param column - Column containing geometry/geography data\n * @param geojson - GeoJSON object to test containment within\n * @example within('point', { type: 'Polygon', coordinates: [[...]] })\n */\n within(column: string, geojson: unknown): this {\n this.filters.push({\n column,\n operator: \"st_within\" as FilterOperator,\n value: geojson,\n });\n return this;\n }\n\n /**\n * Check if geometries touch (PostGIS ST_Touches)\n * @param column - Column containing geometry/geography data\n * @param geojson - GeoJSON object to test touching\n * @example touches('boundary', { type: 'LineString', coordinates: [[...]] })\n */\n touches(column: string, geojson: unknown): this {\n this.filters.push({\n column,\n operator: \"st_touches\" as FilterOperator,\n value: geojson,\n });\n return this;\n }\n\n /**\n * Check if geometries cross (PostGIS ST_Crosses)\n * @param column - Column containing geometry/geography data\n * @param geojson - GeoJSON object to test crossing\n * @example crosses('road', { type: 'LineString', coordinates: [[...]] })\n */\n crosses(column: string, geojson: unknown): this {\n this.filters.push({\n column,\n operator: \"st_crosses\" as FilterOperator,\n value: geojson,\n });\n return this;\n }\n\n /**\n * Check if geometries spatially overlap (PostGIS ST_Overlaps)\n * @param column - Column containing geometry/geography data\n * @param geojson - GeoJSON object to test overlap\n * @example stOverlaps('area', { type: 'Polygon', coordinates: [[...]] })\n */\n stOverlaps(column: string, geojson: unknown): this {\n this.filters.push({\n column,\n operator: \"st_overlaps\" as FilterOperator,\n value: geojson,\n });\n return this;\n }\n\n /**\n * Order results\n */\n order(\n column: string,\n options?: { ascending?: boolean; nullsFirst?: boolean },\n ): this {\n this.orderBys.push({\n column,\n direction: options?.ascending === false ? \"desc\" : \"asc\",\n nulls: options?.nullsFirst ? \"first\" : \"last\",\n });\n return this;\n }\n\n /**\n * Limit number of rows returned\n */\n limit(count: number): this {\n this.limitValue = count;\n return this;\n }\n\n /**\n * Skip rows\n */\n offset(count: number): this {\n this.offsetValue = count;\n return this;\n }\n\n /**\n * Return a single row (adds limit(1))\n * Errors if no rows found\n */\n single(): this {\n this.singleRow = true;\n this.limitValue = 1;\n return this;\n }\n\n /**\n * Return a single row or null (adds limit(1))\n * Does not error if no rows found (Supabase-compatible)\n * @example\n * ```typescript\n * // Returns null instead of erroring when no row exists\n * const { data, error } = await client\n * .from('users')\n * .select('*')\n * .eq('id', 999)\n * .maybeSingle()\n * // data will be null if no row found\n * ```\n */\n maybeSingle(): this {\n this.maybeSingleRow = true;\n this.limitValue = 1;\n return this;\n }\n\n /**\n * Range selection (pagination)\n */\n range(from: number, to: number): this {\n this.offsetValue = from;\n this.limitValue = to - from + 1;\n return this;\n }\n\n /**\n * Group results by one or more columns (for use with aggregations)\n *\n * @param columns - Column name(s) to group by\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Group by single column\n * const { data } = await client.from('orders')\n * .count('*')\n * .groupBy('status')\n * .execute()\n *\n * // Group by multiple columns\n * const { data } = await client.from('sales')\n * .sum('amount')\n * .groupBy(['region', 'product_category'])\n * .execute()\n * ```\n *\n * @category Aggregation\n */\n groupBy(columns: string | string[]): this {\n this.groupByColumns = Array.isArray(columns) ? columns : [columns];\n return this;\n }\n\n /**\n * Count rows or a specific column\n *\n * @param column - Column to count (default: '*' for row count)\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Count all rows\n * const { data } = await client.from('users').count().execute()\n * // Returns: { count: 150 }\n *\n * // Count non-null values in a column\n * const { data } = await client.from('orders').count('completed_at').execute()\n *\n * // Count with grouping\n * const { data } = await client.from('products')\n * .count('*')\n * .groupBy('category')\n * .execute()\n * // Returns: [{ category: 'electronics', count: 45 }, { category: 'books', count: 23 }]\n * ```\n *\n * @category Aggregation\n */\n count(column: string = \"*\"): this {\n this.selectQuery = `count(${column})`;\n return this;\n }\n\n /**\n * Calculate the sum of a numeric column\n *\n * @param column - Column to sum\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Sum all prices\n * const { data } = await client.from('products').sum('price').execute()\n * // Returns: { sum_price: 15420.50 }\n *\n * // Sum by category\n * const { data } = await client.from('orders')\n * .sum('total')\n * .groupBy('status')\n * .execute()\n * // Returns: [{ status: 'completed', sum_total: 12500 }, { status: 'pending', sum_total: 3200 }]\n * ```\n *\n * @category Aggregation\n */\n sum(column: string): this {\n this.selectQuery = `sum(${column})`;\n return this;\n }\n\n /**\n * Calculate the average of a numeric column\n *\n * @param column - Column to average\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Average price\n * const { data } = await client.from('products').avg('price').execute()\n * // Returns: { avg_price: 129.99 }\n *\n * // Average by category\n * const { data } = await client.from('products')\n * .avg('price')\n * .groupBy('category')\n * .execute()\n * ```\n *\n * @category Aggregation\n */\n avg(column: string): this {\n this.selectQuery = `avg(${column})`;\n return this;\n }\n\n /**\n * Find the minimum value in a column\n *\n * @param column - Column to find minimum value\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Find lowest price\n * const { data } = await client.from('products').min('price').execute()\n * // Returns: { min_price: 9.99 }\n *\n * // Find earliest date\n * const { data } = await client.from('orders').min('created_at').execute()\n * ```\n *\n * @category Aggregation\n */\n min(column: string): this {\n this.selectQuery = `min(${column})`;\n return this;\n }\n\n /**\n * Find the maximum value in a column\n *\n * @param column - Column to find maximum value\n * @returns Query builder for chaining\n *\n * @example\n * ```typescript\n * // Find highest price\n * const { data } = await client.from('products').max('price').execute()\n * // Returns: { max_price: 1999.99 }\n *\n * // Find most recent order\n * const { data } = await client.from('orders').max('created_at').execute()\n * ```\n *\n * @category Aggregation\n */\n max(column: string): this {\n this.selectQuery = `max(${column})`;\n return this;\n }\n\n /**\n * Insert multiple rows in a single request (batch insert)\n *\n * This is a convenience method that explicitly shows intent for batch operations.\n * Internally calls `insert()` with an array.\n *\n * @param rows - Array of row objects to insert\n * @returns Promise with the inserted rows\n *\n * @example\n * ```typescript\n * // Insert multiple users at once\n * const { data } = await client.from('users').insertMany([\n * { name: 'Alice', email: 'alice@example.com' },\n * { name: 'Bob', email: 'bob@example.com' },\n * { name: 'Charlie', email: 'charlie@example.com' }\n * ])\n * ```\n *\n * @category Batch Operations\n */\n async insertMany(rows: Array<Partial<T>>): Promise<PostgrestResponse<T>> {\n return this.insert(rows).execute();\n }\n\n /**\n * Update multiple rows matching the filters (batch update)\n *\n * Updates all rows that match the current query filters.\n * This is a convenience method that explicitly shows intent for batch operations.\n *\n * @param data - Data to update matching rows with\n * @returns Promise with the updated rows\n *\n * @example\n * ```typescript\n * // Apply discount to all electronics\n * const { data } = await client.from('products')\n * .eq('category', 'electronics')\n * .updateMany({ discount: 10, updated_at: new Date() })\n *\n * // Mark all pending orders as processing\n * const { data } = await client.from('orders')\n * .eq('status', 'pending')\n * .updateMany({ status: 'processing' })\n * ```\n *\n * @category Batch Operations\n */\n async updateMany(data: Partial<T>): Promise<PostgrestResponse<T>> {\n return this.update(data).execute();\n }\n\n /**\n * Delete multiple rows matching the filters (batch delete)\n *\n * Deletes all rows that match the current query filters.\n * This is a convenience method that explicitly shows intent for batch operations.\n *\n * @returns Promise confirming deletion\n *\n * @example\n * ```typescript\n * // Delete all inactive users\n * await client.from('users')\n * .eq('active', false)\n * .deleteMany()\n *\n * // Delete old logs\n * await client.from('logs')\n * .lt('created_at', '2024-01-01')\n * .deleteMany()\n * ```\n *\n * @category Batch Operations\n */\n async deleteMany(): Promise<PostgrestResponse<null>> {\n return this.delete().execute() as Promise<PostgrestResponse<null>>;\n }\n\n /**\n * Execute the query and return results\n */\n async execute(): Promise<PostgrestResponse<T>> {\n try {\n // Handle INSERT operation\n if (this.operationType === \"insert\") {\n if (!this.insertData) {\n throw new Error(\"Insert data is required for insert operation\");\n }\n const body = Array.isArray(this.insertData)\n ? this.insertData\n : this.insertData;\n const response = await this.fetch.post<T>(\n `/api/v1/tables/${this.table}`,\n body,\n );\n\n return {\n data: response,\n error: null,\n count: Array.isArray(this.insertData) ? this.insertData.length : 1,\n status: 201,\n statusText: \"Created\",\n };\n }\n\n // Handle UPDATE operation\n if (this.operationType === \"update\") {\n if (!this.updateData) {\n throw new Error(\"Update data is required for update operation\");\n }\n const queryString = this.buildQueryString();\n const path = `/api/v1/tables/${this.table}${queryString}`;\n const response = await this.fetch.patch<T>(path, this.updateData);\n\n return {\n data: response,\n error: null,\n count: null,\n status: 200,\n statusText: \"OK\",\n };\n }\n\n // Handle DELETE operation\n if (this.operationType === \"delete\") {\n const queryString = this.buildQueryString();\n const path = `/api/v1/tables/${this.table}${queryString}`;\n await this.fetch.delete(path);\n\n return {\n data: null,\n error: null,\n count: null,\n status: 204,\n statusText: \"No Content\",\n } as PostgrestResponse<T>;\n }\n\n // Handle SELECT operation (default)\n const queryString = this.buildQueryString();\n const path = `/api/v1/tables/${this.table}${queryString}`;\n const data = await this.fetch.get<T | T[]>(path);\n\n // Handle single row response\n if (this.singleRow) {\n if (Array.isArray(data) && data.length === 0) {\n return {\n data: null,\n error: { message: \"No rows found\", code: \"PGRST116\" },\n count: 0,\n status: 404,\n statusText: \"Not Found\",\n };\n }\n const singleData = Array.isArray(data) ? data[0] : data;\n return {\n data: singleData as T,\n error: null,\n count: 1,\n status: 200,\n statusText: \"OK\",\n };\n }\n\n // Handle maybeSingle row response (returns null instead of error when no rows found)\n if (this.maybeSingleRow) {\n if (Array.isArray(data) && data.length === 0) {\n return {\n data: null,\n error: null,\n count: 0,\n status: 200,\n statusText: \"OK\",\n };\n }\n const singleData = Array.isArray(data) ? data[0] : data;\n return {\n data: singleData as T,\n error: null,\n count: 1,\n status: 200,\n statusText: \"OK\",\n };\n }\n\n return {\n data: data as T,\n error: null,\n count: Array.isArray(data) ? data.length : null,\n status: 200,\n statusText: \"OK\",\n };\n } catch (err) {\n const error = err as Error;\n return {\n data: null,\n error: {\n message: error.message,\n code: \"PGRST000\",\n },\n count: null,\n status: 500,\n statusText: \"Internal Server Error\",\n };\n }\n }\n\n /**\n * Execute the query and throw an error if one occurs (Supabase-compatible)\n * Returns the data directly instead of { data, error } wrapper\n *\n * @throws {Error} If the query fails or returns an error\n * @example\n * ```typescript\n * // Throws error instead of returning { data, error }\n * try {\n * const user = await client\n * .from('users')\n * .select('*')\n * .eq('id', 1)\n * .single()\n * .throwOnError()\n * } catch (error) {\n * console.error('Query failed:', error)\n * }\n * ```\n */\n async throwOnError(): Promise<T> {\n const response = await this.execute();\n\n if (response.error) {\n const error = new Error(response.error.message);\n // Preserve error code if available\n if (response.error.code) {\n (error as any).code = response.error.code;\n }\n throw error;\n }\n\n return response.data as T;\n }\n\n /**\n * Make QueryBuilder awaitable (implements PromiseLike)\n * This allows using `await client.from('table').select()` without calling `.execute()`\n *\n * @example\n * ```typescript\n * // Without .execute() (new way)\n * const { data } = await client.from('users').select('*')\n *\n * // With .execute() (old way, still supported)\n * const { data } = await client.from('users').select('*').execute()\n * ```\n */\n then<TResult1 = PostgrestResponse<T>, TResult2 = never>(\n onfulfilled?:\n | ((value: PostgrestResponse<T>) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n ): PromiseLike<TResult1 | TResult2> {\n return this.execute().then(onfulfilled, onrejected);\n }\n\n /**\n * Build the query string from filters, ordering, etc.\n */\n private buildQueryString(): string {\n const params = new URLSearchParams();\n\n // Select\n if (this.selectQuery && this.selectQuery !== \"*\") {\n params.append(\"select\", this.selectQuery);\n }\n\n // Filters\n for (const filter of this.filters) {\n params.append(\n filter.column,\n `${filter.operator}.${this.formatValue(filter.value)}`,\n );\n }\n\n // OR Filters\n for (const orFilter of this.orFilters) {\n params.append(\"or\", `(${orFilter})`);\n }\n\n // AND Filters\n for (const andFilter of this.andFilters) {\n params.append(\"and\", `(${andFilter})`);\n }\n\n // Group By\n if (this.groupByColumns && this.groupByColumns.length > 0) {\n params.append(\"group_by\", this.groupByColumns.join(\",\"));\n }\n\n // Order\n if (this.orderBys.length > 0) {\n const orderStr = this.orderBys\n .map(\n (o) =>\n `${o.column}.${o.direction}${o.nulls ? `.nulls${o.nulls}` : \"\"}`,\n )\n .join(\",\");\n params.append(\"order\", orderStr);\n }\n\n // Limit\n if (this.limitValue !== undefined) {\n params.append(\"limit\", String(this.limitValue));\n }\n\n // Offset\n if (this.offsetValue !== undefined) {\n params.append(\"offset\", String(this.offsetValue));\n }\n\n const queryString = params.toString();\n return queryString ? `?${queryString}` : \"\";\n }\n\n /**\n * Format a value for the query string\n */\n private formatValue(value: unknown): string {\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n if (Array.isArray(value)) {\n return `(${value.map((v) => this.formatValue(v)).join(\",\")})`;\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n return String(value);\n }\n}\n","/**\n * Main Fluxbase client for interacting with the Fluxbase backend.\n *\n * This client provides access to all Fluxbase features including:\n * - Database operations via PostgREST-compatible API\n * - Authentication and user management\n * - Real-time subscriptions via WebSockets\n * - File storage and management\n * - Edge functions for serverless compute\n * - PostgreSQL function calls (RPC)\n *\n * @example\n * ```typescript\n * import { createClient } from '@fluxbase/sdk'\n *\n * const client = createClient({\n * url: 'http://localhost:8080',\n * auth: {\n * token: 'your-jwt-token',\n * autoRefresh: true\n * }\n * })\n *\n * // Query database\n * const { data } = await client.from('users').select('*').execute()\n *\n * // Invoke edge function\n * const { data, error } = await client.functions.invoke('hello-world', {\n * body: { name: 'Alice' }\n * })\n *\n * // Subscribe to realtime changes\n * client.realtime.subscribe('users', (payload) => {\n * console.log('Change:', payload)\n * })\n * ```\n *\n * @category Client\n */\n\nimport { FluxbaseFetch } from \"./fetch\";\nimport { FluxbaseAuth } from \"./auth\";\nimport { FluxbaseRealtime } from \"./realtime\";\nimport { FluxbaseStorage } from \"./storage\";\nimport { FluxbaseFunctions } from \"./functions\";\nimport { FluxbaseAdmin } from \"./admin\";\nimport { FluxbaseManagement } from \"./management\";\nimport { SettingsClient } from \"./settings\";\nimport { QueryBuilder } from \"./query-builder\";\nimport type { FluxbaseClientOptions } from \"./types\";\n\n/**\n * Main Fluxbase client class\n * @category Client\n */\nexport class FluxbaseClient<\n Database = any,\n _SchemaName extends string & keyof Database = any,\n> {\n /** Internal HTTP client for making requests */\n private fetch: FluxbaseFetch;\n\n /** Authentication module for user management */\n public auth: FluxbaseAuth;\n\n /** Realtime module for WebSocket subscriptions */\n public realtime: FluxbaseRealtime;\n\n /** Storage module for file operations */\n public storage: FluxbaseStorage;\n\n /** Functions module for invoking and managing edge functions */\n public functions: FluxbaseFunctions;\n\n /** Admin module for instance management (requires admin authentication) */\n public admin: FluxbaseAdmin;\n\n /** Management module for API keys, webhooks, and invitations */\n public management: FluxbaseManagement;\n\n /** Settings module for reading public application settings (respects RLS policies) */\n public settings: SettingsClient;\n\n /**\n * Create a new Fluxbase client instance\n *\n * @param fluxbaseUrl - The URL of your Fluxbase instance\n * @param fluxbaseKey - The anon key (JWT token with \"anon\" role). Generate using scripts/generate-keys.sh\n * @param options - Additional client configuration options\n *\n * @example\n * ```typescript\n * const client = new FluxbaseClient(\n * 'http://localhost:8080',\n * 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...', // Anon JWT token\n * { timeout: 30000 }\n * )\n * ```\n */\n constructor(\n protected fluxbaseUrl: string,\n protected fluxbaseKey: string,\n options?: FluxbaseClientOptions,\n ) {\n // Prepare headers with anon key\n const headers = {\n apikey: fluxbaseKey,\n Authorization: `Bearer ${fluxbaseKey}`,\n ...options?.headers,\n };\n\n // Initialize HTTP client\n this.fetch = new FluxbaseFetch(fluxbaseUrl, {\n headers,\n timeout: options?.timeout,\n debug: options?.debug,\n });\n\n // Initialize auth module\n this.auth = new FluxbaseAuth(\n this.fetch,\n options?.auth?.autoRefresh ?? true,\n options?.auth?.persist ?? true,\n );\n\n // Set auth token if provided\n if (options?.auth?.token) {\n this.fetch.setAuthToken(options.auth.token);\n }\n\n // Initialize realtime module\n this.realtime = new FluxbaseRealtime(\n fluxbaseUrl,\n options?.auth?.token || null,\n );\n\n // Initialize storage module\n this.storage = new FluxbaseStorage(this.fetch);\n\n // Initialize functions module\n this.functions = new FluxbaseFunctions(this.fetch);\n\n // Initialize admin module\n this.admin = new FluxbaseAdmin(this.fetch);\n\n // Initialize management module\n this.management = new FluxbaseManagement(this.fetch);\n\n // Initialize settings module (public read-only access with RLS)\n this.settings = new SettingsClient(this.fetch);\n\n // Subscribe to auth changes to update realtime token\n this.setupAuthSync();\n }\n\n /**\n * Create a query builder for a database table\n *\n * @param table - The table name (can include schema, e.g., 'public.users')\n * @returns A query builder instance for constructing and executing queries\n *\n * @example\n * ```typescript\n * // Simple select\n * const { data } = await client.from('users').select('*').execute()\n *\n * // With filters\n * const { data } = await client.from('products')\n * .select('id, name, price')\n * .gt('price', 100)\n * .eq('category', 'electronics')\n * .execute()\n *\n * // Insert\n * await client.from('users').insert({ name: 'John', email: 'john@example.com' }).execute()\n * ```\n *\n * @category Database\n */\n from<T = any>(table: string): QueryBuilder<T> {\n return new QueryBuilder<T>(this.fetch, table);\n }\n\n /**\n * Call a PostgreSQL function (Remote Procedure Call)\n *\n * @param functionName - The name of the PostgreSQL function to call\n * @param params - Optional parameters to pass to the function\n * @returns Promise containing the function result or error\n *\n * @example\n * ```typescript\n * // Call a function without parameters\n * const { data, error } = await client.rpc('get_total_users')\n *\n * // Call a function with parameters\n * const { data, error } = await client.rpc('calculate_discount', {\n * product_id: 123,\n * coupon_code: 'SAVE20'\n * })\n * ```\n *\n * @category Database\n */\n async rpc<T = any>(\n functionName: string,\n params?: Record<string, unknown>,\n ): Promise<{ data: T | null; error: Error | null }> {\n try {\n const data = await this.fetch.post<T>(\n `/api/v1/rpc/${functionName}`,\n params || {},\n );\n return { data, error: null };\n } catch (error) {\n return { data: null, error: error as Error };\n }\n }\n\n /**\n * Sync auth state with realtime connections\n * @internal\n */\n private setupAuthSync() {\n // When auth token changes, update realtime\n const originalSetAuthToken = this.fetch.setAuthToken.bind(this.fetch);\n this.fetch.setAuthToken = (token: string | null) => {\n originalSetAuthToken(token);\n this.realtime.setAuth(token);\n };\n }\n\n /**\n * Get the current authentication token\n *\n * @returns The current JWT access token, or null if not authenticated\n *\n * @category Authentication\n */\n getAuthToken(): string | null {\n return this.auth.getAccessToken();\n }\n\n /**\n * Set a new authentication token\n *\n * This updates both the HTTP client and realtime connection with the new token.\n *\n * @param token - The JWT access token to set, or null to clear authentication\n *\n * @category Authentication\n */\n setAuthToken(token: string | null) {\n this.fetch.setAuthToken(token);\n this.realtime.setAuth(token);\n }\n\n /**\n * Create or get a realtime channel (Supabase-compatible)\n *\n * @param name - Channel name\n * @param config - Optional channel configuration\n * @returns RealtimeChannel instance\n *\n * @example\n * ```typescript\n * const channel = client.channel('room-1', {\n * broadcast: { self: true },\n * presence: { key: 'user-123' }\n * })\n * .on('broadcast', { event: 'message' }, (payload) => {\n * console.log('Message:', payload)\n * })\n * .subscribe()\n * ```\n *\n * @category Realtime\n */\n channel(name: string, config?: import(\"./types\").RealtimeChannelConfig) {\n return this.realtime.channel(name, config);\n }\n\n /**\n * Remove a realtime channel (Supabase-compatible)\n *\n * @param channel - The channel to remove\n * @returns Promise resolving to status\n *\n * @example\n * ```typescript\n * const channel = client.channel('room-1')\n * await client.removeChannel(channel)\n * ```\n *\n * @category Realtime\n */\n removeChannel(channel: import(\"./realtime\").RealtimeChannel) {\n return this.realtime.removeChannel(channel);\n }\n\n /**\n * Get the internal HTTP client\n *\n * Use this for advanced scenarios like making custom API calls or admin operations.\n *\n * @returns The internal FluxbaseFetch instance\n *\n * @example\n * ```typescript\n * // Make a custom API call\n * const data = await client.http.get('/api/custom-endpoint')\n * ```\n *\n * @category Advanced\n */\n get http(): FluxbaseFetch {\n return this.fetch;\n }\n}\n\n/**\n * Create a new Fluxbase client instance (Supabase-compatible)\n *\n * This function signature is identical to Supabase's createClient, making migration seamless.\n *\n * @param fluxbaseUrl - The URL of your Fluxbase instance\n * @param fluxbaseKey - The anon key (JWT token with \"anon\" role). Generate using: `./scripts/generate-keys.sh` (option 3)\n * @param options - Optional client configuration\n * @returns A configured Fluxbase client instance with full TypeScript support\n *\n * @example\n * ```typescript\n * import { createClient } from '@fluxbase/sdk'\n *\n * // Initialize with anon key (identical to Supabase)\n * const client = createClient(\n * 'http://localhost:8080',\n * 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' // Anon JWT token\n * )\n *\n * // With additional options\n * const client = createClient(\n * 'http://localhost:8080',\n * 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',\n * { timeout: 30000, debug: true }\n * )\n *\n * // With TypeScript database types\n * const client = createClient<Database>(\n * 'http://localhost:8080',\n * 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'\n * )\n * ```\n *\n * @category Client\n */\nexport function createClient<\n Database = any,\n SchemaName extends string & keyof Database = any,\n>(\n fluxbaseUrl: string,\n fluxbaseKey: string,\n options?: FluxbaseClientOptions,\n): FluxbaseClient<Database, SchemaName> {\n return new FluxbaseClient<Database, SchemaName>(\n fluxbaseUrl,\n fluxbaseKey,\n options,\n );\n}\n"]}
|