@fluxbase/sdk 0.0.1-rc.16 → 0.0.1-rc.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/fetch.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"],"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","/**\n * Authentication module for Fluxbase SDK\n */\n\nimport type { FluxbaseFetch } from \"./fetch\";\nimport type {\n AuthResponse,\n AuthSession,\n SignInCredentials,\n SignUpCredentials,\n User,\n TwoFactorSetupResponse,\n TwoFactorEnableResponse,\n TwoFactorStatusResponse,\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} from \"./types\";\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\n */\n getSession(): AuthSession | null {\n return this.session;\n }\n\n /**\n * Get the current user\n */\n getUser(): User | null {\n return this.session?.user ?? 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\n * @param callback - Function called when auth state changes\n * @returns Subscription object with unsubscribe method\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): AuthSubscription {\n this.stateChangeListeners.add(callback);\n\n return {\n unsubscribe: () => {\n this.stateChangeListeners.delete(callback);\n },\n };\n }\n\n /**\n * Sign in with email and password\n * Returns AuthSession if successful, or SignInWith2FAResponse if 2FA is required\n */\n async signIn(\n credentials: SignInCredentials,\n ): Promise<AuthSession | SignInWith2FAResponse> {\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.setSession(session);\n return session;\n }\n\n /**\n * Sign in with email and password\n * Alias for signIn() to maintain compatibility with common authentication patterns\n * Returns AuthSession if successful, or SignInWith2FAResponse if 2FA is required\n */\n async signInWithPassword(\n credentials: SignInCredentials,\n ): Promise<AuthSession | SignInWith2FAResponse> {\n return this.signIn(credentials);\n }\n\n /**\n * Sign up with email and password\n */\n async signUp(credentials: SignUpCredentials): Promise<AuthSession> {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/signup\",\n credentials,\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSession(session);\n return session;\n }\n\n /**\n * Sign out the current user\n */\n async signOut(): Promise<void> {\n try {\n await this.fetch.post(\"/api/v1/auth/signout\");\n } finally {\n this.clearSession();\n }\n }\n\n /**\n * Refresh the access token\n */\n async refreshToken(): Promise<AuthSession> {\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.setSession(session, \"TOKEN_REFRESHED\");\n return session;\n }\n\n /**\n * Get the current user from the server\n */\n async getCurrentUser(): Promise<User> {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.get<User>(\"/api/v1/auth/user\");\n }\n\n /**\n * Update the current user\n */\n async updateUser(\n data: Partial<Pick<User, \"email\" | \"metadata\">>,\n ): Promise<User> {\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 * Set the auth token manually\n */\n setToken(token: string) {\n this.fetch.setAuthToken(token);\n }\n\n /**\n * Setup 2FA for the current user\n * Returns TOTP secret and QR code URL\n */\n async setup2FA(): Promise<TwoFactorSetupResponse> {\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 );\n }\n\n /**\n * Enable 2FA after verifying the TOTP code\n * Returns backup codes that should be saved by the user\n */\n async enable2FA(code: string): Promise<TwoFactorEnableResponse> {\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 * Disable 2FA for the current user\n * Requires password confirmation\n */\n async disable2FA(\n password: string,\n ): Promise<{ success: boolean; message: string }> {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<{ success: boolean; message: string }>(\n \"/api/v1/auth/2fa/disable\",\n { password },\n );\n }\n\n /**\n * Check 2FA status for the current user\n */\n async get2FAStatus(): Promise<TwoFactorStatusResponse> {\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 * Verify 2FA code during login\n * Call this after signIn returns requires_2fa: true\n */\n async verify2FA(request: TwoFactorVerifyRequest): Promise<AuthSession> {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/2fa/verify\",\n request,\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSession(session, \"MFA_CHALLENGE_VERIFIED\");\n return session;\n }\n\n /**\n * Send password reset email\n * Sends a password reset link to the provided email address\n * @param email - Email address to send reset link to\n */\n async sendPasswordReset(email: string): Promise<PasswordResetResponse> {\n return await this.fetch.post<PasswordResetResponse>(\n \"/api/v1/auth/password/reset\",\n { email },\n );\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(token: string): Promise<VerifyResetTokenResponse> {\n return await this.fetch.post<VerifyResetTokenResponse>(\n \"/api/v1/auth/password/reset/verify\",\n {\n token,\n },\n );\n }\n\n /**\n * Reset password with token\n * Complete the password reset process with a valid token\n * @param token - Password reset token\n * @param newPassword - New password to set\n */\n async resetPassword(\n token: string,\n newPassword: string,\n ): Promise<ResetPasswordResponse> {\n return await this.fetch.post<ResetPasswordResponse>(\n \"/api/v1/auth/password/reset/confirm\",\n {\n token,\n new_password: newPassword,\n },\n );\n }\n\n /**\n * Send magic link for passwordless authentication\n * @param email - Email address to send magic link to\n * @param options - Optional configuration for magic link\n */\n async sendMagicLink(\n email: string,\n options?: MagicLinkOptions,\n ): Promise<MagicLinkResponse> {\n return await this.fetch.post<MagicLinkResponse>(\"/api/v1/auth/magiclink\", {\n email,\n redirect_to: options?.redirect_to,\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<AuthSession> {\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.setSession(session);\n return session;\n }\n\n /**\n * Sign in anonymously\n * Creates a temporary anonymous user session\n */\n async signInAnonymously(): Promise<AuthSession> {\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.setSession(session);\n return session;\n }\n\n /**\n * Get list of enabled OAuth providers\n */\n async getOAuthProviders(): Promise<OAuthProvidersResponse> {\n return await this.fetch.get<OAuthProvidersResponse>(\n \"/api/v1/auth/oauth/providers\",\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<OAuthUrlResponse> {\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 * 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<AuthSession> {\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.setSession(session);\n return session;\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<void> {\n const { url } = await this.getOAuthUrl(provider, options);\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\n /**\n * Internal: Set the session and persist it\n */\n private setSession(\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(() => {\n this.refreshToken().catch((err) => {\n console.error(\"Failed to refresh token:\", err);\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} 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 subscriptionConfig: PostgresChangesConfig | null = null;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 10;\n private reconnectDelay = 1000;\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n\n constructor(url: string, channelName: string, token: string | null = null) {\n this.url = url;\n this.channelName = channelName;\n this.token = token;\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 // Implementation\n on(\n event: \"postgres_changes\" | \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\",\n configOrCallback: PostgresChangesConfig | RealtimeCallback,\n callback?: RealtimeCallback,\n ): this {\n if (\n event === \"postgres_changes\" &&\n typeof configOrCallback !== \"function\"\n ) {\n // New API: on('postgres_changes', config, callback)\n const config = configOrCallback as PostgresChangesConfig;\n this.subscriptionConfig = config;\n const actualCallback = callback!;\n\n // Store callback with event type\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);\n } else {\n // Old API: on('INSERT', 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.send({\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 * 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.send(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 send(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.send({ type: \"heartbeat\" });\n break;\n\n case \"broadcast\":\n if (message.payload) {\n this.handleBroadcast(message.payload);\n }\n break;\n\n case \"ack\":\n console.log(\"[Fluxbase Realtime] Subscription acknowledged\");\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 handleBroadcast(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.send({ 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\n * @param channelName - Channel name (e.g., 'table:public.products')\n */\n channel(channelName: string): RealtimeChannel {\n if (this.channels.has(channelName)) {\n return this.channels.get(channelName)!;\n }\n\n const channel = new RealtimeChannel(this.url, channelName, this.token);\n this.channels.set(channelName, channel);\n return channel;\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 */\n setToken(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 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 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 const 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 // 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 * 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 CreateCustomSettingRequest,\n UpdateCustomSettingRequest,\n ListCustomSettingsResponse,\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/**\n * Custom Settings Manager\n *\n * Manages custom admin-created settings with flexible key-value storage.\n * Unlike system settings, custom settings allow admins to create arbitrary configuration entries\n * with role-based editing permissions.\n *\n * @example\n * ```typescript\n * const custom = client.admin.settings.custom\n *\n * // Create a custom setting\n * const setting = await custom.create({\n * key: 'feature.dark_mode',\n * value: { enabled: true, theme: 'dark' },\n * value_type: 'json',\n * description: 'Dark mode configuration',\n * editable_by: ['dashboard_admin', 'admin']\n * })\n *\n * // List all custom settings\n * const { settings } = await custom.list()\n *\n * // Get specific setting\n * const darkMode = await custom.get('feature.dark_mode')\n *\n * // Update setting\n * await custom.update('feature.dark_mode', {\n * value: { enabled: false, theme: 'light' }\n * })\n *\n * // Delete setting\n * await custom.delete('feature.dark_mode')\n * ```\n */\nexport class CustomSettingsManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Create a new custom setting\n *\n * @param request - Custom setting creation request\n * @returns Promise resolving to CustomSetting\n *\n * @example\n * ```typescript\n * const setting = await client.admin.settings.custom.create({\n * key: 'api.quotas',\n * value: { free: 1000, pro: 10000, enterprise: 100000 },\n * value_type: 'json',\n * description: 'API request quotas by tier',\n * metadata: { category: 'billing' }\n * })\n * ```\n */\n async create(request: CreateCustomSettingRequest): Promise<CustomSetting> {\n return await this.fetch.post<CustomSetting>(\n \"/api/v1/admin/settings/custom\",\n request,\n );\n }\n\n /**\n * List all custom settings\n *\n * @returns Promise resolving to ListCustomSettingsResponse\n *\n * @example\n * ```typescript\n * const response = await client.admin.settings.custom.list()\n * console.log(response.settings)\n * ```\n */\n async list(): Promise<ListCustomSettingsResponse> {\n const settings = await this.fetch.get<CustomSetting[]>(\n \"/api/v1/admin/settings/custom\",\n );\n return { settings: Array.isArray(settings) ? settings : [] };\n }\n\n /**\n * Get a specific custom setting by key\n *\n * @param key - Setting key (e.g., 'feature.dark_mode')\n * @returns Promise resolving to CustomSetting\n *\n * @example\n * ```typescript\n * const setting = await client.admin.settings.custom.get('feature.dark_mode')\n * console.log(setting.value)\n * ```\n */\n async get(key: string): Promise<CustomSetting> {\n return await this.fetch.get<CustomSetting>(\n `/api/v1/admin/settings/custom/${key}`,\n );\n }\n\n /**\n * Update an existing custom setting\n *\n * @param key - Setting key\n * @param request - Update request with new values\n * @returns Promise resolving to CustomSetting\n *\n * @example\n * ```typescript\n * const updated = await client.admin.settings.custom.update('feature.dark_mode', {\n * value: { enabled: false },\n * description: 'Updated description'\n * })\n * ```\n */\n async update(\n key: string,\n request: UpdateCustomSettingRequest,\n ): Promise<CustomSetting> {\n return await this.fetch.put<CustomSetting>(\n `/api/v1/admin/settings/custom/${key}`,\n request,\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.custom.delete('feature.dark_mode')\n * ```\n */\n async delete(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, application-level, and custom 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\n * const appSettings = await settings.app.get()\n *\n * // Access custom settings\n * const customSettings = await settings.custom.list()\n * ```\n */\nexport class FluxbaseSettings {\n public system: SystemSettingsManager;\n public app: AppSettingsManager;\n public custom: CustomSettingsManager;\n\n constructor(fetch: FluxbaseFetch) {\n this.system = new SystemSettingsManager(fetch);\n this.app = new AppSettingsManager(fetch);\n this.custom = new CustomSettingsManager(fetch);\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} from \"./types\";\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<AdminSetupStatusResponse> {\n return await this.fetch.get<AdminSetupStatusResponse>(\n \"/api/v1/admin/setup/status\",\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<AdminAuthResponse> {\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 * 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<AdminAuthResponse> {\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 * 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<AdminRefreshResponse> {\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 * 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<void> {\n await this.fetch.post<{ message: string }>(\"/api/v1/admin/logout\", {});\n this.clearToken();\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<AdminMeResponse> {\n return await this.fetch.get<AdminMeResponse>(\"/api/v1/admin/me\");\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<ListUsersResponse> {\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 * 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<EnrichedUser> {\n const url = `/api/v1/admin/users/${userId}?type=${type}`;\n return await this.fetch.get<EnrichedUser>(url);\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<InviteUserResponse> {\n const url = `/api/v1/admin/users/invite?type=${type}`;\n return await this.fetch.post<InviteUserResponse>(url, request);\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<DeleteUserResponse> {\n const url = `/api/v1/admin/users/${userId}?type=${type}`;\n return await this.fetch.delete<DeleteUserResponse>(url);\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<EnrichedUser> {\n const url = `/api/v1/admin/users/${userId}/role?type=${type}`;\n return await this.fetch.patch<EnrichedUser>(url, { role });\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<ResetUserPasswordResponse> {\n const url = `/api/v1/admin/users/${userId}/reset-password?type=${type}`;\n return await this.fetch.post<ResetUserPasswordResponse>(url, {});\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 } 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 orderBys: OrderBy[] = []\n private limitValue?: number\n private offsetValue?: number\n private singleRow: boolean = false\n private groupByColumns?: string[]\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 async insert(data: Partial<T> | Array<Partial<T>>): Promise<PostgrestResponse<T>> {\n const body = Array.isArray(data) ? data : data\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(data) ? data.length : 1,\n status: 201,\n statusText: 'Created',\n }\n }\n\n /**\n * Upsert (insert or update) rows\n */\n async upsert(data: Partial<T> | Array<Partial<T>>): Promise<PostgrestResponse<T>> {\n const body = Array.isArray(data) ? data : data\n const response = await this.fetch.post<T>(`/api/v1/tables/${this.table}`, body, {\n headers: {\n Prefer: 'resolution=merge-duplicates',\n },\n })\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 async update(data: Partial<T>): Promise<PostgrestResponse<T>> {\n const queryString = this.buildQueryString()\n const path = `/api/v1/tables/${this.table}${queryString}`\n const response = await this.fetch.patch<T>(path, data)\n\n return {\n data: response,\n error: null,\n count: null,\n status: 200,\n statusText: 'OK',\n }\n }\n\n /**\n * Delete rows matching the filters\n */\n async delete(): Promise<PostgrestResponse<null>> {\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 }\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 * 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 */\n single(): this {\n this.singleRow = 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 * ]).execute()\n * ```\n *\n * @category Batch Operations\n */\n async insertMany(rows: Array<Partial<T>>): Promise<PostgrestResponse<T>> {\n return this.insert(rows)\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 * .execute()\n *\n * // Mark all pending orders as processing\n * const { data } = await client.from('orders')\n * .eq('status', 'pending')\n * .updateMany({ status: 'processing' })\n * .execute()\n * ```\n *\n * @category Batch Operations\n */\n async updateMany(data: Partial<T>): Promise<PostgrestResponse<T>> {\n return this.update(data)\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 * .execute()\n *\n * // Delete old logs\n * await client.from('logs')\n * .lt('created_at', '2024-01-01')\n * .deleteMany()\n * .execute()\n * ```\n *\n * @category Batch Operations\n */\n async deleteMany(): Promise<PostgrestResponse<null>> {\n return this.delete()\n }\n\n /**\n * Execute the query and return results\n */\n async execute(): Promise<PostgrestResponse<T>> {\n const queryString = this.buildQueryString()\n const path = `/api/v1/tables/${this.table}${queryString}`\n\n try {\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 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 * 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 // 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 { QueryBuilder } from \"./query-builder\";\nimport type { FluxbaseClientOptions } from \"./types\";\n\n/**\n * Main Fluxbase client class\n * @category Client\n */\nexport class FluxbaseClient {\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 /**\n * Create a new Fluxbase client instance\n * @param options - Client configuration options\n */\n constructor(options: FluxbaseClientOptions) {\n // Initialize HTTP client\n this.fetch = new FluxbaseFetch(options.url, {\n headers: options.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 options.url,\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 // 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.setToken(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.setToken(token);\n }\n\n /**\n * Create or get a realtime channel (Supabase-compatible alias)\n *\n * This is a convenience method that delegates to client.realtime.channel().\n * Both patterns work identically:\n * - client.channel('room-1') - Supabase-style\n * - client.realtime.channel('room-1') - Fluxbase-style\n *\n * @param name - Channel name\n * @returns RealtimeChannel instance\n *\n * @example\n * ```typescript\n * // Supabase-compatible usage\n * const channel = client.channel('room-1')\n * .on('postgres_changes', {\n * event: '*',\n * schema: 'public',\n * table: 'messages'\n * }, (payload) => {\n * console.log('Change:', payload)\n * })\n * .subscribe()\n * ```\n *\n * @category Realtime\n */\n channel(name: string) {\n return this.realtime.channel(name);\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\n *\n * This is the recommended way to initialize the Fluxbase SDK.\n *\n * @param options - Client configuration options\n * @returns A configured Fluxbase client instance\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 * persist: true\n * },\n * timeout: 30000,\n * debug: false\n * })\n * ```\n *\n * @category Client\n */\nexport function createClient(options: FluxbaseClientOptions): FluxbaseClient {\n return new FluxbaseClient(options);\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"],"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 { SupabaseResponse, VoidResponse } from '../types'\n\n/**\n * Wraps an async operation with try-catch, returning Supabase-compatible response\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<SupabaseResponse<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): SupabaseResponse<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 AuthSession,\n SignInCredentials,\n SignUpCredentials,\n User,\n TwoFactorSetupResponse,\n TwoFactorEnableResponse,\n TwoFactorStatusResponse,\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 SupabaseAuthResponse,\n UserResponse,\n SessionResponse,\n DataResponse,\n VoidResponse,\n SupabaseResponse,\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\n */\n getSession(): AuthSession | null {\n return this.session;\n }\n\n /**\n * Get the current user\n */\n getUser(): User | null {\n return this.session?.user ?? 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\n * @param callback - Function called when auth state changes\n * @returns Subscription object with unsubscribe method\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): AuthSubscription {\n this.stateChangeListeners.add(callback);\n\n return {\n unsubscribe: () => {\n this.stateChangeListeners.delete(callback);\n },\n };\n }\n\n /**\n * Sign in with email and password\n * Returns AuthSession if successful, or SignInWith2FAResponse if 2FA is required\n */\n async signIn(\n credentials: SignInCredentials,\n ): Promise<SupabaseResponse<AuthSession | 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.setSession(session);\n return session;\n });\n }\n\n /**\n * Sign in with email and password\n * Alias for signIn() to maintain compatibility with common authentication patterns\n * Returns AuthSession if successful, or SignInWith2FAResponse if 2FA is required\n */\n async signInWithPassword(\n credentials: SignInCredentials,\n ): Promise<SupabaseResponse<AuthSession | SignInWith2FAResponse>> {\n return this.signIn(credentials);\n }\n\n /**\n * Sign up with email and password\n */\n async signUp(credentials: SignUpCredentials): Promise<SupabaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/signup\",\n credentials,\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSession(session);\n return { user: session.user, session };\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 access token\n */\n async refreshToken(): Promise<SessionResponse> {\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.setSession(session, \"TOKEN_REFRESHED\");\n return { session };\n });\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 auth token manually\n */\n setToken(token: string) {\n this.fetch.setAuthToken(token);\n }\n\n /**\n * Setup 2FA for the current user\n * Returns TOTP secret and QR code URL\n */\n async setup2FA(): 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 );\n });\n }\n\n /**\n * Enable 2FA after verifying the TOTP code\n * Returns backup codes that should be saved by the user\n */\n async enable2FA(code: string): 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\n * Requires password confirmation\n */\n async disable2FA(\n password: string,\n ): Promise<DataResponse<{ success: boolean; message: string }>> {\n return wrapAsync(async () => {\n if (!this.session) {\n throw new Error(\"Not authenticated\");\n }\n\n return await this.fetch.post<{ success: boolean; message: string }>(\n \"/api/v1/auth/2fa/disable\",\n { password },\n );\n });\n }\n\n /**\n * Check 2FA status for the current user\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\n * Call this after signIn returns requires_2fa: true\n */\n async verify2FA(request: TwoFactorVerifyRequest): Promise<SupabaseAuthResponse> {\n return wrapAsync(async () => {\n const response = await this.fetch.post<AuthResponse>(\n \"/api/v1/auth/2fa/verify\",\n request,\n );\n\n const session: AuthSession = {\n ...response,\n expires_at: Date.now() + response.expires_in * 1000,\n };\n\n this.setSession(session, \"MFA_CHALLENGE_VERIFIED\");\n return { user: session.user, session };\n });\n }\n\n /**\n * Send password reset email\n * Sends a password reset link to the provided email address\n * @param email - Email address to send reset link to\n */\n async sendPasswordReset(email: string): Promise<DataResponse<PasswordResetResponse>> {\n return wrapAsync(async () => {\n return await this.fetch.post<PasswordResetResponse>(\n \"/api/v1/auth/password/reset\",\n { email },\n );\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 */\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(token: string): 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\n * Complete the password reset process with a valid token\n * @param token - Password reset token\n * @param newPassword - New password to set\n */\n async resetPassword(\n token: string,\n newPassword: string,\n ): Promise<DataResponse<ResetPasswordResponse>> {\n return wrapAsync(async () => {\n return await this.fetch.post<ResetPasswordResponse>(\n \"/api/v1/auth/password/reset/confirm\",\n {\n token,\n new_password: newPassword,\n },\n );\n });\n }\n\n /**\n * Send magic link for passwordless authentication\n * @param email - Email address to send magic link to\n * @param options - Optional configuration for magic link\n */\n async sendMagicLink(\n email: string,\n options?: MagicLinkOptions,\n ): Promise<DataResponse<MagicLinkResponse>> {\n return wrapAsync(async () => {\n return await this.fetch.post<MagicLinkResponse>(\"/api/v1/auth/magiclink\", {\n email,\n redirect_to: options?.redirect_to,\n });\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<SupabaseAuthResponse> {\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.setSession(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<SupabaseAuthResponse> {\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.setSession(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<SupabaseAuthResponse> {\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.setSession(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 * Internal: Set the session and persist it\n */\n private setSession(\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.refreshToken();\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} 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 subscriptionConfig: PostgresChangesConfig | null = null;\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 10;\n private reconnectDelay = 1000;\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n\n constructor(url: string, channelName: string, token: string | null = null) {\n this.url = url;\n this.channelName = channelName;\n this.token = token;\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 // Implementation\n on(\n event: \"postgres_changes\" | \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\",\n configOrCallback: PostgresChangesConfig | RealtimeCallback,\n callback?: RealtimeCallback,\n ): this {\n if (\n event === \"postgres_changes\" &&\n typeof configOrCallback !== \"function\"\n ) {\n // New API: on('postgres_changes', config, callback)\n const config = configOrCallback as PostgresChangesConfig;\n this.subscriptionConfig = config;\n const actualCallback = callback!;\n\n // Store callback with event type\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);\n } else {\n // Old API: on('INSERT', 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.send({\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 * 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.send(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 send(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.send({ type: \"heartbeat\" });\n break;\n\n case \"broadcast\":\n if (message.payload) {\n this.handleBroadcast(message.payload);\n }\n break;\n\n case \"ack\":\n console.log(\"[Fluxbase Realtime] Subscription acknowledged\");\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 handleBroadcast(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.send({ 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\n * @param channelName - Channel name (e.g., 'table:public.products')\n */\n channel(channelName: string): RealtimeChannel {\n if (this.channels.has(channelName)) {\n return this.channels.get(channelName)!;\n }\n\n const channel = new RealtimeChannel(this.url, channelName, this.token);\n this.channels.set(channelName, channel);\n return channel;\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 */\n setToken(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 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 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 const 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 // 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 * 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 CreateCustomSettingRequest,\n UpdateCustomSettingRequest,\n ListCustomSettingsResponse,\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/**\n * Custom Settings Manager\n *\n * Manages custom admin-created settings with flexible key-value storage.\n * Unlike system settings, custom settings allow admins to create arbitrary configuration entries\n * with role-based editing permissions.\n *\n * @example\n * ```typescript\n * const custom = client.admin.settings.custom\n *\n * // Create a custom setting\n * const setting = await custom.create({\n * key: 'feature.dark_mode',\n * value: { enabled: true, theme: 'dark' },\n * value_type: 'json',\n * description: 'Dark mode configuration',\n * editable_by: ['dashboard_admin', 'admin']\n * })\n *\n * // List all custom settings\n * const { settings } = await custom.list()\n *\n * // Get specific setting\n * const darkMode = await custom.get('feature.dark_mode')\n *\n * // Update setting\n * await custom.update('feature.dark_mode', {\n * value: { enabled: false, theme: 'light' }\n * })\n *\n * // Delete setting\n * await custom.delete('feature.dark_mode')\n * ```\n */\nexport class CustomSettingsManager {\n constructor(private fetch: FluxbaseFetch) {}\n\n /**\n * Create a new custom setting\n *\n * @param request - Custom setting creation request\n * @returns Promise resolving to CustomSetting\n *\n * @example\n * ```typescript\n * const setting = await client.admin.settings.custom.create({\n * key: 'api.quotas',\n * value: { free: 1000, pro: 10000, enterprise: 100000 },\n * value_type: 'json',\n * description: 'API request quotas by tier',\n * metadata: { category: 'billing' }\n * })\n * ```\n */\n async create(request: CreateCustomSettingRequest): Promise<CustomSetting> {\n return await this.fetch.post<CustomSetting>(\n \"/api/v1/admin/settings/custom\",\n request,\n );\n }\n\n /**\n * List all custom settings\n *\n * @returns Promise resolving to ListCustomSettingsResponse\n *\n * @example\n * ```typescript\n * const response = await client.admin.settings.custom.list()\n * console.log(response.settings)\n * ```\n */\n async list(): Promise<ListCustomSettingsResponse> {\n const settings = await this.fetch.get<CustomSetting[]>(\n \"/api/v1/admin/settings/custom\",\n );\n return { settings: Array.isArray(settings) ? settings : [] };\n }\n\n /**\n * Get a specific custom setting by key\n *\n * @param key - Setting key (e.g., 'feature.dark_mode')\n * @returns Promise resolving to CustomSetting\n *\n * @example\n * ```typescript\n * const setting = await client.admin.settings.custom.get('feature.dark_mode')\n * console.log(setting.value)\n * ```\n */\n async get(key: string): Promise<CustomSetting> {\n return await this.fetch.get<CustomSetting>(\n `/api/v1/admin/settings/custom/${key}`,\n );\n }\n\n /**\n * Update an existing custom setting\n *\n * @param key - Setting key\n * @param request - Update request with new values\n * @returns Promise resolving to CustomSetting\n *\n * @example\n * ```typescript\n * const updated = await client.admin.settings.custom.update('feature.dark_mode', {\n * value: { enabled: false },\n * description: 'Updated description'\n * })\n * ```\n */\n async update(\n key: string,\n request: UpdateCustomSettingRequest,\n ): Promise<CustomSetting> {\n return await this.fetch.put<CustomSetting>(\n `/api/v1/admin/settings/custom/${key}`,\n request,\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.custom.delete('feature.dark_mode')\n * ```\n */\n async delete(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, application-level, and custom 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\n * const appSettings = await settings.app.get()\n *\n * // Access custom settings\n * const customSettings = await settings.custom.list()\n * ```\n */\nexport class FluxbaseSettings {\n public system: SystemSettingsManager;\n public app: AppSettingsManager;\n public custom: CustomSettingsManager;\n\n constructor(fetch: FluxbaseFetch) {\n this.system = new SystemSettingsManager(fetch);\n this.app = new AppSettingsManager(fetch);\n this.custom = new CustomSettingsManager(fetch);\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 } 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 orderBys: OrderBy[] = []\n private limitValue?: number\n private offsetValue?: number\n private singleRow: boolean = false\n private groupByColumns?: string[]\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 async insert(data: Partial<T> | Array<Partial<T>>): Promise<PostgrestResponse<T>> {\n const body = Array.isArray(data) ? data : data\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(data) ? data.length : 1,\n status: 201,\n statusText: 'Created',\n }\n }\n\n /**\n * Upsert (insert or update) rows\n */\n async upsert(data: Partial<T> | Array<Partial<T>>): Promise<PostgrestResponse<T>> {\n const body = Array.isArray(data) ? data : data\n const response = await this.fetch.post<T>(`/api/v1/tables/${this.table}`, body, {\n headers: {\n Prefer: 'resolution=merge-duplicates',\n },\n })\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 async update(data: Partial<T>): Promise<PostgrestResponse<T>> {\n const queryString = this.buildQueryString()\n const path = `/api/v1/tables/${this.table}${queryString}`\n const response = await this.fetch.patch<T>(path, data)\n\n return {\n data: response,\n error: null,\n count: null,\n status: 200,\n statusText: 'OK',\n }\n }\n\n /**\n * Delete rows matching the filters\n */\n async delete(): Promise<PostgrestResponse<null>> {\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 }\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 * 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 */\n single(): this {\n this.singleRow = 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 * ]).execute()\n * ```\n *\n * @category Batch Operations\n */\n async insertMany(rows: Array<Partial<T>>): Promise<PostgrestResponse<T>> {\n return this.insert(rows)\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 * .execute()\n *\n * // Mark all pending orders as processing\n * const { data } = await client.from('orders')\n * .eq('status', 'pending')\n * .updateMany({ status: 'processing' })\n * .execute()\n * ```\n *\n * @category Batch Operations\n */\n async updateMany(data: Partial<T>): Promise<PostgrestResponse<T>> {\n return this.update(data)\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 * .execute()\n *\n * // Delete old logs\n * await client.from('logs')\n * .lt('created_at', '2024-01-01')\n * .deleteMany()\n * .execute()\n * ```\n *\n * @category Batch Operations\n */\n async deleteMany(): Promise<PostgrestResponse<null>> {\n return this.delete()\n }\n\n /**\n * Execute the query and return results\n */\n async execute(): Promise<PostgrestResponse<T>> {\n const queryString = this.buildQueryString()\n const path = `/api/v1/tables/${this.table}${queryString}`\n\n try {\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 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 * 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 // 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 { 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 /**\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 // 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.setToken(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.setToken(token);\n }\n\n /**\n * Create or get a realtime channel (Supabase-compatible alias)\n *\n * This is a convenience method that delegates to client.realtime.channel().\n * Both patterns work identically:\n * - client.channel('room-1') - Supabase-style\n * - client.realtime.channel('room-1') - Fluxbase-style\n *\n * @param name - Channel name\n * @returns RealtimeChannel instance\n *\n * @example\n * ```typescript\n * // Supabase-compatible usage\n * const channel = client.channel('room-1')\n * .on('postgres_changes', {\n * event: '*',\n * schema: 'public',\n * table: 'messages'\n * }, (payload) => {\n * console.log('Change:', payload)\n * })\n * .subscribe()\n * ```\n *\n * @category Realtime\n */\n channel(name: string) {\n return this.realtime.channel(name);\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"]}