fauxbase 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/registry.ts","../src/entity.ts","../src/service.ts","../src/query-engine.ts","../src/drivers/local.ts","../src/seed.ts","../src/client.ts"],"names":["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","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 { 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\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 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 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 return result;\n }\n\n async delete(id: string): Promise<ApiResponse<T>> {\n return this.driver.delete<T>(this.resourceName, id);\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 return {\n create: (items: Array<Partial<T>>) =>\n this.driver.bulkCreate<T>(this.resourceName, items),\n update: (updates: Array<{ id: string; data: Partial<T> }>) =>\n this.driver.bulkUpdate<T>(this.resourceName, updates),\n delete: (ids: string[]) =>\n this.driver.bulkDelete(this.resourceName, ids),\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 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// --- LocalDriver ---\n\nexport class LocalDriver implements Driver {\n private storage: StorageBackend;\n private entityClasses = new Map<string, Function>();\n\n constructor(config: LocalDriverConfig) {\n this.storage = config.persist === 'localStorage'\n ? new LocalStorageBackend()\n : new MemoryStorage();\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 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 };\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 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 };\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 record = {\n ...existing,\n deletedAt: now,\n updatedAt: now,\n version: (existing.version || 0) + 1,\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","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, SeedDefinition } from './types';\nimport type { Driver } from './drivers/types';\nimport { LocalDriver } from './drivers/local';\nimport { Service } from './service';\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\n// --- Factory ---\n\nexport function createClient<S extends Record<string, new (...args: any[]) => Service<any>>>(\n config: {\n driver?: DriverConfig;\n services: S;\n seeds?: SeedDefinition[];\n },\n): ClientServices<S> {\n const driverConfig = config.driver ?? { type: 'local' as const };\n const driver = createDriver(driverConfig);\n\n const client = {} as ClientServices<S>;\n\n for (const [name, ServiceClass] of Object.entries(config.services)) {\n const instance = new ServiceClass();\n instance._init(driver, name);\n\n if (driver instanceof LocalDriver) {\n driver.registerEntity(name, instance.entity);\n }\n\n (client as any)[name] = instance;\n }\n\n if (config.seeds && driver instanceof LocalDriver) {\n applySeedsIfNeeded(driver, config.seeds);\n }\n\n return client;\n}\n\nfunction createDriver(config: DriverConfig): Driver {\n switch (config.type) {\n case 'local':\n return new LocalDriver(config);\n case 'http':\n throw new Error('HttpDriver not implemented yet');\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"]}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "fauxbase",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "./dist/index.cjs",
6
+ "module": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "require": "./dist/index.cjs"
13
+ }
14
+ },
15
+ "files": ["dist"],
16
+ "scripts": {
17
+ "build": "tsup",
18
+ "test": "vitest run",
19
+ "test:watch": "vitest",
20
+ "test:coverage": "vitest run --coverage",
21
+ "clean": "rm -rf dist"
22
+ },
23
+ "devDependencies": {
24
+ "tsup": "^8.0.0",
25
+ "vitest": "^3.0.0",
26
+ "@vitest/coverage-v8": "^3.0.0",
27
+ "typescript": "^5.7.0"
28
+ }
29
+ }