@giaeulate/baas-sdk 1.1.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/LICENSE +21 -0
- package/README.md +54 -0
- package/dist/cli.js +416 -0
- package/dist/index.cjs +1985 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1037 -0
- package/dist/index.d.ts +1037 -0
- package/dist/index.js +1956 -0
- package/dist/index.js.map +1 -0
- package/package.json +62 -37
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/http-client.ts","../src/query-builder.ts","../src/modules/auth.ts","../src/modules/users.ts","../src/modules/database.ts","../src/modules/storage.ts","../src/modules/backups.ts","../src/modules/migrations.ts","../src/modules/functions.ts","../src/modules/jobs.ts","../src/modules/env-vars.ts","../src/modules/email.ts","../src/modules/search.ts","../src/modules/graphql.ts","../src/modules/metrics.ts","../src/modules/audit.ts","../src/modules/webhooks.ts","../src/modules/log-drains.ts","../src/modules/branches.ts","../src/realtime.ts","../src/modules/realtime.ts","../src/modules/api-keys.ts","../src/modules/environments.ts","../src/modules/cors-origins.ts","../src/modules/policies.ts","../src/modules/ip-whitelist.ts","../src/modules/cache.ts","../src/client.ts"],"sourcesContent":["/**\n * Core HTTP Client\n * Base class providing HTTP request infrastructure for all SDK modules\n */\n\nimport type { RequestOptions } from './types';\n\n/** Privilege class of the API key. anon = RLS applies (safe for browsers);\n * service_role = RLS bypass / admin (server-side only). Both share the\n * `baas_sk_` prefix, so the type cannot be inferred — it must be declared. */\nexport type KeyType = 'anon' | 'service_role';\n\nexport interface ClientOptions {\n /** Defaults to 'service_role' for backward-compat. Set 'anon' in any client\n * bundle (browser / mobile app) — see warnIfUnsafeKey. */\n keyType?: KeyType;\n}\n\nexport class HttpClient {\n public url: string;\n public apiKey: string = '';\n public keyType: KeyType;\n public token: string | null = null;\n private environment: string = 'prod';\n private _onForceLogout: (() => void) | null = null;\n\n constructor(url?: string, apiKey?: string, options?: ClientOptions) {\n let baseUrl = url || (typeof window !== 'undefined' ? window.location.origin : 'http://localhost:8080');\n this.url = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n\n if (apiKey) this.apiKey = apiKey;\n this.keyType = options?.keyType ?? 'service_role';\n this.warnIfUnsafeKey();\n\n this.token = typeof localStorage !== 'undefined' ? this.cleanValue(localStorage.getItem('baas_token')) : null;\n }\n\n /** SECURITY: a service_role key bypasses RLS and grants admin over every\n * tenant. If it ends up in a browser bundle, anyone can extract it. Warn\n * loudly when a non-anon key is constructed in a browser context. */\n private warnIfUnsafeKey() {\n const inBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\n if (inBrowser && this.apiKey && this.keyType !== 'anon') {\n // eslint-disable-next-line no-console\n console.warn(\n '[baas-sdk] SECURITY WARNING: a non-anon (service_role) key is running in a browser. ' +\n 'It bypasses Row-Level Security and grants admin over ALL tenants, and is extractable from the bundle. ' +\n 'Mint an anon key in the dashboard and construct the client with { keyType: \"anon\" }.'\n );\n }\n }\n\n /**\n * Set the auth token manually (e.g. restoring from SecureStore in React Native).\n * Persists to both the in-memory property and localStorage so getDynamicToken() works.\n */\n setToken(token: string | null) {\n this.token = token;\n if (token) {\n localStorage.setItem('baas_token', token);\n } else {\n localStorage.removeItem('baas_token');\n }\n }\n\n /**\n * Register a callback invoked on forced logout (401).\n * Use this in React Native instead of the default window.location redirect.\n */\n onForceLogout(callback: () => void) {\n this._onForceLogout = callback;\n }\n\n protected cleanValue(val: string | null): string | null {\n if (!val || val === 'null' || val === 'undefined') return null;\n return val.trim();\n }\n\n /**\n * Public header generator for adapters\n */\n public getHeaders(contentType: string = 'application/json') {\n const dynamicToken = this.getDynamicToken();\n\n const headers: Record<string, string> = {\n 'apikey': this.apiKey,\n };\n\n if (contentType) {\n headers['Content-Type'] = contentType;\n }\n\n if (dynamicToken) {\n headers['Authorization'] = `Bearer ${dynamicToken}`;\n }\n\n if (this.environment && this.environment !== 'prod') {\n headers['X-Environment'] = this.environment;\n }\n\n // CSRF token from cookie (double-submit pattern)\n const csrfToken = this.getCSRFToken();\n if (csrfToken) {\n headers['X-CSRF-Token'] = csrfToken;\n }\n\n return headers;\n }\n\n public getDynamicToken() {\n return this.cleanValue(this.token || localStorage.getItem('baas_token'));\n }\n\n /**\n * Core HTTP request method - DRY principle\n */\n protected async request<T = any>(endpoint: string, options: RequestOptions = {}): Promise<T> {\n const { method = 'GET', body, headers: customHeaders, skipAuth = false } = options;\n\n const headers = { ...this.getHeaders(), ...customHeaders };\n\n const fetchOptions: RequestInit = {\n method,\n headers,\n credentials: 'include',\n };\n\n if (body !== undefined) {\n fetchOptions.body = JSON.stringify(body);\n }\n\n const res = await fetch(`${this.url}${endpoint}`, fetchOptions);\n\n if (res.status === 204) {\n return { success: true } as T;\n }\n\n const data = await res.json().catch(() => null);\n\n if (!res.ok) {\n if (res.status === 401 && !skipAuth) {\n this.forceLogout();\n }\n if (res.status === 403 && data?.error === 'ip_not_allowed') {\n this.handleIPBlocked(data.ip);\n }\n // Surface the HTTP status so callers can distinguish 403/404/409/429/500,\n // and flag rate limiting with a parsed retry hint from the headers.\n const rateLimited = res.status === 429;\n const retryHint = res.headers.get('retry-after') || res.headers.get('x-ratelimit-reset');\n return {\n error: data?.error || `Request failed: ${res.status}`,\n status: res.status,\n ...(rateLimited ? { rateLimited: true, retryAfter: retryHint ? parseInt(retryHint, 10) : undefined } : {}),\n ...data,\n } as T;\n }\n\n return data;\n }\n\n protected get<T = any>(endpoint: string): Promise<T> {\n return this.request<T>(endpoint);\n }\n\n protected post<T = any>(endpoint: string, body?: unknown): Promise<T> {\n return this.request<T>(endpoint, { method: 'POST', body });\n }\n\n protected put<T = any>(endpoint: string, body?: unknown): Promise<T> {\n return this.request<T>(endpoint, { method: 'PUT', body });\n }\n\n protected patch<T = any>(endpoint: string, body?: unknown): Promise<T> {\n return this.request<T>(endpoint, { method: 'PATCH', body });\n }\n\n protected delete<T = any>(endpoint: string): Promise<T> {\n return this.request<T>(endpoint, { method: 'DELETE' });\n }\n\n private getCSRFToken(): string | null {\n if (typeof document === 'undefined') return null;\n const match = document.cookie.match(/(?:^|;\\s*)csrf_token=([^;]*)/);\n return match ? decodeURIComponent(match[1]) : null;\n }\n\n setEnvironment(env: string) {\n this.environment = env;\n }\n\n getEnvironment(): string {\n return this.environment;\n }\n\n logout() {\n this.token = null;\n localStorage.removeItem('baas_token');\n // Auth cookie is HttpOnly, cleared server-side via POST /api/logout\n }\n\n forceLogout() {\n this.logout();\n if (this._onForceLogout) {\n this._onForceLogout();\n return;\n }\n if (typeof window !== 'undefined' && window.location && window.location.search !== undefined) {\n if (!window.location.search.includes('expired')) {\n window.location.href = '/authentication/login?reason=expired';\n }\n }\n }\n\n handleIPBlocked(ip?: string) {\n if (typeof window !== 'undefined') {\n const params = ip ? `?ip=${encodeURIComponent(ip)}` : '';\n if (!window.location.pathname.includes('/blocked')) {\n window.location.href = `/blocked${params}`;\n }\n }\n }\n}\n","/**\n * QueryBuilder - Fluent API for data queries\n */\n\nimport type { HttpClient } from './http-client';\nimport type { QueryFilter } from './types';\n\nexport class QueryBuilder {\n private table: string;\n private url: string;\n private client: HttpClient;\n private queryParams: URLSearchParams = new URLSearchParams();\n // @ts-ignore - used for future filter improvements\n private filters: QueryFilter[] = [];\n\n constructor(table: string, url: string, client: HttpClient) {\n this.table = table;\n this.url = url;\n this.client = client;\n }\n\n select(columns: string = '*') {\n this.queryParams.set('select', columns);\n return this;\n }\n\n eq(column: string, value: any) {\n this.queryParams.set(column, `eq.${value}`);\n return this;\n }\n\n neq(column: string, value: any) {\n this.queryParams.set(column, `neq.${value}`);\n return this;\n }\n\n gt(column: string, value: any) {\n this.queryParams.set(column, `gt.${value}`);\n return this;\n }\n\n gte(column: string, value: any) {\n this.queryParams.set(column, `gte.${value}`);\n return this;\n }\n\n lt(column: string, value: any) {\n this.queryParams.set(column, `lt.${value}`);\n return this;\n }\n\n lte(column: string, value: any) {\n this.queryParams.set(column, `lte.${value}`);\n return this;\n }\n\n like(column: string, value: any) {\n this.queryParams.set(column, `like.${value}`);\n return this;\n }\n\n ilike(column: string, value: any) {\n this.queryParams.set(column, `ilike.${value}`);\n return this;\n }\n\n is(column: string, value: any) {\n this.queryParams.set(column, `is.${value}`);\n return this;\n }\n\n in(column: string, values: any[]) {\n this.queryParams.set(column, `in.(${values.join(',')})`);\n return this;\n }\n\n not(column: string, operator: string, value: any) {\n this.queryParams.set(column, `not.${operator}.${value}`);\n return this;\n }\n\n /** Array/jsonb/range contains (@>). Arrays become a `{a,b}` literal. */\n contains(column: string, values: any) {\n this.queryParams.set(column, `cs.${this.arrayLiteral(values)}`);\n return this;\n }\n\n /** Array/jsonb/range contained-by (<@). */\n containedBy(column: string, values: any) {\n this.queryParams.set(column, `cd.${this.arrayLiteral(values)}`);\n return this;\n }\n\n /** Array/range overlap (&&). */\n overlaps(column: string, values: any) {\n this.queryParams.set(column, `ov.${this.arrayLiteral(values)}`);\n return this;\n }\n\n /** Full-text search (@@). type: fts|plfts|phfts|wfts (tsquery flavour). */\n textSearch(column: string, query: string, type: 'fts' | 'plfts' | 'phfts' | 'wfts' = 'fts') {\n this.queryParams.set(column, `${type}.${query}`);\n return this;\n }\n\n private arrayLiteral(values: any): string {\n return Array.isArray(values) ? `{${values.join(',')}}` : `${values}`;\n }\n\n /** OR group: `or=(c1,c2)`. Members are dotted `col.op.value` strings. */\n or(filters: string) {\n this.queryParams.set('or', `(${filters})`);\n return this;\n }\n\n /** AND group: `and=(c1,c2)` — e.g. a range `qty.gt.5,qty.lt.20`. */\n and(filters: string) {\n this.queryParams.set('and', `(${filters})`);\n return this;\n }\n\n /** Negated AND group: `not.and=(...)`. */\n notAnd(filters: string) {\n this.queryParams.set('not.and', `(${filters})`);\n return this;\n }\n\n /** Negated OR group: `not.or=(...)`. */\n notOr(filters: string) {\n this.queryParams.set('not.or', `(${filters})`);\n return this;\n }\n\n order(column: string, { ascending = true } = {}) {\n this.queryParams.set('order', `${column}.${ascending ? 'asc' : 'desc'}`);\n return this;\n }\n\n limit(count: number) {\n this.queryParams.set('limit', count.toString());\n return this;\n }\n\n offset(count: number) {\n this.queryParams.set('offset', count.toString());\n return this;\n }\n\n async get() {\n const res = await fetch(`${this.url}/api/v1/data/${this.table}?${this.queryParams.toString()}`, {\n headers: { ...this.getHeaders(), 'Cache-Control': 'no-cache' },\n cache: 'no-store' as RequestCache,\n });\n return await this.handleResponse(res);\n }\n\n async insert(data: any) {\n const res = await fetch(`${this.url}/api/v1/data/${this.table}`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify(data),\n });\n return await this.handleResponse(res);\n }\n\n async update(id: string | number, data: any) {\n const res = await fetch(`${this.url}/api/v1/data/${this.table}/${id}`, {\n method: 'PATCH',\n headers: this.getHeaders(),\n body: JSON.stringify(data),\n });\n return await this.handleResponse(res);\n }\n\n async delete(id: string | number) {\n const res = await fetch(`${this.url}/api/v1/data/${this.table}/${id}`, {\n method: 'DELETE',\n headers: this.getHeaders(),\n });\n if (res.status === 204) return { success: true };\n return await this.handleResponse(res);\n }\n\n /** Insert-or-update on conflict. [onConflict] is the conflict-target column(s). */\n async upsert(data: any, onConflict: string) {\n const res = await fetch(`${this.url}/api/v1/data/${this.table}/upsert`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({ ...data, on_conflict: onConflict }),\n });\n return await this.handleResponse(res);\n }\n\n /**\n * Count rows matching the current filters (PostgREST parity). Sends\n * `Prefer: count=exact` and parses the total from the `Content-Range`\n * response header. Returns `{ count, error, status }`.\n */\n async count(): Promise<{ count: number; error: string | null; status: number }> {\n const res = await fetch(`${this.url}/api/v1/data/${this.table}?${this.queryParams.toString()}`, {\n headers: { ...this.getHeaders(), Prefer: 'count=exact', 'Cache-Control': 'no-cache' },\n cache: 'no-store' as RequestCache,\n });\n if (!res.ok) {\n if (res.status === 401) this.client.forceLogout();\n const body = await res.json().catch(() => null);\n return { count: 0, error: body?.error || 'Request failed', status: res.status };\n }\n const cr = res.headers.get('content-range'); // \"0-24/137\" or \"*/137\"\n const total = cr && cr.includes('/') ? parseInt(cr.split('/').pop() || '', 10) : NaN;\n return { count: Number.isNaN(total) ? 0 : total, error: null, status: res.status };\n }\n\n private getHeaders() {\n return this.client.getHeaders();\n }\n\n private async handleResponse(res: Response) {\n const text = await res.text();\n let data = null;\n try {\n data = text ? JSON.parse(text) : null;\n } catch {\n // Silently fail parsing\n }\n \n if (!res.ok) {\n if (res.status === 401) {\n this.client.forceLogout();\n }\n return { data: null, error: data?.error || 'Request failed', status: res.status };\n }\n return { data, error: null, status: res.status };\n }\n}\n","/**\n * Auth Module - Authentication operations\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface MFASetupResponse {\n secret: string;\n qr_code_url: string;\n recovery_codes: string[];\n}\n\nexport interface AuthModule {\n login(email: string, password: string): Promise<any>;\n logout(): Promise<void>;\n verifyMFA(mfaToken: string, code: string): Promise<any>;\n verifyMFAWithRecoveryCode(mfaToken: string, recoveryCode: string): Promise<any>;\n setupMFA(): Promise<MFASetupResponse>;\n enableMFA(secret: string, code: string, recoveryCodes?: string[]): Promise<any>;\n disableMFA(code: string): Promise<any>;\n getProfile(): Promise<any>;\n register(email: string, password: string): Promise<any>;\n forgotPassword(email: string): Promise<any>;\n resetPassword(token: string, newPassword: string): Promise<any>;\n validateResetToken(token: string): Promise<any>;\n verifyEmail(token: string): Promise<any>;\n requestEmailVerification(): Promise<any>;\n // Anonymous + passwordless (Supabase parity)\n signInAnonymous(): Promise<any>;\n requestOtp(email: string, createUser?: boolean): Promise<any>;\n verifyOtp(type: 'email_otp' | 'magic_link', email: string, token: string): Promise<any>;\n upgradeAnonymous(email: string, password: string): Promise<any>;\n // OAuth Configuration\n getAuthProviders(): Promise<any>;\n getAuthProvider(provider: string): Promise<any>;\n configureAuthProvider(provider: string, clientID: string, clientSecret: string, enabled: boolean): Promise<any>;\n}\n\nexport function createAuthModule(client: HttpClient): AuthModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n const post = (endpoint: string, body?: unknown) => (client as any).post(endpoint, body);\n\n return {\n async login(email: string, password: string) {\n const res = await fetch(`${client.url}/api/login`, {\n method: 'POST',\n headers: client.getHeaders(),\n body: JSON.stringify({ email, password }),\n });\n\n const contentType = res.headers.get('content-type');\n if (!contentType?.includes('application/json')) {\n throw new Error(`Login failed: Server returned ${res.status}. Please check your connection.`);\n }\n\n const data = await res.json().catch(() => {\n throw new Error(`Login failed: Invalid JSON response (status ${res.status})`);\n });\n\n if (!res.ok) {\n throw new Error(data?.error || `Login failed: ${res.status}`);\n }\n\n if (data.token) {\n client.token = data.token;\n localStorage.setItem('baas_token', data.token);\n }\n return data;\n },\n\n async logout() {\n try {\n await post('/api/logout');\n } finally {\n client.token = null;\n localStorage.removeItem('baas_token');\n }\n },\n\n // Anonymous sign-in (Supabase parity). Response carries access_token (+ a\n // back-compat `token`); store whichever is present.\n async signInAnonymous() {\n const data = await post('/api/auth/anonymous');\n const tok = data?.access_token || data?.token;\n if (tok) { client.token = tok; localStorage.setItem('baas_token', tok); }\n return data;\n },\n\n // Passwordless: request a magic link + 6-digit email OTP. Always resolves on\n // a well-formed request (no account enumeration).\n async requestOtp(email: string, createUser: boolean = true) {\n return post('/api/auth/otp', { email, create_user: createUser });\n },\n\n // Verify a passwordless OTP/magic-link and complete sign-in.\n async verifyOtp(type: 'email_otp' | 'magic_link', email: string, token: string) {\n const data = await post('/api/auth/verify', { type, email, token });\n const tok = data?.access_token || data?.token;\n if (tok) { client.token = tok; localStorage.setItem('baas_token', tok); }\n return data;\n },\n\n // Upgrade the current anonymous guest to a real account (preserves user id).\n // Requires the anonymous Bearer to be set (call after signInAnonymous).\n async upgradeAnonymous(email: string, password: string) {\n const data = await post('/api/auth/upgrade', { email, password });\n const tok = data?.access_token || data?.token;\n if (tok) { client.token = tok; localStorage.setItem('baas_token', tok); }\n return data;\n },\n\n async verifyMFA(mfaToken: string, code: string) {\n const data = await post('/api/mfa/finalize', { mfa_token: mfaToken, code });\n if (data.token) {\n client.token = data.token;\n localStorage.setItem('baas_token', data.token);\n }\n return data;\n },\n\n async verifyMFAWithRecoveryCode(mfaToken: string, recoveryCode: string) {\n const data = await post('/api/mfa/finalize', { mfa_token: mfaToken, recovery_code: recoveryCode });\n if (data.token) {\n client.token = data.token;\n localStorage.setItem('baas_token', data.token);\n }\n return data;\n },\n\n async setupMFA(): Promise<MFASetupResponse> {\n return post('/api/mfa/setup');\n },\n\n async enableMFA(secret: string, code: string, recoveryCodes?: string[]) {\n const body: any = { secret, code };\n if (recoveryCodes) {\n body.recovery_codes = recoveryCodes;\n }\n return post('/api/mfa/enable', body);\n },\n\n async disableMFA(code: string) {\n return post('/api/mfa/disable', { code });\n },\n\n async getProfile() {\n return get('/api/profile');\n },\n\n async register(email: string, password: string) {\n const data = await post('/api/register', { email, password });\n if (data.error) {\n throw new Error(data.error);\n }\n return data;\n },\n\n async forgotPassword(email: string) {\n return post('/api/auth/forgot-password', { email });\n },\n\n async resetPassword(token: string, newPassword: string) {\n return post('/api/auth/reset-password', { token, new_password: newPassword });\n },\n\n async validateResetToken(token: string) {\n return get(`/api/auth/validate-reset-token?token=${token}`);\n },\n\n async verifyEmail(token: string) {\n return post('/api/auth/verify-email', { token });\n },\n\n async requestEmailVerification() {\n return post('/api/auth/request-verification');\n },\n\n async getAuthProviders() {\n return get('/api/auth/providers');\n },\n\n async getAuthProvider(provider: string) {\n return get(`/api/auth/providers/${provider}`);\n },\n\n async configureAuthProvider(provider: string, clientID: string, clientSecret: string, enabled: boolean) {\n return post('/api/auth/providers', {\n provider,\n client_id: clientID,\n client_secret: clientSecret,\n enabled,\n });\n },\n };\n}\n","/**\n * Users Module - User management operations\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface UsersModule {\n list(limit?: number, offset?: number): Promise<any>;\n update(id: string, updates: { email?: string; role?: string; email_verified?: boolean }): Promise<any>;\n delete(id: string): Promise<any>;\n}\n\nexport function createUsersModule(client: HttpClient): UsersModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n const put = (endpoint: string, body?: unknown) => (client as any).put(endpoint, body);\n const del = (endpoint: string) => (client as any).delete(endpoint);\n\n return {\n async list(limit = 20, offset = 0) {\n return get(`/api/users?limit=${limit}&offset=${offset}`);\n },\n\n async update(id: string, updates: { email?: string; role?: string; email_verified?: boolean }) {\n return put(`/api/users/${id}`, updates);\n },\n\n async delete(id: string) {\n return del(`/api/users/${id}`);\n },\n };\n}\n","/**\n * Database Module - Schema, table, and column operations\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface DatabaseModule {\n // Schemas\n getSchemas(options?: { search?: string; limit?: number; offset?: number }): Promise<any>;\n getSchema(name: string): Promise<any>;\n saveSchemas(data: { table_name: string; definition: any }): Promise<any>;\n \n // Tables\n createTable(tableName: string, definition: Record<string, string | { type: string; nullable?: boolean; unique?: boolean; default?: string }>): Promise<any>;\n dropTable(tableName: string): Promise<any>;\n renameTable(tableName: string, newName: string): Promise<any>;\n \n // Columns\n addColumn(tableName: string, column: { name: string; type: string; nullable?: boolean; default_value?: string }): Promise<any>;\n dropColumn(tableName: string, columnName: string): Promise<any>;\n modifyColumn(tableName: string, columnName: string, changes: { type: string; nullable?: boolean }): Promise<any>;\n renameColumn(tableName: string, columnName: string, newName: string): Promise<any>;\n setColumnDefault(tableName: string, columnName: string, defaultValue: string | null): Promise<any>;\n \n // Foreign Keys\n addForeignKey(tableName: string, fk: { column: string; ref_table: string; ref_column: string; on_delete?: string; on_update?: string }): Promise<any>;\n listForeignKeys(tableName: string): Promise<any>;\n dropForeignKey(tableName: string, constraintName: string): Promise<any>;\n \n // Constraints\n addUniqueConstraint(tableName: string, columnName: string): Promise<any>;\n dropConstraint(tableName: string, constraintName: string): Promise<any>;\n \n // Data operations\n raw(query: string): Promise<any>;\n queryData(tableName: string, options: { page?: number; limit?: number; filters?: any[] }): Promise<any>;\n downloadExport(tableName: string, format: 'sql' | 'csv' | 'backup', filters?: any[]): Promise<any>;\n}\n\nexport function createDatabaseModule(client: HttpClient): DatabaseModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n const post = (endpoint: string, body?: unknown) => (client as any).post(endpoint, body);\n const patch = (endpoint: string, body?: unknown) => (client as any).patch(endpoint, body);\n const del = (endpoint: string) => (client as any).delete(endpoint);\n\n return {\n // Schemas\n async getSchemas(options?: { search?: string; limit?: number; offset?: number }) {\n const params = new URLSearchParams();\n if (options?.search) params.append('search', options.search);\n if (options?.limit) params.append('limit', options.limit.toString());\n if (options?.offset) params.append('offset', options.offset.toString());\n const query = params.toString();\n return get(`/api/schemas${query ? `?${query}` : ''}`);\n },\n\n async getSchema(name: string) {\n return get(`/api/schemas/${name}`);\n },\n\n async saveSchemas(data: { table_name: string; definition: any }) {\n return post('/api/schemas', data);\n },\n\n // Tables\n async createTable(tableName: string, definition: Record<string, string | { type: string; nullable?: boolean; unique?: boolean; default?: string }>) {\n return post('/api/schemas/tables', { table_name: tableName, definition });\n },\n\n async dropTable(tableName: string) {\n return del(`/api/schemas/tables/${tableName}`);\n },\n\n async renameTable(tableName: string, newName: string) {\n return post(`/api/schemas/tables/${tableName}/rename`, { new_name: newName });\n },\n\n // Columns\n async addColumn(tableName: string, column: { name: string; type: string; nullable?: boolean; default_value?: string }) {\n return post(`/api/schemas/tables/${tableName}/columns`, column);\n },\n\n async dropColumn(tableName: string, columnName: string) {\n return del(`/api/schemas/tables/${tableName}/columns/${columnName}`);\n },\n\n async modifyColumn(tableName: string, columnName: string, changes: { type: string; nullable?: boolean }) {\n return patch(`/api/schemas/tables/${tableName}/columns/${columnName}`, changes);\n },\n\n async renameColumn(tableName: string, columnName: string, newName: string) {\n return post(`/api/schemas/tables/${tableName}/columns/${columnName}/rename`, { new_name: newName });\n },\n\n async setColumnDefault(tableName: string, columnName: string, defaultValue: string | null) {\n return patch(`/api/schemas/tables/${tableName}/columns/${columnName}/default`, { default_value: defaultValue });\n },\n\n // Foreign Keys\n async addForeignKey(tableName: string, fk: { column: string; ref_table: string; ref_column: string; on_delete?: string; on_update?: string }) {\n return post(`/api/schemas/tables/${tableName}/foreign-keys`, fk);\n },\n\n async listForeignKeys(tableName: string) {\n return get(`/api/schemas/tables/${tableName}/foreign-keys`);\n },\n\n async dropForeignKey(tableName: string, constraintName: string) {\n return del(`/api/schemas/tables/${tableName}/foreign-keys/${constraintName}`);\n },\n\n // Constraints\n async addUniqueConstraint(tableName: string, columnName: string) {\n return post(`/api/schemas/tables/${tableName}/constraints/unique`, { column: columnName });\n },\n\n async dropConstraint(tableName: string, constraintName: string) {\n return del(`/api/schemas/tables/${tableName}/constraints/${constraintName}`);\n },\n\n // Data operations\n async raw(query: string) {\n return post('/api/v1/sql', { query });\n },\n\n async queryData(tableName: string, options: { page?: number; limit?: number; filters?: any[] }) {\n const params = new URLSearchParams();\n if (options.page) params.append('page', options.page.toString());\n if (options.limit) params.append('limit', options.limit.toString());\n if (options.filters && options.filters.length > 0) {\n params.append('filters', JSON.stringify(options.filters));\n }\n return get(`/api/v1/data/${tableName}/query?${params.toString()}`);\n },\n\n async downloadExport(tableName: string, format: 'sql' | 'csv' | 'backup', filters?: any[]) {\n const params = new URLSearchParams();\n if (filters && filters.length > 0) {\n params.append('filters', JSON.stringify(filters));\n }\n\n const res = await fetch(`${client.url}/api/v1/export/${tableName}/${format}?${params.toString()}`, {\n headers: client.getHeaders()\n });\n \n if (!res.ok) {\n const data = await res.json();\n return { error: data.error || `Export failed: ${res.status}` };\n }\n\n const blob = await res.blob();\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${tableName}_${new Date().toISOString().split('T')[0]}.${format === 'backup' ? 'dump' : format}`;\n document.body.appendChild(a);\n a.click();\n window.URL.revokeObjectURL(url);\n document.body.removeChild(a);\n return { success: true };\n },\n };\n}\n","/**\n * Storage Module - File & bucket operations (MinIO-backed)\n *\n * Files: upload, list, get (metadata + presigned URL), delete\n * Buckets: create, list, get, delete, listFiles\n */\n\nimport type { HttpClient } from '../http-client';\n\n// ── Response types ──────────────────────────────────────────────\n\nexport interface StorageFile {\n id: string;\n bucket_id: string;\n name: string;\n mime_type: string;\n size: number;\n created_at: string;\n}\n\nexport interface StorageFileWithUrl {\n metadata: StorageFile;\n url: string;\n}\n\nexport interface StorageBucket {\n id: string;\n name: string;\n is_public: boolean;\n created_at: string;\n}\n\n// ── Module interface ────────────────────────────────────────────\n\nexport interface StorageModule {\n /** Upload a file. Optionally target a specific bucket by ID. */\n upload(file: File, bucketId?: string): Promise<StorageFile>;\n\n /** List all files across buckets. */\n listFiles(): Promise<StorageFile[]>;\n\n /** Get file metadata + a presigned download URL. expiresIn (seconds) controls\n * the URL lifetime (default 15m, server cap 7d). */\n getFile(fileId: string, expiresIn?: number): Promise<StorageFileWithUrl>;\n\n /** Create a time-limited signed download URL (Supabase createSignedUrl parity). */\n createSignedUrl(fileId: string, expiresIn?: number): Promise<{ signedUrl: string }>;\n\n /** Delete a file by ID. */\n deleteFile(fileId: string): Promise<void>;\n\n /** Create a new bucket. */\n createBucket(name: string, isPublic?: boolean): Promise<StorageBucket>;\n\n /** Update mutable bucket fields (is_public). */\n updateBucket(bucketId: string, opts: { isPublic?: boolean }): Promise<StorageBucket>;\n\n /** List all buckets. */\n listBuckets(): Promise<StorageBucket[]>;\n\n /** Get bucket info by ID. */\n getBucket(bucketId: string): Promise<StorageBucket>;\n\n /** Delete an empty bucket. */\n deleteBucket(bucketId: string): Promise<void>;\n\n /** List files inside a specific bucket. */\n listBucketFiles(bucketId: string): Promise<StorageFile[]>;\n\n /** Download a file's bytes via the backend download route (streams + enforces\n * the bucket's public/RLS rules; the Bearer is sent so private files work).\n * Returns a Blob. */\n download(fileId: string): Promise<Blob>;\n\n // Backward-compat: old signature (ignored table param)\n /** @deprecated Use upload(file, bucketId?) instead. */\n upload(table: string, file: File): Promise<any>;\n}\n\n// ── Implementation ──────────────────────────────────────────────\n\nexport function createStorageModule(client: HttpClient): StorageModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n const post = (endpoint: string, body?: unknown) => (client as any).post(endpoint, body);\n const put = (endpoint: string, body?: unknown) => (client as any).put(endpoint, body);\n const del = (endpoint: string) => (client as any).delete(endpoint);\n\n async function uploadFile(fileOrTable: File | string, fileOrBucketId?: File | string): Promise<any> {\n // Support both signatures:\n // upload(file: File, bucketId?: string) — new\n // upload(table: string, file: File) — old (deprecated)\n let file: File;\n let bucketId: string | undefined;\n\n if (fileOrTable instanceof File) {\n file = fileOrTable;\n bucketId = typeof fileOrBucketId === 'string' ? fileOrBucketId : undefined;\n } else {\n // Old signature: upload(\"bucket-name\", file)\n file = fileOrBucketId as File;\n bucketId = undefined; // table name was never used by the server\n }\n\n const formData = new FormData();\n formData.append('file', file);\n if (bucketId) {\n formData.append('bucket_id', bucketId);\n }\n\n const headers = client.getHeaders('');\n const res = await fetch(`${client.url}/api/storage/upload`, {\n method: 'POST',\n headers,\n body: formData\n });\n\n if (!res.ok) {\n if (res.status === 401) client.forceLogout();\n const err = await res.json().catch(() => ({ error: `Upload failed: ${res.status}` }));\n throw new Error(err.error ?? `Upload failed: ${res.status}`);\n }\n\n return res.json();\n }\n\n return {\n upload: uploadFile,\n\n async listFiles() {\n return get('/api/storage/files');\n },\n\n async getFile(fileId: string, expiresIn?: number) {\n const q = expiresIn && expiresIn > 0 ? `?expiresIn=${expiresIn}` : '';\n return get(`/api/storage/files/${fileId}${q}`);\n },\n\n async createSignedUrl(fileId: string, expiresIn?: number) {\n const res: StorageFileWithUrl = await get(\n `/api/storage/files/${fileId}${expiresIn && expiresIn > 0 ? `?expiresIn=${expiresIn}` : ''}`\n );\n return { signedUrl: res?.url };\n },\n\n async deleteFile(fileId: string) {\n return del(`/api/storage/files/${fileId}`);\n },\n\n async createBucket(name: string, isPublic = false) {\n return post('/api/storage/buckets', { name, is_public: isPublic });\n },\n\n async updateBucket(bucketId: string, opts: { isPublic?: boolean }) {\n return put(`/api/storage/buckets/${bucketId}`, { is_public: opts.isPublic });\n },\n\n async listBuckets() {\n return get('/api/storage/buckets');\n },\n\n async getBucket(bucketId: string) {\n return get(`/api/storage/buckets/${bucketId}`);\n },\n\n async deleteBucket(bucketId: string) {\n return del(`/api/storage/buckets/${bucketId}`);\n },\n\n async listBucketFiles(bucketId: string) {\n return get(`/api/storage/buckets/${bucketId}/files`);\n },\n\n async download(fileId: string): Promise<Blob> {\n const res = await fetch(`${client.url}/api/storage/files/${fileId}/download`, {\n headers: client.getHeaders(''),\n });\n if (!res.ok) {\n if (res.status === 401) client.forceLogout();\n const err = await res.json().catch(() => ({ error: `Download failed: ${res.status}` }));\n throw new Error(err.error ?? `Download failed: ${res.status}`);\n }\n return res.blob();\n },\n };\n}\n","/**\n * Backups Module - Database backup operations\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface BackupsModule {\n create(options?: { name?: string; tables?: string[] }): Promise<any>;\n list(): Promise<any>;\n get(backupId: string): Promise<any>;\n restore(backupId: string): Promise<any>;\n delete(backupId: string): Promise<any>;\n getDownloadUrl(backupId: string): string;\n listTables(): Promise<any>;\n importFile(formData: FormData): Promise<any>;\n}\n\nexport function createBackupsModule(client: HttpClient): BackupsModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n const post = (endpoint: string, body?: unknown) => (client as any).post(endpoint, body);\n const del = (endpoint: string) => (client as any).delete(endpoint);\n\n return {\n async create(options?: { name?: string; tables?: string[] }) {\n return post('/api/backups', options || {});\n },\n\n async list() {\n return get('/api/backups');\n },\n\n async get(backupId: string) {\n return get(`/api/backups/${backupId}`);\n },\n\n async restore(backupId: string) {\n return post(`/api/backups/${backupId}/restore`, {});\n },\n\n async delete(backupId: string) {\n return del(`/api/backups/${backupId}`);\n },\n\n getDownloadUrl(backupId: string) {\n const token = client.getDynamicToken();\n return `${client.url}/api/backups/${backupId}/download?access_token=${token}&apikey=${client.apiKey}`;\n },\n\n async listTables() {\n return get('/api/backups/tables');\n },\n\n async importFile(formData: FormData) {\n const headers = client.getHeaders();\n delete headers['Content-Type'];\n \n const res = await fetch(`${client.url}/api/import`, {\n method: 'POST',\n headers,\n body: formData,\n });\n const data = await res.json();\n if (!res.ok && res.status === 401) client.forceLogout();\n return data;\n },\n };\n}\n","/**\n * Migrations Module - Database migration operations\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface MigrationsModule {\n create(input: { name: string; description?: string; up_sql: string; down_sql?: string }): Promise<any>;\n list(): Promise<any>;\n get(id: string): Promise<any>;\n apply(id: string): Promise<any>;\n rollback(id: string): Promise<any>;\n delete(id: string): Promise<any>;\n generate(tableName: string, changes: any[]): Promise<any>;\n}\n\nexport function createMigrationsModule(client: HttpClient): MigrationsModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n const post = (endpoint: string, body?: unknown) => (client as any).post(endpoint, body);\n const del = (endpoint: string) => (client as any).delete(endpoint);\n\n return {\n async create(input: { name: string; description?: string; up_sql: string; down_sql?: string }) {\n return post('/api/migrations', input);\n },\n\n async list() {\n return get('/api/migrations');\n },\n\n async get(id: string) {\n return get(`/api/migrations/${id}`);\n },\n\n async apply(id: string) {\n return post(`/api/migrations/${id}/apply`, {});\n },\n\n async rollback(id: string) {\n return post(`/api/migrations/${id}/rollback`, {});\n },\n\n async delete(id: string) {\n return del(`/api/migrations/${id}`);\n },\n\n async generate(tableName: string, changes: any[]) {\n return post('/api/migrations/generate', { table_name: tableName, changes });\n },\n };\n}\n","/**\n * Functions Module - Edge function operations\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface FunctionsModule {\n invoke(id: string, data?: any): Promise<any>;\n get(id: string): Promise<any>;\n list(): Promise<any>;\n create(name: string, code: string, options?: { runtime?: 'wazero' | 'deno'; timeout_ms?: number }): Promise<any>;\n delete(id: string): Promise<any>;\n update(id: string, code: string, options?: { runtime?: 'wazero' | 'deno'; timeout_ms?: number }): Promise<any>;\n executeCode(code: string, options?: { data?: any; runtime?: 'wazero' | 'deno'; timeout_ms?: number }): Promise<any>;\n\n // Hooks\n listHooks(): Promise<any>;\n createHook(data: {\n event_type: string,\n function_id: string,\n table_name?: string,\n config?: any\n }): Promise<any>;\n deleteHook(id: string): Promise<any>;\n}\n\nexport function createFunctionsModule(client: HttpClient): FunctionsModule {\n const post = (endpoint: string, body?: unknown) => (client as any).post(endpoint, body);\n const get = (endpoint: string) => (client as any).get(endpoint);\n const del = (endpoint: string) => (client as any).delete(endpoint);\n const put = (endpoint: string, body?: unknown) => (client as any).put(endpoint, body);\n\n return {\n async invoke(id: string, data: any = {}) {\n return post(`/api/functions/${id}/execute`, data);\n },\n async get(id: string) {\n return get(`/api/functions/${id}`);\n },\n async list() {\n return get('/api/functions');\n },\n async create(name: string, code: string, options?: { runtime?: 'wazero' | 'deno'; timeout_ms?: number }) {\n return post('/api/functions', { name, code, ...options });\n },\n async delete(id: string) {\n return del(`/api/functions/${id}`);\n },\n async update(id: string, code: string, options?: { runtime?: 'wazero' | 'deno'; timeout_ms?: number }) {\n // The backend has no PUT route; functions upsert by NAME\n // (SaveFunction: ON CONFLICT (name) DO UPDATE). Fetch the current function\n // and re-POST with the same name to update it in place (same id).\n const current = await get(`/api/functions/${id}`);\n const name = current?.name ?? current?.data?.name;\n return post('/api/functions', { name, code, ...options });\n },\n async executeCode(code: string, options?: { data?: any; runtime?: 'wazero' | 'deno'; timeout_ms?: number }) {\n return post('/api/functions/execute', { code, ...options });\n },\n async listHooks() {\n return get('/api/hooks');\n },\n async createHook(data: any) {\n return post('/api/hooks', data);\n },\n async deleteHook(id: string) {\n return del(`/api/hooks/${id}`);\n },\n };\n}\n","/**\n * Jobs Module - Scheduled jobs (CRON) operations\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface JobInput {\n name: string;\n schedule: string;\n function_id: string;\n description?: string;\n payload?: Record<string, any>;\n timezone?: string;\n}\n\nexport interface JobUpdateInput {\n name?: string;\n schedule?: string;\n function_id?: string;\n description?: string;\n payload?: Record<string, any>;\n timezone?: string;\n enabled?: boolean;\n}\n\nexport interface JobsModule {\n create(input: JobInput): Promise<any>;\n list(): Promise<any>;\n get(id: string): Promise<any>;\n update(id: string, input: JobUpdateInput): Promise<any>;\n delete(id: string): Promise<any>;\n toggle(id: string, enabled: boolean): Promise<any>;\n runNow(id: string): Promise<any>;\n getExecutions(id: string, limit?: number): Promise<any>;\n}\n\nexport function createJobsModule(client: HttpClient): JobsModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n const post = (endpoint: string, body?: unknown) => (client as any).post(endpoint, body);\n const put = (endpoint: string, body?: unknown) => (client as any).put(endpoint, body);\n const del = (endpoint: string) => (client as any).delete(endpoint);\n\n return {\n async create(input: JobInput) {\n return post('/api/jobs', input);\n },\n\n async list() {\n return get('/api/jobs');\n },\n\n async get(id: string) {\n return get(`/api/jobs/${id}`);\n },\n\n async update(id: string, input: JobUpdateInput) {\n return put(`/api/jobs/${id}`, input);\n },\n\n async delete(id: string) {\n return del(`/api/jobs/${id}`);\n },\n\n async toggle(id: string, enabled: boolean) {\n return post(`/api/jobs/${id}/toggle`, { enabled });\n },\n\n async runNow(id: string) {\n return post(`/api/jobs/${id}/run`);\n },\n\n async getExecutions(id: string, limit?: number) {\n const params = new URLSearchParams();\n if (limit) params.set('limit', limit.toString());\n return get(`/api/jobs/${id}/executions?${params.toString()}`);\n },\n };\n}\n","/**\n * Environment Variables Module\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface EnvVarsModule {\n create(input: { key: string; value: string; is_secret?: boolean }): Promise<any>;\n list(): Promise<any>;\n get(id: string): Promise<any>;\n update(id: string, value: string): Promise<any>;\n delete(id: string): Promise<any>;\n}\n\nexport function createEnvVarsModule(client: HttpClient): EnvVarsModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n const post = (endpoint: string, body?: unknown) => (client as any).post(endpoint, body);\n const put = (endpoint: string, body?: unknown) => (client as any).put(endpoint, body);\n const del = (endpoint: string) => (client as any).delete(endpoint);\n\n return {\n async create(input: { key: string; value: string; is_secret?: boolean }) {\n return post('/api/env-vars', input);\n },\n\n async list() {\n return get('/api/env-vars');\n },\n\n async get(id: string) {\n return get(`/api/env-vars/${id}`);\n },\n\n async update(id: string, value: string) {\n return put(`/api/env-vars/${id}`, { value });\n },\n\n async delete(id: string) {\n return del(`/api/env-vars/${id}`);\n },\n };\n}\n","/**\n * Email Module - Email service operations\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface EmailConfig {\n provider: string;\n smtp_host?: string;\n smtp_port?: number;\n smtp_user?: string;\n smtp_password?: string;\n sendgrid_api_key?: string;\n resend_api_key?: string;\n from_email: string;\n from_name?: string;\n}\n\nexport interface EmailTemplate {\n name: string;\n subject: string;\n text_body?: string;\n html_body?: string;\n}\n\nexport interface SendEmailInput {\n to: string[];\n subject: string;\n text_body?: string;\n html_body?: string;\n template_id?: string;\n template_data?: Record<string, any>;\n}\n\nexport interface EmailModule {\n send(input: SendEmailInput): Promise<any>;\n getConfig(): Promise<any>;\n saveConfig(config: EmailConfig): Promise<any>;\n createTemplate(template: EmailTemplate): Promise<any>;\n listTemplates(): Promise<any>;\n getTemplate(id: string): Promise<any>;\n updateTemplate(id: string, template: Partial<EmailTemplate>): Promise<any>;\n deleteTemplate(id: string): Promise<any>;\n getLogs(options?: { limit?: number; offset?: number }): Promise<any>;\n}\n\nexport function createEmailModule(client: HttpClient): EmailModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n const post = (endpoint: string, body?: unknown) => (client as any).post(endpoint, body);\n const put = (endpoint: string, body?: unknown) => (client as any).put(endpoint, body);\n const del = (endpoint: string) => (client as any).delete(endpoint);\n\n return {\n async send(input: SendEmailInput) {\n return post('/api/email/send', input);\n },\n\n async getConfig() {\n return get('/api/email/config');\n },\n\n async saveConfig(config: EmailConfig) {\n return post('/api/email/config', config);\n },\n\n async createTemplate(template: EmailTemplate) {\n return post('/api/email/templates', template);\n },\n\n async listTemplates() {\n return get('/api/email/templates');\n },\n\n async getTemplate(id: string) {\n return get(`/api/email/templates/${id}`);\n },\n\n async updateTemplate(id: string, template: Partial<EmailTemplate>) {\n return put(`/api/email/templates/${id}`, template);\n },\n\n async deleteTemplate(id: string) {\n return del(`/api/email/templates/${id}`);\n },\n\n async getLogs(options?: { limit?: number; offset?: number }) {\n const params = new URLSearchParams();\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n return get(`/api/email/logs?${params.toString()}`);\n },\n };\n}\n","/**\n * Search Module - Full-text search operations\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface SearchOptions {\n tables?: string[];\n columns?: string[];\n limit?: number;\n offset?: number;\n}\n\nexport interface SearchModule {\n search(query: string, options?: SearchOptions): Promise<any>;\n createIndex(table: string, columns: string[]): Promise<any>;\n}\n\nexport function createSearchModule(client: HttpClient): SearchModule {\n const post = (endpoint: string, body?: unknown) => (client as any).post(endpoint, body);\n\n return {\n async search(query: string, options?: SearchOptions) {\n return post('/api/search', {\n query,\n tables: options?.tables,\n columns: options?.columns,\n limit: options?.limit,\n offset: options?.offset,\n });\n },\n\n async createIndex(table: string, columns: string[]) {\n return post('/api/search/index', { table, columns });\n },\n };\n}\n","/**\n * GraphQL Module\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface GraphQLModule {\n query(query: string, variables?: Record<string, any>): Promise<any>;\n getSchema(): Promise<any>;\n getPlaygroundUrl(): string;\n}\n\nexport function createGraphQLModule(client: HttpClient): GraphQLModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n const post = (endpoint: string, body?: unknown) => (client as any).post(endpoint, body);\n\n return {\n async query(query: string, variables?: Record<string, any>) {\n return post('/api/graphql', { query, variables });\n },\n\n async getSchema() {\n // No /schema route; introspection runs through the normal endpoint\n // (gated by GRAPHQL_INTROSPECTION on the backend).\n return post('/api/graphql', {\n query: '{ __schema { queryType { name } mutationType { name } types { name kind } } }',\n });\n },\n\n getPlaygroundUrl() {\n return `${client.url}/api/graphql/playground`;\n },\n };\n}\n","/**\n * Metrics Module - Monitoring and metrics operations\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface RequestLogsOptions {\n limit?: number;\n offset?: number;\n method?: string;\n status?: string;\n path?: string;\n}\n\nexport interface ApplicationLogsOptions {\n limit?: number;\n offset?: number;\n level?: string;\n source?: string;\n search?: string;\n}\n\nexport interface TimeseriesOptions {\n interval?: string;\n start?: string;\n end?: string;\n}\n\nexport interface MetricsModule {\n getDashboardStats(): Promise<any>;\n getRequestLogs(options?: RequestLogsOptions): Promise<any>;\n getApplicationLogs(options?: ApplicationLogsOptions): Promise<any>;\n getTimeseries(metric: string, options?: TimeseriesOptions): Promise<any>;\n}\n\nexport function createMetricsModule(client: HttpClient): MetricsModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n\n return {\n async getDashboardStats() {\n return get('/api/metrics/dashboard');\n },\n\n async getRequestLogs(options?: RequestLogsOptions) {\n const params = new URLSearchParams();\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n if (options?.method) params.set('method', options.method);\n if (options?.status) params.set('status', options.status);\n if (options?.path) params.set('path', options.path);\n return get(`/api/metrics/requests?${params.toString()}`);\n },\n\n async getApplicationLogs(options?: ApplicationLogsOptions) {\n const params = new URLSearchParams();\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n if (options?.level) params.set('level', options.level);\n if (options?.source) params.set('source', options.source);\n if (options?.search) params.set('search', options.search);\n return get(`/api/metrics/logs?${params.toString()}`);\n },\n\n async getTimeseries(metric: string, options?: TimeseriesOptions) {\n const params = new URLSearchParams({ metric });\n if (options?.interval) params.set('interval', options.interval);\n if (options?.start) params.set('start', options.start);\n if (options?.end) params.set('end', options.end);\n return get(`/api/metrics/timeseries?${params.toString()}`);\n },\n };\n}\n","/**\n * Audit Module - Audit log operations\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface AuditLogsOptions {\n limit?: number;\n offset?: number;\n action?: string;\n user_id?: string;\n method?: string;\n path?: string;\n status_code?: number;\n start_date?: string;\n end_date?: string;\n}\n\nexport interface AuditModule {\n list(options?: AuditLogsOptions): Promise<any>;\n getActions(): Promise<any>;\n exportLogs(format: 'csv' | 'json', options?: AuditLogsOptions): Promise<any>;\n purgePreview(olderThanDays: number): Promise<any>;\n purge(olderThanDays: number): Promise<any>;\n}\n\nexport function createAuditModule(client: HttpClient): AuditModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n const del = (endpoint: string) => (client as any).delete(endpoint);\n\n return {\n async list(options?: AuditLogsOptions) {\n const params = new URLSearchParams();\n if (options?.limit) params.set('limit', options.limit.toString());\n if (options?.offset) params.set('offset', options.offset.toString());\n if (options?.action) params.set('action', options.action);\n if (options?.user_id) params.set('user_id', options.user_id);\n if (options?.method) params.set('method', options.method);\n if (options?.path) params.set('path', options.path);\n if (options?.status_code) params.set('status_code', options.status_code.toString());\n if (options?.start_date) params.set('start_date', options.start_date);\n if (options?.end_date) params.set('end_date', options.end_date);\n return get(`/api/audit/logs?${params.toString()}`);\n },\n\n async getActions() {\n return get('/api/audit/actions');\n },\n\n async exportLogs(format: 'csv' | 'json', options?: AuditLogsOptions) {\n const params = new URLSearchParams();\n params.set('format', format);\n if (options?.action) params.set('action', options.action);\n if (options?.method) params.set('method', options.method);\n if (options?.path) params.set('path', options.path);\n if (options?.status_code) params.set('status_code', options.status_code.toString());\n if (options?.start_date) params.set('start_date', options.start_date);\n if (options?.end_date) params.set('end_date', options.end_date);\n\n const res = await fetch(`${client.url}/api/audit/export?${params.toString()}`, {\n headers: client.getHeaders(),\n credentials: 'include',\n });\n\n if (!res.ok) {\n const data = await res.json();\n return { error: data.error || `Export failed: ${res.status}` };\n }\n\n const blob = await res.blob();\n const url = window.URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `audit_logs_${new Date().toISOString().split('T')[0]}.${format}`;\n document.body.appendChild(a);\n a.click();\n window.URL.revokeObjectURL(url);\n document.body.removeChild(a);\n return { success: true };\n },\n\n async purgePreview(olderThanDays: number) {\n return get(`/api/audit/purge/preview?older_than_days=${olderThanDays}`);\n },\n\n async purge(olderThanDays: number) {\n return del(`/api/audit/purge?older_than_days=${olderThanDays}`);\n },\n };\n}\n","/**\n * Webhooks Module\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface WebhookInput {\n url: string;\n event_types: string[];\n}\n\nexport interface WebhookUpdateInput {\n url: string;\n event_types: string[];\n is_active: boolean;\n}\n\nexport interface WebhooksModule {\n list(): Promise<any>;\n get(id: string): Promise<any>;\n create(input: WebhookInput): Promise<any>;\n update(id: string, input: WebhookUpdateInput): Promise<any>;\n delete(id: string): Promise<any>;\n test(id: string): Promise<any>;\n}\n\nexport function createWebhooksModule(client: HttpClient): WebhooksModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n const post = (endpoint: string, body?: unknown) => (client as any).post(endpoint, body);\n const put = (endpoint: string, body?: unknown) => (client as any).put(endpoint, body);\n const del = (endpoint: string) => (client as any).delete(endpoint);\n\n return {\n async list() {\n return get('/api/webhooks');\n },\n\n async get(id: string) {\n return get(`/api/webhooks/${id}`);\n },\n\n async create(input: WebhookInput) {\n return post('/api/webhooks', input);\n },\n\n async update(id: string, input: WebhookUpdateInput) {\n return put(`/api/webhooks/${id}`, input);\n },\n\n async delete(id: string) {\n return del(`/api/webhooks/${id}`);\n },\n\n async test(id: string) {\n return post(`/api/webhooks/${id}/test`);\n },\n };\n}\n","/**\n * Log Drains Module\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface LogDrainInput {\n name: string;\n type: string;\n url: string;\n token?: string;\n headers?: Record<string, string>;\n filters?: {\n levels?: string[];\n sources?: string[];\n };\n}\n\nexport interface LogDrainUpdateInput {\n name?: string;\n url?: string;\n token?: string;\n headers?: Record<string, string>;\n filters?: {\n levels?: string[];\n sources?: string[];\n };\n enabled?: boolean;\n}\n\nexport interface LogDrainsModule {\n create(input: LogDrainInput): Promise<any>;\n list(): Promise<any>;\n get(id: string): Promise<any>;\n update(id: string, input: LogDrainUpdateInput): Promise<any>;\n delete(id: string): Promise<any>;\n toggle(id: string, enabled: boolean): Promise<any>;\n test(id: string): Promise<any>;\n}\n\nexport function createLogDrainsModule(client: HttpClient): LogDrainsModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n const post = (endpoint: string, body?: unknown) => (client as any).post(endpoint, body);\n const put = (endpoint: string, body?: unknown) => (client as any).put(endpoint, body);\n const del = (endpoint: string) => (client as any).delete(endpoint);\n\n return {\n async create(input: LogDrainInput) {\n return post('/api/log-drains', input);\n },\n\n async list() {\n return get('/api/log-drains');\n },\n\n async get(id: string) {\n return get(`/api/log-drains/${id}`);\n },\n\n async update(id: string, input: LogDrainUpdateInput) {\n return put(`/api/log-drains/${id}`, input);\n },\n\n async delete(id: string) {\n return del(`/api/log-drains/${id}`);\n },\n\n async toggle(id: string, enabled: boolean) {\n return post(`/api/log-drains/${id}/toggle`, { enabled });\n },\n\n async test(id: string) {\n return post(`/api/log-drains/${id}/test`);\n },\n };\n}\n","/**\n * Branches Module - Database branches operations\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface BranchesModule {\n create(input: { name: string; source_branch?: string }): Promise<any>;\n list(): Promise<any>;\n get(id: string): Promise<any>;\n delete(id: string): Promise<any>;\n merge(id: string, targetBranchId: string): Promise<any>;\n reset(id: string): Promise<any>;\n}\n\nexport function createBranchesModule(client: HttpClient): BranchesModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n const post = (endpoint: string, body?: unknown) => (client as any).post(endpoint, body);\n const del = (endpoint: string) => (client as any).delete(endpoint);\n\n return {\n async create(input: { name: string; source_branch?: string }) {\n return post('/api/branches', input);\n },\n\n async list() {\n return get('/api/branches');\n },\n\n async get(id: string) {\n return get(`/api/branches/${id}`);\n },\n\n async delete(id: string) {\n return del(`/api/branches/${id}`);\n },\n\n async merge(id: string, targetBranchId: string) {\n return post(`/api/branches/${id}/merge`, { target_branch_id: targetBranchId });\n },\n\n async reset(id: string) {\n return post(`/api/branches/${id}/reset`);\n },\n };\n}\n","import { RealtimeAction, RealtimeCallback, RealtimePayload } from './types';\n\n/**\n * RealtimeService handles WebSocket connections to the BaaS Realtime engine.\n * It allows subscribing to database changes in real-time.\n */\nexport class RealtimeService {\n private socket: WebSocket | null = null;\n private subscribers: Map<string, Set<{ action: RealtimeAction; callback: RealtimeCallback }>> = new Map();\n private reconnectAttempts = 0;\n private maxReconnectAttempts = 5;\n private reconnectInterval = 3000;\n\n constructor(\n private url: string,\n private apiKey: string,\n private tokenProvider: () => string | null,\n private wsConstructor: any = typeof WebSocket !== 'undefined' ? WebSocket : null\n ) {}\n\n /**\n * Initialize the WebSocket connection\n */\n private connect(): Promise<void> {\n if (this.socket?.readyState === WebSocket.OPEN) return Promise.resolve();\n\n return new Promise((resolve, reject) => {\n const token = this.tokenProvider();\n // API key is optional - admin dashboard uses JWT only\n if (!token) {\n reject(new Error('Missing authentication token for Realtime connection'));\n return;\n }\n\n // Convert http/https to ws/wss\n const wsUrl = this.url.replace(/^http/, 'ws') + '/api/ws';\n // Include API key only if provided\n const fullUrl = this.apiKey\n ? `${wsUrl}?apikey=${this.apiKey}&token=${token}`\n : `${wsUrl}?token=${token}`;\n\n if (!this.wsConstructor) {\n reject(new Error('WebSocket constructor not provided or available in this environment'));\n return;\n }\n\n const socket = new this.wsConstructor(fullUrl);\n this.socket = socket;\n\n socket.onopen = () => {\n console.log('BaaS Realtime: Connected');\n this.reconnectAttempts = 0;\n // (Re)register server-side subscriptions for every active table so the\n // server routes their events to us (non-admin clients receive nothing\n // until subscribed). Survives reconnects.\n for (const table of this.subscribers.keys()) {\n this.sendSub('subscribe', table);\n }\n resolve();\n };\n\n socket.onmessage = (event: any) => {\n const raw = event.data as string;\n // Server may send multiple JSON objects concatenated in one frame\n const parts = raw.split('\\n').filter((s: string) => s.trim());\n for (const part of parts) {\n try {\n const payload: RealtimePayload = JSON.parse(part);\n this.handleEvent(payload);\n } catch {\n // Try splitting on }{ for concatenated JSON without newlines\n const chunks = part.replace(/\\}\\s*\\{/g, '}\\n{').split('\\n');\n for (const chunk of chunks) {\n try {\n const payload: RealtimePayload = JSON.parse(chunk);\n this.handleEvent(payload);\n } catch { /* skip unparseable chunks */ }\n }\n }\n }\n };\n\n socket.onerror = (error: any) => {\n console.error('BaaS Realtime: WebSocket Error', error);\n reject(error);\n };\n\n socket.onclose = () => {\n console.log('BaaS Realtime: Disconnected');\n this.socket = null;\n this.attemptReconnect();\n };\n });\n }\n\n /**\n * Subscribe to changes on a specific table\n */\n public async subscribe<T = any>(\n table: string,\n action: RealtimeAction,\n callback: RealtimeCallback<T>\n ): Promise<{ unsubscribe: () => void }> {\n await this.connect();\n\n const isNewTable = !this.subscribers.has(table);\n if (isNewTable) {\n this.subscribers.set(table, new Set());\n }\n\n const sub = { action, callback };\n this.subscribers.get(table)!.add(sub);\n\n // Register the table with the server on the first subscriber ('*' is a\n // client-side wildcard only).\n if (isNewTable && table !== '*') {\n this.sendSub('subscribe', table);\n }\n\n return {\n unsubscribe: () => {\n const tableSubs = this.subscribers.get(table);\n if (tableSubs) {\n tableSubs.delete(sub);\n if (tableSubs.size === 0) {\n this.subscribers.delete(table);\n if (table !== '*') this.sendSub('unsubscribe', table);\n }\n }\n }\n };\n }\n\n /** Send a subscribe/unsubscribe control frame to the server. */\n private sendSub(event: 'subscribe' | 'unsubscribe', table: string) {\n if (this.socket?.readyState === WebSocket.OPEN) {\n this.socket.send(JSON.stringify({ event, table }));\n }\n }\n\n /**\n * Handle incoming CDC events from the server\n */\n private handleEvent(payload: RealtimePayload) {\n // Notify specific table subscribers\n const tableSubs = this.subscribers.get(payload.table);\n if (tableSubs) {\n for (const sub of tableSubs) {\n if (sub.action === '*' || sub.action.toLowerCase() === payload.action.toLowerCase()) {\n sub.callback(payload);\n }\n }\n }\n\n // Notify wildcard ('*') subscribers\n const wildcardSubs = this.subscribers.get('*');\n if (wildcardSubs) {\n for (const sub of wildcardSubs) {\n if (sub.action === '*' || sub.action.toLowerCase() === payload.action.toLowerCase()) {\n sub.callback(payload);\n }\n }\n }\n }\n\n /**\n * Attempt to reconnect on connection loss\n */\n private attemptReconnect() {\n if (this.reconnectAttempts < this.maxReconnectAttempts) {\n this.reconnectAttempts++;\n console.log(`BaaS Realtime: Attempting reconnect ${this.reconnectAttempts}/${this.maxReconnectAttempts}...`);\n setTimeout(() => this.connect(), this.reconnectInterval);\n } else {\n console.error('BaaS Realtime: Max reconnect attempts reached');\n }\n }\n\n /**\n * Close the connection\n */\n public disconnect() {\n if (this.socket) {\n this.socket.onclose = null; // Prevent reconnect\n this.socket.close();\n this.socket = null;\n }\n }\n\n /** @internal - For testing only */\n public get _socket(): WebSocket | null {\n return this.socket;\n }\n}\n","/**\n * Realtime Module - WebSocket subscriptions\n */\n\nimport type { HttpClient } from '../http-client';\nimport { RealtimeService } from '../realtime';\nimport { RealtimeAction, RealtimeCallback } from '../types';\n\nexport interface Subscription {\n unsubscribe: () => void;\n}\n\nexport interface RealtimeModule {\n subscribe<T = any>(table: string, action: RealtimeAction, callback: RealtimeCallback<T>): Promise<Subscription>;\n}\n\nexport function createRealtimeModule(client: HttpClient): RealtimeModule {\n const service = new RealtimeService(\n client.url,\n client.apiKey,\n () => client.getDynamicToken(),\n typeof WebSocket !== 'undefined' ? WebSocket : undefined\n );\n\n return {\n async subscribe<T = any>(table: string, action: RealtimeAction, callback: RealtimeCallback<T>): Promise<Subscription> {\n return service.subscribe(table, action, callback);\n },\n };\n}\n","/**\n * API Keys Module\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface ApiKeysModule {\n create(name: string, permissions?: string[], expiresAt?: string): Promise<any>;\n list(): Promise<any>;\n revoke(keyId: string): Promise<any>;\n delete(keyId: string): Promise<any>;\n getInstanceToken(): Promise<any>;\n regenerateInstanceToken(): Promise<any>;\n}\n\nexport function createApiKeysModule(client: HttpClient): ApiKeysModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n const post = (endpoint: string, body?: unknown) => (client as any).post(endpoint, body);\n const del = (endpoint: string) => (client as any).delete(endpoint);\n\n return {\n async create(name: string, permissions?: string[], expiresAt?: string) {\n return post('/api/api-keys', { name, permissions, expires_at: expiresAt });\n },\n\n async list() {\n return get('/api/api-keys');\n },\n\n async revoke(keyId: string) {\n return post(`/api/api-keys/${keyId}/revoke`, {});\n },\n\n async delete(keyId: string) {\n return del(`/api/api-keys/${keyId}`);\n },\n\n async getInstanceToken() {\n return get('/api/api-keys/instance');\n },\n\n async regenerateInstanceToken() {\n return post('/api/api-keys/instance/regenerate', {});\n },\n };\n}\n","/**\n * Environments Module - Test/Prod environment management\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface EnvironmentStatus {\n test_exists: boolean;\n test_status?: string;\n test_created_at?: string;\n test_schema_name?: string;\n prod_schema_name: string;\n table_count: number;\n}\n\nexport interface PromoteResult {\n tables_promoted: number;\n status: string;\n}\n\nexport interface EnvironmentsModule {\n status(): Promise<EnvironmentStatus>;\n init(): Promise<any>;\n promote(): Promise<PromoteResult>;\n revert(): Promise<any>;\n setActive(env: 'test' | 'prod'): void;\n getActive(): string;\n}\n\nexport function createEnvironmentsModule(client: HttpClient): EnvironmentsModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n const post = (endpoint: string, body?: unknown) => (client as any).post(endpoint, body);\n\n return {\n async status() {\n return get('/api/environments/status');\n },\n\n async init() {\n return post('/api/environments/init');\n },\n\n async promote() {\n return post('/api/environments/promote');\n },\n\n async revert() {\n return post('/api/environments/revert');\n },\n\n setActive(env: 'test' | 'prod') {\n client.setEnvironment(env);\n },\n\n getActive() {\n return client.getEnvironment();\n },\n };\n}\n","/**\n * CORS Origins Module\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface CorsOriginsModule {\n list(): Promise<any>;\n create(origin: string, description?: string): Promise<any>;\n delete(id: string): Promise<any>;\n}\n\nexport function createCorsOriginsModule(client: HttpClient): CorsOriginsModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n const post = (endpoint: string, body?: unknown) => (client as any).post(endpoint, body);\n const del = (endpoint: string) => (client as any).delete(endpoint);\n\n return {\n async list() {\n return get('/api/cors-origins');\n },\n\n async create(origin: string, description?: string) {\n return post('/api/cors-origins', { origin, description: description || '' });\n },\n\n async delete(id: string) {\n return del(`/api/cors-origins/${id}`);\n },\n };\n}\n","/**\n * Policies Module - Row-Level Security policy management\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface Policy {\n id: string;\n table_name: string;\n action: 'select' | 'insert' | 'update' | 'delete';\n role: string;\n condition: string;\n created_at?: string;\n}\n\nexport interface CreatePolicyInput {\n table_name: string;\n action: 'select' | 'insert' | 'update' | 'delete';\n role: string;\n condition: string;\n}\n\nexport interface PoliciesModule {\n create(input: CreatePolicyInput): Promise<Policy>;\n list(): Promise<Policy[]>;\n delete(id: string): Promise<any>;\n}\n\nexport function createPoliciesModule(client: HttpClient): PoliciesModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n const post = (endpoint: string, body?: unknown) => (client as any).post(endpoint, body);\n const del = (endpoint: string) => (client as any).delete(endpoint);\n\n return {\n async create(input: CreatePolicyInput) {\n return post('/api/policies', input);\n },\n\n async list() {\n return get('/api/policies');\n },\n\n async delete(id: string) {\n return del(`/api/policies/${id}`);\n },\n };\n}\n","/**\n * IP Whitelist Module - IP-based access control\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport interface IPWhitelistEntry {\n id: string;\n ip_address: string;\n description: string;\n created_at?: string;\n}\n\nexport interface IPWhitelistModule {\n list(): Promise<IPWhitelistEntry[]>;\n create(ipAddress: string, description?: string): Promise<IPWhitelistEntry>;\n delete(id: string): Promise<any>;\n}\n\nexport function createIPWhitelistModule(client: HttpClient): IPWhitelistModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n const post = (endpoint: string, body?: unknown) => (client as any).post(endpoint, body);\n const del = (endpoint: string) => (client as any).delete(endpoint);\n\n return {\n async list() {\n return get('/api/ip-whitelist');\n },\n\n async create(ipAddress: string, description?: string) {\n return post('/api/ip-whitelist', { ip_address: ipAddress, description: description || '' });\n },\n\n async delete(id: string) {\n return del(`/api/ip-whitelist/${id}`);\n },\n };\n}\n","/**\n * Cache Management Module\n */\n\nimport type { HttpClient } from '../http-client';\n\nexport type CacheStrategy = 'no_cache' | 'ttl_only' | 'cdc_invalidation' | 'write_through';\n\nexport interface CacheStatus {\n connected: boolean;\n backend: string;\n version: string;\n ping_latency_ms: number;\n circuit_state: string;\n cdc_lag_seconds: number;\n}\n\nexport interface CacheStats {\n memory_used: string;\n memory_used_bytes: number;\n db_size: number;\n uptime_seconds: number;\n ops_per_sec: number;\n namespaces_total: number;\n}\n\nexport interface CachePolicy {\n namespace: string;\n strategy: CacheStrategy;\n ttl_seconds: number;\n use_versioning: boolean;\n is_default: boolean;\n}\n\nexport interface CacheKey {\n key: string;\n ttl_seconds: number;\n}\n\nexport interface CacheKeysResponse {\n keys: CacheKey[];\n next_cursor: number;\n has_more: boolean;\n}\n\nexport interface CacheKeyInspect {\n key: string;\n exists: boolean;\n ttl_seconds: number;\n size_bytes: number;\n value_preview: string;\n value_truncated: boolean;\n}\n\nexport interface CacheModule {\n getStatus(): Promise<CacheStatus>;\n getStats(): Promise<CacheStats>;\n listPolicies(): Promise<{ policies: CachePolicy[] }>;\n updatePolicy(namespace: string, body: { strategy: CacheStrategy; ttl_seconds: number; use_versioning: boolean }): Promise<any>;\n removePolicy(namespace: string): Promise<any>;\n invalidateNamespace(namespace: string): Promise<any>;\n invalidateAll(): Promise<any>;\n listKeys(prefix: string, cursor?: number, count?: number): Promise<CacheKeysResponse>;\n inspectKey(key: string): Promise<CacheKeyInspect>;\n}\n\nexport function createCacheModule(client: HttpClient): CacheModule {\n const get = (endpoint: string) => (client as any).get(endpoint);\n const post = (endpoint: string, body?: unknown) => (client as any).post(endpoint, body);\n const patch = (endpoint: string, body: unknown) => (client as any).patch(endpoint, body);\n const del = (endpoint: string) => (client as any).delete(endpoint);\n\n return {\n async getStatus() {\n return get('/api/cache/status');\n },\n\n async getStats() {\n return get('/api/cache/stats');\n },\n\n async listPolicies() {\n return get('/api/cache/policies');\n },\n\n async updatePolicy(namespace: string, body: { strategy: CacheStrategy; ttl_seconds: number; use_versioning: boolean }) {\n return patch(`/api/cache/policies/${encodeURIComponent(namespace)}`, body);\n },\n\n async removePolicy(namespace: string) {\n return del(`/api/cache/policies/${encodeURIComponent(namespace)}`);\n },\n\n async invalidateNamespace(namespace: string) {\n return post(`/api/cache/invalidate/${encodeURIComponent(namespace)}`);\n },\n\n async invalidateAll() {\n return post('/api/cache/invalidate-all');\n },\n\n async listKeys(prefix: string, cursor = 0, count = 100) {\n const params = new URLSearchParams({ prefix, cursor: String(cursor), count: String(count) });\n return get(`/api/cache/keys?${params}`);\n },\n\n async inspectKey(key: string) {\n return get(`/api/cache/keys/inspect?key=${encodeURIComponent(key)}`);\n },\n };\n}\n","/**\n * BaaS Client SDK\n * A fluent JavaScript/TypeScript client for the Go BaaS.\n * \n * This is the main client that composes all feature modules.\n */\n\nimport { HttpClient, type ClientOptions } from './http-client';\nimport { QueryBuilder } from './query-builder';\nimport { RealtimeAction, RealtimeCallback } from './types';\n\n// Module imports\nimport { createAuthModule, type AuthModule } from './modules/auth';\nimport { createUsersModule, type UsersModule } from './modules/users';\nimport { createDatabaseModule, type DatabaseModule } from './modules/database';\nimport { createStorageModule, type StorageModule } from './modules/storage';\nimport { createBackupsModule, type BackupsModule } from './modules/backups';\nimport { createMigrationsModule, type MigrationsModule } from './modules/migrations';\nimport { createFunctionsModule, type FunctionsModule } from './modules/functions';\nimport { createJobsModule, type JobsModule } from './modules/jobs';\nimport { createEnvVarsModule, type EnvVarsModule } from './modules/env-vars';\nimport { createEmailModule, type EmailModule } from './modules/email';\nimport { createSearchModule, type SearchModule } from './modules/search';\nimport { createGraphQLModule, type GraphQLModule } from './modules/graphql';\nimport { createMetricsModule, type MetricsModule } from './modules/metrics';\nimport { createAuditModule, type AuditModule } from './modules/audit';\nimport { createWebhooksModule, type WebhooksModule } from './modules/webhooks';\nimport { createLogDrainsModule, type LogDrainsModule } from './modules/log-drains';\nimport { createBranchesModule, type BranchesModule } from './modules/branches';\nimport { createRealtimeModule, type RealtimeModule } from './modules/realtime';\nimport { createApiKeysModule, type ApiKeysModule } from './modules/api-keys';\nimport { createEnvironmentsModule, type EnvironmentsModule } from './modules/environments';\nimport { createCorsOriginsModule, type CorsOriginsModule } from './modules/cors-origins';\nimport { createPoliciesModule, type PoliciesModule } from './modules/policies';\nimport { createIPWhitelistModule, type IPWhitelistModule } from './modules/ip-whitelist';\nimport { createCacheModule, type CacheModule } from './modules/cache';\n\n/**\n * Main BaaS Client - Composes all feature modules\n * \n * Usage:\n * ```ts\n * const client = new BaasClient();\n * \n * // Authentication\n * await client.auth.login('user@example.com', 'password');\n * \n * // Database operations\n * const schemas = await client.database.getSchemas();\n * \n * // Query builder (fluent API)\n * const users = await client.from('users').select('*').limit(10).get();\n * ```\n */\nexport class BaasClient extends HttpClient {\n // Feature modules\n public readonly auth: AuthModule;\n public readonly users: UsersModule;\n public readonly database: DatabaseModule;\n public readonly storage: StorageModule;\n public readonly backups: BackupsModule;\n public readonly migrations: MigrationsModule;\n public readonly functions: FunctionsModule;\n public readonly jobs: JobsModule;\n public readonly envVars: EnvVarsModule;\n public readonly email: EmailModule;\n public readonly searchService: SearchModule;\n public readonly graphqlService: GraphQLModule;\n public readonly metrics: MetricsModule;\n public readonly audit: AuditModule;\n public readonly webhooks: WebhooksModule;\n public readonly logDrains: LogDrainsModule;\n public readonly branches: BranchesModule;\n public readonly realtime: RealtimeModule;\n public readonly apiKeys: ApiKeysModule;\n public readonly environments: EnvironmentsModule;\n public readonly corsOrigins: CorsOriginsModule;\n public readonly policies: PoliciesModule;\n public readonly ipWhitelist: IPWhitelistModule;\n public readonly cache: CacheModule;\n\n constructor(url?: string, apiKey?: string, options?: ClientOptions) {\n super(url, apiKey, options);\n\n // Initialize all modules with this client instance\n this.auth = createAuthModule(this);\n this.users = createUsersModule(this);\n this.database = createDatabaseModule(this);\n this.storage = createStorageModule(this);\n this.backups = createBackupsModule(this);\n this.migrations = createMigrationsModule(this);\n this.functions = createFunctionsModule(this);\n this.jobs = createJobsModule(this);\n this.envVars = createEnvVarsModule(this);\n this.email = createEmailModule(this);\n this.searchService = createSearchModule(this);\n this.graphqlService = createGraphQLModule(this);\n this.metrics = createMetricsModule(this);\n this.audit = createAuditModule(this);\n this.webhooks = createWebhooksModule(this);\n this.logDrains = createLogDrainsModule(this);\n this.branches = createBranchesModule(this);\n this.realtime = createRealtimeModule(this);\n this.apiKeys = createApiKeysModule(this);\n this.environments = createEnvironmentsModule(this);\n this.corsOrigins = createCorsOriginsModule(this);\n this.policies = createPoliciesModule(this);\n this.ipWhitelist = createIPWhitelistModule(this);\n this.cache = createCacheModule(this);\n }\n\n /**\n * Create a query builder for fluent data queries\n */\n from(table: string): QueryBuilder {\n return new QueryBuilder(table, this.url, this);\n }\n\n /**\n * Invoke a PL/pgSQL function (PostgREST `.rpc()` parity). Runs under the\n * caller's RLS context; args bind by name and are $N-safe. Pass [params] for\n * POST (named args in the body) or set `opts.get = true` for the GET variant.\n */\n async rpc(fn: string, params?: Record<string, any>, opts?: { get?: boolean }) {\n if (opts?.get) {\n const qs = params\n ? '?' + new URLSearchParams(Object.entries(params).map(([k, v]) => [k, String(v)])).toString()\n : '';\n return this.get(`/api/v1/rpc/${fn}${qs}`);\n }\n return this.post(`/api/v1/rpc/${fn}`, params ?? {});\n }\n\n // ============================================\n // BACKWARD COMPATIBILITY METHODS\n // These delegate to the appropriate modules\n // ============================================\n\n // Auth shortcuts\n async login(email: string, password: string) { return this.auth.login(email, password); }\n async verifyMFA(mfaToken: string, code: string) { return this.auth.verifyMFA(mfaToken, code); }\n async getProfile() { return this.auth.getProfile(); }\n async register(email: string, password: string) { return this.auth.register(email, password); }\n async forgotPassword(email: string) { return this.auth.forgotPassword(email); }\n async resetPassword(token: string, newPassword: string) { return this.auth.resetPassword(token, newPassword); }\n async validateResetToken(token: string) { return this.auth.validateResetToken(token); }\n async verifyEmail(token: string) { return this.auth.verifyEmail(token); }\n async requestEmailVerification() { return this.auth.requestEmailVerification(); }\n async getAuthProviders() { return this.auth.getAuthProviders(); }\n async getAuthProvider(provider: string) { return this.auth.getAuthProvider(provider); }\n async configureAuthProvider(provider: string, clientID: string, clientSecret: string, enabled: boolean) { \n return this.auth.configureAuthProvider(provider, clientID, clientSecret, enabled); \n }\n\n // Users shortcuts\n async listUsers(limit = 20, offset = 0) { return this.users.list(limit, offset); }\n async updateUser(id: string, updates: any) { return this.users.update(id, updates); }\n async deleteUser(id: string) { return this.users.delete(id); }\n\n // Database shortcuts\n async raw(query: string) { return this.database.raw(query); }\n async getSchemas(options?: any) { return this.database.getSchemas(options); }\n async getSchema(name: string) { return this.database.getSchema(name); }\n async createTable(tableName: string, definition: any) { return this.database.createTable(tableName, definition); }\n async dropTable(tableName: string) { return this.database.dropTable(tableName); }\n async renameTable(tableName: string, newName: string) { return this.database.renameTable(tableName, newName); }\n async addColumn(tableName: string, column: any) { return this.database.addColumn(tableName, column); }\n async dropColumn(tableName: string, columnName: string) { return this.database.dropColumn(tableName, columnName); }\n async modifyColumn(tableName: string, columnName: string, changes: any) { return this.database.modifyColumn(tableName, columnName, changes); }\n async renameColumn(tableName: string, columnName: string, newName: string) { return this.database.renameColumn(tableName, columnName, newName); }\n async setColumnDefault(tableName: string, columnName: string, defaultValue: string | null) { return this.database.setColumnDefault(tableName, columnName, defaultValue); }\n async addForeignKey(tableName: string, fk: any) { return this.database.addForeignKey(tableName, fk); }\n async listForeignKeys(tableName: string) { return this.database.listForeignKeys(tableName); }\n async dropForeignKey(tableName: string, constraintName: string) { return this.database.dropForeignKey(tableName, constraintName); }\n async addUniqueConstraint(tableName: string, columnName: string) { return this.database.addUniqueConstraint(tableName, columnName); }\n async dropConstraint(tableName: string, constraintName: string) { return this.database.dropConstraint(tableName, constraintName); }\n async queryData(tableName: string, options: any) { return this.database.queryData(tableName, options); }\n async downloadExport(tableName: string, format: 'sql' | 'csv' | 'backup', filters?: any[]) { return this.database.downloadExport(tableName, format, filters); }\n\n // Storage shortcuts\n async upload(file: File, bucketId?: string) { return this.storage.upload(file, bucketId); }\n async listStorageFiles() { return this.storage.listFiles(); }\n async getStorageFile(fileId: string) { return this.storage.getFile(fileId); }\n async deleteStorageFile(fileId: string) { return this.storage.deleteFile(fileId); }\n async createStorageBucket(name: string, isPublic?: boolean) { return this.storage.createBucket(name, isPublic); }\n async listStorageBuckets() { return this.storage.listBuckets(); }\n async getStorageBucket(bucketId: string) { return this.storage.getBucket(bucketId); }\n async deleteStorageBucket(bucketId: string) { return this.storage.deleteBucket(bucketId); }\n async listStorageBucketFiles(bucketId: string) { return this.storage.listBucketFiles(bucketId); }\n\n // Functions shortcuts\n async invokeFunction(id: string, data?: any) { return this.functions.invoke(id, data); }\n\n // API Keys shortcuts\n async createApiKey(name: string, permissions?: string[], expiresAt?: string) { return this.apiKeys.create(name, permissions, expiresAt); }\n async listApiKeys() { return this.apiKeys.list(); }\n async revokeApiKey(keyId: string) { return this.apiKeys.revoke(keyId); }\n async deleteApiKey(keyId: string) { return this.apiKeys.delete(keyId); }\n async getInstanceToken() { return this.apiKeys.getInstanceToken(); }\n async regenerateInstanceToken() { return this.apiKeys.regenerateInstanceToken(); }\n\n // Backups shortcuts\n async createBackup(options?: any) { return this.backups.create(options); }\n async listBackups() { return this.backups.list(); }\n async getBackup(backupId: string) { return this.backups.get(backupId); }\n async restoreBackup(backupId: string) { return this.backups.restore(backupId); }\n async deleteBackup(backupId: string) { return this.backups.delete(backupId); }\n getBackupDownloadUrl(backupId: string) { return this.backups.getDownloadUrl(backupId); }\n async listBackupTables() { return this.backups.listTables(); }\n async importFile(formData: FormData) { return this.backups.importFile(formData); }\n\n // Search shortcuts\n async search(query: string, options?: any) { return this.searchService.search(query, options); }\n async createSearchIndex(table: string, columns: string[]) { return this.searchService.createIndex(table, columns); }\n\n // GraphQL shortcuts\n async graphql(query: string, variables?: Record<string, any>) { return this.graphqlService.query(query, variables); }\n getGraphQLPlaygroundUrl() { return this.graphqlService.getPlaygroundUrl(); }\n\n // Migrations shortcuts\n async createMigration(input: any) { return this.migrations.create(input); }\n async listMigrations() { return this.migrations.list(); }\n async getMigration(id: string) { return this.migrations.get(id); }\n async applyMigration(id: string) { return this.migrations.apply(id); }\n async rollbackMigration(id: string) { return this.migrations.rollback(id); }\n async deleteMigration(id: string) { return this.migrations.delete(id); }\n async generateMigration(tableName: string, changes: any[]) { return this.migrations.generate(tableName, changes); }\n\n // Email shortcuts\n async sendEmail(input: any) { return this.email.send(input); }\n async getEmailConfig() { return this.email.getConfig(); }\n async saveEmailConfig(config: any) { return this.email.saveConfig(config); }\n async createEmailTemplate(template: any) { return this.email.createTemplate(template); }\n async listEmailTemplates() { return this.email.listTemplates(); }\n async getEmailTemplate(id: string) { return this.email.getTemplate(id); }\n async updateEmailTemplate(id: string, template: any) { return this.email.updateTemplate(id, template); }\n async deleteEmailTemplate(id: string) { return this.email.deleteTemplate(id); }\n async getEmailLogs(options?: any) { return this.email.getLogs(options); }\n\n // Metrics shortcuts\n async getDashboardStats() { return this.metrics.getDashboardStats(); }\n async getRequestLogs(options?: any) { return this.metrics.getRequestLogs(options); }\n async getApplicationLogs(options?: any) { return this.metrics.getApplicationLogs(options); }\n async getMetricTimeseries(metric: string, options?: any) { return this.metrics.getTimeseries(metric, options); }\n\n // Jobs shortcuts\n async createJob(input: any) { return this.jobs.create(input); }\n async listJobs() { return this.jobs.list(); }\n async getJob(id: string) { return this.jobs.get(id); }\n async updateJob(id: string, input: any) { return this.jobs.update(id, input); }\n async deleteJob(id: string) { return this.jobs.delete(id); }\n async toggleJob(id: string, enabled: boolean) { return this.jobs.toggle(id, enabled); }\n async runJobNow(id: string) { return this.jobs.runNow(id); }\n async getJobExecutions(id: string, limit?: number) { return this.jobs.getExecutions(id, limit); }\n\n // Env Vars shortcuts\n async createEnvVar(input: any) { return this.envVars.create(input); }\n async listEnvVars() { return this.envVars.list(); }\n async getEnvVar(id: string) { return this.envVars.get(id); }\n async updateEnvVar(id: string, value: string) { return this.envVars.update(id, value); }\n async deleteEnvVar(id: string) { return this.envVars.delete(id); }\n\n // Branches shortcuts\n async createBranch(input: any) { return this.branches.create(input); }\n async listBranches() { return this.branches.list(); }\n async getBranch(id: string) { return this.branches.get(id); }\n async deleteBranch(id: string) { return this.branches.delete(id); }\n async mergeBranch(id: string, targetBranchId: string) { return this.branches.merge(id, targetBranchId); }\n async resetBranch(id: string) { return this.branches.reset(id); }\n\n // Log Drains shortcuts\n async createLogDrain(input: any) { return this.logDrains.create(input); }\n async listLogDrains() { return this.logDrains.list(); }\n async getLogDrain(id: string) { return this.logDrains.get(id); }\n async updateLogDrain(id: string, input: any) { return this.logDrains.update(id, input); }\n async deleteLogDrain(id: string) { return this.logDrains.delete(id); }\n async toggleLogDrain(id: string, enabled: boolean) { return this.logDrains.toggle(id, enabled); }\n async testLogDrain(id: string) { return this.logDrains.test(id); }\n\n // Webhooks shortcuts\n async listWebhooks() { return this.webhooks.list(); }\n async getWebhook(id: string) { return this.webhooks.get(id); }\n async createWebhook(input: any) { return this.webhooks.create(input); }\n async updateWebhook(id: string, input: any) { return this.webhooks.update(id, input); }\n async deleteWebhook(id: string) { return this.webhooks.delete(id); }\n async testWebhook(id: string) { return this.webhooks.test(id); }\n\n // Audit shortcuts\n async listAuditLogs(options?: any) { return this.audit.list(options); }\n async getAuditActions() { return this.audit.getActions(); }\n async exportAuditLogs(format: 'csv' | 'json', options?: any) { return this.audit.exportLogs(format, options); }\n async previewPurgeAuditLogs(olderThanDays: number) { return this.audit.purgePreview(olderThanDays); }\n async purgeAuditLogs(olderThanDays: number) { return this.audit.purge(olderThanDays); }\n\n // Realtime shortcuts\n subscribe<T = any>(table: string, action: RealtimeAction, callback: RealtimeCallback<T>) {\n return this.realtime.subscribe<T>(table, action, callback);\n }\n\n // Environment shortcuts\n async getEnvironmentStatus() { return this.environments.status(); }\n async initTestEnvironment() { return this.environments.init(); }\n async promoteTestToProd() { return this.environments.promote(); }\n async revertTestEnvironment() { return this.environments.revert(); }\n\n // CORS Origins shortcuts\n async listCorsOrigins() { return this.corsOrigins.list(); }\n async addCorsOrigin(origin: string, description?: string) { return this.corsOrigins.create(origin, description); }\n async deleteCorsOrigin(id: string) { return this.corsOrigins.delete(id); }\n\n // Policies shortcuts\n async listPolicies() { return this.policies.list(); }\n async createPolicy(input: any) { return this.policies.create(input); }\n async deletePolicy(id: string) { return this.policies.delete(id); }\n\n // IP Whitelist shortcuts\n async listIPWhitelist() { return this.ipWhitelist.list(); }\n async addIPWhitelistEntry(ipAddress: string, description?: string) { return this.ipWhitelist.create(ipAddress, description); }\n async deleteIPWhitelistEntry(id: string) { return this.ipWhitelist.delete(id); }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,37 +1,62 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@giaeulate/baas-sdk",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Standalone SDK for BaaS
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
|
|
10
|
-
"
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
"
|
|
36
|
-
}
|
|
37
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "@giaeulate/baas-sdk",
|
|
3
|
+
"version": "1.3.0",
|
|
4
|
+
"description": "Standalone TypeScript SDK for golang-baas (Supabase-style BaaS) — auth, data (PostgREST), storage, realtime, functions, RPC, admin APIs. Zero runtime dependencies.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Gianluca",
|
|
7
|
+
"homepage": "https://github.com/Giaeulate/golang-baas/tree/main/sdk",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/Giaeulate/golang-baas.git",
|
|
11
|
+
"directory": "sdk"
|
|
12
|
+
},
|
|
13
|
+
"keywords": [
|
|
14
|
+
"baas",
|
|
15
|
+
"supabase",
|
|
16
|
+
"sdk",
|
|
17
|
+
"postgrest",
|
|
18
|
+
"realtime",
|
|
19
|
+
"storage",
|
|
20
|
+
"auth",
|
|
21
|
+
"rpc"
|
|
22
|
+
],
|
|
23
|
+
"main": "./dist/index.cjs",
|
|
24
|
+
"module": "./dist/index.js",
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"type": "module",
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"import": "./dist/index.js",
|
|
31
|
+
"require": "./dist/index.cjs"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"bin": {
|
|
35
|
+
"baas": "./dist/cli.js"
|
|
36
|
+
},
|
|
37
|
+
"files": [
|
|
38
|
+
"dist",
|
|
39
|
+
"LICENSE",
|
|
40
|
+
"README.md",
|
|
41
|
+
"CHANGELOG.md"
|
|
42
|
+
],
|
|
43
|
+
"publishConfig": {
|
|
44
|
+
"access": "public"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@types/node": "^25.9.1",
|
|
48
|
+
"@vitest/coverage-v8": "^4.1.7",
|
|
49
|
+
"jsdom": "^29.1.1",
|
|
50
|
+
"tsup": "^8.5.1",
|
|
51
|
+
"typescript": "~5.9.3",
|
|
52
|
+
"vitest": "^4.1.7"
|
|
53
|
+
},
|
|
54
|
+
"scripts": {
|
|
55
|
+
"build": "rm -rf dist && tsup",
|
|
56
|
+
"dev": "tsup --watch",
|
|
57
|
+
"lint": "eslint src",
|
|
58
|
+
"test": "vitest run",
|
|
59
|
+
"test:watch": "vitest",
|
|
60
|
+
"coverage": "vitest run --coverage"
|
|
61
|
+
}
|
|
62
|
+
}
|