{"version":3,"file":"mock-api.mjs","sources":["../../../src/lib/api/mock-api.ts"],"sourcesContent":["/**\n * @file Mock API System\n * @description Comprehensive mock API server for development and testing with\n * request/response mocking, configurable delays, error simulation, and route matching.\n *\n * This module provides:\n * - Mock server that intercepts fetch requests\n * - Route definition with path parameter support\n * - Configurable response delays for realistic testing\n * - Error simulation with probability controls\n * - Persistent mock data storage\n * - Request logging for debugging\n * - Factory functions for common mock data patterns\n *\n * @example\n * ```typescript\n * import { MockServer, createMockServer, mockHandlers } from '@/lib/api';\n *\n * // Create mock server\n * const server = createMockServer({\n *   logging: true,\n *   defaultDelay: [100, 300],\n * });\n *\n * // Register routes\n * server.get('/users', () => ({\n *   status: 200,\n *   data: [{ id: '1', name: 'John' }],\n * }));\n *\n * server.get('/users/:id', (req) => ({\n *   status: 200,\n *   data: { id: req.pathParams.id, name: 'John' },\n * }));\n *\n * // Enable mocking\n * server.start();\n *\n * // Later: disable\n * server.stop();\n * ```\n */\n\nimport type {\n  HttpMethod,\n  MockHandler,\n  MockRequest,\n  MockResponse,\n  MockRoute,\n  MockServerConfig,\n  QueryParams,\n} from './types';\nimport { isDev } from '@/lib/core/config/env-helper';\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Route matcher result\n */\ninterface RouteMatch<TRequest = unknown, TResponse = unknown> {\n  route: MockRoute<TRequest, TResponse>;\n  pathParams: Record<string, string>;\n}\n\n/**\n * Request log entry\n */\nexport interface MockRequestLog {\n  timestamp: number;\n  method: HttpMethod;\n  url: string;\n  pathParams: Record<string, string>;\n  queryParams: QueryParams;\n  body: unknown;\n  response: MockResponse;\n  duration: number;\n}\n\n/**\n * Mock data store entry\n */\ninterface DataStoreEntry<T = unknown> {\n  data: T;\n  createdAt: number;\n  updatedAt: number;\n}\n\n// =============================================================================\n// MOCK SERVER CLASS\n// =============================================================================\n\n/**\n * Mock API server for intercepting and handling fetch requests\n */\nexport class MockServer {\n  private routes: MockRoute[] = [];\n  private config: Required<MockServerConfig>;\n  private originalFetch: typeof fetch | null = null;\n  private isActive = false;\n  private requestLog: MockRequestLog[] = [];\n  private dataStore: Map<string, DataStoreEntry> = new Map();\n\n  constructor(config: MockServerConfig = {}) {\n    this.config = {\n      baseUrl: config.baseUrl != null && config.baseUrl !== '' ? config.baseUrl : '',\n      defaultDelay: config.defaultDelay ?? [50, 200],\n      defaultErrorRate: config.defaultErrorRate ?? 0,\n      logging: config.logging ?? isDev(),\n      notFoundHandler:\n        config.notFoundHandler ??\n        (() => ({\n          status: 404,\n          data: { error: 'Not Found', message: 'No mock handler registered for this route' },\n        })),\n    };\n  }\n\n  // ===========================================================================\n  // ROUTE REGISTRATION\n  // ===========================================================================\n\n  /**\n   * Register a GET route\n   */\n  get<TResponse = unknown>(\n    path: string,\n    handler: MockHandler<never, TResponse>,\n    options?: Partial<MockRoute>\n  ): this {\n    return this.route('GET', path, handler, options);\n  }\n\n  /**\n   * Register a POST route\n   */\n  post<TRequest = unknown, TResponse = unknown>(\n    path: string,\n    handler: MockHandler<TRequest, TResponse>,\n    options?: Partial<MockRoute>\n  ): this {\n    return this.route('POST', path, handler, options);\n  }\n\n  /**\n   * Register a PUT route\n   */\n  put<TRequest = unknown, TResponse = unknown>(\n    path: string,\n    handler: MockHandler<TRequest, TResponse>,\n    options?: Partial<MockRoute>\n  ): this {\n    return this.route('PUT', path, handler, options);\n  }\n\n  /**\n   * Register a PATCH route\n   */\n  patch<TRequest = unknown, TResponse = unknown>(\n    path: string,\n    handler: MockHandler<TRequest, TResponse>,\n    options?: Partial<MockRoute>\n  ): this {\n    return this.route('PATCH', path, handler, options);\n  }\n\n  /**\n   * Register a DELETE route\n   */\n  delete<TResponse = unknown>(\n    path: string,\n    handler: MockHandler<never, TResponse>,\n    options?: Partial<MockRoute>\n  ): this {\n    return this.route('DELETE', path, handler, options);\n  }\n\n  /**\n   * Register a route with any method\n   */\n  route<TRequest = unknown, TResponse = unknown>(\n    method: HttpMethod,\n    path: string,\n    handler: MockHandler<TRequest, TResponse>,\n    options: Partial<MockRoute> = {}\n  ): this {\n    this.routes.push({\n      method,\n      path,\n      handler: handler as MockHandler,\n      delay: options.delay,\n      errorRate: options.errorRate,\n    });\n    return this;\n  }\n\n  /**\n   * Register multiple routes at once\n   */\n  register(routes: MockRoute[]): this {\n    this.routes.push(...routes);\n    return this;\n  }\n\n  /**\n   * Remove a route\n   */\n  removeRoute(method: HttpMethod, path: string): this {\n    this.routes = this.routes.filter((r) => !(r.method === method && r.path === path));\n    return this;\n  }\n\n  /**\n   * Clear all routes\n   */\n  clearRoutes(): this {\n    this.routes = [];\n    return this;\n  }\n\n  // ===========================================================================\n  // SERVER CONTROL\n  // ===========================================================================\n\n  /**\n   * Start the mock server (intercept fetch)\n   */\n  start(): this {\n    if (this.isActive) {\n      console.warn('[MockServer] Server is already running');\n      return this;\n    }\n\n    this.originalFetch = globalThis.fetch;\n    globalThis.fetch = this.interceptFetch.bind(this);\n    this.isActive = true;\n\n    if (this.config.logging) {\n      console.info('[MockServer] Started - intercepting fetch requests');\n    }\n\n    return this;\n  }\n\n  /**\n   * Stop the mock server (restore fetch)\n   */\n  stop(): this {\n    if (!this.isActive || !this.originalFetch) {\n      console.warn('[MockServer] Server is not running');\n      return this;\n    }\n\n    globalThis.fetch = this.originalFetch;\n    this.originalFetch = null;\n    this.isActive = false;\n\n    if (this.config.logging) {\n      console.info('[MockServer] Stopped - fetch restored');\n    }\n\n    return this;\n  }\n\n  /**\n   * Check if server is active\n   */\n  isRunning(): boolean {\n    return this.isActive;\n  }\n\n  // ===========================================================================\n  // DATA STORE\n  // ===========================================================================\n\n  /**\n   * Set data in the mock store\n   */\n  setData<T>(key: string, data: T): this {\n    const now = Date.now();\n    const existing = this.dataStore.get(key);\n\n    this.dataStore.set(key, {\n      data,\n      createdAt: existing?.createdAt ?? now,\n      updatedAt: now,\n    });\n\n    return this;\n  }\n\n  /**\n   * Get data from the mock store\n   */\n  getData<T>(key: string): T | undefined {\n    return this.dataStore.get(key)?.data as T | undefined;\n  }\n\n  /**\n   * Delete data from the mock store\n   */\n  deleteData(key: string): boolean {\n    return this.dataStore.delete(key);\n  }\n\n  /**\n   * Clear all data from the mock store\n   */\n  clearData(): this {\n    this.dataStore.clear();\n    return this;\n  }\n\n  /**\n   * Initialize data store with seed data\n   */\n  seedData(data: Record<string, unknown>): this {\n    for (const [key, value] of Object.entries(data)) {\n      this.setData(key, value);\n    }\n    return this;\n  }\n\n  // ===========================================================================\n  // REQUEST LOG\n  // ===========================================================================\n\n  /**\n   * Get request log\n   */\n  getRequestLog(): MockRequestLog[] {\n    return [...this.requestLog];\n  }\n\n  /**\n   * Clear request log\n   */\n  clearRequestLog(): this {\n    this.requestLog = [];\n    return this;\n  }\n\n  /**\n   * Get last request\n   */\n  getLastRequest(): MockRequestLog | undefined {\n    return this.requestLog[this.requestLog.length - 1];\n  }\n\n  /**\n   * Get requests by method\n   */\n  getRequestsByMethod(method: HttpMethod): MockRequestLog[] {\n    return this.requestLog.filter((r) => r.method === method);\n  }\n\n  /**\n   * Get requests by path pattern\n   */\n  getRequestsByPath(pathPattern: string | RegExp): MockRequestLog[] {\n    return this.requestLog.filter((r) => {\n      if (typeof pathPattern === 'string') {\n        return r.url.includes(pathPattern);\n      }\n      return pathPattern.test(r.url);\n    });\n  }\n\n  // ===========================================================================\n  // PRIVATE METHODS\n  // ===========================================================================\n\n  /**\n   * Intercept and handle fetch requests\n   */\n  private async interceptFetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n    const startTime = Date.now();\n\n    // Parse request\n    let url: string;\n    if (typeof input === 'string') {\n      url = input;\n    } else if (input instanceof URL) {\n      url = input.href;\n    } else {\n      // eslint-disable-next-line prefer-destructuring\n      url = input.url;\n    }\n    const method = ((init?.method ?? 'GET') as HttpMethod).toUpperCase() as HttpMethod;\n\n    // Check if URL should be mocked\n    if (!this.shouldMock(url)) {\n      if (this.originalFetch == null) {\n        throw new Error('Original fetch not available');\n      }\n      return this.originalFetch(input, init);\n    }\n\n    // Parse URL\n    const parsedUrl = new URL(url, 'http://localhost');\n    const path = parsedUrl.pathname;\n    const queryParams = Object.fromEntries(parsedUrl.searchParams);\n\n    // Parse body\n    let body: unknown;\n    if (init?.body !== null && init?.body !== undefined) {\n      try {\n        body = typeof init.body === 'string' ? JSON.parse(init.body) : init.body;\n      } catch {\n        // eslint-disable-next-line prefer-destructuring\n        body = init.body;\n      }\n    }\n\n    // Find matching route\n    const match = this.matchRoute(method, path);\n\n    if (!match) {\n      if (this.config.logging) {\n        console.warn(`[MockServer] No handler for ${method} ${path}`);\n      }\n\n      // Use 404 handler\n      const notFoundResponse = await this.config.notFoundHandler({\n        method,\n        url,\n        path,\n        pathParams: {},\n        queryParams,\n        headers: this.parseHeaders(init?.headers),\n        body,\n      });\n\n      return this.createResponse(notFoundResponse);\n    }\n\n    const { route, pathParams } = match;\n\n    // Build mock request\n    const mockRequest: MockRequest = {\n      method,\n      url,\n      path,\n      pathParams,\n      queryParams,\n      headers: this.parseHeaders(init?.headers),\n      body,\n    };\n\n    // Check for simulated error\n    const errorRate = route.errorRate ?? this.config.defaultErrorRate;\n    if (errorRate > 0 && Math.random() < errorRate) {\n      const errorResponse: MockResponse = {\n        status: 500,\n        data: { error: 'Internal Server Error', message: 'Simulated error' },\n      };\n\n      this.logRequest(mockRequest, errorResponse, startTime);\n      return this.createResponse(errorResponse);\n    }\n\n    // Execute handler\n    try {\n      const response = await route.handler(mockRequest);\n\n      // Apply delay\n      const delay = this.calculateDelay(route.delay);\n      if (delay > 0) {\n        await this.sleep(delay);\n      }\n\n      // Handle timeout simulation\n      if (response.timeout === true) {\n        throw new DOMException('The operation was aborted.', 'AbortError');\n      }\n\n      // Handle network error simulation\n      if (response.networkError === true) {\n        throw new TypeError('Failed to fetch');\n      }\n\n      this.logRequest(mockRequest, response, startTime);\n      return this.createResponse(response);\n    } catch (error) {\n      if (this.config.logging) {\n        console.error(`[MockServer] Handler error for ${method} ${path}:`, error);\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Check if URL should be mocked\n   */\n  private shouldMock(url: string): boolean {\n    if (!this.config.baseUrl) return true;\n    return url.startsWith(this.config.baseUrl);\n  }\n\n  /**\n   * Match a route by method and path\n   */\n  private matchRoute(method: HttpMethod, path: string): RouteMatch | null {\n    for (const route of this.routes) {\n      if (route.method !== method) continue;\n\n      const pathParams = this.matchPath(route.path, path);\n      if (pathParams !== null) {\n        return { route, pathParams };\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Match path pattern and extract params\n   */\n  private matchPath(pattern: string, path: string): Record<string, string> | null {\n    const patternParts = pattern.split('/').filter(Boolean);\n    const pathParts = path.split('/').filter(Boolean);\n\n    if (patternParts.length !== pathParts.length) {\n      return null;\n    }\n\n    const params: Record<string, string> = {};\n\n    for (let i = 0; i < patternParts.length; i++) {\n      const patternPart = patternParts[i];\n      const pathPart = pathParts[i];\n\n      if (patternPart === null || patternPart === undefined || patternPart === '') continue;\n\n      if (patternPart.startsWith(':')) {\n        // Parameter match\n        const paramName = patternPart.slice(1);\n        if (paramName !== null && paramName !== undefined && paramName !== '') {\n          params[paramName] = decodeURIComponent(pathPart ?? '');\n        }\n      } else if (patternPart === '*') {\n        // Wildcard match\n      } else if (patternPart !== pathPart) {\n        // Exact match failed\n        return null;\n      }\n    }\n\n    return params;\n  }\n\n  /**\n   * Parse request headers\n   */\n  private parseHeaders(headers?: HeadersInit): Record<string, string> {\n    const result: Record<string, string> = {};\n\n    if (!headers) return result;\n\n    if (headers instanceof Headers) {\n      headers.forEach((value, key) => {\n        result[key] = value;\n      });\n    } else if (Array.isArray(headers)) {\n      for (const [key, value] of headers) {\n        result[key] = value;\n      }\n    } else {\n      Object.assign(result, headers);\n    }\n\n    return result;\n  }\n\n  /**\n   * Calculate delay from range\n   */\n  private calculateDelay(range?: [number, number]): number {\n    const [min, max] = range ?? this.config.defaultDelay;\n    return Math.floor(Math.random() * (max - min + 1)) + min;\n  }\n\n  /**\n   * Create Response object from mock response\n   */\n  private createResponse(mockResponse: MockResponse): Response {\n    const { status = 200, statusText, headers = {}, data } = mockResponse;\n\n    const responseBody = data !== undefined ? JSON.stringify(data) : null;\n\n    const responseHeaders = new Headers({\n      'Content-Type': 'application/json',\n      ...headers,\n    });\n\n    return new Response(responseBody, {\n      status,\n      statusText: statusText ?? this.getStatusText(status),\n      headers: responseHeaders,\n    });\n  }\n\n  /**\n   * Get default status text for status code\n   */\n  private getStatusText(status: number): string {\n    const texts: Record<number, string> = {\n      200: 'OK',\n      201: 'Created',\n      204: 'No Content',\n      400: 'Bad Request',\n      401: 'Unauthorized',\n      403: 'Forbidden',\n      404: 'Not Found',\n      409: 'Conflict',\n      422: 'Unprocessable Entity',\n      429: 'Too Many Requests',\n      500: 'Internal Server Error',\n      502: 'Bad Gateway',\n      503: 'Service Unavailable',\n    };\n    return texts[status] ?? 'Unknown';\n  }\n\n  /**\n   * Log request to history\n   */\n  private logRequest(request: MockRequest, response: MockResponse, startTime: number): void {\n    const duration = Date.now() - startTime;\n\n    const logEntry: MockRequestLog = {\n      timestamp: startTime,\n      method: request.method,\n      url: request.url,\n      pathParams: request.pathParams,\n      queryParams: request.queryParams,\n      body: request.body,\n      response,\n      duration,\n    };\n\n    this.requestLog.push(logEntry);\n\n    if (this.config.logging) {\n      console.info(\n        `[MockServer] ${request.method} ${request.path} -> ${response.status} (${duration}ms)`\n      );\n    }\n  }\n\n  /**\n   * Sleep utility\n   */\n  private async sleep(ms: number): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n  }\n}\n\n// =============================================================================\n// FACTORY FUNCTIONS\n// =============================================================================\n\n/**\n * Create a new mock server instance\n *\n * @example\n * ```typescript\n * const server = createMockServer({\n *   baseUrl: 'http://localhost:3000/api',\n *   logging: true,\n *   defaultDelay: [50, 150],\n * });\n * ```\n */\nexport function createMockServer(config?: MockServerConfig): MockServer {\n  return new MockServer(config);\n}\n\n// =============================================================================\n// MOCK HANDLER FACTORIES\n// =============================================================================\n\n/**\n * Create a success response handler\n *\n * @example\n * ```typescript\n * server.get('/users', mockHandlers.success([\n *   { id: '1', name: 'John' },\n *   { id: '2', name: 'Jane' },\n * ]));\n * ```\n */\nexport const mockHandlers = {\n  /**\n   * Create success response\n   */\n  success: <T>(data: T, options: { status?: number; headers?: Record<string, string> } = {}) => {\n    return (): MockResponse<T> => ({\n      status: options.status ?? 200,\n      data,\n      headers: options.headers,\n    });\n  },\n\n  /**\n   * Create created response (201)\n   */\n  created: <T>(data: T) => {\n    return (): MockResponse<T> => ({\n      status: 201,\n      data,\n    });\n  },\n\n  /**\n   * Create no content response (204)\n   */\n  noContent: () => {\n    return (): MockResponse<void> => ({\n      status: 204,\n    });\n  },\n\n  /**\n   * Create error response\n   */\n  error: (status: number, message: string, options: { code?: string; details?: unknown } = {}) => {\n    return (): MockResponse => ({\n      status,\n      data: {\n        error: options.code ?? `HTTP_${status}`,\n        message,\n        details: options.details,\n      },\n    });\n  },\n\n  /**\n   * Create validation error response\n   */\n  validationError: (errors: Array<{ field: string; message: string }>) => {\n    return (): MockResponse => ({\n      status: 422,\n      data: {\n        error: 'VALIDATION_ERROR',\n        message: 'Validation failed',\n        errors,\n      },\n    });\n  },\n\n  /**\n   * Create not found response\n   */\n  notFound: (message = 'Resource not found') => {\n    return (): MockResponse => ({\n      status: 404,\n      data: {\n        error: 'NOT_FOUND',\n        message,\n      },\n    });\n  },\n\n  /**\n   * Create unauthorized response\n   */\n  unauthorized: (message = 'Unauthorized') => {\n    return (): MockResponse => ({\n      status: 401,\n      data: {\n        error: 'UNAUTHORIZED',\n        message,\n      },\n    });\n  },\n\n  /**\n   * Create forbidden response\n   */\n  forbidden: (message = 'Forbidden') => {\n    return (): MockResponse => ({\n      status: 403,\n      data: {\n        error: 'FORBIDDEN',\n        message,\n      },\n    });\n  },\n\n  /**\n   * Create rate limited response\n   */\n  rateLimited: (retryAfter = 60) => {\n    return (): MockResponse => ({\n      status: 429,\n      data: {\n        error: 'RATE_LIMITED',\n        message: 'Too many requests',\n        retryAfter,\n      },\n      headers: {\n        'Retry-After': String(retryAfter),\n      },\n    });\n  },\n\n  /**\n   * Create network error simulation\n   */\n  networkError: () => {\n    return (): MockResponse => ({\n      status: 0,\n      networkError: true,\n    });\n  },\n\n  /**\n   * Create timeout simulation\n   */\n  timeout: () => {\n    return (): MockResponse => ({\n      status: 0,\n      timeout: true,\n    });\n  },\n\n  /**\n   * Create delayed response\n   */\n  delayed: <T>(data: T, delayMs: number) => {\n    return (): MockResponse<T> => ({\n      status: 200,\n      data,\n      delay: delayMs,\n    });\n  },\n\n  /**\n   * Create paginated response\n   */\n  paginated: <T>(items: T[], meta: { page: number; pageSize: number; total: number }) => {\n    return (): MockResponse => ({\n      status: 200,\n      data: {\n        items,\n        pagination: {\n          page: meta.page,\n          pageSize: meta.pageSize,\n          total: meta.total,\n          totalPages: Math.ceil(meta.total / meta.pageSize),\n          hasMore: meta.page * meta.pageSize < meta.total,\n        },\n      },\n    });\n  },\n\n  /**\n   * Create conditional response based on request\n   */\n  conditional: <TRequest = unknown, TResponse = unknown>(\n    conditions: Array<{\n      when: (req: MockRequest<TRequest>) => boolean;\n      then: MockResponse<TResponse>;\n    }>,\n    defaultResponse: MockResponse<TResponse>\n  ) => {\n    return (req: MockRequest<TRequest>): MockResponse<TResponse> => {\n      for (const condition of conditions) {\n        if (condition.when(req)) {\n          return condition.then;\n        }\n      }\n      return defaultResponse;\n    };\n  },\n};\n\n// =============================================================================\n// MOCK DATA GENERATORS\n// =============================================================================\n\n/**\n * Generate mock data utilities\n */\nexport const mockData = {\n  /**\n   * Generate a unique ID\n   */\n  id: (): string => {\n    return `${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n  },\n\n  /**\n   * Generate a UUID v4\n   */\n  uuid: (): string => {\n    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n      const r = (Math.random() * 16) | 0;\n      const v = c === 'x' ? r : (r & 0x3) | 0x8;\n      return v.toString(16);\n    });\n  },\n\n  /**\n   * Generate a random integer\n   */\n  int: (min: number, max: number): number => {\n    return Math.floor(Math.random() * (max - min + 1)) + min;\n  },\n\n  /**\n   * Generate a random boolean\n   */\n  bool: (probability = 0.5): boolean => {\n    return Math.random() < probability;\n  },\n\n  /**\n   * Pick a random item from array\n   */\n  pick: <T>(items: T[]): T => {\n    const item = items[Math.floor(Math.random() * items.length)];\n    if (item === undefined) {\n      throw new Error('Cannot pick from empty array');\n    }\n    return item;\n  },\n\n  /**\n   * Pick multiple random items from array\n   */\n  pickMany: <T>(items: T[], count: number): T[] => {\n    const shuffled = [...items].sort(() => Math.random() - 0.5);\n    return shuffled.slice(0, count);\n  },\n\n  /**\n   * Generate a random date within range\n   */\n  date: (start: Date, end: Date): Date => {\n    const startTime = start.getTime();\n    const endTime = end.getTime();\n    return new Date(startTime + Math.random() * (endTime - startTime));\n  },\n\n  /**\n   * Generate a random email\n   */\n  email: (domain = 'example.com'): string => {\n    const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';\n    let name = '';\n    for (let i = 0; i < 8; i++) {\n      name += chars[Math.floor(Math.random() * chars.length)];\n    }\n    return `${name}@${domain}`;\n  },\n\n  /**\n   * Generate a random name\n   */\n  name: (): string => {\n    const firstNames = ['John', 'Jane', 'Michael', 'Sarah', 'David', 'Emily', 'James', 'Emma'];\n    const lastNames = [\n      'Smith',\n      'Johnson',\n      'Williams',\n      'Brown',\n      'Jones',\n      'Davis',\n      'Miller',\n      'Wilson',\n    ];\n    return `${mockData.pick(firstNames)} ${mockData.pick(lastNames)}`;\n  },\n\n  /**\n   * Generate array of items\n   */\n  array: <T>(generator: (index: number) => T, count: number): T[] => {\n    return Array.from({ length: count }, (_, i) => generator(i));\n  },\n\n  /**\n   * Generate ISO timestamp\n   */\n  timestamp: (): string => {\n    return new Date().toISOString();\n  },\n\n  /**\n   * Generate past timestamp\n   */\n  pastTimestamp: (daysAgo: number): string => {\n    const date = new Date();\n    date.setDate(date.getDate() - daysAgo);\n    return date.toISOString();\n  },\n};\n\n// =============================================================================\n// CRUD HANDLER FACTORY\n// =============================================================================\n\n/**\n * Create a complete CRUD handler set for a resource\n *\n * @example\n * ```typescript\n * const { routes, data } = createCrudHandlers<User>({\n *   basePath: '/users',\n *   initialData: [\n *     { id: '1', name: 'John', email: 'john@example.com' },\n *   ],\n *   generateId: () => mockData.uuid(),\n *   validate: (user) => {\n *     if (!user.name) return { field: 'name', message: 'Name is required' };\n *     return null;\n *   },\n * });\n *\n * server.register(routes);\n * ```\n */\nexport function createCrudHandlers<T extends { id: string }>(config: {\n  basePath: string;\n  initialData?: T[];\n  generateId?: () => string;\n  validate?: (data: Partial<T>) => { field: string; message: string } | null;\n  searchFields?: (keyof T)[];\n}): {\n  routes: MockRoute[];\n  getData: () => T[];\n  setData: (data: T[]) => void;\n  findById: (id: string) => T | undefined;\n} {\n  const {\n    basePath,\n    initialData = [],\n    generateId = mockData.uuid,\n    validate,\n    searchFields = [],\n  } = config;\n\n  let data: T[] = [...initialData];\n\n  const routes: MockRoute[] = [\n    // List\n    {\n      method: 'GET',\n      path: basePath,\n      handler: (req) => {\n        let filtered = [...data];\n\n        // Search\n        const search = req.queryParams.search as string | undefined;\n        if (search !== null && search !== undefined && search !== '' && searchFields.length > 0) {\n          const searchLower = search.toLowerCase();\n          filtered = filtered.filter((item) =>\n            searchFields.some((field) => {\n              const value = item[field];\n              return String(value).toLowerCase().includes(searchLower);\n            })\n          );\n        }\n\n        // Pagination\n        const page = parseInt(req.queryParams.page as string, 10) || 1;\n        const pageSize = parseInt(req.queryParams.pageSize as string, 10) || 20;\n        const start = (page - 1) * pageSize;\n        const items = filtered.slice(start, start + pageSize);\n\n        return {\n          status: 200,\n          data: {\n            items,\n            pagination: {\n              page,\n              pageSize,\n              total: filtered.length,\n              totalPages: Math.ceil(filtered.length / pageSize),\n              hasMore: start + pageSize < filtered.length,\n            },\n          },\n        };\n      },\n    },\n\n    // Get by ID\n    {\n      method: 'GET',\n      path: `${basePath}/:id`,\n      handler: (req) => {\n        const item = data.find((d) => d.id === req.pathParams.id);\n        if (!item) {\n          return {\n            status: 404,\n            data: { error: 'NOT_FOUND', message: 'Resource not found' },\n          };\n        }\n        return { status: 200, data: item };\n      },\n    },\n\n    // Create\n    {\n      method: 'POST',\n      path: basePath,\n      handler: (req) => {\n        const body = req.body as Partial<T>;\n\n        // Validate\n        if (validate) {\n          const error = validate(body);\n          if (error) {\n            return {\n              status: 422,\n              data: { error: 'VALIDATION_ERROR', message: 'Validation failed', errors: [error] },\n            };\n          }\n        }\n\n        const newItem = { ...body, id: generateId() } as T;\n        data.push(newItem);\n\n        return { status: 201, data: newItem };\n      },\n    },\n\n    // Update\n    {\n      method: 'PATCH',\n      path: `${basePath}/:id`,\n      handler: (req) => {\n        const index = data.findIndex((d) => d.id === req.pathParams.id);\n        if (index === -1) {\n          return {\n            status: 404,\n            data: { error: 'NOT_FOUND', message: 'Resource not found' },\n          };\n        }\n\n        const body = req.body as Partial<T>;\n\n        // Validate\n        if (validate) {\n          const error = validate(body);\n          if (error) {\n            return {\n              status: 422,\n              data: { error: 'VALIDATION_ERROR', message: 'Validation failed', errors: [error] },\n            };\n          }\n        }\n\n        const updated = { ...data[index], ...body };\n        data[index] = updated as T;\n\n        return { status: 200, data: updated };\n      },\n    },\n\n    // Delete\n    {\n      method: 'DELETE',\n      path: `${basePath}/:id`,\n      handler: (req) => {\n        const index = data.findIndex((d) => d.id === req.pathParams.id);\n        if (index === -1) {\n          return {\n            status: 404,\n            data: { error: 'NOT_FOUND', message: 'Resource not found' },\n          };\n        }\n\n        data.splice(index, 1);\n        return { status: 204 };\n      },\n    },\n  ];\n\n  return {\n    routes,\n    getData: () => [...data],\n    setData: (newData: T[]) => {\n      data = [...newData];\n    },\n    findById: (id: string) => data.find((d) => d.id === id),\n  };\n}\n\n// =============================================================================\n// SINGLETON INSTANCE\n// =============================================================================\n\n/**\n * Default mock server instance\n */\nexport const mockServer = new MockServer();\n"],"names":["MockServer","config","isDev","path","handler","options","method","routes","key","data","now","existing","value","r","pathPattern","input","init","startTime","url","parsedUrl","queryParams","body","match","notFoundResponse","route","pathParams","mockRequest","errorRate","errorResponse","response","delay","error","pattern","patternParts","pathParts","params","patternPart","pathPart","paramName","headers","result","range","min","max","mockResponse","status","statusText","responseBody","responseHeaders","request","duration","logEntry","ms","resolve","createMockServer","mockHandlers","message","errors","retryAfter","delayMs","items","meta","conditions","defaultResponse","req","condition","mockData","c","probability","item","count","start","end","endTime","domain","chars","name","i","firstNames","lastNames","generator","_","daysAgo","date","createCrudHandlers","basePath","initialData","generateId","validate","searchFields","filtered","search","searchLower","field","page","pageSize","d","newItem","index","updated","newData","id","mockServer"],"mappings":"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"}