fauxbase 0.5.1 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/registry.ts","../src/entity.ts","../src/service.ts","../src/auth.ts","../src/query-engine.ts","../src/drivers/local.ts","../src/presets/types.ts","../src/presets/default.ts","../src/presets/spring-boot.ts","../src/presets/laravel.ts","../src/presets/django.ts","../src/presets/nestjs.ts","../src/presets/express.ts","../src/presets/index.ts","../src/drivers/query-serializer.ts","../src/drivers/http.ts","../src/events/event-bus.ts","../src/events/sse-source.ts","../src/events/stomp-source.ts","../src/seed.ts","../src/client.ts"],"names":["body","field"],"mappings":"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","file":"index.js","sourcesContent":["import type { FauxbaseErrorPayload } from './types';\n\nexport class FauxbaseError extends Error {\n public readonly code: string;\n public readonly details?: Record<string, string>;\n\n constructor(message: string, code: string, details?: Record<string, string>) {\n super(message);\n this.name = 'FauxbaseError';\n this.code = code;\n this.details = details;\n }\n\n toJSON(): FauxbaseErrorPayload {\n return { error: this.message, code: this.code, details: this.details };\n }\n}\n\nexport class NotFoundError extends FauxbaseError {\n constructor(message = 'Resource not found') {\n super(message, 'NOT_FOUND');\n this.name = 'NotFoundError';\n }\n}\n\nexport class ConflictError extends FauxbaseError {\n constructor(message = 'Resource conflict') {\n super(message, 'CONFLICT');\n this.name = 'ConflictError';\n }\n}\n\nexport class ValidationError extends FauxbaseError {\n constructor(message = 'Validation failed', details?: Record<string, string>) {\n super(message, 'VALIDATION', details);\n this.name = 'ValidationError';\n }\n}\n\nexport class ForbiddenError extends FauxbaseError {\n constructor(message = 'Access forbidden') {\n super(message, 'FORBIDDEN');\n this.name = 'ForbiddenError';\n }\n}\n\nexport class NetworkError extends FauxbaseError {\n constructor(message = 'Network request failed') {\n super(message, 'NETWORK');\n this.name = 'NetworkError';\n }\n}\n\nexport class TimeoutError extends FauxbaseError {\n constructor(message = 'Request timed out') {\n super(message, 'TIMEOUT');\n this.name = 'TimeoutError';\n }\n}\n\nexport class HttpError extends FauxbaseError {\n public readonly status: number;\n\n constructor(message: string, status: number, details?: Record<string, string>) {\n super(message, 'HTTP', details);\n this.name = 'HttpError';\n this.status = status;\n }\n\n toJSON() {\n return { ...super.toJSON(), status: this.status };\n }\n}\n","import type { FieldOptions, HookType } from './types';\n\n// Field metadata: Map<Constructor, Map<fieldName, FieldOptions>>\nconst fieldRegistry = new Map<Function, Map<string, FieldOptions>>();\n\n// Relation metadata: Map<Constructor, Map<fieldName, targetEntityName>>\nconst relationRegistry = new Map<Function, Map<string, string>>();\n\n// Computed metadata: Map<Constructor, Map<fieldName, computeFn>>\nconst computedRegistry = new Map<Function, Map<string, (entity: any) => any>>();\n\n// Hook metadata: Map<Constructor, Map<HookType, methodName[]>>\nconst hookRegistry = new Map<Function, Map<HookType, string[]>>();\n\n// --- Register ---\n\nexport function registerField(target: Function, propertyKey: string, options: FieldOptions): void {\n if (!fieldRegistry.has(target)) fieldRegistry.set(target, new Map());\n fieldRegistry.get(target)!.set(propertyKey, options);\n}\n\nexport function registerRelation(target: Function, propertyKey: string, entityName: string): void {\n if (!relationRegistry.has(target)) relationRegistry.set(target, new Map());\n relationRegistry.get(target)!.set(propertyKey, entityName);\n}\n\nexport function registerComputed(target: Function, propertyKey: string, fn: (entity: any) => any): void {\n if (!computedRegistry.has(target)) computedRegistry.set(target, new Map());\n computedRegistry.get(target)!.set(propertyKey, fn);\n}\n\nexport function registerHook(target: Function, hookType: HookType, methodName: string): void {\n if (!hookRegistry.has(target)) hookRegistry.set(target, new Map());\n const hooks = hookRegistry.get(target)!;\n if (!hooks.has(hookType)) hooks.set(hookType, []);\n hooks.get(hookType)!.push(methodName);\n}\n\n// --- Read ---\n\nexport function getFieldMeta(target: Function): Map<string, FieldOptions> {\n return fieldRegistry.get(target) ?? new Map();\n}\n\nexport function getRelationMeta(target: Function): Map<string, string> {\n return relationRegistry.get(target) ?? new Map();\n}\n\nexport function getComputedMeta(target: Function): Map<string, (entity: any) => any> {\n return computedRegistry.get(target) ?? new Map();\n}\n\nexport function getHooks(target: Function, hookType: HookType): string[] {\n return hookRegistry.get(target)?.get(hookType) ?? [];\n}\n","import type { FieldOptions } from './types';\nimport { ValidationError } from './errors';\nimport { registerField, registerRelation, registerComputed, getFieldMeta, getComputedMeta } from './registry';\n\n// --- Entity base class (schema definition, not instantiated for data) ---\n\nexport abstract class Entity {\n declare id: string;\n declare createdAt: string;\n declare updatedAt: string;\n declare createdById?: string;\n declare createdByName?: string;\n declare updatedById?: string;\n declare updatedByName?: string;\n declare deletedAt?: string | null;\n declare deletedById?: string;\n declare deletedByName?: string;\n declare version: number;\n}\n\n// --- Decorators ---\n\nexport function field(options: FieldOptions = {}): PropertyDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n registerField(target.constructor, propertyKey as string, options);\n };\n}\n\nexport function relation(entityName: string): PropertyDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n registerRelation(target.constructor, propertyKey as string, entityName);\n };\n}\n\nexport function computed(fn: (entity: any) => any): PropertyDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n registerComputed(target.constructor, propertyKey as string, fn);\n };\n}\n\n// --- Utility functions ---\n\nexport function applyDefaults(data: Record<string, any>, entityClass: Function): Record<string, any> {\n const fieldMeta = getFieldMeta(entityClass);\n const result = { ...data };\n\n for (const [fieldName, options] of fieldMeta) {\n if (result[fieldName] === undefined && options.default !== undefined) {\n result[fieldName] = typeof options.default === 'function' ? options.default() : options.default;\n }\n }\n\n return result;\n}\n\nexport function validateEntity(data: Record<string, any>, entityClass: Function, isCreate: boolean): void {\n const fieldMeta = getFieldMeta(entityClass);\n const errors: Record<string, string> = {};\n\n for (const [fieldName, options] of fieldMeta) {\n const value = data[fieldName];\n\n if (isCreate && options.required && (value === undefined || value === null || value === '')) {\n errors[fieldName] = `${fieldName} is required`;\n }\n\n if (value !== undefined && value !== null) {\n if (options.min !== undefined && typeof value === 'number' && value < options.min) {\n errors[fieldName] = `${fieldName} must be >= ${options.min}`;\n }\n if (options.max !== undefined && typeof value === 'number' && value > options.max) {\n errors[fieldName] = `${fieldName} must be <= ${options.max}`;\n }\n }\n }\n\n if (Object.keys(errors).length > 0) {\n throw new ValidationError('Validation failed', errors);\n }\n}\n\nexport function applyComputedFields<T>(data: Record<string, any>, entityClass: Function): T {\n const computedMeta = getComputedMeta(entityClass);\n if (computedMeta.size === 0) return data as T;\n\n const result = { ...data };\n for (const [key, fn] of computedMeta) {\n Object.defineProperty(result, key, {\n get: () => fn(result),\n enumerable: true,\n configurable: true,\n });\n }\n return result as T;\n}\n","import type { ApiResponse, HookType, PagedResponse, QueryParams } from './types';\nimport type { Driver } from './drivers/types';\nimport type { Entity } from './entity';\nimport type { EventBus } from './events/event-bus';\nimport { registerHook, getHooks } from './registry';\n\n// --- Hook decorators ---\n\nexport function beforeCreate(): MethodDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n registerHook(target.constructor, 'beforeCreate', propertyKey as string);\n };\n}\n\nexport function beforeUpdate(): MethodDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n registerHook(target.constructor, 'beforeUpdate', propertyKey as string);\n };\n}\n\nexport function afterCreate(): MethodDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n registerHook(target.constructor, 'afterCreate', propertyKey as string);\n };\n}\n\nexport function afterUpdate(): MethodDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n registerHook(target.constructor, 'afterUpdate', propertyKey as string);\n };\n}\n\n// --- Service base class ---\n\nexport abstract class Service<T extends Entity> {\n abstract entity: new (...args: any[]) => T;\n abstract endpoint: string;\n\n protected driver!: Driver;\n protected resourceName!: string;\n protected client: any;\n\n /** @internal */\n _eventBus?: EventBus;\n\n /** @internal — called by createClient to wire the service */\n _init(driver: Driver, resourceName: string): void {\n this.driver = driver;\n this.resourceName = resourceName;\n }\n\n /** @internal — called by createClient to give services access to the client */\n _setClient(client: any): void {\n this.client = client;\n }\n\n async list(query: QueryParams = {}): Promise<PagedResponse<T>> {\n return this.driver.list<T>(this.resourceName, query);\n }\n\n async get(id: string): Promise<ApiResponse<T>> {\n return this.driver.get<T>(this.resourceName, id);\n }\n\n async create(data: Partial<T>): Promise<ApiResponse<T>> {\n const allItems = (await this.driver.list<T>(this.resourceName, {})).items;\n await this.runHooks('beforeCreate', data, allItems);\n const result = await this.driver.create<T>(this.resourceName, data);\n await this.runHooks('afterCreate', result.data);\n this.emitEvent('created', { data: result.data, id: (result.data as any).id });\n return result;\n }\n\n async update(id: string, data: Partial<T>): Promise<ApiResponse<T>> {\n await this.runHooks('beforeUpdate', id, data);\n const result = await this.driver.update<T>(this.resourceName, id, data);\n await this.runHooks('afterUpdate', result.data);\n this.emitEvent('updated', { data: result.data, id });\n return result;\n }\n\n async delete(id: string): Promise<ApiResponse<T>> {\n const result = await this.driver.delete<T>(this.resourceName, id);\n this.emitEvent('deleted', { data: result.data, id });\n return result;\n }\n\n async count(filter?: Record<string, any>): Promise<number> {\n return this.driver.count(this.resourceName, filter);\n }\n\n get bulk() {\n const self = this;\n return {\n async create(items: Array<Partial<T>>) {\n const result = await self.driver.bulkCreate<T>(self.resourceName, items);\n self.emitEvent('bulkCreated', { data: result.data });\n return result;\n },\n async update(updates: Array<{ id: string; data: Partial<T> }>) {\n const result = await self.driver.bulkUpdate<T>(self.resourceName, updates);\n self.emitEvent('bulkUpdated', { data: result.data, ids: updates.map(u => u.id) });\n return result;\n },\n async delete(ids: string[]) {\n const result = await self.driver.bulkDelete(self.resourceName, ids);\n self.emitEvent('bulkDeleted', { ids });\n return result;\n },\n };\n }\n\n private emitEvent(action: import('./events/types').EventAction, extra: { data?: any; id?: string; ids?: string[] }): void {\n if (!this._eventBus) return;\n this._eventBus.emit({\n action,\n resource: this.resourceName,\n data: extra.data,\n id: extra.id,\n ids: extra.ids,\n timestamp: Date.now(),\n source: 'local',\n });\n }\n\n private async runHooks(hookType: HookType, ...args: any[]): Promise<void> {\n const methods = getHooks(this.constructor, hookType);\n for (const methodName of methods) {\n await (this as any)[methodName](...args);\n }\n }\n}\n","import { Service } from './service';\nimport { Entity } from './entity';\nimport { ConflictError, NotFoundError, ForbiddenError } from './errors';\nimport type { HttpDriver } from './drivers/http';\nimport type { Preset } from './presets/types';\n\n// --- Types ---\n\nexport interface LoginCredentials {\n email: string;\n password: string;\n}\n\nexport interface AuthState {\n userId: string;\n email: string;\n userName?: string;\n role?: string;\n token: string;\n}\n\nexport interface AuthContext {\n userId: string;\n userName?: string;\n}\n\n// --- AuthService ---\n\nexport abstract class AuthService<T extends Entity> extends Service<T> {\n private authState: AuthState | null = null;\n private saveState: ((state: AuthState | null) => void) | null = null;\n private httpDriver: HttpDriver | null = null;\n\n /** @internal — called by createClient to wire persistence */\n _initAuth(\n loadState: () => AuthState | null,\n saveState: (state: AuthState | null) => void,\n ): void {\n this.saveState = saveState;\n this.authState = loadState();\n }\n\n /** @internal — called by createClient when using HttpDriver */\n _setHttpMode(driver: HttpDriver): void {\n this.httpDriver = driver;\n }\n\n async login(credentials: LoginCredentials): Promise<T> {\n if (this.httpDriver) {\n return this.httpLogin(credentials);\n }\n return this.localLogin(credentials);\n }\n\n async register(data: Partial<T>): Promise<T> {\n if (this.httpDriver) {\n return this.httpRegister(data);\n }\n return this.localRegister(data);\n }\n\n logout(): void {\n this.authState = null;\n this.persistState();\n }\n\n get currentUser(): T | null {\n // Return a shallow proxy — not the full entity, but enough for display\n return this.authState ? ({ id: this.authState.userId, email: this.authState.email } as unknown as T) : null;\n }\n\n get isLoggedIn(): boolean {\n return this.authState !== null;\n }\n\n get token(): string | null {\n return this.authState?.token ?? null;\n }\n\n hasRole(role: string): boolean {\n return this.authState?.role === role;\n }\n\n getAuthContext(): AuthContext | null {\n if (!this.authState) return null;\n return {\n userId: this.authState.userId,\n userName: this.authState.userName,\n };\n }\n\n // --- Local mode (original implementation) ---\n\n private async localLogin(credentials: LoginCredentials): Promise<T> {\n const { items } = await this.list({ filter: { email: credentials.email } });\n if (items.length === 0) {\n throw new NotFoundError('Invalid email or password');\n }\n\n const user = items[0] as any;\n if (user.password !== credentials.password) {\n throw new ForbiddenError('Invalid email or password');\n }\n\n this.authState = {\n userId: user.id,\n email: user.email,\n userName: user.name || user.email,\n role: user.role,\n token: this.generateToken(user),\n };\n this.persistState();\n return user;\n }\n\n private async localRegister(data: Partial<T>): Promise<T> {\n const email = (data as any).email;\n if (email) {\n const { items } = await this.list({ filter: { email } });\n if (items.length > 0) {\n throw new ConflictError('Email already registered');\n }\n }\n\n const { data: user } = await this.create(data);\n const u = user as any;\n\n this.authState = {\n userId: u.id,\n email: u.email,\n userName: u.name || u.email,\n role: u.role,\n token: this.generateToken(u),\n };\n this.persistState();\n return user;\n }\n\n // --- HTTP mode ---\n\n private async httpLogin(credentials: LoginCredentials): Promise<T> {\n const preset = (this.httpDriver as any).preset as Preset;\n const baseUrl = (this.httpDriver as any).baseUrl as string;\n const url = `${baseUrl}${preset.auth.loginUrl}`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(credentials),\n });\n\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n if (response.status === 401 || response.status === 403) {\n throw new ForbiddenError(body.message ?? 'Invalid email or password');\n }\n if (response.status === 404) {\n throw new NotFoundError(body.message ?? 'Invalid email or password');\n }\n throw new ForbiddenError(body.message ?? 'Login failed');\n }\n\n const body = await response.json();\n const token = body[preset.auth.tokenField];\n const user = body[preset.auth.userField] ?? body;\n\n this.authState = {\n userId: user.id,\n email: user.email ?? credentials.email,\n userName: user.name || user.email || credentials.email,\n role: user.role,\n token,\n };\n this.persistState();\n return user as T;\n }\n\n private async httpRegister(data: Partial<T>): Promise<T> {\n const preset = (this.httpDriver as any).preset as Preset;\n const baseUrl = (this.httpDriver as any).baseUrl as string;\n const url = `${baseUrl}${preset.auth.registerUrl}`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n if (response.status === 409) {\n throw new ConflictError(body.message ?? 'Email already registered');\n }\n throw new ForbiddenError(body.message ?? 'Registration failed');\n }\n\n const body = await response.json();\n const token = body[preset.auth.tokenField];\n const user = body[preset.auth.userField] ?? body;\n\n this.authState = {\n userId: user.id,\n email: user.email ?? (data as any).email,\n userName: user.name || user.email || (data as any).email,\n role: user.role,\n token,\n };\n this.persistState();\n return user as T;\n }\n\n private generateToken(user: any): string {\n return btoa(JSON.stringify({\n userId: user.id,\n email: user.email,\n role: user.role,\n iat: Date.now(),\n exp: Date.now() + 24 * 60 * 60 * 1000,\n }));\n }\n\n private persistState(): void {\n if (this.saveState) {\n this.saveState(this.authState);\n }\n }\n}\n","import type { FilterOperator, PageMeta, PagedResponse, QueryParams, SortParams } from './types';\n\n// --- Parse filter key ---\n\nconst OPERATORS: FilterOperator[] = [\n 'startswith', 'endswith', 'contains', 'between', 'isnull',\n 'like', 'gte', 'lte', 'gt', 'lt', 'ne', 'in', 'eq',\n];\n\nexport function parseFilterKey(key: string): { field: string; operator: FilterOperator } {\n for (const op of OPERATORS) {\n const suffix = `__${op}`;\n if (key.endsWith(suffix)) {\n return { field: key.slice(0, -suffix.length), operator: op };\n }\n }\n return { field: key, operator: 'eq' };\n}\n\n// --- Match single operator ---\n\nexport function matchOperator(itemValue: any, operator: FilterOperator, filterValue: any): boolean {\n if (operator === 'isnull') {\n return filterValue\n ? (itemValue === null || itemValue === undefined)\n : (itemValue !== null && itemValue !== undefined);\n }\n\n if (itemValue === null || itemValue === undefined) return false;\n\n switch (operator) {\n case 'eq': return itemValue === filterValue;\n case 'ne': return itemValue !== filterValue;\n case 'gt': return itemValue > filterValue;\n case 'gte': return itemValue >= filterValue;\n case 'lt': return itemValue < filterValue;\n case 'lte': return itemValue <= filterValue;\n case 'like':\n case 'contains': return String(itemValue).toLowerCase().includes(String(filterValue).toLowerCase());\n case 'startswith': return String(itemValue).toLowerCase().startsWith(String(filterValue).toLowerCase());\n case 'endswith': return String(itemValue).toLowerCase().endsWith(String(filterValue).toLowerCase());\n case 'between': return Array.isArray(filterValue) && itemValue >= filterValue[0] && itemValue <= filterValue[1];\n case 'in': return Array.isArray(filterValue) && filterValue.includes(itemValue);\n default: return false;\n }\n}\n\n// --- Apply filters ---\n\nexport function applyFilters<T extends Record<string, any>>(items: T[], filter: Record<string, any>): T[] {\n return items.filter(item => {\n for (const [key, value] of Object.entries(filter)) {\n const { field, operator } = parseFilterKey(key);\n if (!matchOperator(item[field], operator, value)) return false;\n }\n return true;\n });\n}\n\n// --- Sort ---\n\nexport function applySort<T extends Record<string, any>>(items: T[], sort?: SortParams): T[] {\n if (!sort) return items;\n return [...items].sort((a, b) => {\n const aVal = a[sort.field];\n const bVal = b[sort.field];\n if (aVal === bVal) return 0;\n if (aVal === null || aVal === undefined) return 1;\n if (bVal === null || bVal === undefined) return -1;\n const cmp = aVal < bVal ? -1 : 1;\n return sort.direction === 'desc' ? -cmp : cmp;\n });\n}\n\n// --- Paginate ---\n\nexport function applyPagination<T>(items: T[], page = 1, size = 20): { items: T[]; meta: PageMeta } {\n const totalItems = items.length;\n const totalPages = size > 0 ? Math.ceil(totalItems / size) : 0;\n const start = (page - 1) * size;\n const paged = items.slice(start, start + size);\n return {\n items: paged,\n meta: { page, size, totalItems, totalPages },\n };\n}\n\n// --- Composite: filter → sort → paginate ---\n\nexport function executeQuery<T extends Record<string, any>>(\n items: T[],\n query: QueryParams,\n): PagedResponse<T> {\n let result = items;\n\n // Exclude soft-deleted records\n result = result.filter(item => !item.deletedAt);\n\n if (query.filter) {\n result = applyFilters(result, query.filter);\n }\n\n result = applySort(result, query.sort);\n return applyPagination(result, query.page, query.size);\n}\n","import type { ApiResponse, LocalDriverConfig, PagedResponse, QueryParams } from '../types';\nimport type { Driver } from './types';\nimport { executeQuery, applyFilters } from '../query-engine';\nimport { applyComputedFields, applyDefaults, validateEntity } from '../entity';\nimport { NotFoundError } from '../errors';\n\n// --- UUID generation ---\n\nfunction generateUUID(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n// --- Storage backend interface ---\n\ninterface StorageBackend {\n getAll(resource: string): Record<string, any>[];\n getById(resource: string, id: string): Record<string, any> | undefined;\n set(resource: string, id: string, data: Record<string, any>): void;\n remove(resource: string, id: string): void;\n clear(resource: string): void;\n getMeta(key: string): string | null;\n setMeta(key: string, value: string): void;\n}\n\n// --- Memory storage ---\n\nclass MemoryStorage implements StorageBackend {\n private data = new Map<string, Map<string, Record<string, any>>>();\n private meta = new Map<string, string>();\n\n getAll(resource: string): Record<string, any>[] {\n const store = this.data.get(resource);\n return store ? Array.from(store.values()) : [];\n }\n\n getById(resource: string, id: string): Record<string, any> | undefined {\n return this.data.get(resource)?.get(id);\n }\n\n set(resource: string, id: string, data: Record<string, any>): void {\n if (!this.data.has(resource)) this.data.set(resource, new Map());\n this.data.get(resource)!.set(id, data);\n }\n\n remove(resource: string, id: string): void {\n this.data.get(resource)?.delete(id);\n }\n\n clear(resource: string): void {\n this.data.delete(resource);\n }\n\n getMeta(key: string): string | null {\n return this.meta.get(key) ?? null;\n }\n\n setMeta(key: string, value: string): void {\n this.meta.set(key, value);\n }\n}\n\n// --- localStorage storage ---\n\nconst LS_PREFIX = 'fauxbase:';\nconst LS_INDEX_PREFIX = `${LS_PREFIX}__index:`;\nconst LS_META_PREFIX = `${LS_PREFIX}__meta:`;\n\nclass LocalStorageBackend implements StorageBackend {\n private getIndex(resource: string): string[] {\n const raw = localStorage.getItem(`${LS_INDEX_PREFIX}${resource}`);\n return raw ? JSON.parse(raw) : [];\n }\n\n private setIndex(resource: string, ids: string[]): void {\n localStorage.setItem(`${LS_INDEX_PREFIX}${resource}`, JSON.stringify(ids));\n }\n\n getAll(resource: string): Record<string, any>[] {\n const ids = this.getIndex(resource);\n const items: Record<string, any>[] = [];\n for (const id of ids) {\n const raw = localStorage.getItem(`${LS_PREFIX}${resource}:${id}`);\n if (raw) items.push(JSON.parse(raw));\n }\n return items;\n }\n\n getById(resource: string, id: string): Record<string, any> | undefined {\n const raw = localStorage.getItem(`${LS_PREFIX}${resource}:${id}`);\n return raw ? JSON.parse(raw) : undefined;\n }\n\n set(resource: string, id: string, data: Record<string, any>): void {\n localStorage.setItem(`${LS_PREFIX}${resource}:${id}`, JSON.stringify(data));\n const ids = this.getIndex(resource);\n if (!ids.includes(id)) {\n ids.push(id);\n this.setIndex(resource, ids);\n }\n }\n\n remove(resource: string, id: string): void {\n localStorage.removeItem(`${LS_PREFIX}${resource}:${id}`);\n const ids = this.getIndex(resource);\n this.setIndex(resource, ids.filter(i => i !== id));\n }\n\n clear(resource: string): void {\n const ids = this.getIndex(resource);\n for (const id of ids) {\n localStorage.removeItem(`${LS_PREFIX}${resource}:${id}`);\n }\n localStorage.removeItem(`${LS_INDEX_PREFIX}${resource}`);\n }\n\n getMeta(key: string): string | null {\n return localStorage.getItem(`${LS_META_PREFIX}${key}`);\n }\n\n setMeta(key: string, value: string): void {\n localStorage.setItem(`${LS_META_PREFIX}${key}`, value);\n }\n}\n\n// --- IndexedDB storage (memory-cached, write-through) ---\n\nfunction idbRequest<T>(req: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n\nconst IDB_DATA_STORE = 'data';\nconst IDB_META_STORE = 'meta';\n\nclass IndexedDBBackend implements StorageBackend {\n private cache = new MemoryStorage();\n private db: IDBDatabase | null = null;\n private _ready: Promise<void>;\n\n constructor(dbName: string) {\n this._ready = this.open(dbName);\n }\n\n get ready(): Promise<void> {\n return this._ready;\n }\n\n private open(dbName: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(dbName, 1);\n req.onupgradeneeded = () => {\n const db = req.result;\n if (!db.objectStoreNames.contains(IDB_DATA_STORE)) {\n db.createObjectStore(IDB_DATA_STORE);\n }\n if (!db.objectStoreNames.contains(IDB_META_STORE)) {\n db.createObjectStore(IDB_META_STORE);\n }\n };\n req.onsuccess = async () => {\n this.db = req.result;\n await this.loadAll();\n resolve();\n };\n req.onerror = () => reject(req.error);\n });\n }\n\n private async loadAll(): Promise<void> {\n const db = this.db!;\n const tx = db.transaction([IDB_DATA_STORE, IDB_META_STORE], 'readonly');\n const dataStore = tx.objectStore(IDB_DATA_STORE);\n const metaStore = tx.objectStore(IDB_META_STORE);\n\n // Load all data keys\n const dataKeys = await idbRequest(dataStore.getAllKeys());\n const dataValues = await idbRequest(dataStore.getAll());\n for (let i = 0; i < dataKeys.length; i++) {\n const compositeKey = dataKeys[i] as string;\n const sepIdx = compositeKey.indexOf(':');\n const resource = compositeKey.substring(0, sepIdx);\n const id = compositeKey.substring(sepIdx + 1);\n this.cache.set(resource, id, dataValues[i]);\n }\n\n // Load all meta keys\n const metaKeys = await idbRequest(metaStore.getAllKeys());\n const metaValues = await idbRequest(metaStore.getAll());\n for (let i = 0; i < metaKeys.length; i++) {\n this.cache.setMeta(metaKeys[i] as string, metaValues[i]);\n }\n }\n\n private writeData(resource: string, id: string, data: Record<string, any>): void {\n if (!this.db) return;\n const tx = this.db.transaction(IDB_DATA_STORE, 'readwrite');\n tx.objectStore(IDB_DATA_STORE).put(data, `${resource}:${id}`);\n }\n\n private deleteData(resource: string, id: string): void {\n if (!this.db) return;\n const tx = this.db.transaction(IDB_DATA_STORE, 'readwrite');\n tx.objectStore(IDB_DATA_STORE).delete(`${resource}:${id}`);\n }\n\n private writeMeta(key: string, value: string): void {\n if (!this.db) return;\n const tx = this.db.transaction(IDB_META_STORE, 'readwrite');\n tx.objectStore(IDB_META_STORE).put(value, key);\n }\n\n getAll(resource: string): Record<string, any>[] {\n return this.cache.getAll(resource);\n }\n\n getById(resource: string, id: string): Record<string, any> | undefined {\n return this.cache.getById(resource, id);\n }\n\n set(resource: string, id: string, data: Record<string, any>): void {\n this.cache.set(resource, id, data);\n this.writeData(resource, id, data);\n }\n\n remove(resource: string, id: string): void {\n this.cache.remove(resource, id);\n this.deleteData(resource, id);\n }\n\n clear(resource: string): void {\n const items = this.cache.getAll(resource);\n this.cache.clear(resource);\n if (this.db) {\n const tx = this.db.transaction(IDB_DATA_STORE, 'readwrite');\n const store = tx.objectStore(IDB_DATA_STORE);\n for (const item of items) {\n store.delete(`${resource}:${item.id}`);\n }\n }\n }\n\n getMeta(key: string): string | null {\n return this.cache.getMeta(key);\n }\n\n setMeta(key: string, value: string): void {\n this.cache.setMeta(key, value);\n this.writeMeta(key, value);\n }\n}\n\n// --- Auth provider type ---\n\ntype AuthProvider = () => { userId: string; userName?: string } | null;\n\n// --- LocalDriver ---\n\nexport class LocalDriver implements Driver {\n private storage: StorageBackend;\n private entityClasses = new Map<string, Function>();\n private authProvider: AuthProvider | null = null;\n private _ready: Promise<void>;\n private _isReady: boolean;\n\n constructor(config: LocalDriverConfig) {\n if (config.persist === 'indexeddb') {\n const backend = new IndexedDBBackend(config.dbName ?? 'fauxbase');\n this.storage = backend;\n this._isReady = false;\n this._ready = backend.ready.then(() => { this._isReady = true; });\n } else {\n this.storage = config.persist === 'localStorage'\n ? new LocalStorageBackend()\n : new MemoryStorage();\n this._isReady = true;\n this._ready = Promise.resolve();\n }\n }\n\n get ready(): Promise<void> {\n return this._ready;\n }\n\n get isReady(): boolean {\n return this._isReady;\n }\n\n setAuthProvider(provider: AuthProvider): void {\n this.authProvider = provider;\n }\n\n getStorageBackend(): StorageBackend {\n return this.storage;\n }\n\n registerEntity(resource: string, entityClass: Function): void {\n this.entityClasses.set(resource, entityClass);\n }\n\n async list<T>(resource: string, query: QueryParams): Promise<PagedResponse<T>> {\n const items = this.storage.getAll(resource);\n const entityClass = this.entityClasses.get(resource);\n const processed = entityClass\n ? items.map(item => applyComputedFields<T>(item, entityClass))\n : items;\n return executeQuery(processed as Record<string, any>[], query) as PagedResponse<T>;\n }\n\n async get<T>(resource: string, id: string): Promise<ApiResponse<T>> {\n const item = this.storage.getById(resource, id);\n if (!item || item.deletedAt) {\n throw new NotFoundError(`${resource} with id \"${id}\" not found`);\n }\n const entityClass = this.entityClasses.get(resource);\n const data = entityClass ? applyComputedFields<T>(item, entityClass) : item as T;\n return { data };\n }\n\n async create<T>(resource: string, data: Partial<T>): Promise<ApiResponse<T>> {\n const entityClass = this.entityClasses.get(resource);\n const now = new Date().toISOString();\n\n const authContext = this.authProvider?.();\n\n let record: Record<string, any> = {\n ...data,\n id: (data as any).id || generateUUID(),\n createdAt: now,\n updatedAt: now,\n deletedAt: null,\n version: 1,\n ...(authContext ? {\n createdById: authContext.userId,\n createdByName: authContext.userName,\n updatedById: authContext.userId,\n updatedByName: authContext.userName,\n } : {}),\n };\n\n if (entityClass) {\n record = applyDefaults(record, entityClass);\n validateEntity(record, entityClass, true);\n }\n\n this.storage.set(resource, record.id, record);\n\n const result = entityClass\n ? applyComputedFields<T>(record, entityClass)\n : record as T;\n return { data: result };\n }\n\n async update<T>(resource: string, id: string, data: Partial<T>): Promise<ApiResponse<T>> {\n const existing = this.storage.getById(resource, id);\n if (!existing || existing.deletedAt) {\n throw new NotFoundError(`${resource} with id \"${id}\" not found`);\n }\n\n const entityClass = this.entityClasses.get(resource);\n if (entityClass) {\n validateEntity(data as Record<string, any>, entityClass, false);\n }\n\n const authContext = this.authProvider?.();\n\n const record: Record<string, any> = {\n ...existing,\n ...data,\n id,\n createdAt: existing.createdAt,\n updatedAt: new Date().toISOString(),\n version: (existing.version || 0) + 1,\n ...(authContext ? {\n updatedById: authContext.userId,\n updatedByName: authContext.userName,\n } : {}),\n };\n\n this.storage.set(resource, id, record);\n\n const result = entityClass\n ? applyComputedFields<T>(record, entityClass)\n : record as T;\n return { data: result };\n }\n\n async delete<T>(resource: string, id: string): Promise<ApiResponse<T>> {\n const existing = this.storage.getById(resource, id);\n if (!existing || existing.deletedAt) {\n throw new NotFoundError(`${resource} with id \"${id}\" not found`);\n }\n\n const now = new Date().toISOString();\n const authContext = this.authProvider?.();\n\n const record = {\n ...existing,\n deletedAt: now,\n updatedAt: now,\n version: (existing.version || 0) + 1,\n ...(authContext ? {\n deletedById: authContext.userId,\n deletedByName: authContext.userName,\n updatedById: authContext.userId,\n updatedByName: authContext.userName,\n } : {}),\n };\n\n this.storage.set(resource, id, record);\n return { data: record as T };\n }\n\n async count(resource: string, filter?: Record<string, any>): Promise<number> {\n let items = this.storage.getAll(resource).filter(item => !item.deletedAt);\n if (filter) {\n items = applyFilters(items, filter);\n }\n return items.length;\n }\n\n async bulkCreate<T>(resource: string, data: Array<Partial<T>>): Promise<ApiResponse<T[]>> {\n const results: T[] = [];\n for (const item of data) {\n const { data: created } = await this.create<T>(resource, item);\n results.push(created);\n }\n return { data: results };\n }\n\n async bulkUpdate<T>(resource: string, updates: Array<{ id: string; data: Partial<T> }>): Promise<ApiResponse<T[]>> {\n const results: T[] = [];\n for (const { id, data } of updates) {\n const { data: updated } = await this.update<T>(resource, id, data);\n results.push(updated);\n }\n return { data: results };\n }\n\n async bulkDelete(resource: string, ids: string[]): Promise<ApiResponse<{ count: number }>> {\n let count = 0;\n for (const id of ids) {\n await this.delete(resource, id);\n count++;\n }\n return { data: { count } };\n }\n\n // --- Seed management (synchronous) ---\n\n seed(resource: string, data: Array<Record<string, any>>, entityClass: Function): void {\n for (let i = 0; i < data.length; i++) {\n const seedId = `seed:${resource}:${i}`;\n const now = new Date().toISOString();\n const record = applyDefaults({\n ...data[i],\n id: seedId,\n createdAt: now,\n updatedAt: now,\n deletedAt: null,\n version: 1,\n }, entityClass);\n this.storage.set(resource, seedId, record);\n }\n }\n\n getSeedVersion(): string | null {\n return this.storage.getMeta('_seedVersion');\n }\n\n setSeedVersion(version: string): void {\n this.storage.setMeta('_seedVersion', version);\n }\n\n clear(resource: string): void {\n this.storage.clear(resource);\n }\n}\n","export type FilterStyle = 'django' | 'dot' | 'bracket' | 'nestjs';\n\nexport interface Preset {\n name: string;\n response: {\n single: (raw: any) => { data: any };\n list: (raw: any) => { items: any[]; meta: Record<string, any> };\n error: (raw: any) => { error: string; code: string; details?: Record<string, string> };\n };\n meta: { page: string; size: string; totalItems: string; totalPages: string };\n query: {\n filterStyle: FilterStyle;\n pageParam: string;\n sizeParam: string;\n sortParam?: string;\n sortFormat: string; // 'field,direction' | 'field:direction'\n pageOffset?: number; // 0 = 1-indexed (default), -1 = 0-indexed\n };\n auth: {\n loginUrl: string;\n registerUrl: string;\n logoutUrl?: string;\n tokenField: string;\n userField: string;\n headerFormat: string; // 'Bearer {token}'\n };\n}\n\nexport function definePreset(config: Preset): Preset {\n return config;\n}\n","import { definePreset } from './types';\n\nexport const defaultPreset = definePreset({\n name: 'default',\n response: {\n single: (raw) => ({ data: raw.data ?? raw }),\n list: (raw) => ({\n items: raw.items ?? raw.data ?? [],\n meta: raw.meta ?? {},\n }),\n error: (raw) => ({\n error: raw.error ?? raw.message ?? 'Unknown error',\n code: raw.code ?? 'UNKNOWN',\n details: raw.details,\n }),\n },\n meta: { page: 'page', size: 'size', totalItems: 'totalItems', totalPages: 'totalPages' },\n query: {\n filterStyle: 'django',\n pageParam: 'page',\n sizeParam: 'size',\n sortParam: 'sort',\n sortFormat: 'field,direction',\n },\n auth: {\n loginUrl: '/auth/login',\n registerUrl: '/auth/register',\n logoutUrl: '/auth/logout',\n tokenField: 'token',\n userField: 'user',\n headerFormat: 'Bearer {token}',\n },\n});\n","import { definePreset } from './types';\n\nexport const springBootPreset = definePreset({\n name: 'spring-boot',\n response: {\n single: (raw) => ({ data: raw }),\n list: (raw) => ({\n items: raw.content ?? [],\n meta: {\n page: (raw.pageable?.pageNumber ?? 0) + 1,\n size: raw.pageable?.pageSize ?? raw.size ?? 20,\n totalItems: raw.totalElements ?? 0,\n totalPages: raw.totalPages ?? 0,\n },\n }),\n error: (raw) => ({\n error: raw.message ?? raw.error ?? 'Unknown error',\n code: raw.status?.toString() ?? 'UNKNOWN',\n details: raw.errors?.reduce?.((acc: Record<string, string>, e: any) => {\n acc[e.field ?? e.code ?? 'unknown'] = e.defaultMessage ?? e.message ?? '';\n return acc;\n }, {}) ?? undefined,\n }),\n },\n meta: { page: 'page', size: 'size', totalItems: 'totalElements', totalPages: 'totalPages' },\n query: {\n filterStyle: 'dot',\n pageParam: 'page',\n sizeParam: 'size',\n sortParam: 'sort',\n sortFormat: 'field,direction',\n pageOffset: -1, // 0-indexed\n },\n auth: {\n loginUrl: '/api/auth/login',\n registerUrl: '/api/auth/register',\n tokenField: 'token',\n userField: 'user',\n headerFormat: 'Bearer {token}',\n },\n});\n","import { definePreset } from './types';\n\nexport const laravelPreset = definePreset({\n name: 'laravel',\n response: {\n single: (raw) => ({ data: raw.data ?? raw }),\n list: (raw) => ({\n items: raw.data ?? [],\n meta: {\n page: raw.meta?.current_page ?? raw.current_page ?? 1,\n size: raw.meta?.per_page ?? raw.per_page ?? 15,\n totalItems: raw.meta?.total ?? raw.total ?? 0,\n totalPages: raw.meta?.last_page ?? raw.last_page ?? 0,\n },\n }),\n error: (raw) => ({\n error: raw.message ?? 'Unknown error',\n code: raw.status?.toString() ?? 'UNKNOWN',\n details: raw.errors\n ? Object.entries(raw.errors).reduce((acc: Record<string, string>, [key, val]: [string, any]) => {\n acc[key] = Array.isArray(val) ? val[0] : val;\n return acc;\n }, {})\n : undefined,\n }),\n },\n meta: { page: 'current_page', size: 'per_page', totalItems: 'total', totalPages: 'last_page' },\n query: {\n filterStyle: 'bracket',\n pageParam: 'page',\n sizeParam: 'per_page',\n sortParam: 'sort',\n sortFormat: 'field,direction',\n },\n auth: {\n loginUrl: '/api/login',\n registerUrl: '/api/register',\n logoutUrl: '/api/logout',\n tokenField: 'token',\n userField: 'user',\n headerFormat: 'Bearer {token}',\n },\n});\n","import { definePreset } from './types';\n\nexport const djangoPreset = definePreset({\n name: 'django',\n response: {\n single: (raw) => ({ data: raw }),\n list: (raw) => ({\n items: raw.results ?? [],\n meta: {\n page: 1, // Django REST doesn't always include page number\n size: raw.results?.length ?? 0,\n totalItems: raw.count ?? 0,\n totalPages: raw.count && raw.results?.length\n ? Math.ceil(raw.count / raw.results.length)\n : 0,\n },\n }),\n error: (raw) => ({\n error: raw.detail ?? raw.message ?? 'Unknown error',\n code: raw.status_code?.toString() ?? 'UNKNOWN',\n details: typeof raw === 'object' && !raw.detail\n ? Object.entries(raw).reduce((acc: Record<string, string>, [key, val]: [string, any]) => {\n if (key !== 'status_code') {\n acc[key] = Array.isArray(val) ? val[0] : String(val);\n }\n return acc;\n }, {})\n : undefined,\n }),\n },\n meta: { page: 'page', size: 'page_size', totalItems: 'count', totalPages: 'total_pages' },\n query: {\n filterStyle: 'django',\n pageParam: 'page',\n sizeParam: 'page_size',\n sortParam: 'ordering',\n sortFormat: 'field,direction',\n },\n auth: {\n loginUrl: '/api/auth/login/',\n registerUrl: '/api/auth/register/',\n logoutUrl: '/api/auth/logout/',\n tokenField: 'token',\n userField: 'user',\n headerFormat: 'Token {token}',\n },\n});\n","import { definePreset } from './types';\n\nexport const nestjsPreset = definePreset({\n name: 'nestjs',\n response: {\n single: (raw) => ({ data: raw.data ?? raw }),\n list: (raw) => ({\n items: raw.data ?? raw.items ?? [],\n meta: raw.meta ?? {},\n }),\n error: (raw) => ({\n error: raw.message ?? 'Unknown error',\n code: raw.error ?? raw.statusCode?.toString() ?? 'UNKNOWN',\n details: raw.message && Array.isArray(raw.message)\n ? raw.message.reduce((acc: Record<string, string>, msg: string, i: number) => {\n acc[`field_${i}`] = msg;\n return acc;\n }, {})\n : undefined,\n }),\n },\n meta: { page: 'page', size: 'limit', totalItems: 'totalItems', totalPages: 'totalPages' },\n query: {\n filterStyle: 'nestjs',\n pageParam: 'page',\n sizeParam: 'limit',\n sortParam: 'sort',\n sortFormat: 'field:direction',\n },\n auth: {\n loginUrl: '/auth/login',\n registerUrl: '/auth/register',\n tokenField: 'access_token',\n userField: 'user',\n headerFormat: 'Bearer {token}',\n },\n});\n","import { definePreset } from './types';\n\nexport const expressPreset = definePreset({\n name: 'express',\n response: {\n single: (raw) => ({ data: raw.data ?? raw }),\n list: (raw) => ({\n items: raw.data ?? raw.items ?? [],\n meta: raw.meta ?? {},\n }),\n error: (raw) => ({\n error: raw.error ?? raw.message ?? 'Unknown error',\n code: raw.code ?? 'UNKNOWN',\n details: raw.details,\n }),\n },\n meta: { page: 'page', size: 'size', totalItems: 'totalItems', totalPages: 'totalPages' },\n query: {\n filterStyle: 'django',\n pageParam: 'page',\n sizeParam: 'size',\n sortParam: 'sort',\n sortFormat: 'field,direction',\n },\n auth: {\n loginUrl: '/api/auth/login',\n registerUrl: '/api/auth/register',\n logoutUrl: '/api/auth/logout',\n tokenField: 'token',\n userField: 'user',\n headerFormat: 'Bearer {token}',\n },\n});\n","import type { Preset } from './types';\nimport { defaultPreset } from './default';\nimport { springBootPreset } from './spring-boot';\nimport { laravelPreset } from './laravel';\nimport { djangoPreset } from './django';\nimport { nestjsPreset } from './nestjs';\nimport { expressPreset } from './express';\n\nexport type { Preset, FilterStyle } from './types';\nexport { definePreset } from './types';\n\nconst presetRegistry = new Map<string, Preset>([\n ['default', defaultPreset],\n ['spring-boot', springBootPreset],\n ['laravel', laravelPreset],\n ['django', djangoPreset],\n ['nestjs', nestjsPreset],\n ['express', expressPreset],\n]);\n\nexport function getPreset(name: string): Preset {\n const preset = presetRegistry.get(name);\n if (!preset) {\n throw new Error(`Unknown preset: \"${name}\". Available: ${Array.from(presetRegistry.keys()).join(', ')}`);\n }\n return preset;\n}\n\nexport { defaultPreset, springBootPreset, laravelPreset, djangoPreset, nestjsPreset, expressPreset };\n","import type { QueryParams } from '../types';\nimport type { Preset } from '../presets/types';\n\ntype PresetQueryConfig = Preset['query'];\n\nexport function serializeQuery(query: QueryParams, config: PresetQueryConfig): URLSearchParams {\n const params = new URLSearchParams();\n\n // Filters\n if (query.filter) {\n serializeFilters(params, query.filter, config.filterStyle);\n }\n\n // Sort\n if (query.sort && config.sortParam) {\n const direction = query.sort.direction;\n if (config.sortParam === 'ordering') {\n // Django-style: -field for desc, field for asc\n params.set(config.sortParam, direction === 'desc' ? `-${query.sort.field}` : query.sort.field);\n } else if (config.sortFormat === 'field:direction') {\n params.set(config.sortParam, `${query.sort.field}:${direction}`);\n } else {\n // Default: field,direction\n params.set(config.sortParam, `${query.sort.field},${direction}`);\n }\n }\n\n // Pagination\n if (query.page !== undefined) {\n const pageOffset = config.pageOffset ?? 0;\n params.set(config.pageParam, String(query.page + pageOffset));\n }\n if (query.size !== undefined) {\n params.set(config.sizeParam, String(query.size));\n }\n\n return params;\n}\n\nfunction serializeFilters(\n params: URLSearchParams,\n filter: Record<string, any>,\n style: PresetQueryConfig['filterStyle'],\n): void {\n for (const [key, value] of Object.entries(filter)) {\n if (value === undefined) continue;\n const serialized = typeof value === 'object' && !Array.isArray(value)\n ? JSON.stringify(value)\n : String(value);\n\n switch (style) {\n case 'django':\n // Passthrough: price__gte=100\n params.set(key, serialized);\n break;\n\n case 'dot':\n // Replace __ with .: price.gte=100\n params.set(key.replace(/__/g, '.'), serialized);\n break;\n\n case 'bracket': {\n // Wrap in filter[]: filter[price_gte]=100\n const bracketKey = key.replace(/__/g, '_');\n params.set(`filter[${bracketKey}]`, serialized);\n break;\n }\n\n case 'nestjs': {\n // Nested dot + $ prefix: filter.price.$gte=100\n const parts = key.split('__');\n if (parts.length === 2) {\n params.set(`filter.${parts[0]}.$${parts[1]}`, serialized);\n } else {\n params.set(`filter.${key}`, serialized);\n }\n break;\n }\n }\n }\n}\n","import type { ApiResponse, HttpDriverConfig, PagedResponse, QueryParams } from '../types';\nimport type { Driver } from './types';\nimport type { Preset } from '../presets/types';\nimport { getPreset } from '../presets/index';\nimport { serializeQuery } from './query-serializer';\nimport {\n FauxbaseError,\n ForbiddenError,\n HttpError,\n NetworkError,\n NotFoundError,\n ConflictError,\n TimeoutError,\n ValidationError,\n} from '../errors';\n\ntype AuthProvider = () => { token: string } | null;\n\ninterface HttpDriverOptions extends HttpDriverConfig {\n timeout?: number;\n retry?: { maxRetries?: number; baseDelay?: number };\n headers?: Record<string, string>;\n}\n\nexport class HttpDriver implements Driver {\n private baseUrl: string;\n private preset: Preset;\n private timeout: number;\n private maxRetries: number;\n private baseDelay: number;\n private defaultHeaders: Record<string, string>;\n private endpoints = new Map<string, string>();\n private authProvider: AuthProvider | null = null;\n\n constructor(config: HttpDriverOptions) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.preset = typeof config.preset === 'string'\n ? getPreset(config.preset ?? 'default')\n : (config.preset as any) ?? getPreset('default');\n this.timeout = config.timeout ?? 30000;\n this.maxRetries = config.retry?.maxRetries ?? 3;\n this.baseDelay = config.retry?.baseDelay ?? 300;\n this.defaultHeaders = config.headers ?? {};\n }\n\n setAuthProvider(provider: AuthProvider): void {\n this.authProvider = provider;\n }\n\n registerEndpoint(resource: string, endpoint: string): void {\n this.endpoints.set(resource, endpoint);\n }\n\n private getEndpoint(resource: string): string {\n return this.endpoints.get(resource) ?? `/${resource}`;\n }\n\n private buildUrl(resource: string, id?: string): string {\n const endpoint = this.getEndpoint(resource);\n const base = `${this.baseUrl}${endpoint}`;\n return id ? `${base}/${id}` : base;\n }\n\n private buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders,\n };\n\n const auth = this.authProvider?.();\n if (auth?.token) {\n headers['Authorization'] = this.preset.auth.headerFormat.replace('{token}', auth.token);\n }\n\n return headers;\n }\n\n private async request<T>(\n url: string,\n options: RequestInit = {},\n retryCount = 0,\n ): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n headers: { ...this.buildHeaders(), ...(options.headers as Record<string, string> ?? {}) },\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n if (!response.ok) {\n // Retry 5xx errors\n if (response.status >= 500 && retryCount < this.maxRetries) {\n const delay = this.baseDelay * Math.pow(2, retryCount);\n await new Promise(r => setTimeout(r, delay));\n return this.request<T>(url, options, retryCount + 1);\n }\n\n const body = await response.json().catch(() => ({}));\n this.throwMappedError(response.status, body);\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return {} as T;\n }\n\n return response.json();\n } catch (err: any) {\n clearTimeout(timer);\n\n if (err instanceof FauxbaseError) throw err;\n\n if (err.name === 'AbortError') {\n throw new TimeoutError(`Request timed out after ${this.timeout}ms`);\n }\n\n throw new NetworkError(err.message ?? 'Network request failed');\n }\n }\n\n private throwMappedError(status: number, body: any): never {\n const parsed = this.preset.response.error(body);\n\n switch (true) {\n case status === 400 || status === 422:\n throw new ValidationError(parsed.error, parsed.details);\n case status === 401 || status === 403:\n throw new ForbiddenError(parsed.error);\n case status === 404:\n throw new NotFoundError(parsed.error);\n case status === 409:\n throw new ConflictError(parsed.error);\n default:\n throw new HttpError(parsed.error, status, parsed.details);\n }\n }\n\n async list<T>(resource: string, query: QueryParams): Promise<PagedResponse<T>> {\n const url = this.buildUrl(resource);\n const params = serializeQuery(query, this.preset.query);\n const queryString = params.toString();\n const fullUrl = queryString ? `${url}?${queryString}` : url;\n\n const raw = await this.request<any>(fullUrl);\n const parsed = this.preset.response.list(raw);\n\n return {\n items: parsed.items as T[],\n meta: {\n page: parsed.meta[this.preset.meta.page] ?? parsed.meta.page ?? query.page ?? 1,\n size: parsed.meta[this.preset.meta.size] ?? parsed.meta.size ?? query.size ?? 20,\n totalItems: parsed.meta[this.preset.meta.totalItems] ?? parsed.meta.totalItems ?? 0,\n totalPages: parsed.meta[this.preset.meta.totalPages] ?? parsed.meta.totalPages ?? 0,\n },\n };\n }\n\n async get<T>(resource: string, id: string): Promise<ApiResponse<T>> {\n const url = this.buildUrl(resource, id);\n const raw = await this.request<any>(url);\n return this.preset.response.single(raw) as ApiResponse<T>;\n }\n\n async create<T>(resource: string, data: Partial<T>): Promise<ApiResponse<T>> {\n const url = this.buildUrl(resource);\n const raw = await this.request<any>(url, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n return this.preset.response.single(raw) as ApiResponse<T>;\n }\n\n async update<T>(resource: string, id: string, data: Partial<T>): Promise<ApiResponse<T>> {\n const url = this.buildUrl(resource, id);\n const raw = await this.request<any>(url, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n return this.preset.response.single(raw) as ApiResponse<T>;\n }\n\n async delete<T>(resource: string, id: string): Promise<ApiResponse<T>> {\n const url = this.buildUrl(resource, id);\n const raw = await this.request<any>(url, {\n method: 'DELETE',\n });\n return this.preset.response.single(raw) as ApiResponse<T>;\n }\n\n async count(resource: string, filter?: Record<string, any>): Promise<number> {\n const url = `${this.buildUrl(resource)}/count`;\n const params = filter\n ? serializeQuery({ filter }, this.preset.query)\n : new URLSearchParams();\n const queryString = params.toString();\n const fullUrl = queryString ? `${url}?${queryString}` : url;\n\n const raw = await this.request<any>(fullUrl);\n return raw.count ?? raw.data?.count ?? 0;\n }\n\n async bulkCreate<T>(resource: string, data: Array<Partial<T>>): Promise<ApiResponse<T[]>> {\n const url = `${this.buildUrl(resource)}/bulk`;\n const raw = await this.request<any>(url, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n const parsed = this.preset.response.single(raw);\n return { data: Array.isArray(parsed.data) ? parsed.data : [parsed.data] };\n }\n\n async bulkUpdate<T>(resource: string, updates: Array<{ id: string; data: Partial<T> }>): Promise<ApiResponse<T[]>> {\n const url = `${this.buildUrl(resource)}/bulk`;\n const raw = await this.request<any>(url, {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n const parsed = this.preset.response.single(raw);\n return { data: Array.isArray(parsed.data) ? parsed.data : [parsed.data] };\n }\n\n async bulkDelete(resource: string, ids: string[]): Promise<ApiResponse<{ count: number }>> {\n const url = `${this.buildUrl(resource)}/bulk`;\n const raw = await this.request<any>(url, {\n method: 'DELETE',\n body: JSON.stringify({ ids }),\n });\n return { data: { count: raw.count ?? raw.data?.count ?? ids.length } };\n }\n\n // Seed methods are no-ops for HTTP — backend owns data\n seed(): void { /* no-op */ }\n getSeedVersion(): string | null { return null; }\n setSeedVersion(): void { /* no-op */ }\n clear(): void { /* no-op */ }\n}\n","import type { FauxbaseEvent, EventHandler } from './types';\n\nexport class EventBus {\n private listeners = new Map<string, Set<EventHandler>>();\n private anyListeners = new Set<EventHandler>();\n\n on(resource: string, handler: EventHandler): () => void {\n if (!this.listeners.has(resource)) {\n this.listeners.set(resource, new Set());\n }\n this.listeners.get(resource)!.add(handler);\n return () => {\n this.listeners.get(resource)?.delete(handler);\n };\n }\n\n onAny(handler: EventHandler): () => void {\n this.anyListeners.add(handler);\n return () => {\n this.anyListeners.delete(handler);\n };\n }\n\n emit(event: FauxbaseEvent): void {\n const resourceListeners = this.listeners.get(event.resource);\n if (resourceListeners) {\n for (const handler of resourceListeners) {\n handler(event);\n }\n }\n for (const handler of this.anyListeners) {\n handler(event);\n }\n }\n\n destroy(): void {\n this.listeners.clear();\n this.anyListeners.clear();\n }\n}\n","import type { EventSourceAdapter, SSEConfig, FauxbaseEvent, EventAction } from './types';\nimport type { EventBus } from './event-bus';\n\nexport class SSESource implements EventSourceAdapter {\n private eventSource: EventSource | null = null;\n\n constructor(\n private config: SSEConfig,\n private eventBus: EventBus,\n ) {}\n\n connect(): void {\n this.eventSource = new EventSource(this.config.url, {\n withCredentials: this.config.withCredentials,\n });\n\n for (const [eventType, resource] of Object.entries(this.config.eventMap)) {\n this.eventSource.addEventListener(eventType, (e: MessageEvent) => {\n const parsed = this.parseEvent(e, resource);\n if (parsed) {\n this.eventBus.emit(parsed);\n }\n });\n }\n }\n\n disconnect(): void {\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n }\n\n private parseEvent(e: MessageEvent, resource: string): FauxbaseEvent | null {\n try {\n const raw = JSON.parse(e.data);\n return {\n action: raw.action as EventAction,\n resource,\n data: raw.data,\n id: raw.id,\n ids: raw.ids,\n timestamp: raw.timestamp ?? Date.now(),\n source: 'remote',\n };\n } catch {\n return null;\n }\n }\n}\n","import type { EventSourceAdapter, STOMPConfig, FauxbaseEvent, EventAction } from './types';\nimport type { EventBus } from './event-bus';\n\nexport class STOMPSource implements EventSourceAdapter {\n private client: any = null;\n\n constructor(\n private config: STOMPConfig,\n private eventBus: EventBus,\n ) {}\n\n connect(): void {\n this.connectAsync();\n }\n\n private async connectAsync(): Promise<void> {\n let StompJs: any;\n try {\n // Dynamic import — @stomp/stompjs is a peer dependency\n const moduleName = '@stomp/stompjs';\n StompJs = await (Function('m', 'return import(m)')(moduleName));\n } catch {\n throw new Error(\n 'STOMP source requires @stomp/stompjs. Install it: npm install @stomp/stompjs',\n );\n }\n\n this.client = new StompJs.Client({\n brokerURL: this.config.brokerUrl,\n connectHeaders: this.config.connectHeaders,\n onConnect: () => {\n for (const [destination, resource] of Object.entries(this.config.subscriptions)) {\n this.client.subscribe(destination, (message: any) => {\n const parsed = this.parseMessage(message, resource);\n if (parsed) {\n this.eventBus.emit(parsed);\n }\n });\n }\n },\n });\n\n this.client.activate();\n }\n\n disconnect(): void {\n if (this.client) {\n this.client.deactivate();\n this.client = null;\n }\n }\n\n private parseMessage(message: any, resource: string): FauxbaseEvent | null {\n try {\n const raw = JSON.parse(message.body);\n return {\n action: raw.action as EventAction,\n resource,\n data: raw.data,\n id: raw.id,\n ids: raw.ids,\n timestamp: raw.timestamp ?? Date.now(),\n source: 'remote',\n };\n } catch {\n return null;\n }\n }\n}\n","import type { SeedDefinition } from './types';\n\nexport function seed<T>(entityClass: new (...args: any[]) => T, data: Array<Partial<T>>): SeedDefinition<T> {\n const entityName = entityClass.name.toLowerCase();\n return { entityName, entityClass, data };\n}\n\nexport function computeSeedVersion(seeds: SeedDefinition[]): string {\n const content = JSON.stringify(\n seeds.map(s => ({ entity: s.entityName, data: s.data })),\n );\n return simpleHash(content);\n}\n\nfunction simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(36);\n}\n","import type { DriverConfig, HttpDriverConfig, SeedDefinition } from './types';\nimport type { Driver } from './drivers/types';\nimport type { AuthState } from './auth';\nimport type { EventsConfig, EventSourceAdapter } from './events/types';\nimport { LocalDriver } from './drivers/local';\nimport { HttpDriver } from './drivers/http';\nimport { Service } from './service';\nimport { AuthService } from './auth';\nimport { EventBus } from './events/event-bus';\nimport { SSESource } from './events/sse-source';\nimport { STOMPSource } from './events/stomp-source';\nimport { computeSeedVersion } from './seed';\n\n// --- Type inference ---\n\ntype ClientServices<S extends Record<string, new (...args: any[]) => Service<any>>> = {\n [K in keyof S]: InstanceType<S[K]>;\n};\n\ntype ClientResult<\n S extends Record<string, new (...args: any[]) => Service<any>>,\n A extends (new (...args: any[]) => AuthService<any>) | undefined,\n> = ClientServices<S>\n & (A extends new (...args: any[]) => AuthService<any> ? { auth: InstanceType<A> } : {})\n & { readonly ready: Promise<void> }\n & { _eventBus?: EventBus; disconnect?: () => void };\n\n// --- Factory ---\n\nexport function createClient<\n S extends Record<string, new (...args: any[]) => Service<any>>,\n A extends (new (...args: any[]) => AuthService<any>) | undefined = undefined,\n>(\n config: {\n driver?: DriverConfig;\n services: S;\n seeds?: SeedDefinition[];\n auth?: A;\n overrides?: Record<string, { driver: DriverConfig }>;\n events?: EventsConfig;\n },\n): ClientResult<S, A> {\n const driverConfig = config.driver ?? { type: 'local' as const };\n const defaultDriver = createDriver(driverConfig);\n\n const client = {} as any;\n const overrideDrivers = new Map<string, Driver>();\n\n // Create override drivers\n if (config.overrides) {\n for (const [name, override] of Object.entries(config.overrides)) {\n overrideDrivers.set(name, createDriver(override.driver));\n }\n }\n\n // Register all services\n for (const [name, ServiceClass] of Object.entries(config.services)) {\n const instance = new ServiceClass();\n const driver = overrideDrivers.get(name) ?? defaultDriver;\n instance._init(driver, name);\n\n if (driver instanceof LocalDriver) {\n driver.registerEntity(name, instance.entity);\n }\n\n if (driver instanceof HttpDriver) {\n driver.registerEndpoint(name, instance.endpoint);\n }\n\n client[name] = instance;\n }\n\n // Wire auth if provided\n if (config.auth) {\n const AuthClass = config.auth;\n const authInstance = new AuthClass();\n const resourceName = authInstance.entity.name.toLowerCase();\n\n if (defaultDriver instanceof LocalDriver) {\n authInstance._init(defaultDriver, resourceName);\n defaultDriver.registerEntity(resourceName, authInstance.entity);\n\n const storage = defaultDriver.getStorageBackend();\n authInstance._initAuth(\n () => {\n const raw = storage.getMeta('_authState');\n return raw ? JSON.parse(raw) as AuthState : null;\n },\n (state: AuthState | null) => {\n if (state) {\n storage.setMeta('_authState', JSON.stringify(state));\n } else {\n storage.setMeta('_authState', '');\n }\n },\n );\n\n defaultDriver.setAuthProvider(() => authInstance.getAuthContext());\n } else if (defaultDriver instanceof HttpDriver) {\n authInstance._init(defaultDriver, resourceName);\n defaultDriver.registerEndpoint(resourceName, authInstance.endpoint);\n\n // In-memory auth state for HTTP mode\n let memoryAuthState: AuthState | null = null;\n authInstance._initAuth(\n () => memoryAuthState,\n (state: AuthState | null) => { memoryAuthState = state; },\n );\n authInstance._setHttpMode(defaultDriver);\n\n defaultDriver.setAuthProvider(() => {\n const token = authInstance.token;\n return token ? { token } : null;\n });\n }\n\n client.auth = authInstance;\n\n // Also set auth provider on override HttpDrivers\n for (const driver of overrideDrivers.values()) {\n if (driver instanceof HttpDriver) {\n driver.setAuthProvider(() => {\n const token = (client.auth as AuthService<any>)?.token;\n return token ? { token } : null;\n });\n }\n }\n }\n\n // Set client reference on all services (including auth)\n for (const key of Object.keys(client)) {\n const svc = client[key];\n if (svc && typeof svc._setClient === 'function') {\n svc._setClient(client);\n }\n }\n\n // Wire EventBus if events are configured\n let eventSource: EventSourceAdapter | null = null;\n if (config.events) {\n const eventBus = new EventBus();\n client._eventBus = eventBus;\n\n // Attach EventBus to all services\n for (const [name, ServiceClass] of Object.entries(config.services)) {\n const svc = client[name] as Service<any>;\n svc._eventBus = eventBus;\n }\n\n const eventsConfig = config.events === true ? {} : config.events;\n\n // Register custom handlers\n if (eventsConfig.handlers) {\n for (const [resource, handler] of Object.entries(eventsConfig.handlers)) {\n eventBus.on(resource, handler);\n }\n }\n\n // Connect event source (SSE or STOMP)\n if (eventsConfig.source) {\n if (eventsConfig.source.type === 'sse') {\n eventSource = new SSESource(eventsConfig.source, eventBus);\n } else if (eventsConfig.source.type === 'stomp') {\n eventSource = new STOMPSource(eventsConfig.source, eventBus);\n }\n eventSource?.connect();\n }\n\n client.disconnect = () => {\n eventSource?.disconnect();\n eventBus.destroy();\n };\n }\n\n // Apply seeds (only for local driver)\n let readyPromise: Promise<void>;\n if (defaultDriver instanceof LocalDriver) {\n if (defaultDriver.isReady) {\n // Synchronous backend (memory, localStorage) — apply seeds now\n if (config.seeds) {\n applySeedsIfNeeded(defaultDriver, config.seeds);\n }\n readyPromise = Promise.resolve();\n } else {\n // Async backend (IndexedDB) — defer seeds until ready\n readyPromise = defaultDriver.ready.then(() => {\n if (config.seeds) {\n applySeedsIfNeeded(defaultDriver, config.seeds);\n }\n });\n }\n } else {\n readyPromise = Promise.resolve();\n }\n Object.defineProperty(client, 'ready', {\n value: readyPromise,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n\n return client as ClientResult<S, A>;\n}\n\nfunction createDriver(config: DriverConfig): Driver {\n switch (config.type) {\n case 'local':\n return new LocalDriver(config);\n case 'http':\n return new HttpDriver(config);\n default:\n throw new Error(`Unknown driver type: ${(config as any).type}`);\n }\n}\n\nfunction applySeedsIfNeeded(driver: LocalDriver, seeds: SeedDefinition[]): void {\n const newVersion = computeSeedVersion(seeds);\n const currentVersion = driver.getSeedVersion();\n\n if (currentVersion === newVersion) return;\n\n for (const seedDef of seeds) {\n driver.seed(seedDef.entityName, seedDef.data as any[], seedDef.entityClass);\n }\n\n driver.setSeedVersion(newVersion);\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/registry.ts","../src/entity.ts","../src/service.ts","../src/auth.ts","../src/query-engine.ts","../src/drivers/local.ts","../src/presets/types.ts","../src/presets/default.ts","../src/presets/spring-boot.ts","../src/presets/laravel.ts","../src/presets/django.ts","../src/presets/nestjs.ts","../src/presets/express.ts","../src/presets/index.ts","../src/drivers/query-serializer.ts","../src/drivers/http.ts","../src/events/event-bus.ts","../src/events/sse-source.ts","../src/events/stomp-source.ts","../src/seed.ts","../src/client.ts"],"names":["body","field"],"mappings":"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","file":"index.js","sourcesContent":["import type { FauxbaseErrorPayload } from './types';\n\nexport class FauxbaseError extends Error {\n public readonly code: string;\n public readonly details?: Record<string, string>;\n\n constructor(message: string, code: string, details?: Record<string, string>) {\n super(message);\n this.name = 'FauxbaseError';\n this.code = code;\n this.details = details;\n }\n\n toJSON(): FauxbaseErrorPayload {\n return { error: this.message, code: this.code, details: this.details };\n }\n}\n\nexport class NotFoundError extends FauxbaseError {\n constructor(message = 'Resource not found') {\n super(message, 'NOT_FOUND');\n this.name = 'NotFoundError';\n }\n}\n\nexport class ConflictError extends FauxbaseError {\n constructor(message = 'Resource conflict') {\n super(message, 'CONFLICT');\n this.name = 'ConflictError';\n }\n}\n\nexport class ValidationError extends FauxbaseError {\n constructor(message = 'Validation failed', details?: Record<string, string>) {\n super(message, 'VALIDATION', details);\n this.name = 'ValidationError';\n }\n}\n\nexport class ForbiddenError extends FauxbaseError {\n constructor(message = 'Access forbidden') {\n super(message, 'FORBIDDEN');\n this.name = 'ForbiddenError';\n }\n}\n\nexport class NetworkError extends FauxbaseError {\n constructor(message = 'Network request failed') {\n super(message, 'NETWORK');\n this.name = 'NetworkError';\n }\n}\n\nexport class TimeoutError extends FauxbaseError {\n constructor(message = 'Request timed out') {\n super(message, 'TIMEOUT');\n this.name = 'TimeoutError';\n }\n}\n\nexport class HttpError extends FauxbaseError {\n public readonly status: number;\n\n constructor(message: string, status: number, details?: Record<string, string>) {\n super(message, 'HTTP', details);\n this.name = 'HttpError';\n this.status = status;\n }\n\n toJSON() {\n return { ...super.toJSON(), status: this.status };\n }\n}\n","import type { FieldOptions, HookType } from './types';\n\n// Field metadata: Map<Constructor, Map<fieldName, FieldOptions>>\nconst fieldRegistry = new Map<Function, Map<string, FieldOptions>>();\n\n// Relation metadata: Map<Constructor, Map<fieldName, targetEntityName>>\nconst relationRegistry = new Map<Function, Map<string, string>>();\n\n// Computed metadata: Map<Constructor, Map<fieldName, computeFn>>\nconst computedRegistry = new Map<Function, Map<string, (entity: any) => any>>();\n\n// Hook metadata: Map<Constructor, Map<HookType, methodName[]>>\nconst hookRegistry = new Map<Function, Map<HookType, string[]>>();\n\n// --- Register ---\n\nexport function registerField(target: Function, propertyKey: string, options: FieldOptions): void {\n if (!fieldRegistry.has(target)) fieldRegistry.set(target, new Map());\n fieldRegistry.get(target)!.set(propertyKey, options);\n}\n\nexport function registerRelation(target: Function, propertyKey: string, entityName: string): void {\n if (!relationRegistry.has(target)) relationRegistry.set(target, new Map());\n relationRegistry.get(target)!.set(propertyKey, entityName);\n}\n\nexport function registerComputed(target: Function, propertyKey: string, fn: (entity: any) => any): void {\n if (!computedRegistry.has(target)) computedRegistry.set(target, new Map());\n computedRegistry.get(target)!.set(propertyKey, fn);\n}\n\nexport function registerHook(target: Function, hookType: HookType, methodName: string): void {\n if (!hookRegistry.has(target)) hookRegistry.set(target, new Map());\n const hooks = hookRegistry.get(target)!;\n if (!hooks.has(hookType)) hooks.set(hookType, []);\n hooks.get(hookType)!.push(methodName);\n}\n\n// --- Read ---\n\nexport function getFieldMeta(target: Function): Map<string, FieldOptions> {\n return fieldRegistry.get(target) ?? new Map();\n}\n\nexport function getRelationMeta(target: Function): Map<string, string> {\n return relationRegistry.get(target) ?? new Map();\n}\n\nexport function getComputedMeta(target: Function): Map<string, (entity: any) => any> {\n return computedRegistry.get(target) ?? new Map();\n}\n\nexport function getHooks(target: Function, hookType: HookType): string[] {\n return hookRegistry.get(target)?.get(hookType) ?? [];\n}\n","import type { FieldOptions } from './types';\nimport { ValidationError } from './errors';\nimport { registerField, registerRelation, registerComputed, getFieldMeta, getComputedMeta } from './registry';\n\n// --- Entity base class (schema definition, not instantiated for data) ---\n\nexport abstract class Entity {\n declare id: string;\n declare createdAt: string;\n declare updatedAt: string;\n declare createdById?: string;\n declare createdByName?: string;\n declare updatedById?: string;\n declare updatedByName?: string;\n declare deletedAt?: string | null;\n declare deletedById?: string;\n declare deletedByName?: string;\n declare version: number;\n}\n\n// --- Decorators ---\n\nexport function field(options: FieldOptions = {}): PropertyDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n registerField(target.constructor, propertyKey as string, options);\n };\n}\n\nexport function relation(entityName: string): PropertyDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n registerRelation(target.constructor, propertyKey as string, entityName);\n };\n}\n\nexport function computed(fn: (entity: any) => any): PropertyDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n registerComputed(target.constructor, propertyKey as string, fn);\n };\n}\n\n// --- Utility functions ---\n\nexport function applyDefaults(data: Record<string, any>, entityClass: Function): Record<string, any> {\n const fieldMeta = getFieldMeta(entityClass);\n const result = { ...data };\n\n for (const [fieldName, options] of fieldMeta) {\n if (result[fieldName] === undefined && options.default !== undefined) {\n result[fieldName] = typeof options.default === 'function' ? options.default() : options.default;\n }\n }\n\n return result;\n}\n\nexport function validateEntity(data: Record<string, any>, entityClass: Function, isCreate: boolean): void {\n const fieldMeta = getFieldMeta(entityClass);\n const errors: Record<string, string> = {};\n\n for (const [fieldName, options] of fieldMeta) {\n const value = data[fieldName];\n\n if (isCreate && options.required && (value === undefined || value === null || value === '')) {\n errors[fieldName] = `${fieldName} is required`;\n }\n\n if (value !== undefined && value !== null) {\n if (options.min !== undefined && typeof value === 'number' && value < options.min) {\n errors[fieldName] = `${fieldName} must be >= ${options.min}`;\n }\n if (options.max !== undefined && typeof value === 'number' && value > options.max) {\n errors[fieldName] = `${fieldName} must be <= ${options.max}`;\n }\n }\n }\n\n if (Object.keys(errors).length > 0) {\n throw new ValidationError('Validation failed', errors);\n }\n}\n\nexport function applyComputedFields<T>(data: Record<string, any>, entityClass: Function): T {\n const computedMeta = getComputedMeta(entityClass);\n if (computedMeta.size === 0) return data as T;\n\n const result = { ...data };\n for (const [key, fn] of computedMeta) {\n Object.defineProperty(result, key, {\n get: () => fn(result),\n enumerable: true,\n configurable: true,\n });\n }\n return result as T;\n}\n","import type { ApiResponse, HookType, PagedResponse, QueryParams } from './types';\nimport type { Driver } from './drivers/types';\nimport type { Entity } from './entity';\nimport type { EventBus } from './events/event-bus';\nimport { registerHook, getHooks } from './registry';\n\n// --- Hook decorators ---\n\nexport function beforeCreate(): MethodDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n registerHook(target.constructor, 'beforeCreate', propertyKey as string);\n };\n}\n\nexport function beforeUpdate(): MethodDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n registerHook(target.constructor, 'beforeUpdate', propertyKey as string);\n };\n}\n\nexport function afterCreate(): MethodDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n registerHook(target.constructor, 'afterCreate', propertyKey as string);\n };\n}\n\nexport function afterUpdate(): MethodDecorator {\n return (target: Object, propertyKey: string | symbol) => {\n registerHook(target.constructor, 'afterUpdate', propertyKey as string);\n };\n}\n\n// --- Service base class ---\n\nexport abstract class Service<T extends Entity> {\n abstract entity: new (...args: any[]) => T;\n abstract endpoint: string;\n\n protected driver!: Driver;\n protected resourceName!: string;\n protected client: any;\n\n /** @internal */\n _eventBus?: EventBus;\n\n /** @internal — called by createClient to wire the service */\n _init(driver: Driver, resourceName: string): void {\n this.driver = driver;\n this.resourceName = resourceName;\n }\n\n /** @internal — called by createClient to give services access to the client */\n _setClient(client: any): void {\n this.client = client;\n }\n\n async list(query: QueryParams = {}): Promise<PagedResponse<T>> {\n return this.driver.list<T>(this.resourceName, query);\n }\n\n async get(id: string): Promise<ApiResponse<T>> {\n return this.driver.get<T>(this.resourceName, id);\n }\n\n async create(data: Partial<T>): Promise<ApiResponse<T>> {\n const allItems = (await this.driver.list<T>(this.resourceName, {})).items;\n await this.runHooks('beforeCreate', data, allItems);\n const result = await this.driver.create<T>(this.resourceName, data);\n await this.runHooks('afterCreate', result.data);\n this.emitEvent('created', { data: result.data, id: (result.data as any).id });\n return result;\n }\n\n async update(id: string, data: Partial<T>): Promise<ApiResponse<T>> {\n await this.runHooks('beforeUpdate', id, data);\n const result = await this.driver.update<T>(this.resourceName, id, data);\n await this.runHooks('afterUpdate', result.data);\n this.emitEvent('updated', { data: result.data, id });\n return result;\n }\n\n async delete(id: string): Promise<ApiResponse<T>> {\n const result = await this.driver.delete<T>(this.resourceName, id);\n this.emitEvent('deleted', { data: result.data, id });\n return result;\n }\n\n async count(filter?: Record<string, any>): Promise<number> {\n return this.driver.count(this.resourceName, filter);\n }\n\n get bulk() {\n const self = this;\n return {\n async create(items: Array<Partial<T>>) {\n const result = await self.driver.bulkCreate<T>(self.resourceName, items);\n self.emitEvent('bulkCreated', { data: result.data });\n return result;\n },\n async update(updates: Array<{ id: string; data: Partial<T> }>) {\n const result = await self.driver.bulkUpdate<T>(self.resourceName, updates);\n self.emitEvent('bulkUpdated', { data: result.data, ids: updates.map(u => u.id) });\n return result;\n },\n async delete(ids: string[]) {\n const result = await self.driver.bulkDelete(self.resourceName, ids);\n self.emitEvent('bulkDeleted', { ids });\n return result;\n },\n };\n }\n\n private emitEvent(action: import('./events/types').EventAction, extra: { data?: any; id?: string; ids?: string[] }): void {\n if (!this._eventBus) return;\n this._eventBus.emit({\n action,\n resource: this.resourceName,\n data: extra.data,\n id: extra.id,\n ids: extra.ids,\n timestamp: Date.now(),\n source: 'local',\n });\n }\n\n private async runHooks(hookType: HookType, ...args: any[]): Promise<void> {\n const methods = getHooks(this.constructor, hookType);\n for (const methodName of methods) {\n await (this as any)[methodName](...args);\n }\n }\n}\n","import { Service } from './service';\nimport { Entity } from './entity';\nimport { ConflictError, NotFoundError, ForbiddenError } from './errors';\nimport type { HttpDriver } from './drivers/http';\nimport type { Preset } from './presets/types';\n\n// --- Types ---\n\nexport interface LoginCredentials {\n email: string;\n password: string;\n}\n\nexport interface AuthState {\n userId: string;\n email: string;\n userName?: string;\n role?: string;\n token: string;\n}\n\nexport interface AuthContext {\n userId: string;\n userName?: string;\n}\n\n// --- AuthService ---\n\nexport abstract class AuthService<T extends Entity> extends Service<T> {\n private authState: AuthState | null = null;\n private saveState: ((state: AuthState | null) => void) | null = null;\n private httpDriver: HttpDriver | null = null;\n private authChangeListeners: Array<() => void> = [];\n\n /** @internal — called by createClient to wire persistence */\n _initAuth(\n loadState: () => AuthState | null,\n saveState: (state: AuthState | null) => void,\n ): void {\n this.saveState = saveState;\n this.authState = loadState();\n }\n\n /** @internal — called by createClient when using HttpDriver */\n _setHttpMode(driver: HttpDriver): void {\n this.httpDriver = driver;\n }\n\n async login(credentials: LoginCredentials): Promise<T> {\n if (this.httpDriver) {\n return this.httpLogin(credentials);\n }\n return this.localLogin(credentials);\n }\n\n async register(data: Partial<T>): Promise<T> {\n if (this.httpDriver) {\n return this.httpRegister(data);\n }\n return this.localRegister(data);\n }\n\n logout(): void {\n this.authState = null;\n this.persistState();\n }\n\n get currentUser(): T | null {\n // Return a shallow proxy — not the full entity, but enough for display\n return this.authState ? ({ id: this.authState.userId, email: this.authState.email } as unknown as T) : null;\n }\n\n get isLoggedIn(): boolean {\n return this.authState !== null;\n }\n\n get token(): string | null {\n return this.authState?.token ?? null;\n }\n\n hasRole(role: string): boolean {\n return this.authState?.role === role;\n }\n\n getAuthContext(): AuthContext | null {\n if (!this.authState) return null;\n return {\n userId: this.authState.userId,\n userName: this.authState.userName,\n };\n }\n\n // --- Local mode (original implementation) ---\n\n private async localLogin(credentials: LoginCredentials): Promise<T> {\n const { items } = await this.list({ filter: { email: credentials.email } });\n if (items.length === 0) {\n throw new NotFoundError('Invalid email or password');\n }\n\n const user = items[0] as any;\n if (user.password !== credentials.password) {\n throw new ForbiddenError('Invalid email or password');\n }\n\n this.authState = {\n userId: user.id,\n email: user.email,\n userName: user.name || user.email,\n role: user.role,\n token: this.generateToken(user),\n };\n this.persistState();\n return user;\n }\n\n private async localRegister(data: Partial<T>): Promise<T> {\n const email = (data as any).email;\n if (email) {\n const { items } = await this.list({ filter: { email } });\n if (items.length > 0) {\n throw new ConflictError('Email already registered');\n }\n }\n\n const { data: user } = await this.create(data);\n const u = user as any;\n\n this.authState = {\n userId: u.id,\n email: u.email,\n userName: u.name || u.email,\n role: u.role,\n token: this.generateToken(u),\n };\n this.persistState();\n return user;\n }\n\n // --- HTTP mode ---\n\n private async httpLogin(credentials: LoginCredentials): Promise<T> {\n const preset = (this.httpDriver as any).preset as Preset;\n const baseUrl = (this.httpDriver as any).baseUrl as string;\n const url = `${baseUrl}${preset.auth.loginUrl}`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(credentials),\n });\n\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n if (response.status === 401 || response.status === 403) {\n throw new ForbiddenError(body.message ?? 'Invalid email or password');\n }\n if (response.status === 404) {\n throw new NotFoundError(body.message ?? 'Invalid email or password');\n }\n throw new ForbiddenError(body.message ?? 'Login failed');\n }\n\n const body = await response.json();\n const token = body[preset.auth.tokenField];\n const user = body[preset.auth.userField] ?? body;\n\n this.authState = {\n userId: user.id,\n email: user.email ?? credentials.email,\n userName: user.name || user.email || credentials.email,\n role: user.role,\n token,\n };\n this.persistState();\n return user as T;\n }\n\n private async httpRegister(data: Partial<T>): Promise<T> {\n const preset = (this.httpDriver as any).preset as Preset;\n const baseUrl = (this.httpDriver as any).baseUrl as string;\n const url = `${baseUrl}${preset.auth.registerUrl}`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n if (response.status === 409) {\n throw new ConflictError(body.message ?? 'Email already registered');\n }\n throw new ForbiddenError(body.message ?? 'Registration failed');\n }\n\n const body = await response.json();\n const token = body[preset.auth.tokenField];\n const user = body[preset.auth.userField] ?? body;\n\n this.authState = {\n userId: user.id,\n email: user.email ?? (data as any).email,\n userName: user.name || user.email || (data as any).email,\n role: user.role,\n token,\n };\n this.persistState();\n return user as T;\n }\n\n private generateToken(user: any): string {\n return btoa(JSON.stringify({\n userId: user.id,\n email: user.email,\n role: user.role,\n iat: Date.now(),\n exp: Date.now() + 24 * 60 * 60 * 1000,\n }));\n }\n\n /** @internal — called by createClient to listen for auth state changes */\n _onAuthChange(listener: () => void): void {\n this.authChangeListeners.push(listener);\n }\n\n private persistState(): void {\n if (this.saveState) {\n this.saveState(this.authState);\n }\n for (const listener of this.authChangeListeners) {\n listener();\n }\n }\n}\n","import type { FilterOperator, PageMeta, PagedResponse, QueryParams, SortParams } from './types';\n\n// --- Parse filter key ---\n\nconst OPERATORS: FilterOperator[] = [\n 'startswith', 'endswith', 'contains', 'between', 'isnull',\n 'like', 'gte', 'lte', 'gt', 'lt', 'ne', 'in', 'eq',\n];\n\nexport function parseFilterKey(key: string): { field: string; operator: FilterOperator } {\n for (const op of OPERATORS) {\n const suffix = `__${op}`;\n if (key.endsWith(suffix)) {\n return { field: key.slice(0, -suffix.length), operator: op };\n }\n }\n return { field: key, operator: 'eq' };\n}\n\n// --- Match single operator ---\n\nexport function matchOperator(itemValue: any, operator: FilterOperator, filterValue: any): boolean {\n if (operator === 'isnull') {\n return filterValue\n ? (itemValue === null || itemValue === undefined)\n : (itemValue !== null && itemValue !== undefined);\n }\n\n if (itemValue === null || itemValue === undefined) return false;\n\n switch (operator) {\n case 'eq': return itemValue === filterValue;\n case 'ne': return itemValue !== filterValue;\n case 'gt': return itemValue > filterValue;\n case 'gte': return itemValue >= filterValue;\n case 'lt': return itemValue < filterValue;\n case 'lte': return itemValue <= filterValue;\n case 'like':\n case 'contains': return String(itemValue).toLowerCase().includes(String(filterValue).toLowerCase());\n case 'startswith': return String(itemValue).toLowerCase().startsWith(String(filterValue).toLowerCase());\n case 'endswith': return String(itemValue).toLowerCase().endsWith(String(filterValue).toLowerCase());\n case 'between': return Array.isArray(filterValue) && itemValue >= filterValue[0] && itemValue <= filterValue[1];\n case 'in': return Array.isArray(filterValue) && filterValue.includes(itemValue);\n default: return false;\n }\n}\n\n// --- Apply filters ---\n\nexport function applyFilters<T extends Record<string, any>>(items: T[], filter: Record<string, any>): T[] {\n return items.filter(item => {\n for (const [key, value] of Object.entries(filter)) {\n const { field, operator } = parseFilterKey(key);\n if (!matchOperator(item[field], operator, value)) return false;\n }\n return true;\n });\n}\n\n// --- Sort ---\n\nexport function applySort<T extends Record<string, any>>(items: T[], sort?: SortParams): T[] {\n if (!sort) return items;\n return [...items].sort((a, b) => {\n const aVal = a[sort.field];\n const bVal = b[sort.field];\n if (aVal === bVal) return 0;\n if (aVal === null || aVal === undefined) return 1;\n if (bVal === null || bVal === undefined) return -1;\n const cmp = aVal < bVal ? -1 : 1;\n return sort.direction === 'desc' ? -cmp : cmp;\n });\n}\n\n// --- Paginate ---\n\nexport function applyPagination<T>(items: T[], page = 1, size = 20): { items: T[]; meta: PageMeta } {\n const totalItems = items.length;\n const totalPages = size > 0 ? Math.ceil(totalItems / size) : 0;\n const start = (page - 1) * size;\n const paged = items.slice(start, start + size);\n return {\n items: paged,\n meta: { page, size, totalItems, totalPages },\n };\n}\n\n// --- Composite: filter → sort → paginate ---\n\nexport function executeQuery<T extends Record<string, any>>(\n items: T[],\n query: QueryParams,\n): PagedResponse<T> {\n let result = items;\n\n // Exclude soft-deleted records\n result = result.filter(item => !item.deletedAt);\n\n if (query.filter) {\n result = applyFilters(result, query.filter);\n }\n\n result = applySort(result, query.sort);\n return applyPagination(result, query.page, query.size);\n}\n","import type { ApiResponse, LocalDriverConfig, PagedResponse, QueryParams } from '../types';\nimport type { Driver } from './types';\nimport { executeQuery, applyFilters } from '../query-engine';\nimport { applyComputedFields, applyDefaults, validateEntity } from '../entity';\nimport { NotFoundError } from '../errors';\n\n// --- UUID generation ---\n\nfunction generateUUID(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n// --- Storage backend interface ---\n\ninterface StorageBackend {\n getAll(resource: string): Record<string, any>[];\n getById(resource: string, id: string): Record<string, any> | undefined;\n set(resource: string, id: string, data: Record<string, any>): void;\n remove(resource: string, id: string): void;\n clear(resource: string): void;\n getMeta(key: string): string | null;\n setMeta(key: string, value: string): void;\n}\n\n// --- Memory storage ---\n\nclass MemoryStorage implements StorageBackend {\n private data = new Map<string, Map<string, Record<string, any>>>();\n private meta = new Map<string, string>();\n\n getAll(resource: string): Record<string, any>[] {\n const store = this.data.get(resource);\n return store ? Array.from(store.values()) : [];\n }\n\n getById(resource: string, id: string): Record<string, any> | undefined {\n return this.data.get(resource)?.get(id);\n }\n\n set(resource: string, id: string, data: Record<string, any>): void {\n if (!this.data.has(resource)) this.data.set(resource, new Map());\n this.data.get(resource)!.set(id, data);\n }\n\n remove(resource: string, id: string): void {\n this.data.get(resource)?.delete(id);\n }\n\n clear(resource: string): void {\n this.data.delete(resource);\n }\n\n getMeta(key: string): string | null {\n return this.meta.get(key) ?? null;\n }\n\n setMeta(key: string, value: string): void {\n this.meta.set(key, value);\n }\n}\n\n// --- localStorage storage ---\n\nconst LS_PREFIX = 'fauxbase:';\nconst LS_INDEX_PREFIX = `${LS_PREFIX}__index:`;\nconst LS_META_PREFIX = `${LS_PREFIX}__meta:`;\n\nclass LocalStorageBackend implements StorageBackend {\n private getIndex(resource: string): string[] {\n const raw = localStorage.getItem(`${LS_INDEX_PREFIX}${resource}`);\n return raw ? JSON.parse(raw) : [];\n }\n\n private setIndex(resource: string, ids: string[]): void {\n localStorage.setItem(`${LS_INDEX_PREFIX}${resource}`, JSON.stringify(ids));\n }\n\n getAll(resource: string): Record<string, any>[] {\n const ids = this.getIndex(resource);\n const items: Record<string, any>[] = [];\n for (const id of ids) {\n const raw = localStorage.getItem(`${LS_PREFIX}${resource}:${id}`);\n if (raw) items.push(JSON.parse(raw));\n }\n return items;\n }\n\n getById(resource: string, id: string): Record<string, any> | undefined {\n const raw = localStorage.getItem(`${LS_PREFIX}${resource}:${id}`);\n return raw ? JSON.parse(raw) : undefined;\n }\n\n set(resource: string, id: string, data: Record<string, any>): void {\n localStorage.setItem(`${LS_PREFIX}${resource}:${id}`, JSON.stringify(data));\n const ids = this.getIndex(resource);\n if (!ids.includes(id)) {\n ids.push(id);\n this.setIndex(resource, ids);\n }\n }\n\n remove(resource: string, id: string): void {\n localStorage.removeItem(`${LS_PREFIX}${resource}:${id}`);\n const ids = this.getIndex(resource);\n this.setIndex(resource, ids.filter(i => i !== id));\n }\n\n clear(resource: string): void {\n const ids = this.getIndex(resource);\n for (const id of ids) {\n localStorage.removeItem(`${LS_PREFIX}${resource}:${id}`);\n }\n localStorage.removeItem(`${LS_INDEX_PREFIX}${resource}`);\n }\n\n getMeta(key: string): string | null {\n return localStorage.getItem(`${LS_META_PREFIX}${key}`);\n }\n\n setMeta(key: string, value: string): void {\n localStorage.setItem(`${LS_META_PREFIX}${key}`, value);\n }\n}\n\n// --- IndexedDB storage (memory-cached, write-through) ---\n\nfunction idbRequest<T>(req: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n\nconst IDB_DATA_STORE = 'data';\nconst IDB_META_STORE = 'meta';\n\nclass IndexedDBBackend implements StorageBackend {\n private cache = new MemoryStorage();\n private db: IDBDatabase | null = null;\n private _ready: Promise<void>;\n\n constructor(dbName: string) {\n this._ready = this.open(dbName);\n }\n\n get ready(): Promise<void> {\n return this._ready;\n }\n\n private open(dbName: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(dbName, 1);\n req.onupgradeneeded = () => {\n const db = req.result;\n if (!db.objectStoreNames.contains(IDB_DATA_STORE)) {\n db.createObjectStore(IDB_DATA_STORE);\n }\n if (!db.objectStoreNames.contains(IDB_META_STORE)) {\n db.createObjectStore(IDB_META_STORE);\n }\n };\n req.onsuccess = async () => {\n this.db = req.result;\n await this.loadAll();\n resolve();\n };\n req.onerror = () => reject(req.error);\n });\n }\n\n private async loadAll(): Promise<void> {\n const db = this.db!;\n const tx = db.transaction([IDB_DATA_STORE, IDB_META_STORE], 'readonly');\n const dataStore = tx.objectStore(IDB_DATA_STORE);\n const metaStore = tx.objectStore(IDB_META_STORE);\n\n // Load all data keys\n const dataKeys = await idbRequest(dataStore.getAllKeys());\n const dataValues = await idbRequest(dataStore.getAll());\n for (let i = 0; i < dataKeys.length; i++) {\n const compositeKey = dataKeys[i] as string;\n const sepIdx = compositeKey.indexOf(':');\n const resource = compositeKey.substring(0, sepIdx);\n const id = compositeKey.substring(sepIdx + 1);\n this.cache.set(resource, id, dataValues[i]);\n }\n\n // Load all meta keys\n const metaKeys = await idbRequest(metaStore.getAllKeys());\n const metaValues = await idbRequest(metaStore.getAll());\n for (let i = 0; i < metaKeys.length; i++) {\n this.cache.setMeta(metaKeys[i] as string, metaValues[i]);\n }\n }\n\n private writeData(resource: string, id: string, data: Record<string, any>): void {\n if (!this.db) return;\n const tx = this.db.transaction(IDB_DATA_STORE, 'readwrite');\n tx.objectStore(IDB_DATA_STORE).put(data, `${resource}:${id}`);\n }\n\n private deleteData(resource: string, id: string): void {\n if (!this.db) return;\n const tx = this.db.transaction(IDB_DATA_STORE, 'readwrite');\n tx.objectStore(IDB_DATA_STORE).delete(`${resource}:${id}`);\n }\n\n private writeMeta(key: string, value: string): void {\n if (!this.db) return;\n const tx = this.db.transaction(IDB_META_STORE, 'readwrite');\n tx.objectStore(IDB_META_STORE).put(value, key);\n }\n\n getAll(resource: string): Record<string, any>[] {\n return this.cache.getAll(resource);\n }\n\n getById(resource: string, id: string): Record<string, any> | undefined {\n return this.cache.getById(resource, id);\n }\n\n set(resource: string, id: string, data: Record<string, any>): void {\n this.cache.set(resource, id, data);\n this.writeData(resource, id, data);\n }\n\n remove(resource: string, id: string): void {\n this.cache.remove(resource, id);\n this.deleteData(resource, id);\n }\n\n clear(resource: string): void {\n const items = this.cache.getAll(resource);\n this.cache.clear(resource);\n if (this.db) {\n const tx = this.db.transaction(IDB_DATA_STORE, 'readwrite');\n const store = tx.objectStore(IDB_DATA_STORE);\n for (const item of items) {\n store.delete(`${resource}:${item.id}`);\n }\n }\n }\n\n getMeta(key: string): string | null {\n return this.cache.getMeta(key);\n }\n\n setMeta(key: string, value: string): void {\n this.cache.setMeta(key, value);\n this.writeMeta(key, value);\n }\n}\n\n// --- Auth provider type ---\n\ntype AuthProvider = () => { userId: string; userName?: string } | null;\n\n// --- LocalDriver ---\n\nexport class LocalDriver implements Driver {\n private storage: StorageBackend;\n private entityClasses = new Map<string, Function>();\n private authProvider: AuthProvider | null = null;\n private _ready: Promise<void>;\n private _isReady: boolean;\n\n constructor(config: LocalDriverConfig) {\n if (config.persist === 'indexeddb') {\n const backend = new IndexedDBBackend(config.dbName ?? 'fauxbase');\n this.storage = backend;\n this._isReady = false;\n this._ready = backend.ready.then(() => { this._isReady = true; });\n } else {\n this.storage = config.persist === 'localStorage'\n ? new LocalStorageBackend()\n : new MemoryStorage();\n this._isReady = true;\n this._ready = Promise.resolve();\n }\n }\n\n get ready(): Promise<void> {\n return this._ready;\n }\n\n get isReady(): boolean {\n return this._isReady;\n }\n\n setAuthProvider(provider: AuthProvider): void {\n this.authProvider = provider;\n }\n\n getStorageBackend(): StorageBackend {\n return this.storage;\n }\n\n registerEntity(resource: string, entityClass: Function): void {\n this.entityClasses.set(resource, entityClass);\n }\n\n async list<T>(resource: string, query: QueryParams): Promise<PagedResponse<T>> {\n const items = this.storage.getAll(resource);\n const entityClass = this.entityClasses.get(resource);\n const processed = entityClass\n ? items.map(item => applyComputedFields<T>(item, entityClass))\n : items;\n return executeQuery(processed as Record<string, any>[], query) as PagedResponse<T>;\n }\n\n async get<T>(resource: string, id: string): Promise<ApiResponse<T>> {\n const item = this.storage.getById(resource, id);\n if (!item || item.deletedAt) {\n throw new NotFoundError(`${resource} with id \"${id}\" not found`);\n }\n const entityClass = this.entityClasses.get(resource);\n const data = entityClass ? applyComputedFields<T>(item, entityClass) : item as T;\n return { data };\n }\n\n async create<T>(resource: string, data: Partial<T>): Promise<ApiResponse<T>> {\n const entityClass = this.entityClasses.get(resource);\n const now = new Date().toISOString();\n\n const authContext = this.authProvider?.();\n\n let record: Record<string, any> = {\n ...data,\n id: (data as any).id || generateUUID(),\n createdAt: now,\n updatedAt: now,\n deletedAt: null,\n version: 1,\n ...(authContext ? {\n createdById: authContext.userId,\n createdByName: authContext.userName,\n updatedById: authContext.userId,\n updatedByName: authContext.userName,\n } : {}),\n };\n\n if (entityClass) {\n record = applyDefaults(record, entityClass);\n validateEntity(record, entityClass, true);\n }\n\n this.storage.set(resource, record.id, record);\n\n const result = entityClass\n ? applyComputedFields<T>(record, entityClass)\n : record as T;\n return { data: result };\n }\n\n async update<T>(resource: string, id: string, data: Partial<T>): Promise<ApiResponse<T>> {\n const existing = this.storage.getById(resource, id);\n if (!existing || existing.deletedAt) {\n throw new NotFoundError(`${resource} with id \"${id}\" not found`);\n }\n\n const entityClass = this.entityClasses.get(resource);\n if (entityClass) {\n validateEntity(data as Record<string, any>, entityClass, false);\n }\n\n const authContext = this.authProvider?.();\n\n const record: Record<string, any> = {\n ...existing,\n ...data,\n id,\n createdAt: existing.createdAt,\n updatedAt: new Date().toISOString(),\n version: (existing.version || 0) + 1,\n ...(authContext ? {\n updatedById: authContext.userId,\n updatedByName: authContext.userName,\n } : {}),\n };\n\n this.storage.set(resource, id, record);\n\n const result = entityClass\n ? applyComputedFields<T>(record, entityClass)\n : record as T;\n return { data: result };\n }\n\n async delete<T>(resource: string, id: string): Promise<ApiResponse<T>> {\n const existing = this.storage.getById(resource, id);\n if (!existing || existing.deletedAt) {\n throw new NotFoundError(`${resource} with id \"${id}\" not found`);\n }\n\n const now = new Date().toISOString();\n const authContext = this.authProvider?.();\n\n const record = {\n ...existing,\n deletedAt: now,\n updatedAt: now,\n version: (existing.version || 0) + 1,\n ...(authContext ? {\n deletedById: authContext.userId,\n deletedByName: authContext.userName,\n updatedById: authContext.userId,\n updatedByName: authContext.userName,\n } : {}),\n };\n\n this.storage.set(resource, id, record);\n return { data: record as T };\n }\n\n async count(resource: string, filter?: Record<string, any>): Promise<number> {\n let items = this.storage.getAll(resource).filter(item => !item.deletedAt);\n if (filter) {\n items = applyFilters(items, filter);\n }\n return items.length;\n }\n\n async bulkCreate<T>(resource: string, data: Array<Partial<T>>): Promise<ApiResponse<T[]>> {\n const results: T[] = [];\n for (const item of data) {\n const { data: created } = await this.create<T>(resource, item);\n results.push(created);\n }\n return { data: results };\n }\n\n async bulkUpdate<T>(resource: string, updates: Array<{ id: string; data: Partial<T> }>): Promise<ApiResponse<T[]>> {\n const results: T[] = [];\n for (const { id, data } of updates) {\n const { data: updated } = await this.update<T>(resource, id, data);\n results.push(updated);\n }\n return { data: results };\n }\n\n async bulkDelete(resource: string, ids: string[]): Promise<ApiResponse<{ count: number }>> {\n let count = 0;\n for (const id of ids) {\n await this.delete(resource, id);\n count++;\n }\n return { data: { count } };\n }\n\n // --- Seed management (synchronous) ---\n\n seed(resource: string, data: Array<Record<string, any>>, entityClass: Function): void {\n for (let i = 0; i < data.length; i++) {\n const seedId = `seed:${resource}:${i}`;\n const now = new Date().toISOString();\n const record = applyDefaults({\n ...data[i],\n id: seedId,\n createdAt: now,\n updatedAt: now,\n deletedAt: null,\n version: 1,\n }, entityClass);\n this.storage.set(resource, seedId, record);\n }\n }\n\n getSeedVersion(): string | null {\n return this.storage.getMeta('_seedVersion');\n }\n\n setSeedVersion(version: string): void {\n this.storage.setMeta('_seedVersion', version);\n }\n\n clear(resource: string): void {\n this.storage.clear(resource);\n }\n}\n","export type FilterStyle = 'django' | 'dot' | 'bracket' | 'nestjs';\n\nexport interface Preset {\n name: string;\n response: {\n single: (raw: any) => { data: any };\n list: (raw: any) => { items: any[]; meta: Record<string, any> };\n error: (raw: any) => { error: string; code: string; details?: Record<string, string> };\n };\n meta: { page: string; size: string; totalItems: string; totalPages: string };\n query: {\n filterStyle: FilterStyle;\n pageParam: string;\n sizeParam: string;\n sortParam?: string;\n sortFormat: string; // 'field,direction' | 'field:direction'\n pageOffset?: number; // 0 = 1-indexed (default), -1 = 0-indexed\n };\n auth: {\n loginUrl: string;\n registerUrl: string;\n logoutUrl?: string;\n tokenField: string;\n userField: string;\n headerFormat: string; // 'Bearer {token}'\n };\n}\n\nexport function definePreset(config: Preset): Preset {\n return config;\n}\n","import { definePreset } from './types';\n\nexport const defaultPreset = definePreset({\n name: 'default',\n response: {\n single: (raw) => ({ data: raw.data ?? raw }),\n list: (raw) => ({\n items: raw.items ?? raw.data ?? [],\n meta: raw.meta ?? {},\n }),\n error: (raw) => ({\n error: raw.error ?? raw.message ?? 'Unknown error',\n code: raw.code ?? 'UNKNOWN',\n details: raw.details,\n }),\n },\n meta: { page: 'page', size: 'size', totalItems: 'totalItems', totalPages: 'totalPages' },\n query: {\n filterStyle: 'django',\n pageParam: 'page',\n sizeParam: 'size',\n sortParam: 'sort',\n sortFormat: 'field,direction',\n },\n auth: {\n loginUrl: '/auth/login',\n registerUrl: '/auth/register',\n logoutUrl: '/auth/logout',\n tokenField: 'token',\n userField: 'user',\n headerFormat: 'Bearer {token}',\n },\n});\n","import { definePreset } from './types';\n\nexport const springBootPreset = definePreset({\n name: 'spring-boot',\n response: {\n single: (raw) => ({ data: raw }),\n list: (raw) => ({\n items: raw.content ?? [],\n meta: {\n page: (raw.pageable?.pageNumber ?? 0) + 1,\n size: raw.pageable?.pageSize ?? raw.size ?? 20,\n totalItems: raw.totalElements ?? 0,\n totalPages: raw.totalPages ?? 0,\n },\n }),\n error: (raw) => ({\n error: raw.message ?? raw.error ?? 'Unknown error',\n code: raw.status?.toString() ?? 'UNKNOWN',\n details: raw.errors?.reduce?.((acc: Record<string, string>, e: any) => {\n acc[e.field ?? e.code ?? 'unknown'] = e.defaultMessage ?? e.message ?? '';\n return acc;\n }, {}) ?? undefined,\n }),\n },\n meta: { page: 'page', size: 'size', totalItems: 'totalElements', totalPages: 'totalPages' },\n query: {\n filterStyle: 'dot',\n pageParam: 'page',\n sizeParam: 'size',\n sortParam: 'sort',\n sortFormat: 'field,direction',\n pageOffset: -1, // 0-indexed\n },\n auth: {\n loginUrl: '/api/auth/login',\n registerUrl: '/api/auth/register',\n tokenField: 'token',\n userField: 'user',\n headerFormat: 'Bearer {token}',\n },\n});\n","import { definePreset } from './types';\n\nexport const laravelPreset = definePreset({\n name: 'laravel',\n response: {\n single: (raw) => ({ data: raw.data ?? raw }),\n list: (raw) => ({\n items: raw.data ?? [],\n meta: {\n page: raw.meta?.current_page ?? raw.current_page ?? 1,\n size: raw.meta?.per_page ?? raw.per_page ?? 15,\n totalItems: raw.meta?.total ?? raw.total ?? 0,\n totalPages: raw.meta?.last_page ?? raw.last_page ?? 0,\n },\n }),\n error: (raw) => ({\n error: raw.message ?? 'Unknown error',\n code: raw.status?.toString() ?? 'UNKNOWN',\n details: raw.errors\n ? Object.entries(raw.errors).reduce((acc: Record<string, string>, [key, val]: [string, any]) => {\n acc[key] = Array.isArray(val) ? val[0] : val;\n return acc;\n }, {})\n : undefined,\n }),\n },\n meta: { page: 'current_page', size: 'per_page', totalItems: 'total', totalPages: 'last_page' },\n query: {\n filterStyle: 'bracket',\n pageParam: 'page',\n sizeParam: 'per_page',\n sortParam: 'sort',\n sortFormat: 'field,direction',\n },\n auth: {\n loginUrl: '/api/login',\n registerUrl: '/api/register',\n logoutUrl: '/api/logout',\n tokenField: 'token',\n userField: 'user',\n headerFormat: 'Bearer {token}',\n },\n});\n","import { definePreset } from './types';\n\nexport const djangoPreset = definePreset({\n name: 'django',\n response: {\n single: (raw) => ({ data: raw }),\n list: (raw) => ({\n items: raw.results ?? [],\n meta: {\n page: 1, // Django REST doesn't always include page number\n size: raw.results?.length ?? 0,\n totalItems: raw.count ?? 0,\n totalPages: raw.count && raw.results?.length\n ? Math.ceil(raw.count / raw.results.length)\n : 0,\n },\n }),\n error: (raw) => ({\n error: raw.detail ?? raw.message ?? 'Unknown error',\n code: raw.status_code?.toString() ?? 'UNKNOWN',\n details: typeof raw === 'object' && !raw.detail\n ? Object.entries(raw).reduce((acc: Record<string, string>, [key, val]: [string, any]) => {\n if (key !== 'status_code') {\n acc[key] = Array.isArray(val) ? val[0] : String(val);\n }\n return acc;\n }, {})\n : undefined,\n }),\n },\n meta: { page: 'page', size: 'page_size', totalItems: 'count', totalPages: 'total_pages' },\n query: {\n filterStyle: 'django',\n pageParam: 'page',\n sizeParam: 'page_size',\n sortParam: 'ordering',\n sortFormat: 'field,direction',\n },\n auth: {\n loginUrl: '/api/auth/login/',\n registerUrl: '/api/auth/register/',\n logoutUrl: '/api/auth/logout/',\n tokenField: 'token',\n userField: 'user',\n headerFormat: 'Token {token}',\n },\n});\n","import { definePreset } from './types';\n\nexport const nestjsPreset = definePreset({\n name: 'nestjs',\n response: {\n single: (raw) => ({ data: raw.data ?? raw }),\n list: (raw) => ({\n items: raw.data ?? raw.items ?? [],\n meta: raw.meta ?? {},\n }),\n error: (raw) => ({\n error: raw.message ?? 'Unknown error',\n code: raw.error ?? raw.statusCode?.toString() ?? 'UNKNOWN',\n details: raw.message && Array.isArray(raw.message)\n ? raw.message.reduce((acc: Record<string, string>, msg: string, i: number) => {\n acc[`field_${i}`] = msg;\n return acc;\n }, {})\n : undefined,\n }),\n },\n meta: { page: 'page', size: 'limit', totalItems: 'totalItems', totalPages: 'totalPages' },\n query: {\n filterStyle: 'nestjs',\n pageParam: 'page',\n sizeParam: 'limit',\n sortParam: 'sort',\n sortFormat: 'field:direction',\n },\n auth: {\n loginUrl: '/auth/login',\n registerUrl: '/auth/register',\n tokenField: 'access_token',\n userField: 'user',\n headerFormat: 'Bearer {token}',\n },\n});\n","import { definePreset } from './types';\n\nexport const expressPreset = definePreset({\n name: 'express',\n response: {\n single: (raw) => ({ data: raw.data ?? raw }),\n list: (raw) => ({\n items: raw.data ?? raw.items ?? [],\n meta: raw.meta ?? {},\n }),\n error: (raw) => ({\n error: raw.error ?? raw.message ?? 'Unknown error',\n code: raw.code ?? 'UNKNOWN',\n details: raw.details,\n }),\n },\n meta: { page: 'page', size: 'size', totalItems: 'totalItems', totalPages: 'totalPages' },\n query: {\n filterStyle: 'django',\n pageParam: 'page',\n sizeParam: 'size',\n sortParam: 'sort',\n sortFormat: 'field,direction',\n },\n auth: {\n loginUrl: '/api/auth/login',\n registerUrl: '/api/auth/register',\n logoutUrl: '/api/auth/logout',\n tokenField: 'token',\n userField: 'user',\n headerFormat: 'Bearer {token}',\n },\n});\n","import type { Preset } from './types';\nimport { defaultPreset } from './default';\nimport { springBootPreset } from './spring-boot';\nimport { laravelPreset } from './laravel';\nimport { djangoPreset } from './django';\nimport { nestjsPreset } from './nestjs';\nimport { expressPreset } from './express';\n\nexport type { Preset, FilterStyle } from './types';\nexport { definePreset } from './types';\n\nconst presetRegistry = new Map<string, Preset>([\n ['default', defaultPreset],\n ['spring-boot', springBootPreset],\n ['laravel', laravelPreset],\n ['django', djangoPreset],\n ['nestjs', nestjsPreset],\n ['express', expressPreset],\n]);\n\nexport function getPreset(name: string): Preset {\n const preset = presetRegistry.get(name);\n if (!preset) {\n throw new Error(`Unknown preset: \"${name}\". Available: ${Array.from(presetRegistry.keys()).join(', ')}`);\n }\n return preset;\n}\n\nexport { defaultPreset, springBootPreset, laravelPreset, djangoPreset, nestjsPreset, expressPreset };\n","import type { QueryParams } from '../types';\nimport type { Preset } from '../presets/types';\n\ntype PresetQueryConfig = Preset['query'];\n\nexport function serializeQuery(query: QueryParams, config: PresetQueryConfig): URLSearchParams {\n const params = new URLSearchParams();\n\n // Filters\n if (query.filter) {\n serializeFilters(params, query.filter, config.filterStyle);\n }\n\n // Sort\n if (query.sort && config.sortParam) {\n const direction = query.sort.direction;\n if (config.sortParam === 'ordering') {\n // Django-style: -field for desc, field for asc\n params.set(config.sortParam, direction === 'desc' ? `-${query.sort.field}` : query.sort.field);\n } else if (config.sortFormat === 'field:direction') {\n params.set(config.sortParam, `${query.sort.field}:${direction}`);\n } else {\n // Default: field,direction\n params.set(config.sortParam, `${query.sort.field},${direction}`);\n }\n }\n\n // Pagination\n if (query.page !== undefined) {\n const pageOffset = config.pageOffset ?? 0;\n params.set(config.pageParam, String(query.page + pageOffset));\n }\n if (query.size !== undefined) {\n params.set(config.sizeParam, String(query.size));\n }\n\n return params;\n}\n\nfunction serializeFilters(\n params: URLSearchParams,\n filter: Record<string, any>,\n style: PresetQueryConfig['filterStyle'],\n): void {\n for (const [key, value] of Object.entries(filter)) {\n if (value === undefined) continue;\n const serialized = typeof value === 'object' && !Array.isArray(value)\n ? JSON.stringify(value)\n : String(value);\n\n switch (style) {\n case 'django':\n // Passthrough: price__gte=100\n params.set(key, serialized);\n break;\n\n case 'dot':\n // Replace __ with .: price.gte=100\n params.set(key.replace(/__/g, '.'), serialized);\n break;\n\n case 'bracket': {\n // Wrap in filter[]: filter[price_gte]=100\n const bracketKey = key.replace(/__/g, '_');\n params.set(`filter[${bracketKey}]`, serialized);\n break;\n }\n\n case 'nestjs': {\n // Nested dot + $ prefix: filter.price.$gte=100\n const parts = key.split('__');\n if (parts.length === 2) {\n params.set(`filter.${parts[0]}.$${parts[1]}`, serialized);\n } else {\n params.set(`filter.${key}`, serialized);\n }\n break;\n }\n }\n }\n}\n","import type { ApiResponse, HttpDriverConfig, PagedResponse, QueryParams } from '../types';\nimport type { Driver } from './types';\nimport type { Preset } from '../presets/types';\nimport { getPreset } from '../presets/index';\nimport { serializeQuery } from './query-serializer';\nimport {\n FauxbaseError,\n ForbiddenError,\n HttpError,\n NetworkError,\n NotFoundError,\n ConflictError,\n TimeoutError,\n ValidationError,\n} from '../errors';\n\ntype AuthProvider = () => { token: string } | null;\n\ninterface HttpDriverOptions extends HttpDriverConfig {\n timeout?: number;\n retry?: { maxRetries?: number; baseDelay?: number };\n headers?: Record<string, string>;\n}\n\nexport class HttpDriver implements Driver {\n private baseUrl: string;\n private preset: Preset;\n private timeout: number;\n private maxRetries: number;\n private baseDelay: number;\n private defaultHeaders: Record<string, string>;\n private endpoints = new Map<string, string>();\n private authProvider: AuthProvider | null = null;\n\n constructor(config: HttpDriverOptions) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.preset = typeof config.preset === 'string'\n ? getPreset(config.preset ?? 'default')\n : (config.preset as any) ?? getPreset('default');\n this.timeout = config.timeout ?? 30000;\n this.maxRetries = config.retry?.maxRetries ?? 3;\n this.baseDelay = config.retry?.baseDelay ?? 300;\n this.defaultHeaders = config.headers ?? {};\n }\n\n setAuthProvider(provider: AuthProvider): void {\n this.authProvider = provider;\n }\n\n registerEndpoint(resource: string, endpoint: string): void {\n this.endpoints.set(resource, endpoint);\n }\n\n private getEndpoint(resource: string): string {\n return this.endpoints.get(resource) ?? `/${resource}`;\n }\n\n private buildUrl(resource: string, id?: string): string {\n const endpoint = this.getEndpoint(resource);\n const base = `${this.baseUrl}${endpoint}`;\n return id ? `${base}/${id}` : base;\n }\n\n private buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders,\n };\n\n const auth = this.authProvider?.();\n if (auth?.token) {\n headers['Authorization'] = this.preset.auth.headerFormat.replace('{token}', auth.token);\n }\n\n return headers;\n }\n\n private async request<T>(\n url: string,\n options: RequestInit = {},\n retryCount = 0,\n ): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n headers: { ...this.buildHeaders(), ...(options.headers as Record<string, string> ?? {}) },\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n if (!response.ok) {\n // Retry 5xx errors\n if (response.status >= 500 && retryCount < this.maxRetries) {\n const delay = this.baseDelay * Math.pow(2, retryCount);\n await new Promise(r => setTimeout(r, delay));\n return this.request<T>(url, options, retryCount + 1);\n }\n\n const body = await response.json().catch(() => ({}));\n this.throwMappedError(response.status, body);\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return {} as T;\n }\n\n return response.json();\n } catch (err: any) {\n clearTimeout(timer);\n\n if (err instanceof FauxbaseError) throw err;\n\n if (err.name === 'AbortError') {\n throw new TimeoutError(`Request timed out after ${this.timeout}ms`);\n }\n\n throw new NetworkError(err.message ?? 'Network request failed');\n }\n }\n\n private throwMappedError(status: number, body: any): never {\n const parsed = this.preset.response.error(body);\n\n switch (true) {\n case status === 400 || status === 422:\n throw new ValidationError(parsed.error, parsed.details);\n case status === 401 || status === 403:\n throw new ForbiddenError(parsed.error);\n case status === 404:\n throw new NotFoundError(parsed.error);\n case status === 409:\n throw new ConflictError(parsed.error);\n default:\n throw new HttpError(parsed.error, status, parsed.details);\n }\n }\n\n async list<T>(resource: string, query: QueryParams): Promise<PagedResponse<T>> {\n const url = this.buildUrl(resource);\n const params = serializeQuery(query, this.preset.query);\n const queryString = params.toString();\n const fullUrl = queryString ? `${url}?${queryString}` : url;\n\n const raw = await this.request<any>(fullUrl);\n const parsed = this.preset.response.list(raw);\n\n return {\n items: parsed.items as T[],\n meta: {\n page: parsed.meta[this.preset.meta.page] ?? parsed.meta.page ?? query.page ?? 1,\n size: parsed.meta[this.preset.meta.size] ?? parsed.meta.size ?? query.size ?? 20,\n totalItems: parsed.meta[this.preset.meta.totalItems] ?? parsed.meta.totalItems ?? 0,\n totalPages: parsed.meta[this.preset.meta.totalPages] ?? parsed.meta.totalPages ?? 0,\n },\n };\n }\n\n async get<T>(resource: string, id: string): Promise<ApiResponse<T>> {\n const url = this.buildUrl(resource, id);\n const raw = await this.request<any>(url);\n return this.preset.response.single(raw) as ApiResponse<T>;\n }\n\n async create<T>(resource: string, data: Partial<T>): Promise<ApiResponse<T>> {\n const url = this.buildUrl(resource);\n const raw = await this.request<any>(url, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n return this.preset.response.single(raw) as ApiResponse<T>;\n }\n\n async update<T>(resource: string, id: string, data: Partial<T>): Promise<ApiResponse<T>> {\n const url = this.buildUrl(resource, id);\n const raw = await this.request<any>(url, {\n method: 'PATCH',\n body: JSON.stringify(data),\n });\n return this.preset.response.single(raw) as ApiResponse<T>;\n }\n\n async delete<T>(resource: string, id: string): Promise<ApiResponse<T>> {\n const url = this.buildUrl(resource, id);\n const raw = await this.request<any>(url, {\n method: 'DELETE',\n });\n return this.preset.response.single(raw) as ApiResponse<T>;\n }\n\n async count(resource: string, filter?: Record<string, any>): Promise<number> {\n const url = `${this.buildUrl(resource)}/count`;\n const params = filter\n ? serializeQuery({ filter }, this.preset.query)\n : new URLSearchParams();\n const queryString = params.toString();\n const fullUrl = queryString ? `${url}?${queryString}` : url;\n\n const raw = await this.request<any>(fullUrl);\n return raw.count ?? raw.data?.count ?? 0;\n }\n\n async bulkCreate<T>(resource: string, data: Array<Partial<T>>): Promise<ApiResponse<T[]>> {\n const url = `${this.buildUrl(resource)}/bulk`;\n const raw = await this.request<any>(url, {\n method: 'POST',\n body: JSON.stringify(data),\n });\n const parsed = this.preset.response.single(raw);\n return { data: Array.isArray(parsed.data) ? parsed.data : [parsed.data] };\n }\n\n async bulkUpdate<T>(resource: string, updates: Array<{ id: string; data: Partial<T> }>): Promise<ApiResponse<T[]>> {\n const url = `${this.buildUrl(resource)}/bulk`;\n const raw = await this.request<any>(url, {\n method: 'PATCH',\n body: JSON.stringify(updates),\n });\n const parsed = this.preset.response.single(raw);\n return { data: Array.isArray(parsed.data) ? parsed.data : [parsed.data] };\n }\n\n async bulkDelete(resource: string, ids: string[]): Promise<ApiResponse<{ count: number }>> {\n const url = `${this.buildUrl(resource)}/bulk`;\n const raw = await this.request<any>(url, {\n method: 'DELETE',\n body: JSON.stringify({ ids }),\n });\n return { data: { count: raw.count ?? raw.data?.count ?? ids.length } };\n }\n\n // Seed methods are no-ops for HTTP — backend owns data\n seed(): void { /* no-op */ }\n getSeedVersion(): string | null { return null; }\n setSeedVersion(): void { /* no-op */ }\n clear(): void { /* no-op */ }\n}\n","import type { FauxbaseEvent, EventHandler } from './types';\n\nexport class EventBus {\n private listeners = new Map<string, Set<EventHandler>>();\n private anyListeners = new Set<EventHandler>();\n\n on(resource: string, handler: EventHandler): () => void {\n if (!this.listeners.has(resource)) {\n this.listeners.set(resource, new Set());\n }\n this.listeners.get(resource)!.add(handler);\n return () => {\n this.listeners.get(resource)?.delete(handler);\n };\n }\n\n onAny(handler: EventHandler): () => void {\n this.anyListeners.add(handler);\n return () => {\n this.anyListeners.delete(handler);\n };\n }\n\n emit(event: FauxbaseEvent): void {\n const resourceListeners = this.listeners.get(event.resource);\n if (resourceListeners) {\n for (const handler of resourceListeners) {\n handler(event);\n }\n }\n for (const handler of this.anyListeners) {\n handler(event);\n }\n }\n\n destroy(): void {\n this.listeners.clear();\n this.anyListeners.clear();\n }\n}\n","import type { EventSourceAdapter, SSEConfig, FauxbaseEvent, EventAction } from './types';\nimport type { EventBus } from './event-bus';\n\nexport class SSESource implements EventSourceAdapter {\n private eventSource: EventSource | null = null;\n\n constructor(\n private config: SSEConfig,\n private eventBus: EventBus,\n ) {}\n\n connect(): void {\n this.eventSource = new EventSource(this.config.url, {\n withCredentials: this.config.withCredentials,\n });\n\n for (const [eventType, resource] of Object.entries(this.config.eventMap)) {\n this.eventSource.addEventListener(eventType, (e: MessageEvent) => {\n const parsed = this.parseEvent(e, resource);\n if (parsed) {\n this.eventBus.emit(parsed);\n }\n });\n }\n }\n\n reconnect(): void {\n this.disconnect();\n this.connect();\n }\n\n disconnect(): void {\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = null;\n }\n }\n\n private parseEvent(e: MessageEvent, resource: string): FauxbaseEvent | null {\n try {\n const raw = JSON.parse(e.data);\n return {\n action: raw.action as EventAction,\n resource,\n data: raw.data,\n id: raw.id,\n ids: raw.ids,\n timestamp: raw.timestamp ?? Date.now(),\n source: 'remote',\n };\n } catch {\n return null;\n }\n }\n}\n","import type { EventSourceAdapter, STOMPConfig, FauxbaseEvent, EventAction } from './types';\nimport type { EventBus } from './event-bus';\n\nexport class STOMPSource implements EventSourceAdapter {\n private client: any = null;\n\n constructor(\n private config: STOMPConfig,\n private eventBus: EventBus,\n ) {}\n\n connect(): void {\n this.connectAsync();\n }\n\n reconnect(): void {\n this.disconnect();\n this.connect();\n }\n\n private async connectAsync(): Promise<void> {\n let StompJs: any;\n try {\n const moduleName = '@stomp/stompjs';\n StompJs = await (Function('m', 'return import(m)')(moduleName));\n } catch {\n throw new Error(\n 'STOMP source requires @stomp/stompjs. Install it: npm install @stomp/stompjs',\n );\n }\n\n const headers = { ...this.config.connectHeaders };\n\n // Auto-inject auth token if available\n if (this.config.getAuthToken) {\n const token = this.config.getAuthToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n }\n\n this.client = new StompJs.Client({\n brokerURL: this.config.brokerUrl,\n connectHeaders: headers,\n onConnect: () => {\n for (const [destination, resource] of Object.entries(this.config.subscriptions)) {\n this.client.subscribe(destination, (message: any) => {\n const parsed = this.parseMessage(message, resource);\n if (parsed) {\n this.eventBus.emit(parsed);\n }\n });\n }\n },\n });\n\n this.client.activate();\n }\n\n disconnect(): void {\n if (this.client) {\n this.client.deactivate();\n this.client = null;\n }\n }\n\n private parseMessage(message: any, resource: string): FauxbaseEvent | null {\n try {\n const raw = JSON.parse(message.body);\n return {\n action: raw.action as EventAction,\n resource,\n data: raw.data,\n id: raw.id,\n ids: raw.ids,\n timestamp: raw.timestamp ?? Date.now(),\n source: 'remote',\n };\n } catch {\n return null;\n }\n }\n}\n","import type { SeedDefinition } from './types';\n\nexport function seed<T>(entityClass: new (...args: any[]) => T, data: Array<Partial<T>>): SeedDefinition<T> {\n const entityName = entityClass.name.toLowerCase();\n return { entityName, entityClass, data };\n}\n\nexport function computeSeedVersion(seeds: SeedDefinition[]): string {\n const content = JSON.stringify(\n seeds.map(s => ({ entity: s.entityName, data: s.data })),\n );\n return simpleHash(content);\n}\n\nfunction simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(36);\n}\n","import type { DriverConfig, HttpDriverConfig, SeedDefinition } from './types';\nimport type { Driver } from './drivers/types';\nimport type { AuthState } from './auth';\nimport type { EventsConfig, EventSourceAdapter } from './events/types';\nimport { LocalDriver } from './drivers/local';\nimport { HttpDriver } from './drivers/http';\nimport { Service } from './service';\nimport { AuthService } from './auth';\nimport { EventBus } from './events/event-bus';\nimport { SSESource } from './events/sse-source';\nimport { STOMPSource } from './events/stomp-source';\nimport { computeSeedVersion } from './seed';\n\n// --- Type inference ---\n\ntype ClientServices<S extends Record<string, new (...args: any[]) => Service<any>>> = {\n [K in keyof S]: InstanceType<S[K]>;\n};\n\ntype ClientResult<\n S extends Record<string, new (...args: any[]) => Service<any>>,\n A extends (new (...args: any[]) => AuthService<any>) | undefined,\n> = ClientServices<S>\n & (A extends new (...args: any[]) => AuthService<any> ? { auth: InstanceType<A> } : {})\n & { readonly ready: Promise<void> }\n & { _eventBus?: EventBus; disconnect?: () => void };\n\n// --- Factory ---\n\nexport function createClient<\n S extends Record<string, new (...args: any[]) => Service<any>>,\n A extends (new (...args: any[]) => AuthService<any>) | undefined = undefined,\n>(\n config: {\n driver?: DriverConfig;\n services: S;\n seeds?: SeedDefinition[];\n auth?: A;\n overrides?: Record<string, { driver: DriverConfig }>;\n events?: EventsConfig;\n },\n): ClientResult<S, A> {\n const driverConfig = config.driver ?? { type: 'local' as const };\n const defaultDriver = createDriver(driverConfig);\n\n const client = {} as any;\n const overrideDrivers = new Map<string, Driver>();\n\n // Create override drivers\n if (config.overrides) {\n for (const [name, override] of Object.entries(config.overrides)) {\n overrideDrivers.set(name, createDriver(override.driver));\n }\n }\n\n // Register all services\n for (const [name, ServiceClass] of Object.entries(config.services)) {\n const instance = new ServiceClass();\n const driver = overrideDrivers.get(name) ?? defaultDriver;\n instance._init(driver, name);\n\n if (driver instanceof LocalDriver) {\n driver.registerEntity(name, instance.entity);\n }\n\n if (driver instanceof HttpDriver) {\n driver.registerEndpoint(name, instance.endpoint);\n }\n\n client[name] = instance;\n }\n\n // Wire auth if provided\n if (config.auth) {\n const AuthClass = config.auth;\n const authInstance = new AuthClass();\n const resourceName = authInstance.entity.name.toLowerCase();\n\n if (defaultDriver instanceof LocalDriver) {\n authInstance._init(defaultDriver, resourceName);\n defaultDriver.registerEntity(resourceName, authInstance.entity);\n\n const storage = defaultDriver.getStorageBackend();\n authInstance._initAuth(\n () => {\n const raw = storage.getMeta('_authState');\n return raw ? JSON.parse(raw) as AuthState : null;\n },\n (state: AuthState | null) => {\n if (state) {\n storage.setMeta('_authState', JSON.stringify(state));\n } else {\n storage.setMeta('_authState', '');\n }\n },\n );\n\n defaultDriver.setAuthProvider(() => authInstance.getAuthContext());\n } else if (defaultDriver instanceof HttpDriver) {\n authInstance._init(defaultDriver, resourceName);\n defaultDriver.registerEndpoint(resourceName, authInstance.endpoint);\n\n // In-memory auth state for HTTP mode\n let memoryAuthState: AuthState | null = null;\n authInstance._initAuth(\n () => memoryAuthState,\n (state: AuthState | null) => { memoryAuthState = state; },\n );\n authInstance._setHttpMode(defaultDriver);\n\n defaultDriver.setAuthProvider(() => {\n const token = authInstance.token;\n return token ? { token } : null;\n });\n }\n\n client.auth = authInstance;\n\n // Also set auth provider on override HttpDrivers\n for (const driver of overrideDrivers.values()) {\n if (driver instanceof HttpDriver) {\n driver.setAuthProvider(() => {\n const token = (client.auth as AuthService<any>)?.token;\n return token ? { token } : null;\n });\n }\n }\n }\n\n // Set client reference on all services (including auth)\n for (const key of Object.keys(client)) {\n const svc = client[key];\n if (svc && typeof svc._setClient === 'function') {\n svc._setClient(client);\n }\n }\n\n // Wire EventBus if events are configured\n let eventSource: EventSourceAdapter | null = null;\n if (config.events) {\n const eventBus = new EventBus();\n client._eventBus = eventBus;\n\n // Attach EventBus to all services\n for (const [name, ServiceClass] of Object.entries(config.services)) {\n const svc = client[name] as Service<any>;\n svc._eventBus = eventBus;\n }\n\n const eventsConfig = config.events === true ? {} : config.events;\n\n // Register custom handlers\n if (eventsConfig.handlers) {\n for (const [resource, handler] of Object.entries(eventsConfig.handlers)) {\n eventBus.on(resource, handler);\n }\n }\n\n // Connect event source (SSE or STOMP)\n if (eventsConfig.source) {\n if (eventsConfig.source.type === 'sse') {\n eventSource = new SSESource(eventsConfig.source, eventBus);\n } else if (eventsConfig.source.type === 'stomp') {\n // Auto-inject auth token getter if auth is configured\n const stompConfig = { ...eventsConfig.source };\n if (config.auth && !stompConfig.getAuthToken) {\n stompConfig.getAuthToken = () => (client.auth as AuthService<any>)?.token ?? null;\n }\n eventSource = new STOMPSource(stompConfig, eventBus);\n }\n eventSource?.connect();\n }\n\n // Reconnect event source on auth state change (login/logout)\n if (eventSource && config.auth) {\n (client.auth as AuthService<any>)._onAuthChange(() => {\n eventSource!.reconnect();\n });\n }\n\n client.disconnect = () => {\n eventSource?.disconnect();\n eventBus.destroy();\n };\n }\n\n // Apply seeds (only for local driver)\n let readyPromise: Promise<void>;\n if (defaultDriver instanceof LocalDriver) {\n if (defaultDriver.isReady) {\n // Synchronous backend (memory, localStorage) — apply seeds now\n if (config.seeds) {\n applySeedsIfNeeded(defaultDriver, config.seeds);\n }\n readyPromise = Promise.resolve();\n } else {\n // Async backend (IndexedDB) — defer seeds until ready\n readyPromise = defaultDriver.ready.then(() => {\n if (config.seeds) {\n applySeedsIfNeeded(defaultDriver, config.seeds);\n }\n });\n }\n } else {\n readyPromise = Promise.resolve();\n }\n Object.defineProperty(client, 'ready', {\n value: readyPromise,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n\n return client as ClientResult<S, A>;\n}\n\nfunction createDriver(config: DriverConfig): Driver {\n switch (config.type) {\n case 'local':\n return new LocalDriver(config);\n case 'http':\n return new HttpDriver(config);\n default:\n throw new Error(`Unknown driver type: ${(config as any).type}`);\n }\n}\n\nfunction applySeedsIfNeeded(driver: LocalDriver, seeds: SeedDefinition[]): void {\n const newVersion = computeSeedVersion(seeds);\n const currentVersion = driver.getSeedVersion();\n\n if (currentVersion === newVersion) return;\n\n for (const seedDef of seeds) {\n driver.seed(seedDef.entityName, seedDef.data as any[], seedDef.entityClass);\n }\n\n driver.setSeedVersion(newVersion);\n}\n"]}