@tspvivek/baasix-sdk 0.1.0-alpha.6 → 0.1.0-alpha.7
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-BydI-nYY.d.ts → client-B7CU_tr7.d.ts} +2 -0
- package/dist/{client-BY4L9ASe.d.cts → client-BCNmu9xC.d.cts} +2 -0
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/storage/types.ts","../../src/types.ts","../../src/modules/auth.ts"],"names":[],"mappings":"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","file":"auth.cjs","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 { 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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/storage/types.ts","../../src/types.ts","../../src/modules/auth.ts"],"names":[],"mappings":"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","file":"auth.cjs","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 /** When true, NULL values are considered equal for unique indexes (PostgreSQL 15+) */\n nullsNotDistinct?: 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 { 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"]}
|
package/dist/modules/auth.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { H as HttpClient, A as AuthMode, a as AuthStateEvent, U as User, R as RegisterData, b as AuthResponse, L as LoginCredentials, c as AuthTokens, M as MagicLinkOptions, P as PasswordResetOptions, T as Tenant, d as AuthState } from '../client-
|
|
1
|
+
import { H as HttpClient, A as AuthMode, a as AuthStateEvent, U as User, R as RegisterData, b as AuthResponse, L as LoginCredentials, c as AuthTokens, M as MagicLinkOptions, P as PasswordResetOptions, T as Tenant, d as AuthState } from '../client-BCNmu9xC.cjs';
|
|
2
2
|
import { S as StorageAdapter } from '../types-BdjsGANq.cjs';
|
|
3
3
|
|
|
4
4
|
type OAuthProvider = "google" | "facebook" | "apple" | "github";
|
package/dist/modules/auth.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { H as HttpClient, A as AuthMode, a as AuthStateEvent, U as User, R as RegisterData, b as AuthResponse, L as LoginCredentials, c as AuthTokens, M as MagicLinkOptions, P as PasswordResetOptions, T as Tenant, d as AuthState } from '../client-
|
|
1
|
+
import { H as HttpClient, A as AuthMode, a as AuthStateEvent, U as User, R as RegisterData, b as AuthResponse, L as LoginCredentials, c as AuthTokens, M as MagicLinkOptions, P as PasswordResetOptions, T as Tenant, d as AuthState } from '../client-B7CU_tr7.js';
|
|
2
2
|
import { S as StorageAdapter } from '../types-BdjsGANq.js';
|
|
3
3
|
|
|
4
4
|
type OAuthProvider = "google" | "facebook" | "apple" | "github";
|
package/dist/modules/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/storage/types.ts","../../src/types.ts","../../src/modules/auth.ts"],"names":[],"mappings":"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","file":"auth.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 { 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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/storage/types.ts","../../src/types.ts","../../src/modules/auth.ts"],"names":[],"mappings":"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","file":"auth.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 /** When true, NULL values are considered equal for unique indexes (PostgreSQL 15+) */\n nullsNotDistinct?: 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 { 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"]}
|
package/dist/modules/files.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { H as HttpClient, i as UploadOptions, j as FileMetadata, Q as QueryParams, e as PaginatedResponse, k as AssetTransformOptions } from '../client-
|
|
1
|
+
import { H as HttpClient, i as UploadOptions, j as FileMetadata, Q as QueryParams, e as PaginatedResponse, k as AssetTransformOptions } from '../client-BCNmu9xC.cjs';
|
|
2
2
|
import '../types-BdjsGANq.cjs';
|
|
3
3
|
|
|
4
4
|
interface FilesModuleConfig {
|
package/dist/modules/files.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { H as HttpClient, i as UploadOptions, j as FileMetadata, Q as QueryParams, e as PaginatedResponse, k as AssetTransformOptions } from '../client-
|
|
1
|
+
import { H as HttpClient, i as UploadOptions, j as FileMetadata, Q as QueryParams, e as PaginatedResponse, k as AssetTransformOptions } from '../client-B7CU_tr7.js';
|
|
2
2
|
import '../types-BdjsGANq.js';
|
|
3
3
|
|
|
4
4
|
interface FilesModuleConfig {
|
package/dist/modules/items.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { B as BaseItem, H as HttpClient, F as Filter, S as Sort, Q as QueryParams, e as PaginatedResponse, f as BulkResponse } from '../client-
|
|
2
|
-
export { D as DeleteResponse, g as MutationResponse, h as SingleResponse } from '../client-
|
|
1
|
+
import { B as BaseItem, H as HttpClient, F as Filter, S as Sort, Q as QueryParams, e as PaginatedResponse, f as BulkResponse } from '../client-BCNmu9xC.cjs';
|
|
2
|
+
export { D as DeleteResponse, g as MutationResponse, h as SingleResponse } from '../client-BCNmu9xC.cjs';
|
|
3
3
|
import '../types-BdjsGANq.cjs';
|
|
4
4
|
|
|
5
5
|
interface ItemsModuleConfig {
|
package/dist/modules/items.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { B as BaseItem, H as HttpClient, F as Filter, S as Sort, Q as QueryParams, e as PaginatedResponse, f as BulkResponse } from '../client-
|
|
2
|
-
export { D as DeleteResponse, g as MutationResponse, h as SingleResponse } from '../client-
|
|
1
|
+
import { B as BaseItem, H as HttpClient, F as Filter, S as Sort, Q as QueryParams, e as PaginatedResponse, f as BulkResponse } from '../client-B7CU_tr7.js';
|
|
2
|
+
export { D as DeleteResponse, g as MutationResponse, h as SingleResponse } from '../client-B7CU_tr7.js';
|
|
3
3
|
import '../types-BdjsGANq.js';
|
|
4
4
|
|
|
5
5
|
interface ItemsModuleConfig {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { H as HttpClient, S as Sort, e as PaginatedResponse, l as SchemaInfo, m as SchemaDefinition, n as RelationshipDefinition, I as IndexDefinition } from '../client-
|
|
1
|
+
import { H as HttpClient, S as Sort, e as PaginatedResponse, l as SchemaInfo, m as SchemaDefinition, n as RelationshipDefinition, I as IndexDefinition } from '../client-BCNmu9xC.cjs';
|
|
2
2
|
import '../types-BdjsGANq.cjs';
|
|
3
3
|
|
|
4
4
|
interface SchemasModuleConfig {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { H as HttpClient, S as Sort, e as PaginatedResponse, l as SchemaInfo, m as SchemaDefinition, n as RelationshipDefinition, I as IndexDefinition } from '../client-
|
|
1
|
+
import { H as HttpClient, S as Sort, e as PaginatedResponse, l as SchemaInfo, m as SchemaDefinition, n as RelationshipDefinition, I as IndexDefinition } from '../client-B7CU_tr7.js';
|
|
2
2
|
import '../types-BdjsGANq.js';
|
|
3
3
|
|
|
4
4
|
interface SchemasModuleConfig {
|