@almadar/server 2.0.9 → 2.1.1
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/package.json +10 -4
- package/dist/contracts.d.ts +0 -174
- package/dist/contracts.d.ts.map +0 -1
- package/dist/deepagent/__tests__/memory.test.d.ts +0 -6
- package/dist/deepagent/__tests__/memory.test.d.ts.map +0 -1
- package/dist/deepagent/__tests__/session.test.d.ts +0 -6
- package/dist/deepagent/__tests__/session.test.d.ts.map +0 -1
- package/dist/deepagent/__tests__/skill-agent.test.d.ts +0 -6
- package/dist/deepagent/__tests__/skill-agent.test.d.ts.map +0 -1
- package/dist/deepagent/memory.d.ts +0 -17
- package/dist/deepagent/memory.d.ts.map +0 -1
- package/dist/deepagent/memory.js +0 -48
- package/dist/deepagent/memory.js.map +0 -1
- package/dist/deepagent/session.d.ts +0 -17
- package/dist/deepagent/session.d.ts.map +0 -1
- package/dist/deepagent/session.js +0 -68
- package/dist/deepagent/session.js.map +0 -1
- package/dist/deepagent/skill-agent.d.ts +0 -22
- package/dist/deepagent/skill-agent.d.ts.map +0 -1
- package/dist/deepagent/skill-agent.js +0 -114
- package/dist/deepagent/skill-agent.js.map +0 -1
- package/dist/index.d.ts +0 -42
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -2460
- package/dist/index.js.map +0 -1
- package/dist/lib/db.d.ts +0 -36
- package/dist/lib/db.d.ts.map +0 -1
- package/dist/lib/debugRouter.d.ts +0 -21
- package/dist/lib/debugRouter.d.ts.map +0 -1
- package/dist/lib/env.d.ts +0 -16
- package/dist/lib/env.d.ts.map +0 -1
- package/dist/lib/eventBus.d.ts +0 -44
- package/dist/lib/eventBus.d.ts.map +0 -1
- package/dist/lib/eventBusTransport.d.ts +0 -143
- package/dist/lib/eventBusTransport.d.ts.map +0 -1
- package/dist/lib/eventPersistence.d.ts +0 -151
- package/dist/lib/eventPersistence.d.ts.map +0 -1
- package/dist/lib/index.d.ts +0 -6
- package/dist/lib/index.d.ts.map +0 -1
- package/dist/lib/index.js +0 -288
- package/dist/lib/index.js.map +0 -1
- package/dist/lib/logger.d.ts +0 -7
- package/dist/lib/logger.d.ts.map +0 -1
- package/dist/lib/serviceDiscovery.d.ts +0 -168
- package/dist/lib/serviceDiscovery.d.ts.map +0 -1
- package/dist/lib/websocket.d.ts +0 -41
- package/dist/lib/websocket.d.ts.map +0 -1
- package/dist/middleware/__tests__/multi-user.test.d.ts +0 -6
- package/dist/middleware/__tests__/multi-user.test.d.ts.map +0 -1
- package/dist/middleware/authenticateFirebase.d.ts +0 -4
- package/dist/middleware/authenticateFirebase.d.ts.map +0 -1
- package/dist/middleware/errorHandler.d.ts +0 -53
- package/dist/middleware/errorHandler.d.ts.map +0 -1
- package/dist/middleware/index.d.ts +0 -4
- package/dist/middleware/index.d.ts.map +0 -1
- package/dist/middleware/index.js +0 -284
- package/dist/middleware/index.js.map +0 -1
- package/dist/middleware/multi-user.d.ts +0 -34
- package/dist/middleware/multi-user.d.ts.map +0 -1
- package/dist/middleware/multi-user.js +0 -76
- package/dist/middleware/multi-user.js.map +0 -1
- package/dist/middleware/validation.d.ts +0 -15
- package/dist/middleware/validation.d.ts.map +0 -1
- package/dist/routes/__tests__/observability.test.d.ts +0 -6
- package/dist/routes/__tests__/observability.test.d.ts.map +0 -1
- package/dist/routes/observability.d.ts +0 -11
- package/dist/routes/observability.d.ts.map +0 -1
- package/dist/routes/observability.js +0 -62
- package/dist/routes/observability.js.map +0 -1
- package/dist/services/DataService.d.ts +0 -70
- package/dist/services/DataService.d.ts.map +0 -1
- package/dist/services/MockDataService.d.ts +0 -110
- package/dist/services/MockDataService.d.ts.map +0 -1
- package/dist/services/index.d.ts +0 -8
- package/dist/services/index.d.ts.map +0 -1
- package/dist/services/index.js +0 -735
- package/dist/services/index.js.map +0 -1
- package/dist/stores/ChangeSetStore.d.ts +0 -24
- package/dist/stores/ChangeSetStore.d.ts.map +0 -1
- package/dist/stores/SchemaProtectionService.d.ts +0 -23
- package/dist/stores/SchemaProtectionService.d.ts.map +0 -1
- package/dist/stores/SchemaStore.d.ts +0 -52
- package/dist/stores/SchemaStore.d.ts.map +0 -1
- package/dist/stores/SnapshotStore.d.ts +0 -26
- package/dist/stores/SnapshotStore.d.ts.map +0 -1
- package/dist/stores/ValidationStore.d.ts +0 -19
- package/dist/stores/ValidationStore.d.ts.map +0 -1
- package/dist/stores/firestoreFormat.d.ts +0 -21
- package/dist/stores/firestoreFormat.d.ts.map +0 -1
- package/dist/stores/index.d.ts +0 -14
- package/dist/stores/index.d.ts.map +0 -1
- package/dist/stores/index.js +0 -519
- package/dist/stores/index.js.map +0 -1
- package/dist/utils/index.d.ts +0 -9
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -106
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/queryFilters.d.ts +0 -87
- package/dist/utils/queryFilters.d.ts.map +0 -1
- package/dist/websocket/__tests__/state-sync.test.d.ts +0 -6
- package/dist/websocket/__tests__/state-sync.test.d.ts.map +0 -1
- package/dist/websocket/state-sync.d.ts +0 -39
- package/dist/websocket/state-sync.d.ts.map +0 -1
- package/dist/websocket/state-sync.js +0 -77
- package/dist/websocket/state-sync.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/env.ts","../../src/lib/logger.ts","../../src/services/MockDataService.ts","../../src/lib/db.ts","../../src/utils/queryFilters.ts","../../src/services/DataService.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { z } from 'zod';\nimport dotenv from 'dotenv';\n\n// Load environment variables\ndotenv.config();\n\nconst envSchema = z.object({\n NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),\n PORT: z\n .string()\n .default('3030')\n .transform((val) => parseInt(val, 10)),\n CORS_ORIGIN: z\n .string()\n .default('http://localhost:5173')\n .transform((val) => (val.includes(',') ? val.split(',').map((s) => s.trim()) : val)),\n \n // Database (Prisma/SQL) - optional\n DATABASE_URL: z.string().optional(),\n \n // Firebase/Firestore configuration\n FIREBASE_PROJECT_ID: z.string().optional(),\n FIREBASE_CLIENT_EMAIL: z.string().optional(),\n FIREBASE_PRIVATE_KEY: z.string().optional(),\n FIREBASE_SERVICE_ACCOUNT_PATH: z.string().optional(),\n FIRESTORE_EMULATOR_HOST: z.string().optional(),\n FIREBASE_AUTH_EMULATOR_HOST: z.string().optional(),\n \n // API configuration\n API_PREFIX: z.string().default('/api'),\n\n // Mock data configuration\n USE_MOCK_DATA: z.string().default('true').transform((v) => v === 'true'),\n MOCK_SEED: z\n .string()\n .optional()\n .transform((v) => (v ? parseInt(v, 10) : undefined)),\n});\n\nconst parsed = envSchema.safeParse(process.env);\n\nif (!parsed.success) {\n console.error('❌ Invalid environment variables:', parsed.error.flatten().fieldErrors);\n throw new Error('Invalid environment variables');\n}\n\nexport const env = parsed.data;\n","import { env } from './env.js';\n\ntype LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nconst colors = {\n debug: '\\x1b[36m', // Cyan\n info: '\\x1b[32m', // Green\n warn: '\\x1b[33m', // Yellow\n error: '\\x1b[31m', // Red\n reset: '\\x1b[0m',\n};\n\nconst shouldLog = (level: LogLevel): boolean => {\n const levels: LogLevel[] = ['debug', 'info', 'warn', 'error'];\n const minLevel = env.NODE_ENV === 'production' ? 'info' : 'debug';\n return levels.indexOf(level) >= levels.indexOf(minLevel);\n};\n\nconst formatMessage = (level: LogLevel, message: string, meta?: unknown): string => {\n const timestamp = new Date().toISOString();\n const color = colors[level];\n const prefix = `${color}[${level.toUpperCase()}]${colors.reset}`;\n const metaStr = meta ? ` ${JSON.stringify(meta)}` : '';\n return `${timestamp} ${prefix} ${message}${metaStr}`;\n};\n\nexport const logger = {\n debug: (message: string, meta?: unknown) => {\n if (shouldLog('debug')) {\n console.log(formatMessage('debug', message, meta));\n }\n },\n info: (message: string, meta?: unknown) => {\n if (shouldLog('info')) {\n console.log(formatMessage('info', message, meta));\n }\n },\n warn: (message: string, meta?: unknown) => {\n if (shouldLog('warn')) {\n console.warn(formatMessage('warn', message, meta));\n }\n },\n error: (message: string, meta?: unknown) => {\n if (shouldLog('error')) {\n console.error(formatMessage('error', message, meta));\n }\n },\n};\n","/**\n * MockDataService - In-memory data store with faker-based mock generation\n *\n * Provides a stateful mock data layer that supports all CRUD operations.\n * Uses @faker-js/faker for realistic data generation based on field types.\n *\n * @packageDocumentation\n */\n\nimport { faker } from '@faker-js/faker';\nimport { env } from '../lib/env.js';\nimport { logger } from '../lib/logger.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FieldSchema {\n name: string;\n type: 'string' | 'number' | 'boolean' | 'date' | 'enum' | 'relation' | 'array';\n required?: boolean;\n enumValues?: string[];\n min?: number;\n max?: number;\n fakerMethod?: string;\n relatedEntity?: string;\n}\n\nexport interface EntitySchema {\n fields: FieldSchema[];\n seedCount?: number;\n}\n\ninterface BaseEntity {\n id: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\n// ============================================================================\n// MockDataService\n// ============================================================================\n\n/**\n * In-memory mock data store with CRUD operations and faker-based seeding.\n */\nexport class MockDataService {\n private stores: Map<string, Map<string, unknown>> = new Map();\n private schemas: Map<string, EntitySchema> = new Map();\n private idCounters: Map<string, number> = new Map();\n\n constructor() {\n // Set seed for deterministic generation if provided\n if (env.MOCK_SEED !== undefined) {\n faker.seed(env.MOCK_SEED);\n logger.info(`[Mock] Using seed: ${env.MOCK_SEED}`);\n }\n }\n\n // ============================================================================\n // Store Management\n // ============================================================================\n\n /**\n * Initialize store for an entity.\n */\n private getStore(entityName: string): Map<string, unknown> {\n const normalized = entityName.toLowerCase();\n if (!this.stores.has(normalized)) {\n this.stores.set(normalized, new Map());\n this.idCounters.set(normalized, 0);\n }\n return this.stores.get(normalized)!;\n }\n\n /**\n * Generate next ID for an entity.\n */\n private nextId(entityName: string): string {\n const normalized = entityName.toLowerCase();\n const counter = (this.idCounters.get(normalized) ?? 0) + 1;\n this.idCounters.set(normalized, counter);\n return `mock-${normalized}-${counter}`;\n }\n\n // ============================================================================\n // Schema & Seeding\n // ============================================================================\n\n /**\n * Register an entity schema.\n */\n registerSchema(entityName: string, schema: EntitySchema): void {\n this.schemas.set(entityName.toLowerCase(), schema);\n }\n\n /**\n * Seed an entity with mock data.\n */\n seed(entityName: string, fields: FieldSchema[], count: number = 10): void {\n const store = this.getStore(entityName);\n const normalized = entityName.toLowerCase();\n\n logger.info(`[Mock] Seeding ${count} ${entityName}...`);\n\n for (let i = 0; i < count; i++) {\n const item = this.generateMockItem(normalized, fields, i + 1);\n store.set(item.id, item);\n }\n }\n\n /**\n * Generate a single mock item based on field schemas.\n */\n private generateMockItem(entityName: string, fields: FieldSchema[], index: number): BaseEntity & Record<string, unknown> {\n const id = this.nextId(entityName);\n const now = new Date();\n const item: Record<string, unknown> = {\n id,\n createdAt: faker.date.past({ years: 1 }),\n updatedAt: now,\n };\n\n for (const field of fields) {\n if (field.name === 'id' || field.name === 'createdAt' || field.name === 'updatedAt') {\n continue;\n }\n item[field.name] = this.generateFieldValue(entityName, field, index);\n }\n\n return item as BaseEntity & Record<string, unknown>;\n }\n\n /**\n * Generate a mock value for a field based on its schema.\n */\n private generateFieldValue(entityName: string, field: FieldSchema, index: number): unknown {\n // Handle optional fields - 80% chance of having a value\n if (!field.required && Math.random() > 0.8) {\n return undefined;\n }\n\n switch (field.type) {\n case 'string':\n return this.generateStringValue(entityName, field, index);\n\n case 'number':\n return faker.number.int({\n min: field.min ?? 0,\n max: field.max ?? 1000,\n });\n\n case 'boolean':\n return faker.datatype.boolean();\n\n case 'date':\n return this.generateDateValue(field);\n\n case 'enum':\n if (field.enumValues && field.enumValues.length > 0) {\n return faker.helpers.arrayElement(field.enumValues);\n }\n return null;\n\n case 'relation':\n // For relations, generate a placeholder ID or null\n if (field.relatedEntity) {\n const relatedStore = this.stores.get(field.relatedEntity.toLowerCase());\n if (relatedStore && relatedStore.size > 0) {\n const ids = Array.from(relatedStore.keys());\n return faker.helpers.arrayElement(ids);\n }\n }\n return null;\n\n case 'array':\n // Generate an empty array for now\n return [];\n\n default:\n return null;\n }\n }\n\n /**\n * Generate a string value based on field name heuristics.\n * Generic name/title fields use a clean readable format (e.g., \"Title 1\").\n * Specific fields (email, phone, etc.) use faker.\n */\n private generateStringValue(_entityName: string, field: FieldSchema, index: number): string {\n const name = field.name.toLowerCase();\n\n // If field has enumValues, use them (even if type is 'string')\n if (field.enumValues && field.enumValues.length > 0) {\n return faker.helpers.arrayElement(field.enumValues);\n }\n\n // Identity fields\n if (name.includes('email')) return faker.internet.email();\n if (name === 'name' || name === 'fullname' || name === 'full_name') return faker.person.fullName();\n if (name === 'firstname' || name === 'first_name') return faker.person.firstName();\n if (name === 'lastname' || name === 'last_name') return faker.person.lastName();\n if (name.includes('username') || name === 'handle') return faker.internet.username();\n\n // Contact fields\n if (name.includes('phone') || name.includes('mobile') || name.includes('tel')) return faker.phone.number();\n if (name.includes('address') || name.includes('street')) return faker.location.streetAddress();\n if (name.includes('city')) return faker.location.city();\n if (name.includes('state') || name.includes('province')) return faker.location.state();\n if (name.includes('country')) return faker.location.country();\n if (name.includes('zip') || name.includes('postal')) return faker.location.zipCode();\n\n // Content fields\n if (name === 'title' || name === 'headline' || name === 'subject') return faker.lorem.sentence({ min: 3, max: 7 }).replace(/\\.$/, '');\n if (name === 'description' || name === 'summary' || name === 'bio' || name === 'about') return faker.lorem.paragraph(2);\n if (name === 'content' || name === 'body' || name === 'text') return faker.lorem.paragraphs(2);\n if (name === 'excerpt' || name === 'snippet' || name === 'preview') return faker.lorem.sentence({ min: 8, max: 15 });\n if (name === 'label' || name === 'tag' || name === 'category') return faker.word.noun();\n if (name === 'note' || name === 'comment' || name === 'message' || name === 'feedback') return faker.lorem.sentence();\n\n // Status / type fields\n if (name === 'status') return faker.helpers.arrayElement(['active', 'pending', 'completed', 'draft', 'archived']);\n if (name === 'priority') return faker.helpers.arrayElement(['low', 'medium', 'high', 'critical']);\n if (name === 'type' || name === 'kind') return faker.helpers.arrayElement(['standard', 'premium', 'basic', 'custom']);\n if (name === 'role') return faker.helpers.arrayElement(['admin', 'editor', 'viewer', 'member']);\n if (name === 'level' || name === 'tier') return faker.helpers.arrayElement(['beginner', 'intermediate', 'advanced', 'expert']);\n if (name === 'severity') return faker.helpers.arrayElement(['info', 'warning', 'error', 'critical']);\n if (name === 'difficulty') return faker.helpers.arrayElement(['easy', 'medium', 'hard']);\n\n // Web / media fields\n if (name.includes('url') || name.includes('website') || name.includes('link')) return faker.internet.url();\n if (name.includes('avatar') || name.includes('image') || name.includes('photo') || name.includes('thumbnail')) return faker.image.avatar();\n if (name.includes('color') || name.includes('colour')) return faker.color.human();\n if (name.includes('uuid') || name === 'guid') return faker.string.uuid();\n if (name.includes('icon')) return faker.helpers.arrayElement(['star', 'heart', 'check', 'alert-circle', 'info', 'folder', 'file', 'user']);\n if (name === 'slug') return faker.helpers.slugify(faker.lorem.words(3));\n\n // Organization / business fields\n if (name === 'company' || name === 'organization' || name === 'org') return faker.company.name();\n if (name === 'department') return faker.commerce.department();\n if (name === 'product' || name === 'productname' || name === 'product_name') return faker.commerce.productName();\n if (name === 'brand') return faker.company.name();\n if (name === 'sku' || name === 'code') return faker.string.alphanumeric(8).toUpperCase();\n if (name === 'currency') return faker.finance.currencyCode();\n if (name.includes('price') || name.includes('cost') || name.includes('amount')) return faker.commerce.price();\n\n // Location / geo fields\n if (name === 'latitude' || name === 'lat') return String(faker.location.latitude());\n if (name === 'longitude' || name === 'lng' || name === 'lon') return String(faker.location.longitude());\n if (name === 'location' || name === 'place' || name === 'venue') return `${faker.location.city()}, ${faker.location.country()}`;\n if (name === 'region' || name === 'zone' || name === 'area') return faker.location.state();\n\n // Technical fields\n if (name === 'ip' || name.includes('ipaddress') || name === 'ip_address') return faker.internet.ip();\n if (name === 'useragent' || name === 'user_agent') return faker.internet.userAgent();\n if (name === 'version' || name === 'firmware') return faker.system.semver();\n if (name === 'platform' || name === 'os') return faker.helpers.arrayElement(['iOS', 'Android', 'Windows', 'macOS', 'Linux']);\n if (name === 'browser') return faker.helpers.arrayElement(['Chrome', 'Firefox', 'Safari', 'Edge']);\n\n // Measurement / unit fields\n if (name === 'unit') return faker.helpers.arrayElement(['kg', 'lb', 'cm', 'm', 'L', 'mL', '°C', '°F', 'psi', 'rpm']);\n if (name === 'metric') return faker.helpers.arrayElement(['temperature', 'pressure', 'humidity', 'speed', 'voltage']);\n if (name === 'operator') return faker.helpers.arrayElement(['gt', 'lt', 'eq', 'gte', 'lte']);\n if (name === 'format' || name === 'mimetype' || name === 'mime_type') return faker.system.mimeType();\n if (name === 'extension' || name === 'ext') return faker.system.fileExt();\n if (name === 'filename' || name === 'file_name') return faker.system.fileName();\n\n // Fallback: generate realistic data based on common suffixes and patterns\n if (name.endsWith('id') || name.endsWith('_id')) return faker.string.alphanumeric(8).toUpperCase();\n if (name.endsWith('name') || name.endsWith('_name')) return faker.person.fullName();\n if (name.endsWith('type') || name.endsWith('_type')) return faker.helpers.arrayElement(['standard', 'premium', 'basic', 'custom', 'special']);\n if (name.endsWith('date') || name.endsWith('_date') || name.endsWith('at')) return faker.date.recent({ days: 90 }).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });\n if (name.endsWith('count') || name.endsWith('_count')) return String(faker.number.int({ min: 1, max: 100 }));\n if (name.includes('reason') || name.includes('detail')) return faker.lorem.sentence({ min: 4, max: 8 }).replace(/\\.$/, '');\n if (name.includes('field') || name.includes('key') || name.includes('attribute')) return faker.word.noun();\n if (name.includes('value') || name.includes('result') || name.includes('output')) return faker.word.words({ count: { min: 1, max: 3 } });\n if (name.includes('direction') || name.includes('position') || name.includes('mode')) return faker.helpers.arrayElement(['left', 'right', 'center', 'top', 'bottom', 'auto']);\n // Generic fallback: short descriptive phrase\n return faker.word.words({ count: { min: 1, max: 3 } });\n }\n\n /**\n * Capitalize first letter of a string.\n */\n private capitalizeFirst(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n\n /**\n * Generate a date value based on field name heuristics.\n */\n private generateDateValue(field: FieldSchema): Date {\n const name = field.name.toLowerCase();\n\n if (name.includes('created') || name.includes('start') || name.includes('birth')) {\n return faker.date.past({ years: 2 });\n }\n if (name.includes('updated') || name.includes('modified')) {\n return faker.date.recent({ days: 30 });\n }\n if (name.includes('deadline') || name.includes('due') || name.includes('end') || name.includes('expires')) {\n return faker.date.future({ years: 1 });\n }\n\n return faker.date.anytime();\n }\n\n // ============================================================================\n // CRUD Operations\n // ============================================================================\n\n /**\n * List all items of an entity.\n */\n list<T>(entityName: string): T[] {\n const store = this.getStore(entityName);\n return Array.from(store.values()) as T[];\n }\n\n /**\n * Get a single item by ID.\n */\n getById<T>(entityName: string, id: string): T | null {\n const store = this.getStore(entityName);\n const item = store.get(id);\n return (item as T) ?? null;\n }\n\n /**\n * Create a new item.\n */\n create<T extends BaseEntity>(entityName: string, data: Partial<T>): T {\n const store = this.getStore(entityName);\n const id = this.nextId(entityName);\n const now = new Date();\n\n const item = {\n ...data,\n id,\n createdAt: now,\n updatedAt: now,\n } as T;\n\n store.set(id, item);\n return item;\n }\n\n /**\n * Update an existing item.\n */\n update<T extends BaseEntity>(entityName: string, id: string, data: Partial<T>): T | null {\n const store = this.getStore(entityName);\n const existing = store.get(id);\n\n if (!existing) {\n return null;\n }\n\n const updated = {\n ...(existing as T),\n ...data,\n id, // Preserve original ID\n updatedAt: new Date(),\n } as T;\n\n store.set(id, updated);\n return updated;\n }\n\n /**\n * Delete an item.\n */\n delete(entityName: string, id: string): boolean {\n const store = this.getStore(entityName);\n if (!store.has(id)) {\n return false;\n }\n store.delete(id);\n return true;\n }\n\n // ============================================================================\n // Utilities\n // ============================================================================\n\n /**\n * Clear all data for an entity.\n */\n clear(entityName: string): void {\n const normalized = entityName.toLowerCase();\n this.stores.delete(normalized);\n this.idCounters.delete(normalized);\n }\n\n /**\n * Clear all data.\n */\n clearAll(): void {\n this.stores.clear();\n this.idCounters.clear();\n }\n\n /**\n * Get count of items for an entity.\n */\n count(entityName: string): number {\n const store = this.getStore(entityName);\n return store.size;\n }\n}\n\n// Lazy singleton instance\nlet _mockDataService: MockDataService | null = null;\n\nexport function getMockDataService(): MockDataService {\n if (!_mockDataService) {\n _mockDataService = new MockDataService();\n }\n return _mockDataService;\n}\n\nexport function resetMockDataService(): void {\n _mockDataService?.clearAll();\n _mockDataService = null;\n}\n","/**\n * Database Accessors & Initialization\n *\n * This module provides:\n * - `initializeFirebase()` — convenience function to init Firebase from env vars\n * - `getFirestore()`, `getAuth()` — accessors for Firebase services\n * - `db` — lazy Firestore proxy (no eager initialization)\n *\n * The consuming application MUST call `initializeFirebase()` or\n * `admin.initializeApp()` before using any Firebase-dependent features.\n */\n\nimport admin from 'firebase-admin';\n\n/**\n * Initialize Firebase Admin SDK from environment variables.\n *\n * Reads: FIREBASE_PROJECT_ID, FIREBASE_CLIENT_EMAIL, FIREBASE_PRIVATE_KEY,\n * FIREBASE_SERVICE_ACCOUNT_PATH, FIRESTORE_EMULATOR_HOST\n *\n * Safe to call multiple times — returns existing app if already initialized.\n */\nexport function initializeFirebase(): admin.app.App {\n // Already initialized — return existing app\n if (admin.apps.length > 0) {\n return admin.app();\n }\n\n const projectId = process.env.FIREBASE_PROJECT_ID;\n const emulatorHost = process.env.FIRESTORE_EMULATOR_HOST;\n\n // Emulator mode — no credentials needed\n if (emulatorHost) {\n const app = admin.initializeApp({\n projectId: projectId || 'demo-project',\n });\n console.log(`Firebase Admin initialized for emulator: ${emulatorHost}`);\n return app;\n }\n\n // Service account file\n const serviceAccountPath = process.env.FIREBASE_SERVICE_ACCOUNT_PATH;\n if (serviceAccountPath) {\n // Dynamic require for JSON service account file at runtime\n const serviceAccount = require(serviceAccountPath) as Record<string, unknown>;\n return admin.initializeApp({\n credential: admin.credential.cert(serviceAccount),\n projectId,\n });\n }\n\n // Inline credentials\n const clientEmail = process.env.FIREBASE_CLIENT_EMAIL;\n const privateKey = process.env.FIREBASE_PRIVATE_KEY;\n if (projectId && clientEmail && privateKey) {\n return admin.initializeApp({\n credential: admin.credential.cert({\n projectId,\n clientEmail,\n privateKey: privateKey.replace(/\\\\n/g, '\\n'),\n }),\n projectId,\n });\n }\n\n // Application default credentials (Cloud Run, etc.)\n if (projectId) {\n return admin.initializeApp({\n credential: admin.credential.applicationDefault(),\n projectId,\n });\n }\n\n throw new Error(\n '@almadar/server: Cannot initialize Firebase — no credentials found. ' +\n 'Set FIREBASE_PROJECT_ID + FIREBASE_CLIENT_EMAIL + FIREBASE_PRIVATE_KEY, ' +\n 'or FIREBASE_SERVICE_ACCOUNT_PATH, or FIRESTORE_EMULATOR_HOST.'\n );\n}\n\n/**\n * Get the initialized Firebase app.\n * Throws if Firebase Admin SDK has not been initialized.\n */\nfunction getApp(): admin.app.App {\n if (admin.apps.length === 0) {\n throw new Error(\n '@almadar/server: Firebase Admin SDK is not initialized. ' +\n 'Call initializeFirebase() or admin.initializeApp() before using @almadar/server.'\n );\n }\n return admin.app();\n}\n\n/**\n * Get Firestore instance from the pre-initialized Firebase app.\n */\nexport function getFirestore(): admin.firestore.Firestore {\n return getApp().firestore();\n}\n\n/**\n * Get Firebase Auth instance from the pre-initialized Firebase app.\n */\nexport function getAuth(): admin.auth.Auth {\n return getApp().auth();\n}\n\n// Re-export admin for convenience\nexport { admin };\n\n/**\n * Lazy Firestore proxy — resolves on first property access, not at import time.\n * This prevents the \"Firebase not initialized\" error during module loading.\n */\nexport const db = new Proxy({} as admin.firestore.Firestore, {\n get(_target, prop, receiver) {\n const firestore = getFirestore();\n const value = Reflect.get(firestore, prop, receiver);\n return typeof value === 'function' ? value.bind(firestore) : value;\n },\n});\n","/**\n * Query Filter Utilities\n *\n * Parses URL query parameters into Firestore-compatible filter objects.\n * Supports operator encoding in parameter names: field__operator=value\n *\n * @example\n * // URL: /api/tasks?status=active&date__gte=2025-01-01&tags__contains=urgent\n * const filters = parseQueryFilters(req.query);\n * // Returns:\n * // [\n * // { field: 'status', operator: '==', value: 'active' },\n * // { field: 'date', operator: '>=', value: '2025-01-01' },\n * // { field: 'tags', operator: 'array-contains', value: 'urgent' }\n * // ]\n *\n * @packageDocumentation\n */\n\n/**\n * Parsed filter ready for Firestore query\n */\nexport interface ParsedFilter {\n field: string;\n operator: FirestoreWhereFilterOp;\n value: unknown;\n}\n\n/**\n * Firestore where filter operators\n */\nexport type FirestoreWhereFilterOp =\n | '=='\n | '!='\n | '>'\n | '>='\n | '<'\n | '<='\n | 'array-contains'\n | 'array-contains-any'\n | 'in'\n | 'not-in';\n\n/**\n * Map of URL operator suffixes to Firestore operators\n */\nconst OPERATOR_MAP: Record<string, FirestoreWhereFilterOp> = {\n 'eq': '==',\n 'neq': '!=',\n 'gt': '>',\n 'gte': '>=',\n 'lt': '<',\n 'lte': '<=',\n 'contains': 'array-contains',\n 'contains_any': 'array-contains-any',\n 'in': 'in',\n 'not_in': 'not-in',\n // Date operators map to same comparison operators\n 'date_eq': '==',\n 'date_gte': '>=',\n 'date_lte': '<=',\n};\n\n/**\n * Reserved query parameters that should not be treated as filters\n */\nconst RESERVED_PARAMS = new Set([\n 'page',\n 'pageSize',\n 'limit',\n 'offset',\n 'search',\n 'q',\n 'sortBy',\n 'sortOrder',\n 'orderBy',\n 'orderDirection',\n]);\n\n/**\n * Parse query parameters into Firestore-compatible filters.\n *\n * Supports operator encoding: field__operator=value\n *\n * @param query - Express req.query object\n * @returns Array of parsed filters ready for Firestore .where() calls\n *\n * @example\n * ```typescript\n * // In Express route handler:\n * const filters = parseQueryFilters(req.query);\n *\n * let query = db.collection('tasks');\n * for (const filter of filters) {\n * query = query.where(filter.field, filter.operator, filter.value);\n * }\n * ```\n */\nexport function parseQueryFilters(\n query: Record<string, unknown>\n): ParsedFilter[] {\n const filters: ParsedFilter[] = [];\n\n for (const [key, value] of Object.entries(query)) {\n // Skip reserved pagination/sort params\n if (RESERVED_PARAMS.has(key)) continue;\n\n // Skip empty values\n if (value === undefined || value === null || value === '') continue;\n\n // Parse operator from key: field__operator → { field, operator }\n const match = key.match(/^(.+)__(\\w+)$/);\n\n if (match) {\n const [, field, op] = match;\n const firestoreOp = OPERATOR_MAP[op];\n\n if (firestoreOp) {\n filters.push({\n field,\n operator: firestoreOp,\n value: parseValue(value, op),\n });\n } else {\n // Unknown operator - treat as field name with double underscore\n filters.push({\n field: key,\n operator: '==',\n value: parseValue(value, 'eq'),\n });\n }\n } else {\n // No operator suffix → equals\n filters.push({\n field: key,\n operator: '==',\n value: parseValue(value, 'eq'),\n });\n }\n }\n\n return filters;\n}\n\n/**\n * Parse and coerce value based on operator type\n */\nfunction parseValue(value: unknown, operator: string): unknown {\n // Handle array values for 'in' operator\n if (operator === 'in' || operator === 'not_in' || operator === 'contains_any') {\n if (typeof value === 'string') {\n // Parse comma-separated values: \"a,b,c\" → ['a', 'b', 'c']\n return value.split(',').map(v => v.trim());\n }\n if (Array.isArray(value)) {\n return value;\n }\n return [value];\n }\n\n // Handle numeric values\n if (typeof value === 'string') {\n // Try to parse as number if it looks like one\n if (/^-?\\d+(\\.\\d+)?$/.test(value)) {\n const num = parseFloat(value);\n if (!isNaN(num)) {\n return num;\n }\n }\n\n // Handle boolean strings\n if (value === 'true') return true;\n if (value === 'false') return false;\n }\n\n return value;\n}\n\n/**\n * Build a Firestore query with filters applied.\n *\n * @param collection - Base Firestore collection reference or query\n * @param filters - Parsed filters from parseQueryFilters\n * @returns Query with all filters applied\n *\n * @example\n * ```typescript\n * const filters = parseQueryFilters(req.query);\n * const baseQuery = db.collection('tasks');\n * const filteredQuery = applyFiltersToQuery(baseQuery, filters);\n * const snapshot = await filteredQuery.get();\n * ```\n */\nexport function applyFiltersToQuery<T>(\n collection: FirebaseFirestore.Query<T>,\n filters: ParsedFilter[]\n): FirebaseFirestore.Query<T> {\n let query = collection;\n\n for (const filter of filters) {\n query = query.where(\n filter.field,\n filter.operator as FirebaseFirestore.WhereFilterOp,\n filter.value\n );\n }\n\n return query;\n}\n\n/**\n * Extract pagination parameters from query\n */\nexport interface PaginationParams {\n page: number;\n pageSize: number;\n sortBy?: string;\n sortOrder: 'asc' | 'desc';\n}\n\n/**\n * Extract pagination parameters from a query object.\n *\n * Parses page, pageSize/limit, sortBy/orderBy, and sortOrder/orderDirection\n * from query parameters with sensible defaults.\n *\n * @param {Record<string, unknown>} query - Query object containing pagination params\n * @param {Partial<PaginationParams>} [defaults] - Default values for pagination\n * @returns {PaginationParams} Extracted pagination parameters\n */\nexport function extractPaginationParams(\n query: Record<string, unknown>,\n defaults: Partial<PaginationParams> = {}\n): PaginationParams {\n return {\n page: parseInt(query.page as string, 10) || defaults.page || 1,\n pageSize: parseInt(query.pageSize as string, 10) || parseInt(query.limit as string, 10) || defaults.pageSize || 20,\n sortBy: (query.sortBy || query.orderBy) as string | undefined,\n sortOrder: ((query.sortOrder || query.orderDirection) as 'asc' | 'desc') || defaults.sortOrder || 'asc',\n };\n}\n","/**\n * DataService - Unified data access abstraction\n *\n * Provides a common interface for data operations that can be backed by\n * either MockDataService (for development) or Firebase (for production).\n *\n * @packageDocumentation\n */\n\nimport type { StoreContract, StoreFilter } from '@almadar/core';\nimport { db } from '../lib/db.js';\nimport { env } from '../lib/env.js';\nimport { logger } from '../lib/logger.js';\nimport { getMockDataService, type FieldSchema } from './MockDataService.js';\nimport {\n parseQueryFilters,\n applyFiltersToQuery,\n type ParsedFilter,\n} from '../utils/queryFilters.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface BaseEntity {\n id: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\n/**\n * Pagination options for list queries\n */\nexport interface PaginationOptions {\n /** Page number (1-indexed) */\n page?: number;\n /** Number of items per page */\n pageSize?: number;\n /** Search term to filter results */\n search?: string;\n /** Fields to search in (defaults to all string fields) */\n searchFields?: string[];\n /** Sort field */\n sortBy?: string;\n /** Sort direction */\n sortOrder?: 'asc' | 'desc';\n /** Filters parsed from query params */\n filters?: ParsedFilter[];\n}\n\n/**\n * Paginated response structure\n */\nexport interface PaginatedResult<T> {\n data: T[];\n total: number;\n page: number;\n pageSize: number;\n totalPages: number;\n}\n\nexport interface DataService {\n list<T>(collection: string): Promise<T[]>;\n listPaginated<T>(collection: string, options?: PaginationOptions): Promise<PaginatedResult<T>>;\n getById<T>(collection: string, id: string): Promise<T | null>;\n create<T extends BaseEntity>(collection: string, data: Partial<T>): Promise<T>;\n update<T extends BaseEntity>(collection: string, id: string, data: Partial<T>): Promise<T | null>;\n delete(collection: string, id: string): Promise<boolean>;\n query<T>(collection: string, filters: StoreFilter<T>[]): Promise<T[]>;\n /** Get a typed StoreContract<T> bound to a specific collection. */\n getStore<T extends BaseEntity>(collection: string): StoreContract<T>;\n}\n\n/**\n * Apply filter condition for in-memory filtering.\n * Used by MockDataServiceAdapter for all operators and\n * FirebaseDataService for operators not supported by Firestore.\n */\nfunction applyFilterCondition(value: unknown, operator: string, filterValue: unknown): boolean {\n if (value === null || value === undefined) {\n return operator === '!=' ? filterValue !== null : false;\n }\n\n switch (operator) {\n case '==':\n return value === filterValue;\n case '!=':\n return value !== filterValue;\n case '>':\n return (value as number) > (filterValue as number);\n case '>=':\n return (value as number) >= (filterValue as number);\n case '<':\n return (value as number) < (filterValue as number);\n case '<=':\n return (value as number) <= (filterValue as number);\n case 'array-contains':\n return Array.isArray(value) && value.includes(filterValue);\n case 'array-contains-any':\n return (\n Array.isArray(value) &&\n Array.isArray(filterValue) &&\n filterValue.some((v: unknown) => value.includes(v))\n );\n case 'in':\n return Array.isArray(filterValue) && filterValue.includes(value);\n case 'not-in':\n return Array.isArray(filterValue) && !filterValue.includes(value);\n default:\n return true;\n }\n}\n\n// ============================================================================\n// MockDataServiceAdapter\n// ============================================================================\n\n/**\n * Adapter that wraps MockDataService with async interface.\n */\nclass MockDataServiceAdapter implements DataService {\n async list<T>(collection: string): Promise<T[]> {\n return getMockDataService().list<T>(collection);\n }\n\n async listPaginated<T>(\n collection: string,\n options: PaginationOptions = {}\n ): Promise<PaginatedResult<T>> {\n const {\n page = 1,\n pageSize = 20,\n search,\n searchFields,\n sortBy,\n sortOrder = 'asc',\n filters,\n } = options;\n\n let items = getMockDataService().list<T>(collection);\n\n // Apply field filters (server-side filtering)\n if (filters && filters.length > 0) {\n items = items.filter((item) => {\n const record = item as Record<string, unknown>;\n return filters.every((filter) => {\n const value = record[filter.field];\n return applyFilterCondition(value, filter.operator, filter.value);\n });\n });\n }\n\n // Apply search filter\n if (search && search.trim()) {\n const searchLower = search.toLowerCase();\n items = items.filter((item) => {\n const record = item as Record<string, unknown>;\n const fieldsToSearch = searchFields || Object.keys(record);\n return fieldsToSearch.some((field) => {\n const value = record[field];\n if (value === null || value === undefined) return false;\n return String(value).toLowerCase().includes(searchLower);\n });\n });\n }\n\n // Apply sorting\n if (sortBy) {\n items = [...items].sort((a, b) => {\n const aVal = (a as Record<string, unknown>)[sortBy];\n const bVal = (b as Record<string, unknown>)[sortBy];\n if (aVal === bVal) return 0;\n if (aVal === null || aVal === undefined) return 1;\n if (bVal === null || bVal === undefined) return -1;\n const comparison = aVal < bVal ? -1 : 1;\n return sortOrder === 'asc' ? comparison : -comparison;\n });\n }\n\n const total = items.length;\n const totalPages = Math.ceil(total / pageSize);\n const startIndex = (page - 1) * pageSize;\n const data = items.slice(startIndex, startIndex + pageSize);\n\n return { data, total, page, pageSize, totalPages };\n }\n\n async getById<T>(collection: string, id: string): Promise<T | null> {\n return getMockDataService().getById<T>(collection, id);\n }\n\n async create<T extends BaseEntity>(collection: string, data: Partial<T>): Promise<T> {\n return getMockDataService().create<T>(collection, data);\n }\n\n async update<T extends BaseEntity>(\n collection: string,\n id: string,\n data: Partial<T>\n ): Promise<T | null> {\n return getMockDataService().update<T>(collection, id, data);\n }\n\n async delete(collection: string, id: string): Promise<boolean> {\n return getMockDataService().delete(collection, id);\n }\n\n async query<T>(collection: string, filters: StoreFilter<T>[]): Promise<T[]> {\n let items = getMockDataService().list<T>(collection);\n for (const filter of filters) {\n items = items.filter((item) => {\n const value = (item as Record<string, unknown>)[filter.field];\n return applyFilterCondition(value, filter.op, filter.value);\n });\n }\n return items;\n }\n\n getStore<T extends BaseEntity>(collection: string): StoreContract<T> {\n const adapter = this;\n return {\n async getById(id: string): Promise<T | null> {\n return adapter.getById<T>(collection, id);\n },\n async create(data: Omit<T, 'id'>): Promise<T> {\n return adapter.create<T>(collection, data as Partial<T>);\n },\n async update(id: string, data: Partial<T>): Promise<T> {\n const result = await adapter.update<T>(collection, id, data);\n if (!result) throw new Error(`Entity ${id} not found in ${collection}`);\n return result;\n },\n async delete(id: string): Promise<void> {\n adapter.delete(collection, id);\n },\n async query(filters: StoreFilter<T>[]): Promise<T[]> {\n return adapter.query<T>(collection, filters);\n },\n };\n }\n}\n\n// ============================================================================\n// FirebaseDataService\n// ============================================================================\n\n/**\n * Firebase/Firestore implementation of DataService.\n */\nclass FirebaseDataService implements DataService {\n async list<T>(collection: string): Promise<T[]> {\n const snapshot = await db.collection(collection).get();\n return snapshot.docs.map((doc) => ({\n id: doc.id,\n ...doc.data(),\n })) as T[];\n }\n\n async listPaginated<T>(\n collection: string,\n options: PaginationOptions = {}\n ): Promise<PaginatedResult<T>> {\n const {\n page = 1,\n pageSize = 20,\n search,\n searchFields,\n sortBy,\n sortOrder = 'asc',\n filters,\n } = options;\n\n // For Firebase, we apply filters using Firestore's .where() for supported operators\n // Note: For large datasets, consider using Algolia or Elasticsearch for search\n let query: FirebaseFirestore.Query = db.collection(collection);\n\n // Apply field filters using Firestore's where() clauses\n if (filters && filters.length > 0) {\n query = applyFiltersToQuery(query, filters);\n }\n\n // Apply sorting if no search (Firestore can sort natively)\n if (sortBy && !search) {\n query = query.orderBy(sortBy, sortOrder);\n }\n\n const snapshot = await query.get();\n let items = snapshot.docs.map((doc) => ({\n id: doc.id,\n ...doc.data(),\n })) as T[];\n\n // Apply search filter (in-memory for Firebase)\n if (search && search.trim()) {\n const searchLower = search.toLowerCase();\n items = items.filter((item) => {\n const record = item as Record<string, unknown>;\n const fieldsToSearch = searchFields || Object.keys(record);\n return fieldsToSearch.some((field) => {\n const value = record[field];\n if (value === null || value === undefined) return false;\n return String(value).toLowerCase().includes(searchLower);\n });\n });\n }\n\n // Apply sorting (in-memory if search was applied)\n if (sortBy && search) {\n items = [...items].sort((a, b) => {\n const aVal = (a as Record<string, unknown>)[sortBy];\n const bVal = (b as Record<string, unknown>)[sortBy];\n if (aVal === bVal) return 0;\n if (aVal === null || aVal === undefined) return 1;\n if (bVal === null || bVal === undefined) return -1;\n const comparison = aVal < bVal ? -1 : 1;\n return sortOrder === 'asc' ? comparison : -comparison;\n });\n }\n\n const total = items.length;\n const totalPages = Math.ceil(total / pageSize);\n const startIndex = (page - 1) * pageSize;\n const data = items.slice(startIndex, startIndex + pageSize);\n\n return { data, total, page, pageSize, totalPages };\n }\n\n async getById<T>(collection: string, id: string): Promise<T | null> {\n const doc = await db.collection(collection).doc(id).get();\n if (!doc.exists) {\n return null;\n }\n return { id: doc.id, ...doc.data() } as T;\n }\n\n async create<T extends BaseEntity>(collection: string, data: Partial<T>): Promise<T> {\n const now = new Date();\n const docRef = await db.collection(collection).add({\n ...data,\n createdAt: now,\n updatedAt: now,\n });\n\n return {\n ...data,\n id: docRef.id,\n createdAt: now,\n updatedAt: now,\n } as T;\n }\n\n async update<T extends BaseEntity>(\n collection: string,\n id: string,\n data: Partial<T>\n ): Promise<T | null> {\n const docRef = db.collection(collection).doc(id);\n const doc = await docRef.get();\n\n if (!doc.exists) {\n return null;\n }\n\n const now = new Date();\n await docRef.update({\n ...data,\n updatedAt: now,\n });\n\n return {\n ...doc.data(),\n ...data,\n id,\n updatedAt: now,\n } as T;\n }\n\n async delete(collection: string, id: string): Promise<boolean> {\n const docRef = db.collection(collection).doc(id);\n const doc = await docRef.get();\n\n if (!doc.exists) {\n return false;\n }\n\n await docRef.delete();\n return true;\n }\n\n async query<T>(collection: string, filters: StoreFilter<T>[]): Promise<T[]> {\n let query: FirebaseFirestore.Query = db.collection(collection);\n\n // Apply filters that Firestore supports natively\n const memoryFilters: StoreFilter<T>[] = [];\n for (const filter of filters) {\n if (['==', '!=', '<', '<=', '>', '>=', 'in', 'not-in'].includes(filter.op)) {\n query = query.where(filter.field, filter.op as FirebaseFirestore.WhereFilterOp, filter.value);\n } else {\n memoryFilters.push(filter);\n }\n }\n\n const snapshot = await query.get();\n let items = snapshot.docs.map((doc) => ({\n id: doc.id,\n ...doc.data(),\n })) as T[];\n\n // Apply remaining filters in memory (e.g., 'contains')\n for (const filter of memoryFilters) {\n items = items.filter((item) => {\n const value = (item as Record<string, unknown>)[filter.field];\n return applyFilterCondition(value, filter.op, filter.value);\n });\n }\n\n return items;\n }\n\n getStore<T extends BaseEntity>(collection: string): StoreContract<T> {\n const svc = this;\n return {\n async getById(id: string): Promise<T | null> {\n return svc.getById<T>(collection, id);\n },\n async create(data: Omit<T, 'id'>): Promise<T> {\n return svc.create<T>(collection, data as Partial<T>);\n },\n async update(id: string, data: Partial<T>): Promise<T> {\n const result = await svc.update<T>(collection, id, data);\n if (!result) throw new Error(`Entity ${id} not found in ${collection}`);\n return result;\n },\n async delete(id: string): Promise<void> {\n await svc.delete(collection, id);\n },\n async query(filters: StoreFilter<T>[]): Promise<T[]> {\n return svc.query<T>(collection, filters);\n },\n };\n }\n}\n\n// ============================================================================\n// Factory & Export\n// ============================================================================\n\n/**\n * Create the appropriate data service based on environment configuration.\n */\nfunction createDataService(): DataService {\n if (env.USE_MOCK_DATA) {\n logger.info('[DataService] Using MockDataService');\n return new MockDataServiceAdapter();\n }\n logger.info('[DataService] Using FirebaseDataService');\n return new FirebaseDataService();\n}\n\n/**\n * Lazy singleton data service instance.\n */\nlet _dataService: DataService | null = null;\n\nexport function getDataService(): DataService {\n if (!_dataService) {\n _dataService = createDataService();\n }\n return _dataService;\n}\n\nexport function resetDataService(): void {\n _dataService = null;\n}\n\n// ============================================================================\n// Seeding Helper\n// ============================================================================\n\nexport interface EntitySeedConfig {\n name: string;\n fields: FieldSchema[];\n seedCount: number;\n}\n\n/**\n * Seed mock data for multiple entities.\n * Only works when USE_MOCK_DATA is enabled.\n */\nexport function seedMockData(entities: EntitySeedConfig[]): void {\n if (!env.USE_MOCK_DATA) {\n logger.info('[DataService] Mock mode disabled, skipping seed');\n return;\n }\n\n logger.info('[DataService] Seeding mock data...');\n\n for (const entity of entities) {\n getMockDataService().seed(entity.name, entity.fields, entity.seedCount);\n }\n\n logger.info('[DataService] Mock data seeding complete');\n}\n"]}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ChangeSetStore - Firestore CRUD for schema changesets
|
|
3
|
-
*
|
|
4
|
-
* Changesets track changes made to the schema over time,
|
|
5
|
-
* stored in subcollection: users/{uid}/apps/{appId}/changesets/{changeSetId}
|
|
6
|
-
*/
|
|
7
|
-
import type { ChangeSetDocument } from '@almadar/core';
|
|
8
|
-
export declare class ChangeSetStore {
|
|
9
|
-
private appsCollection;
|
|
10
|
-
constructor(appsCollection?: string);
|
|
11
|
-
private getCollectionPath;
|
|
12
|
-
private getAppDocPath;
|
|
13
|
-
/** Append a changeset to history */
|
|
14
|
-
append(uid: string, appId: string, changeSet: ChangeSetDocument): Promise<void>;
|
|
15
|
-
/** Get change history for an app (ordered by version desc) */
|
|
16
|
-
getHistory(uid: string, appId: string): Promise<ChangeSetDocument[]>;
|
|
17
|
-
/** Get a specific changeset by ID */
|
|
18
|
-
get(uid: string, appId: string, changeSetId: string): Promise<ChangeSetDocument | null>;
|
|
19
|
-
/** Update a changeset's status */
|
|
20
|
-
updateStatus(uid: string, appId: string, changeSetId: string, status: 'applied' | 'reverted' | 'pending'): Promise<void>;
|
|
21
|
-
/** Delete a changeset */
|
|
22
|
-
delete(uid: string, appId: string, changeSetId: string): Promise<boolean>;
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=ChangeSetStore.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ChangeSetStore.d.ts","sourceRoot":"","sources":["../../src/stores/ChangeSetStore.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAe,MAAM,eAAe,CAAC;AAKpE,qBAAa,cAAc;IACzB,OAAO,CAAC,cAAc,CAAS;gBAEnB,cAAc,SAAS;IAInC,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,aAAa;IAIrB,oCAAoC;IAC9B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBrF,8DAA8D;IACxD,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAe1E,qCAAqC;IAC/B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAO7F,kCAAkC;IAC5B,YAAY,CAChB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,GACzC,OAAO,CAAC,IAAI,CAAC;IAQhB,yBAAyB;IACnB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAyBhF"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SchemaProtectionService - Detects destructive schema changes
|
|
3
|
-
*
|
|
4
|
-
* Uses real diff functions from @almadar/core to detect and categorize
|
|
5
|
-
* removals, page content reductions, and other destructive changes.
|
|
6
|
-
*/
|
|
7
|
-
import type { OrbitalSchema, CategorizedRemovals, PageContentReduction } from '@almadar/core';
|
|
8
|
-
export declare class SchemaProtectionService {
|
|
9
|
-
/**
|
|
10
|
-
* Compare two schemas and detect destructive changes.
|
|
11
|
-
*
|
|
12
|
-
* Returns categorized removals including page content reductions.
|
|
13
|
-
*/
|
|
14
|
-
compareSchemas(before: OrbitalSchema, after: OrbitalSchema): {
|
|
15
|
-
isDestructive: boolean;
|
|
16
|
-
removals: CategorizedRemovals;
|
|
17
|
-
};
|
|
18
|
-
/** Check if critical removals require confirmation */
|
|
19
|
-
requiresConfirmation(removals: CategorizedRemovals): boolean;
|
|
20
|
-
/** Check for significant page content reductions */
|
|
21
|
-
hasSignificantContentReduction(reductions: PageContentReduction[]): boolean;
|
|
22
|
-
}
|
|
23
|
-
//# sourceMappingURL=SchemaProtectionService.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaProtectionService.d.ts","sourceRoot":"","sources":["../../src/stores/SchemaProtectionService.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAU9F,qBAAa,uBAAuB;IAClC;;;;OAIG;IACH,cAAc,CACZ,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,aAAa,GACnB;QACD,aAAa,EAAE,OAAO,CAAC;QACvB,QAAQ,EAAE,mBAAmB,CAAC;KAC/B;IAiBD,sDAAsD;IACtD,oBAAoB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO;IAI5D,oDAAoD;IACpD,8BAA8B,CAAC,UAAU,EAAE,oBAAoB,EAAE,GAAG,OAAO;CAG5E"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SchemaStore - Firestore CRUD for OrbitalSchema documents
|
|
3
|
-
*
|
|
4
|
-
* Handles schema get/save/create/delete/list with caching
|
|
5
|
-
* and Firestore serialization.
|
|
6
|
-
*/
|
|
7
|
-
import type { OrbitalSchema, StatsView, AppSummary, SaveOptions, SaveResult } from '@almadar/core';
|
|
8
|
-
import type { SnapshotStore } from './SnapshotStore.js';
|
|
9
|
-
export declare class SchemaStore {
|
|
10
|
-
private appsCollection;
|
|
11
|
-
private schemaCache;
|
|
12
|
-
private listCache;
|
|
13
|
-
private protectionService;
|
|
14
|
-
private snapshotStore;
|
|
15
|
-
constructor(appsCollection?: string);
|
|
16
|
-
/** Set snapshot store for auto-snapshot on destructive saves */
|
|
17
|
-
setSnapshotStore(store: SnapshotStore): void;
|
|
18
|
-
/** Get a schema by app ID */
|
|
19
|
-
get(uid: string, appId: string): Promise<OrbitalSchema | null>;
|
|
20
|
-
/**
|
|
21
|
-
* Save a schema (create or full replace).
|
|
22
|
-
*
|
|
23
|
-
* Features:
|
|
24
|
-
* - Detects destructive changes (removals)
|
|
25
|
-
* - Requires confirmation for critical removals
|
|
26
|
-
* - Auto-creates snapshots before destructive changes (if SnapshotStore attached)
|
|
27
|
-
*/
|
|
28
|
-
save(uid: string, appId: string, schema: OrbitalSchema, options?: SaveOptions): Promise<SaveResult>;
|
|
29
|
-
/** Create a new app with initial schema */
|
|
30
|
-
create(uid: string, metadata: {
|
|
31
|
-
name: string;
|
|
32
|
-
description?: string;
|
|
33
|
-
}): Promise<{
|
|
34
|
-
appId: string;
|
|
35
|
-
schema: OrbitalSchema;
|
|
36
|
-
}>;
|
|
37
|
-
/** Delete an app */
|
|
38
|
-
delete(uid: string, appId: string): Promise<boolean>;
|
|
39
|
-
/** List all apps for a user */
|
|
40
|
-
list(uid: string): Promise<AppSummary[]>;
|
|
41
|
-
/** Compute stats from OrbitalSchema */
|
|
42
|
-
computeStats(schema: OrbitalSchema): StatsView;
|
|
43
|
-
/** Invalidate caches for a specific app */
|
|
44
|
-
invalidateCache(uid: string, appId: string): void;
|
|
45
|
-
/** Clear all caches */
|
|
46
|
-
clearCaches(): void;
|
|
47
|
-
/** Get the collection path for an app */
|
|
48
|
-
getAppDocPath(uid: string, appId: string): string;
|
|
49
|
-
/** Expose apps collection name for subcollection stores */
|
|
50
|
-
getAppsCollection(): string;
|
|
51
|
-
}
|
|
52
|
-
//# sourceMappingURL=SchemaStore.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaStore.d.ts","sourceRoot":"","sources":["../../src/stores/SchemaStore.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAInG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKxD,qBAAa,WAAW;IACtB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,WAAW,CAAmE;IACtF,OAAO,CAAC,SAAS,CAAgE;IACjF,OAAO,CAAC,iBAAiB,CAAiC;IAC1D,OAAO,CAAC,aAAa,CAA8B;gBAEvC,cAAc,SAAS;IAInC,gEAAgE;IAChE,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAI5C,6BAA6B;IACvB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IA0BpE;;;;;;;OAOG;IACG,IAAI,CACR,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,UAAU,CAAC;IA0EtB,2CAA2C;IACrC,MAAM,CACV,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/C,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,aAAa,CAAA;KAAE,CAAC;IAuBpD,oBAAoB;IACd,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB1D,+BAA+B;IACzB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAuC9C,uCAAuC;IACvC,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,SAAS;IAqB9C,2CAA2C;IAC3C,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKjD,uBAAuB;IACvB,WAAW,IAAI,IAAI;IAKnB,yCAAyC;IACzC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAIjD,2DAA2D;IAC3D,iBAAiB,IAAI,MAAM;CAG5B"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SnapshotStore - Firestore CRUD for schema snapshots
|
|
3
|
-
*
|
|
4
|
-
* Snapshots are full copies of the schema at a point in time,
|
|
5
|
-
* stored in subcollection: users/{uid}/apps/{appId}/snapshots/{snapshotId}
|
|
6
|
-
*/
|
|
7
|
-
import type { OrbitalSchema, SnapshotDocument } from '@almadar/core';
|
|
8
|
-
export declare class SnapshotStore {
|
|
9
|
-
private appsCollection;
|
|
10
|
-
constructor(appsCollection?: string);
|
|
11
|
-
private getCollectionPath;
|
|
12
|
-
private getAppDocPath;
|
|
13
|
-
/** Create a snapshot of the current schema */
|
|
14
|
-
create(uid: string, appId: string, schema: OrbitalSchema, reason: string): Promise<string>;
|
|
15
|
-
/** Get all snapshots for an app (ordered by timestamp desc) */
|
|
16
|
-
getAll(uid: string, appId: string): Promise<SnapshotDocument[]>;
|
|
17
|
-
/** Get a specific snapshot by ID */
|
|
18
|
-
get(uid: string, appId: string, snapshotId: string): Promise<SnapshotDocument | null>;
|
|
19
|
-
/** Delete a snapshot */
|
|
20
|
-
delete(uid: string, appId: string, snapshotId: string): Promise<boolean>;
|
|
21
|
-
/** Get schema snapshot at a specific version */
|
|
22
|
-
getByVersion(uid: string, appId: string, version: number): Promise<OrbitalSchema | null>;
|
|
23
|
-
/** Get the schema from a snapshot (deserialized) */
|
|
24
|
-
getSchemaFromSnapshot(snapshot: SnapshotDocument): OrbitalSchema;
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=SnapshotStore.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SnapshotStore.d.ts","sourceRoot":"","sources":["../../src/stores/SnapshotStore.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAe,MAAM,eAAe,CAAC;AAMlF,qBAAa,aAAa;IACxB,OAAO,CAAC,cAAc,CAAS;gBAEnB,cAAc,SAAS;IAInC,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,aAAa;IAIrB,8CAA8C;IACxC,MAAM,CACV,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC;IA6BlB,+DAA+D;IACzD,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAUrE,oCAAoC;IAC9B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAO3F,wBAAwB;IAClB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA0B9E,gDAAgD;IAC1C,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAa9F,oDAAoD;IACpD,qBAAqB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,aAAa;CAGjE"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ValidationStore - Firestore CRUD for validation results
|
|
3
|
-
*
|
|
4
|
-
* Validation results stored at: users/{uid}/apps/{appId}/validation/current
|
|
5
|
-
*/
|
|
6
|
-
import type { ValidationResults } from '@almadar/core';
|
|
7
|
-
export declare class ValidationStore {
|
|
8
|
-
private appsCollection;
|
|
9
|
-
constructor(appsCollection?: string);
|
|
10
|
-
private getDocPath;
|
|
11
|
-
private getAppDocPath;
|
|
12
|
-
/** Save validation results */
|
|
13
|
-
save(uid: string, appId: string, results: ValidationResults): Promise<void>;
|
|
14
|
-
/** Get validation results */
|
|
15
|
-
get(uid: string, appId: string): Promise<ValidationResults | null>;
|
|
16
|
-
/** Clear validation results */
|
|
17
|
-
clear(uid: string, appId: string): Promise<void>;
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=ValidationStore.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ValidationStore.d.ts","sourceRoot":"","sources":["../../src/stores/ValidationStore.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAkB,MAAM,eAAe,CAAC;AAMvE,qBAAa,eAAe;IAC1B,OAAO,CAAC,cAAc,CAAS;gBAEnB,cAAc,SAAS;IAInC,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,aAAa;IAIrB,8BAA8B;IACxB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBjF,6BAA6B;IACvB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAYxE,+BAA+B;IACzB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAUvD"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Firestore Serialization Utilities
|
|
3
|
-
*
|
|
4
|
-
* Handles the Firestore 20-level depth limit by serializing deeply nested
|
|
5
|
-
* OrbitalSchema fields (orbitals, traits, services) to JSON strings.
|
|
6
|
-
*/
|
|
7
|
-
import type { OrbitalSchema } from '@almadar/core';
|
|
8
|
-
/**
|
|
9
|
-
* Convert OrbitalSchema to Firestore-safe format.
|
|
10
|
-
*
|
|
11
|
-
* Serializes orbitals, traits, and services to JSON strings to avoid
|
|
12
|
-
* Firestore's 20-level nesting limit.
|
|
13
|
-
*/
|
|
14
|
-
export declare function toFirestoreFormat(schema: OrbitalSchema): Record<string, unknown>;
|
|
15
|
-
/**
|
|
16
|
-
* Convert Firestore document back to OrbitalSchema.
|
|
17
|
-
*
|
|
18
|
-
* Deserializes JSON strings back to arrays.
|
|
19
|
-
*/
|
|
20
|
-
export declare function fromFirestoreFormat(data: Record<string, unknown>): OrbitalSchema;
|
|
21
|
-
//# sourceMappingURL=firestoreFormat.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"firestoreFormat.d.ts","sourceRoot":"","sources":["../../src/stores/firestoreFormat.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA0BhF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CAsChF"}
|
package/dist/stores/index.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Stores barrel export
|
|
3
|
-
*
|
|
4
|
-
* Firestore-backed stores for OrbitalSchema, snapshots, changesets, and validation.
|
|
5
|
-
*
|
|
6
|
-
* @packageDocumentation
|
|
7
|
-
*/
|
|
8
|
-
export { toFirestoreFormat, fromFirestoreFormat } from './firestoreFormat.js';
|
|
9
|
-
export { SchemaStore } from './SchemaStore.js';
|
|
10
|
-
export { SnapshotStore } from './SnapshotStore.js';
|
|
11
|
-
export { ChangeSetStore } from './ChangeSetStore.js';
|
|
12
|
-
export { ValidationStore } from './ValidationStore.js';
|
|
13
|
-
export { SchemaProtectionService } from './SchemaProtectionService.js';
|
|
14
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC"}
|