@tspvivek/baasix-sdk 0.1.0-alpha.5 → 0.1.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{client-BeD1V4Xg.d.cts → client-BY4L9ASe.d.cts} +1 -1
- package/dist/{client-C7qJEINh.d.ts → client-BydI-nYY.d.ts} +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js.map +1 -1
- package/dist/modules/auth.cjs.map +1 -1
- package/dist/modules/auth.d.cts +1 -1
- package/dist/modules/auth.d.ts +1 -1
- package/dist/modules/auth.js.map +1 -1
- package/dist/modules/files.d.cts +1 -1
- package/dist/modules/files.d.ts +1 -1
- package/dist/modules/items.d.cts +2 -2
- package/dist/modules/items.d.ts +2 -2
- package/dist/modules/schemas.d.cts +1 -1
- package/dist/modules/schemas.d.ts +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/storage/types.ts","../src/types.ts","../src/client.ts","../src/storage/localStorage.ts","../src/storage/memoryStorage.ts","../src/modules/auth.ts","../src/modules/items.ts","../src/modules/files.ts","../src/utils/sort.ts","../src/modules/schemas.ts","../src/modules/notifications.ts","../src/modules/permissions.ts","../src/modules/settings.ts","../src/modules/reports.ts","../src/modules/workflows.ts","../src/modules/realtime.ts","../src/modules/roles.ts","../src/modules/users.ts","../src/modules/migrations.ts","../src/modules/server.ts","../src/storage/asyncStorage.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Storage adapter interface for persisting authentication state.\n * Implement this interface to create custom storage solutions (e.g., AsyncStorage for React Native).\n */\nexport interface StorageAdapter {\n /**\n * Get a value from storage\n * @param key - The storage key\n * @returns The stored value or null if not found\n */\n get(key: string): Promise<string | null> | string | null;\n\n /**\n * Set a value in storage\n * @param key - The storage key\n * @param value - The value to store\n */\n set(key: string, value: string): Promise<void> | void;\n\n /**\n * Remove a value from storage\n * @param key - The storage key\n */\n remove(key: string): Promise<void> | void;\n\n /**\n * Clear all SDK-related values from storage\n */\n clear?(): Promise<void> | void;\n}\n\n/**\n * Storage keys used by the SDK\n */\nexport const STORAGE_KEYS = {\n ACCESS_TOKEN: \"baasix_access_token\",\n REFRESH_TOKEN: \"baasix_refresh_token\",\n TOKEN_EXPIRY: \"baasix_token_expiry\",\n USER: \"baasix_user\",\n TENANT: \"baasix_tenant\",\n} as const;\n\nexport type StorageKey = (typeof STORAGE_KEYS)[keyof typeof STORAGE_KEYS];\n","import type { StorageAdapter } from \"./storage/types\";\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\n/**\n * Authentication mode for the SDK\n * - 'jwt': Use JWT tokens stored in the configured storage adapter (default)\n * - 'cookie': Use HTTP-only cookies (server handles token storage)\n */\nexport type AuthMode = \"jwt\" | \"cookie\";\n\n/**\n * SDK Configuration options\n */\nexport interface BaasixConfig {\n /**\n * The base URL of your Baasix instance\n * @example 'https://api.example.com' or 'http://localhost:8056'\n */\n url: string;\n\n /**\n * Authentication mode\n * @default 'jwt'\n */\n authMode?: AuthMode;\n\n /**\n * Storage adapter for persisting tokens and user data\n * @default LocalStorageAdapter (web) or MemoryStorageAdapter (SSR)\n */\n storage?: StorageAdapter;\n\n /**\n * Static access token (useful for server-side or service accounts)\n * When provided, this token is used instead of stored tokens\n */\n token?: string;\n\n /**\n * Custom headers to include in all requests\n */\n headers?: Record<string, string>;\n\n /**\n * Request timeout in milliseconds\n * @default 30000 (30 seconds)\n */\n timeout?: number;\n\n /**\n * Whether to automatically refresh tokens before expiry\n * @default true\n */\n autoRefresh?: boolean;\n\n /**\n * Credentials mode for fetch requests (important for cookies)\n * @default 'include' for cookie mode, 'same-origin' for jwt mode\n */\n credentials?: RequestCredentials;\n\n /**\n * Tenant ID for multi-tenant mode\n */\n tenantId?: string;\n\n /**\n * Global error handler\n */\n onError?: (error: BaasixError) => void;\n\n /**\n * Called when authentication state changes\n */\n onAuthStateChange?: (event: AuthStateEvent, user: User | null) => void;\n\n /**\n * WebSocket server URL for realtime features\n * @default Same as url\n */\n socketUrl?: string;\n\n /**\n * WebSocket path\n * @default '/socket'\n */\n socketPath?: string;\n}\n\n// ============================================================================\n// Authentication Types\n// ============================================================================\n\nexport interface User {\n id: string;\n email: string;\n firstName?: string;\n lastName?: string;\n avatar?: string;\n role?: Role;\n role_Id?: string;\n tenant_Id?: string;\n status?: string;\n createdAt?: string;\n updatedAt?: string;\n [key: string]: unknown;\n}\n\nexport interface Role {\n id: string;\n name: string;\n description?: string;\n [key: string]: unknown;\n}\n\nexport interface Tenant {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\nexport interface AuthTokens {\n accessToken: string;\n refreshToken?: string;\n expiresAt?: number;\n expiresIn?: number;\n}\n\nexport interface LoginCredentials {\n email: string;\n password: string;\n tenantId?: string;\n}\n\nexport interface RegisterData {\n email: string;\n password: string;\n firstName?: string;\n lastName?: string;\n [key: string]: unknown;\n}\n\nexport interface AuthResponse {\n token: string;\n refreshToken?: string;\n user: User;\n expiresIn?: number;\n}\n\nexport type AuthStateEvent =\n | \"SIGNED_IN\"\n | \"SIGNED_OUT\"\n | \"TOKEN_REFRESHED\"\n | \"USER_UPDATED\"\n | \"TENANT_SWITCHED\";\n\nexport interface AuthState {\n user: User | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n error: BaasixError | null;\n}\n\nexport interface MagicLinkOptions {\n email: string;\n redirectUrl?: string;\n mode?: \"link\" | \"code\";\n}\n\nexport interface PasswordResetOptions {\n email: string;\n redirectUrl?: string;\n}\n\n// ============================================================================\n// Query Types\n// ============================================================================\n\n/**\n * Filter operators supported by Baasix\n */\nexport type FilterOperator =\n // Comparison\n | \"eq\"\n | \"ne\"\n | \"neq\"\n | \"gt\"\n | \"gte\"\n | \"lt\"\n | \"lte\"\n | \"is\"\n | \"not\"\n // Collection\n | \"in\"\n | \"notIn\"\n | \"nin\"\n // String patterns\n | \"like\"\n | \"notLike\"\n | \"iLike\"\n | \"notILike\"\n | \"ilike\"\n | \"contains\"\n | \"icontains\"\n | \"ncontains\"\n | \"startsWith\"\n | \"startsWiths\"\n | \"endsWith\"\n | \"endsWiths\"\n | \"nstartsWith\"\n | \"nstartsWiths\"\n | \"nendsWith\"\n | \"nendsWiths\"\n // Range\n | \"between\"\n | \"notBetween\"\n | \"nbetween\"\n // Null\n | \"isNull\"\n | \"isNotNull\"\n // Array (PostgreSQL)\n | \"arraycontains\"\n | \"arraycontained\"\n | \"arrayoverlap\"\n | \"arraylength\"\n // JSONB\n | \"jsonbContains\"\n | \"jsonbContainedBy\"\n | \"jsonbNotContains\"\n | \"jsonbHasKey\"\n | \"jsonbHasAnyKeys\"\n | \"jsonbHasAllKeys\"\n | \"jsonbKeyEquals\"\n | \"jsonbKeyNotEquals\"\n | \"jsonbKeyGt\"\n | \"jsonbKeyGte\"\n | \"jsonbKeyLt\"\n | \"jsonbKeyLte\"\n | \"jsonbKeyIn\"\n | \"jsonbKeyNotIn\"\n | \"jsonbKeyLike\"\n | \"jsonbKeyIsNull\"\n | \"jsonbKeyIsNotNull\"\n | \"jsonbPathExists\"\n | \"jsonbPathMatch\"\n | \"jsonbDeepValue\"\n | \"jsonbArrayLength\"\n | \"jsonbTypeOf\"\n // Geospatial (PostGIS)\n | \"within\"\n | \"containsGEO\"\n | \"intersects\"\n | \"nIntersects\"\n | \"dwithin\";\n\n/**\n * Filter value with operator\n */\nexport type FilterValue<T = unknown> =\n | T\n | { [K in FilterOperator]?: T | T[] }\n | { cast?: string };\n\n/**\n * Filter condition for a field\n */\nexport type FilterCondition = {\n [field: string]: FilterValue | FilterCondition;\n};\n\n/**\n * Logical filter operators\n */\nexport interface LogicalFilter {\n AND?: (FilterCondition | LogicalFilter)[];\n OR?: (FilterCondition | LogicalFilter)[];\n NOT?: FilterCondition | LogicalFilter;\n}\n\n/**\n * Complete filter type\n */\nexport type Filter = FilterCondition | LogicalFilter;\n\n/**\n * Sort direction\n */\nexport type SortDirection = \"asc\" | \"desc\" | \"ASC\" | \"DESC\";\n\n/**\n * Sort configuration\n */\nexport type Sort =\n | string\n | string[]\n | Record<string, SortDirection>\n | { column: string; order: SortDirection }[];\n\n/**\n * Aggregation function\n */\nexport type AggregateFunction = \"count\" | \"sum\" | \"avg\" | \"min\" | \"max\";\n\n/**\n * Aggregation configuration\n */\nexport interface AggregateConfig {\n function: AggregateFunction;\n field: string;\n}\n\nexport type Aggregate = Record<string, AggregateConfig>;\n\n/**\n * Query parameters for listing items\n */\nexport interface QueryParams<T = unknown> {\n /**\n * Fields to return\n * @example ['*'], ['id', 'name'], ['*', 'author.*']\n */\n fields?: string[];\n\n /**\n * Filter conditions\n */\n filter?: Filter;\n\n /**\n * Sorting configuration\n * @example { createdAt: 'desc' } or ['-createdAt', 'name']\n */\n sort?: Sort;\n\n /**\n * Number of items per page (-1 for all)\n * @default 10\n */\n limit?: number;\n\n /**\n * Page number (1-indexed)\n * @default 1\n */\n page?: number;\n\n /**\n * Number of items to skip\n */\n offset?: number;\n\n /**\n * Full-text search query\n */\n search?: string;\n\n /**\n * Fields to search in\n */\n searchFields?: string[];\n\n /**\n * Aggregation configuration\n */\n aggregate?: Aggregate;\n\n /**\n * Fields to group by (used with aggregate)\n */\n groupBy?: string[];\n\n /**\n * Include soft-deleted items\n * @default false\n */\n paranoid?: boolean;\n\n /**\n * Filter conditions for related items (O2M/M2M)\n */\n relConditions?: Record<string, Filter>;\n\n /**\n * Additional metadata\n */\n meta?: T;\n}\n\n// ============================================================================\n// Response Types\n// ============================================================================\n\n/**\n * Paginated response\n */\nexport interface PaginatedResponse<T> {\n data: T[];\n totalCount?: number;\n page?: number;\n limit?: number;\n totalPages?: number;\n}\n\n/**\n * Single item response\n */\nexport interface SingleResponse<T> {\n data: T;\n}\n\n/**\n * Create/Update response\n */\nexport interface MutationResponse<T = string> {\n data: T;\n message?: string;\n}\n\n/**\n * Delete response\n */\nexport interface DeleteResponse {\n data: { deleted: boolean; count?: number };\n message?: string;\n}\n\n/**\n * Bulk operation response\n */\nexport interface BulkResponse<T = string[]> {\n data: T;\n message?: string;\n errors?: Array<{ index: number; error: string }>;\n}\n\n// ============================================================================\n// Schema Types\n// ============================================================================\n\nexport type FieldType =\n | \"String\"\n | \"Text\"\n | \"Integer\"\n | \"BigInt\"\n | \"Float\"\n | \"Real\"\n | \"Double\"\n | \"Decimal\"\n | \"Boolean\"\n | \"Date\"\n | \"DateTime\"\n | \"Time\"\n | \"UUID\"\n | \"SUID\"\n | \"JSON\"\n | \"JSONB\"\n | \"Array\"\n | \"Geometry\"\n | \"Point\"\n | \"LineString\"\n | \"Polygon\"\n | \"Enum\";\n\n/**\n * Default value types supported by Baasix\n */\nexport type DefaultValueType =\n | { type: \"UUIDV4\" }\n | { type: \"SUID\" }\n | { type: \"NOW\" }\n | { type: \"AUTOINCREMENT\" }\n | { type: \"SQL\"; value: string }\n | { type: \"CURRENT_USER\" }\n | { type: \"CURRENT_TENANT\" };\n\nexport interface FieldDefinition {\n type: FieldType;\n primaryKey?: boolean;\n allowNull?: boolean;\n unique?: boolean;\n /**\n * Default value for the field\n * Can be a static value or a dynamic type\n * @example\n * // Static values\n * defaultValue: \"active\"\n * defaultValue: 0\n * defaultValue: false\n * defaultValue: []\n * \n * // Dynamic types\n * defaultValue: { type: \"UUIDV4\" }\n * defaultValue: { type: \"SUID\" }\n * defaultValue: { type: \"NOW\" }\n * defaultValue: { type: \"AUTOINCREMENT\" }\n * defaultValue: { type: \"SQL\", value: \"CURRENT_DATE\" }\n */\n defaultValue?: DefaultValueType | string | number | boolean | null | unknown[] | Record<string, unknown>;\n values?: {\n length?: number;\n precision?: number;\n scale?: number;\n type?: string;\n values?: string[]; // For Enum\n };\n validate?: {\n /** Minimum value for numeric fields */\n min?: number;\n /** Maximum value for numeric fields */\n max?: number;\n /** Validate as integer */\n isInt?: boolean;\n /** String must not be empty */\n notEmpty?: boolean;\n /** Validate email format */\n isEmail?: boolean;\n /** Validate URL format */\n isUrl?: boolean;\n /** String length range [min, max] */\n len?: [number, number];\n /** Pattern matching with regex (alias: matches) */\n is?: string;\n /** Pattern matching with regex (alias: is) */\n matches?: string;\n /** @deprecated Use 'is' or 'matches' instead */\n regex?: string;\n };\n comment?: string;\n}\n\nexport interface SchemaDefinition {\n name: string;\n timestamps?: boolean;\n paranoid?: boolean;\n fields: Record<string, FieldDefinition>;\n indexes?: IndexDefinition[];\n}\n\nexport interface IndexDefinition {\n name: string;\n fields: string[];\n unique?: boolean;\n}\n\nexport type RelationshipType = \"M2O\" | \"O2M\" | \"M2M\" | \"M2A\" | \"O2O\";\n\nexport interface RelationshipDefinition {\n type: RelationshipType;\n target: string;\n name: string;\n alias?: string;\n onDelete?: \"CASCADE\" | \"RESTRICT\" | \"SET NULL\";\n onUpdate?: \"CASCADE\" | \"RESTRICT\" | \"SET NULL\";\n tables?: string[]; // For M2A\n}\n\nexport interface SchemaInfo {\n collectionName: string;\n schema: SchemaDefinition;\n relationships?: RelationshipDefinition[];\n}\n\n// ============================================================================\n// File Types\n// ============================================================================\n\nexport interface FileMetadata {\n id: string;\n title?: string;\n description?: string;\n filename: string;\n mimeType: string;\n size: number;\n width?: number;\n height?: number;\n duration?: number;\n storage: string;\n path: string;\n isPublic?: boolean;\n uploadedBy?: string;\n createdAt: string;\n updatedAt?: string;\n [key: string]: unknown;\n}\n\nexport interface UploadOptions {\n title?: string;\n description?: string;\n folder?: string;\n storage?: \"local\" | \"s3\";\n isPublic?: boolean;\n metadata?: Record<string, unknown>;\n onProgress?: (progress: number) => void;\n}\n\nexport interface AssetTransformOptions {\n width?: number;\n height?: number;\n fit?: \"cover\" | \"contain\" | \"fill\" | \"inside\" | \"outside\";\n quality?: number;\n format?: \"jpeg\" | \"png\" | \"webp\" | \"avif\";\n}\n\n// ============================================================================\n// Permission Types\n// ============================================================================\n\nexport type PermissionAction = \"create\" | \"read\" | \"update\" | \"delete\";\n\nexport interface Permission {\n id: string;\n role_Id: string;\n collection: string;\n action: PermissionAction;\n fields?: string[];\n conditions?: Filter;\n defaultValues?: Record<string, unknown>;\n relConditions?: Record<string, Filter>;\n}\n\nexport interface CreatePermissionData {\n role_Id: string;\n collection: string;\n action: PermissionAction;\n fields?: string[];\n conditions?: Filter;\n defaultValues?: Record<string, unknown>;\n relConditions?: Record<string, Filter>;\n}\n\n// ============================================================================\n// Notification Types\n// ============================================================================\n\nexport interface Notification {\n id: string;\n type: string;\n title: string;\n message: string;\n data?: Record<string, unknown>;\n seen: boolean;\n user_Id: string;\n createdAt: string;\n}\n\nexport interface SendNotificationData {\n type?: string;\n title: string;\n message: string;\n data?: Record<string, unknown>;\n userIds: string[];\n}\n\n// ============================================================================\n// Workflow Types\n// ============================================================================\n\nexport interface Workflow {\n id: string;\n name: string;\n description?: string;\n trigger: WorkflowTrigger;\n nodes: WorkflowNode[];\n edges: WorkflowEdge[];\n isActive: boolean;\n createdAt: string;\n updatedAt?: string;\n}\n\nexport interface WorkflowTrigger {\n type: \"manual\" | \"webhook\" | \"schedule\" | \"hook\";\n config?: Record<string, unknown>;\n}\n\nexport interface WorkflowNode {\n id: string;\n type: string;\n config: Record<string, unknown>;\n position?: { x: number; y: number };\n}\n\nexport interface WorkflowEdge {\n id: string;\n source: string;\n target: string;\n condition?: string;\n}\n\nexport interface WorkflowExecution {\n id: string;\n workflow_Id: string;\n status: \"pending\" | \"running\" | \"completed\" | \"failed\";\n triggerData?: Record<string, unknown>;\n result?: Record<string, unknown>;\n error?: string;\n startedAt: string;\n completedAt?: string;\n}\n\n// ============================================================================\n// Report Types\n// ============================================================================\n\nexport interface ReportConfig {\n collection: string;\n filter?: Filter;\n groupBy?: string;\n aggregate?: Aggregate;\n dateRange?: {\n start: string;\n end: string;\n field?: string;\n };\n}\n\nexport interface ReportResult {\n data: Record<string, unknown>[];\n summary?: Record<string, unknown>;\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\nexport interface BaasixErrorDetails {\n code?: string;\n field?: string;\n message?: string;\n [key: string]: unknown;\n}\n\nexport class BaasixError extends Error {\n public readonly status: number;\n public readonly code?: string;\n public readonly details?: BaasixErrorDetails[];\n public readonly isRetryable: boolean;\n\n constructor(\n message: string,\n status = 500,\n code?: string,\n details?: BaasixErrorDetails[]\n ) {\n super(message);\n this.name = \"BaasixError\";\n this.status = status;\n this.code = code;\n this.details = details;\n this.isRetryable = status >= 500 || status === 429;\n\n // Maintains proper stack trace for where error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, BaasixError);\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n code: this.code,\n details: this.details,\n };\n }\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Make all properties of T optional recursively\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\n/**\n * Extract the item type from a collection\n */\nexport type CollectionItem<T> = T extends Array<infer U> ? U : T;\n\n/**\n * Generic record type with ID\n */\nexport interface BaseItem {\n id: string;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n [key: string]: unknown;\n}\n\n/**\n * Settings configuration\n */\nexport interface Settings {\n [key: string]: unknown;\n}\n","import type { StorageAdapter } from \"./storage/types\";\nimport { STORAGE_KEYS } from \"./storage/types\";\nimport type { AuthMode, AuthTokens } from \"./types\";\nimport { BaasixError } from \"./types\";\n\nexport interface RequestOptions extends RequestInit {\n params?: Record<string, unknown>;\n timeout?: number;\n skipAuth?: boolean;\n rawResponse?: boolean;\n}\n\nexport interface HttpClientConfig {\n baseUrl: string;\n authMode: AuthMode;\n storage: StorageAdapter;\n timeout: number;\n autoRefresh: boolean;\n credentials: RequestCredentials;\n headers: Record<string, string>;\n token?: string;\n tenantId?: string;\n onAuthError?: () => void;\n onTokenRefresh?: (tokens: AuthTokens) => void;\n}\n\n/**\n * Core HTTP client for making API requests.\n * Handles authentication, token refresh, and error handling.\n */\nexport class HttpClient {\n private config: HttpClientConfig;\n private refreshPromise: Promise<AuthTokens> | null = null;\n\n constructor(config: HttpClientConfig) {\n this.config = config;\n }\n\n /**\n * Update client configuration\n */\n updateConfig(config: Partial<HttpClientConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Get the current base URL\n */\n getBaseUrl(): string {\n return this.config.baseUrl;\n }\n\n /**\n * Build the full URL with query parameters\n */\n private buildUrl(path: string, params?: Record<string, unknown>): string {\n const url = new URL(path, this.config.baseUrl);\n\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n if (typeof value === \"object\") {\n url.searchParams.set(key, JSON.stringify(value));\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n });\n }\n\n return url.toString();\n }\n\n /**\n * Get the current access token\n */\n private async getAccessToken(): Promise<string | null> {\n // Static token takes precedence\n if (this.config.token) {\n return this.config.token;\n }\n\n // Cookie mode doesn't need token header\n if (this.config.authMode === \"cookie\") {\n return null;\n }\n\n const token = await this.config.storage.get(STORAGE_KEYS.ACCESS_TOKEN);\n return token;\n }\n\n /**\n * Check if token is expired or about to expire (within 60 seconds)\n */\n private async isTokenExpired(): Promise<boolean> {\n const expiry = await this.config.storage.get(STORAGE_KEYS.TOKEN_EXPIRY);\n if (!expiry) return false;\n\n const expiryTime = parseInt(expiry, 10);\n const bufferTime = 60 * 1000; // 60 seconds buffer\n return Date.now() >= expiryTime - bufferTime;\n }\n\n /**\n * Refresh the access token\n */\n private async refreshToken(): Promise<AuthTokens> {\n // Prevent multiple simultaneous refresh requests\n if (this.refreshPromise) {\n return this.refreshPromise;\n }\n\n this.refreshPromise = (async () => {\n try {\n const refreshToken = await this.config.storage.get(\n STORAGE_KEYS.REFRESH_TOKEN\n );\n\n if (!refreshToken && this.config.authMode === \"jwt\") {\n throw new BaasixError(\"No refresh token available\", 401, \"NO_REFRESH_TOKEN\");\n }\n\n const response = await fetch(\n this.buildUrl(\"/auth/refresh\"),\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.config.headers,\n },\n body: this.config.authMode === \"jwt\" ? JSON.stringify({ refreshToken }) : undefined,\n credentials: this.config.credentials,\n }\n );\n\n if (!response.ok) {\n throw new BaasixError(\"Token refresh failed\", response.status, \"REFRESH_FAILED\");\n }\n\n const data = await response.json();\n const tokens: AuthTokens = {\n accessToken: data.token,\n refreshToken: data.refreshToken,\n expiresIn: data.expiresIn,\n expiresAt: data.expiresIn\n ? Date.now() + data.expiresIn * 1000\n : undefined,\n };\n\n // Store new tokens\n await this.config.storage.set(STORAGE_KEYS.ACCESS_TOKEN, tokens.accessToken);\n if (tokens.refreshToken) {\n await this.config.storage.set(STORAGE_KEYS.REFRESH_TOKEN, tokens.refreshToken);\n }\n if (tokens.expiresAt) {\n await this.config.storage.set(\n STORAGE_KEYS.TOKEN_EXPIRY,\n tokens.expiresAt.toString()\n );\n }\n\n this.config.onTokenRefresh?.(tokens);\n return tokens;\n } finally {\n this.refreshPromise = null;\n }\n })();\n\n return this.refreshPromise;\n }\n\n /**\n * Build request headers\n */\n private async buildHeaders(\n options: RequestOptions = {}\n ): Promise<HeadersInit> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...this.config.headers,\n };\n\n // Add tenant header if configured\n if (this.config.tenantId) {\n headers[\"X-Tenant-Id\"] = this.config.tenantId;\n }\n\n // Skip auth for public endpoints\n if (options.skipAuth) {\n return headers;\n }\n\n // Add authorization header for JWT mode\n if (this.config.authMode === \"jwt\") {\n // Check if we need to refresh\n if (this.config.autoRefresh && (await this.isTokenExpired())) {\n try {\n await this.refreshToken();\n } catch {\n // Continue without refresh if it fails\n }\n }\n\n const token = await this.getAccessToken();\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n }\n\n return headers;\n }\n\n /**\n * Parse error response\n */\n private async parseError(response: Response): Promise<BaasixError> {\n let errorData: { message?: string; error?: { message?: string; code?: string }; details?: unknown[] } = {};\n\n try {\n errorData = await response.json();\n } catch {\n // Response might not be JSON\n }\n\n const message =\n errorData.error?.message ||\n errorData.message ||\n response.statusText ||\n \"Request failed\";\n\n const code = errorData.error?.code;\n const details = errorData.details as { code?: string; field?: string; message?: string }[] | undefined;\n\n return new BaasixError(message, response.status, code, details);\n }\n\n /**\n * Make an HTTP request\n */\n async request<T>(\n method: string,\n path: string,\n options: RequestOptions = {}\n ): Promise<T> {\n const { params, timeout, skipAuth, rawResponse, ...fetchOptions } = options;\n\n const url = this.buildUrl(path, params);\n const headers = await this.buildHeaders({ skipAuth });\n const requestTimeout = timeout || this.config.timeout;\n\n // Setup abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), requestTimeout);\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n ...headers,\n ...(fetchOptions.headers as Record<string, string>),\n },\n credentials: this.config.credentials,\n signal: controller.signal,\n ...fetchOptions,\n });\n\n // Handle 401 - try to refresh token and retry\n if (response.status === 401 && !skipAuth && this.config.autoRefresh) {\n try {\n await this.refreshToken();\n\n // Retry the request with new token\n const retryHeaders = await this.buildHeaders({ skipAuth: false });\n const retryResponse = await fetch(url, {\n method,\n headers: {\n ...retryHeaders,\n ...(fetchOptions.headers as Record<string, string>),\n },\n credentials: this.config.credentials,\n ...fetchOptions,\n });\n\n if (!retryResponse.ok) {\n throw await this.parseError(retryResponse);\n }\n\n if (rawResponse) {\n return retryResponse as unknown as T;\n }\n\n // Handle no-content responses\n if (retryResponse.status === 204) {\n return {} as T;\n }\n\n return await retryResponse.json();\n } catch (refreshError) {\n // Refresh failed, trigger auth error callback\n this.config.onAuthError?.();\n throw refreshError;\n }\n }\n\n if (!response.ok) {\n throw await this.parseError(response);\n }\n\n if (rawResponse) {\n return response as unknown as T;\n }\n\n // Handle no-content responses\n if (response.status === 204) {\n return {} as T;\n }\n\n return await response.json();\n } catch (error) {\n if (error instanceof BaasixError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n throw new BaasixError(\"Request timeout\", 408, \"TIMEOUT\");\n }\n throw new BaasixError(error.message, 0, \"NETWORK_ERROR\");\n }\n\n throw new BaasixError(\"Unknown error occurred\", 500, \"UNKNOWN\");\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * GET request\n */\n get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>(\"GET\", path, options);\n }\n\n /**\n * POST request\n */\n post<T>(path: string, data?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>(\"POST\", path, {\n ...options,\n body: data ? JSON.stringify(data) : undefined,\n });\n }\n\n /**\n * PATCH request\n */\n patch<T>(path: string, data?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>(\"PATCH\", path, {\n ...options,\n body: data ? JSON.stringify(data) : undefined,\n });\n }\n\n /**\n * PUT request\n */\n put<T>(path: string, data?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>(\"PUT\", path, {\n ...options,\n body: data ? JSON.stringify(data) : undefined,\n });\n }\n\n /**\n * DELETE request\n */\n delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>(\"DELETE\", path, options);\n }\n\n /**\n * Upload file with multipart/form-data\n */\n async upload<T>(\n path: string,\n formData: FormData,\n options?: Omit<RequestOptions, \"body\"> & {\n onProgress?: (progress: number) => void;\n }\n ): Promise<T> {\n const { params, timeout, skipAuth, onProgress } = options || {};\n\n const url = this.buildUrl(path, params);\n const headers = await this.buildHeaders({ skipAuth });\n const requestTimeout = timeout || this.config.timeout;\n\n // Remove Content-Type to let browser set it with boundary\n delete (headers as Record<string, string>)[\"Content-Type\"];\n\n // Use XMLHttpRequest for progress support\n if (onProgress && typeof XMLHttpRequest !== \"undefined\") {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open(\"POST\", url);\n\n // Set headers\n Object.entries(headers as Record<string, string>).forEach(\n ([key, value]) => {\n xhr.setRequestHeader(key, value);\n }\n );\n\n xhr.withCredentials = this.config.credentials === \"include\";\n\n xhr.upload.onprogress = (event) => {\n if (event.lengthComputable) {\n const progress = Math.round((event.loaded / event.total) * 100);\n onProgress(progress);\n }\n };\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n resolve(JSON.parse(xhr.responseText));\n } catch {\n resolve({} as T);\n }\n } else {\n reject(\n new BaasixError(\n xhr.statusText || \"Upload failed\",\n xhr.status,\n \"UPLOAD_ERROR\"\n )\n );\n }\n };\n\n xhr.onerror = () => {\n reject(new BaasixError(\"Network error during upload\", 0, \"NETWORK_ERROR\"));\n };\n\n xhr.ontimeout = () => {\n reject(new BaasixError(\"Upload timeout\", 408, \"TIMEOUT\"));\n };\n\n xhr.timeout = requestTimeout;\n xhr.send(formData);\n });\n }\n\n // Fallback to fetch without progress\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), requestTimeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: formData,\n credentials: this.config.credentials,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw await this.parseError(response);\n }\n\n return await response.json();\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n","import type { StorageAdapter } from \"./types\";\n\n/**\n * LocalStorage adapter for web browsers.\n * This is the default storage adapter used when running in a browser environment.\n *\n * @example\n * ```typescript\n * import { createBaasix, LocalStorageAdapter } from '@baasix/sdk';\n *\n * const client = createBaasix({\n * url: 'https://api.example.com',\n * storage: new LocalStorageAdapter(),\n * });\n * ```\n */\nexport class LocalStorageAdapter implements StorageAdapter {\n private prefix: string;\n\n constructor(prefix = \"baasix_\") {\n this.prefix = prefix;\n }\n\n private getKey(key: string): string {\n // If key already starts with prefix, don't add it again\n if (key.startsWith(this.prefix)) {\n return key;\n }\n return `${this.prefix}${key}`;\n }\n\n get(key: string): string | null {\n if (typeof window === \"undefined\" || !window.localStorage) {\n return null;\n }\n try {\n return localStorage.getItem(this.getKey(key));\n } catch {\n console.warn(`[Baasix SDK] Failed to get item from localStorage: ${key}`);\n return null;\n }\n }\n\n set(key: string, value: string): void {\n if (typeof window === \"undefined\" || !window.localStorage) {\n return;\n }\n try {\n localStorage.setItem(this.getKey(key), value);\n } catch {\n console.warn(`[Baasix SDK] Failed to set item in localStorage: ${key}`);\n }\n }\n\n remove(key: string): void {\n if (typeof window === \"undefined\" || !window.localStorage) {\n return;\n }\n try {\n localStorage.removeItem(this.getKey(key));\n } catch {\n console.warn(`[Baasix SDK] Failed to remove item from localStorage: ${key}`);\n }\n }\n\n clear(): void {\n if (typeof window === \"undefined\" || !window.localStorage) {\n return;\n }\n try {\n const keysToRemove: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.prefix)) {\n keysToRemove.push(key);\n }\n }\n keysToRemove.forEach((key) => localStorage.removeItem(key));\n } catch {\n console.warn(\"[Baasix SDK] Failed to clear localStorage\");\n }\n }\n}\n","import type { StorageAdapter } from \"./types\";\n\n/**\n * In-memory storage adapter.\n * Useful for server-side rendering (SSR), testing, or environments without persistent storage.\n * Data is lost when the application restarts.\n *\n * @example\n * ```typescript\n * import { createBaasix, MemoryStorageAdapter } from '@baasix/sdk';\n *\n * const client = createBaasix({\n * url: 'https://api.example.com',\n * storage: new MemoryStorageAdapter(),\n * });\n * ```\n */\nexport class MemoryStorageAdapter implements StorageAdapter {\n private store: Map<string, string>;\n\n constructor() {\n this.store = new Map();\n }\n\n get(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n set(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n remove(key: string): void {\n this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n\n /**\n * Get all stored keys (useful for debugging)\n */\n keys(): string[] {\n return Array.from(this.store.keys());\n }\n\n /**\n * Get the number of stored items\n */\n size(): number {\n return this.store.size;\n }\n}\n","import type { HttpClient } from \"../client\";\nimport type { StorageAdapter } from \"../storage/types\";\nimport { STORAGE_KEYS } from \"../storage/types\";\nimport type {\n AuthMode,\n AuthResponse,\n AuthState,\n AuthStateEvent,\n AuthTokens,\n LoginCredentials,\n MagicLinkOptions,\n PasswordResetOptions,\n RegisterData,\n Tenant,\n User,\n} from \"../types\";\nimport { BaasixError } from \"../types\";\n\nexport type OAuthProvider = \"google\" | \"facebook\" | \"apple\" | \"github\";\n\nexport interface OAuthOptions {\n provider: OAuthProvider;\n redirectUrl: string;\n scopes?: string[];\n state?: string;\n}\n\nexport interface InviteOptions {\n email: string;\n roleId: string;\n tenantId?: string;\n redirectUrl: string;\n}\n\nexport interface VerifyInviteResult {\n valid: boolean;\n email?: string;\n tenantId?: string;\n roleId?: string;\n}\n\nexport interface AuthModuleConfig {\n client: HttpClient;\n storage: StorageAdapter;\n authMode: AuthMode;\n onAuthStateChange?: (event: AuthStateEvent, user: User | null) => void;\n}\n\n/**\n * Authentication module for handling user authentication, sessions, and token management.\n *\n * @example\n * ```typescript\n * // Login\n * const { user, token } = await baasix.auth.login({\n * email: 'user@example.com',\n * password: 'password123'\n * });\n *\n * // Get current user\n * const user = await baasix.auth.getUser();\n *\n * // Logout\n * await baasix.auth.logout();\n * ```\n */\nexport class AuthModule {\n private client: HttpClient;\n private storage: StorageAdapter;\n private authMode: AuthMode;\n private onAuthStateChange?: (event: AuthStateEvent, user: User | null) => void;\n private currentUser: User | null = null;\n\n constructor(config: AuthModuleConfig) {\n this.client = config.client;\n this.storage = config.storage;\n this.authMode = config.authMode;\n this.onAuthStateChange = config.onAuthStateChange;\n }\n\n /**\n * Emit an authentication state change event\n */\n private emitAuthStateChange(event: AuthStateEvent, user: User | null): void {\n this.currentUser = user;\n this.onAuthStateChange?.(event, user);\n }\n\n /**\n * Store authentication tokens\n */\n private async storeTokens(response: AuthResponse): Promise<void> {\n if (this.authMode === \"jwt\") {\n await this.storage.set(STORAGE_KEYS.ACCESS_TOKEN, response.token);\n\n if (response.refreshToken) {\n await this.storage.set(STORAGE_KEYS.REFRESH_TOKEN, response.refreshToken);\n }\n\n if (response.expiresIn) {\n const expiresAt = Date.now() + response.expiresIn * 1000;\n await this.storage.set(STORAGE_KEYS.TOKEN_EXPIRY, expiresAt.toString());\n }\n }\n\n // Store user info\n if (response.user) {\n await this.storage.set(STORAGE_KEYS.USER, JSON.stringify(response.user));\n }\n }\n\n /**\n * Clear stored authentication data\n */\n private async clearAuth(): Promise<void> {\n await this.storage.remove(STORAGE_KEYS.ACCESS_TOKEN);\n await this.storage.remove(STORAGE_KEYS.REFRESH_TOKEN);\n await this.storage.remove(STORAGE_KEYS.TOKEN_EXPIRY);\n await this.storage.remove(STORAGE_KEYS.USER);\n await this.storage.remove(STORAGE_KEYS.TENANT);\n this.currentUser = null;\n }\n\n /**\n * Register a new user\n *\n * @example\n * ```typescript\n * const { user, token } = await baasix.auth.register({\n * email: 'newuser@example.com',\n * password: 'securepassword',\n * firstName: 'John',\n * lastName: 'Doe'\n * });\n * ```\n */\n async register(data: RegisterData): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\"/auth/register\", data, {\n skipAuth: true,\n });\n\n await this.storeTokens(response);\n this.emitAuthStateChange(\"SIGNED_IN\", response.user);\n\n return response;\n }\n\n /**\n * Login with email and password\n *\n * @example\n * ```typescript\n * const { user, token } = await baasix.auth.login({\n * email: 'user@example.com',\n * password: 'password123'\n * });\n *\n * // Login with tenant (multi-tenant mode)\n * const result = await baasix.auth.login({\n * email: 'user@example.com',\n * password: 'password123',\n * tenantId: 'tenant-uuid'\n * });\n * ```\n */\n async login(credentials: LoginCredentials): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\n \"/auth/login\",\n {\n email: credentials.email,\n password: credentials.password,\n tenant_Id: credentials.tenantId,\n },\n { skipAuth: true }\n );\n\n await this.storeTokens(response);\n this.emitAuthStateChange(\"SIGNED_IN\", response.user);\n\n return response;\n }\n\n /**\n * Logout the current user\n *\n * @example\n * ```typescript\n * await baasix.auth.logout();\n * ```\n */\n async logout(): Promise<void> {\n try {\n await this.client.get(\"/auth/logout\");\n } catch {\n // Ignore logout errors - we still want to clear local state\n }\n\n await this.clearAuth();\n this.emitAuthStateChange(\"SIGNED_OUT\", null);\n }\n\n /**\n * Get the current authenticated user from the server\n *\n * @example\n * ```typescript\n * const user = await baasix.auth.getUser();\n * console.log(user?.email);\n * ```\n */\n async getUser(): Promise<User | null> {\n try {\n const response = await this.client.get<{ data: User }>(\"/auth/me\");\n this.currentUser = response.data;\n await this.storage.set(STORAGE_KEYS.USER, JSON.stringify(response.data));\n return response.data;\n } catch (error) {\n if (error instanceof BaasixError && error.status === 401) {\n await this.clearAuth();\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Get the cached current user (does not make an API call)\n *\n * @example\n * ```typescript\n * const user = await baasix.auth.getCachedUser();\n * ```\n */\n async getCachedUser(): Promise<User | null> {\n if (this.currentUser) {\n return this.currentUser;\n }\n\n const userJson = await this.storage.get(STORAGE_KEYS.USER);\n if (userJson) {\n try {\n this.currentUser = JSON.parse(userJson);\n return this.currentUser;\n } catch {\n return null;\n }\n }\n\n return null;\n }\n\n /**\n * Check if user is authenticated (has valid token)\n *\n * @example\n * ```typescript\n * if (await baasix.auth.isAuthenticated()) {\n * // User is logged in\n * }\n * ```\n */\n async isAuthenticated(): Promise<boolean> {\n if (this.authMode === \"cookie\") {\n // For cookie mode, try to get user\n const user = await this.getCachedUser();\n return user !== null;\n }\n\n const token = await this.storage.get(STORAGE_KEYS.ACCESS_TOKEN);\n if (!token) return false;\n\n // Check expiry\n const expiry = await this.storage.get(STORAGE_KEYS.TOKEN_EXPIRY);\n if (expiry && Date.now() >= parseInt(expiry, 10)) {\n // Token expired, check if we have refresh token\n const refreshToken = await this.storage.get(STORAGE_KEYS.REFRESH_TOKEN);\n return !!refreshToken;\n }\n\n return true;\n }\n\n /**\n * Get the current access token\n *\n * @example\n * ```typescript\n * const token = await baasix.auth.getToken();\n * ```\n */\n async getToken(): Promise<string | null> {\n if (this.authMode === \"cookie\") {\n return null;\n }\n return await this.storage.get(STORAGE_KEYS.ACCESS_TOKEN);\n }\n\n /**\n * Set a static token (useful for server-side or service accounts)\n *\n * @example\n * ```typescript\n * baasix.auth.setToken('your-api-token');\n * ```\n */\n async setToken(token: string): Promise<void> {\n await this.storage.set(STORAGE_KEYS.ACCESS_TOKEN, token);\n }\n\n /**\n * Refresh the current token\n *\n * @example\n * ```typescript\n * const tokens = await baasix.auth.refreshToken();\n * ```\n */\n async refreshToken(): Promise<AuthTokens> {\n const refreshToken = await this.storage.get(STORAGE_KEYS.REFRESH_TOKEN);\n\n const response = await this.client.post<AuthResponse>(\n \"/auth/refresh\",\n this.authMode === \"jwt\" ? { refreshToken } : undefined\n );\n\n await this.storeTokens(response);\n\n const tokens: AuthTokens = {\n accessToken: response.token,\n refreshToken: response.refreshToken,\n expiresIn: response.expiresIn,\n expiresAt: response.expiresIn\n ? Date.now() + response.expiresIn * 1000\n : undefined,\n };\n\n this.emitAuthStateChange(\"TOKEN_REFRESHED\", response.user);\n\n return tokens;\n }\n\n /**\n * Request a magic link for passwordless login\n *\n * @example\n * ```typescript\n * await baasix.auth.sendMagicLink({\n * email: 'user@example.com',\n * redirectUrl: 'https://myapp.com/auth/callback'\n * });\n * ```\n */\n async sendMagicLink(options: MagicLinkOptions): Promise<void> {\n await this.client.post(\n \"/auth/magiclink\",\n {\n email: options.email,\n link: options.redirectUrl,\n mode: options.mode || \"link\",\n },\n { skipAuth: true }\n );\n }\n\n /**\n * Verify magic link/code and complete login\n *\n * @example\n * ```typescript\n * const { user, token } = await baasix.auth.verifyMagicLink('verification-token');\n * ```\n */\n async verifyMagicLink(token: string): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\n \"/auth/magiclink/verify\",\n { token },\n { skipAuth: true }\n );\n\n await this.storeTokens(response);\n this.emitAuthStateChange(\"SIGNED_IN\", response.user);\n\n return response;\n }\n\n /**\n * Request a password reset\n *\n * @example\n * ```typescript\n * await baasix.auth.forgotPassword({\n * email: 'user@example.com',\n * redirectUrl: 'https://myapp.com/reset-password'\n * });\n * ```\n */\n async forgotPassword(options: PasswordResetOptions): Promise<void> {\n await this.client.post(\n \"/auth/forgot-password\",\n {\n email: options.email,\n link: options.redirectUrl,\n },\n { skipAuth: true }\n );\n }\n\n /**\n * Reset password using a reset token\n *\n * @example\n * ```typescript\n * await baasix.auth.resetPassword('reset-token', 'newpassword123');\n * ```\n */\n async resetPassword(token: string, newPassword: string): Promise<void> {\n await this.client.post(\n \"/auth/reset-password\",\n { token, password: newPassword },\n { skipAuth: true }\n );\n }\n\n /**\n * Change the current user's password\n *\n * @example\n * ```typescript\n * await baasix.auth.changePassword('currentPassword', 'newPassword');\n * ```\n */\n async changePassword(\n currentPassword: string,\n newPassword: string\n ): Promise<void> {\n await this.client.post(\"/auth/change-password\", {\n currentPassword,\n newPassword,\n });\n }\n\n /**\n * Update the current user's profile\n *\n * @example\n * ```typescript\n * const updatedUser = await baasix.auth.updateProfile({\n * firstName: 'Jane',\n * lastName: 'Doe'\n * });\n * ```\n */\n async updateProfile(data: Partial<User>): Promise<User> {\n const response = await this.client.patch<{ data: User }>(\"/auth/me\", data);\n await this.storage.set(STORAGE_KEYS.USER, JSON.stringify(response.data));\n this.emitAuthStateChange(\"USER_UPDATED\", response.data);\n return response.data;\n }\n\n /**\n * Get available tenants for the current user (multi-tenant mode)\n *\n * @example\n * ```typescript\n * const tenants = await baasix.auth.getTenants();\n * ```\n */\n async getTenants(): Promise<Tenant[]> {\n const response = await this.client.get<{ data: Tenant[] }>(\"/auth/tenants\");\n return response.data;\n }\n\n /**\n * Switch to a different tenant (multi-tenant mode)\n *\n * @example\n * ```typescript\n * const { user, token } = await baasix.auth.switchTenant('tenant-uuid');\n * ```\n */\n async switchTenant(tenantId: string): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\"/auth/switch-tenant\", {\n tenant_Id: tenantId,\n });\n\n await this.storeTokens(response);\n await this.storage.set(STORAGE_KEYS.TENANT, tenantId);\n this.emitAuthStateChange(\"TENANT_SWITCHED\", response.user);\n\n return response;\n }\n\n /**\n * Get the current authentication state\n *\n * @example\n * ```typescript\n * const state = await baasix.auth.getState();\n * console.log(state.isAuthenticated, state.user);\n * ```\n */\n async getState(): Promise<AuthState> {\n const isAuthenticated = await this.isAuthenticated();\n const user = await this.getCachedUser();\n\n return {\n user,\n isAuthenticated,\n isLoading: false,\n error: null,\n };\n }\n\n /**\n * Initialize authentication state from storage\n * Call this on app startup to restore previous session\n *\n * @example\n * ```typescript\n * await baasix.auth.initialize();\n * ```\n */\n async initialize(): Promise<AuthState> {\n const state = await this.getState();\n\n if (state.isAuthenticated && state.user) {\n this.emitAuthStateChange(\"SIGNED_IN\", state.user);\n }\n\n return state;\n }\n\n // ===================\n // OAuth / Social Login\n // ===================\n\n /**\n * Get the OAuth authorization URL for a provider\n * Redirect the user to this URL to start the OAuth flow\n * \n * @example\n * ```typescript\n * const url = baasix.auth.getOAuthUrl({\n * provider: 'google',\n * redirectUrl: 'https://myapp.com/auth/callback'\n * });\n * window.location.href = url;\n * ```\n */\n getOAuthUrl(options: OAuthOptions): string {\n const baseUrl = this.client.getBaseUrl();\n const params = new URLSearchParams({\n redirect_url: options.redirectUrl,\n });\n \n if (options.scopes?.length) {\n params.set(\"scopes\", options.scopes.join(\",\"));\n }\n if (options.state) {\n params.set(\"state\", options.state);\n }\n\n return `${baseUrl}/auth/signin/${options.provider}?${params.toString()}`;\n }\n\n /**\n * Handle OAuth callback and complete login\n * Call this from your callback page with the token from URL\n * \n * @example\n * ```typescript\n * // In your callback page\n * const params = new URLSearchParams(window.location.search);\n * const token = params.get('token');\n * \n * if (token) {\n * await baasix.auth.handleOAuthCallback(token);\n * }\n * ```\n */\n async handleOAuthCallback(token: string): Promise<AuthResponse> {\n // Store the token\n await this.storage.set(STORAGE_KEYS.ACCESS_TOKEN, token);\n \n // Get user info\n const user = await this.getUser();\n \n const response: AuthResponse = {\n token,\n user: user!,\n };\n \n this.emitAuthStateChange(\"SIGNED_IN\", user);\n return response;\n }\n\n // ===================\n // Email Verification\n // ===================\n\n /**\n * Request email verification\n * Sends a verification email to the current user\n * \n * @example\n * ```typescript\n * await baasix.auth.requestEmailVerification('https://myapp.com/verify-email');\n * ```\n */\n async requestEmailVerification(redirectUrl: string): Promise<void> {\n await this.client.post(\"/auth/request-verify-email\", {\n link: redirectUrl,\n });\n }\n\n /**\n * Verify email with token\n * \n * @example\n * ```typescript\n * const params = new URLSearchParams(window.location.search);\n * const token = params.get('token');\n * \n * await baasix.auth.verifyEmail(token);\n * ```\n */\n async verifyEmail(token: string): Promise<void> {\n await this.client.get(\"/auth/verify-email\", {\n params: { token },\n skipAuth: true,\n });\n }\n\n /**\n * Check if current session/token is valid\n * \n * @example\n * ```typescript\n * const isValid = await baasix.auth.checkSession();\n * ```\n */\n async checkSession(): Promise<boolean> {\n try {\n const response = await this.client.get<{ data: { valid: boolean } }>(\"/auth/check\");\n return response.data.valid;\n } catch {\n return false;\n }\n }\n\n // ===================\n // Invitation System\n // ===================\n\n /**\n * Send an invitation to a user (multi-tenant mode)\n * \n * @example\n * ```typescript\n * await baasix.auth.sendInvite({\n * email: 'newuser@example.com',\n * roleId: 'role-uuid',\n * tenantId: 'tenant-uuid',\n * redirectUrl: 'https://myapp.com/accept-invite'\n * });\n * ```\n */\n async sendInvite(options: InviteOptions): Promise<void> {\n await this.client.post(\"/auth/invite\", {\n email: options.email,\n role_Id: options.roleId,\n tenant_Id: options.tenantId,\n link: options.redirectUrl,\n });\n }\n\n /**\n * Verify an invitation token\n * \n * @example\n * ```typescript\n * const params = new URLSearchParams(window.location.search);\n * const token = params.get('token');\n * \n * const result = await baasix.auth.verifyInvite(token);\n * if (result.valid) {\n * // Show registration form with pre-filled email\n * }\n * ```\n */\n async verifyInvite(token: string, redirectUrl?: string): Promise<VerifyInviteResult> {\n const response = await this.client.get<{ data: VerifyInviteResult }>(\n \"/auth/verify-invite\",\n {\n params: { \n token,\n link: redirectUrl,\n },\n skipAuth: true,\n }\n );\n return response.data;\n }\n\n /**\n * Accept an invitation (for existing users)\n * \n * @example\n * ```typescript\n * await baasix.auth.acceptInvite(token);\n * ```\n */\n async acceptInvite(token: string): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\n \"/auth/accept-invite\",\n { token }\n );\n \n await this.storeTokens(response);\n this.emitAuthStateChange(\"SIGNED_IN\", response.user);\n \n return response;\n }\n\n /**\n * Register with an invitation token\n * \n * @example\n * ```typescript\n * const { user, token } = await baasix.auth.registerWithInvite({\n * email: 'user@example.com',\n * password: 'password',\n * firstName: 'John',\n * lastName: 'Doe',\n * inviteToken: 'invite-token'\n * });\n * ```\n */\n async registerWithInvite(data: RegisterData & { inviteToken: string }): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\n \"/auth/register\",\n {\n ...data,\n inviteToken: data.inviteToken,\n },\n { skipAuth: true }\n );\n\n await this.storeTokens(response);\n this.emitAuthStateChange(\"SIGNED_IN\", response.user);\n\n return response;\n }\n}\n\n// Re-export types from types.ts\nexport type {\n AuthResponse,\n AuthState,\n AuthStateEvent,\n AuthTokens,\n LoginCredentials,\n MagicLinkOptions,\n PasswordResetOptions,\n RegisterData,\n Tenant,\n User,\n};\n","import type { HttpClient } from \"../client\";\nimport type {\n BaseItem,\n BulkResponse,\n DeleteResponse,\n Filter,\n MutationResponse,\n PaginatedResponse,\n QueryParams,\n SingleResponse,\n Sort,\n} from \"../types\";\n\nexport interface ItemsModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Query builder for constructing type-safe queries\n */\nexport class QueryBuilder<T extends BaseItem = BaseItem> {\n private collection: string;\n private client: HttpClient;\n private queryParams: QueryParams = {};\n\n constructor(collection: string, client: HttpClient) {\n this.collection = collection;\n this.client = client;\n }\n\n /**\n * Select specific fields to return\n *\n * @example\n * ```typescript\n * items.select(['id', 'name', 'author.*'])\n * items.select('*', 'category.name')\n * ```\n */\n select(...fields: string[] | [string[]]): this {\n const flatFields = fields.length === 1 && Array.isArray(fields[0])\n ? fields[0]\n : (fields as string[]);\n this.queryParams.fields = flatFields;\n return this;\n }\n\n /**\n * Alias for select()\n */\n fields(...fields: string[] | [string[]]): this {\n return this.select(...fields);\n }\n\n /**\n * Add filter conditions\n *\n * @example\n * ```typescript\n * // Simple equality\n * items.filter({ status: { eq: 'active' } })\n *\n * // Multiple conditions\n * items.filter({\n * AND: [\n * { status: { eq: 'active' } },\n * { price: { gte: 100 } }\n * ]\n * })\n *\n * // Relation filtering\n * items.filter({ 'author.name': { like: 'John' } })\n * ```\n */\n filter(filter: Filter): this {\n this.queryParams.filter = filter;\n return this;\n }\n\n /**\n * Alias for filter()\n */\n where(filter: Filter): this {\n return this.filter(filter);\n }\n\n /**\n * Sort results\n *\n * @example\n * ```typescript\n * // Object notation\n * items.sort({ createdAt: 'desc', name: 'asc' })\n *\n * // Array notation with prefix\n * items.sort(['-createdAt', 'name'])\n *\n * // String shorthand\n * items.sort('createdAt:desc')\n * ```\n */\n sort(sort: Sort): this {\n this.queryParams.sort = sort;\n return this;\n }\n\n /**\n * Alias for sort()\n */\n orderBy(sort: Sort): this {\n return this.sort(sort);\n }\n\n /**\n * Limit number of results\n *\n * @example\n * ```typescript\n * items.limit(20)\n * items.limit(-1) // All results\n * ```\n */\n limit(limit: number): this {\n this.queryParams.limit = limit;\n return this;\n }\n\n /**\n * Set page number (1-indexed)\n *\n * @example\n * ```typescript\n * items.page(2).limit(20)\n * ```\n */\n page(page: number): this {\n this.queryParams.page = page;\n return this;\n }\n\n /**\n * Skip a number of results\n *\n * @example\n * ```typescript\n * items.offset(20)\n * ```\n */\n offset(offset: number): this {\n this.queryParams.offset = offset;\n return this;\n }\n\n /**\n * Full-text search\n *\n * @example\n * ```typescript\n * items.search('keyword', ['title', 'description'])\n * ```\n */\n search(query: string, fields?: string[]): this {\n this.queryParams.search = query;\n if (fields) {\n this.queryParams.searchFields = fields;\n }\n return this;\n }\n\n /**\n * Include soft-deleted items\n *\n * @example\n * ```typescript\n * items.withDeleted()\n * ```\n */\n withDeleted(): this {\n this.queryParams.paranoid = false;\n return this;\n }\n\n /**\n * Filter related items in O2M/M2M relations\n *\n * @example\n * ```typescript\n * // Only show approved comments\n * items.relFilter({\n * comments: { approved: { eq: true } }\n * })\n * ```\n */\n relFilter(conditions: Record<string, Filter>): this {\n this.queryParams.relConditions = conditions;\n return this;\n }\n\n /**\n * Get the built query parameters\n */\n getQuery(): QueryParams {\n return { ...this.queryParams };\n }\n\n /**\n * Execute the query and return results\n *\n * @example\n * ```typescript\n * const { data, totalCount } = await items\n * .filter({ status: { eq: 'active' } })\n * .sort({ createdAt: 'desc' })\n * .limit(10)\n * .get();\n * ```\n */\n async get(): Promise<PaginatedResponse<T>> {\n return this.client.get<PaginatedResponse<T>>(`/items/${this.collection}`, {\n params: this.buildParams(),\n });\n }\n\n /**\n * Execute the query and return the first result\n *\n * @example\n * ```typescript\n * const item = await items\n * .filter({ slug: { eq: 'my-post' } })\n * .first();\n * ```\n */\n async first(): Promise<T | null> {\n const result = await this.limit(1).get();\n return result.data[0] || null;\n }\n\n /**\n * Count matching items\n *\n * @example\n * ```typescript\n * const count = await items.filter({ status: { eq: 'active' } }).count();\n * ```\n */\n async count(): Promise<number> {\n const result = await this.client.get<PaginatedResponse<T>>(\n `/items/${this.collection}`,\n {\n params: {\n ...this.buildParams(),\n limit: 0,\n },\n }\n );\n return result.totalCount || 0;\n }\n\n /**\n * Build query parameters for the request\n */\n private buildParams(): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n if (this.queryParams.fields) {\n params.fields = this.queryParams.fields;\n }\n if (this.queryParams.filter) {\n params.filter = this.queryParams.filter;\n }\n if (this.queryParams.sort) {\n params.sort = this.queryParams.sort;\n }\n if (this.queryParams.limit !== undefined) {\n params.limit = this.queryParams.limit;\n }\n if (this.queryParams.page !== undefined) {\n params.page = this.queryParams.page;\n }\n if (this.queryParams.offset !== undefined) {\n params.offset = this.queryParams.offset;\n }\n if (this.queryParams.search) {\n params.search = this.queryParams.search;\n }\n if (this.queryParams.searchFields) {\n params.searchFields = this.queryParams.searchFields;\n }\n if (this.queryParams.paranoid !== undefined) {\n params.paranoid = this.queryParams.paranoid;\n }\n if (this.queryParams.relConditions) {\n params.relConditions = this.queryParams.relConditions;\n }\n if (this.queryParams.aggregate) {\n params.aggregate = this.queryParams.aggregate;\n }\n if (this.queryParams.groupBy) {\n params.groupBy = this.queryParams.groupBy;\n }\n\n return params;\n }\n}\n\n/**\n * Items module for CRUD operations on collections.\n *\n * @example\n * ```typescript\n * const items = baasix.items('products');\n *\n * // List items\n * const products = await items.find({ filter: { status: { eq: 'active' } } });\n *\n * // Get single item\n * const product = await items.findOne('product-id');\n *\n * // Create item\n * const newProduct = await items.create({ name: 'Widget', price: 29.99 });\n *\n * // Update item\n * await items.update('product-id', { price: 24.99 });\n *\n * // Delete item\n * await items.delete('product-id');\n * ```\n */\nexport class ItemsModule<T extends BaseItem = BaseItem> {\n private collection: string;\n private client: HttpClient;\n\n constructor(collection: string, config: ItemsModuleConfig) {\n this.collection = collection;\n this.client = config.client;\n }\n\n /**\n * Create a query builder for fluent query construction\n *\n * @example\n * ```typescript\n * const results = await baasix.items('posts')\n * .query()\n * .select('*', 'author.*')\n * .filter({ status: { eq: 'published' } })\n * .sort({ createdAt: 'desc' })\n * .limit(10)\n * .get();\n * ```\n */\n query(): QueryBuilder<T> {\n return new QueryBuilder<T>(this.collection, this.client);\n }\n\n /**\n * Find items with optional query parameters\n *\n * @example\n * ```typescript\n * // Simple query\n * const { data } = await items.find();\n *\n * // With parameters\n * const { data, totalCount } = await items.find({\n * filter: { status: { eq: 'active' } },\n * sort: { createdAt: 'desc' },\n * limit: 20,\n * page: 1,\n * fields: ['id', 'name', 'price']\n * });\n * ```\n */\n async find(params?: QueryParams): Promise<PaginatedResponse<T>> {\n return this.client.get<PaginatedResponse<T>>(`/items/${this.collection}`, {\n params: params as Record<string, unknown>,\n });\n }\n\n /**\n * Alias for find()\n */\n async findMany(params?: QueryParams): Promise<PaginatedResponse<T>> {\n return this.find(params);\n }\n\n /**\n * Find a single item by ID\n *\n * @example\n * ```typescript\n * const product = await items.findOne('product-uuid');\n *\n * // With specific fields\n * const product = await items.findOne('product-uuid', {\n * fields: ['id', 'name', 'category.*']\n * });\n * ```\n */\n async findOne(\n id: string,\n params?: Pick<QueryParams, \"fields\">\n ): Promise<T> {\n const response = await this.client.get<SingleResponse<T>>(\n `/items/${this.collection}/${id}`,\n { params: params as Record<string, unknown> }\n );\n return response.data;\n }\n\n /**\n * Alias for findOne()\n */\n async get(id: string, params?: Pick<QueryParams, \"fields\">): Promise<T> {\n return this.findOne(id, params);\n }\n\n /**\n * Create a new item\n *\n * @example\n * ```typescript\n * const id = await items.create({\n * name: 'New Product',\n * price: 29.99,\n * status: 'draft'\n * });\n * ```\n */\n async create(data: Partial<T>): Promise<string> {\n const response = await this.client.post<MutationResponse<string>>(\n `/items/${this.collection}`,\n data\n );\n return response.data;\n }\n\n /**\n * Alias for create()\n */\n async insert(data: Partial<T>): Promise<string> {\n return this.create(data);\n }\n\n /**\n * Create multiple items at once\n *\n * @example\n * ```typescript\n * const ids = await items.createMany([\n * { name: 'Product 1', price: 10 },\n * { name: 'Product 2', price: 20 }\n * ]);\n * ```\n */\n async createMany(data: Partial<T>[]): Promise<string[]> {\n const response = await this.client.post<BulkResponse<string[]>>(\n `/items/${this.collection}/bulk`,\n data\n );\n return response.data;\n }\n\n /**\n * Alias for createMany()\n */\n async insertMany(data: Partial<T>[]): Promise<string[]> {\n return this.createMany(data);\n }\n\n /**\n * Update an existing item\n *\n * @example\n * ```typescript\n * await items.update('product-uuid', {\n * price: 24.99,\n * status: 'published'\n * });\n * ```\n */\n async update(id: string, data: Partial<T>): Promise<string> {\n const response = await this.client.patch<MutationResponse<string>>(\n `/items/${this.collection}/${id}`,\n data\n );\n return response.data;\n }\n\n /**\n * Update multiple items at once\n *\n * @example\n * ```typescript\n * // Update by IDs\n * await items.updateMany(['id1', 'id2'], { status: 'archived' });\n * ```\n */\n async updateMany(ids: string[], data: Partial<T>): Promise<string[]> {\n const response = await this.client.patch<BulkResponse<string[]>>(\n `/items/${this.collection}/bulk`,\n { ids, data }\n );\n return response.data;\n }\n\n /**\n * Upsert an item (create if not exists, update if exists)\n *\n * @example\n * ```typescript\n * const id = await items.upsert(\n * { sku: 'WIDGET-001' },\n * { name: 'Widget', price: 29.99, sku: 'WIDGET-001' }\n * );\n * ```\n */\n async upsert(\n filter: Filter,\n data: Partial<T>\n ): Promise<string> {\n // Try to find existing\n const existing = await this.find({ filter, limit: 1 });\n if (existing.data.length > 0) {\n return this.update(existing.data[0].id, data);\n }\n return this.create(data);\n }\n\n /**\n * Delete an item by ID\n *\n * @example\n * ```typescript\n * await items.delete('product-uuid');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.client.delete<DeleteResponse>(`/items/${this.collection}/${id}`);\n }\n\n /**\n * Delete multiple items\n *\n * @example\n * ```typescript\n * await items.deleteMany(['id1', 'id2', 'id3']);\n * ```\n */\n async deleteMany(ids: string[]): Promise<void> {\n await this.client.delete<DeleteResponse>(`/items/${this.collection}/bulk`, {\n params: { ids },\n });\n }\n\n /**\n * Soft delete an item (if paranoid mode is enabled)\n *\n * @example\n * ```typescript\n * await items.softDelete('product-uuid');\n * ```\n */\n async softDelete(id: string): Promise<void> {\n await this.update(id, { deletedAt: new Date().toISOString() } as unknown as Partial<T>);\n }\n\n /**\n * Restore a soft-deleted item\n *\n * @example\n * ```typescript\n * await items.restore('product-uuid');\n * ```\n */\n async restore(id: string): Promise<void> {\n await this.update(id, { deletedAt: null } as unknown as Partial<T>);\n }\n\n /**\n * Aggregate data with grouping\n *\n * @example\n * ```typescript\n * const results = await items.aggregate({\n * aggregate: {\n * total: { function: 'sum', field: 'amount' },\n * count: { function: 'count', field: 'id' },\n * avgPrice: { function: 'avg', field: 'price' }\n * },\n * groupBy: ['category', 'status'],\n * filter: { createdAt: { gte: '$NOW-DAYS_30' } }\n * });\n * ```\n */\n async aggregate(\n params: Pick<QueryParams, \"aggregate\" | \"groupBy\" | \"filter\">\n ): Promise<Record<string, unknown>[]> {\n const response = await this.client.get<PaginatedResponse<Record<string, unknown>>>(\n `/items/${this.collection}`,\n { params: params as Record<string, unknown> }\n );\n return response.data;\n }\n\n // ===================\n // Import Operations\n // ===================\n\n /**\n * Import items from a CSV file\n *\n * @example\n * ```typescript\n * // Browser\n * const fileInput = document.querySelector('input[type=\"file\"]');\n * const file = fileInput.files[0];\n * \n * const result = await baasix.items('products').importCSV(file);\n * \n * console.log(`Imported ${result.imported} items`);\n * ```\n */\n async importCSV(\n file: File | { uri: string; name: string; type: string }\n ): Promise<ImportResult> {\n const formData = new FormData();\n \n if (file instanceof File) {\n formData.append(\"csvFile\", file);\n } else {\n // React Native style file\n formData.append(\"csvFile\", file as any);\n }\n\n const response = await this.client.post<{ results: ImportResult }>(\n `/items/${this.collection}/import-csv`,\n formData\n );\n return response.results;\n }\n\n /**\n * Import items from a JSON file\n *\n * @example\n * ```typescript\n * const file = fileInput.files[0]; // JSON file\n * const result = await baasix.items('products').importJSON(file);\n * \n * console.log(`Imported ${result.imported} items`);\n * ```\n */\n async importJSON(\n file: File | { uri: string; name: string; type: string }\n ): Promise<ImportResult> {\n const formData = new FormData();\n \n if (file instanceof File) {\n formData.append(\"jsonFile\", file);\n } else {\n formData.append(\"jsonFile\", file as any);\n }\n\n const response = await this.client.post<{ results: ImportResult }>(\n `/items/${this.collection}/import-json`,\n formData\n );\n return response.results;\n }\n\n /**\n * Import items from an array of objects\n *\n * @example\n * ```typescript\n * const data = [\n * { name: 'Product 1', price: 29.99 },\n * { name: 'Product 2', price: 39.99 }\n * ];\n * \n * const result = await baasix.items('products').importData(data);\n * ```\n */\n async importData(data: Partial<T>[]): Promise<BulkResponse> {\n const response = await this.client.post<BulkResponse>(\n `/items/${this.collection}/bulk`,\n data\n );\n return response;\n }\n\n // ===================\n // Sort Operations\n // ===================\n\n /**\n * Sort/reorder items (move item before or after another)\n *\n * @example\n * ```typescript\n * // Move item1 before item2\n * await baasix.items('products').sortItem('item1-uuid', 'item2-uuid');\n * \n * // Move item1 after item2\n * await baasix.items('products').sortItem('item1-uuid', 'item2-uuid', 'after');\n * ```\n */\n async sortItem(\n itemId: string,\n targetItemId: string,\n mode: \"before\" | \"after\" = \"before\"\n ): Promise<void> {\n await this.client.post(`/utils/sort/${this.collection}`, {\n item: itemId,\n to: targetItemId,\n mode,\n });\n }\n\n /**\n * Reorder multiple items\n *\n * @example\n * ```typescript\n * // Set explicit order\n * await baasix.items('products').reorder([\n * 'item3-uuid',\n * 'item1-uuid',\n * 'item2-uuid'\n * ]);\n * ```\n */\n async reorder(orderedIds: string[]): Promise<void> {\n // Sort items one by one to achieve the desired order\n for (let i = 1; i < orderedIds.length; i++) {\n await this.client.post(`/utils/sort/${this.collection}`, {\n item: orderedIds[i],\n to: orderedIds[i - 1],\n mode: \"after\",\n });\n }\n }\n}\n\nexport interface ImportResult {\n imported: number;\n failed: number;\n errors: Array<{ row: number; data: Record<string, unknown>; error: string }>;\n}\n\n// Re-export types from types.ts\nexport type {\n BaseItem,\n BulkResponse,\n DeleteResponse,\n Filter,\n MutationResponse,\n PaginatedResponse,\n QueryParams,\n SingleResponse,\n Sort,\n};\n","import type { HttpClient } from \"../client\";\nimport type {\n AssetTransformOptions,\n FileMetadata,\n PaginatedResponse,\n QueryParams,\n UploadOptions,\n} from \"../types\";\n\nexport interface FilesModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Files module for file upload, management, and asset transformations.\n *\n * @example\n * ```typescript\n * // Upload a file\n * const file = await baasix.files.upload(fileInput.files[0], {\n * title: 'My Image',\n * isPublic: true\n * });\n *\n * // Get asset URL with transformations\n * const url = baasix.files.getAssetUrl(file.id, {\n * width: 200,\n * height: 200,\n * fit: 'cover'\n * });\n * ```\n */\nexport class FilesModule {\n private client: HttpClient;\n\n constructor(config: FilesModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * Upload a file\n *\n * @example\n * ```typescript\n * // Browser File API\n * const metadata = await baasix.files.upload(fileInput.files[0], {\n * title: 'Product Image',\n * folder: 'products',\n * isPublic: true,\n * onProgress: (progress) => console.log(`${progress}% uploaded`)\n * });\n *\n * // React Native with expo-image-picker\n * const metadata = await baasix.files.upload({\n * uri: result.uri,\n * name: 'photo.jpg',\n * type: 'image/jpeg'\n * });\n * ```\n */\n async upload(\n file: File | Blob | { uri: string; name: string; type: string },\n options?: UploadOptions\n ): Promise<FileMetadata> {\n const formData = new FormData();\n\n // Handle different file types (Browser File, Blob, React Native)\n if (file instanceof File || file instanceof Blob) {\n formData.append(\"file\", file);\n } else {\n // React Native style object with uri\n formData.append(\"file\", file as unknown as Blob);\n }\n\n // Add metadata options\n if (options?.title) {\n formData.append(\"title\", options.title);\n }\n if (options?.description) {\n formData.append(\"description\", options.description);\n }\n if (options?.folder) {\n formData.append(\"folder\", options.folder);\n }\n if (options?.storage) {\n formData.append(\"storage\", options.storage);\n }\n if (options?.isPublic !== undefined) {\n formData.append(\"isPublic\", String(options.isPublic));\n }\n if (options?.metadata) {\n formData.append(\"metadata\", JSON.stringify(options.metadata));\n }\n\n const response = await this.client.upload<{ data: FileMetadata }>(\n \"/files\",\n formData,\n { onProgress: options?.onProgress }\n );\n\n return response.data;\n }\n\n /**\n * Upload multiple files\n *\n * @example\n * ```typescript\n * const files = await baasix.files.uploadMany(fileInput.files, {\n * folder: 'gallery',\n * isPublic: true\n * });\n * ```\n */\n async uploadMany(\n files: FileList | File[] | Array<{ uri: string; name: string; type: string }>,\n options?: Omit<UploadOptions, \"onProgress\">\n ): Promise<FileMetadata[]> {\n const results: FileMetadata[] = [];\n \n // Handle different input types\n const fileArray: Array<File | { uri: string; name: string; type: string }> = \n files instanceof FileList \n ? Array.from(files) \n : files;\n\n for (const file of fileArray) {\n const metadata = await this.upload(file, options);\n results.push(metadata);\n }\n\n return results;\n }\n\n /**\n * List files with optional filtering\n *\n * @example\n * ```typescript\n * const { data, totalCount } = await baasix.files.find({\n * filter: { mimeType: { startsWith: 'image/' } },\n * limit: 20\n * });\n * ```\n */\n async find(params?: QueryParams): Promise<PaginatedResponse<FileMetadata>> {\n return this.client.get<PaginatedResponse<FileMetadata>>(\"/files\", {\n params: params as Record<string, unknown>,\n });\n }\n\n /**\n * Get file metadata by ID\n *\n * @example\n * ```typescript\n * const file = await baasix.files.findOne('file-uuid');\n * console.log(file.filename, file.size);\n * ```\n */\n async findOne(id: string): Promise<FileMetadata> {\n const response = await this.client.get<{ data: FileMetadata }>(`/files/${id}`);\n return response.data;\n }\n\n /**\n * Update file metadata\n *\n * @example\n * ```typescript\n * await baasix.files.update('file-uuid', {\n * title: 'Updated Title',\n * description: 'New description'\n * });\n * ```\n */\n async update(\n id: string,\n data: Partial<Pick<FileMetadata, \"title\" | \"description\" | \"isPublic\">>\n ): Promise<FileMetadata> {\n const response = await this.client.patch<{ data: FileMetadata }>(\n `/files/${id}`,\n data\n );\n return response.data;\n }\n\n /**\n * Delete a file\n *\n * @example\n * ```typescript\n * await baasix.files.delete('file-uuid');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.client.delete(`/files/${id}`);\n }\n\n /**\n * Delete multiple files\n *\n * @example\n * ```typescript\n * await baasix.files.deleteMany(['id1', 'id2', 'id3']);\n * ```\n */\n async deleteMany(ids: string[]): Promise<void> {\n await Promise.all(ids.map((id) => this.delete(id)));\n }\n\n /**\n * Get the URL for an asset with optional transformations\n *\n * @example\n * ```typescript\n * // Original file\n * const url = baasix.files.getAssetUrl('file-uuid');\n *\n * // Resized thumbnail\n * const thumbUrl = baasix.files.getAssetUrl('file-uuid', {\n * width: 200,\n * height: 200,\n * fit: 'cover',\n * quality: 80\n * });\n *\n * // Convert to WebP\n * const webpUrl = baasix.files.getAssetUrl('file-uuid', {\n * format: 'webp',\n * quality: 85\n * });\n * ```\n */\n getAssetUrl(id: string, options?: AssetTransformOptions): string {\n const baseUrl = this.client.getBaseUrl();\n const url = new URL(`/assets/${id}`, baseUrl);\n\n if (options) {\n if (options.width) {\n url.searchParams.set(\"width\", String(options.width));\n }\n if (options.height) {\n url.searchParams.set(\"height\", String(options.height));\n }\n if (options.fit) {\n url.searchParams.set(\"fit\", options.fit);\n }\n if (options.quality) {\n url.searchParams.set(\"quality\", String(options.quality));\n }\n if (options.format) {\n url.searchParams.set(\"format\", options.format);\n }\n }\n\n return url.toString();\n }\n\n /**\n * Download a file as a Blob\n *\n * @example\n * ```typescript\n * const blob = await baasix.files.download('file-uuid');\n *\n * // Create download link\n * const url = URL.createObjectURL(blob);\n * const a = document.createElement('a');\n * a.href = url;\n * a.download = 'filename.pdf';\n * a.click();\n * ```\n */\n async download(id: string, options?: AssetTransformOptions): Promise<Blob> {\n const url = this.getAssetUrl(id, options);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to download file: ${response.statusText}`);\n }\n return response.blob();\n }\n\n /**\n * Get file as base64 string (useful for React Native)\n *\n * @example\n * ```typescript\n * const base64 = await baasix.files.toBase64('file-uuid');\n * // Use in Image component: <Image source={{ uri: `data:image/jpeg;base64,${base64}` }} />\n * ```\n */\n async toBase64(id: string, options?: AssetTransformOptions): Promise<string> {\n const blob = await this.download(id, options);\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const result = reader.result as string;\n // Remove data URL prefix\n const base64 = result.split(\",\")[1];\n resolve(base64);\n };\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n }\n\n /**\n * Import file from URL\n *\n * @example\n * ```typescript\n * const file = await baasix.files.importFromUrl(\n * 'https://example.com/image.jpg',\n * { title: 'Imported Image' }\n * );\n * ```\n */\n async importFromUrl(\n url: string,\n options?: UploadOptions\n ): Promise<FileMetadata> {\n const response = await this.client.post<{ data: FileMetadata }>(\n \"/files/import\",\n {\n url,\n ...options,\n }\n );\n return response.data;\n }\n}\n\n// Re-export types\nexport type { AssetTransformOptions, FileMetadata, UploadOptions };\n","import type { Sort, SortDirection } from \"../types\";\n\n/**\n * Normalize sort parameter to string format \"field:direction,field2:direction2\"\n * This is the format expected by the API for query string parameters.\n * \n * @example\n * ```typescript\n * normalizeSort({ name: 'asc', createdAt: 'desc' })\n * // Returns: \"name:asc,createdAt:desc\"\n * \n * normalizeSort(['-createdAt', 'name'])\n * // Returns: \"createdAt:desc,name:asc\"\n * \n * normalizeSort('name:asc')\n * // Returns: \"name:asc\"\n * ```\n */\nexport function normalizeSort(sort: Sort | undefined): string | undefined {\n if (!sort) return undefined;\n\n // Already a string\n if (typeof sort === \"string\") {\n return sort;\n }\n\n // Array of strings like ['-createdAt', 'name']\n if (Array.isArray(sort)) {\n if (sort.length === 0) return undefined;\n \n // Check if it's array of objects { column, order }\n if (typeof sort[0] === \"object\" && \"column\" in sort[0]) {\n return (sort as { column: string; order: SortDirection }[])\n .map((s) => `${s.column}:${s.order.toLowerCase()}`)\n .join(\",\");\n }\n \n // Array of strings like ['-name', 'createdAt']\n return (sort as string[])\n .map((s) => {\n if (s.startsWith(\"-\")) {\n return `${s.substring(1)}:desc`;\n }\n if (s.includes(\":\")) {\n return s;\n }\n return `${s}:asc`;\n })\n .join(\",\");\n }\n\n // Object like { name: 'asc', createdAt: 'desc' }\n if (typeof sort === \"object\") {\n const entries = Object.entries(sort as Record<string, SortDirection>);\n if (entries.length === 0) return undefined;\n \n return entries\n .map(([field, direction]) => `${field}:${direction.toLowerCase()}`)\n .join(\",\");\n }\n\n return undefined;\n}\n","import type { HttpClient } from \"../client\";\nimport type {\n IndexDefinition,\n PaginatedResponse,\n RelationshipDefinition,\n SchemaDefinition,\n SchemaInfo,\n Sort,\n} from \"../types\";\nimport { normalizeSort } from \"../utils/sort\";\n\nexport interface SchemasModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Schemas module for managing database schemas, relationships, and indexes.\n *\n * @example\n * ```typescript\n * // Create a new collection\n * await baasix.schemas.create({\n * collectionName: 'products',\n * schema: {\n * name: 'Product',\n * timestamps: true,\n * fields: {\n * id: { type: 'UUID', primaryKey: true, defaultValue: { type: 'UUIDV4' } },\n * name: { type: 'String', allowNull: false },\n * price: { type: 'Decimal', values: { precision: 10, scale: 2 } }\n * }\n * }\n * });\n *\n * // Add a relationship\n * await baasix.schemas.createRelationship('products', {\n * type: 'M2O',\n * target: 'categories',\n * name: 'category',\n * alias: 'products'\n * });\n * ```\n */\nexport class SchemasModule {\n private client: HttpClient;\n\n constructor(config: SchemasModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * List all schemas\n *\n * @example\n * ```typescript\n * const { data } = await baasix.schemas.find();\n * console.log(data.map(s => s.collectionName));\n * \n * // With pagination\n * const { data } = await baasix.schemas.find({ page: 1, limit: 50 });\n * ```\n */\n async find(params?: {\n page?: number;\n limit?: number;\n sort?: Sort;\n search?: string;\n filter?: Record<string, unknown>;\n }): Promise<PaginatedResponse<SchemaInfo>> {\n const normalizedParams = params ? {\n ...params,\n sort: normalizeSort(params.sort),\n } : undefined;\n return this.client.get<PaginatedResponse<SchemaInfo>>(\"/schemas\", { params: normalizedParams });\n }\n\n /**\n * Get schema for a specific collection\n *\n * @example\n * ```typescript\n * const schema = await baasix.schemas.findOne('products');\n * console.log(schema.fields);\n * ```\n */\n async findOne(collection: string): Promise<SchemaInfo> {\n const response = await this.client.get<{ data: SchemaInfo }>(\n `/schemas/${collection}`\n );\n return response.data;\n }\n\n /**\n * Create a new collection/schema\n *\n * @example\n * ```typescript\n * await baasix.schemas.create({\n * collectionName: 'orders',\n * schema: {\n * name: 'Order',\n * timestamps: true,\n * paranoid: true,\n * fields: {\n * id: {\n * type: 'UUID',\n * primaryKey: true,\n * defaultValue: { type: 'UUIDV4' }\n * },\n * orderNumber: {\n * type: 'String',\n * allowNull: false,\n * unique: true\n * },\n * total: {\n * type: 'Decimal',\n * values: { precision: 10, scale: 2 },\n * allowNull: false,\n * defaultValue: 0\n * },\n * status: {\n * type: 'String',\n * allowNull: false,\n * defaultValue: 'pending'\n * },\n * items: {\n * type: 'JSONB',\n * allowNull: true,\n * defaultValue: []\n * }\n * }\n * }\n * });\n * ```\n */\n async create(data: {\n collectionName: string;\n schema: SchemaDefinition;\n }): Promise<SchemaInfo> {\n const response = await this.client.post<{ data: SchemaInfo }>(\n \"/schemas\",\n data\n );\n return response.data;\n }\n\n /**\n * Update an existing schema\n *\n * @example\n * ```typescript\n * await baasix.schemas.update('products', {\n * schema: {\n * name: 'Product',\n * timestamps: true,\n * fields: {\n * // Updated fields\n * description: { type: 'Text', allowNull: true }\n * }\n * }\n * });\n * ```\n */\n async update(\n collection: string,\n data: { schema: Partial<SchemaDefinition> }\n ): Promise<SchemaInfo> {\n const response = await this.client.patch<{ data: SchemaInfo }>(\n `/schemas/${collection}`,\n data\n );\n return response.data;\n }\n\n /**\n * Delete a schema (drops the table)\n *\n * @example\n * ```typescript\n * await baasix.schemas.delete('old_collection');\n * ```\n */\n async delete(collection: string): Promise<void> {\n await this.client.delete(`/schemas/${collection}`);\n }\n\n /**\n * Create a relationship between collections\n *\n * @example\n * ```typescript\n * // Many-to-One (BelongsTo)\n * await baasix.schemas.createRelationship('posts', {\n * type: 'M2O',\n * target: 'baasix_User',\n * name: 'author',\n * alias: 'posts'\n * });\n *\n * // Many-to-Many\n * await baasix.schemas.createRelationship('posts', {\n * type: 'M2M',\n * target: 'tags',\n * name: 'tags',\n * alias: 'posts'\n * });\n * ```\n */\n async createRelationship(\n collection: string,\n relationship: RelationshipDefinition\n ): Promise<void> {\n await this.client.post(\n `/schemas/${collection}/relationships`,\n relationship\n );\n }\n\n /**\n * Delete a relationship\n *\n * @example\n * ```typescript\n * await baasix.schemas.deleteRelationship('posts', 'author');\n * ```\n */\n async deleteRelationship(\n collection: string,\n relationshipName: string\n ): Promise<void> {\n await this.client.delete(\n `/schemas/${collection}/relationships/${relationshipName}`\n );\n }\n\n /**\n * Update a relationship\n *\n * @example\n * ```typescript\n * await baasix.schemas.updateRelationship('posts', 'author', {\n * alias: 'authoredPosts',\n * onDelete: 'CASCADE'\n * });\n * ```\n */\n async updateRelationship(\n collection: string,\n relationshipName: string,\n data: Partial<RelationshipDefinition>\n ): Promise<void> {\n await this.client.patch(\n `/schemas/${collection}/relationships/${relationshipName}`,\n data\n );\n }\n\n /**\n * Create an index on a collection\n *\n * @example\n * ```typescript\n * // Unique index\n * await baasix.schemas.createIndex('users', {\n * name: 'idx_users_email',\n * fields: ['email'],\n * unique: true\n * });\n *\n * // Composite index\n * await baasix.schemas.createIndex('orders', {\n * name: 'idx_orders_status_created',\n * fields: ['status', 'createdAt']\n * });\n * ```\n */\n async createIndex(\n collection: string,\n index: IndexDefinition\n ): Promise<void> {\n await this.client.post(`/schemas/${collection}/indexes`, index);\n }\n\n /**\n * Delete an index\n *\n * @example\n * ```typescript\n * await baasix.schemas.deleteIndex('users', 'idx_users_email');\n * ```\n */\n async deleteIndex(collection: string, indexName: string): Promise<void> {\n await this.client.delete(`/schemas/${collection}/indexes/${indexName}`);\n }\n\n /**\n * Add a field to an existing schema\n *\n * @example\n * ```typescript\n * await baasix.schemas.addField('products', 'rating', {\n * type: 'Decimal',\n * values: { precision: 3, scale: 2 },\n * allowNull: true,\n * defaultValue: 0\n * });\n * ```\n */\n async addField(\n collection: string,\n fieldName: string,\n fieldDefinition: SchemaDefinition[\"fields\"][string]\n ): Promise<SchemaInfo> {\n const currentSchema = await this.findOne(collection);\n const updatedFields = {\n ...currentSchema.schema.fields,\n [fieldName]: fieldDefinition,\n };\n\n return this.update(collection, {\n schema: {\n ...currentSchema.schema,\n fields: updatedFields,\n },\n });\n }\n\n /**\n * Remove a field from a schema\n *\n * @example\n * ```typescript\n * await baasix.schemas.removeField('products', 'deprecated_field');\n * ```\n */\n async removeField(\n collection: string,\n fieldName: string\n ): Promise<SchemaInfo> {\n const currentSchema = await this.findOne(collection);\n const { [fieldName]: _, ...remainingFields } = currentSchema.schema.fields;\n\n return this.update(collection, {\n schema: {\n ...currentSchema.schema,\n fields: remainingFields,\n },\n });\n }\n\n /**\n * Export all schemas as JSON\n *\n * @example\n * ```typescript\n * const schemas = await baasix.schemas.export();\n * // Save to file for backup\n * ```\n */\n async export(): Promise<SchemaInfo[]> {\n const response = await this.client.get<{ data: SchemaInfo[] }>(\n \"/schemas/export\"\n );\n return response.data;\n }\n\n /**\n * Import schemas from JSON\n *\n * @example\n * ```typescript\n * await baasix.schemas.import(savedSchemas);\n * ```\n */\n async import(schemas: SchemaInfo[]): Promise<void> {\n await this.client.post(\"/schemas/import\", { schemas });\n }\n}\n\n// Re-export types\nexport type {\n IndexDefinition,\n RelationshipDefinition,\n SchemaDefinition,\n SchemaInfo,\n};\n","import type { HttpClient } from \"../client\";\nimport type {\n Notification,\n PaginatedResponse,\n SendNotificationData,\n} from \"../types\";\n\nexport interface NotificationsModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Notifications module for managing user notifications.\n *\n * @example\n * ```typescript\n * // Get user notifications\n * const { data } = await baasix.notifications.find();\n *\n * // Mark as seen\n * await baasix.notifications.markAsSeen(['notification-id']);\n *\n * // Send notification (admin)\n * await baasix.notifications.send({\n * title: 'New Message',\n * message: 'You have a new message',\n * userIds: ['user-uuid']\n * });\n * ```\n */\nexport class NotificationsModule {\n private client: HttpClient;\n\n constructor(config: NotificationsModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * List notifications for the current user\n *\n * @example\n * ```typescript\n * const { data } = await baasix.notifications.find({\n * limit: 20,\n * filter: { seen: { eq: false } }\n * });\n * ```\n */\n async find(params?: {\n limit?: number;\n page?: number;\n filter?: Record<string, unknown>;\n }): Promise<PaginatedResponse<Notification>> {\n return this.client.get<PaginatedResponse<Notification>>(\"/notifications\", {\n params: params as Record<string, unknown>,\n });\n }\n\n /**\n * Get unread notification count\n *\n * @example\n * ```typescript\n * const count = await baasix.notifications.getUnreadCount();\n * ```\n */\n async getUnreadCount(): Promise<number> {\n const response = await this.client.get<{ count: number }>(\n \"/notifications/unread/count\"\n );\n return response.count;\n }\n\n /**\n * Mark notifications as seen\n *\n * @example\n * ```typescript\n * // Mark specific notifications as seen\n * await baasix.notifications.markAsSeen(['id1', 'id2']);\n * \n * // Mark all notifications as seen\n * await baasix.notifications.markAsSeen();\n * ```\n */\n async markAsSeen(notificationIds?: string[]): Promise<{ count: number }> {\n const response = await this.client.post<{ message: string; count: number }>(\n \"/notifications/mark-seen\",\n { notificationIds }\n );\n return { count: response.count };\n }\n\n /**\n * Delete notifications for the current user\n *\n * @example\n * ```typescript\n * // Delete specific notifications\n * await baasix.notifications.delete(['id1', 'id2']);\n * \n * // Delete all notifications\n * await baasix.notifications.delete();\n * ```\n */\n async delete(notificationIds?: string[]): Promise<{ count: number }> {\n const response = await this.client.delete<{ message: string; count: number }>(\n \"/notifications\",\n { params: notificationIds ? { notificationIds } : undefined }\n );\n return { count: response.count };\n }\n\n /**\n * Send a notification to users (requires admin permissions)\n *\n * @example\n * ```typescript\n * await baasix.notifications.send({\n * type: 'alert',\n * title: 'System Update',\n * message: 'The system will be down for maintenance',\n * data: { link: '/updates' },\n * userIds: ['user1-uuid', 'user2-uuid']\n * });\n * ```\n */\n async send(data: SendNotificationData): Promise<{ notificationIds: string[] }> {\n const response = await this.client.post<{ message: string; notificationIds: string[] }>(\n \"/notifications/send\",\n data\n );\n return { notificationIds: response.notificationIds };\n }\n\n /**\n * Cleanup old notifications (requires admin permissions)\n *\n * @example\n * ```typescript\n * // Clean up notifications older than 30 days (default)\n * await baasix.notifications.cleanup();\n * \n * // Clean up notifications older than 7 days\n * await baasix.notifications.cleanup(7);\n * ```\n */\n async cleanup(days: number = 30): Promise<{ count: number }> {\n const response = await this.client.post<{ message: string; count: number }>(\n \"/notifications/cleanup\",\n { days }\n );\n return { count: response.count };\n }\n}\n\n// Re-export types\nexport type { Notification, SendNotificationData };\n","import type { HttpClient } from \"../client\";\nimport type {\n CreatePermissionData,\n PaginatedResponse,\n Permission,\n PermissionAction,\n Role,\n} from \"../types\";\n\nexport interface PermissionsModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Permissions module for managing role-based access control.\n *\n * @example\n * ```typescript\n * // Create a permission\n * await baasix.permissions.create({\n * role_Id: 'role-uuid',\n * collection: 'products',\n * action: 'read',\n * fields: ['*'],\n * conditions: { published: { eq: true } }\n * });\n *\n * // Get permissions for a role\n * const { data } = await baasix.permissions.findByRole('role-uuid');\n * ```\n */\nexport class PermissionsModule {\n private client: HttpClient;\n\n constructor(config: PermissionsModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * List all permissions\n *\n * @example\n * ```typescript\n * const { data } = await baasix.permissions.find();\n * ```\n */\n async find(params?: {\n limit?: number;\n page?: number;\n filter?: Record<string, unknown>;\n }): Promise<PaginatedResponse<Permission>> {\n return this.client.get<PaginatedResponse<Permission>>(\"/permissions\", {\n params: params as Record<string, unknown>,\n });\n }\n\n /**\n * Get a permission by ID\n */\n async findOne(id: string): Promise<Permission> {\n const response = await this.client.get<{ data: Permission }>(\n `/permissions/${id}`\n );\n return response.data;\n }\n\n /**\n * Get permissions for a specific role\n *\n * @example\n * ```typescript\n * const { data } = await baasix.permissions.findByRole('role-uuid');\n * ```\n */\n async findByRole(roleId: string): Promise<PaginatedResponse<Permission>> {\n return this.client.get<PaginatedResponse<Permission>>(\"/permissions\", {\n params: {\n filter: { role_Id: { eq: roleId } },\n limit: -1,\n },\n });\n }\n\n /**\n * Get permissions for a specific collection\n *\n * @example\n * ```typescript\n * const { data } = await baasix.permissions.findByCollection('products');\n * ```\n */\n async findByCollection(\n collection: string\n ): Promise<PaginatedResponse<Permission>> {\n return this.client.get<PaginatedResponse<Permission>>(\"/permissions\", {\n params: {\n filter: { collection: { eq: collection } },\n limit: -1,\n },\n });\n }\n\n /**\n * Create a new permission\n *\n * @example\n * ```typescript\n * await baasix.permissions.create({\n * role_Id: 'editor-role-uuid',\n * collection: 'posts',\n * action: 'update',\n * fields: ['title', 'content', 'status'],\n * conditions: {\n * author_Id: { eq: '$CURRENT_USER' }\n * }\n * });\n * ```\n */\n async create(data: CreatePermissionData): Promise<Permission> {\n const response = await this.client.post<{ data: Permission }>(\n \"/permissions\",\n data\n );\n return response.data;\n }\n\n /**\n * Update a permission\n *\n * @example\n * ```typescript\n * await baasix.permissions.update('permission-uuid', {\n * fields: ['*'],\n * conditions: null\n * });\n * ```\n */\n async update(\n id: string,\n data: Partial<CreatePermissionData>\n ): Promise<Permission> {\n const response = await this.client.patch<{ data: Permission }>(\n `/permissions/${id}`,\n data\n );\n return response.data;\n }\n\n /**\n * Delete a permission\n *\n * @example\n * ```typescript\n * await baasix.permissions.delete('permission-uuid');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.client.delete(`/permissions/${id}`);\n }\n\n /**\n * List all roles\n *\n * @example\n * ```typescript\n * const { data } = await baasix.permissions.getRoles();\n * ```\n */\n async getRoles(): Promise<PaginatedResponse<Role>> {\n return this.client.get<PaginatedResponse<Role>>(\"/items/baasix_Role\", {\n params: { limit: -1 },\n });\n }\n\n /**\n * Create CRUD permissions for a collection\n *\n * @example\n * ```typescript\n * await baasix.permissions.createCrudPermissions('role-uuid', 'products', {\n * create: { fields: ['name', 'price', 'description'] },\n * read: { fields: ['*'] },\n * update: { fields: ['name', 'price', 'description'] },\n * delete: false\n * });\n * ```\n */\n async createCrudPermissions(\n roleId: string,\n collection: string,\n config: {\n create?: { fields?: string[]; conditions?: Permission[\"conditions\"] } | false;\n read?: { fields?: string[]; conditions?: Permission[\"conditions\"] } | false;\n update?: { fields?: string[]; conditions?: Permission[\"conditions\"] } | false;\n delete?: { conditions?: Permission[\"conditions\"] } | false;\n }\n ): Promise<Permission[]> {\n const permissions: Permission[] = [];\n const actions: PermissionAction[] = [\"create\", \"read\", \"update\", \"delete\"];\n\n for (const action of actions) {\n const actionConfig = config[action];\n if (actionConfig === false) continue;\n\n const permission = await this.create({\n role_Id: roleId,\n collection,\n action,\n fields: (actionConfig as { fields?: string[] })?.fields || [\"*\"],\n conditions: (actionConfig as { conditions?: Permission[\"conditions\"] })?.conditions,\n });\n\n permissions.push(permission);\n }\n\n return permissions;\n }\n\n /**\n * Reload permissions cache (admin only)\n *\n * @example\n * ```typescript\n * await baasix.permissions.reloadCache();\n * ```\n */\n async reloadCache(): Promise<void> {\n await this.client.post(\"/permissions/reload\");\n }\n}\n\n// Re-export types\nexport type {\n CreatePermissionData,\n Permission,\n PermissionAction,\n Role,\n};\n","import type { HttpClient } from \"../client\";\nimport type { Settings } from \"../types\";\n\nexport interface SettingsModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Settings module for managing application settings.\n *\n * @example\n * ```typescript\n * // Get all settings\n * const settings = await baasix.settings.get();\n *\n * // Update settings\n * await baasix.settings.update({\n * appName: 'My App',\n * theme: 'dark'\n * });\n * ```\n */\nexport class SettingsModule {\n private client: HttpClient;\n\n constructor(config: SettingsModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * Get all settings\n *\n * @example\n * ```typescript\n * const settings = await baasix.settings.get();\n * console.log(settings.appName);\n * ```\n */\n async get(): Promise<Settings> {\n const response = await this.client.get<{ data: Settings }>(\"/settings\");\n return response.data;\n }\n\n /**\n * Get a specific setting by key\n *\n * @example\n * ```typescript\n * const appName = await baasix.settings.getKey('appName');\n * ```\n */\n async getKey<T = unknown>(key: string): Promise<T | null> {\n const settings = await this.get();\n return (settings[key] as T) ?? null;\n }\n\n /**\n * Update settings\n *\n * @example\n * ```typescript\n * await baasix.settings.update({\n * appName: 'Updated App Name',\n * logo: 'file-uuid',\n * customConfig: {\n * feature1: true,\n * feature2: false\n * }\n * });\n * ```\n */\n async update(settings: Partial<Settings>): Promise<Settings> {\n const response = await this.client.patch<{ data: Settings }>(\n \"/settings\",\n settings\n );\n return response.data;\n }\n\n /**\n * Set a specific setting\n *\n * @example\n * ```typescript\n * await baasix.settings.set('appName', 'My New App Name');\n * ```\n */\n async set<T>(key: string, value: T): Promise<Settings> {\n return this.update({ [key]: value });\n }\n}\n\n// Re-export types\nexport type { Settings };\n","import type { HttpClient } from \"../client\";\nimport type { Aggregate, Filter, ReportConfig, ReportResult } from \"../types\";\n\nexport interface ReportsModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Stats query for the stats endpoint\n */\nexport interface StatsQuery {\n /** Unique name for this stats query */\n name: string;\n /** Collection to query */\n collection: string;\n /** Query parameters including aggregate, groupBy, filter, fields */\n query: {\n aggregate?: Aggregate;\n groupBy?: string[];\n filter?: Filter;\n fields?: string[];\n };\n}\n\n/**\n * Stats result from a single query\n */\nexport interface StatsResult {\n name: string;\n collection: string;\n data: Record<string, unknown>[];\n}\n\n/**\n * Reports module for generating analytics and reports.\n *\n * @example\n * ```typescript\n * // Generate sales report grouped by category\n * const report = await baasix.reports.generate('orders', {\n * aggregate: {\n * totalSales: { function: 'sum', field: 'total' },\n * orderCount: { function: 'count', field: 'id' },\n * avgOrderValue: { function: 'avg', field: 'total' }\n * },\n * groupBy: 'category',\n * filter: { status: { eq: 'completed' } },\n * dateRange: {\n * start: '2025-01-01',\n * end: '2025-12-31',\n * field: 'createdAt'\n * }\n * });\n * ```\n */\nexport class ReportsModule {\n private client: HttpClient;\n\n constructor(config: ReportsModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * Generate a report for a collection using POST method\n *\n * @example\n * ```typescript\n * // Sales by month\n * const report = await baasix.reports.generate('orders', {\n * aggregate: {\n * revenue: { function: 'sum', field: 'total' },\n * orders: { function: 'count', field: 'id' }\n * },\n * groupBy: ['month'],\n * dateRange: {\n * start: '2025-01-01',\n * end: '2025-12-31'\n * }\n * });\n * ```\n */\n async generate(\n collection: string,\n config: Omit<ReportConfig, \"collection\">\n ): Promise<ReportResult> {\n const response = await this.client.post<ReportResult>(\n `/reports/${collection}`,\n config\n );\n return response;\n }\n\n /**\n * Query a report for a collection using GET method with query params\n *\n * @example\n * ```typescript\n * const report = await baasix.reports.query('orders', {\n * aggregate: {\n * total: { function: 'sum', field: 'amount' }\n * },\n * groupBy: ['status']\n * });\n * ```\n */\n async query(\n collection: string,\n params?: {\n aggregate?: Aggregate;\n groupBy?: string[];\n filter?: Filter;\n fields?: string[];\n }\n ): Promise<ReportResult> {\n const response = await this.client.get<ReportResult>(\n `/reports/${collection}`,\n { params: params as Record<string, unknown> }\n );\n return response;\n }\n\n /**\n * Get statistics for multiple collections in a single request\n *\n * @example\n * ```typescript\n * const stats = await baasix.reports.getStats([\n * {\n * name: 'total_products',\n * collection: 'products',\n * query: {\n * aggregate: { count: { function: 'count', field: '*' } }\n * }\n * },\n * {\n * name: 'total_orders',\n * collection: 'orders',\n * query: {\n * aggregate: {\n * count: { function: 'count', field: '*' },\n * total_amount: { function: 'sum', field: 'amount' }\n * }\n * }\n * }\n * ]);\n * ```\n */\n async getStats(stats: StatsQuery[]): Promise<StatsResult[]> {\n const response = await this.client.post<StatsResult[]>(`/reports/stats`, {\n stats,\n });\n return response;\n }\n\n /**\n * Generate an aggregation query\n *\n * @example\n * ```typescript\n * const results = await baasix.reports.aggregate('orders', {\n * aggregate: {\n * total: { function: 'sum', field: 'amount' },\n * count: { function: 'count', field: 'id' },\n * min: { function: 'min', field: 'amount' },\n * max: { function: 'max', field: 'amount' },\n * avg: { function: 'avg', field: 'amount' }\n * },\n * groupBy: ['status', 'paymentMethod'],\n * filter: { createdAt: { gte: '$NOW-DAYS_30' } }\n * });\n * ```\n */\n async aggregate(\n collection: string,\n options: {\n aggregate: Aggregate;\n groupBy?: string[];\n filter?: Filter;\n }\n ): Promise<Record<string, unknown>[]> {\n const response = await this.client.get<{ data: Record<string, unknown>[] }>(\n `/items/${collection}`,\n {\n params: {\n aggregate: options.aggregate,\n groupBy: options.groupBy,\n filter: options.filter,\n limit: -1,\n },\n }\n );\n return response.data;\n }\n\n /**\n * Count items matching a filter\n *\n * @example\n * ```typescript\n * const activeUsers = await baasix.reports.count('users', {\n * status: { eq: 'active' }\n * });\n * ```\n */\n async count(collection: string, filter?: Filter): Promise<number> {\n const response = await this.client.get<{ data: unknown[]; totalCount: number }>(\n `/items/${collection}`,\n {\n params: {\n filter,\n limit: 0,\n },\n }\n );\n return response.totalCount || 0;\n }\n\n /**\n * Get distinct values for a field\n *\n * @example\n * ```typescript\n * const categories = await baasix.reports.distinct('products', 'category');\n * ```\n */\n async distinct(\n collection: string,\n field: string,\n filter?: Filter\n ): Promise<unknown[]> {\n const response = await this.client.get<{ data: Record<string, unknown>[] }>(\n `/items/${collection}`,\n {\n params: {\n filter,\n fields: [field],\n groupBy: [field],\n limit: -1,\n },\n }\n );\n return response.data.map((item) => item[field]);\n }\n}\n\n// Re-export types from ../types\nexport type { Aggregate, Filter, ReportConfig, ReportResult };\n","import type { HttpClient } from \"../client\";\nimport type {\n PaginatedResponse,\n Workflow,\n WorkflowExecution,\n} from \"../types\";\n\nexport interface WorkflowsModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Workflows module for managing visual workflow automation.\n *\n * @example\n * ```typescript\n * // Execute a workflow\n * const result = await baasix.workflows.execute('workflow-uuid', {\n * orderId: 'order-123'\n * });\n *\n * // Get workflow executions\n * const { data } = await baasix.workflows.getExecutions('workflow-uuid');\n * ```\n */\nexport class WorkflowsModule {\n private client: HttpClient;\n\n constructor(config: WorkflowsModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * List all workflows\n *\n * @example\n * ```typescript\n * const { data } = await baasix.workflows.find();\n * ```\n */\n async find(params?: {\n limit?: number;\n page?: number;\n filter?: Record<string, unknown>;\n }): Promise<PaginatedResponse<Workflow>> {\n return this.client.get<PaginatedResponse<Workflow>>(\"/workflows\", {\n params: params as Record<string, unknown>,\n });\n }\n\n /**\n * Get a workflow by ID\n *\n * @example\n * ```typescript\n * const workflow = await baasix.workflows.findOne('workflow-uuid');\n * ```\n */\n async findOne(id: string): Promise<Workflow> {\n const response = await this.client.get<{ data: Workflow }>(\n `/workflows/${id}`\n );\n return response.data;\n }\n\n /**\n * Create a new workflow\n *\n * @example\n * ```typescript\n * const workflow = await baasix.workflows.create({\n * name: 'Order Processing',\n * description: 'Process new orders',\n * trigger: {\n * type: 'hook',\n * config: {\n * collection: 'orders',\n * event: 'items.create.after'\n * }\n * },\n * nodes: [...],\n * edges: [...],\n * isActive: true\n * });\n * ```\n */\n async create(\n data: Omit<Workflow, \"id\" | \"createdAt\" | \"updatedAt\">\n ): Promise<Workflow> {\n const response = await this.client.post<{ data: Workflow }>(\n \"/workflows\",\n data\n );\n return response.data;\n }\n\n /**\n * Update a workflow\n *\n * @example\n * ```typescript\n * await baasix.workflows.update('workflow-uuid', {\n * name: 'Updated Workflow Name',\n * isActive: false\n * });\n * ```\n */\n async update(\n id: string,\n data: Partial<Omit<Workflow, \"id\" | \"createdAt\" | \"updatedAt\">>\n ): Promise<Workflow> {\n const response = await this.client.patch<{ data: Workflow }>(\n `/workflows/${id}`,\n data\n );\n return response.data;\n }\n\n /**\n * Delete a workflow\n *\n * @example\n * ```typescript\n * await baasix.workflows.delete('workflow-uuid');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.client.delete(`/workflows/${id}`);\n }\n\n /**\n * Execute a workflow manually\n *\n * @example\n * ```typescript\n * const result = await baasix.workflows.execute('workflow-uuid', {\n * // Trigger data\n * customerId: 'customer-123',\n * action: 'sendEmail'\n * });\n * ```\n */\n async execute(\n id: string,\n triggerData?: Record<string, unknown>\n ): Promise<WorkflowExecution> {\n const response = await this.client.post<{ data: WorkflowExecution }>(\n `/workflows/${id}/execute`,\n { triggerData }\n );\n return response.data;\n }\n\n /**\n * Test a workflow without persisting execution\n *\n * @example\n * ```typescript\n * const result = await baasix.workflows.test('workflow-uuid', {\n * testData: { value: 123 }\n * });\n * ```\n */\n async test(\n id: string,\n triggerData?: Record<string, unknown>\n ): Promise<WorkflowExecution> {\n const response = await this.client.post<{ data: WorkflowExecution }>(\n `/workflows/${id}/test`,\n { triggerData }\n );\n return response.data;\n }\n\n /**\n * Get workflow execution history\n *\n * @example\n * ```typescript\n * const { data } = await baasix.workflows.getExecutions('workflow-uuid', {\n * limit: 50\n * });\n * ```\n */\n async getExecutions(\n id: string,\n params?: {\n limit?: number;\n page?: number;\n status?: \"pending\" | \"running\" | \"completed\" | \"failed\";\n }\n ): Promise<PaginatedResponse<WorkflowExecution>> {\n return this.client.get<PaginatedResponse<WorkflowExecution>>(\n `/workflows/${id}/executions`,\n { params: params as Record<string, unknown> }\n );\n }\n\n /**\n * Get a specific execution\n *\n * @example\n * ```typescript\n * const execution = await baasix.workflows.getExecution(\n * 'workflow-uuid',\n * 'execution-uuid'\n * );\n * ```\n */\n async getExecution(\n workflowId: string,\n executionId: string\n ): Promise<WorkflowExecution> {\n const response = await this.client.get<{ data: WorkflowExecution }>(\n `/workflows/${workflowId}/executions/${executionId}`\n );\n return response.data;\n }\n\n /**\n * Cancel a running execution\n *\n * @example\n * ```typescript\n * await baasix.workflows.cancelExecution('workflow-uuid', 'execution-uuid');\n * ```\n */\n async cancelExecution(\n workflowId: string,\n executionId: string\n ): Promise<void> {\n await this.client.post(\n `/workflows/${workflowId}/executions/${executionId}/cancel`\n );\n }\n\n /**\n * Enable a workflow\n *\n * @example\n * ```typescript\n * await baasix.workflows.enable('workflow-uuid');\n * ```\n */\n async enable(id: string): Promise<Workflow> {\n return this.update(id, { isActive: true });\n }\n\n /**\n * Disable a workflow\n *\n * @example\n * ```typescript\n * await baasix.workflows.disable('workflow-uuid');\n * ```\n */\n async disable(id: string): Promise<Workflow> {\n return this.update(id, { isActive: false });\n }\n\n /**\n * Duplicate a workflow\n *\n * @example\n * ```typescript\n * const newWorkflow = await baasix.workflows.duplicate('workflow-uuid', {\n * name: 'Copy of My Workflow'\n * });\n * ```\n */\n async duplicate(\n id: string,\n overrides?: Partial<Omit<Workflow, \"id\" | \"createdAt\" | \"updatedAt\">>\n ): Promise<Workflow> {\n const original = await this.findOne(id);\n const { id: _, createdAt, updatedAt, ...workflowData } = original;\n\n return this.create({\n ...workflowData,\n name: `Copy of ${workflowData.name}`,\n ...overrides,\n });\n }\n}\n\n// Re-export types\nexport type { Workflow, WorkflowExecution };\n","import type { HttpClient } from \"../client\";\nimport type { StorageAdapter } from \"../storage/types\";\nimport { STORAGE_KEYS } from \"../storage/types\";\nimport type { BaseItem } from \"../types\";\n\n// Socket.io-client types (minimal subset for SDK)\ninterface SocketOptions {\n auth?: { token?: string };\n query?: Record<string, string>;\n path?: string;\n transports?: string[];\n reconnection?: boolean;\n reconnectionAttempts?: number;\n reconnectionDelay?: number;\n timeout?: number;\n}\n\ninterface Socket {\n connected: boolean;\n id?: string;\n on(event: string, callback: (...args: any[]) => void): void;\n off(event: string, callback?: (...args: any[]) => void): void;\n emit(event: string, ...args: any[]): void;\n connect(): void;\n disconnect(): void;\n}\n\ntype SocketIOClient = (url: string, options?: SocketOptions) => Socket;\n\nexport interface RealtimeConfig {\n client: HttpClient;\n storage: StorageAdapter;\n socketUrl?: string;\n socketPath?: string;\n}\n\nexport type SubscriptionEvent = \"create\" | \"update\" | \"delete\";\n\nexport interface SubscriptionPayload<T = any> {\n action: SubscriptionEvent;\n collection: string;\n data: T;\n timestamp: string;\n}\n\nexport interface WorkflowExecutionUpdate {\n executionId: string | number;\n status?: string;\n nodeId?: string;\n nodeName?: string;\n message?: string;\n progress?: number;\n result?: any;\n error?: string;\n timestamp: string;\n}\n\nexport interface SubscriptionCallback<T = any> {\n (payload: SubscriptionPayload<T>): void;\n}\n\ninterface Subscription {\n collection: string;\n callbacks: Map<string, SubscriptionCallback>;\n}\n\n/**\n * Realtime module for WebSocket-based real-time subscriptions.\n * \n * Requires socket.io-client to be installed separately:\n * ```bash\n * npm install socket.io-client\n * ```\n * \n * @example\n * ```typescript\n * import { io } from 'socket.io-client';\n * \n * // Initialize realtime with socket.io client\n * baasix.realtime.setSocketClient(io);\n * \n * // Connect to realtime server\n * await baasix.realtime.connect();\n * \n * // Subscribe to collection changes\n * const unsubscribe = baasix.realtime.subscribe('products', (payload) => {\n * console.log(`Product ${payload.action}:`, payload.data);\n * });\n * \n * // Disconnect when done\n * baasix.realtime.disconnect();\n * ```\n */\nexport class RealtimeModule {\n private client: HttpClient;\n private storage: StorageAdapter;\n private socket: Socket | null = null;\n private socketClient: SocketIOClient | null = null;\n private socketUrl: string;\n private socketPath: string;\n private subscriptions: Map<string, Subscription> = new Map();\n private workflowCallbacks: Map<string, Set<(data: WorkflowExecutionUpdate) => void>> = new Map();\n private connectionCallbacks: Set<(connected: boolean) => void> = new Set();\n private reconnecting: boolean = false;\n private connectionPromise: Promise<void> | null = null;\n\n constructor(config: RealtimeConfig) {\n this.client = config.client;\n this.storage = config.storage;\n this.socketUrl = config.socketUrl || \"\";\n this.socketPath = config.socketPath || \"/socket\";\n }\n\n /**\n * Set the socket.io client instance\n * This allows the SDK to work without bundling socket.io-client\n * \n * @example\n * ```typescript\n * import { io } from 'socket.io-client';\n * baasix.realtime.setSocketClient(io);\n * ```\n */\n setSocketClient(socketIO: SocketIOClient): void {\n this.socketClient = socketIO;\n }\n\n /**\n * Set the WebSocket server URL\n * By default, uses the same URL as the API\n */\n setSocketUrl(url: string): void {\n this.socketUrl = url;\n }\n\n /**\n * Check if socket.io client is available\n */\n private ensureSocketClient(): void {\n if (!this.socketClient) {\n throw new Error(\n \"Socket.io client not set. Please call baasix.realtime.setSocketClient(io) with socket.io-client.\"\n );\n }\n }\n\n /**\n * Get the authentication token for socket connection\n */\n private async getAuthToken(): Promise<string | null> {\n return await this.storage.get(STORAGE_KEYS.ACCESS_TOKEN);\n }\n\n /**\n * Connect to the realtime server\n * \n * @example\n * ```typescript\n * await baasix.realtime.connect();\n * console.log('Connected to realtime server');\n * ```\n */\n async connect(): Promise<void> {\n // Return existing connection promise if already connecting\n if (this.connectionPromise) {\n return this.connectionPromise;\n }\n\n // Already connected\n if (this.socket?.connected) {\n return Promise.resolve();\n }\n\n this.ensureSocketClient();\n\n this.connectionPromise = new Promise(async (resolve, reject) => {\n try {\n const token = await this.getAuthToken();\n const baseUrl = this.socketUrl || this.client.getBaseUrl();\n\n this.socket = this.socketClient!(baseUrl, {\n auth: { token: token || undefined },\n path: this.socketPath,\n transports: [\"websocket\", \"polling\"],\n reconnection: true,\n reconnectionAttempts: 10,\n reconnectionDelay: 1000,\n timeout: 20000,\n });\n\n // Connection events\n this.socket.on(\"connect\", () => {\n console.log(\"[Baasix Realtime] Connected\");\n this.reconnecting = false;\n this.notifyConnectionChange(true);\n resolve();\n });\n\n this.socket.on(\"disconnect\", (reason: string) => {\n console.log(\"[Baasix Realtime] Disconnected:\", reason);\n this.notifyConnectionChange(false);\n });\n\n this.socket.on(\"connect_error\", (error: Error) => {\n console.error(\"[Baasix Realtime] Connection error:\", error.message);\n if (!this.reconnecting) {\n reject(error);\n }\n });\n\n this.socket.on(\"reconnect\", () => {\n console.log(\"[Baasix Realtime] Reconnected\");\n this.reconnecting = false;\n // Re-subscribe to all collections\n this.resubscribeAll();\n this.notifyConnectionChange(true);\n });\n\n this.socket.on(\"reconnect_attempt\", () => {\n this.reconnecting = true;\n });\n\n // Initial connected event from server\n this.socket.on(\"connected\", (data: { userId: string; tenant: any }) => {\n console.log(\"[Baasix Realtime] Authenticated as user:\", data.userId);\n });\n\n // Workflow execution events\n this.socket.on(\"workflow:execution:update\", (data: WorkflowExecutionUpdate) => {\n this.handleWorkflowUpdate(data);\n });\n\n this.socket.on(\"workflow:execution:complete\", (data: WorkflowExecutionUpdate) => {\n this.handleWorkflowUpdate({ ...data, status: \"complete\" });\n });\n\n this.socket.connect();\n } catch (error) {\n this.connectionPromise = null;\n reject(error);\n }\n });\n\n try {\n await this.connectionPromise;\n } finally {\n this.connectionPromise = null;\n }\n }\n\n /**\n * Disconnect from the realtime server\n * \n * @example\n * ```typescript\n * baasix.realtime.disconnect();\n * ```\n */\n disconnect(): void {\n if (this.socket) {\n this.socket.disconnect();\n this.socket = null;\n }\n this.subscriptions.clear();\n this.workflowCallbacks.clear();\n }\n\n /**\n * Check if connected to the realtime server\n */\n get isConnected(): boolean {\n return this.socket?.connected ?? false;\n }\n\n /**\n * Subscribe to connection state changes\n * \n * @example\n * ```typescript\n * const unsubscribe = baasix.realtime.onConnectionChange((connected) => {\n * console.log('Connection state:', connected ? 'online' : 'offline');\n * });\n * ```\n */\n onConnectionChange(callback: (connected: boolean) => void): () => void {\n this.connectionCallbacks.add(callback);\n return () => {\n this.connectionCallbacks.delete(callback);\n };\n }\n\n private notifyConnectionChange(connected: boolean): void {\n this.connectionCallbacks.forEach((callback) => callback(connected));\n }\n\n /**\n * Subscribe to a collection for real-time updates\n * \n * @example\n * ```typescript\n * // Subscribe to all changes\n * const unsubscribe = baasix.realtime.subscribe('products', (payload) => {\n * console.log(`${payload.action}:`, payload.data);\n * });\n * \n * // Subscribe to specific events\n * const unsubscribe = baasix.realtime.subscribe('orders', (payload) => {\n * if (payload.action === 'create') {\n * console.log('New order:', payload.data);\n * }\n * });\n * \n * // Unsubscribe when done\n * unsubscribe();\n * ```\n */\n subscribe<T extends BaseItem = BaseItem>(\n collection: string,\n callback: SubscriptionCallback<T>\n ): () => void {\n if (!this.socket?.connected) {\n console.warn(\"[Baasix Realtime] Not connected. Call connect() first.\");\n }\n\n // Generate unique callback ID\n const callbackId = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n // Get or create subscription\n let subscription = this.subscriptions.get(collection);\n if (!subscription) {\n subscription = {\n collection,\n callbacks: new Map(),\n };\n this.subscriptions.set(collection, subscription);\n\n // Subscribe on server\n this.subscribeOnServer(collection);\n\n // Set up event listeners for this collection\n this.setupCollectionListeners(collection);\n }\n\n // Add callback\n subscription.callbacks.set(callbackId, callback as SubscriptionCallback);\n\n // Return unsubscribe function\n return () => {\n const sub = this.subscriptions.get(collection);\n if (sub) {\n sub.callbacks.delete(callbackId);\n\n // If no more callbacks, unsubscribe from server\n if (sub.callbacks.size === 0) {\n this.unsubscribeOnServer(collection);\n this.removeCollectionListeners(collection);\n this.subscriptions.delete(collection);\n }\n }\n };\n }\n\n /**\n * Subscribe to specific events on a collection\n * \n * @example\n * ```typescript\n * // Only listen for creates\n * const unsubscribe = baasix.realtime.on('products', 'create', (data) => {\n * console.log('New product:', data);\n * });\n * ```\n */\n on<T extends BaseItem = BaseItem>(\n collection: string,\n event: SubscriptionEvent,\n callback: (data: T) => void\n ): () => void {\n return this.subscribe<T>(collection, (payload) => {\n if (payload.action === event) {\n callback(payload.data);\n }\n });\n }\n\n /**\n * Listen to all changes across all subscribed collections\n * \n * @example\n * ```typescript\n * const unsubscribe = baasix.realtime.onAny((collection, payload) => {\n * console.log(`${collection}:${payload.action}`, payload.data);\n * });\n * ```\n */\n onAny(callback: (collection: string, payload: SubscriptionPayload) => void): () => void {\n const unsubscribers: (() => void)[] = [];\n\n this.subscriptions.forEach((_, collection) => {\n const unsub = this.subscribe(collection, (payload) => {\n callback(collection, payload);\n });\n unsubscribers.push(unsub);\n });\n\n return () => {\n unsubscribers.forEach((unsub) => unsub());\n };\n }\n\n private subscribeOnServer(collection: string): void {\n if (this.socket?.connected) {\n this.socket.emit(\"subscribe\", { collection }, (response: any) => {\n if (response.status === \"error\") {\n console.error(`[Baasix Realtime] Failed to subscribe to ${collection}:`, response.message);\n }\n });\n }\n }\n\n private unsubscribeOnServer(collection: string): void {\n if (this.socket?.connected) {\n this.socket.emit(\"unsubscribe\", { collection });\n }\n }\n\n private setupCollectionListeners(collection: string): void {\n if (!this.socket) return;\n\n const events: SubscriptionEvent[] = [\"create\", \"update\", \"delete\"];\n events.forEach((event) => {\n const eventName = `${collection}:${event}`;\n this.socket!.on(eventName, (payload: SubscriptionPayload) => {\n this.handleCollectionEvent(collection, payload);\n });\n });\n }\n\n private removeCollectionListeners(collection: string): void {\n if (!this.socket) return;\n\n const events: SubscriptionEvent[] = [\"create\", \"update\", \"delete\"];\n events.forEach((event) => {\n const eventName = `${collection}:${event}`;\n this.socket!.off(eventName);\n });\n }\n\n private handleCollectionEvent(collection: string, payload: SubscriptionPayload): void {\n const subscription = this.subscriptions.get(collection);\n if (subscription) {\n subscription.callbacks.forEach((callback) => {\n try {\n callback(payload);\n } catch (error) {\n console.error(`[Baasix Realtime] Error in subscription callback:`, error);\n }\n });\n }\n }\n\n private resubscribeAll(): void {\n this.subscriptions.forEach((_, collection) => {\n this.subscribeOnServer(collection);\n this.setupCollectionListeners(collection);\n });\n }\n\n // ===================\n // Workflow Realtime\n // ===================\n\n /**\n * Join a workflow execution room to receive real-time updates\n * \n * @example\n * ```typescript\n * const unsubscribe = baasix.realtime.subscribeToExecution(executionId, (update) => {\n * console.log('Execution update:', update);\n * if (update.status === 'complete') {\n * console.log('Workflow finished!');\n * }\n * });\n * ```\n */\n subscribeToExecution(\n executionId: string | number,\n callback: (data: WorkflowExecutionUpdate) => void\n ): () => void {\n const id = String(executionId);\n\n // Join execution room\n if (this.socket?.connected) {\n this.socket.emit(\"workflow:execution:join\", { executionId: id });\n }\n\n // Add callback\n let callbacks = this.workflowCallbacks.get(id);\n if (!callbacks) {\n callbacks = new Set();\n this.workflowCallbacks.set(id, callbacks);\n }\n callbacks.add(callback);\n\n // Return unsubscribe function\n return () => {\n const cbs = this.workflowCallbacks.get(id);\n if (cbs) {\n cbs.delete(callback);\n if (cbs.size === 0) {\n this.workflowCallbacks.delete(id);\n }\n }\n };\n }\n\n private handleWorkflowUpdate(data: WorkflowExecutionUpdate): void {\n const id = String(data.executionId);\n const callbacks = this.workflowCallbacks.get(id);\n if (callbacks) {\n callbacks.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`[Baasix Realtime] Error in workflow callback:`, error);\n }\n });\n }\n }\n\n // ===================\n // Channel (Room) API - Supabase-style\n // ===================\n\n /**\n * Create a channel for a collection (Supabase-style API)\n * \n * @example\n * ```typescript\n * const channel = baasix.realtime\n * .channel('products')\n * .on('INSERT', (payload) => console.log('New:', payload))\n * .on('UPDATE', (payload) => console.log('Updated:', payload))\n * .on('DELETE', (payload) => console.log('Deleted:', payload))\n * .subscribe();\n * \n * // Later\n * channel.unsubscribe();\n * ```\n */\n channel(collection: string): RealtimeChannel {\n return new RealtimeChannel(this, collection);\n }\n}\n\n/**\n * Chainable channel for Supabase-style subscription API\n */\nexport class RealtimeChannel {\n private realtime: RealtimeModule;\n private collection: string;\n private handlers: Map<SubscriptionEvent, ((data: any) => void)[]> = new Map();\n private unsubscribeFn: (() => void) | null = null;\n\n constructor(realtime: RealtimeModule, collection: string) {\n this.realtime = realtime;\n this.collection = collection;\n }\n\n /**\n * Add an event handler (chainable)\n * \n * @param event - 'INSERT', 'UPDATE', 'DELETE', or '*' for all\n * @param callback - Handler function\n */\n on(event: \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\", callback: (payload: any) => void): this {\n const mappedEvent = this.mapEvent(event);\n \n if (mappedEvent === \"*\") {\n // Add to all events\n ([\"create\", \"update\", \"delete\"] as SubscriptionEvent[]).forEach((e) => {\n this.addHandler(e, callback);\n });\n } else {\n this.addHandler(mappedEvent, callback);\n }\n\n return this;\n }\n\n private mapEvent(event: string): SubscriptionEvent | \"*\" {\n switch (event.toUpperCase()) {\n case \"INSERT\":\n return \"create\";\n case \"UPDATE\":\n return \"update\";\n case \"DELETE\":\n return \"delete\";\n default:\n return \"*\";\n }\n }\n\n private addHandler(event: SubscriptionEvent, callback: (data: any) => void): void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, []);\n }\n this.handlers.get(event)!.push(callback);\n }\n\n /**\n * Start the subscription\n */\n subscribe(): this {\n this.unsubscribeFn = this.realtime.subscribe(this.collection, (payload) => {\n const handlers = this.handlers.get(payload.action);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n handler(payload);\n } catch (error) {\n console.error(\"[Baasix Channel] Handler error:\", error);\n }\n });\n }\n });\n\n return this;\n }\n\n /**\n * Stop the subscription\n */\n unsubscribe(): void {\n if (this.unsubscribeFn) {\n this.unsubscribeFn();\n this.unsubscribeFn = null;\n }\n this.handlers.clear();\n }\n}\n\nexport type { Socket, SocketIOClient };\n","import type { HttpClient } from \"../client\";\nimport type { BaseItem } from \"../types\";\n\nexport interface RolesModuleConfig {\n client: HttpClient;\n}\n\nexport interface Role extends BaseItem {\n name: string;\n description?: string;\n icon?: string;\n ipWhitelist?: string;\n enforceTotp?: boolean;\n adminAccess?: boolean;\n appAccess?: boolean;\n}\n\nexport interface CreateRoleData {\n name: string;\n description?: string;\n icon?: string;\n ipWhitelist?: string;\n enforceTotp?: boolean;\n adminAccess?: boolean;\n appAccess?: boolean;\n}\n\n/**\n * Roles module for managing user roles.\n * \n * @example\n * ```typescript\n * // List all roles\n * const roles = await baasix.roles.find();\n * \n * // Create a new role\n * const role = await baasix.roles.create({\n * name: 'Editor',\n * description: 'Can edit content'\n * });\n * ```\n */\nexport class RolesModule {\n private client: HttpClient;\n private collection = \"baasix_Role\";\n\n constructor(config: RolesModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * Get all roles\n * \n * @example\n * ```typescript\n * const { data: roles } = await baasix.roles.find();\n * ```\n */\n async find(): Promise<{ data: Role[]; totalCount: number }> {\n return this.client.get<{ data: Role[]; totalCount: number }>(\n `/items/${this.collection}`,\n {\n params: { limit: -1 },\n }\n );\n }\n\n /**\n * Get a role by ID\n * \n * @example\n * ```typescript\n * const role = await baasix.roles.findOne('role-uuid');\n * ```\n */\n async findOne(id: string): Promise<Role> {\n const response = await this.client.get<{ data: Role }>(\n `/items/${this.collection}/${id}`\n );\n return response.data;\n }\n\n /**\n * Get a role by name\n * \n * @example\n * ```typescript\n * const role = await baasix.roles.findByName('Administrator');\n * ```\n */\n async findByName(name: string): Promise<Role | null> {\n const response = await this.client.get<{ data: Role[]; totalCount: number }>(\n `/items/${this.collection}`,\n {\n params: {\n filter: JSON.stringify({ name: { eq: name } }),\n limit: 1,\n },\n }\n );\n return response.data[0] || null;\n }\n\n /**\n * Create a new role\n * \n * @example\n * ```typescript\n * const id = await baasix.roles.create({\n * name: 'Editor',\n * description: 'Content editor role',\n * appAccess: true\n * });\n * ```\n */\n async create(data: CreateRoleData): Promise<string> {\n const response = await this.client.post<{ data: { id: string } }>(\n `/items/${this.collection}`,\n data\n );\n return response.data.id;\n }\n\n /**\n * Update a role\n * \n * @example\n * ```typescript\n * await baasix.roles.update('role-uuid', {\n * description: 'Updated description'\n * });\n * ```\n */\n async update(id: string, data: Partial<CreateRoleData>): Promise<void> {\n await this.client.patch(`/items/${this.collection}/${id}`, data);\n }\n\n /**\n * Delete a role\n * \n * @example\n * ```typescript\n * await baasix.roles.delete('role-uuid');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.client.delete(`/items/${this.collection}/${id}`);\n }\n}\n","import type { HttpClient } from \"../client\";\n\nexport interface UsersModuleConfig {\n client: HttpClient;\n}\n\nexport interface User {\n id: string;\n email: string;\n firstName?: string;\n lastName?: string;\n avatar?: string;\n status?: \"active\" | \"suspended\" | \"invited\";\n role_Id?: string;\n role?: {\n id: string;\n name: string;\n };\n emailVerified?: boolean;\n totpEnabled?: boolean;\n lastAccess?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\nexport interface CreateUserData {\n email: string;\n password?: string;\n firstName?: string;\n lastName?: string;\n avatar?: string;\n status?: \"active\" | \"suspended\" | \"invited\";\n role_Id?: string;\n}\n\nexport interface UpdateUserData {\n email?: string;\n firstName?: string;\n lastName?: string;\n avatar?: string;\n status?: \"active\" | \"suspended\" | \"invited\";\n role_Id?: string;\n}\n\nexport interface UserQueryOptions {\n filter?: Record<string, any>;\n sort?: string;\n limit?: number;\n page?: number;\n fields?: string[];\n}\n\n/**\n * Users module for managing users (admin operations).\n * \n * @example\n * ```typescript\n * // List all users\n * const users = await baasix.users.find();\n * \n * // Create a new user\n * const user = await baasix.users.create({\n * email: 'user@example.com',\n * firstName: 'John',\n * lastName: 'Doe',\n * role_Id: 'role-uuid'\n * });\n * ```\n */\nexport class UsersModule {\n private client: HttpClient;\n private collection = \"baasix_User\";\n\n constructor(config: UsersModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * Get all users with optional filtering\n * \n * @example\n * ```typescript\n * const { data: users } = await baasix.users.find({\n * filter: { status: { eq: 'active' } },\n * limit: 20\n * });\n * ```\n */\n async find(options: UserQueryOptions = {}): Promise<{ data: User[]; totalCount: number }> {\n const params: Record<string, any> = {};\n \n if (options.filter) {\n params.filter = JSON.stringify(options.filter);\n }\n if (options.sort) {\n params.sort = options.sort;\n }\n if (options.limit !== undefined) {\n params.limit = options.limit;\n }\n if (options.page !== undefined) {\n params.page = options.page;\n }\n if (options.fields?.length) {\n params.fields = options.fields.join(\",\");\n }\n\n return this.client.get<{ data: User[]; totalCount: number }>(\n `/items/${this.collection}`,\n { params }\n );\n }\n\n /**\n * Get a user by ID\n * \n * @example\n * ```typescript\n * const user = await baasix.users.findOne('user-uuid');\n * ```\n */\n async findOne(id: string, fields?: string[]): Promise<User> {\n const params: Record<string, any> = {};\n if (fields?.length) {\n params.fields = fields.join(\",\");\n }\n\n const response = await this.client.get<{ data: User }>(\n `/items/${this.collection}/${id}`,\n { params }\n );\n return response.data;\n }\n\n /**\n * Get a user by email\n * \n * @example\n * ```typescript\n * const user = await baasix.users.findByEmail('user@example.com');\n * ```\n */\n async findByEmail(email: string): Promise<User | null> {\n const response = await this.client.get<{ data: User[]; totalCount: number }>(\n `/items/${this.collection}`,\n {\n params: {\n filter: JSON.stringify({ email: { eq: email } }),\n limit: 1,\n },\n }\n );\n return response.data[0] || null;\n }\n\n /**\n * Create a new user\n * \n * @example\n * ```typescript\n * const id = await baasix.users.create({\n * email: 'user@example.com',\n * password: 'securepassword',\n * firstName: 'John',\n * lastName: 'Doe',\n * role_Id: 'role-uuid'\n * });\n * ```\n */\n async create(data: CreateUserData): Promise<string> {\n const response = await this.client.post<{ data: { id: string } }>(\n `/items/${this.collection}`,\n data\n );\n return response.data.id;\n }\n\n /**\n * Update a user\n * \n * @example\n * ```typescript\n * await baasix.users.update('user-uuid', {\n * firstName: 'Jane'\n * });\n * ```\n */\n async update(id: string, data: UpdateUserData): Promise<void> {\n await this.client.patch(`/items/${this.collection}/${id}`, data);\n }\n\n /**\n * Delete a user\n * \n * @example\n * ```typescript\n * await baasix.users.delete('user-uuid');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.client.delete(`/items/${this.collection}/${id}`);\n }\n\n /**\n * Change a user's password (admin operation)\n * \n * @example\n * ```typescript\n * await baasix.users.changePassword('user-uuid', 'newpassword');\n * ```\n */\n async changePassword(userId: string, newPassword: string): Promise<void> {\n await this.client.post(\"/auth/admin/change-password\", {\n userId,\n password: newPassword,\n });\n }\n\n /**\n * Suspend a user\n * \n * @example\n * ```typescript\n * await baasix.users.suspend('user-uuid');\n * ```\n */\n async suspend(id: string): Promise<void> {\n await this.client.patch(`/items/${this.collection}/${id}`, {\n status: \"suspended\",\n });\n }\n\n /**\n * Activate a user\n * \n * @example\n * ```typescript\n * await baasix.users.activate('user-uuid');\n * ```\n */\n async activate(id: string): Promise<void> {\n await this.client.patch(`/items/${this.collection}/${id}`, {\n status: \"active\",\n });\n }\n\n /**\n * Bulk create users\n * \n * @example\n * ```typescript\n * const ids = await baasix.users.createMany([\n * { email: 'user1@example.com', firstName: 'User 1' },\n * { email: 'user2@example.com', firstName: 'User 2' }\n * ]);\n * ```\n */\n async createMany(users: CreateUserData[]): Promise<string[]> {\n const response = await this.client.post<{ data: string[] }>(\n `/items/${this.collection}/bulk`,\n users\n );\n return response.data;\n }\n\n /**\n * Bulk delete users\n * \n * @example\n * ```typescript\n * await baasix.users.deleteMany(['user-uuid-1', 'user-uuid-2']);\n * ```\n */\n async deleteMany(ids: string[]): Promise<void> {\n await this.client.delete(`/items/${this.collection}/bulk`, {\n body: JSON.stringify(ids),\n });\n }\n}\n","import type { HttpClient } from \"../client\";\n\nexport interface MigrationsModuleConfig {\n client: HttpClient;\n}\n\nexport interface MigrationStatus {\n lastBatch: number;\n totalMigrations: number;\n pendingCount: number;\n completedCount: number;\n hasPending: boolean;\n}\n\nexport interface Migration {\n id: string;\n version: string;\n name: string;\n type: string;\n status: string;\n batch: number;\n migratedAt: string;\n executionTime?: number;\n}\n\nexport interface PendingMigration {\n version: string;\n name: string;\n type: string;\n path?: string;\n}\n\nexport interface MigrationRunOptions {\n /** Run only a specific migration version */\n version?: string;\n /** Run migrations up to and including this version */\n toVersion?: string;\n /** Number of migrations to run */\n step?: number;\n /** Preview without executing */\n dryRun?: boolean;\n}\n\nexport interface MigrationRunResult {\n results: Array<{\n version: string;\n name: string;\n status: \"completed\" | \"failed\";\n error?: string;\n }>;\n summary: {\n total: number;\n completed: number;\n failed: number;\n };\n}\n\nexport interface RollbackResult {\n results: Array<{\n version: string;\n name: string;\n status: string;\n }>;\n summary: {\n total: number;\n };\n}\n\nexport interface CreateMigrationOptions {\n /** Migration type (system, schema, data, custom) */\n type?: \"system\" | \"schema\" | \"data\" | \"custom\";\n /** Migration description */\n description?: string;\n /** Custom version (auto-generated if not provided) */\n version?: string;\n}\n\n/**\n * Migrations module for managing database schema migrations.\n * Admin access required for all operations.\n * \n * @example\n * ```typescript\n * // Check migration status\n * const status = await baasix.migrations.status();\n * \n * // Run pending migrations\n * if (status.hasPending) {\n * await baasix.migrations.run();\n * }\n * ```\n */\nexport class MigrationsModule {\n private client: HttpClient;\n\n constructor(config: MigrationsModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * Get migration status\n * \n * @example\n * ```typescript\n * const status = await baasix.migrations.status();\n * console.log(`Pending migrations: ${status.pendingCount}`);\n * ```\n */\n async status(): Promise<MigrationStatus> {\n const response = await this.client.get<{ data: MigrationStatus }>(\n \"/migrations/status\"\n );\n return response.data;\n }\n\n /**\n * Get all migrations with optional filtering\n * \n * @example\n * ```typescript\n * // Get all migrations\n * const migrations = await baasix.migrations.list();\n * \n * // Get completed migrations\n * const completed = await baasix.migrations.list({ status: 'completed' });\n * ```\n */\n async list(options?: {\n status?: \"pending\" | \"completed\" | \"failed\";\n type?: \"system\" | \"schema\" | \"data\" | \"custom\";\n }): Promise<Migration[]> {\n const response = await this.client.get<{ data: Migration[] }>(\"/migrations\", {\n params: options,\n });\n return response.data;\n }\n\n /**\n * Get pending migrations\n * \n * @example\n * ```typescript\n * const pending = await baasix.migrations.pending();\n * ```\n */\n async pending(): Promise<PendingMigration[]> {\n const response = await this.client.get<{ data: PendingMigration[] }>(\n \"/migrations/pending\"\n );\n return response.data;\n }\n\n /**\n * Check if migrations are needed\n * \n * @example\n * ```typescript\n * const check = await baasix.migrations.check();\n * if (check.hasPending) {\n * console.log('Migrations needed');\n * }\n * ```\n */\n async check(): Promise<{ hasPending: boolean; pendingCount: number }> {\n const response = await this.client.get<{ data: { hasPending: boolean; pendingCount: number } }>(\n \"/migrations/check\"\n );\n return response.data;\n }\n\n /**\n * Get a specific migration by version\n * \n * @example\n * ```typescript\n * const migration = await baasix.migrations.get('20231201000000');\n * ```\n */\n async get(version: string): Promise<Migration | null> {\n try {\n const response = await this.client.get<{ data: Migration }>(\n `/migrations/${encodeURIComponent(version)}`\n );\n return response.data;\n } catch {\n return null;\n }\n }\n\n /**\n * Run pending migrations\n * \n * @example\n * ```typescript\n * // Run all pending migrations\n * const result = await baasix.migrations.run();\n * \n * // Run with options\n * const result = await baasix.migrations.run({\n * step: 1, // Run only 1 migration\n * dryRun: true // Preview without executing\n * });\n * ```\n */\n async run(options?: MigrationRunOptions): Promise<MigrationRunResult> {\n const response = await this.client.post<{ data: MigrationRunResult }>(\n \"/migrations/run\",\n options || {}\n );\n return response.data;\n }\n\n /**\n * Rollback a specific migration\n * \n * @example\n * ```typescript\n * const result = await baasix.migrations.rollback('20231201000000');\n * ```\n */\n async rollback(version: string): Promise<RollbackResult> {\n const response = await this.client.post<{ data: RollbackResult }>(\n `/migrations/rollback/${encodeURIComponent(version)}`,\n {}\n );\n return response.data;\n }\n\n /**\n * Rollback the last batch of migrations\n * \n * @example\n * ```typescript\n * const result = await baasix.migrations.rollbackBatch();\n * ```\n */\n async rollbackBatch(): Promise<RollbackResult> {\n const response = await this.client.post<{ data: RollbackResult }>(\n \"/migrations/rollback-batch\",\n {}\n );\n return response.data;\n }\n\n /**\n * Create a new migration file\n * \n * @example\n * ```typescript\n * const { filepath } = await baasix.migrations.create('add_status_column', {\n * type: 'schema',\n * description: 'Add status column to orders'\n * });\n * ```\n */\n async create(\n name: string,\n options?: CreateMigrationOptions\n ): Promise<{ filepath: string }> {\n const response = await this.client.post<{ data: { filepath: string } }>(\n \"/migrations/create\",\n { name, ...options }\n );\n return response.data;\n }\n\n /**\n * Mark a specific migration as completed without running it\n * Useful for existing installations that already have the changes\n * \n * @example\n * ```typescript\n * await baasix.migrations.markCompleted('20231201000000');\n * ```\n */\n async markCompleted(\n version: string,\n metadata?: Record<string, unknown>\n ): Promise<Migration> {\n const response = await this.client.post<{ data: Migration }>(\n `/migrations/mark-completed/${encodeURIComponent(version)}`,\n { metadata }\n );\n return response.data;\n }\n\n /**\n * Mark all pending migrations as completed\n * Useful for bringing an existing database up to date without running migrations\n * \n * @example\n * ```typescript\n * // Mark all pending\n * await baasix.migrations.markAllCompleted();\n * \n * // Mark up to a specific version\n * await baasix.migrations.markAllCompleted('20231201000000');\n * ```\n */\n async markAllCompleted(toVersion?: string): Promise<MigrationRunResult> {\n const response = await this.client.post<{ data: MigrationRunResult }>(\n \"/migrations/mark-all-completed\",\n { toVersion }\n );\n return response.data;\n }\n}\n","import type { HttpClient } from \"../client\";\n\nexport interface ServerInfo {\n project?: {\n name?: string;\n multitenant?: boolean | string;\n [key: string]: unknown;\n };\n version?: string;\n [key: string]: unknown;\n}\n\nexport interface ServerModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Server module for retrieving server information.\n *\n * @example\n * ```typescript\n * const info = await baasix.server.info();\n * console.log(info.project?.name);\n * ```\n */\nexport class ServerModule {\n private client: HttpClient;\n\n constructor(config: ServerModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * Get server information including project settings\n *\n * @example\n * ```typescript\n * const info = await baasix.server.info();\n * console.log('Project:', info.project?.name);\n * console.log('Version:', info.version);\n * ```\n */\n async info(): Promise<ServerInfo> {\n return this.client.get<ServerInfo>(\"/\");\n }\n\n /**\n * Check server health\n *\n * @example\n * ```typescript\n * const isHealthy = await baasix.server.health();\n * ```\n */\n async health(): Promise<boolean> {\n try {\n await this.client.get(\"/health\");\n return true;\n } catch {\n return false;\n }\n }\n}\n","import type { StorageAdapter } from \"./types\";\n\n/**\n * Type definition for AsyncStorage-like interface (React Native)\n */\ninterface AsyncStorageLike {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n multiRemove?(keys: string[]): Promise<void>;\n getAllKeys?(): Promise<readonly string[]>;\n}\n\n/**\n * AsyncStorage adapter for React Native.\n * Wraps @react-native-async-storage/async-storage or any compatible implementation.\n *\n * @example\n * ```typescript\n * import { createBaasix, AsyncStorageAdapter } from '@baasix/sdk';\n * import AsyncStorage from '@react-native-async-storage/async-storage';\n *\n * const client = createBaasix({\n * url: 'https://api.example.com',\n * storage: new AsyncStorageAdapter(AsyncStorage),\n * });\n * ```\n */\nexport class AsyncStorageAdapter implements StorageAdapter {\n private asyncStorage: AsyncStorageLike;\n private prefix: string;\n\n constructor(asyncStorage: AsyncStorageLike, prefix = \"baasix_\") {\n this.asyncStorage = asyncStorage;\n this.prefix = prefix;\n }\n\n private getKey(key: string): string {\n if (key.startsWith(this.prefix)) {\n return key;\n }\n return `${this.prefix}${key}`;\n }\n\n async get(key: string): Promise<string | null> {\n try {\n return await this.asyncStorage.getItem(this.getKey(key));\n } catch {\n console.warn(`[Baasix SDK] Failed to get item from AsyncStorage: ${key}`);\n return null;\n }\n }\n\n async set(key: string, value: string): Promise<void> {\n try {\n await this.asyncStorage.setItem(this.getKey(key), value);\n } catch {\n console.warn(`[Baasix SDK] Failed to set item in AsyncStorage: ${key}`);\n }\n }\n\n async remove(key: string): Promise<void> {\n try {\n await this.asyncStorage.removeItem(this.getKey(key));\n } catch {\n console.warn(`[Baasix SDK] Failed to remove item from AsyncStorage: ${key}`);\n }\n }\n\n async clear(): Promise<void> {\n try {\n if (this.asyncStorage.getAllKeys && this.asyncStorage.multiRemove) {\n const allKeys = await this.asyncStorage.getAllKeys();\n const sdkKeys = allKeys.filter((key) => key.startsWith(this.prefix));\n if (sdkKeys.length > 0) {\n await this.asyncStorage.multiRemove(sdkKeys);\n }\n }\n } catch {\n console.warn(\"[Baasix SDK] Failed to clear AsyncStorage\");\n }\n }\n}\n","import { HttpClient } from \"./client\";\nimport { LocalStorageAdapter } from \"./storage/localStorage\";\nimport { MemoryStorageAdapter } from \"./storage/memoryStorage\";\nimport type { StorageAdapter } from \"./storage/types\";\nimport { STORAGE_KEYS } from \"./storage/types\";\nimport { AuthModule } from \"./modules/auth\";\nimport { ItemsModule } from \"./modules/items\";\nimport { FilesModule } from \"./modules/files\";\nimport { SchemasModule } from \"./modules/schemas\";\nimport { NotificationsModule } from \"./modules/notifications\";\nimport { PermissionsModule } from \"./modules/permissions\";\nimport { SettingsModule } from \"./modules/settings\";\nimport { ReportsModule } from \"./modules/reports\";\nimport { WorkflowsModule } from \"./modules/workflows\";\nimport { RealtimeModule } from \"./modules/realtime\";\nimport { RolesModule } from \"./modules/roles\";\nimport { UsersModule } from \"./modules/users\";\nimport { MigrationsModule } from \"./modules/migrations\";\nimport { ServerModule } from \"./modules/server\";\nimport type { AuthMode, BaasixConfig, BaseItem } from \"./types\";\n\n/**\n * Detect the current environment and return appropriate storage\n */\nfunction getDefaultStorage(): StorageAdapter {\n // Browser environment with localStorage\n if (\n typeof window !== \"undefined\" &&\n typeof window.localStorage !== \"undefined\"\n ) {\n return new LocalStorageAdapter();\n }\n\n // SSR or Node.js environment\n return new MemoryStorageAdapter();\n}\n\n/**\n * The main Baasix SDK client.\n *\n * @example\n * ```typescript\n * import { createBaasix } from '@baasix/sdk';\n *\n * // Basic setup\n * const baasix = createBaasix({\n * url: 'https://api.example.com'\n * });\n *\n * // With custom storage (React Native)\n * import AsyncStorage from '@react-native-async-storage/async-storage';\n * import { AsyncStorageAdapter } from '@baasix/sdk';\n *\n * const baasix = createBaasix({\n * url: 'https://api.example.com',\n * storage: new AsyncStorageAdapter(AsyncStorage)\n * });\n *\n * // Cookie mode (for web apps with HTTP-only cookies)\n * const baasix = createBaasix({\n * url: 'https://api.example.com',\n * authMode: 'cookie'\n * });\n *\n * // Server-side with static token\n * const baasix = createBaasix({\n * url: 'https://api.example.com',\n * token: 'your-api-token'\n * });\n * ```\n */\nexport class Baasix {\n private config: Required<\n Pick<BaasixConfig, \"url\" | \"authMode\" | \"timeout\" | \"autoRefresh\">\n > &\n BaasixConfig;\n private httpClient: HttpClient;\n private storage: StorageAdapter;\n\n // Modules\n public readonly auth: AuthModule;\n public readonly files: FilesModule;\n public readonly schemas: SchemasModule;\n public readonly notifications: NotificationsModule;\n public readonly permissions: PermissionsModule;\n public readonly settings: SettingsModule;\n public readonly reports: ReportsModule;\n public readonly workflows: WorkflowsModule;\n public readonly realtime: RealtimeModule;\n public readonly roles: RolesModule;\n public readonly users: UsersModule;\n public readonly migrations: MigrationsModule;\n public readonly server: ServerModule;\n\n // Items module factory cache\n private itemsModules: Map<string, ItemsModule<BaseItem>> = new Map();\n\n constructor(config: BaasixConfig) {\n // Validate required config\n if (!config.url) {\n throw new Error(\"Baasix SDK: url is required\");\n }\n\n // Normalize URL (remove trailing slash)\n const normalizedUrl = config.url.replace(/\\/$/, \"\");\n\n // Set defaults\n this.config = {\n ...config,\n url: normalizedUrl,\n authMode: config.authMode || \"jwt\",\n timeout: config.timeout || 30000,\n autoRefresh: config.autoRefresh !== false,\n };\n\n // Initialize storage\n this.storage = config.storage || getDefaultStorage();\n\n // Determine credentials mode\n const credentials: RequestCredentials =\n config.credentials ||\n (this.config.authMode === \"cookie\" ? \"include\" : \"same-origin\");\n\n // Initialize HTTP client\n this.httpClient = new HttpClient({\n baseUrl: normalizedUrl,\n authMode: this.config.authMode,\n storage: this.storage,\n timeout: this.config.timeout,\n autoRefresh: this.config.autoRefresh,\n credentials,\n headers: config.headers || {},\n token: config.token,\n tenantId: config.tenantId,\n onAuthError: () => {\n this.config.onAuthStateChange?.(\"SIGNED_OUT\", null);\n },\n onTokenRefresh: () => {\n // Token refreshed, could emit event if needed\n },\n });\n\n // Initialize modules\n this.auth = new AuthModule({\n client: this.httpClient,\n storage: this.storage,\n authMode: this.config.authMode,\n onAuthStateChange: config.onAuthStateChange,\n });\n\n this.files = new FilesModule({ client: this.httpClient });\n this.schemas = new SchemasModule({ client: this.httpClient });\n this.notifications = new NotificationsModule({ client: this.httpClient });\n this.permissions = new PermissionsModule({ client: this.httpClient });\n this.settings = new SettingsModule({ client: this.httpClient });\n this.reports = new ReportsModule({ client: this.httpClient });\n this.workflows = new WorkflowsModule({ client: this.httpClient });\n this.roles = new RolesModule({ client: this.httpClient });\n this.users = new UsersModule({ client: this.httpClient });\n this.migrations = new MigrationsModule({ client: this.httpClient });\n this.server = new ServerModule({ client: this.httpClient });\n \n // Realtime module needs storage for auth token\n this.realtime = new RealtimeModule({\n client: this.httpClient,\n storage: this.storage,\n socketUrl: config.socketUrl,\n socketPath: config.socketPath,\n });\n }\n\n /**\n * Get an Items module for a specific collection.\n * Returns a cached instance for repeated calls with the same collection.\n *\n * @example\n * ```typescript\n * // Get items module\n * const products = baasix.items('products');\n *\n * // CRUD operations\n * const { data } = await products.find({ filter: { status: { eq: 'active' } } });\n * const product = await products.findOne('product-uuid');\n * const id = await products.create({ name: 'New Product', price: 29.99 });\n * await products.update('product-uuid', { price: 24.99 });\n * await products.delete('product-uuid');\n *\n * // Query builder\n * const results = await baasix.items('posts')\n * .query()\n * .select('*', 'author.*')\n * .filter({ status: { eq: 'published' } })\n * .sort({ createdAt: 'desc' })\n * .limit(10)\n * .get();\n * ```\n */\n items<T extends BaseItem = BaseItem>(collection: string): ItemsModule<T> {\n if (!this.itemsModules.has(collection)) {\n this.itemsModules.set(\n collection,\n new ItemsModule(collection, { client: this.httpClient })\n );\n }\n return this.itemsModules.get(collection) as ItemsModule<T>;\n }\n\n /**\n * Alias for items() - get a collection\n *\n * @example\n * ```typescript\n * const products = baasix.collection('products');\n * ```\n */\n collection<T extends BaseItem = BaseItem>(collection: string): ItemsModule<T> {\n return this.items<T>(collection);\n }\n\n /**\n * Alias for items() - from a collection (Supabase-style)\n *\n * @example\n * ```typescript\n * const products = baasix.from('products');\n * ```\n */\n from<T extends BaseItem = BaseItem>(collection: string): ItemsModule<T> {\n return this.items<T>(collection);\n }\n\n /**\n * Get the underlying HTTP client for custom requests\n *\n * @example\n * ```typescript\n * // Custom GET request\n * const data = await baasix.request.get('/custom-endpoint');\n *\n * // Custom POST request\n * const result = await baasix.request.post('/custom-endpoint', { data: 'value' });\n * ```\n */\n get request(): HttpClient {\n return this.httpClient;\n }\n\n /**\n * Update SDK configuration\n *\n * @example\n * ```typescript\n * baasix.configure({\n * headers: { 'X-Custom-Header': 'value' }\n * });\n * ```\n */\n configure(config: Partial<BaasixConfig>): void {\n if (config.headers) {\n this.httpClient.updateConfig({ headers: config.headers });\n }\n if (config.tenantId !== undefined) {\n this.httpClient.updateConfig({ tenantId: config.tenantId });\n }\n if (config.token) {\n this.httpClient.updateConfig({ token: config.token });\n }\n if (config.timeout) {\n this.httpClient.updateConfig({ timeout: config.timeout });\n }\n }\n\n /**\n * Set the tenant for multi-tenant mode\n *\n * @example\n * ```typescript\n * baasix.setTenant('tenant-uuid');\n * ```\n */\n async setTenant(tenantId: string): Promise<void> {\n this.httpClient.updateConfig({ tenantId });\n await this.storage.set(STORAGE_KEYS.TENANT, tenantId);\n }\n\n /**\n * Get the current tenant ID\n */\n async getTenant(): Promise<string | null> {\n return await this.storage.get(STORAGE_KEYS.TENANT);\n }\n\n /**\n * Clear the tenant\n */\n async clearTenant(): Promise<void> {\n this.httpClient.updateConfig({ tenantId: undefined });\n await this.storage.remove(STORAGE_KEYS.TENANT);\n }\n\n /**\n * Set a static token (convenience method that delegates to auth.setToken)\n *\n * @example\n * ```typescript\n * baasix.setToken('your-api-token');\n * ```\n */\n async setToken(token: string): Promise<void> {\n return this.auth.setToken(token);\n }\n\n /**\n * Get the current auth token\n */\n async getToken(): Promise<string | null> {\n return this.storage.get(STORAGE_KEYS.ACCESS_TOKEN);\n }\n\n /**\n * Get the base URL\n */\n getUrl(): string {\n return this.config.url;\n }\n\n /**\n * Get the current auth mode\n */\n getAuthMode(): AuthMode {\n return this.config.authMode;\n }\n\n /**\n * Get the storage adapter\n */\n getStorage(): StorageAdapter {\n return this.storage;\n }\n}\n\n/**\n * Create a new Baasix SDK instance.\n *\n * @example\n * ```typescript\n * import { createBaasix } from '@baasix/sdk';\n *\n * const baasix = createBaasix({\n * url: 'https://api.example.com',\n * authMode: 'jwt', // or 'cookie'\n * onAuthStateChange: (event, user) => {\n * console.log('Auth state changed:', event, user);\n * }\n * });\n *\n * // Initialize on app startup\n * await baasix.auth.initialize();\n *\n * // Check if user is authenticated\n * if (await baasix.auth.isAuthenticated()) {\n * const user = await baasix.auth.getUser();\n * console.log('Logged in as:', user?.email);\n * }\n * ```\n */\nexport function createBaasix(config: BaasixConfig): Baasix {\n return new Baasix(config);\n}\n\n// Export everything\nexport { HttpClient } from \"./client\";\nexport type { RequestOptions, HttpClientConfig } from \"./client\";\n\n// Storage exports\nexport {\n LocalStorageAdapter,\n MemoryStorageAdapter,\n AsyncStorageAdapter,\n STORAGE_KEYS,\n} from \"./storage/index\";\nexport type { StorageAdapter, StorageKey } from \"./storage/index\";\n\n// Module exports\nexport { AuthModule } from \"./modules/auth\";\nexport type { \n OAuthProvider, \n OAuthOptions, \n InviteOptions, \n VerifyInviteResult \n} from \"./modules/auth\";\nexport { ItemsModule, QueryBuilder } from \"./modules/items\";\nexport type { ImportResult } from \"./modules/items\";\nexport { FilesModule } from \"./modules/files\";\nexport { SchemasModule } from \"./modules/schemas\";\nexport { NotificationsModule } from \"./modules/notifications\";\nexport { PermissionsModule } from \"./modules/permissions\";\nexport { SettingsModule } from \"./modules/settings\";\nexport { ReportsModule } from \"./modules/reports\";\nexport type { StatsQuery, StatsResult } from \"./modules/reports\";\nexport { WorkflowsModule } from \"./modules/workflows\";\nexport { RealtimeModule, RealtimeChannel } from \"./modules/realtime\";\nexport type { \n RealtimeConfig, \n SubscriptionEvent, \n SubscriptionPayload, \n WorkflowExecutionUpdate,\n SubscriptionCallback \n} from \"./modules/realtime\";\nexport { RolesModule } from \"./modules/roles\";\nexport type { Role, CreateRoleData } from \"./modules/roles\";\nexport { UsersModule } from \"./modules/users\";\nexport type { CreateUserData, UpdateUserData, UserQueryOptions } from \"./modules/users\";\nexport { MigrationsModule } from \"./modules/migrations\";\nexport type { \n MigrationStatus, \n Migration, \n PendingMigration, \n MigrationRunOptions,\n MigrationRunResult, \n RollbackResult,\n CreateMigrationOptions \n} from \"./modules/migrations\";\n\n// Type exports\nexport * from \"./types\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/storage/types.ts","../src/types.ts","../src/client.ts","../src/storage/localStorage.ts","../src/storage/memoryStorage.ts","../src/modules/auth.ts","../src/modules/items.ts","../src/modules/files.ts","../src/utils/sort.ts","../src/modules/schemas.ts","../src/modules/notifications.ts","../src/modules/permissions.ts","../src/modules/settings.ts","../src/modules/reports.ts","../src/modules/workflows.ts","../src/modules/realtime.ts","../src/modules/roles.ts","../src/modules/users.ts","../src/modules/migrations.ts","../src/modules/server.ts","../src/storage/asyncStorage.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Storage adapter interface for persisting authentication state.\n * Implement this interface to create custom storage solutions (e.g., AsyncStorage for React Native).\n */\nexport interface StorageAdapter {\n /**\n * Get a value from storage\n * @param key - The storage key\n * @returns The stored value or null if not found\n */\n get(key: string): Promise<string | null> | string | null;\n\n /**\n * Set a value in storage\n * @param key - The storage key\n * @param value - The value to store\n */\n set(key: string, value: string): Promise<void> | void;\n\n /**\n * Remove a value from storage\n * @param key - The storage key\n */\n remove(key: string): Promise<void> | void;\n\n /**\n * Clear all SDK-related values from storage\n */\n clear?(): Promise<void> | void;\n}\n\n/**\n * Storage keys used by the SDK\n */\nexport const STORAGE_KEYS = {\n ACCESS_TOKEN: \"baasix_access_token\",\n REFRESH_TOKEN: \"baasix_refresh_token\",\n TOKEN_EXPIRY: \"baasix_token_expiry\",\n USER: \"baasix_user\",\n TENANT: \"baasix_tenant\",\n} as const;\n\nexport type StorageKey = (typeof STORAGE_KEYS)[keyof typeof STORAGE_KEYS];\n","import type { StorageAdapter } from \"./storage/types\";\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\n/**\n * Authentication mode for the SDK\n * - 'jwt': Use JWT tokens stored in the configured storage adapter (default)\n * - 'cookie': Use HTTP-only cookies (server handles token storage)\n */\nexport type AuthMode = \"jwt\" | \"cookie\";\n\n/**\n * SDK Configuration options\n */\nexport interface BaasixConfig {\n /**\n * The base URL of your Baasix instance\n * @example 'https://api.example.com' or 'http://localhost:8056'\n */\n url: string;\n\n /**\n * Authentication mode\n * @default 'jwt'\n */\n authMode?: AuthMode;\n\n /**\n * Storage adapter for persisting tokens and user data\n * @default LocalStorageAdapter (web) or MemoryStorageAdapter (SSR)\n */\n storage?: StorageAdapter;\n\n /**\n * Static access token (useful for server-side or service accounts)\n * When provided, this token is used instead of stored tokens\n */\n token?: string;\n\n /**\n * Custom headers to include in all requests\n */\n headers?: Record<string, string>;\n\n /**\n * Request timeout in milliseconds\n * @default 30000 (30 seconds)\n */\n timeout?: number;\n\n /**\n * Whether to automatically refresh tokens before expiry\n * @default true\n */\n autoRefresh?: boolean;\n\n /**\n * Credentials mode for fetch requests (important for cookies)\n * @default 'include' for cookie mode, 'same-origin' for jwt mode\n */\n credentials?: RequestCredentials;\n\n /**\n * Tenant ID for multi-tenant mode\n */\n tenantId?: string;\n\n /**\n * Global error handler\n */\n onError?: (error: BaasixError) => void;\n\n /**\n * Called when authentication state changes\n */\n onAuthStateChange?: (event: AuthStateEvent, user: User | null) => void;\n\n /**\n * WebSocket server URL for realtime features\n * @default Same as url\n */\n socketUrl?: string;\n\n /**\n * WebSocket path\n * @default '/socket'\n */\n socketPath?: string;\n}\n\n// ============================================================================\n// Authentication Types\n// ============================================================================\n\nexport interface User {\n id: string;\n email: string;\n firstName?: string;\n lastName?: string;\n avatar?: string;\n role?: Role;\n role_Id?: string;\n tenant_Id?: string;\n status?: string;\n createdAt?: string;\n updatedAt?: string;\n [key: string]: unknown;\n}\n\nexport interface Role {\n id: string;\n name: string;\n description?: string;\n [key: string]: unknown;\n}\n\nexport interface Tenant {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\nexport interface AuthTokens {\n accessToken: string;\n refreshToken?: string;\n expiresAt?: number;\n expiresIn?: number;\n}\n\nexport interface LoginCredentials {\n email: string;\n password: string;\n tenantId?: string;\n}\n\nexport interface RegisterData {\n email: string;\n password: string;\n firstName?: string;\n lastName?: string;\n [key: string]: unknown;\n}\n\nexport interface AuthResponse {\n token: string;\n refreshToken?: string;\n user: User;\n expiresIn?: number;\n}\n\nexport type AuthStateEvent =\n | \"SIGNED_IN\"\n | \"SIGNED_OUT\"\n | \"TOKEN_REFRESHED\"\n | \"USER_UPDATED\"\n | \"TENANT_SWITCHED\";\n\nexport interface AuthState {\n user: User | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n error: BaasixError | null;\n}\n\nexport interface MagicLinkOptions {\n email: string;\n redirectUrl?: string;\n mode?: \"link\" | \"code\";\n}\n\nexport interface PasswordResetOptions {\n email: string;\n redirectUrl?: string;\n}\n\n// ============================================================================\n// Query Types\n// ============================================================================\n\n/**\n * Filter operators supported by Baasix\n */\nexport type FilterOperator =\n // Comparison\n | \"eq\"\n | \"ne\"\n | \"neq\"\n | \"gt\"\n | \"gte\"\n | \"lt\"\n | \"lte\"\n | \"is\"\n | \"not\"\n // Collection\n | \"in\"\n | \"notIn\"\n | \"nin\"\n // String patterns\n | \"like\"\n | \"notLike\"\n | \"iLike\"\n | \"notILike\"\n | \"ilike\"\n | \"contains\"\n | \"icontains\"\n | \"ncontains\"\n | \"startsWith\"\n | \"startsWiths\"\n | \"endsWith\"\n | \"endsWiths\"\n | \"nstartsWith\"\n | \"nstartsWiths\"\n | \"nendsWith\"\n | \"nendsWiths\"\n // Range\n | \"between\"\n | \"notBetween\"\n | \"nbetween\"\n // Null\n | \"isNull\"\n | \"isNotNull\"\n // Array (PostgreSQL)\n | \"arraycontains\"\n | \"arraycontained\"\n | \"arrayoverlap\"\n | \"arraylength\"\n // JSONB\n | \"jsonbContains\"\n | \"jsonbContainedBy\"\n | \"jsonbNotContains\"\n | \"jsonbHasKey\"\n | \"jsonbHasAnyKeys\"\n | \"jsonbHasAllKeys\"\n | \"jsonbKeyEquals\"\n | \"jsonbKeyNotEquals\"\n | \"jsonbKeyGt\"\n | \"jsonbKeyGte\"\n | \"jsonbKeyLt\"\n | \"jsonbKeyLte\"\n | \"jsonbKeyIn\"\n | \"jsonbKeyNotIn\"\n | \"jsonbKeyLike\"\n | \"jsonbKeyIsNull\"\n | \"jsonbKeyIsNotNull\"\n | \"jsonbPathExists\"\n | \"jsonbPathMatch\"\n | \"jsonbDeepValue\"\n | \"jsonbArrayLength\"\n | \"jsonbTypeOf\"\n // Geospatial (PostGIS)\n | \"within\"\n | \"containsGEO\"\n | \"intersects\"\n | \"nIntersects\"\n | \"dwithin\";\n\n/**\n * Filter value with operator\n */\nexport type FilterValue<T = unknown> =\n | T\n | { [K in FilterOperator]?: T | T[] }\n | { cast?: string };\n\n/**\n * Filter condition for a field\n */\nexport type FilterCondition = {\n [field: string]: FilterValue | FilterCondition;\n};\n\n/**\n * Logical filter operators\n */\nexport interface LogicalFilter {\n AND?: (FilterCondition | LogicalFilter)[];\n OR?: (FilterCondition | LogicalFilter)[];\n NOT?: FilterCondition | LogicalFilter;\n}\n\n/**\n * Complete filter type\n */\nexport type Filter = FilterCondition | LogicalFilter;\n\n/**\n * Sort direction\n */\nexport type SortDirection = \"asc\" | \"desc\" | \"ASC\" | \"DESC\";\n\n/**\n * Sort configuration\n */\nexport type Sort =\n | string\n | string[]\n | Record<string, SortDirection>\n | { column: string; order: SortDirection }[];\n\n/**\n * Aggregation function\n */\nexport type AggregateFunction = \"count\" | \"sum\" | \"avg\" | \"min\" | \"max\";\n\n/**\n * Aggregation configuration\n */\nexport interface AggregateConfig {\n function: AggregateFunction;\n field: string;\n}\n\nexport type Aggregate = Record<string, AggregateConfig>;\n\n/**\n * Query parameters for listing items\n */\nexport interface QueryParams<T = unknown> {\n /**\n * Fields to return\n * @example ['*'], ['id', 'name'], ['*', 'author.*']\n */\n fields?: string[];\n\n /**\n * Filter conditions\n */\n filter?: Filter;\n\n /**\n * Sorting configuration\n * @example { createdAt: 'desc' } or ['-createdAt', 'name']\n */\n sort?: Sort;\n\n /**\n * Number of items per page (-1 for all)\n * @default 10\n */\n limit?: number;\n\n /**\n * Page number (1-indexed)\n * @default 1\n */\n page?: number;\n\n /**\n * Number of items to skip\n */\n offset?: number;\n\n /**\n * Full-text search query\n */\n search?: string;\n\n /**\n * Fields to search in\n */\n searchFields?: string[];\n\n /**\n * Aggregation configuration\n */\n aggregate?: Aggregate;\n\n /**\n * Fields to group by (used with aggregate)\n */\n groupBy?: string[];\n\n /**\n * Include soft-deleted items\n * @default false\n */\n paranoid?: boolean;\n\n /**\n * Filter conditions for related items (O2M/M2M)\n */\n relConditions?: Record<string, Filter>;\n\n /**\n * Additional metadata\n */\n meta?: T;\n}\n\n// ============================================================================\n// Response Types\n// ============================================================================\n\n/**\n * Paginated response\n */\nexport interface PaginatedResponse<T> {\n data: T[];\n totalCount?: number;\n page?: number;\n limit?: number;\n totalPages?: number;\n}\n\n/**\n * Single item response\n */\nexport interface SingleResponse<T> {\n data: T;\n}\n\n/**\n * Create/Update response\n */\nexport interface MutationResponse<T = string> {\n data: T;\n message?: string;\n}\n\n/**\n * Delete response\n */\nexport interface DeleteResponse {\n data: { deleted: boolean; count?: number };\n message?: string;\n}\n\n/**\n * Bulk operation response\n */\nexport interface BulkResponse<T = string[]> {\n data: T;\n message?: string;\n errors?: Array<{ index: number; error: string }>;\n}\n\n// ============================================================================\n// Schema Types\n// ============================================================================\n\nexport type FieldType =\n | \"String\"\n | \"Text\"\n | \"HTML\"\n | \"Integer\"\n | \"BigInt\"\n | \"Float\"\n | \"Real\"\n | \"Double\"\n | \"Decimal\"\n | \"Boolean\"\n | \"Date\"\n | \"DateTime\"\n | \"Time\"\n | \"UUID\"\n | \"SUID\"\n | \"JSON\"\n | \"JSONB\"\n | \"Array\"\n | \"Geometry\"\n | \"Point\"\n | \"LineString\"\n | \"Polygon\"\n | \"Enum\";\n\n/**\n * Default value types supported by Baasix\n */\nexport type DefaultValueType =\n | { type: \"UUIDV4\" }\n | { type: \"SUID\" }\n | { type: \"NOW\" }\n | { type: \"AUTOINCREMENT\" }\n | { type: \"SQL\"; value: string }\n | { type: \"CURRENT_USER\" }\n | { type: \"CURRENT_TENANT\" };\n\nexport interface FieldDefinition {\n type: FieldType;\n primaryKey?: boolean;\n allowNull?: boolean;\n unique?: boolean;\n /**\n * Default value for the field\n * Can be a static value or a dynamic type\n * @example\n * // Static values\n * defaultValue: \"active\"\n * defaultValue: 0\n * defaultValue: false\n * defaultValue: []\n * \n * // Dynamic types\n * defaultValue: { type: \"UUIDV4\" }\n * defaultValue: { type: \"SUID\" }\n * defaultValue: { type: \"NOW\" }\n * defaultValue: { type: \"AUTOINCREMENT\" }\n * defaultValue: { type: \"SQL\", value: \"CURRENT_DATE\" }\n */\n defaultValue?: DefaultValueType | string | number | boolean | null | unknown[] | Record<string, unknown>;\n values?: {\n length?: number;\n precision?: number;\n scale?: number;\n type?: string;\n values?: string[]; // For Enum\n };\n validate?: {\n /** Minimum value for numeric fields */\n min?: number;\n /** Maximum value for numeric fields */\n max?: number;\n /** Validate as integer */\n isInt?: boolean;\n /** String must not be empty */\n notEmpty?: boolean;\n /** Validate email format */\n isEmail?: boolean;\n /** Validate URL format */\n isUrl?: boolean;\n /** String length range [min, max] */\n len?: [number, number];\n /** Pattern matching with regex (alias: matches) */\n is?: string;\n /** Pattern matching with regex (alias: is) */\n matches?: string;\n /** @deprecated Use 'is' or 'matches' instead */\n regex?: string;\n };\n comment?: string;\n}\n\nexport interface SchemaDefinition {\n name: string;\n timestamps?: boolean;\n paranoid?: boolean;\n fields: Record<string, FieldDefinition>;\n indexes?: IndexDefinition[];\n}\n\nexport interface IndexDefinition {\n name: string;\n fields: string[];\n unique?: boolean;\n}\n\nexport type RelationshipType = \"M2O\" | \"O2M\" | \"M2M\" | \"M2A\" | \"O2O\";\n\nexport interface RelationshipDefinition {\n type: RelationshipType;\n target: string;\n name: string;\n alias?: string;\n onDelete?: \"CASCADE\" | \"RESTRICT\" | \"SET NULL\";\n onUpdate?: \"CASCADE\" | \"RESTRICT\" | \"SET NULL\";\n tables?: string[]; // For M2A\n}\n\nexport interface SchemaInfo {\n collectionName: string;\n schema: SchemaDefinition;\n relationships?: RelationshipDefinition[];\n}\n\n// ============================================================================\n// File Types\n// ============================================================================\n\nexport interface FileMetadata {\n id: string;\n title?: string;\n description?: string;\n filename: string;\n mimeType: string;\n size: number;\n width?: number;\n height?: number;\n duration?: number;\n storage: string;\n path: string;\n isPublic?: boolean;\n uploadedBy?: string;\n createdAt: string;\n updatedAt?: string;\n [key: string]: unknown;\n}\n\nexport interface UploadOptions {\n title?: string;\n description?: string;\n folder?: string;\n storage?: \"local\" | \"s3\";\n isPublic?: boolean;\n metadata?: Record<string, unknown>;\n onProgress?: (progress: number) => void;\n}\n\nexport interface AssetTransformOptions {\n width?: number;\n height?: number;\n fit?: \"cover\" | \"contain\" | \"fill\" | \"inside\" | \"outside\";\n quality?: number;\n format?: \"jpeg\" | \"png\" | \"webp\" | \"avif\";\n}\n\n// ============================================================================\n// Permission Types\n// ============================================================================\n\nexport type PermissionAction = \"create\" | \"read\" | \"update\" | \"delete\";\n\nexport interface Permission {\n id: string;\n role_Id: string;\n collection: string;\n action: PermissionAction;\n fields?: string[];\n conditions?: Filter;\n defaultValues?: Record<string, unknown>;\n relConditions?: Record<string, Filter>;\n}\n\nexport interface CreatePermissionData {\n role_Id: string;\n collection: string;\n action: PermissionAction;\n fields?: string[];\n conditions?: Filter;\n defaultValues?: Record<string, unknown>;\n relConditions?: Record<string, Filter>;\n}\n\n// ============================================================================\n// Notification Types\n// ============================================================================\n\nexport interface Notification {\n id: string;\n type: string;\n title: string;\n message: string;\n data?: Record<string, unknown>;\n seen: boolean;\n user_Id: string;\n createdAt: string;\n}\n\nexport interface SendNotificationData {\n type?: string;\n title: string;\n message: string;\n data?: Record<string, unknown>;\n userIds: string[];\n}\n\n// ============================================================================\n// Workflow Types\n// ============================================================================\n\nexport interface Workflow {\n id: string;\n name: string;\n description?: string;\n trigger: WorkflowTrigger;\n nodes: WorkflowNode[];\n edges: WorkflowEdge[];\n isActive: boolean;\n createdAt: string;\n updatedAt?: string;\n}\n\nexport interface WorkflowTrigger {\n type: \"manual\" | \"webhook\" | \"schedule\" | \"hook\";\n config?: Record<string, unknown>;\n}\n\nexport interface WorkflowNode {\n id: string;\n type: string;\n config: Record<string, unknown>;\n position?: { x: number; y: number };\n}\n\nexport interface WorkflowEdge {\n id: string;\n source: string;\n target: string;\n condition?: string;\n}\n\nexport interface WorkflowExecution {\n id: string;\n workflow_Id: string;\n status: \"pending\" | \"running\" | \"completed\" | \"failed\";\n triggerData?: Record<string, unknown>;\n result?: Record<string, unknown>;\n error?: string;\n startedAt: string;\n completedAt?: string;\n}\n\n// ============================================================================\n// Report Types\n// ============================================================================\n\nexport interface ReportConfig {\n collection: string;\n filter?: Filter;\n groupBy?: string;\n aggregate?: Aggregate;\n dateRange?: {\n start: string;\n end: string;\n field?: string;\n };\n}\n\nexport interface ReportResult {\n data: Record<string, unknown>[];\n summary?: Record<string, unknown>;\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\nexport interface BaasixErrorDetails {\n code?: string;\n field?: string;\n message?: string;\n [key: string]: unknown;\n}\n\nexport class BaasixError extends Error {\n public readonly status: number;\n public readonly code?: string;\n public readonly details?: BaasixErrorDetails[];\n public readonly isRetryable: boolean;\n\n constructor(\n message: string,\n status = 500,\n code?: string,\n details?: BaasixErrorDetails[]\n ) {\n super(message);\n this.name = \"BaasixError\";\n this.status = status;\n this.code = code;\n this.details = details;\n this.isRetryable = status >= 500 || status === 429;\n\n // Maintains proper stack trace for where error was thrown\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, BaasixError);\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n status: this.status,\n code: this.code,\n details: this.details,\n };\n }\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Make all properties of T optional recursively\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\n/**\n * Extract the item type from a collection\n */\nexport type CollectionItem<T> = T extends Array<infer U> ? U : T;\n\n/**\n * Generic record type with ID\n */\nexport interface BaseItem {\n id: string;\n createdAt?: string;\n updatedAt?: string;\n deletedAt?: string;\n [key: string]: unknown;\n}\n\n/**\n * Settings configuration\n */\nexport interface Settings {\n [key: string]: unknown;\n}\n","import type { StorageAdapter } from \"./storage/types\";\nimport { STORAGE_KEYS } from \"./storage/types\";\nimport type { AuthMode, AuthTokens } from \"./types\";\nimport { BaasixError } from \"./types\";\n\nexport interface RequestOptions extends RequestInit {\n params?: Record<string, unknown>;\n timeout?: number;\n skipAuth?: boolean;\n rawResponse?: boolean;\n}\n\nexport interface HttpClientConfig {\n baseUrl: string;\n authMode: AuthMode;\n storage: StorageAdapter;\n timeout: number;\n autoRefresh: boolean;\n credentials: RequestCredentials;\n headers: Record<string, string>;\n token?: string;\n tenantId?: string;\n onAuthError?: () => void;\n onTokenRefresh?: (tokens: AuthTokens) => void;\n}\n\n/**\n * Core HTTP client for making API requests.\n * Handles authentication, token refresh, and error handling.\n */\nexport class HttpClient {\n private config: HttpClientConfig;\n private refreshPromise: Promise<AuthTokens> | null = null;\n\n constructor(config: HttpClientConfig) {\n this.config = config;\n }\n\n /**\n * Update client configuration\n */\n updateConfig(config: Partial<HttpClientConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Get the current base URL\n */\n getBaseUrl(): string {\n return this.config.baseUrl;\n }\n\n /**\n * Build the full URL with query parameters\n */\n private buildUrl(path: string, params?: Record<string, unknown>): string {\n const url = new URL(path, this.config.baseUrl);\n\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n if (typeof value === \"object\") {\n url.searchParams.set(key, JSON.stringify(value));\n } else {\n url.searchParams.set(key, String(value));\n }\n }\n });\n }\n\n return url.toString();\n }\n\n /**\n * Get the current access token\n */\n private async getAccessToken(): Promise<string | null> {\n // Static token takes precedence\n if (this.config.token) {\n return this.config.token;\n }\n\n // Cookie mode doesn't need token header\n if (this.config.authMode === \"cookie\") {\n return null;\n }\n\n const token = await this.config.storage.get(STORAGE_KEYS.ACCESS_TOKEN);\n return token;\n }\n\n /**\n * Check if token is expired or about to expire (within 60 seconds)\n */\n private async isTokenExpired(): Promise<boolean> {\n const expiry = await this.config.storage.get(STORAGE_KEYS.TOKEN_EXPIRY);\n if (!expiry) return false;\n\n const expiryTime = parseInt(expiry, 10);\n const bufferTime = 60 * 1000; // 60 seconds buffer\n return Date.now() >= expiryTime - bufferTime;\n }\n\n /**\n * Refresh the access token\n */\n private async refreshToken(): Promise<AuthTokens> {\n // Prevent multiple simultaneous refresh requests\n if (this.refreshPromise) {\n return this.refreshPromise;\n }\n\n this.refreshPromise = (async () => {\n try {\n const refreshToken = await this.config.storage.get(\n STORAGE_KEYS.REFRESH_TOKEN\n );\n\n if (!refreshToken && this.config.authMode === \"jwt\") {\n throw new BaasixError(\"No refresh token available\", 401, \"NO_REFRESH_TOKEN\");\n }\n\n const response = await fetch(\n this.buildUrl(\"/auth/refresh\"),\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.config.headers,\n },\n body: this.config.authMode === \"jwt\" ? JSON.stringify({ refreshToken }) : undefined,\n credentials: this.config.credentials,\n }\n );\n\n if (!response.ok) {\n throw new BaasixError(\"Token refresh failed\", response.status, \"REFRESH_FAILED\");\n }\n\n const data = await response.json();\n const tokens: AuthTokens = {\n accessToken: data.token,\n refreshToken: data.refreshToken,\n expiresIn: data.expiresIn,\n expiresAt: data.expiresIn\n ? Date.now() + data.expiresIn * 1000\n : undefined,\n };\n\n // Store new tokens\n await this.config.storage.set(STORAGE_KEYS.ACCESS_TOKEN, tokens.accessToken);\n if (tokens.refreshToken) {\n await this.config.storage.set(STORAGE_KEYS.REFRESH_TOKEN, tokens.refreshToken);\n }\n if (tokens.expiresAt) {\n await this.config.storage.set(\n STORAGE_KEYS.TOKEN_EXPIRY,\n tokens.expiresAt.toString()\n );\n }\n\n this.config.onTokenRefresh?.(tokens);\n return tokens;\n } finally {\n this.refreshPromise = null;\n }\n })();\n\n return this.refreshPromise;\n }\n\n /**\n * Build request headers\n */\n private async buildHeaders(\n options: RequestOptions = {}\n ): Promise<HeadersInit> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...this.config.headers,\n };\n\n // Add tenant header if configured\n if (this.config.tenantId) {\n headers[\"X-Tenant-Id\"] = this.config.tenantId;\n }\n\n // Skip auth for public endpoints\n if (options.skipAuth) {\n return headers;\n }\n\n // Add authorization header for JWT mode\n if (this.config.authMode === \"jwt\") {\n // Check if we need to refresh\n if (this.config.autoRefresh && (await this.isTokenExpired())) {\n try {\n await this.refreshToken();\n } catch {\n // Continue without refresh if it fails\n }\n }\n\n const token = await this.getAccessToken();\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n }\n\n return headers;\n }\n\n /**\n * Parse error response\n */\n private async parseError(response: Response): Promise<BaasixError> {\n let errorData: { message?: string; error?: { message?: string; code?: string }; details?: unknown[] } = {};\n\n try {\n errorData = await response.json();\n } catch {\n // Response might not be JSON\n }\n\n const message =\n errorData.error?.message ||\n errorData.message ||\n response.statusText ||\n \"Request failed\";\n\n const code = errorData.error?.code;\n const details = errorData.details as { code?: string; field?: string; message?: string }[] | undefined;\n\n return new BaasixError(message, response.status, code, details);\n }\n\n /**\n * Make an HTTP request\n */\n async request<T>(\n method: string,\n path: string,\n options: RequestOptions = {}\n ): Promise<T> {\n const { params, timeout, skipAuth, rawResponse, ...fetchOptions } = options;\n\n const url = this.buildUrl(path, params);\n const headers = await this.buildHeaders({ skipAuth });\n const requestTimeout = timeout || this.config.timeout;\n\n // Setup abort controller for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), requestTimeout);\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n ...headers,\n ...(fetchOptions.headers as Record<string, string>),\n },\n credentials: this.config.credentials,\n signal: controller.signal,\n ...fetchOptions,\n });\n\n // Handle 401 - try to refresh token and retry\n if (response.status === 401 && !skipAuth && this.config.autoRefresh) {\n try {\n await this.refreshToken();\n\n // Retry the request with new token\n const retryHeaders = await this.buildHeaders({ skipAuth: false });\n const retryResponse = await fetch(url, {\n method,\n headers: {\n ...retryHeaders,\n ...(fetchOptions.headers as Record<string, string>),\n },\n credentials: this.config.credentials,\n ...fetchOptions,\n });\n\n if (!retryResponse.ok) {\n throw await this.parseError(retryResponse);\n }\n\n if (rawResponse) {\n return retryResponse as unknown as T;\n }\n\n // Handle no-content responses\n if (retryResponse.status === 204) {\n return {} as T;\n }\n\n return await retryResponse.json();\n } catch (refreshError) {\n // Refresh failed, trigger auth error callback\n this.config.onAuthError?.();\n throw refreshError;\n }\n }\n\n if (!response.ok) {\n throw await this.parseError(response);\n }\n\n if (rawResponse) {\n return response as unknown as T;\n }\n\n // Handle no-content responses\n if (response.status === 204) {\n return {} as T;\n }\n\n return await response.json();\n } catch (error) {\n if (error instanceof BaasixError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n throw new BaasixError(\"Request timeout\", 408, \"TIMEOUT\");\n }\n throw new BaasixError(error.message, 0, \"NETWORK_ERROR\");\n }\n\n throw new BaasixError(\"Unknown error occurred\", 500, \"UNKNOWN\");\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * GET request\n */\n get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>(\"GET\", path, options);\n }\n\n /**\n * POST request\n */\n post<T>(path: string, data?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>(\"POST\", path, {\n ...options,\n body: data ? JSON.stringify(data) : undefined,\n });\n }\n\n /**\n * PATCH request\n */\n patch<T>(path: string, data?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>(\"PATCH\", path, {\n ...options,\n body: data ? JSON.stringify(data) : undefined,\n });\n }\n\n /**\n * PUT request\n */\n put<T>(path: string, data?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>(\"PUT\", path, {\n ...options,\n body: data ? JSON.stringify(data) : undefined,\n });\n }\n\n /**\n * DELETE request\n */\n delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>(\"DELETE\", path, options);\n }\n\n /**\n * Upload file with multipart/form-data\n */\n async upload<T>(\n path: string,\n formData: FormData,\n options?: Omit<RequestOptions, \"body\"> & {\n onProgress?: (progress: number) => void;\n }\n ): Promise<T> {\n const { params, timeout, skipAuth, onProgress } = options || {};\n\n const url = this.buildUrl(path, params);\n const headers = await this.buildHeaders({ skipAuth });\n const requestTimeout = timeout || this.config.timeout;\n\n // Remove Content-Type to let browser set it with boundary\n delete (headers as Record<string, string>)[\"Content-Type\"];\n\n // Use XMLHttpRequest for progress support\n if (onProgress && typeof XMLHttpRequest !== \"undefined\") {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open(\"POST\", url);\n\n // Set headers\n Object.entries(headers as Record<string, string>).forEach(\n ([key, value]) => {\n xhr.setRequestHeader(key, value);\n }\n );\n\n xhr.withCredentials = this.config.credentials === \"include\";\n\n xhr.upload.onprogress = (event) => {\n if (event.lengthComputable) {\n const progress = Math.round((event.loaded / event.total) * 100);\n onProgress(progress);\n }\n };\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n resolve(JSON.parse(xhr.responseText));\n } catch {\n resolve({} as T);\n }\n } else {\n reject(\n new BaasixError(\n xhr.statusText || \"Upload failed\",\n xhr.status,\n \"UPLOAD_ERROR\"\n )\n );\n }\n };\n\n xhr.onerror = () => {\n reject(new BaasixError(\"Network error during upload\", 0, \"NETWORK_ERROR\"));\n };\n\n xhr.ontimeout = () => {\n reject(new BaasixError(\"Upload timeout\", 408, \"TIMEOUT\"));\n };\n\n xhr.timeout = requestTimeout;\n xhr.send(formData);\n });\n }\n\n // Fallback to fetch without progress\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), requestTimeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: formData,\n credentials: this.config.credentials,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n throw await this.parseError(response);\n }\n\n return await response.json();\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n","import type { StorageAdapter } from \"./types\";\n\n/**\n * LocalStorage adapter for web browsers.\n * This is the default storage adapter used when running in a browser environment.\n *\n * @example\n * ```typescript\n * import { createBaasix, LocalStorageAdapter } from '@baasix/sdk';\n *\n * const client = createBaasix({\n * url: 'https://api.example.com',\n * storage: new LocalStorageAdapter(),\n * });\n * ```\n */\nexport class LocalStorageAdapter implements StorageAdapter {\n private prefix: string;\n\n constructor(prefix = \"baasix_\") {\n this.prefix = prefix;\n }\n\n private getKey(key: string): string {\n // If key already starts with prefix, don't add it again\n if (key.startsWith(this.prefix)) {\n return key;\n }\n return `${this.prefix}${key}`;\n }\n\n get(key: string): string | null {\n if (typeof window === \"undefined\" || !window.localStorage) {\n return null;\n }\n try {\n return localStorage.getItem(this.getKey(key));\n } catch {\n console.warn(`[Baasix SDK] Failed to get item from localStorage: ${key}`);\n return null;\n }\n }\n\n set(key: string, value: string): void {\n if (typeof window === \"undefined\" || !window.localStorage) {\n return;\n }\n try {\n localStorage.setItem(this.getKey(key), value);\n } catch {\n console.warn(`[Baasix SDK] Failed to set item in localStorage: ${key}`);\n }\n }\n\n remove(key: string): void {\n if (typeof window === \"undefined\" || !window.localStorage) {\n return;\n }\n try {\n localStorage.removeItem(this.getKey(key));\n } catch {\n console.warn(`[Baasix SDK] Failed to remove item from localStorage: ${key}`);\n }\n }\n\n clear(): void {\n if (typeof window === \"undefined\" || !window.localStorage) {\n return;\n }\n try {\n const keysToRemove: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.prefix)) {\n keysToRemove.push(key);\n }\n }\n keysToRemove.forEach((key) => localStorage.removeItem(key));\n } catch {\n console.warn(\"[Baasix SDK] Failed to clear localStorage\");\n }\n }\n}\n","import type { StorageAdapter } from \"./types\";\n\n/**\n * In-memory storage adapter.\n * Useful for server-side rendering (SSR), testing, or environments without persistent storage.\n * Data is lost when the application restarts.\n *\n * @example\n * ```typescript\n * import { createBaasix, MemoryStorageAdapter } from '@baasix/sdk';\n *\n * const client = createBaasix({\n * url: 'https://api.example.com',\n * storage: new MemoryStorageAdapter(),\n * });\n * ```\n */\nexport class MemoryStorageAdapter implements StorageAdapter {\n private store: Map<string, string>;\n\n constructor() {\n this.store = new Map();\n }\n\n get(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n set(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n remove(key: string): void {\n this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n\n /**\n * Get all stored keys (useful for debugging)\n */\n keys(): string[] {\n return Array.from(this.store.keys());\n }\n\n /**\n * Get the number of stored items\n */\n size(): number {\n return this.store.size;\n }\n}\n","import type { HttpClient } from \"../client\";\nimport type { StorageAdapter } from \"../storage/types\";\nimport { STORAGE_KEYS } from \"../storage/types\";\nimport type {\n AuthMode,\n AuthResponse,\n AuthState,\n AuthStateEvent,\n AuthTokens,\n LoginCredentials,\n MagicLinkOptions,\n PasswordResetOptions,\n RegisterData,\n Tenant,\n User,\n} from \"../types\";\nimport { BaasixError } from \"../types\";\n\nexport type OAuthProvider = \"google\" | \"facebook\" | \"apple\" | \"github\";\n\nexport interface OAuthOptions {\n provider: OAuthProvider;\n redirectUrl: string;\n scopes?: string[];\n state?: string;\n}\n\nexport interface InviteOptions {\n email: string;\n roleId: string;\n tenantId?: string;\n redirectUrl: string;\n}\n\nexport interface VerifyInviteResult {\n valid: boolean;\n email?: string;\n tenantId?: string;\n roleId?: string;\n}\n\nexport interface AuthModuleConfig {\n client: HttpClient;\n storage: StorageAdapter;\n authMode: AuthMode;\n onAuthStateChange?: (event: AuthStateEvent, user: User | null) => void;\n}\n\n/**\n * Authentication module for handling user authentication, sessions, and token management.\n *\n * @example\n * ```typescript\n * // Login\n * const { user, token } = await baasix.auth.login({\n * email: 'user@example.com',\n * password: 'password123'\n * });\n *\n * // Get current user\n * const user = await baasix.auth.getUser();\n *\n * // Logout\n * await baasix.auth.logout();\n * ```\n */\nexport class AuthModule {\n private client: HttpClient;\n private storage: StorageAdapter;\n private authMode: AuthMode;\n private onAuthStateChange?: (event: AuthStateEvent, user: User | null) => void;\n private currentUser: User | null = null;\n\n constructor(config: AuthModuleConfig) {\n this.client = config.client;\n this.storage = config.storage;\n this.authMode = config.authMode;\n this.onAuthStateChange = config.onAuthStateChange;\n }\n\n /**\n * Emit an authentication state change event\n */\n private emitAuthStateChange(event: AuthStateEvent, user: User | null): void {\n this.currentUser = user;\n this.onAuthStateChange?.(event, user);\n }\n\n /**\n * Store authentication tokens\n */\n private async storeTokens(response: AuthResponse): Promise<void> {\n if (this.authMode === \"jwt\") {\n await this.storage.set(STORAGE_KEYS.ACCESS_TOKEN, response.token);\n\n if (response.refreshToken) {\n await this.storage.set(STORAGE_KEYS.REFRESH_TOKEN, response.refreshToken);\n }\n\n if (response.expiresIn) {\n const expiresAt = Date.now() + response.expiresIn * 1000;\n await this.storage.set(STORAGE_KEYS.TOKEN_EXPIRY, expiresAt.toString());\n }\n }\n\n // Store user info\n if (response.user) {\n await this.storage.set(STORAGE_KEYS.USER, JSON.stringify(response.user));\n }\n }\n\n /**\n * Clear stored authentication data\n */\n private async clearAuth(): Promise<void> {\n await this.storage.remove(STORAGE_KEYS.ACCESS_TOKEN);\n await this.storage.remove(STORAGE_KEYS.REFRESH_TOKEN);\n await this.storage.remove(STORAGE_KEYS.TOKEN_EXPIRY);\n await this.storage.remove(STORAGE_KEYS.USER);\n await this.storage.remove(STORAGE_KEYS.TENANT);\n this.currentUser = null;\n }\n\n /**\n * Register a new user\n *\n * @example\n * ```typescript\n * const { user, token } = await baasix.auth.register({\n * email: 'newuser@example.com',\n * password: 'securepassword',\n * firstName: 'John',\n * lastName: 'Doe'\n * });\n * ```\n */\n async register(data: RegisterData): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\"/auth/register\", data, {\n skipAuth: true,\n });\n\n await this.storeTokens(response);\n this.emitAuthStateChange(\"SIGNED_IN\", response.user);\n\n return response;\n }\n\n /**\n * Login with email and password\n *\n * @example\n * ```typescript\n * const { user, token } = await baasix.auth.login({\n * email: 'user@example.com',\n * password: 'password123'\n * });\n *\n * // Login with tenant (multi-tenant mode)\n * const result = await baasix.auth.login({\n * email: 'user@example.com',\n * password: 'password123',\n * tenantId: 'tenant-uuid'\n * });\n * ```\n */\n async login(credentials: LoginCredentials): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\n \"/auth/login\",\n {\n email: credentials.email,\n password: credentials.password,\n tenant_Id: credentials.tenantId,\n },\n { skipAuth: true }\n );\n\n await this.storeTokens(response);\n this.emitAuthStateChange(\"SIGNED_IN\", response.user);\n\n return response;\n }\n\n /**\n * Logout the current user\n *\n * @example\n * ```typescript\n * await baasix.auth.logout();\n * ```\n */\n async logout(): Promise<void> {\n try {\n await this.client.get(\"/auth/logout\");\n } catch {\n // Ignore logout errors - we still want to clear local state\n }\n\n await this.clearAuth();\n this.emitAuthStateChange(\"SIGNED_OUT\", null);\n }\n\n /**\n * Get the current authenticated user from the server\n *\n * @example\n * ```typescript\n * const user = await baasix.auth.getUser();\n * console.log(user?.email);\n * ```\n */\n async getUser(): Promise<User | null> {\n try {\n const response = await this.client.get<{ data: User }>(\"/auth/me\");\n this.currentUser = response.data;\n await this.storage.set(STORAGE_KEYS.USER, JSON.stringify(response.data));\n return response.data;\n } catch (error) {\n if (error instanceof BaasixError && error.status === 401) {\n await this.clearAuth();\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Get the cached current user (does not make an API call)\n *\n * @example\n * ```typescript\n * const user = await baasix.auth.getCachedUser();\n * ```\n */\n async getCachedUser(): Promise<User | null> {\n if (this.currentUser) {\n return this.currentUser;\n }\n\n const userJson = await this.storage.get(STORAGE_KEYS.USER);\n if (userJson) {\n try {\n this.currentUser = JSON.parse(userJson);\n return this.currentUser;\n } catch {\n return null;\n }\n }\n\n return null;\n }\n\n /**\n * Check if user is authenticated (has valid token)\n *\n * @example\n * ```typescript\n * if (await baasix.auth.isAuthenticated()) {\n * // User is logged in\n * }\n * ```\n */\n async isAuthenticated(): Promise<boolean> {\n if (this.authMode === \"cookie\") {\n // For cookie mode, try to get user\n const user = await this.getCachedUser();\n return user !== null;\n }\n\n const token = await this.storage.get(STORAGE_KEYS.ACCESS_TOKEN);\n if (!token) return false;\n\n // Check expiry\n const expiry = await this.storage.get(STORAGE_KEYS.TOKEN_EXPIRY);\n if (expiry && Date.now() >= parseInt(expiry, 10)) {\n // Token expired, check if we have refresh token\n const refreshToken = await this.storage.get(STORAGE_KEYS.REFRESH_TOKEN);\n return !!refreshToken;\n }\n\n return true;\n }\n\n /**\n * Get the current access token\n *\n * @example\n * ```typescript\n * const token = await baasix.auth.getToken();\n * ```\n */\n async getToken(): Promise<string | null> {\n if (this.authMode === \"cookie\") {\n return null;\n }\n return await this.storage.get(STORAGE_KEYS.ACCESS_TOKEN);\n }\n\n /**\n * Set a static token (useful for server-side or service accounts)\n *\n * @example\n * ```typescript\n * baasix.auth.setToken('your-api-token');\n * ```\n */\n async setToken(token: string): Promise<void> {\n await this.storage.set(STORAGE_KEYS.ACCESS_TOKEN, token);\n }\n\n /**\n * Refresh the current token\n *\n * @example\n * ```typescript\n * const tokens = await baasix.auth.refreshToken();\n * ```\n */\n async refreshToken(): Promise<AuthTokens> {\n const refreshToken = await this.storage.get(STORAGE_KEYS.REFRESH_TOKEN);\n\n const response = await this.client.post<AuthResponse>(\n \"/auth/refresh\",\n this.authMode === \"jwt\" ? { refreshToken } : undefined\n );\n\n await this.storeTokens(response);\n\n const tokens: AuthTokens = {\n accessToken: response.token,\n refreshToken: response.refreshToken,\n expiresIn: response.expiresIn,\n expiresAt: response.expiresIn\n ? Date.now() + response.expiresIn * 1000\n : undefined,\n };\n\n this.emitAuthStateChange(\"TOKEN_REFRESHED\", response.user);\n\n return tokens;\n }\n\n /**\n * Request a magic link for passwordless login\n *\n * @example\n * ```typescript\n * await baasix.auth.sendMagicLink({\n * email: 'user@example.com',\n * redirectUrl: 'https://myapp.com/auth/callback'\n * });\n * ```\n */\n async sendMagicLink(options: MagicLinkOptions): Promise<void> {\n await this.client.post(\n \"/auth/magiclink\",\n {\n email: options.email,\n link: options.redirectUrl,\n mode: options.mode || \"link\",\n },\n { skipAuth: true }\n );\n }\n\n /**\n * Verify magic link/code and complete login\n *\n * @example\n * ```typescript\n * const { user, token } = await baasix.auth.verifyMagicLink('verification-token');\n * ```\n */\n async verifyMagicLink(token: string): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\n \"/auth/magiclink/verify\",\n { token },\n { skipAuth: true }\n );\n\n await this.storeTokens(response);\n this.emitAuthStateChange(\"SIGNED_IN\", response.user);\n\n return response;\n }\n\n /**\n * Request a password reset\n *\n * @example\n * ```typescript\n * await baasix.auth.forgotPassword({\n * email: 'user@example.com',\n * redirectUrl: 'https://myapp.com/reset-password'\n * });\n * ```\n */\n async forgotPassword(options: PasswordResetOptions): Promise<void> {\n await this.client.post(\n \"/auth/forgot-password\",\n {\n email: options.email,\n link: options.redirectUrl,\n },\n { skipAuth: true }\n );\n }\n\n /**\n * Reset password using a reset token\n *\n * @example\n * ```typescript\n * await baasix.auth.resetPassword('reset-token', 'newpassword123');\n * ```\n */\n async resetPassword(token: string, newPassword: string): Promise<void> {\n await this.client.post(\n \"/auth/reset-password\",\n { token, password: newPassword },\n { skipAuth: true }\n );\n }\n\n /**\n * Change the current user's password\n *\n * @example\n * ```typescript\n * await baasix.auth.changePassword('currentPassword', 'newPassword');\n * ```\n */\n async changePassword(\n currentPassword: string,\n newPassword: string\n ): Promise<void> {\n await this.client.post(\"/auth/change-password\", {\n currentPassword,\n newPassword,\n });\n }\n\n /**\n * Update the current user's profile\n *\n * @example\n * ```typescript\n * const updatedUser = await baasix.auth.updateProfile({\n * firstName: 'Jane',\n * lastName: 'Doe'\n * });\n * ```\n */\n async updateProfile(data: Partial<User>): Promise<User> {\n const response = await this.client.patch<{ data: User }>(\"/auth/me\", data);\n await this.storage.set(STORAGE_KEYS.USER, JSON.stringify(response.data));\n this.emitAuthStateChange(\"USER_UPDATED\", response.data);\n return response.data;\n }\n\n /**\n * Get available tenants for the current user (multi-tenant mode)\n *\n * @example\n * ```typescript\n * const tenants = await baasix.auth.getTenants();\n * ```\n */\n async getTenants(): Promise<Tenant[]> {\n const response = await this.client.get<{ data: Tenant[] }>(\"/auth/tenants\");\n return response.data;\n }\n\n /**\n * Switch to a different tenant (multi-tenant mode)\n *\n * @example\n * ```typescript\n * const { user, token } = await baasix.auth.switchTenant('tenant-uuid');\n * ```\n */\n async switchTenant(tenantId: string): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\"/auth/switch-tenant\", {\n tenant_Id: tenantId,\n });\n\n await this.storeTokens(response);\n await this.storage.set(STORAGE_KEYS.TENANT, tenantId);\n this.emitAuthStateChange(\"TENANT_SWITCHED\", response.user);\n\n return response;\n }\n\n /**\n * Get the current authentication state\n *\n * @example\n * ```typescript\n * const state = await baasix.auth.getState();\n * console.log(state.isAuthenticated, state.user);\n * ```\n */\n async getState(): Promise<AuthState> {\n const isAuthenticated = await this.isAuthenticated();\n const user = await this.getCachedUser();\n\n return {\n user,\n isAuthenticated,\n isLoading: false,\n error: null,\n };\n }\n\n /**\n * Initialize authentication state from storage\n * Call this on app startup to restore previous session\n *\n * @example\n * ```typescript\n * await baasix.auth.initialize();\n * ```\n */\n async initialize(): Promise<AuthState> {\n const state = await this.getState();\n\n if (state.isAuthenticated && state.user) {\n this.emitAuthStateChange(\"SIGNED_IN\", state.user);\n }\n\n return state;\n }\n\n // ===================\n // OAuth / Social Login\n // ===================\n\n /**\n * Get the OAuth authorization URL for a provider\n * Redirect the user to this URL to start the OAuth flow\n * \n * @example\n * ```typescript\n * const url = baasix.auth.getOAuthUrl({\n * provider: 'google',\n * redirectUrl: 'https://myapp.com/auth/callback'\n * });\n * window.location.href = url;\n * ```\n */\n getOAuthUrl(options: OAuthOptions): string {\n const baseUrl = this.client.getBaseUrl();\n const params = new URLSearchParams({\n redirect_url: options.redirectUrl,\n });\n \n if (options.scopes?.length) {\n params.set(\"scopes\", options.scopes.join(\",\"));\n }\n if (options.state) {\n params.set(\"state\", options.state);\n }\n\n return `${baseUrl}/auth/signin/${options.provider}?${params.toString()}`;\n }\n\n /**\n * Handle OAuth callback and complete login\n * Call this from your callback page with the token from URL\n * \n * @example\n * ```typescript\n * // In your callback page\n * const params = new URLSearchParams(window.location.search);\n * const token = params.get('token');\n * \n * if (token) {\n * await baasix.auth.handleOAuthCallback(token);\n * }\n * ```\n */\n async handleOAuthCallback(token: string): Promise<AuthResponse> {\n // Store the token\n await this.storage.set(STORAGE_KEYS.ACCESS_TOKEN, token);\n \n // Get user info\n const user = await this.getUser();\n \n const response: AuthResponse = {\n token,\n user: user!,\n };\n \n this.emitAuthStateChange(\"SIGNED_IN\", user);\n return response;\n }\n\n // ===================\n // Email Verification\n // ===================\n\n /**\n * Request email verification\n * Sends a verification email to the current user\n * \n * @example\n * ```typescript\n * await baasix.auth.requestEmailVerification('https://myapp.com/verify-email');\n * ```\n */\n async requestEmailVerification(redirectUrl: string): Promise<void> {\n await this.client.post(\"/auth/request-verify-email\", {\n link: redirectUrl,\n });\n }\n\n /**\n * Verify email with token\n * \n * @example\n * ```typescript\n * const params = new URLSearchParams(window.location.search);\n * const token = params.get('token');\n * \n * await baasix.auth.verifyEmail(token);\n * ```\n */\n async verifyEmail(token: string): Promise<void> {\n await this.client.get(\"/auth/verify-email\", {\n params: { token },\n skipAuth: true,\n });\n }\n\n /**\n * Check if current session/token is valid\n * \n * @example\n * ```typescript\n * const isValid = await baasix.auth.checkSession();\n * ```\n */\n async checkSession(): Promise<boolean> {\n try {\n const response = await this.client.get<{ data: { valid: boolean } }>(\"/auth/check\");\n return response.data.valid;\n } catch {\n return false;\n }\n }\n\n // ===================\n // Invitation System\n // ===================\n\n /**\n * Send an invitation to a user (multi-tenant mode)\n * \n * @example\n * ```typescript\n * await baasix.auth.sendInvite({\n * email: 'newuser@example.com',\n * roleId: 'role-uuid',\n * tenantId: 'tenant-uuid',\n * redirectUrl: 'https://myapp.com/accept-invite'\n * });\n * ```\n */\n async sendInvite(options: InviteOptions): Promise<void> {\n await this.client.post(\"/auth/invite\", {\n email: options.email,\n role_Id: options.roleId,\n tenant_Id: options.tenantId,\n link: options.redirectUrl,\n });\n }\n\n /**\n * Verify an invitation token\n * \n * @example\n * ```typescript\n * const params = new URLSearchParams(window.location.search);\n * const token = params.get('token');\n * \n * const result = await baasix.auth.verifyInvite(token);\n * if (result.valid) {\n * // Show registration form with pre-filled email\n * }\n * ```\n */\n async verifyInvite(token: string, redirectUrl?: string): Promise<VerifyInviteResult> {\n const response = await this.client.get<{ data: VerifyInviteResult }>(\n \"/auth/verify-invite\",\n {\n params: { \n token,\n link: redirectUrl,\n },\n skipAuth: true,\n }\n );\n return response.data;\n }\n\n /**\n * Accept an invitation (for existing users)\n * \n * @example\n * ```typescript\n * await baasix.auth.acceptInvite(token);\n * ```\n */\n async acceptInvite(token: string): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\n \"/auth/accept-invite\",\n { token }\n );\n \n await this.storeTokens(response);\n this.emitAuthStateChange(\"SIGNED_IN\", response.user);\n \n return response;\n }\n\n /**\n * Register with an invitation token\n * \n * @example\n * ```typescript\n * const { user, token } = await baasix.auth.registerWithInvite({\n * email: 'user@example.com',\n * password: 'password',\n * firstName: 'John',\n * lastName: 'Doe',\n * inviteToken: 'invite-token'\n * });\n * ```\n */\n async registerWithInvite(data: RegisterData & { inviteToken: string }): Promise<AuthResponse> {\n const response = await this.client.post<AuthResponse>(\n \"/auth/register\",\n {\n ...data,\n inviteToken: data.inviteToken,\n },\n { skipAuth: true }\n );\n\n await this.storeTokens(response);\n this.emitAuthStateChange(\"SIGNED_IN\", response.user);\n\n return response;\n }\n}\n\n// Re-export types from types.ts\nexport type {\n AuthResponse,\n AuthState,\n AuthStateEvent,\n AuthTokens,\n LoginCredentials,\n MagicLinkOptions,\n PasswordResetOptions,\n RegisterData,\n Tenant,\n User,\n};\n","import type { HttpClient } from \"../client\";\nimport type {\n BaseItem,\n BulkResponse,\n DeleteResponse,\n Filter,\n MutationResponse,\n PaginatedResponse,\n QueryParams,\n SingleResponse,\n Sort,\n} from \"../types\";\n\nexport interface ItemsModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Query builder for constructing type-safe queries\n */\nexport class QueryBuilder<T extends BaseItem = BaseItem> {\n private collection: string;\n private client: HttpClient;\n private queryParams: QueryParams = {};\n\n constructor(collection: string, client: HttpClient) {\n this.collection = collection;\n this.client = client;\n }\n\n /**\n * Select specific fields to return\n *\n * @example\n * ```typescript\n * items.select(['id', 'name', 'author.*'])\n * items.select('*', 'category.name')\n * ```\n */\n select(...fields: string[] | [string[]]): this {\n const flatFields = fields.length === 1 && Array.isArray(fields[0])\n ? fields[0]\n : (fields as string[]);\n this.queryParams.fields = flatFields;\n return this;\n }\n\n /**\n * Alias for select()\n */\n fields(...fields: string[] | [string[]]): this {\n return this.select(...fields);\n }\n\n /**\n * Add filter conditions\n *\n * @example\n * ```typescript\n * // Simple equality\n * items.filter({ status: { eq: 'active' } })\n *\n * // Multiple conditions\n * items.filter({\n * AND: [\n * { status: { eq: 'active' } },\n * { price: { gte: 100 } }\n * ]\n * })\n *\n * // Relation filtering\n * items.filter({ 'author.name': { like: 'John' } })\n * ```\n */\n filter(filter: Filter): this {\n this.queryParams.filter = filter;\n return this;\n }\n\n /**\n * Alias for filter()\n */\n where(filter: Filter): this {\n return this.filter(filter);\n }\n\n /**\n * Sort results\n *\n * @example\n * ```typescript\n * // Object notation\n * items.sort({ createdAt: 'desc', name: 'asc' })\n *\n * // Array notation with prefix\n * items.sort(['-createdAt', 'name'])\n *\n * // String shorthand\n * items.sort('createdAt:desc')\n * ```\n */\n sort(sort: Sort): this {\n this.queryParams.sort = sort;\n return this;\n }\n\n /**\n * Alias for sort()\n */\n orderBy(sort: Sort): this {\n return this.sort(sort);\n }\n\n /**\n * Limit number of results\n *\n * @example\n * ```typescript\n * items.limit(20)\n * items.limit(-1) // All results\n * ```\n */\n limit(limit: number): this {\n this.queryParams.limit = limit;\n return this;\n }\n\n /**\n * Set page number (1-indexed)\n *\n * @example\n * ```typescript\n * items.page(2).limit(20)\n * ```\n */\n page(page: number): this {\n this.queryParams.page = page;\n return this;\n }\n\n /**\n * Skip a number of results\n *\n * @example\n * ```typescript\n * items.offset(20)\n * ```\n */\n offset(offset: number): this {\n this.queryParams.offset = offset;\n return this;\n }\n\n /**\n * Full-text search\n *\n * @example\n * ```typescript\n * items.search('keyword', ['title', 'description'])\n * ```\n */\n search(query: string, fields?: string[]): this {\n this.queryParams.search = query;\n if (fields) {\n this.queryParams.searchFields = fields;\n }\n return this;\n }\n\n /**\n * Include soft-deleted items\n *\n * @example\n * ```typescript\n * items.withDeleted()\n * ```\n */\n withDeleted(): this {\n this.queryParams.paranoid = false;\n return this;\n }\n\n /**\n * Filter related items in O2M/M2M relations\n *\n * @example\n * ```typescript\n * // Only show approved comments\n * items.relFilter({\n * comments: { approved: { eq: true } }\n * })\n * ```\n */\n relFilter(conditions: Record<string, Filter>): this {\n this.queryParams.relConditions = conditions;\n return this;\n }\n\n /**\n * Get the built query parameters\n */\n getQuery(): QueryParams {\n return { ...this.queryParams };\n }\n\n /**\n * Execute the query and return results\n *\n * @example\n * ```typescript\n * const { data, totalCount } = await items\n * .filter({ status: { eq: 'active' } })\n * .sort({ createdAt: 'desc' })\n * .limit(10)\n * .get();\n * ```\n */\n async get(): Promise<PaginatedResponse<T>> {\n return this.client.get<PaginatedResponse<T>>(`/items/${this.collection}`, {\n params: this.buildParams(),\n });\n }\n\n /**\n * Execute the query and return the first result\n *\n * @example\n * ```typescript\n * const item = await items\n * .filter({ slug: { eq: 'my-post' } })\n * .first();\n * ```\n */\n async first(): Promise<T | null> {\n const result = await this.limit(1).get();\n return result.data[0] || null;\n }\n\n /**\n * Count matching items\n *\n * @example\n * ```typescript\n * const count = await items.filter({ status: { eq: 'active' } }).count();\n * ```\n */\n async count(): Promise<number> {\n const result = await this.client.get<PaginatedResponse<T>>(\n `/items/${this.collection}`,\n {\n params: {\n ...this.buildParams(),\n limit: 0,\n },\n }\n );\n return result.totalCount || 0;\n }\n\n /**\n * Build query parameters for the request\n */\n private buildParams(): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n if (this.queryParams.fields) {\n params.fields = this.queryParams.fields;\n }\n if (this.queryParams.filter) {\n params.filter = this.queryParams.filter;\n }\n if (this.queryParams.sort) {\n params.sort = this.queryParams.sort;\n }\n if (this.queryParams.limit !== undefined) {\n params.limit = this.queryParams.limit;\n }\n if (this.queryParams.page !== undefined) {\n params.page = this.queryParams.page;\n }\n if (this.queryParams.offset !== undefined) {\n params.offset = this.queryParams.offset;\n }\n if (this.queryParams.search) {\n params.search = this.queryParams.search;\n }\n if (this.queryParams.searchFields) {\n params.searchFields = this.queryParams.searchFields;\n }\n if (this.queryParams.paranoid !== undefined) {\n params.paranoid = this.queryParams.paranoid;\n }\n if (this.queryParams.relConditions) {\n params.relConditions = this.queryParams.relConditions;\n }\n if (this.queryParams.aggregate) {\n params.aggregate = this.queryParams.aggregate;\n }\n if (this.queryParams.groupBy) {\n params.groupBy = this.queryParams.groupBy;\n }\n\n return params;\n }\n}\n\n/**\n * Items module for CRUD operations on collections.\n *\n * @example\n * ```typescript\n * const items = baasix.items('products');\n *\n * // List items\n * const products = await items.find({ filter: { status: { eq: 'active' } } });\n *\n * // Get single item\n * const product = await items.findOne('product-id');\n *\n * // Create item\n * const newProduct = await items.create({ name: 'Widget', price: 29.99 });\n *\n * // Update item\n * await items.update('product-id', { price: 24.99 });\n *\n * // Delete item\n * await items.delete('product-id');\n * ```\n */\nexport class ItemsModule<T extends BaseItem = BaseItem> {\n private collection: string;\n private client: HttpClient;\n\n constructor(collection: string, config: ItemsModuleConfig) {\n this.collection = collection;\n this.client = config.client;\n }\n\n /**\n * Create a query builder for fluent query construction\n *\n * @example\n * ```typescript\n * const results = await baasix.items('posts')\n * .query()\n * .select('*', 'author.*')\n * .filter({ status: { eq: 'published' } })\n * .sort({ createdAt: 'desc' })\n * .limit(10)\n * .get();\n * ```\n */\n query(): QueryBuilder<T> {\n return new QueryBuilder<T>(this.collection, this.client);\n }\n\n /**\n * Find items with optional query parameters\n *\n * @example\n * ```typescript\n * // Simple query\n * const { data } = await items.find();\n *\n * // With parameters\n * const { data, totalCount } = await items.find({\n * filter: { status: { eq: 'active' } },\n * sort: { createdAt: 'desc' },\n * limit: 20,\n * page: 1,\n * fields: ['id', 'name', 'price']\n * });\n * ```\n */\n async find(params?: QueryParams): Promise<PaginatedResponse<T>> {\n return this.client.get<PaginatedResponse<T>>(`/items/${this.collection}`, {\n params: params as Record<string, unknown>,\n });\n }\n\n /**\n * Alias for find()\n */\n async findMany(params?: QueryParams): Promise<PaginatedResponse<T>> {\n return this.find(params);\n }\n\n /**\n * Find a single item by ID\n *\n * @example\n * ```typescript\n * const product = await items.findOne('product-uuid');\n *\n * // With specific fields\n * const product = await items.findOne('product-uuid', {\n * fields: ['id', 'name', 'category.*']\n * });\n * ```\n */\n async findOne(\n id: string,\n params?: Pick<QueryParams, \"fields\">\n ): Promise<T> {\n const response = await this.client.get<SingleResponse<T>>(\n `/items/${this.collection}/${id}`,\n { params: params as Record<string, unknown> }\n );\n return response.data;\n }\n\n /**\n * Alias for findOne()\n */\n async get(id: string, params?: Pick<QueryParams, \"fields\">): Promise<T> {\n return this.findOne(id, params);\n }\n\n /**\n * Create a new item\n *\n * @example\n * ```typescript\n * const id = await items.create({\n * name: 'New Product',\n * price: 29.99,\n * status: 'draft'\n * });\n * ```\n */\n async create(data: Partial<T>): Promise<string> {\n const response = await this.client.post<MutationResponse<string>>(\n `/items/${this.collection}`,\n data\n );\n return response.data;\n }\n\n /**\n * Alias for create()\n */\n async insert(data: Partial<T>): Promise<string> {\n return this.create(data);\n }\n\n /**\n * Create multiple items at once\n *\n * @example\n * ```typescript\n * const ids = await items.createMany([\n * { name: 'Product 1', price: 10 },\n * { name: 'Product 2', price: 20 }\n * ]);\n * ```\n */\n async createMany(data: Partial<T>[]): Promise<string[]> {\n const response = await this.client.post<BulkResponse<string[]>>(\n `/items/${this.collection}/bulk`,\n data\n );\n return response.data;\n }\n\n /**\n * Alias for createMany()\n */\n async insertMany(data: Partial<T>[]): Promise<string[]> {\n return this.createMany(data);\n }\n\n /**\n * Update an existing item\n *\n * @example\n * ```typescript\n * await items.update('product-uuid', {\n * price: 24.99,\n * status: 'published'\n * });\n * ```\n */\n async update(id: string, data: Partial<T>): Promise<string> {\n const response = await this.client.patch<MutationResponse<string>>(\n `/items/${this.collection}/${id}`,\n data\n );\n return response.data;\n }\n\n /**\n * Update multiple items at once\n *\n * @example\n * ```typescript\n * // Update by IDs\n * await items.updateMany(['id1', 'id2'], { status: 'archived' });\n * ```\n */\n async updateMany(ids: string[], data: Partial<T>): Promise<string[]> {\n const response = await this.client.patch<BulkResponse<string[]>>(\n `/items/${this.collection}/bulk`,\n { ids, data }\n );\n return response.data;\n }\n\n /**\n * Upsert an item (create if not exists, update if exists)\n *\n * @example\n * ```typescript\n * const id = await items.upsert(\n * { sku: 'WIDGET-001' },\n * { name: 'Widget', price: 29.99, sku: 'WIDGET-001' }\n * );\n * ```\n */\n async upsert(\n filter: Filter,\n data: Partial<T>\n ): Promise<string> {\n // Try to find existing\n const existing = await this.find({ filter, limit: 1 });\n if (existing.data.length > 0) {\n return this.update(existing.data[0].id, data);\n }\n return this.create(data);\n }\n\n /**\n * Delete an item by ID\n *\n * @example\n * ```typescript\n * await items.delete('product-uuid');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.client.delete<DeleteResponse>(`/items/${this.collection}/${id}`);\n }\n\n /**\n * Delete multiple items\n *\n * @example\n * ```typescript\n * await items.deleteMany(['id1', 'id2', 'id3']);\n * ```\n */\n async deleteMany(ids: string[]): Promise<void> {\n await this.client.delete<DeleteResponse>(`/items/${this.collection}/bulk`, {\n params: { ids },\n });\n }\n\n /**\n * Soft delete an item (if paranoid mode is enabled)\n *\n * @example\n * ```typescript\n * await items.softDelete('product-uuid');\n * ```\n */\n async softDelete(id: string): Promise<void> {\n await this.update(id, { deletedAt: new Date().toISOString() } as unknown as Partial<T>);\n }\n\n /**\n * Restore a soft-deleted item\n *\n * @example\n * ```typescript\n * await items.restore('product-uuid');\n * ```\n */\n async restore(id: string): Promise<void> {\n await this.update(id, { deletedAt: null } as unknown as Partial<T>);\n }\n\n /**\n * Aggregate data with grouping\n *\n * @example\n * ```typescript\n * const results = await items.aggregate({\n * aggregate: {\n * total: { function: 'sum', field: 'amount' },\n * count: { function: 'count', field: 'id' },\n * avgPrice: { function: 'avg', field: 'price' }\n * },\n * groupBy: ['category', 'status'],\n * filter: { createdAt: { gte: '$NOW-DAYS_30' } }\n * });\n * ```\n */\n async aggregate(\n params: Pick<QueryParams, \"aggregate\" | \"groupBy\" | \"filter\">\n ): Promise<Record<string, unknown>[]> {\n const response = await this.client.get<PaginatedResponse<Record<string, unknown>>>(\n `/items/${this.collection}`,\n { params: params as Record<string, unknown> }\n );\n return response.data;\n }\n\n // ===================\n // Import Operations\n // ===================\n\n /**\n * Import items from a CSV file\n *\n * @example\n * ```typescript\n * // Browser\n * const fileInput = document.querySelector('input[type=\"file\"]');\n * const file = fileInput.files[0];\n * \n * const result = await baasix.items('products').importCSV(file);\n * \n * console.log(`Imported ${result.imported} items`);\n * ```\n */\n async importCSV(\n file: File | { uri: string; name: string; type: string }\n ): Promise<ImportResult> {\n const formData = new FormData();\n \n if (file instanceof File) {\n formData.append(\"csvFile\", file);\n } else {\n // React Native style file\n formData.append(\"csvFile\", file as any);\n }\n\n const response = await this.client.post<{ results: ImportResult }>(\n `/items/${this.collection}/import-csv`,\n formData\n );\n return response.results;\n }\n\n /**\n * Import items from a JSON file\n *\n * @example\n * ```typescript\n * const file = fileInput.files[0]; // JSON file\n * const result = await baasix.items('products').importJSON(file);\n * \n * console.log(`Imported ${result.imported} items`);\n * ```\n */\n async importJSON(\n file: File | { uri: string; name: string; type: string }\n ): Promise<ImportResult> {\n const formData = new FormData();\n \n if (file instanceof File) {\n formData.append(\"jsonFile\", file);\n } else {\n formData.append(\"jsonFile\", file as any);\n }\n\n const response = await this.client.post<{ results: ImportResult }>(\n `/items/${this.collection}/import-json`,\n formData\n );\n return response.results;\n }\n\n /**\n * Import items from an array of objects\n *\n * @example\n * ```typescript\n * const data = [\n * { name: 'Product 1', price: 29.99 },\n * { name: 'Product 2', price: 39.99 }\n * ];\n * \n * const result = await baasix.items('products').importData(data);\n * ```\n */\n async importData(data: Partial<T>[]): Promise<BulkResponse> {\n const response = await this.client.post<BulkResponse>(\n `/items/${this.collection}/bulk`,\n data\n );\n return response;\n }\n\n // ===================\n // Sort Operations\n // ===================\n\n /**\n * Sort/reorder items (move item before or after another)\n *\n * @example\n * ```typescript\n * // Move item1 before item2\n * await baasix.items('products').sortItem('item1-uuid', 'item2-uuid');\n * \n * // Move item1 after item2\n * await baasix.items('products').sortItem('item1-uuid', 'item2-uuid', 'after');\n * ```\n */\n async sortItem(\n itemId: string,\n targetItemId: string,\n mode: \"before\" | \"after\" = \"before\"\n ): Promise<void> {\n await this.client.post(`/utils/sort/${this.collection}`, {\n item: itemId,\n to: targetItemId,\n mode,\n });\n }\n\n /**\n * Reorder multiple items\n *\n * @example\n * ```typescript\n * // Set explicit order\n * await baasix.items('products').reorder([\n * 'item3-uuid',\n * 'item1-uuid',\n * 'item2-uuid'\n * ]);\n * ```\n */\n async reorder(orderedIds: string[]): Promise<void> {\n // Sort items one by one to achieve the desired order\n for (let i = 1; i < orderedIds.length; i++) {\n await this.client.post(`/utils/sort/${this.collection}`, {\n item: orderedIds[i],\n to: orderedIds[i - 1],\n mode: \"after\",\n });\n }\n }\n}\n\nexport interface ImportResult {\n imported: number;\n failed: number;\n errors: Array<{ row: number; data: Record<string, unknown>; error: string }>;\n}\n\n// Re-export types from types.ts\nexport type {\n BaseItem,\n BulkResponse,\n DeleteResponse,\n Filter,\n MutationResponse,\n PaginatedResponse,\n QueryParams,\n SingleResponse,\n Sort,\n};\n","import type { HttpClient } from \"../client\";\nimport type {\n AssetTransformOptions,\n FileMetadata,\n PaginatedResponse,\n QueryParams,\n UploadOptions,\n} from \"../types\";\n\nexport interface FilesModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Files module for file upload, management, and asset transformations.\n *\n * @example\n * ```typescript\n * // Upload a file\n * const file = await baasix.files.upload(fileInput.files[0], {\n * title: 'My Image',\n * isPublic: true\n * });\n *\n * // Get asset URL with transformations\n * const url = baasix.files.getAssetUrl(file.id, {\n * width: 200,\n * height: 200,\n * fit: 'cover'\n * });\n * ```\n */\nexport class FilesModule {\n private client: HttpClient;\n\n constructor(config: FilesModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * Upload a file\n *\n * @example\n * ```typescript\n * // Browser File API\n * const metadata = await baasix.files.upload(fileInput.files[0], {\n * title: 'Product Image',\n * folder: 'products',\n * isPublic: true,\n * onProgress: (progress) => console.log(`${progress}% uploaded`)\n * });\n *\n * // React Native with expo-image-picker\n * const metadata = await baasix.files.upload({\n * uri: result.uri,\n * name: 'photo.jpg',\n * type: 'image/jpeg'\n * });\n * ```\n */\n async upload(\n file: File | Blob | { uri: string; name: string; type: string },\n options?: UploadOptions\n ): Promise<FileMetadata> {\n const formData = new FormData();\n\n // Handle different file types (Browser File, Blob, React Native)\n if (file instanceof File || file instanceof Blob) {\n formData.append(\"file\", file);\n } else {\n // React Native style object with uri\n formData.append(\"file\", file as unknown as Blob);\n }\n\n // Add metadata options\n if (options?.title) {\n formData.append(\"title\", options.title);\n }\n if (options?.description) {\n formData.append(\"description\", options.description);\n }\n if (options?.folder) {\n formData.append(\"folder\", options.folder);\n }\n if (options?.storage) {\n formData.append(\"storage\", options.storage);\n }\n if (options?.isPublic !== undefined) {\n formData.append(\"isPublic\", String(options.isPublic));\n }\n if (options?.metadata) {\n formData.append(\"metadata\", JSON.stringify(options.metadata));\n }\n\n const response = await this.client.upload<{ data: FileMetadata }>(\n \"/files\",\n formData,\n { onProgress: options?.onProgress }\n );\n\n return response.data;\n }\n\n /**\n * Upload multiple files\n *\n * @example\n * ```typescript\n * const files = await baasix.files.uploadMany(fileInput.files, {\n * folder: 'gallery',\n * isPublic: true\n * });\n * ```\n */\n async uploadMany(\n files: FileList | File[] | Array<{ uri: string; name: string; type: string }>,\n options?: Omit<UploadOptions, \"onProgress\">\n ): Promise<FileMetadata[]> {\n const results: FileMetadata[] = [];\n \n // Handle different input types\n const fileArray: Array<File | { uri: string; name: string; type: string }> = \n files instanceof FileList \n ? Array.from(files) \n : files;\n\n for (const file of fileArray) {\n const metadata = await this.upload(file, options);\n results.push(metadata);\n }\n\n return results;\n }\n\n /**\n * List files with optional filtering\n *\n * @example\n * ```typescript\n * const { data, totalCount } = await baasix.files.find({\n * filter: { mimeType: { startsWith: 'image/' } },\n * limit: 20\n * });\n * ```\n */\n async find(params?: QueryParams): Promise<PaginatedResponse<FileMetadata>> {\n return this.client.get<PaginatedResponse<FileMetadata>>(\"/files\", {\n params: params as Record<string, unknown>,\n });\n }\n\n /**\n * Get file metadata by ID\n *\n * @example\n * ```typescript\n * const file = await baasix.files.findOne('file-uuid');\n * console.log(file.filename, file.size);\n * ```\n */\n async findOne(id: string): Promise<FileMetadata> {\n const response = await this.client.get<{ data: FileMetadata }>(`/files/${id}`);\n return response.data;\n }\n\n /**\n * Update file metadata\n *\n * @example\n * ```typescript\n * await baasix.files.update('file-uuid', {\n * title: 'Updated Title',\n * description: 'New description'\n * });\n * ```\n */\n async update(\n id: string,\n data: Partial<Pick<FileMetadata, \"title\" | \"description\" | \"isPublic\">>\n ): Promise<FileMetadata> {\n const response = await this.client.patch<{ data: FileMetadata }>(\n `/files/${id}`,\n data\n );\n return response.data;\n }\n\n /**\n * Delete a file\n *\n * @example\n * ```typescript\n * await baasix.files.delete('file-uuid');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.client.delete(`/files/${id}`);\n }\n\n /**\n * Delete multiple files\n *\n * @example\n * ```typescript\n * await baasix.files.deleteMany(['id1', 'id2', 'id3']);\n * ```\n */\n async deleteMany(ids: string[]): Promise<void> {\n await Promise.all(ids.map((id) => this.delete(id)));\n }\n\n /**\n * Get the URL for an asset with optional transformations\n *\n * @example\n * ```typescript\n * // Original file\n * const url = baasix.files.getAssetUrl('file-uuid');\n *\n * // Resized thumbnail\n * const thumbUrl = baasix.files.getAssetUrl('file-uuid', {\n * width: 200,\n * height: 200,\n * fit: 'cover',\n * quality: 80\n * });\n *\n * // Convert to WebP\n * const webpUrl = baasix.files.getAssetUrl('file-uuid', {\n * format: 'webp',\n * quality: 85\n * });\n * ```\n */\n getAssetUrl(id: string, options?: AssetTransformOptions): string {\n const baseUrl = this.client.getBaseUrl();\n const url = new URL(`/assets/${id}`, baseUrl);\n\n if (options) {\n if (options.width) {\n url.searchParams.set(\"width\", String(options.width));\n }\n if (options.height) {\n url.searchParams.set(\"height\", String(options.height));\n }\n if (options.fit) {\n url.searchParams.set(\"fit\", options.fit);\n }\n if (options.quality) {\n url.searchParams.set(\"quality\", String(options.quality));\n }\n if (options.format) {\n url.searchParams.set(\"format\", options.format);\n }\n }\n\n return url.toString();\n }\n\n /**\n * Download a file as a Blob\n *\n * @example\n * ```typescript\n * const blob = await baasix.files.download('file-uuid');\n *\n * // Create download link\n * const url = URL.createObjectURL(blob);\n * const a = document.createElement('a');\n * a.href = url;\n * a.download = 'filename.pdf';\n * a.click();\n * ```\n */\n async download(id: string, options?: AssetTransformOptions): Promise<Blob> {\n const url = this.getAssetUrl(id, options);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to download file: ${response.statusText}`);\n }\n return response.blob();\n }\n\n /**\n * Get file as base64 string (useful for React Native)\n *\n * @example\n * ```typescript\n * const base64 = await baasix.files.toBase64('file-uuid');\n * // Use in Image component: <Image source={{ uri: `data:image/jpeg;base64,${base64}` }} />\n * ```\n */\n async toBase64(id: string, options?: AssetTransformOptions): Promise<string> {\n const blob = await this.download(id, options);\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const result = reader.result as string;\n // Remove data URL prefix\n const base64 = result.split(\",\")[1];\n resolve(base64);\n };\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n }\n\n /**\n * Import file from URL\n *\n * @example\n * ```typescript\n * const file = await baasix.files.importFromUrl(\n * 'https://example.com/image.jpg',\n * { title: 'Imported Image' }\n * );\n * ```\n */\n async importFromUrl(\n url: string,\n options?: UploadOptions\n ): Promise<FileMetadata> {\n const response = await this.client.post<{ data: FileMetadata }>(\n \"/files/import\",\n {\n url,\n ...options,\n }\n );\n return response.data;\n }\n}\n\n// Re-export types\nexport type { AssetTransformOptions, FileMetadata, UploadOptions };\n","import type { Sort, SortDirection } from \"../types\";\n\n/**\n * Normalize sort parameter to string format \"field:direction,field2:direction2\"\n * This is the format expected by the API for query string parameters.\n * \n * @example\n * ```typescript\n * normalizeSort({ name: 'asc', createdAt: 'desc' })\n * // Returns: \"name:asc,createdAt:desc\"\n * \n * normalizeSort(['-createdAt', 'name'])\n * // Returns: \"createdAt:desc,name:asc\"\n * \n * normalizeSort('name:asc')\n * // Returns: \"name:asc\"\n * ```\n */\nexport function normalizeSort(sort: Sort | undefined): string | undefined {\n if (!sort) return undefined;\n\n // Already a string\n if (typeof sort === \"string\") {\n return sort;\n }\n\n // Array of strings like ['-createdAt', 'name']\n if (Array.isArray(sort)) {\n if (sort.length === 0) return undefined;\n \n // Check if it's array of objects { column, order }\n if (typeof sort[0] === \"object\" && \"column\" in sort[0]) {\n return (sort as { column: string; order: SortDirection }[])\n .map((s) => `${s.column}:${s.order.toLowerCase()}`)\n .join(\",\");\n }\n \n // Array of strings like ['-name', 'createdAt']\n return (sort as string[])\n .map((s) => {\n if (s.startsWith(\"-\")) {\n return `${s.substring(1)}:desc`;\n }\n if (s.includes(\":\")) {\n return s;\n }\n return `${s}:asc`;\n })\n .join(\",\");\n }\n\n // Object like { name: 'asc', createdAt: 'desc' }\n if (typeof sort === \"object\") {\n const entries = Object.entries(sort as Record<string, SortDirection>);\n if (entries.length === 0) return undefined;\n \n return entries\n .map(([field, direction]) => `${field}:${direction.toLowerCase()}`)\n .join(\",\");\n }\n\n return undefined;\n}\n","import type { HttpClient } from \"../client\";\nimport type {\n IndexDefinition,\n PaginatedResponse,\n RelationshipDefinition,\n SchemaDefinition,\n SchemaInfo,\n Sort,\n} from \"../types\";\nimport { normalizeSort } from \"../utils/sort\";\n\nexport interface SchemasModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Schemas module for managing database schemas, relationships, and indexes.\n *\n * @example\n * ```typescript\n * // Create a new collection\n * await baasix.schemas.create({\n * collectionName: 'products',\n * schema: {\n * name: 'Product',\n * timestamps: true,\n * fields: {\n * id: { type: 'UUID', primaryKey: true, defaultValue: { type: 'UUIDV4' } },\n * name: { type: 'String', allowNull: false },\n * price: { type: 'Decimal', values: { precision: 10, scale: 2 } }\n * }\n * }\n * });\n *\n * // Add a relationship\n * await baasix.schemas.createRelationship('products', {\n * type: 'M2O',\n * target: 'categories',\n * name: 'category',\n * alias: 'products'\n * });\n * ```\n */\nexport class SchemasModule {\n private client: HttpClient;\n\n constructor(config: SchemasModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * List all schemas\n *\n * @example\n * ```typescript\n * const { data } = await baasix.schemas.find();\n * console.log(data.map(s => s.collectionName));\n * \n * // With pagination\n * const { data } = await baasix.schemas.find({ page: 1, limit: 50 });\n * ```\n */\n async find(params?: {\n page?: number;\n limit?: number;\n sort?: Sort;\n search?: string;\n filter?: Record<string, unknown>;\n }): Promise<PaginatedResponse<SchemaInfo>> {\n const normalizedParams = params ? {\n ...params,\n sort: normalizeSort(params.sort),\n } : undefined;\n return this.client.get<PaginatedResponse<SchemaInfo>>(\"/schemas\", { params: normalizedParams });\n }\n\n /**\n * Get schema for a specific collection\n *\n * @example\n * ```typescript\n * const schema = await baasix.schemas.findOne('products');\n * console.log(schema.fields);\n * ```\n */\n async findOne(collection: string): Promise<SchemaInfo> {\n const response = await this.client.get<{ data: SchemaInfo }>(\n `/schemas/${collection}`\n );\n return response.data;\n }\n\n /**\n * Create a new collection/schema\n *\n * @example\n * ```typescript\n * await baasix.schemas.create({\n * collectionName: 'orders',\n * schema: {\n * name: 'Order',\n * timestamps: true,\n * paranoid: true,\n * fields: {\n * id: {\n * type: 'UUID',\n * primaryKey: true,\n * defaultValue: { type: 'UUIDV4' }\n * },\n * orderNumber: {\n * type: 'String',\n * allowNull: false,\n * unique: true\n * },\n * total: {\n * type: 'Decimal',\n * values: { precision: 10, scale: 2 },\n * allowNull: false,\n * defaultValue: 0\n * },\n * status: {\n * type: 'String',\n * allowNull: false,\n * defaultValue: 'pending'\n * },\n * items: {\n * type: 'JSONB',\n * allowNull: true,\n * defaultValue: []\n * }\n * }\n * }\n * });\n * ```\n */\n async create(data: {\n collectionName: string;\n schema: SchemaDefinition;\n }): Promise<SchemaInfo> {\n const response = await this.client.post<{ data: SchemaInfo }>(\n \"/schemas\",\n data\n );\n return response.data;\n }\n\n /**\n * Update an existing schema\n *\n * @example\n * ```typescript\n * await baasix.schemas.update('products', {\n * schema: {\n * name: 'Product',\n * timestamps: true,\n * fields: {\n * // Updated fields\n * description: { type: 'Text', allowNull: true }\n * }\n * }\n * });\n * ```\n */\n async update(\n collection: string,\n data: { schema: Partial<SchemaDefinition> }\n ): Promise<SchemaInfo> {\n const response = await this.client.patch<{ data: SchemaInfo }>(\n `/schemas/${collection}`,\n data\n );\n return response.data;\n }\n\n /**\n * Delete a schema (drops the table)\n *\n * @example\n * ```typescript\n * await baasix.schemas.delete('old_collection');\n * ```\n */\n async delete(collection: string): Promise<void> {\n await this.client.delete(`/schemas/${collection}`);\n }\n\n /**\n * Create a relationship between collections\n *\n * @example\n * ```typescript\n * // Many-to-One (BelongsTo)\n * await baasix.schemas.createRelationship('posts', {\n * type: 'M2O',\n * target: 'baasix_User',\n * name: 'author',\n * alias: 'posts'\n * });\n *\n * // Many-to-Many\n * await baasix.schemas.createRelationship('posts', {\n * type: 'M2M',\n * target: 'tags',\n * name: 'tags',\n * alias: 'posts'\n * });\n * ```\n */\n async createRelationship(\n collection: string,\n relationship: RelationshipDefinition\n ): Promise<void> {\n await this.client.post(\n `/schemas/${collection}/relationships`,\n relationship\n );\n }\n\n /**\n * Delete a relationship\n *\n * @example\n * ```typescript\n * await baasix.schemas.deleteRelationship('posts', 'author');\n * ```\n */\n async deleteRelationship(\n collection: string,\n relationshipName: string\n ): Promise<void> {\n await this.client.delete(\n `/schemas/${collection}/relationships/${relationshipName}`\n );\n }\n\n /**\n * Update a relationship\n *\n * @example\n * ```typescript\n * await baasix.schemas.updateRelationship('posts', 'author', {\n * alias: 'authoredPosts',\n * onDelete: 'CASCADE'\n * });\n * ```\n */\n async updateRelationship(\n collection: string,\n relationshipName: string,\n data: Partial<RelationshipDefinition>\n ): Promise<void> {\n await this.client.patch(\n `/schemas/${collection}/relationships/${relationshipName}`,\n data\n );\n }\n\n /**\n * Create an index on a collection\n *\n * @example\n * ```typescript\n * // Unique index\n * await baasix.schemas.createIndex('users', {\n * name: 'idx_users_email',\n * fields: ['email'],\n * unique: true\n * });\n *\n * // Composite index\n * await baasix.schemas.createIndex('orders', {\n * name: 'idx_orders_status_created',\n * fields: ['status', 'createdAt']\n * });\n * ```\n */\n async createIndex(\n collection: string,\n index: IndexDefinition\n ): Promise<void> {\n await this.client.post(`/schemas/${collection}/indexes`, index);\n }\n\n /**\n * Delete an index\n *\n * @example\n * ```typescript\n * await baasix.schemas.deleteIndex('users', 'idx_users_email');\n * ```\n */\n async deleteIndex(collection: string, indexName: string): Promise<void> {\n await this.client.delete(`/schemas/${collection}/indexes/${indexName}`);\n }\n\n /**\n * Add a field to an existing schema\n *\n * @example\n * ```typescript\n * await baasix.schemas.addField('products', 'rating', {\n * type: 'Decimal',\n * values: { precision: 3, scale: 2 },\n * allowNull: true,\n * defaultValue: 0\n * });\n * ```\n */\n async addField(\n collection: string,\n fieldName: string,\n fieldDefinition: SchemaDefinition[\"fields\"][string]\n ): Promise<SchemaInfo> {\n const currentSchema = await this.findOne(collection);\n const updatedFields = {\n ...currentSchema.schema.fields,\n [fieldName]: fieldDefinition,\n };\n\n return this.update(collection, {\n schema: {\n ...currentSchema.schema,\n fields: updatedFields,\n },\n });\n }\n\n /**\n * Remove a field from a schema\n *\n * @example\n * ```typescript\n * await baasix.schemas.removeField('products', 'deprecated_field');\n * ```\n */\n async removeField(\n collection: string,\n fieldName: string\n ): Promise<SchemaInfo> {\n const currentSchema = await this.findOne(collection);\n const { [fieldName]: _, ...remainingFields } = currentSchema.schema.fields;\n\n return this.update(collection, {\n schema: {\n ...currentSchema.schema,\n fields: remainingFields,\n },\n });\n }\n\n /**\n * Export all schemas as JSON\n *\n * @example\n * ```typescript\n * const schemas = await baasix.schemas.export();\n * // Save to file for backup\n * ```\n */\n async export(): Promise<SchemaInfo[]> {\n const response = await this.client.get<{ data: SchemaInfo[] }>(\n \"/schemas/export\"\n );\n return response.data;\n }\n\n /**\n * Import schemas from JSON\n *\n * @example\n * ```typescript\n * await baasix.schemas.import(savedSchemas);\n * ```\n */\n async import(schemas: SchemaInfo[]): Promise<void> {\n await this.client.post(\"/schemas/import\", { schemas });\n }\n}\n\n// Re-export types\nexport type {\n IndexDefinition,\n RelationshipDefinition,\n SchemaDefinition,\n SchemaInfo,\n};\n","import type { HttpClient } from \"../client\";\nimport type {\n Notification,\n PaginatedResponse,\n SendNotificationData,\n} from \"../types\";\n\nexport interface NotificationsModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Notifications module for managing user notifications.\n *\n * @example\n * ```typescript\n * // Get user notifications\n * const { data } = await baasix.notifications.find();\n *\n * // Mark as seen\n * await baasix.notifications.markAsSeen(['notification-id']);\n *\n * // Send notification (admin)\n * await baasix.notifications.send({\n * title: 'New Message',\n * message: 'You have a new message',\n * userIds: ['user-uuid']\n * });\n * ```\n */\nexport class NotificationsModule {\n private client: HttpClient;\n\n constructor(config: NotificationsModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * List notifications for the current user\n *\n * @example\n * ```typescript\n * const { data } = await baasix.notifications.find({\n * limit: 20,\n * filter: { seen: { eq: false } }\n * });\n * ```\n */\n async find(params?: {\n limit?: number;\n page?: number;\n filter?: Record<string, unknown>;\n }): Promise<PaginatedResponse<Notification>> {\n return this.client.get<PaginatedResponse<Notification>>(\"/notifications\", {\n params: params as Record<string, unknown>,\n });\n }\n\n /**\n * Get unread notification count\n *\n * @example\n * ```typescript\n * const count = await baasix.notifications.getUnreadCount();\n * ```\n */\n async getUnreadCount(): Promise<number> {\n const response = await this.client.get<{ count: number }>(\n \"/notifications/unread/count\"\n );\n return response.count;\n }\n\n /**\n * Mark notifications as seen\n *\n * @example\n * ```typescript\n * // Mark specific notifications as seen\n * await baasix.notifications.markAsSeen(['id1', 'id2']);\n * \n * // Mark all notifications as seen\n * await baasix.notifications.markAsSeen();\n * ```\n */\n async markAsSeen(notificationIds?: string[]): Promise<{ count: number }> {\n const response = await this.client.post<{ message: string; count: number }>(\n \"/notifications/mark-seen\",\n { notificationIds }\n );\n return { count: response.count };\n }\n\n /**\n * Delete notifications for the current user\n *\n * @example\n * ```typescript\n * // Delete specific notifications\n * await baasix.notifications.delete(['id1', 'id2']);\n * \n * // Delete all notifications\n * await baasix.notifications.delete();\n * ```\n */\n async delete(notificationIds?: string[]): Promise<{ count: number }> {\n const response = await this.client.delete<{ message: string; count: number }>(\n \"/notifications\",\n { params: notificationIds ? { notificationIds } : undefined }\n );\n return { count: response.count };\n }\n\n /**\n * Send a notification to users (requires admin permissions)\n *\n * @example\n * ```typescript\n * await baasix.notifications.send({\n * type: 'alert',\n * title: 'System Update',\n * message: 'The system will be down for maintenance',\n * data: { link: '/updates' },\n * userIds: ['user1-uuid', 'user2-uuid']\n * });\n * ```\n */\n async send(data: SendNotificationData): Promise<{ notificationIds: string[] }> {\n const response = await this.client.post<{ message: string; notificationIds: string[] }>(\n \"/notifications/send\",\n data\n );\n return { notificationIds: response.notificationIds };\n }\n\n /**\n * Cleanup old notifications (requires admin permissions)\n *\n * @example\n * ```typescript\n * // Clean up notifications older than 30 days (default)\n * await baasix.notifications.cleanup();\n * \n * // Clean up notifications older than 7 days\n * await baasix.notifications.cleanup(7);\n * ```\n */\n async cleanup(days: number = 30): Promise<{ count: number }> {\n const response = await this.client.post<{ message: string; count: number }>(\n \"/notifications/cleanup\",\n { days }\n );\n return { count: response.count };\n }\n}\n\n// Re-export types\nexport type { Notification, SendNotificationData };\n","import type { HttpClient } from \"../client\";\nimport type {\n CreatePermissionData,\n PaginatedResponse,\n Permission,\n PermissionAction,\n Role,\n} from \"../types\";\n\nexport interface PermissionsModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Permissions module for managing role-based access control.\n *\n * @example\n * ```typescript\n * // Create a permission\n * await baasix.permissions.create({\n * role_Id: 'role-uuid',\n * collection: 'products',\n * action: 'read',\n * fields: ['*'],\n * conditions: { published: { eq: true } }\n * });\n *\n * // Get permissions for a role\n * const { data } = await baasix.permissions.findByRole('role-uuid');\n * ```\n */\nexport class PermissionsModule {\n private client: HttpClient;\n\n constructor(config: PermissionsModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * List all permissions\n *\n * @example\n * ```typescript\n * const { data } = await baasix.permissions.find();\n * ```\n */\n async find(params?: {\n limit?: number;\n page?: number;\n filter?: Record<string, unknown>;\n }): Promise<PaginatedResponse<Permission>> {\n return this.client.get<PaginatedResponse<Permission>>(\"/permissions\", {\n params: params as Record<string, unknown>,\n });\n }\n\n /**\n * Get a permission by ID\n */\n async findOne(id: string): Promise<Permission> {\n const response = await this.client.get<{ data: Permission }>(\n `/permissions/${id}`\n );\n return response.data;\n }\n\n /**\n * Get permissions for a specific role\n *\n * @example\n * ```typescript\n * const { data } = await baasix.permissions.findByRole('role-uuid');\n * ```\n */\n async findByRole(roleId: string): Promise<PaginatedResponse<Permission>> {\n return this.client.get<PaginatedResponse<Permission>>(\"/permissions\", {\n params: {\n filter: { role_Id: { eq: roleId } },\n limit: -1,\n },\n });\n }\n\n /**\n * Get permissions for a specific collection\n *\n * @example\n * ```typescript\n * const { data } = await baasix.permissions.findByCollection('products');\n * ```\n */\n async findByCollection(\n collection: string\n ): Promise<PaginatedResponse<Permission>> {\n return this.client.get<PaginatedResponse<Permission>>(\"/permissions\", {\n params: {\n filter: { collection: { eq: collection } },\n limit: -1,\n },\n });\n }\n\n /**\n * Create a new permission\n *\n * @example\n * ```typescript\n * await baasix.permissions.create({\n * role_Id: 'editor-role-uuid',\n * collection: 'posts',\n * action: 'update',\n * fields: ['title', 'content', 'status'],\n * conditions: {\n * author_Id: { eq: '$CURRENT_USER' }\n * }\n * });\n * ```\n */\n async create(data: CreatePermissionData): Promise<Permission> {\n const response = await this.client.post<{ data: Permission }>(\n \"/permissions\",\n data\n );\n return response.data;\n }\n\n /**\n * Update a permission\n *\n * @example\n * ```typescript\n * await baasix.permissions.update('permission-uuid', {\n * fields: ['*'],\n * conditions: null\n * });\n * ```\n */\n async update(\n id: string,\n data: Partial<CreatePermissionData>\n ): Promise<Permission> {\n const response = await this.client.patch<{ data: Permission }>(\n `/permissions/${id}`,\n data\n );\n return response.data;\n }\n\n /**\n * Delete a permission\n *\n * @example\n * ```typescript\n * await baasix.permissions.delete('permission-uuid');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.client.delete(`/permissions/${id}`);\n }\n\n /**\n * List all roles\n *\n * @example\n * ```typescript\n * const { data } = await baasix.permissions.getRoles();\n * ```\n */\n async getRoles(): Promise<PaginatedResponse<Role>> {\n return this.client.get<PaginatedResponse<Role>>(\"/items/baasix_Role\", {\n params: { limit: -1 },\n });\n }\n\n /**\n * Create CRUD permissions for a collection\n *\n * @example\n * ```typescript\n * await baasix.permissions.createCrudPermissions('role-uuid', 'products', {\n * create: { fields: ['name', 'price', 'description'] },\n * read: { fields: ['*'] },\n * update: { fields: ['name', 'price', 'description'] },\n * delete: false\n * });\n * ```\n */\n async createCrudPermissions(\n roleId: string,\n collection: string,\n config: {\n create?: { fields?: string[]; conditions?: Permission[\"conditions\"] } | false;\n read?: { fields?: string[]; conditions?: Permission[\"conditions\"] } | false;\n update?: { fields?: string[]; conditions?: Permission[\"conditions\"] } | false;\n delete?: { conditions?: Permission[\"conditions\"] } | false;\n }\n ): Promise<Permission[]> {\n const permissions: Permission[] = [];\n const actions: PermissionAction[] = [\"create\", \"read\", \"update\", \"delete\"];\n\n for (const action of actions) {\n const actionConfig = config[action];\n if (actionConfig === false) continue;\n\n const permission = await this.create({\n role_Id: roleId,\n collection,\n action,\n fields: (actionConfig as { fields?: string[] })?.fields || [\"*\"],\n conditions: (actionConfig as { conditions?: Permission[\"conditions\"] })?.conditions,\n });\n\n permissions.push(permission);\n }\n\n return permissions;\n }\n\n /**\n * Reload permissions cache (admin only)\n *\n * @example\n * ```typescript\n * await baasix.permissions.reloadCache();\n * ```\n */\n async reloadCache(): Promise<void> {\n await this.client.post(\"/permissions/reload\");\n }\n}\n\n// Re-export types\nexport type {\n CreatePermissionData,\n Permission,\n PermissionAction,\n Role,\n};\n","import type { HttpClient } from \"../client\";\nimport type { Settings } from \"../types\";\n\nexport interface SettingsModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Settings module for managing application settings.\n *\n * @example\n * ```typescript\n * // Get all settings\n * const settings = await baasix.settings.get();\n *\n * // Update settings\n * await baasix.settings.update({\n * appName: 'My App',\n * theme: 'dark'\n * });\n * ```\n */\nexport class SettingsModule {\n private client: HttpClient;\n\n constructor(config: SettingsModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * Get all settings\n *\n * @example\n * ```typescript\n * const settings = await baasix.settings.get();\n * console.log(settings.appName);\n * ```\n */\n async get(): Promise<Settings> {\n const response = await this.client.get<{ data: Settings }>(\"/settings\");\n return response.data;\n }\n\n /**\n * Get a specific setting by key\n *\n * @example\n * ```typescript\n * const appName = await baasix.settings.getKey('appName');\n * ```\n */\n async getKey<T = unknown>(key: string): Promise<T | null> {\n const settings = await this.get();\n return (settings[key] as T) ?? null;\n }\n\n /**\n * Update settings\n *\n * @example\n * ```typescript\n * await baasix.settings.update({\n * appName: 'Updated App Name',\n * logo: 'file-uuid',\n * customConfig: {\n * feature1: true,\n * feature2: false\n * }\n * });\n * ```\n */\n async update(settings: Partial<Settings>): Promise<Settings> {\n const response = await this.client.patch<{ data: Settings }>(\n \"/settings\",\n settings\n );\n return response.data;\n }\n\n /**\n * Set a specific setting\n *\n * @example\n * ```typescript\n * await baasix.settings.set('appName', 'My New App Name');\n * ```\n */\n async set<T>(key: string, value: T): Promise<Settings> {\n return this.update({ [key]: value });\n }\n}\n\n// Re-export types\nexport type { Settings };\n","import type { HttpClient } from \"../client\";\nimport type { Aggregate, Filter, ReportConfig, ReportResult } from \"../types\";\n\nexport interface ReportsModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Stats query for the stats endpoint\n */\nexport interface StatsQuery {\n /** Unique name for this stats query */\n name: string;\n /** Collection to query */\n collection: string;\n /** Query parameters including aggregate, groupBy, filter, fields */\n query: {\n aggregate?: Aggregate;\n groupBy?: string[];\n filter?: Filter;\n fields?: string[];\n };\n}\n\n/**\n * Stats result from a single query\n */\nexport interface StatsResult {\n name: string;\n collection: string;\n data: Record<string, unknown>[];\n}\n\n/**\n * Reports module for generating analytics and reports.\n *\n * @example\n * ```typescript\n * // Generate sales report grouped by category\n * const report = await baasix.reports.generate('orders', {\n * aggregate: {\n * totalSales: { function: 'sum', field: 'total' },\n * orderCount: { function: 'count', field: 'id' },\n * avgOrderValue: { function: 'avg', field: 'total' }\n * },\n * groupBy: 'category',\n * filter: { status: { eq: 'completed' } },\n * dateRange: {\n * start: '2025-01-01',\n * end: '2025-12-31',\n * field: 'createdAt'\n * }\n * });\n * ```\n */\nexport class ReportsModule {\n private client: HttpClient;\n\n constructor(config: ReportsModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * Generate a report for a collection using POST method\n *\n * @example\n * ```typescript\n * // Sales by month\n * const report = await baasix.reports.generate('orders', {\n * aggregate: {\n * revenue: { function: 'sum', field: 'total' },\n * orders: { function: 'count', field: 'id' }\n * },\n * groupBy: ['month'],\n * dateRange: {\n * start: '2025-01-01',\n * end: '2025-12-31'\n * }\n * });\n * ```\n */\n async generate(\n collection: string,\n config: Omit<ReportConfig, \"collection\">\n ): Promise<ReportResult> {\n const response = await this.client.post<ReportResult>(\n `/reports/${collection}`,\n config\n );\n return response;\n }\n\n /**\n * Query a report for a collection using GET method with query params\n *\n * @example\n * ```typescript\n * const report = await baasix.reports.query('orders', {\n * aggregate: {\n * total: { function: 'sum', field: 'amount' }\n * },\n * groupBy: ['status']\n * });\n * ```\n */\n async query(\n collection: string,\n params?: {\n aggregate?: Aggregate;\n groupBy?: string[];\n filter?: Filter;\n fields?: string[];\n }\n ): Promise<ReportResult> {\n const response = await this.client.get<ReportResult>(\n `/reports/${collection}`,\n { params: params as Record<string, unknown> }\n );\n return response;\n }\n\n /**\n * Get statistics for multiple collections in a single request\n *\n * @example\n * ```typescript\n * const stats = await baasix.reports.getStats([\n * {\n * name: 'total_products',\n * collection: 'products',\n * query: {\n * aggregate: { count: { function: 'count', field: '*' } }\n * }\n * },\n * {\n * name: 'total_orders',\n * collection: 'orders',\n * query: {\n * aggregate: {\n * count: { function: 'count', field: '*' },\n * total_amount: { function: 'sum', field: 'amount' }\n * }\n * }\n * }\n * ]);\n * ```\n */\n async getStats(stats: StatsQuery[]): Promise<StatsResult[]> {\n const response = await this.client.post<StatsResult[]>(`/reports/stats`, {\n stats,\n });\n return response;\n }\n\n /**\n * Generate an aggregation query\n *\n * @example\n * ```typescript\n * const results = await baasix.reports.aggregate('orders', {\n * aggregate: {\n * total: { function: 'sum', field: 'amount' },\n * count: { function: 'count', field: 'id' },\n * min: { function: 'min', field: 'amount' },\n * max: { function: 'max', field: 'amount' },\n * avg: { function: 'avg', field: 'amount' }\n * },\n * groupBy: ['status', 'paymentMethod'],\n * filter: { createdAt: { gte: '$NOW-DAYS_30' } }\n * });\n * ```\n */\n async aggregate(\n collection: string,\n options: {\n aggregate: Aggregate;\n groupBy?: string[];\n filter?: Filter;\n }\n ): Promise<Record<string, unknown>[]> {\n const response = await this.client.get<{ data: Record<string, unknown>[] }>(\n `/items/${collection}`,\n {\n params: {\n aggregate: options.aggregate,\n groupBy: options.groupBy,\n filter: options.filter,\n limit: -1,\n },\n }\n );\n return response.data;\n }\n\n /**\n * Count items matching a filter\n *\n * @example\n * ```typescript\n * const activeUsers = await baasix.reports.count('users', {\n * status: { eq: 'active' }\n * });\n * ```\n */\n async count(collection: string, filter?: Filter): Promise<number> {\n const response = await this.client.get<{ data: unknown[]; totalCount: number }>(\n `/items/${collection}`,\n {\n params: {\n filter,\n limit: 0,\n },\n }\n );\n return response.totalCount || 0;\n }\n\n /**\n * Get distinct values for a field\n *\n * @example\n * ```typescript\n * const categories = await baasix.reports.distinct('products', 'category');\n * ```\n */\n async distinct(\n collection: string,\n field: string,\n filter?: Filter\n ): Promise<unknown[]> {\n const response = await this.client.get<{ data: Record<string, unknown>[] }>(\n `/items/${collection}`,\n {\n params: {\n filter,\n fields: [field],\n groupBy: [field],\n limit: -1,\n },\n }\n );\n return response.data.map((item) => item[field]);\n }\n}\n\n// Re-export types from ../types\nexport type { Aggregate, Filter, ReportConfig, ReportResult };\n","import type { HttpClient } from \"../client\";\nimport type {\n PaginatedResponse,\n Workflow,\n WorkflowExecution,\n} from \"../types\";\n\nexport interface WorkflowsModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Workflows module for managing visual workflow automation.\n *\n * @example\n * ```typescript\n * // Execute a workflow\n * const result = await baasix.workflows.execute('workflow-uuid', {\n * orderId: 'order-123'\n * });\n *\n * // Get workflow executions\n * const { data } = await baasix.workflows.getExecutions('workflow-uuid');\n * ```\n */\nexport class WorkflowsModule {\n private client: HttpClient;\n\n constructor(config: WorkflowsModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * List all workflows\n *\n * @example\n * ```typescript\n * const { data } = await baasix.workflows.find();\n * ```\n */\n async find(params?: {\n limit?: number;\n page?: number;\n filter?: Record<string, unknown>;\n }): Promise<PaginatedResponse<Workflow>> {\n return this.client.get<PaginatedResponse<Workflow>>(\"/workflows\", {\n params: params as Record<string, unknown>,\n });\n }\n\n /**\n * Get a workflow by ID\n *\n * @example\n * ```typescript\n * const workflow = await baasix.workflows.findOne('workflow-uuid');\n * ```\n */\n async findOne(id: string): Promise<Workflow> {\n const response = await this.client.get<{ data: Workflow }>(\n `/workflows/${id}`\n );\n return response.data;\n }\n\n /**\n * Create a new workflow\n *\n * @example\n * ```typescript\n * const workflow = await baasix.workflows.create({\n * name: 'Order Processing',\n * description: 'Process new orders',\n * trigger: {\n * type: 'hook',\n * config: {\n * collection: 'orders',\n * event: 'items.create.after'\n * }\n * },\n * nodes: [...],\n * edges: [...],\n * isActive: true\n * });\n * ```\n */\n async create(\n data: Omit<Workflow, \"id\" | \"createdAt\" | \"updatedAt\">\n ): Promise<Workflow> {\n const response = await this.client.post<{ data: Workflow }>(\n \"/workflows\",\n data\n );\n return response.data;\n }\n\n /**\n * Update a workflow\n *\n * @example\n * ```typescript\n * await baasix.workflows.update('workflow-uuid', {\n * name: 'Updated Workflow Name',\n * isActive: false\n * });\n * ```\n */\n async update(\n id: string,\n data: Partial<Omit<Workflow, \"id\" | \"createdAt\" | \"updatedAt\">>\n ): Promise<Workflow> {\n const response = await this.client.patch<{ data: Workflow }>(\n `/workflows/${id}`,\n data\n );\n return response.data;\n }\n\n /**\n * Delete a workflow\n *\n * @example\n * ```typescript\n * await baasix.workflows.delete('workflow-uuid');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.client.delete(`/workflows/${id}`);\n }\n\n /**\n * Execute a workflow manually\n *\n * @example\n * ```typescript\n * const result = await baasix.workflows.execute('workflow-uuid', {\n * // Trigger data\n * customerId: 'customer-123',\n * action: 'sendEmail'\n * });\n * ```\n */\n async execute(\n id: string,\n triggerData?: Record<string, unknown>\n ): Promise<WorkflowExecution> {\n const response = await this.client.post<{ data: WorkflowExecution }>(\n `/workflows/${id}/execute`,\n { triggerData }\n );\n return response.data;\n }\n\n /**\n * Test a workflow without persisting execution\n *\n * @example\n * ```typescript\n * const result = await baasix.workflows.test('workflow-uuid', {\n * testData: { value: 123 }\n * });\n * ```\n */\n async test(\n id: string,\n triggerData?: Record<string, unknown>\n ): Promise<WorkflowExecution> {\n const response = await this.client.post<{ data: WorkflowExecution }>(\n `/workflows/${id}/test`,\n { triggerData }\n );\n return response.data;\n }\n\n /**\n * Get workflow execution history\n *\n * @example\n * ```typescript\n * const { data } = await baasix.workflows.getExecutions('workflow-uuid', {\n * limit: 50\n * });\n * ```\n */\n async getExecutions(\n id: string,\n params?: {\n limit?: number;\n page?: number;\n status?: \"pending\" | \"running\" | \"completed\" | \"failed\";\n }\n ): Promise<PaginatedResponse<WorkflowExecution>> {\n return this.client.get<PaginatedResponse<WorkflowExecution>>(\n `/workflows/${id}/executions`,\n { params: params as Record<string, unknown> }\n );\n }\n\n /**\n * Get a specific execution\n *\n * @example\n * ```typescript\n * const execution = await baasix.workflows.getExecution(\n * 'workflow-uuid',\n * 'execution-uuid'\n * );\n * ```\n */\n async getExecution(\n workflowId: string,\n executionId: string\n ): Promise<WorkflowExecution> {\n const response = await this.client.get<{ data: WorkflowExecution }>(\n `/workflows/${workflowId}/executions/${executionId}`\n );\n return response.data;\n }\n\n /**\n * Cancel a running execution\n *\n * @example\n * ```typescript\n * await baasix.workflows.cancelExecution('workflow-uuid', 'execution-uuid');\n * ```\n */\n async cancelExecution(\n workflowId: string,\n executionId: string\n ): Promise<void> {\n await this.client.post(\n `/workflows/${workflowId}/executions/${executionId}/cancel`\n );\n }\n\n /**\n * Enable a workflow\n *\n * @example\n * ```typescript\n * await baasix.workflows.enable('workflow-uuid');\n * ```\n */\n async enable(id: string): Promise<Workflow> {\n return this.update(id, { isActive: true });\n }\n\n /**\n * Disable a workflow\n *\n * @example\n * ```typescript\n * await baasix.workflows.disable('workflow-uuid');\n * ```\n */\n async disable(id: string): Promise<Workflow> {\n return this.update(id, { isActive: false });\n }\n\n /**\n * Duplicate a workflow\n *\n * @example\n * ```typescript\n * const newWorkflow = await baasix.workflows.duplicate('workflow-uuid', {\n * name: 'Copy of My Workflow'\n * });\n * ```\n */\n async duplicate(\n id: string,\n overrides?: Partial<Omit<Workflow, \"id\" | \"createdAt\" | \"updatedAt\">>\n ): Promise<Workflow> {\n const original = await this.findOne(id);\n const { id: _, createdAt, updatedAt, ...workflowData } = original;\n\n return this.create({\n ...workflowData,\n name: `Copy of ${workflowData.name}`,\n ...overrides,\n });\n }\n}\n\n// Re-export types\nexport type { Workflow, WorkflowExecution };\n","import type { HttpClient } from \"../client\";\nimport type { StorageAdapter } from \"../storage/types\";\nimport { STORAGE_KEYS } from \"../storage/types\";\nimport type { BaseItem } from \"../types\";\n\n// Socket.io-client types (minimal subset for SDK)\ninterface SocketOptions {\n auth?: { token?: string };\n query?: Record<string, string>;\n path?: string;\n transports?: string[];\n reconnection?: boolean;\n reconnectionAttempts?: number;\n reconnectionDelay?: number;\n timeout?: number;\n}\n\ninterface Socket {\n connected: boolean;\n id?: string;\n on(event: string, callback: (...args: any[]) => void): void;\n off(event: string, callback?: (...args: any[]) => void): void;\n emit(event: string, ...args: any[]): void;\n connect(): void;\n disconnect(): void;\n}\n\ntype SocketIOClient = (url: string, options?: SocketOptions) => Socket;\n\nexport interface RealtimeConfig {\n client: HttpClient;\n storage: StorageAdapter;\n socketUrl?: string;\n socketPath?: string;\n}\n\nexport type SubscriptionEvent = \"create\" | \"update\" | \"delete\";\n\nexport interface SubscriptionPayload<T = any> {\n action: SubscriptionEvent;\n collection: string;\n data: T;\n timestamp: string;\n}\n\nexport interface WorkflowExecutionUpdate {\n executionId: string | number;\n status?: string;\n nodeId?: string;\n nodeName?: string;\n message?: string;\n progress?: number;\n result?: any;\n error?: string;\n timestamp: string;\n}\n\nexport interface SubscriptionCallback<T = any> {\n (payload: SubscriptionPayload<T>): void;\n}\n\ninterface Subscription {\n collection: string;\n callbacks: Map<string, SubscriptionCallback>;\n}\n\n/**\n * Realtime module for WebSocket-based real-time subscriptions.\n * \n * Requires socket.io-client to be installed separately:\n * ```bash\n * npm install socket.io-client\n * ```\n * \n * @example\n * ```typescript\n * import { io } from 'socket.io-client';\n * \n * // Initialize realtime with socket.io client\n * baasix.realtime.setSocketClient(io);\n * \n * // Connect to realtime server\n * await baasix.realtime.connect();\n * \n * // Subscribe to collection changes\n * const unsubscribe = baasix.realtime.subscribe('products', (payload) => {\n * console.log(`Product ${payload.action}:`, payload.data);\n * });\n * \n * // Disconnect when done\n * baasix.realtime.disconnect();\n * ```\n */\nexport class RealtimeModule {\n private client: HttpClient;\n private storage: StorageAdapter;\n private socket: Socket | null = null;\n private socketClient: SocketIOClient | null = null;\n private socketUrl: string;\n private socketPath: string;\n private subscriptions: Map<string, Subscription> = new Map();\n private workflowCallbacks: Map<string, Set<(data: WorkflowExecutionUpdate) => void>> = new Map();\n private connectionCallbacks: Set<(connected: boolean) => void> = new Set();\n private reconnecting: boolean = false;\n private connectionPromise: Promise<void> | null = null;\n\n constructor(config: RealtimeConfig) {\n this.client = config.client;\n this.storage = config.storage;\n this.socketUrl = config.socketUrl || \"\";\n this.socketPath = config.socketPath || \"/socket\";\n }\n\n /**\n * Set the socket.io client instance\n * This allows the SDK to work without bundling socket.io-client\n * \n * @example\n * ```typescript\n * import { io } from 'socket.io-client';\n * baasix.realtime.setSocketClient(io);\n * ```\n */\n setSocketClient(socketIO: SocketIOClient): void {\n this.socketClient = socketIO;\n }\n\n /**\n * Set the WebSocket server URL\n * By default, uses the same URL as the API\n */\n setSocketUrl(url: string): void {\n this.socketUrl = url;\n }\n\n /**\n * Check if socket.io client is available\n */\n private ensureSocketClient(): void {\n if (!this.socketClient) {\n throw new Error(\n \"Socket.io client not set. Please call baasix.realtime.setSocketClient(io) with socket.io-client.\"\n );\n }\n }\n\n /**\n * Get the authentication token for socket connection\n */\n private async getAuthToken(): Promise<string | null> {\n return await this.storage.get(STORAGE_KEYS.ACCESS_TOKEN);\n }\n\n /**\n * Connect to the realtime server\n * \n * @example\n * ```typescript\n * await baasix.realtime.connect();\n * console.log('Connected to realtime server');\n * ```\n */\n async connect(): Promise<void> {\n // Return existing connection promise if already connecting\n if (this.connectionPromise) {\n return this.connectionPromise;\n }\n\n // Already connected\n if (this.socket?.connected) {\n return Promise.resolve();\n }\n\n this.ensureSocketClient();\n\n this.connectionPromise = new Promise(async (resolve, reject) => {\n try {\n const token = await this.getAuthToken();\n const baseUrl = this.socketUrl || this.client.getBaseUrl();\n\n this.socket = this.socketClient!(baseUrl, {\n auth: { token: token || undefined },\n path: this.socketPath,\n transports: [\"websocket\", \"polling\"],\n reconnection: true,\n reconnectionAttempts: 10,\n reconnectionDelay: 1000,\n timeout: 20000,\n });\n\n // Connection events\n this.socket.on(\"connect\", () => {\n console.log(\"[Baasix Realtime] Connected\");\n this.reconnecting = false;\n this.notifyConnectionChange(true);\n resolve();\n });\n\n this.socket.on(\"disconnect\", (reason: string) => {\n console.log(\"[Baasix Realtime] Disconnected:\", reason);\n this.notifyConnectionChange(false);\n });\n\n this.socket.on(\"connect_error\", (error: Error) => {\n console.error(\"[Baasix Realtime] Connection error:\", error.message);\n if (!this.reconnecting) {\n reject(error);\n }\n });\n\n this.socket.on(\"reconnect\", () => {\n console.log(\"[Baasix Realtime] Reconnected\");\n this.reconnecting = false;\n // Re-subscribe to all collections\n this.resubscribeAll();\n this.notifyConnectionChange(true);\n });\n\n this.socket.on(\"reconnect_attempt\", () => {\n this.reconnecting = true;\n });\n\n // Initial connected event from server\n this.socket.on(\"connected\", (data: { userId: string; tenant: any }) => {\n console.log(\"[Baasix Realtime] Authenticated as user:\", data.userId);\n });\n\n // Workflow execution events\n this.socket.on(\"workflow:execution:update\", (data: WorkflowExecutionUpdate) => {\n this.handleWorkflowUpdate(data);\n });\n\n this.socket.on(\"workflow:execution:complete\", (data: WorkflowExecutionUpdate) => {\n this.handleWorkflowUpdate({ ...data, status: \"complete\" });\n });\n\n this.socket.connect();\n } catch (error) {\n this.connectionPromise = null;\n reject(error);\n }\n });\n\n try {\n await this.connectionPromise;\n } finally {\n this.connectionPromise = null;\n }\n }\n\n /**\n * Disconnect from the realtime server\n * \n * @example\n * ```typescript\n * baasix.realtime.disconnect();\n * ```\n */\n disconnect(): void {\n if (this.socket) {\n this.socket.disconnect();\n this.socket = null;\n }\n this.subscriptions.clear();\n this.workflowCallbacks.clear();\n }\n\n /**\n * Check if connected to the realtime server\n */\n get isConnected(): boolean {\n return this.socket?.connected ?? false;\n }\n\n /**\n * Subscribe to connection state changes\n * \n * @example\n * ```typescript\n * const unsubscribe = baasix.realtime.onConnectionChange((connected) => {\n * console.log('Connection state:', connected ? 'online' : 'offline');\n * });\n * ```\n */\n onConnectionChange(callback: (connected: boolean) => void): () => void {\n this.connectionCallbacks.add(callback);\n return () => {\n this.connectionCallbacks.delete(callback);\n };\n }\n\n private notifyConnectionChange(connected: boolean): void {\n this.connectionCallbacks.forEach((callback) => callback(connected));\n }\n\n /**\n * Subscribe to a collection for real-time updates\n * \n * @example\n * ```typescript\n * // Subscribe to all changes\n * const unsubscribe = baasix.realtime.subscribe('products', (payload) => {\n * console.log(`${payload.action}:`, payload.data);\n * });\n * \n * // Subscribe to specific events\n * const unsubscribe = baasix.realtime.subscribe('orders', (payload) => {\n * if (payload.action === 'create') {\n * console.log('New order:', payload.data);\n * }\n * });\n * \n * // Unsubscribe when done\n * unsubscribe();\n * ```\n */\n subscribe<T extends BaseItem = BaseItem>(\n collection: string,\n callback: SubscriptionCallback<T>\n ): () => void {\n if (!this.socket?.connected) {\n console.warn(\"[Baasix Realtime] Not connected. Call connect() first.\");\n }\n\n // Generate unique callback ID\n const callbackId = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n // Get or create subscription\n let subscription = this.subscriptions.get(collection);\n if (!subscription) {\n subscription = {\n collection,\n callbacks: new Map(),\n };\n this.subscriptions.set(collection, subscription);\n\n // Subscribe on server\n this.subscribeOnServer(collection);\n\n // Set up event listeners for this collection\n this.setupCollectionListeners(collection);\n }\n\n // Add callback\n subscription.callbacks.set(callbackId, callback as SubscriptionCallback);\n\n // Return unsubscribe function\n return () => {\n const sub = this.subscriptions.get(collection);\n if (sub) {\n sub.callbacks.delete(callbackId);\n\n // If no more callbacks, unsubscribe from server\n if (sub.callbacks.size === 0) {\n this.unsubscribeOnServer(collection);\n this.removeCollectionListeners(collection);\n this.subscriptions.delete(collection);\n }\n }\n };\n }\n\n /**\n * Subscribe to specific events on a collection\n * \n * @example\n * ```typescript\n * // Only listen for creates\n * const unsubscribe = baasix.realtime.on('products', 'create', (data) => {\n * console.log('New product:', data);\n * });\n * ```\n */\n on<T extends BaseItem = BaseItem>(\n collection: string,\n event: SubscriptionEvent,\n callback: (data: T) => void\n ): () => void {\n return this.subscribe<T>(collection, (payload) => {\n if (payload.action === event) {\n callback(payload.data);\n }\n });\n }\n\n /**\n * Listen to all changes across all subscribed collections\n * \n * @example\n * ```typescript\n * const unsubscribe = baasix.realtime.onAny((collection, payload) => {\n * console.log(`${collection}:${payload.action}`, payload.data);\n * });\n * ```\n */\n onAny(callback: (collection: string, payload: SubscriptionPayload) => void): () => void {\n const unsubscribers: (() => void)[] = [];\n\n this.subscriptions.forEach((_, collection) => {\n const unsub = this.subscribe(collection, (payload) => {\n callback(collection, payload);\n });\n unsubscribers.push(unsub);\n });\n\n return () => {\n unsubscribers.forEach((unsub) => unsub());\n };\n }\n\n private subscribeOnServer(collection: string): void {\n if (this.socket?.connected) {\n this.socket.emit(\"subscribe\", { collection }, (response: any) => {\n if (response.status === \"error\") {\n console.error(`[Baasix Realtime] Failed to subscribe to ${collection}:`, response.message);\n }\n });\n }\n }\n\n private unsubscribeOnServer(collection: string): void {\n if (this.socket?.connected) {\n this.socket.emit(\"unsubscribe\", { collection });\n }\n }\n\n private setupCollectionListeners(collection: string): void {\n if (!this.socket) return;\n\n const events: SubscriptionEvent[] = [\"create\", \"update\", \"delete\"];\n events.forEach((event) => {\n const eventName = `${collection}:${event}`;\n this.socket!.on(eventName, (payload: SubscriptionPayload) => {\n this.handleCollectionEvent(collection, payload);\n });\n });\n }\n\n private removeCollectionListeners(collection: string): void {\n if (!this.socket) return;\n\n const events: SubscriptionEvent[] = [\"create\", \"update\", \"delete\"];\n events.forEach((event) => {\n const eventName = `${collection}:${event}`;\n this.socket!.off(eventName);\n });\n }\n\n private handleCollectionEvent(collection: string, payload: SubscriptionPayload): void {\n const subscription = this.subscriptions.get(collection);\n if (subscription) {\n subscription.callbacks.forEach((callback) => {\n try {\n callback(payload);\n } catch (error) {\n console.error(`[Baasix Realtime] Error in subscription callback:`, error);\n }\n });\n }\n }\n\n private resubscribeAll(): void {\n this.subscriptions.forEach((_, collection) => {\n this.subscribeOnServer(collection);\n this.setupCollectionListeners(collection);\n });\n }\n\n // ===================\n // Workflow Realtime\n // ===================\n\n /**\n * Join a workflow execution room to receive real-time updates\n * \n * @example\n * ```typescript\n * const unsubscribe = baasix.realtime.subscribeToExecution(executionId, (update) => {\n * console.log('Execution update:', update);\n * if (update.status === 'complete') {\n * console.log('Workflow finished!');\n * }\n * });\n * ```\n */\n subscribeToExecution(\n executionId: string | number,\n callback: (data: WorkflowExecutionUpdate) => void\n ): () => void {\n const id = String(executionId);\n\n // Join execution room\n if (this.socket?.connected) {\n this.socket.emit(\"workflow:execution:join\", { executionId: id });\n }\n\n // Add callback\n let callbacks = this.workflowCallbacks.get(id);\n if (!callbacks) {\n callbacks = new Set();\n this.workflowCallbacks.set(id, callbacks);\n }\n callbacks.add(callback);\n\n // Return unsubscribe function\n return () => {\n const cbs = this.workflowCallbacks.get(id);\n if (cbs) {\n cbs.delete(callback);\n if (cbs.size === 0) {\n this.workflowCallbacks.delete(id);\n }\n }\n };\n }\n\n private handleWorkflowUpdate(data: WorkflowExecutionUpdate): void {\n const id = String(data.executionId);\n const callbacks = this.workflowCallbacks.get(id);\n if (callbacks) {\n callbacks.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`[Baasix Realtime] Error in workflow callback:`, error);\n }\n });\n }\n }\n\n // ===================\n // Channel (Room) API - Supabase-style\n // ===================\n\n /**\n * Create a channel for a collection (Supabase-style API)\n * \n * @example\n * ```typescript\n * const channel = baasix.realtime\n * .channel('products')\n * .on('INSERT', (payload) => console.log('New:', payload))\n * .on('UPDATE', (payload) => console.log('Updated:', payload))\n * .on('DELETE', (payload) => console.log('Deleted:', payload))\n * .subscribe();\n * \n * // Later\n * channel.unsubscribe();\n * ```\n */\n channel(collection: string): RealtimeChannel {\n return new RealtimeChannel(this, collection);\n }\n}\n\n/**\n * Chainable channel for Supabase-style subscription API\n */\nexport class RealtimeChannel {\n private realtime: RealtimeModule;\n private collection: string;\n private handlers: Map<SubscriptionEvent, ((data: any) => void)[]> = new Map();\n private unsubscribeFn: (() => void) | null = null;\n\n constructor(realtime: RealtimeModule, collection: string) {\n this.realtime = realtime;\n this.collection = collection;\n }\n\n /**\n * Add an event handler (chainable)\n * \n * @param event - 'INSERT', 'UPDATE', 'DELETE', or '*' for all\n * @param callback - Handler function\n */\n on(event: \"INSERT\" | \"UPDATE\" | \"DELETE\" | \"*\", callback: (payload: any) => void): this {\n const mappedEvent = this.mapEvent(event);\n \n if (mappedEvent === \"*\") {\n // Add to all events\n ([\"create\", \"update\", \"delete\"] as SubscriptionEvent[]).forEach((e) => {\n this.addHandler(e, callback);\n });\n } else {\n this.addHandler(mappedEvent, callback);\n }\n\n return this;\n }\n\n private mapEvent(event: string): SubscriptionEvent | \"*\" {\n switch (event.toUpperCase()) {\n case \"INSERT\":\n return \"create\";\n case \"UPDATE\":\n return \"update\";\n case \"DELETE\":\n return \"delete\";\n default:\n return \"*\";\n }\n }\n\n private addHandler(event: SubscriptionEvent, callback: (data: any) => void): void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, []);\n }\n this.handlers.get(event)!.push(callback);\n }\n\n /**\n * Start the subscription\n */\n subscribe(): this {\n this.unsubscribeFn = this.realtime.subscribe(this.collection, (payload) => {\n const handlers = this.handlers.get(payload.action);\n if (handlers) {\n handlers.forEach((handler) => {\n try {\n handler(payload);\n } catch (error) {\n console.error(\"[Baasix Channel] Handler error:\", error);\n }\n });\n }\n });\n\n return this;\n }\n\n /**\n * Stop the subscription\n */\n unsubscribe(): void {\n if (this.unsubscribeFn) {\n this.unsubscribeFn();\n this.unsubscribeFn = null;\n }\n this.handlers.clear();\n }\n}\n\nexport type { Socket, SocketIOClient };\n","import type { HttpClient } from \"../client\";\nimport type { BaseItem } from \"../types\";\n\nexport interface RolesModuleConfig {\n client: HttpClient;\n}\n\nexport interface Role extends BaseItem {\n name: string;\n description?: string;\n icon?: string;\n ipWhitelist?: string;\n enforceTotp?: boolean;\n adminAccess?: boolean;\n appAccess?: boolean;\n}\n\nexport interface CreateRoleData {\n name: string;\n description?: string;\n icon?: string;\n ipWhitelist?: string;\n enforceTotp?: boolean;\n adminAccess?: boolean;\n appAccess?: boolean;\n}\n\n/**\n * Roles module for managing user roles.\n * \n * @example\n * ```typescript\n * // List all roles\n * const roles = await baasix.roles.find();\n * \n * // Create a new role\n * const role = await baasix.roles.create({\n * name: 'Editor',\n * description: 'Can edit content'\n * });\n * ```\n */\nexport class RolesModule {\n private client: HttpClient;\n private collection = \"baasix_Role\";\n\n constructor(config: RolesModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * Get all roles\n * \n * @example\n * ```typescript\n * const { data: roles } = await baasix.roles.find();\n * ```\n */\n async find(): Promise<{ data: Role[]; totalCount: number }> {\n return this.client.get<{ data: Role[]; totalCount: number }>(\n `/items/${this.collection}`,\n {\n params: { limit: -1 },\n }\n );\n }\n\n /**\n * Get a role by ID\n * \n * @example\n * ```typescript\n * const role = await baasix.roles.findOne('role-uuid');\n * ```\n */\n async findOne(id: string): Promise<Role> {\n const response = await this.client.get<{ data: Role }>(\n `/items/${this.collection}/${id}`\n );\n return response.data;\n }\n\n /**\n * Get a role by name\n * \n * @example\n * ```typescript\n * const role = await baasix.roles.findByName('Administrator');\n * ```\n */\n async findByName(name: string): Promise<Role | null> {\n const response = await this.client.get<{ data: Role[]; totalCount: number }>(\n `/items/${this.collection}`,\n {\n params: {\n filter: JSON.stringify({ name: { eq: name } }),\n limit: 1,\n },\n }\n );\n return response.data[0] || null;\n }\n\n /**\n * Create a new role\n * \n * @example\n * ```typescript\n * const id = await baasix.roles.create({\n * name: 'Editor',\n * description: 'Content editor role',\n * appAccess: true\n * });\n * ```\n */\n async create(data: CreateRoleData): Promise<string> {\n const response = await this.client.post<{ data: { id: string } }>(\n `/items/${this.collection}`,\n data\n );\n return response.data.id;\n }\n\n /**\n * Update a role\n * \n * @example\n * ```typescript\n * await baasix.roles.update('role-uuid', {\n * description: 'Updated description'\n * });\n * ```\n */\n async update(id: string, data: Partial<CreateRoleData>): Promise<void> {\n await this.client.patch(`/items/${this.collection}/${id}`, data);\n }\n\n /**\n * Delete a role\n * \n * @example\n * ```typescript\n * await baasix.roles.delete('role-uuid');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.client.delete(`/items/${this.collection}/${id}`);\n }\n}\n","import type { HttpClient } from \"../client\";\n\nexport interface UsersModuleConfig {\n client: HttpClient;\n}\n\nexport interface User {\n id: string;\n email: string;\n firstName?: string;\n lastName?: string;\n avatar?: string;\n status?: \"active\" | \"suspended\" | \"invited\";\n role_Id?: string;\n role?: {\n id: string;\n name: string;\n };\n emailVerified?: boolean;\n totpEnabled?: boolean;\n lastAccess?: string;\n createdAt?: string;\n updatedAt?: string;\n}\n\nexport interface CreateUserData {\n email: string;\n password?: string;\n firstName?: string;\n lastName?: string;\n avatar?: string;\n status?: \"active\" | \"suspended\" | \"invited\";\n role_Id?: string;\n}\n\nexport interface UpdateUserData {\n email?: string;\n firstName?: string;\n lastName?: string;\n avatar?: string;\n status?: \"active\" | \"suspended\" | \"invited\";\n role_Id?: string;\n}\n\nexport interface UserQueryOptions {\n filter?: Record<string, any>;\n sort?: string;\n limit?: number;\n page?: number;\n fields?: string[];\n}\n\n/**\n * Users module for managing users (admin operations).\n * \n * @example\n * ```typescript\n * // List all users\n * const users = await baasix.users.find();\n * \n * // Create a new user\n * const user = await baasix.users.create({\n * email: 'user@example.com',\n * firstName: 'John',\n * lastName: 'Doe',\n * role_Id: 'role-uuid'\n * });\n * ```\n */\nexport class UsersModule {\n private client: HttpClient;\n private collection = \"baasix_User\";\n\n constructor(config: UsersModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * Get all users with optional filtering\n * \n * @example\n * ```typescript\n * const { data: users } = await baasix.users.find({\n * filter: { status: { eq: 'active' } },\n * limit: 20\n * });\n * ```\n */\n async find(options: UserQueryOptions = {}): Promise<{ data: User[]; totalCount: number }> {\n const params: Record<string, any> = {};\n \n if (options.filter) {\n params.filter = JSON.stringify(options.filter);\n }\n if (options.sort) {\n params.sort = options.sort;\n }\n if (options.limit !== undefined) {\n params.limit = options.limit;\n }\n if (options.page !== undefined) {\n params.page = options.page;\n }\n if (options.fields?.length) {\n params.fields = options.fields.join(\",\");\n }\n\n return this.client.get<{ data: User[]; totalCount: number }>(\n `/items/${this.collection}`,\n { params }\n );\n }\n\n /**\n * Get a user by ID\n * \n * @example\n * ```typescript\n * const user = await baasix.users.findOne('user-uuid');\n * ```\n */\n async findOne(id: string, fields?: string[]): Promise<User> {\n const params: Record<string, any> = {};\n if (fields?.length) {\n params.fields = fields.join(\",\");\n }\n\n const response = await this.client.get<{ data: User }>(\n `/items/${this.collection}/${id}`,\n { params }\n );\n return response.data;\n }\n\n /**\n * Get a user by email\n * \n * @example\n * ```typescript\n * const user = await baasix.users.findByEmail('user@example.com');\n * ```\n */\n async findByEmail(email: string): Promise<User | null> {\n const response = await this.client.get<{ data: User[]; totalCount: number }>(\n `/items/${this.collection}`,\n {\n params: {\n filter: JSON.stringify({ email: { eq: email } }),\n limit: 1,\n },\n }\n );\n return response.data[0] || null;\n }\n\n /**\n * Create a new user\n * \n * @example\n * ```typescript\n * const id = await baasix.users.create({\n * email: 'user@example.com',\n * password: 'securepassword',\n * firstName: 'John',\n * lastName: 'Doe',\n * role_Id: 'role-uuid'\n * });\n * ```\n */\n async create(data: CreateUserData): Promise<string> {\n const response = await this.client.post<{ data: { id: string } }>(\n `/items/${this.collection}`,\n data\n );\n return response.data.id;\n }\n\n /**\n * Update a user\n * \n * @example\n * ```typescript\n * await baasix.users.update('user-uuid', {\n * firstName: 'Jane'\n * });\n * ```\n */\n async update(id: string, data: UpdateUserData): Promise<void> {\n await this.client.patch(`/items/${this.collection}/${id}`, data);\n }\n\n /**\n * Delete a user\n * \n * @example\n * ```typescript\n * await baasix.users.delete('user-uuid');\n * ```\n */\n async delete(id: string): Promise<void> {\n await this.client.delete(`/items/${this.collection}/${id}`);\n }\n\n /**\n * Change a user's password (admin operation)\n * \n * @example\n * ```typescript\n * await baasix.users.changePassword('user-uuid', 'newpassword');\n * ```\n */\n async changePassword(userId: string, newPassword: string): Promise<void> {\n await this.client.post(\"/auth/admin/change-password\", {\n userId,\n password: newPassword,\n });\n }\n\n /**\n * Suspend a user\n * \n * @example\n * ```typescript\n * await baasix.users.suspend('user-uuid');\n * ```\n */\n async suspend(id: string): Promise<void> {\n await this.client.patch(`/items/${this.collection}/${id}`, {\n status: \"suspended\",\n });\n }\n\n /**\n * Activate a user\n * \n * @example\n * ```typescript\n * await baasix.users.activate('user-uuid');\n * ```\n */\n async activate(id: string): Promise<void> {\n await this.client.patch(`/items/${this.collection}/${id}`, {\n status: \"active\",\n });\n }\n\n /**\n * Bulk create users\n * \n * @example\n * ```typescript\n * const ids = await baasix.users.createMany([\n * { email: 'user1@example.com', firstName: 'User 1' },\n * { email: 'user2@example.com', firstName: 'User 2' }\n * ]);\n * ```\n */\n async createMany(users: CreateUserData[]): Promise<string[]> {\n const response = await this.client.post<{ data: string[] }>(\n `/items/${this.collection}/bulk`,\n users\n );\n return response.data;\n }\n\n /**\n * Bulk delete users\n * \n * @example\n * ```typescript\n * await baasix.users.deleteMany(['user-uuid-1', 'user-uuid-2']);\n * ```\n */\n async deleteMany(ids: string[]): Promise<void> {\n await this.client.delete(`/items/${this.collection}/bulk`, {\n body: JSON.stringify(ids),\n });\n }\n}\n","import type { HttpClient } from \"../client\";\n\nexport interface MigrationsModuleConfig {\n client: HttpClient;\n}\n\nexport interface MigrationStatus {\n lastBatch: number;\n totalMigrations: number;\n pendingCount: number;\n completedCount: number;\n hasPending: boolean;\n}\n\nexport interface Migration {\n id: string;\n version: string;\n name: string;\n type: string;\n status: string;\n batch: number;\n migratedAt: string;\n executionTime?: number;\n}\n\nexport interface PendingMigration {\n version: string;\n name: string;\n type: string;\n path?: string;\n}\n\nexport interface MigrationRunOptions {\n /** Run only a specific migration version */\n version?: string;\n /** Run migrations up to and including this version */\n toVersion?: string;\n /** Number of migrations to run */\n step?: number;\n /** Preview without executing */\n dryRun?: boolean;\n}\n\nexport interface MigrationRunResult {\n results: Array<{\n version: string;\n name: string;\n status: \"completed\" | \"failed\";\n error?: string;\n }>;\n summary: {\n total: number;\n completed: number;\n failed: number;\n };\n}\n\nexport interface RollbackResult {\n results: Array<{\n version: string;\n name: string;\n status: string;\n }>;\n summary: {\n total: number;\n };\n}\n\nexport interface CreateMigrationOptions {\n /** Migration type (system, schema, data, custom) */\n type?: \"system\" | \"schema\" | \"data\" | \"custom\";\n /** Migration description */\n description?: string;\n /** Custom version (auto-generated if not provided) */\n version?: string;\n}\n\n/**\n * Migrations module for managing database schema migrations.\n * Admin access required for all operations.\n * \n * @example\n * ```typescript\n * // Check migration status\n * const status = await baasix.migrations.status();\n * \n * // Run pending migrations\n * if (status.hasPending) {\n * await baasix.migrations.run();\n * }\n * ```\n */\nexport class MigrationsModule {\n private client: HttpClient;\n\n constructor(config: MigrationsModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * Get migration status\n * \n * @example\n * ```typescript\n * const status = await baasix.migrations.status();\n * console.log(`Pending migrations: ${status.pendingCount}`);\n * ```\n */\n async status(): Promise<MigrationStatus> {\n const response = await this.client.get<{ data: MigrationStatus }>(\n \"/migrations/status\"\n );\n return response.data;\n }\n\n /**\n * Get all migrations with optional filtering\n * \n * @example\n * ```typescript\n * // Get all migrations\n * const migrations = await baasix.migrations.list();\n * \n * // Get completed migrations\n * const completed = await baasix.migrations.list({ status: 'completed' });\n * ```\n */\n async list(options?: {\n status?: \"pending\" | \"completed\" | \"failed\";\n type?: \"system\" | \"schema\" | \"data\" | \"custom\";\n }): Promise<Migration[]> {\n const response = await this.client.get<{ data: Migration[] }>(\"/migrations\", {\n params: options,\n });\n return response.data;\n }\n\n /**\n * Get pending migrations\n * \n * @example\n * ```typescript\n * const pending = await baasix.migrations.pending();\n * ```\n */\n async pending(): Promise<PendingMigration[]> {\n const response = await this.client.get<{ data: PendingMigration[] }>(\n \"/migrations/pending\"\n );\n return response.data;\n }\n\n /**\n * Check if migrations are needed\n * \n * @example\n * ```typescript\n * const check = await baasix.migrations.check();\n * if (check.hasPending) {\n * console.log('Migrations needed');\n * }\n * ```\n */\n async check(): Promise<{ hasPending: boolean; pendingCount: number }> {\n const response = await this.client.get<{ data: { hasPending: boolean; pendingCount: number } }>(\n \"/migrations/check\"\n );\n return response.data;\n }\n\n /**\n * Get a specific migration by version\n * \n * @example\n * ```typescript\n * const migration = await baasix.migrations.get('20231201000000');\n * ```\n */\n async get(version: string): Promise<Migration | null> {\n try {\n const response = await this.client.get<{ data: Migration }>(\n `/migrations/${encodeURIComponent(version)}`\n );\n return response.data;\n } catch {\n return null;\n }\n }\n\n /**\n * Run pending migrations\n * \n * @example\n * ```typescript\n * // Run all pending migrations\n * const result = await baasix.migrations.run();\n * \n * // Run with options\n * const result = await baasix.migrations.run({\n * step: 1, // Run only 1 migration\n * dryRun: true // Preview without executing\n * });\n * ```\n */\n async run(options?: MigrationRunOptions): Promise<MigrationRunResult> {\n const response = await this.client.post<{ data: MigrationRunResult }>(\n \"/migrations/run\",\n options || {}\n );\n return response.data;\n }\n\n /**\n * Rollback a specific migration\n * \n * @example\n * ```typescript\n * const result = await baasix.migrations.rollback('20231201000000');\n * ```\n */\n async rollback(version: string): Promise<RollbackResult> {\n const response = await this.client.post<{ data: RollbackResult }>(\n `/migrations/rollback/${encodeURIComponent(version)}`,\n {}\n );\n return response.data;\n }\n\n /**\n * Rollback the last batch of migrations\n * \n * @example\n * ```typescript\n * const result = await baasix.migrations.rollbackBatch();\n * ```\n */\n async rollbackBatch(): Promise<RollbackResult> {\n const response = await this.client.post<{ data: RollbackResult }>(\n \"/migrations/rollback-batch\",\n {}\n );\n return response.data;\n }\n\n /**\n * Create a new migration file\n * \n * @example\n * ```typescript\n * const { filepath } = await baasix.migrations.create('add_status_column', {\n * type: 'schema',\n * description: 'Add status column to orders'\n * });\n * ```\n */\n async create(\n name: string,\n options?: CreateMigrationOptions\n ): Promise<{ filepath: string }> {\n const response = await this.client.post<{ data: { filepath: string } }>(\n \"/migrations/create\",\n { name, ...options }\n );\n return response.data;\n }\n\n /**\n * Mark a specific migration as completed without running it\n * Useful for existing installations that already have the changes\n * \n * @example\n * ```typescript\n * await baasix.migrations.markCompleted('20231201000000');\n * ```\n */\n async markCompleted(\n version: string,\n metadata?: Record<string, unknown>\n ): Promise<Migration> {\n const response = await this.client.post<{ data: Migration }>(\n `/migrations/mark-completed/${encodeURIComponent(version)}`,\n { metadata }\n );\n return response.data;\n }\n\n /**\n * Mark all pending migrations as completed\n * Useful for bringing an existing database up to date without running migrations\n * \n * @example\n * ```typescript\n * // Mark all pending\n * await baasix.migrations.markAllCompleted();\n * \n * // Mark up to a specific version\n * await baasix.migrations.markAllCompleted('20231201000000');\n * ```\n */\n async markAllCompleted(toVersion?: string): Promise<MigrationRunResult> {\n const response = await this.client.post<{ data: MigrationRunResult }>(\n \"/migrations/mark-all-completed\",\n { toVersion }\n );\n return response.data;\n }\n}\n","import type { HttpClient } from \"../client\";\n\nexport interface ServerInfo {\n project?: {\n name?: string;\n multitenant?: boolean | string;\n [key: string]: unknown;\n };\n version?: string;\n [key: string]: unknown;\n}\n\nexport interface ServerModuleConfig {\n client: HttpClient;\n}\n\n/**\n * Server module for retrieving server information.\n *\n * @example\n * ```typescript\n * const info = await baasix.server.info();\n * console.log(info.project?.name);\n * ```\n */\nexport class ServerModule {\n private client: HttpClient;\n\n constructor(config: ServerModuleConfig) {\n this.client = config.client;\n }\n\n /**\n * Get server information including project settings\n *\n * @example\n * ```typescript\n * const info = await baasix.server.info();\n * console.log('Project:', info.project?.name);\n * console.log('Version:', info.version);\n * ```\n */\n async info(): Promise<ServerInfo> {\n return this.client.get<ServerInfo>(\"/\");\n }\n\n /**\n * Check server health\n *\n * @example\n * ```typescript\n * const isHealthy = await baasix.server.health();\n * ```\n */\n async health(): Promise<boolean> {\n try {\n await this.client.get(\"/health\");\n return true;\n } catch {\n return false;\n }\n }\n}\n","import type { StorageAdapter } from \"./types\";\n\n/**\n * Type definition for AsyncStorage-like interface (React Native)\n */\ninterface AsyncStorageLike {\n getItem(key: string): Promise<string | null>;\n setItem(key: string, value: string): Promise<void>;\n removeItem(key: string): Promise<void>;\n multiRemove?(keys: string[]): Promise<void>;\n getAllKeys?(): Promise<readonly string[]>;\n}\n\n/**\n * AsyncStorage adapter for React Native.\n * Wraps @react-native-async-storage/async-storage or any compatible implementation.\n *\n * @example\n * ```typescript\n * import { createBaasix, AsyncStorageAdapter } from '@baasix/sdk';\n * import AsyncStorage from '@react-native-async-storage/async-storage';\n *\n * const client = createBaasix({\n * url: 'https://api.example.com',\n * storage: new AsyncStorageAdapter(AsyncStorage),\n * });\n * ```\n */\nexport class AsyncStorageAdapter implements StorageAdapter {\n private asyncStorage: AsyncStorageLike;\n private prefix: string;\n\n constructor(asyncStorage: AsyncStorageLike, prefix = \"baasix_\") {\n this.asyncStorage = asyncStorage;\n this.prefix = prefix;\n }\n\n private getKey(key: string): string {\n if (key.startsWith(this.prefix)) {\n return key;\n }\n return `${this.prefix}${key}`;\n }\n\n async get(key: string): Promise<string | null> {\n try {\n return await this.asyncStorage.getItem(this.getKey(key));\n } catch {\n console.warn(`[Baasix SDK] Failed to get item from AsyncStorage: ${key}`);\n return null;\n }\n }\n\n async set(key: string, value: string): Promise<void> {\n try {\n await this.asyncStorage.setItem(this.getKey(key), value);\n } catch {\n console.warn(`[Baasix SDK] Failed to set item in AsyncStorage: ${key}`);\n }\n }\n\n async remove(key: string): Promise<void> {\n try {\n await this.asyncStorage.removeItem(this.getKey(key));\n } catch {\n console.warn(`[Baasix SDK] Failed to remove item from AsyncStorage: ${key}`);\n }\n }\n\n async clear(): Promise<void> {\n try {\n if (this.asyncStorage.getAllKeys && this.asyncStorage.multiRemove) {\n const allKeys = await this.asyncStorage.getAllKeys();\n const sdkKeys = allKeys.filter((key) => key.startsWith(this.prefix));\n if (sdkKeys.length > 0) {\n await this.asyncStorage.multiRemove(sdkKeys);\n }\n }\n } catch {\n console.warn(\"[Baasix SDK] Failed to clear AsyncStorage\");\n }\n }\n}\n","import { HttpClient } from \"./client\";\nimport { LocalStorageAdapter } from \"./storage/localStorage\";\nimport { MemoryStorageAdapter } from \"./storage/memoryStorage\";\nimport type { StorageAdapter } from \"./storage/types\";\nimport { STORAGE_KEYS } from \"./storage/types\";\nimport { AuthModule } from \"./modules/auth\";\nimport { ItemsModule } from \"./modules/items\";\nimport { FilesModule } from \"./modules/files\";\nimport { SchemasModule } from \"./modules/schemas\";\nimport { NotificationsModule } from \"./modules/notifications\";\nimport { PermissionsModule } from \"./modules/permissions\";\nimport { SettingsModule } from \"./modules/settings\";\nimport { ReportsModule } from \"./modules/reports\";\nimport { WorkflowsModule } from \"./modules/workflows\";\nimport { RealtimeModule } from \"./modules/realtime\";\nimport { RolesModule } from \"./modules/roles\";\nimport { UsersModule } from \"./modules/users\";\nimport { MigrationsModule } from \"./modules/migrations\";\nimport { ServerModule } from \"./modules/server\";\nimport type { AuthMode, BaasixConfig, BaseItem } from \"./types\";\n\n/**\n * Detect the current environment and return appropriate storage\n */\nfunction getDefaultStorage(): StorageAdapter {\n // Browser environment with localStorage\n if (\n typeof window !== \"undefined\" &&\n typeof window.localStorage !== \"undefined\"\n ) {\n return new LocalStorageAdapter();\n }\n\n // SSR or Node.js environment\n return new MemoryStorageAdapter();\n}\n\n/**\n * The main Baasix SDK client.\n *\n * @example\n * ```typescript\n * import { createBaasix } from '@baasix/sdk';\n *\n * // Basic setup\n * const baasix = createBaasix({\n * url: 'https://api.example.com'\n * });\n *\n * // With custom storage (React Native)\n * import AsyncStorage from '@react-native-async-storage/async-storage';\n * import { AsyncStorageAdapter } from '@baasix/sdk';\n *\n * const baasix = createBaasix({\n * url: 'https://api.example.com',\n * storage: new AsyncStorageAdapter(AsyncStorage)\n * });\n *\n * // Cookie mode (for web apps with HTTP-only cookies)\n * const baasix = createBaasix({\n * url: 'https://api.example.com',\n * authMode: 'cookie'\n * });\n *\n * // Server-side with static token\n * const baasix = createBaasix({\n * url: 'https://api.example.com',\n * token: 'your-api-token'\n * });\n * ```\n */\nexport class Baasix {\n private config: Required<\n Pick<BaasixConfig, \"url\" | \"authMode\" | \"timeout\" | \"autoRefresh\">\n > &\n BaasixConfig;\n private httpClient: HttpClient;\n private storage: StorageAdapter;\n\n // Modules\n public readonly auth: AuthModule;\n public readonly files: FilesModule;\n public readonly schemas: SchemasModule;\n public readonly notifications: NotificationsModule;\n public readonly permissions: PermissionsModule;\n public readonly settings: SettingsModule;\n public readonly reports: ReportsModule;\n public readonly workflows: WorkflowsModule;\n public readonly realtime: RealtimeModule;\n public readonly roles: RolesModule;\n public readonly users: UsersModule;\n public readonly migrations: MigrationsModule;\n public readonly server: ServerModule;\n\n // Items module factory cache\n private itemsModules: Map<string, ItemsModule<BaseItem>> = new Map();\n\n constructor(config: BaasixConfig) {\n // Validate required config\n if (!config.url) {\n throw new Error(\"Baasix SDK: url is required\");\n }\n\n // Normalize URL (remove trailing slash)\n const normalizedUrl = config.url.replace(/\\/$/, \"\");\n\n // Set defaults\n this.config = {\n ...config,\n url: normalizedUrl,\n authMode: config.authMode || \"jwt\",\n timeout: config.timeout || 30000,\n autoRefresh: config.autoRefresh !== false,\n };\n\n // Initialize storage\n this.storage = config.storage || getDefaultStorage();\n\n // Determine credentials mode\n const credentials: RequestCredentials =\n config.credentials ||\n (this.config.authMode === \"cookie\" ? \"include\" : \"same-origin\");\n\n // Initialize HTTP client\n this.httpClient = new HttpClient({\n baseUrl: normalizedUrl,\n authMode: this.config.authMode,\n storage: this.storage,\n timeout: this.config.timeout,\n autoRefresh: this.config.autoRefresh,\n credentials,\n headers: config.headers || {},\n token: config.token,\n tenantId: config.tenantId,\n onAuthError: () => {\n this.config.onAuthStateChange?.(\"SIGNED_OUT\", null);\n },\n onTokenRefresh: () => {\n // Token refreshed, could emit event if needed\n },\n });\n\n // Initialize modules\n this.auth = new AuthModule({\n client: this.httpClient,\n storage: this.storage,\n authMode: this.config.authMode,\n onAuthStateChange: config.onAuthStateChange,\n });\n\n this.files = new FilesModule({ client: this.httpClient });\n this.schemas = new SchemasModule({ client: this.httpClient });\n this.notifications = new NotificationsModule({ client: this.httpClient });\n this.permissions = new PermissionsModule({ client: this.httpClient });\n this.settings = new SettingsModule({ client: this.httpClient });\n this.reports = new ReportsModule({ client: this.httpClient });\n this.workflows = new WorkflowsModule({ client: this.httpClient });\n this.roles = new RolesModule({ client: this.httpClient });\n this.users = new UsersModule({ client: this.httpClient });\n this.migrations = new MigrationsModule({ client: this.httpClient });\n this.server = new ServerModule({ client: this.httpClient });\n \n // Realtime module needs storage for auth token\n this.realtime = new RealtimeModule({\n client: this.httpClient,\n storage: this.storage,\n socketUrl: config.socketUrl,\n socketPath: config.socketPath,\n });\n }\n\n /**\n * Get an Items module for a specific collection.\n * Returns a cached instance for repeated calls with the same collection.\n *\n * @example\n * ```typescript\n * // Get items module\n * const products = baasix.items('products');\n *\n * // CRUD operations\n * const { data } = await products.find({ filter: { status: { eq: 'active' } } });\n * const product = await products.findOne('product-uuid');\n * const id = await products.create({ name: 'New Product', price: 29.99 });\n * await products.update('product-uuid', { price: 24.99 });\n * await products.delete('product-uuid');\n *\n * // Query builder\n * const results = await baasix.items('posts')\n * .query()\n * .select('*', 'author.*')\n * .filter({ status: { eq: 'published' } })\n * .sort({ createdAt: 'desc' })\n * .limit(10)\n * .get();\n * ```\n */\n items<T extends BaseItem = BaseItem>(collection: string): ItemsModule<T> {\n if (!this.itemsModules.has(collection)) {\n this.itemsModules.set(\n collection,\n new ItemsModule(collection, { client: this.httpClient })\n );\n }\n return this.itemsModules.get(collection) as ItemsModule<T>;\n }\n\n /**\n * Alias for items() - get a collection\n *\n * @example\n * ```typescript\n * const products = baasix.collection('products');\n * ```\n */\n collection<T extends BaseItem = BaseItem>(collection: string): ItemsModule<T> {\n return this.items<T>(collection);\n }\n\n /**\n * Alias for items() - from a collection (Supabase-style)\n *\n * @example\n * ```typescript\n * const products = baasix.from('products');\n * ```\n */\n from<T extends BaseItem = BaseItem>(collection: string): ItemsModule<T> {\n return this.items<T>(collection);\n }\n\n /**\n * Get the underlying HTTP client for custom requests\n *\n * @example\n * ```typescript\n * // Custom GET request\n * const data = await baasix.request.get('/custom-endpoint');\n *\n * // Custom POST request\n * const result = await baasix.request.post('/custom-endpoint', { data: 'value' });\n * ```\n */\n get request(): HttpClient {\n return this.httpClient;\n }\n\n /**\n * Update SDK configuration\n *\n * @example\n * ```typescript\n * baasix.configure({\n * headers: { 'X-Custom-Header': 'value' }\n * });\n * ```\n */\n configure(config: Partial<BaasixConfig>): void {\n if (config.headers) {\n this.httpClient.updateConfig({ headers: config.headers });\n }\n if (config.tenantId !== undefined) {\n this.httpClient.updateConfig({ tenantId: config.tenantId });\n }\n if (config.token) {\n this.httpClient.updateConfig({ token: config.token });\n }\n if (config.timeout) {\n this.httpClient.updateConfig({ timeout: config.timeout });\n }\n }\n\n /**\n * Set the tenant for multi-tenant mode\n *\n * @example\n * ```typescript\n * baasix.setTenant('tenant-uuid');\n * ```\n */\n async setTenant(tenantId: string): Promise<void> {\n this.httpClient.updateConfig({ tenantId });\n await this.storage.set(STORAGE_KEYS.TENANT, tenantId);\n }\n\n /**\n * Get the current tenant ID\n */\n async getTenant(): Promise<string | null> {\n return await this.storage.get(STORAGE_KEYS.TENANT);\n }\n\n /**\n * Clear the tenant\n */\n async clearTenant(): Promise<void> {\n this.httpClient.updateConfig({ tenantId: undefined });\n await this.storage.remove(STORAGE_KEYS.TENANT);\n }\n\n /**\n * Set a static token (convenience method that delegates to auth.setToken)\n *\n * @example\n * ```typescript\n * baasix.setToken('your-api-token');\n * ```\n */\n async setToken(token: string): Promise<void> {\n return this.auth.setToken(token);\n }\n\n /**\n * Get the current auth token\n */\n async getToken(): Promise<string | null> {\n return this.storage.get(STORAGE_KEYS.ACCESS_TOKEN);\n }\n\n /**\n * Get the base URL\n */\n getUrl(): string {\n return this.config.url;\n }\n\n /**\n * Get the current auth mode\n */\n getAuthMode(): AuthMode {\n return this.config.authMode;\n }\n\n /**\n * Get the storage adapter\n */\n getStorage(): StorageAdapter {\n return this.storage;\n }\n}\n\n/**\n * Create a new Baasix SDK instance.\n *\n * @example\n * ```typescript\n * import { createBaasix } from '@baasix/sdk';\n *\n * const baasix = createBaasix({\n * url: 'https://api.example.com',\n * authMode: 'jwt', // or 'cookie'\n * onAuthStateChange: (event, user) => {\n * console.log('Auth state changed:', event, user);\n * }\n * });\n *\n * // Initialize on app startup\n * await baasix.auth.initialize();\n *\n * // Check if user is authenticated\n * if (await baasix.auth.isAuthenticated()) {\n * const user = await baasix.auth.getUser();\n * console.log('Logged in as:', user?.email);\n * }\n * ```\n */\nexport function createBaasix(config: BaasixConfig): Baasix {\n return new Baasix(config);\n}\n\n// Export everything\nexport { HttpClient } from \"./client\";\nexport type { RequestOptions, HttpClientConfig } from \"./client\";\n\n// Storage exports\nexport {\n LocalStorageAdapter,\n MemoryStorageAdapter,\n AsyncStorageAdapter,\n STORAGE_KEYS,\n} from \"./storage/index\";\nexport type { StorageAdapter, StorageKey } from \"./storage/index\";\n\n// Module exports\nexport { AuthModule } from \"./modules/auth\";\nexport type { \n OAuthProvider, \n OAuthOptions, \n InviteOptions, \n VerifyInviteResult \n} from \"./modules/auth\";\nexport { ItemsModule, QueryBuilder } from \"./modules/items\";\nexport type { ImportResult } from \"./modules/items\";\nexport { FilesModule } from \"./modules/files\";\nexport { SchemasModule } from \"./modules/schemas\";\nexport { NotificationsModule } from \"./modules/notifications\";\nexport { PermissionsModule } from \"./modules/permissions\";\nexport { SettingsModule } from \"./modules/settings\";\nexport { ReportsModule } from \"./modules/reports\";\nexport type { StatsQuery, StatsResult } from \"./modules/reports\";\nexport { WorkflowsModule } from \"./modules/workflows\";\nexport { RealtimeModule, RealtimeChannel } from \"./modules/realtime\";\nexport type { \n RealtimeConfig, \n SubscriptionEvent, \n SubscriptionPayload, \n WorkflowExecutionUpdate,\n SubscriptionCallback \n} from \"./modules/realtime\";\nexport { RolesModule } from \"./modules/roles\";\nexport type { Role, CreateRoleData } from \"./modules/roles\";\nexport { UsersModule } from \"./modules/users\";\nexport type { CreateUserData, UpdateUserData, UserQueryOptions } from \"./modules/users\";\nexport { MigrationsModule } from \"./modules/migrations\";\nexport type { \n MigrationStatus, \n Migration, \n PendingMigration, \n MigrationRunOptions,\n MigrationRunResult, \n RollbackResult,\n CreateMigrationOptions \n} from \"./modules/migrations\";\n\n// Type exports\nexport * from \"./types\";\n"]}
|