@almadar/server 1.0.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/lib/env.ts","../src/lib/logger.ts","../src/lib/eventBus.ts","../src/lib/db.ts","../src/lib/websocket.ts","../src/middleware/errorHandler.ts","../src/middleware/validation.ts","../src/middleware/authenticateFirebase.ts","../src/services/MockDataService.ts","../src/utils/queryFilters.ts","../src/services/DataService.ts"],"names":["db","ZodError"],"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 * Server EventBus - Singleton for server-side cross-trait communication\n *\n * This EventBus enables:\n * - Server-side trait event emission after CRUD operations\n * - Server-side trait listeners responding to events\n * - Cross-client event broadcast via WebSocket\n *\n * @packageDocumentation\n */\n\ntype EventHandler = (payload: unknown, meta?: Record<string, unknown>) => void;\n\n/**\n * Simple EventBus implementation for server-side events\n */\nexport class EventBus {\n private handlers: Map<string, Set<EventHandler>> = new Map();\n private debug: boolean;\n\n constructor(options?: { debug?: boolean }) {\n this.debug = options?.debug ?? false;\n }\n\n on(event: string, handler: EventHandler): () => void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler);\n\n // Return unsubscribe function\n return () => {\n this.handlers.get(event)?.delete(handler);\n };\n }\n\n off(event: string, handler: EventHandler): void {\n this.handlers.get(event)?.delete(handler);\n }\n\n emit(event: string, payload?: unknown, meta?: Record<string, unknown>): void {\n if (this.debug) {\n console.log(`[EventBus] Emitting ${event}:`, payload);\n }\n\n const handlers = this.handlers.get(event);\n if (handlers) {\n handlers.forEach(handler => {\n try {\n handler(payload, meta);\n } catch (err) {\n console.error(`[EventBus] Error in handler for ${event}:`, err);\n }\n });\n }\n }\n\n clear(): void {\n this.handlers.clear();\n }\n}\n\n/**\n * Singleton EventBus instance for server-side event communication.\n */\nexport const serverEventBus = new EventBus({\n debug: process.env.NODE_ENV === 'development',\n});\n\n/**\n * Type-safe event emission helper\n */\nexport function emitEntityEvent(\n entityType: string,\n action: 'CREATED' | 'UPDATED' | 'DELETED',\n payload: Record<string, unknown>\n): void {\n const eventType = `${entityType.toUpperCase()}_${action}`;\n serverEventBus.emit(eventType, payload, { orbital: entityType });\n}\n","/**\n * Database Configuration\n * \n * Supports both Prisma (SQL) and Firebase Admin (Firestore)\n * Generated apps can use either depending on the database option\n */\n\nimport admin from 'firebase-admin';\nimport { env } from './env.js';\n\n// ============ Firebase Admin / Firestore ============\n\nlet firebaseApp: admin.app.App | null = null;\n\n/**\n * Initialize Firebase Admin SDK\n */\nfunction initializeFirebase(): admin.app.App {\n if (firebaseApp) {\n return firebaseApp;\n }\n\n // Check if already initialized\n if (admin.apps.length > 0) {\n firebaseApp = admin.apps[0]!;\n return firebaseApp;\n }\n\n // Check for emulator mode FIRST (no credentials needed)\n if (env.FIRESTORE_EMULATOR_HOST) {\n // Emulator mode - no credentials needed\n firebaseApp = admin.initializeApp({\n projectId: env.FIREBASE_PROJECT_ID || 'demo-project',\n });\n console.log(`🔧 Firebase Admin initialized for emulator: ${env.FIRESTORE_EMULATOR_HOST}`);\n return firebaseApp;\n }\n\n // Production mode - need credentials\n const serviceAccountPath = env.FIREBASE_SERVICE_ACCOUNT_PATH;\n \n if (serviceAccountPath) {\n // Use service account file\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const serviceAccount = require(serviceAccountPath);\n firebaseApp = admin.initializeApp({\n credential: admin.credential.cert(serviceAccount),\n projectId: env.FIREBASE_PROJECT_ID,\n });\n } else if (env.FIREBASE_PROJECT_ID && env.FIREBASE_CLIENT_EMAIL && env.FIREBASE_PRIVATE_KEY) {\n // Use inline service account credentials\n firebaseApp = admin.initializeApp({\n credential: admin.credential.cert({\n projectId: env.FIREBASE_PROJECT_ID,\n clientEmail: env.FIREBASE_CLIENT_EMAIL,\n privateKey: env.FIREBASE_PRIVATE_KEY.replace(/\\\\n/g, '\\n'),\n }),\n projectId: env.FIREBASE_PROJECT_ID,\n });\n } else if (env.FIREBASE_PROJECT_ID) {\n // Use application default credentials (for Cloud Run, etc.)\n firebaseApp = admin.initializeApp({\n credential: admin.credential.applicationDefault(),\n projectId: env.FIREBASE_PROJECT_ID,\n });\n } else {\n // Emulator mode - use default credentials\n firebaseApp = admin.initializeApp({\n projectId: 'demo-project',\n });\n }\n\n return firebaseApp;\n}\n\n/**\n * Get Firestore instance\n */\nexport function getFirestore(): admin.firestore.Firestore {\n const app = initializeFirebase();\n const db = app.firestore();\n \n // Connect to emulator if configured\n if (env.FIRESTORE_EMULATOR_HOST) {\n db.settings({\n host: env.FIRESTORE_EMULATOR_HOST,\n ssl: false,\n });\n }\n \n return db;\n}\n\n/**\n * Get Firebase Auth instance\n */\nexport function getAuth(): admin.auth.Auth {\n const app = initializeFirebase();\n return app.auth();\n}\n\n// ============ Prisma (Optional - for SQL databases) ============\n\n// Uncomment if using Prisma with SQL database\n/*\nimport { PrismaClient } from '@prisma/client';\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __db: PrismaClient | undefined;\n}\n\nconst createPrismaClient = () => {\n return new PrismaClient({\n log: env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'],\n });\n};\n\nexport const db = globalThis.__db ?? createPrismaClient();\n\nif (env.NODE_ENV !== 'production') {\n globalThis.__db = db;\n}\n*/\n\n// Re-export admin for convenience\nexport { admin };\n\n// Export db instance for handler convenience\nexport const db = getFirestore();\n","/**\n * WebSocket Event Broadcast - Cross-client event synchronization\n *\n * Broadcasts server-side events to all connected clients via WebSocket.\n * This enables real-time updates across multiple browser clients.\n *\n * @packageDocumentation\n */\n\nimport { WebSocketServer, WebSocket, type RawData } from 'ws';\nimport type { Server, IncomingMessage } from 'http';\nimport { serverEventBus } from './eventBus.js';\nimport { logger } from './logger.js';\n\n/**\n * Event structure for broadcasting\n */\ninterface BroadcastEvent {\n type: string;\n payload?: unknown;\n timestamp?: number;\n source?: Record<string, unknown>;\n}\n\n/**\n * WebSocket server instance (singleton)\n */\nlet wss: WebSocketServer | null = null;\n\n/**\n * Setup WebSocket server for event broadcasting.\n *\n * Listens to all server events via wildcard and broadcasts to connected clients.\n *\n * @param server - HTTP server to attach WebSocket to\n * @param path - WebSocket endpoint path (default: '/ws/events')\n *\n * @example\n * ```typescript\n * import { createServer } from 'http';\n * import { setupEventBroadcast } from '@/lib/websocket';\n *\n * const server = createServer(app);\n * setupEventBroadcast(server);\n * ```\n */\nexport function setupEventBroadcast(server: Server, path: string = '/ws/events'): WebSocketServer {\n if (wss) {\n logger.warn('[WebSocket] Server already initialized');\n return wss;\n }\n\n wss = new WebSocketServer({ server, path });\n\n logger.info(`[WebSocket] Server listening at ${path}`);\n\n // Handle new connections\n wss.on('connection', (ws: WebSocket, req: IncomingMessage) => {\n const clientId = req.headers['sec-websocket-key'] || 'unknown';\n logger.debug(`[WebSocket] Client connected: ${clientId}`);\n\n // Send welcome message\n ws.send(\n JSON.stringify({\n type: 'CONNECTED',\n timestamp: Date.now(),\n message: 'Connected to event stream',\n })\n );\n\n // Handle client messages (for future bidirectional communication)\n ws.on('message', (data: RawData) => {\n try {\n const message = JSON.parse(data.toString());\n logger.debug(`[WebSocket] Received from ${clientId}:`, message);\n\n // Handle client-to-server events if needed\n if (message.type && message.payload) {\n // Emit to server event bus with client source\n serverEventBus.emit(message.type, message.payload, {\n orbital: 'client',\n entity: clientId,\n });\n }\n } catch (error) {\n logger.error(`[WebSocket] Failed to parse message:`, error);\n }\n });\n\n ws.on('close', () => {\n logger.debug(`[WebSocket] Client disconnected: ${clientId}`);\n });\n\n ws.on('error', (error: Error) => {\n logger.error(`[WebSocket] Client error:`, error);\n });\n });\n\n // Subscribe to all server events and broadcast to clients\n serverEventBus.on('*', (event: unknown) => {\n if (!wss) return;\n\n const typedEvent = event as BroadcastEvent;\n const message = JSON.stringify({\n type: typedEvent.type,\n payload: typedEvent.payload,\n timestamp: typedEvent.timestamp,\n source: typedEvent.source,\n });\n\n let broadcastCount = 0;\n wss.clients.forEach((client: WebSocket) => {\n if (client.readyState === WebSocket.OPEN) {\n client.send(message);\n broadcastCount++;\n }\n });\n\n if (broadcastCount > 0) {\n logger.debug(`[WebSocket] Broadcast ${typedEvent.type} to ${broadcastCount} client(s)`);\n }\n });\n\n return wss;\n}\n\n/**\n * Get the WebSocket server instance (for testing or advanced usage)\n */\nexport function getWebSocketServer(): WebSocketServer | null {\n return wss;\n}\n\n/**\n * Close the WebSocket server\n */\nexport function closeWebSocketServer(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!wss) {\n resolve();\n return;\n }\n\n wss.close((err?: Error) => {\n if (err) {\n reject(err);\n } else {\n wss = null;\n resolve();\n }\n });\n });\n}\n\n/**\n * Get connected client count\n */\nexport function getConnectedClientCount(): number {\n if (!wss) return 0;\n return wss.clients.size;\n}\n","import { Request, Response, NextFunction } from 'express';\nimport { ZodError } from 'zod';\nimport { logger } from '../lib/logger.js';\n\n/**\n * Base application error class\n */\nexport class AppError extends Error {\n constructor(\n public statusCode: number,\n public message: string,\n public code?: string\n ) {\n super(message);\n this.name = 'AppError';\n }\n}\n\n/**\n * 404 Not Found error\n */\nexport class NotFoundError extends AppError {\n constructor(message: string = 'Resource not found') {\n super(404, message, 'NOT_FOUND');\n }\n}\n\n/**\n * 400 Bad Request / Validation error\n */\nexport class ValidationError extends AppError {\n constructor(message: string = 'Validation failed') {\n super(400, message, 'VALIDATION_ERROR');\n }\n}\n\n/**\n * 401 Unauthorized error\n */\nexport class UnauthorizedError extends AppError {\n constructor(message: string = 'Unauthorized') {\n super(401, message, 'UNAUTHORIZED');\n }\n}\n\n/**\n * 403 Forbidden error\n */\nexport class ForbiddenError extends AppError {\n constructor(message: string = 'Forbidden') {\n super(403, message, 'FORBIDDEN');\n }\n}\n\n/**\n * 409 Conflict error\n */\nexport class ConflictError extends AppError {\n constructor(message: string = 'Resource conflict') {\n super(409, message, 'CONFLICT');\n }\n}\n\n/**\n * Global error handler middleware\n */\nexport const errorHandler = (\n err: Error,\n _req: Request,\n res: Response,\n _next: NextFunction\n): void => {\n logger.error('Error:', { name: err.name, message: err.message, stack: err.stack });\n\n // Zod validation errors\n if (err instanceof ZodError) {\n res.status(400).json({\n success: false,\n error: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: err.errors.map((e) => ({\n path: e.path.join('.'),\n message: e.message,\n })),\n });\n return;\n }\n\n // Custom application errors\n if (err instanceof AppError) {\n res.status(err.statusCode).json({\n success: false,\n error: err.message,\n code: err.code,\n });\n return;\n }\n\n // Firebase/Firestore errors\n if (err.name === 'FirebaseError' || err.name === 'FirestoreError') {\n res.status(500).json({\n success: false,\n error: 'Database error',\n code: 'DATABASE_ERROR',\n });\n return;\n }\n\n // Unknown errors\n res.status(500).json({\n success: false,\n error: 'Internal server error',\n code: 'INTERNAL_ERROR',\n });\n};\n\n/**\n * Async handler wrapper to catch errors in async route handlers\n */\nexport const asyncHandler =\n (fn: (req: Request, res: Response, next: NextFunction) => Promise<unknown>) =>\n (req: Request, res: Response, next: NextFunction) => {\n Promise.resolve(fn(req, res, next)).catch(next);\n };\n\n/**\n * 404 handler for unmatched routes\n */\nexport const notFoundHandler = (req: Request, res: Response): void => {\n res.status(404).json({\n success: false,\n error: `Route ${req.method} ${req.path} not found`,\n code: 'ROUTE_NOT_FOUND',\n });\n};\n","import { Request, Response, NextFunction } from 'express';\nimport { AnyZodObject, ZodError } from 'zod';\n\n/**\n * Middleware to validate request body against a Zod schema\n */\nexport const validateBody =\n (schema: AnyZodObject) => async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n req.body = await schema.parseAsync(req.body);\n next();\n } catch (error) {\n if (error instanceof ZodError) {\n res.status(400).json({\n success: false,\n error: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: error.errors.map((e) => ({\n path: e.path.join('.'),\n message: e.message,\n })),\n });\n return;\n }\n next(error);\n }\n };\n\n/**\n * Middleware to validate request query parameters against a Zod schema\n */\nexport const validateQuery =\n (schema: AnyZodObject) => async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n req.query = await schema.parseAsync(req.query);\n next();\n } catch (error) {\n if (error instanceof ZodError) {\n res.status(400).json({\n success: false,\n error: 'Invalid query parameters',\n code: 'VALIDATION_ERROR',\n details: error.errors.map((e) => ({\n path: e.path.join('.'),\n message: e.message,\n })),\n });\n return;\n }\n next(error);\n }\n };\n\n/**\n * Middleware to validate request params against a Zod schema\n */\nexport const validateParams =\n (schema: AnyZodObject) => async (req: Request, res: Response, next: NextFunction): Promise<void> => {\n try {\n req.params = await schema.parseAsync(req.params);\n next();\n } catch (error) {\n if (error instanceof ZodError) {\n res.status(400).json({\n success: false,\n error: 'Invalid path parameters',\n code: 'VALIDATION_ERROR',\n details: error.errors.map((e) => ({\n path: e.path.join('.'),\n message: e.message,\n })),\n });\n return;\n }\n next(error);\n }\n };\n","import { NextFunction, Request, Response } from 'express';\nimport { getAuth } from '../lib/db.js';\n\nconst BEARER_PREFIX = 'Bearer ';\n\nexport async function authenticateFirebase(req: Request, res: Response, next: NextFunction) {\n try {\n const authorization = req.headers.authorization;\n\n if (!authorization || !authorization.startsWith(BEARER_PREFIX)) {\n return res.status(401).json({ error: 'Authorization header missing or malformed' });\n }\n\n const token = authorization.slice(BEARER_PREFIX.length);\n const decodedToken = await getAuth().verifyIdToken(token);\n\n req.firebaseUser = decodedToken;\n res.locals.firebaseUser = decodedToken;\n\n return next();\n } catch (error) {\n console.error('Firebase authentication failed:', error);\n return res.status(401).json({ error: 'Unauthorized' });\n }\n}\n\nexport default authenticateFirebase;\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 entity-aware format (e.g., \"Project Name 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 // Specific fields - use faker for realistic data\n if (name.includes('email')) return faker.internet.email();\n if (name.includes('phone')) return faker.phone.number();\n if (name.includes('address')) return faker.location.streetAddress();\n if (name.includes('city')) return faker.location.city();\n if (name.includes('country')) return faker.location.country();\n if (name.includes('url') || name.includes('website')) return faker.internet.url();\n if (name.includes('avatar') || name.includes('image')) return faker.image.avatar();\n if (name.includes('color')) return faker.color.human();\n if (name.includes('uuid')) return faker.string.uuid();\n\n // Generic name/title/text fields - use entity-aware readable format\n // Capitalize entity name and field name: \"Project Name 1\", \"Task Title 1\"\n const entityLabel = this.capitalizeFirst(entityName);\n const fieldLabel = this.capitalizeFirst(field.name);\n return `${entityLabel} ${fieldLabel} ${index}`;\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// Singleton instance\nexport const mockDataService = new MockDataService();\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\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 { db } from '../lib/db.js';\nimport { env } from '../lib/env.js';\nimport { logger } from '../lib/logger.js';\nimport { mockDataService, 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}\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 mockDataService.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 = mockDataService.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 mockDataService.getById<T>(collection, id);\n }\n\n async create<T extends BaseEntity>(collection: string, data: Partial<T>): Promise<T> {\n return mockDataService.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 mockDataService.update<T>(collection, id, data);\n }\n\n async delete(collection: string, id: string): Promise<boolean> {\n return mockDataService.delete(collection, id);\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\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 * Singleton data service instance.\n * Use this in handlers for all data operations.\n */\nexport const dataService = createDataService();\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 mockDataService.seed(entity.name, entity.fields, entity.seedCount);\n }\n\n logger.info('[DataService] Mock data seeding complete');\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export { c as closeWebSocketServer, e as emitEntityEvent, a as env, g as getAuth, b as getConnectedClientCount, f as getFirestore, h as getWebSocketServer, l as logger, s as serverEventBus, i as setupEventBroadcast } from '../index--XhXIuTh.js';
2
+ export { default as admin } from 'firebase-admin';
3
+ import 'ws';
4
+ import 'http';
@@ -0,0 +1,279 @@
1
+ import { z } from 'zod';
2
+ import dotenv from 'dotenv';
3
+ import admin from 'firebase-admin';
4
+ export { default as admin } from 'firebase-admin';
5
+ import { WebSocketServer, WebSocket } from 'ws';
6
+
7
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
8
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
9
+ }) : x)(function(x) {
10
+ if (typeof require !== "undefined") return require.apply(this, arguments);
11
+ throw Error('Dynamic require of "' + x + '" is not supported');
12
+ });
13
+ dotenv.config();
14
+ var envSchema = z.object({
15
+ NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
16
+ PORT: z.string().default("3030").transform((val) => parseInt(val, 10)),
17
+ CORS_ORIGIN: z.string().default("http://localhost:5173").transform((val) => val.includes(",") ? val.split(",").map((s) => s.trim()) : val),
18
+ // Database (Prisma/SQL) - optional
19
+ DATABASE_URL: z.string().optional(),
20
+ // Firebase/Firestore configuration
21
+ FIREBASE_PROJECT_ID: z.string().optional(),
22
+ FIREBASE_CLIENT_EMAIL: z.string().optional(),
23
+ FIREBASE_PRIVATE_KEY: z.string().optional(),
24
+ FIREBASE_SERVICE_ACCOUNT_PATH: z.string().optional(),
25
+ FIRESTORE_EMULATOR_HOST: z.string().optional(),
26
+ FIREBASE_AUTH_EMULATOR_HOST: z.string().optional(),
27
+ // API configuration
28
+ API_PREFIX: z.string().default("/api"),
29
+ // Mock data configuration
30
+ USE_MOCK_DATA: z.string().default("true").transform((v) => v === "true"),
31
+ MOCK_SEED: z.string().optional().transform((v) => v ? parseInt(v, 10) : void 0)
32
+ });
33
+ var parsed = envSchema.safeParse(process.env);
34
+ if (!parsed.success) {
35
+ console.error("\u274C Invalid environment variables:", parsed.error.flatten().fieldErrors);
36
+ throw new Error("Invalid environment variables");
37
+ }
38
+ var env = parsed.data;
39
+ var firebaseApp = null;
40
+ function initializeFirebase() {
41
+ if (firebaseApp) {
42
+ return firebaseApp;
43
+ }
44
+ if (admin.apps.length > 0) {
45
+ firebaseApp = admin.apps[0];
46
+ return firebaseApp;
47
+ }
48
+ if (env.FIRESTORE_EMULATOR_HOST) {
49
+ firebaseApp = admin.initializeApp({
50
+ projectId: env.FIREBASE_PROJECT_ID || "demo-project"
51
+ });
52
+ console.log(`\u{1F527} Firebase Admin initialized for emulator: ${env.FIRESTORE_EMULATOR_HOST}`);
53
+ return firebaseApp;
54
+ }
55
+ const serviceAccountPath = env.FIREBASE_SERVICE_ACCOUNT_PATH;
56
+ if (serviceAccountPath) {
57
+ const serviceAccount = __require(serviceAccountPath);
58
+ firebaseApp = admin.initializeApp({
59
+ credential: admin.credential.cert(serviceAccount),
60
+ projectId: env.FIREBASE_PROJECT_ID
61
+ });
62
+ } else if (env.FIREBASE_PROJECT_ID && env.FIREBASE_CLIENT_EMAIL && env.FIREBASE_PRIVATE_KEY) {
63
+ firebaseApp = admin.initializeApp({
64
+ credential: admin.credential.cert({
65
+ projectId: env.FIREBASE_PROJECT_ID,
66
+ clientEmail: env.FIREBASE_CLIENT_EMAIL,
67
+ privateKey: env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, "\n")
68
+ }),
69
+ projectId: env.FIREBASE_PROJECT_ID
70
+ });
71
+ } else if (env.FIREBASE_PROJECT_ID) {
72
+ firebaseApp = admin.initializeApp({
73
+ credential: admin.credential.applicationDefault(),
74
+ projectId: env.FIREBASE_PROJECT_ID
75
+ });
76
+ } else {
77
+ firebaseApp = admin.initializeApp({
78
+ projectId: "demo-project"
79
+ });
80
+ }
81
+ return firebaseApp;
82
+ }
83
+ function getFirestore() {
84
+ const app = initializeFirebase();
85
+ const db2 = app.firestore();
86
+ if (env.FIRESTORE_EMULATOR_HOST) {
87
+ db2.settings({
88
+ host: env.FIRESTORE_EMULATOR_HOST,
89
+ ssl: false
90
+ });
91
+ }
92
+ return db2;
93
+ }
94
+ function getAuth() {
95
+ const app = initializeFirebase();
96
+ return app.auth();
97
+ }
98
+ getFirestore();
99
+
100
+ // src/lib/logger.ts
101
+ var colors = {
102
+ debug: "\x1B[36m",
103
+ // Cyan
104
+ info: "\x1B[32m",
105
+ // Green
106
+ warn: "\x1B[33m",
107
+ // Yellow
108
+ error: "\x1B[31m",
109
+ // Red
110
+ reset: "\x1B[0m"
111
+ };
112
+ var shouldLog = (level) => {
113
+ const levels = ["debug", "info", "warn", "error"];
114
+ const minLevel = env.NODE_ENV === "production" ? "info" : "debug";
115
+ return levels.indexOf(level) >= levels.indexOf(minLevel);
116
+ };
117
+ var formatMessage = (level, message, meta) => {
118
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString();
119
+ const color = colors[level];
120
+ const prefix = `${color}[${level.toUpperCase()}]${colors.reset}`;
121
+ const metaStr = meta ? ` ${JSON.stringify(meta)}` : "";
122
+ return `${timestamp} ${prefix} ${message}${metaStr}`;
123
+ };
124
+ var logger = {
125
+ debug: (message, meta) => {
126
+ if (shouldLog("debug")) {
127
+ console.log(formatMessage("debug", message, meta));
128
+ }
129
+ },
130
+ info: (message, meta) => {
131
+ if (shouldLog("info")) {
132
+ console.log(formatMessage("info", message, meta));
133
+ }
134
+ },
135
+ warn: (message, meta) => {
136
+ if (shouldLog("warn")) {
137
+ console.warn(formatMessage("warn", message, meta));
138
+ }
139
+ },
140
+ error: (message, meta) => {
141
+ if (shouldLog("error")) {
142
+ console.error(formatMessage("error", message, meta));
143
+ }
144
+ }
145
+ };
146
+
147
+ // src/lib/eventBus.ts
148
+ var EventBus = class {
149
+ handlers = /* @__PURE__ */ new Map();
150
+ debug;
151
+ constructor(options) {
152
+ this.debug = options?.debug ?? false;
153
+ }
154
+ on(event, handler) {
155
+ if (!this.handlers.has(event)) {
156
+ this.handlers.set(event, /* @__PURE__ */ new Set());
157
+ }
158
+ this.handlers.get(event).add(handler);
159
+ return () => {
160
+ this.handlers.get(event)?.delete(handler);
161
+ };
162
+ }
163
+ off(event, handler) {
164
+ this.handlers.get(event)?.delete(handler);
165
+ }
166
+ emit(event, payload, meta) {
167
+ if (this.debug) {
168
+ console.log(`[EventBus] Emitting ${event}:`, payload);
169
+ }
170
+ const handlers = this.handlers.get(event);
171
+ if (handlers) {
172
+ handlers.forEach((handler) => {
173
+ try {
174
+ handler(payload, meta);
175
+ } catch (err) {
176
+ console.error(`[EventBus] Error in handler for ${event}:`, err);
177
+ }
178
+ });
179
+ }
180
+ }
181
+ clear() {
182
+ this.handlers.clear();
183
+ }
184
+ };
185
+ var serverEventBus = new EventBus({
186
+ debug: process.env.NODE_ENV === "development"
187
+ });
188
+ function emitEntityEvent(entityType, action, payload) {
189
+ const eventType = `${entityType.toUpperCase()}_${action}`;
190
+ serverEventBus.emit(eventType, payload, { orbital: entityType });
191
+ }
192
+ var wss = null;
193
+ function setupEventBroadcast(server, path = "/ws/events") {
194
+ if (wss) {
195
+ logger.warn("[WebSocket] Server already initialized");
196
+ return wss;
197
+ }
198
+ wss = new WebSocketServer({ server, path });
199
+ logger.info(`[WebSocket] Server listening at ${path}`);
200
+ wss.on("connection", (ws, req) => {
201
+ const clientId = req.headers["sec-websocket-key"] || "unknown";
202
+ logger.debug(`[WebSocket] Client connected: ${clientId}`);
203
+ ws.send(
204
+ JSON.stringify({
205
+ type: "CONNECTED",
206
+ timestamp: Date.now(),
207
+ message: "Connected to event stream"
208
+ })
209
+ );
210
+ ws.on("message", (data) => {
211
+ try {
212
+ const message = JSON.parse(data.toString());
213
+ logger.debug(`[WebSocket] Received from ${clientId}:`, message);
214
+ if (message.type && message.payload) {
215
+ serverEventBus.emit(message.type, message.payload, {
216
+ orbital: "client",
217
+ entity: clientId
218
+ });
219
+ }
220
+ } catch (error) {
221
+ logger.error(`[WebSocket] Failed to parse message:`, error);
222
+ }
223
+ });
224
+ ws.on("close", () => {
225
+ logger.debug(`[WebSocket] Client disconnected: ${clientId}`);
226
+ });
227
+ ws.on("error", (error) => {
228
+ logger.error(`[WebSocket] Client error:`, error);
229
+ });
230
+ });
231
+ serverEventBus.on("*", (event) => {
232
+ if (!wss) return;
233
+ const typedEvent = event;
234
+ const message = JSON.stringify({
235
+ type: typedEvent.type,
236
+ payload: typedEvent.payload,
237
+ timestamp: typedEvent.timestamp,
238
+ source: typedEvent.source
239
+ });
240
+ let broadcastCount = 0;
241
+ wss.clients.forEach((client) => {
242
+ if (client.readyState === WebSocket.OPEN) {
243
+ client.send(message);
244
+ broadcastCount++;
245
+ }
246
+ });
247
+ if (broadcastCount > 0) {
248
+ logger.debug(`[WebSocket] Broadcast ${typedEvent.type} to ${broadcastCount} client(s)`);
249
+ }
250
+ });
251
+ return wss;
252
+ }
253
+ function getWebSocketServer() {
254
+ return wss;
255
+ }
256
+ function closeWebSocketServer() {
257
+ return new Promise((resolve, reject) => {
258
+ if (!wss) {
259
+ resolve();
260
+ return;
261
+ }
262
+ wss.close((err) => {
263
+ if (err) {
264
+ reject(err);
265
+ } else {
266
+ wss = null;
267
+ resolve();
268
+ }
269
+ });
270
+ });
271
+ }
272
+ function getConnectedClientCount() {
273
+ if (!wss) return 0;
274
+ return wss.clients.size;
275
+ }
276
+
277
+ export { closeWebSocketServer, emitEntityEvent, env, getAuth, getConnectedClientCount, getFirestore, getWebSocketServer, logger, serverEventBus, setupEventBroadcast };
278
+ //# sourceMappingURL=index.js.map
279
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/env.ts","../../src/lib/db.ts","../../src/lib/logger.ts","../../src/lib/eventBus.ts","../../src/lib/websocket.ts"],"names":["db"],"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","/**\n * Database Configuration\n * \n * Supports both Prisma (SQL) and Firebase Admin (Firestore)\n * Generated apps can use either depending on the database option\n */\n\nimport admin from 'firebase-admin';\nimport { env } from './env.js';\n\n// ============ Firebase Admin / Firestore ============\n\nlet firebaseApp: admin.app.App | null = null;\n\n/**\n * Initialize Firebase Admin SDK\n */\nfunction initializeFirebase(): admin.app.App {\n if (firebaseApp) {\n return firebaseApp;\n }\n\n // Check if already initialized\n if (admin.apps.length > 0) {\n firebaseApp = admin.apps[0]!;\n return firebaseApp;\n }\n\n // Check for emulator mode FIRST (no credentials needed)\n if (env.FIRESTORE_EMULATOR_HOST) {\n // Emulator mode - no credentials needed\n firebaseApp = admin.initializeApp({\n projectId: env.FIREBASE_PROJECT_ID || 'demo-project',\n });\n console.log(`🔧 Firebase Admin initialized for emulator: ${env.FIRESTORE_EMULATOR_HOST}`);\n return firebaseApp;\n }\n\n // Production mode - need credentials\n const serviceAccountPath = env.FIREBASE_SERVICE_ACCOUNT_PATH;\n \n if (serviceAccountPath) {\n // Use service account file\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const serviceAccount = require(serviceAccountPath);\n firebaseApp = admin.initializeApp({\n credential: admin.credential.cert(serviceAccount),\n projectId: env.FIREBASE_PROJECT_ID,\n });\n } else if (env.FIREBASE_PROJECT_ID && env.FIREBASE_CLIENT_EMAIL && env.FIREBASE_PRIVATE_KEY) {\n // Use inline service account credentials\n firebaseApp = admin.initializeApp({\n credential: admin.credential.cert({\n projectId: env.FIREBASE_PROJECT_ID,\n clientEmail: env.FIREBASE_CLIENT_EMAIL,\n privateKey: env.FIREBASE_PRIVATE_KEY.replace(/\\\\n/g, '\\n'),\n }),\n projectId: env.FIREBASE_PROJECT_ID,\n });\n } else if (env.FIREBASE_PROJECT_ID) {\n // Use application default credentials (for Cloud Run, etc.)\n firebaseApp = admin.initializeApp({\n credential: admin.credential.applicationDefault(),\n projectId: env.FIREBASE_PROJECT_ID,\n });\n } else {\n // Emulator mode - use default credentials\n firebaseApp = admin.initializeApp({\n projectId: 'demo-project',\n });\n }\n\n return firebaseApp;\n}\n\n/**\n * Get Firestore instance\n */\nexport function getFirestore(): admin.firestore.Firestore {\n const app = initializeFirebase();\n const db = app.firestore();\n \n // Connect to emulator if configured\n if (env.FIRESTORE_EMULATOR_HOST) {\n db.settings({\n host: env.FIRESTORE_EMULATOR_HOST,\n ssl: false,\n });\n }\n \n return db;\n}\n\n/**\n * Get Firebase Auth instance\n */\nexport function getAuth(): admin.auth.Auth {\n const app = initializeFirebase();\n return app.auth();\n}\n\n// ============ Prisma (Optional - for SQL databases) ============\n\n// Uncomment if using Prisma with SQL database\n/*\nimport { PrismaClient } from '@prisma/client';\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __db: PrismaClient | undefined;\n}\n\nconst createPrismaClient = () => {\n return new PrismaClient({\n log: env.NODE_ENV === 'development' ? ['query', 'error', 'warn'] : ['error'],\n });\n};\n\nexport const db = globalThis.__db ?? createPrismaClient();\n\nif (env.NODE_ENV !== 'production') {\n globalThis.__db = db;\n}\n*/\n\n// Re-export admin for convenience\nexport { admin };\n\n// Export db instance for handler convenience\nexport const db = getFirestore();\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 * Server EventBus - Singleton for server-side cross-trait communication\n *\n * This EventBus enables:\n * - Server-side trait event emission after CRUD operations\n * - Server-side trait listeners responding to events\n * - Cross-client event broadcast via WebSocket\n *\n * @packageDocumentation\n */\n\ntype EventHandler = (payload: unknown, meta?: Record<string, unknown>) => void;\n\n/**\n * Simple EventBus implementation for server-side events\n */\nexport class EventBus {\n private handlers: Map<string, Set<EventHandler>> = new Map();\n private debug: boolean;\n\n constructor(options?: { debug?: boolean }) {\n this.debug = options?.debug ?? false;\n }\n\n on(event: string, handler: EventHandler): () => void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler);\n\n // Return unsubscribe function\n return () => {\n this.handlers.get(event)?.delete(handler);\n };\n }\n\n off(event: string, handler: EventHandler): void {\n this.handlers.get(event)?.delete(handler);\n }\n\n emit(event: string, payload?: unknown, meta?: Record<string, unknown>): void {\n if (this.debug) {\n console.log(`[EventBus] Emitting ${event}:`, payload);\n }\n\n const handlers = this.handlers.get(event);\n if (handlers) {\n handlers.forEach(handler => {\n try {\n handler(payload, meta);\n } catch (err) {\n console.error(`[EventBus] Error in handler for ${event}:`, err);\n }\n });\n }\n }\n\n clear(): void {\n this.handlers.clear();\n }\n}\n\n/**\n * Singleton EventBus instance for server-side event communication.\n */\nexport const serverEventBus = new EventBus({\n debug: process.env.NODE_ENV === 'development',\n});\n\n/**\n * Type-safe event emission helper\n */\nexport function emitEntityEvent(\n entityType: string,\n action: 'CREATED' | 'UPDATED' | 'DELETED',\n payload: Record<string, unknown>\n): void {\n const eventType = `${entityType.toUpperCase()}_${action}`;\n serverEventBus.emit(eventType, payload, { orbital: entityType });\n}\n","/**\n * WebSocket Event Broadcast - Cross-client event synchronization\n *\n * Broadcasts server-side events to all connected clients via WebSocket.\n * This enables real-time updates across multiple browser clients.\n *\n * @packageDocumentation\n */\n\nimport { WebSocketServer, WebSocket, type RawData } from 'ws';\nimport type { Server, IncomingMessage } from 'http';\nimport { serverEventBus } from './eventBus.js';\nimport { logger } from './logger.js';\n\n/**\n * Event structure for broadcasting\n */\ninterface BroadcastEvent {\n type: string;\n payload?: unknown;\n timestamp?: number;\n source?: Record<string, unknown>;\n}\n\n/**\n * WebSocket server instance (singleton)\n */\nlet wss: WebSocketServer | null = null;\n\n/**\n * Setup WebSocket server for event broadcasting.\n *\n * Listens to all server events via wildcard and broadcasts to connected clients.\n *\n * @param server - HTTP server to attach WebSocket to\n * @param path - WebSocket endpoint path (default: '/ws/events')\n *\n * @example\n * ```typescript\n * import { createServer } from 'http';\n * import { setupEventBroadcast } from '@/lib/websocket';\n *\n * const server = createServer(app);\n * setupEventBroadcast(server);\n * ```\n */\nexport function setupEventBroadcast(server: Server, path: string = '/ws/events'): WebSocketServer {\n if (wss) {\n logger.warn('[WebSocket] Server already initialized');\n return wss;\n }\n\n wss = new WebSocketServer({ server, path });\n\n logger.info(`[WebSocket] Server listening at ${path}`);\n\n // Handle new connections\n wss.on('connection', (ws: WebSocket, req: IncomingMessage) => {\n const clientId = req.headers['sec-websocket-key'] || 'unknown';\n logger.debug(`[WebSocket] Client connected: ${clientId}`);\n\n // Send welcome message\n ws.send(\n JSON.stringify({\n type: 'CONNECTED',\n timestamp: Date.now(),\n message: 'Connected to event stream',\n })\n );\n\n // Handle client messages (for future bidirectional communication)\n ws.on('message', (data: RawData) => {\n try {\n const message = JSON.parse(data.toString());\n logger.debug(`[WebSocket] Received from ${clientId}:`, message);\n\n // Handle client-to-server events if needed\n if (message.type && message.payload) {\n // Emit to server event bus with client source\n serverEventBus.emit(message.type, message.payload, {\n orbital: 'client',\n entity: clientId,\n });\n }\n } catch (error) {\n logger.error(`[WebSocket] Failed to parse message:`, error);\n }\n });\n\n ws.on('close', () => {\n logger.debug(`[WebSocket] Client disconnected: ${clientId}`);\n });\n\n ws.on('error', (error: Error) => {\n logger.error(`[WebSocket] Client error:`, error);\n });\n });\n\n // Subscribe to all server events and broadcast to clients\n serverEventBus.on('*', (event: unknown) => {\n if (!wss) return;\n\n const typedEvent = event as BroadcastEvent;\n const message = JSON.stringify({\n type: typedEvent.type,\n payload: typedEvent.payload,\n timestamp: typedEvent.timestamp,\n source: typedEvent.source,\n });\n\n let broadcastCount = 0;\n wss.clients.forEach((client: WebSocket) => {\n if (client.readyState === WebSocket.OPEN) {\n client.send(message);\n broadcastCount++;\n }\n });\n\n if (broadcastCount > 0) {\n logger.debug(`[WebSocket] Broadcast ${typedEvent.type} to ${broadcastCount} client(s)`);\n }\n });\n\n return wss;\n}\n\n/**\n * Get the WebSocket server instance (for testing or advanced usage)\n */\nexport function getWebSocketServer(): WebSocketServer | null {\n return wss;\n}\n\n/**\n * Close the WebSocket server\n */\nexport function closeWebSocketServer(): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!wss) {\n resolve();\n return;\n }\n\n wss.close((err?: Error) => {\n if (err) {\n reject(err);\n } else {\n wss = null;\n resolve();\n }\n });\n });\n}\n\n/**\n * Get connected client count\n */\nexport function getConnectedClientCount(): number {\n if (!wss) return 0;\n return wss.clients.size;\n}\n"]}
@@ -0,0 +1,71 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ import { AnyZodObject } from 'zod';
3
+
4
+ /**
5
+ * Base application error class
6
+ */
7
+ declare class AppError extends Error {
8
+ statusCode: number;
9
+ message: string;
10
+ code?: string | undefined;
11
+ constructor(statusCode: number, message: string, code?: string | undefined);
12
+ }
13
+ /**
14
+ * 404 Not Found error
15
+ */
16
+ declare class NotFoundError extends AppError {
17
+ constructor(message?: string);
18
+ }
19
+ /**
20
+ * 400 Bad Request / Validation error
21
+ */
22
+ declare class ValidationError extends AppError {
23
+ constructor(message?: string);
24
+ }
25
+ /**
26
+ * 401 Unauthorized error
27
+ */
28
+ declare class UnauthorizedError extends AppError {
29
+ constructor(message?: string);
30
+ }
31
+ /**
32
+ * 403 Forbidden error
33
+ */
34
+ declare class ForbiddenError extends AppError {
35
+ constructor(message?: string);
36
+ }
37
+ /**
38
+ * 409 Conflict error
39
+ */
40
+ declare class ConflictError extends AppError {
41
+ constructor(message?: string);
42
+ }
43
+ /**
44
+ * Global error handler middleware
45
+ */
46
+ declare const errorHandler: (err: Error, _req: Request, res: Response, _next: NextFunction) => void;
47
+ /**
48
+ * Async handler wrapper to catch errors in async route handlers
49
+ */
50
+ declare const asyncHandler: (fn: (req: Request, res: Response, next: NextFunction) => Promise<unknown>) => (req: Request, res: Response, next: NextFunction) => void;
51
+ /**
52
+ * 404 handler for unmatched routes
53
+ */
54
+ declare const notFoundHandler: (req: Request, res: Response) => void;
55
+
56
+ /**
57
+ * Middleware to validate request body against a Zod schema
58
+ */
59
+ declare const validateBody: (schema: AnyZodObject) => (req: Request, res: Response, next: NextFunction) => Promise<void>;
60
+ /**
61
+ * Middleware to validate request query parameters against a Zod schema
62
+ */
63
+ declare const validateQuery: (schema: AnyZodObject) => (req: Request, res: Response, next: NextFunction) => Promise<void>;
64
+ /**
65
+ * Middleware to validate request params against a Zod schema
66
+ */
67
+ declare const validateParams: (schema: AnyZodObject) => (req: Request, res: Response, next: NextFunction) => Promise<void>;
68
+
69
+ declare function authenticateFirebase(req: Request, res: Response, next: NextFunction): Promise<void | Response<any, Record<string, any>>>;
70
+
71
+ export { AppError, ConflictError, ForbiddenError, NotFoundError, UnauthorizedError, ValidationError, asyncHandler, authenticateFirebase, errorHandler, notFoundHandler, validateBody, validateParams, validateQuery };