{"version":3,"sources":["../src/index.ts","../src/constants/http-status.ts","../src/errors/app-error.ts","../src/errors/http-errors.ts","../src/filters/filters.ts","../src/middleware/async-handler.ts","../src/utils/timestamp.ts","../src/responses/error-response.ts","../src/middleware/error-middleware.ts","../src/middleware/not-found-middleware.ts","../src/middleware/logger.ts","../src/pagination/pagination.ts","../src/responses/paginated-response.ts","../src/responses/success-response.ts","../src/responses/validation-error-response.ts","../src/search/search.ts","../src/sorting/sorting.ts"],"sourcesContent":["export * from \"./constants/http-status\";\r\nexport * from \"./errors/app-error\";\r\nexport * from \"./errors/http-errors\";\r\nexport * from \"./filters/filters\";\r\nexport * from \"./middleware/async-handler\";\r\nexport * from \"./middleware/error-middleware\";\r\nexport * from \"./middleware/not-found-middleware\";\r\nexport * from \"./middleware/logger\";\r\nexport * from \"./pagination/pagination\";\r\nexport * from \"./responses/error-response\";\r\nexport * from \"./responses/paginated-response\";\r\nexport * from \"./responses/success-response\";\r\nexport * from \"./responses/validation-error-response\";\r\nexport * from \"./search/search\";\r\nexport * from \"./sorting/sorting\";\r\nexport * from \"./types/error.types\";\r\nexport * from \"./types/pagination.types\";\r\nexport * from \"./types/query.types\";\r\nexport * from \"./types/response.types\";\r\n","export const HTTP_STATUS = {\r\n  OK: 200,\r\n  CREATED: 201,\r\n  NO_CONTENT: 204,\r\n  BAD_REQUEST: 400,\r\n  UNAUTHORIZED: 401,\r\n  FORBIDDEN: 403,\r\n  NOT_FOUND: 404,\r\n  CONFLICT: 409,\r\n  UNPROCESSABLE_ENTITY: 422,\r\n  INTERNAL_SERVER_ERROR: 500,\r\n  SERVER_ERROR: 500,\r\n} as const;\r\n\r\nexport type HttpStatusCode = (typeof HTTP_STATUS)[keyof typeof HTTP_STATUS];\r\n\r\nexport const statusCode = HTTP_STATUS;\r\n","import { HTTP_STATUS } from \"../constants/http-status\";\r\n\r\nexport interface AppErrorOptions {\r\n  message: string;\r\n  statusCode?: number;\r\n  code?: string;\r\n  details?: unknown;\r\n}\r\n\r\nexport class AppError extends Error {\r\n  public readonly statusCode: number;\r\n  public readonly code: string;\r\n  public readonly details: unknown;\r\n  public readonly isOperational: boolean;\r\n\r\n  constructor(options: AppErrorOptions) {\r\n    super(options.message);\r\n    this.name = new.target.name;\r\n    this.statusCode = options.statusCode ?? HTTP_STATUS.INTERNAL_SERVER_ERROR;\r\n    this.code = options.code ?? \"INTERNAL_SERVER_ERROR\";\r\n    this.details = options.details ?? null;\r\n    this.isOperational = true;\r\n\r\n    const errorConstructor = Error as ErrorConstructor & {\r\n      captureStackTrace?: (\r\n        targetObject: object,\r\n        constructorOpt?: Function,\r\n      ) => void;\r\n    };\r\n\r\n    errorConstructor.captureStackTrace?.(this, new.target);\r\n  }\r\n}\r\n","import { HTTP_STATUS } from \"../constants/http-status\";\r\nimport { AppError } from \"./app-error\";\r\n\r\nexport class BadRequestError extends AppError {\r\n  constructor(message = \"Bad request\", details?: unknown) {\r\n    super({\r\n      message,\r\n      statusCode: HTTP_STATUS.BAD_REQUEST,\r\n      code: \"BAD_REQUEST\",\r\n      details,\r\n    });\r\n  }\r\n}\r\n\r\nexport class UnauthorizedError extends AppError {\r\n  constructor(message = \"Unauthorized\", details?: unknown) {\r\n    super({\r\n      message,\r\n      statusCode: HTTP_STATUS.UNAUTHORIZED,\r\n      code: \"UNAUTHORIZED\",\r\n      details,\r\n    });\r\n  }\r\n}\r\n\r\nexport class ForbiddenError extends AppError {\r\n  constructor(message = \"Forbidden\", details?: unknown) {\r\n    super({\r\n      message,\r\n      statusCode: HTTP_STATUS.FORBIDDEN,\r\n      code: \"FORBIDDEN\",\r\n      details,\r\n    });\r\n  }\r\n}\r\n\r\nexport class NotFoundError extends AppError {\r\n  constructor(message = \"Not found\", details?: unknown) {\r\n    super({\r\n      message,\r\n      statusCode: HTTP_STATUS.NOT_FOUND,\r\n      code: \"NOT_FOUND\",\r\n      details,\r\n    });\r\n  }\r\n}\r\n\r\nexport class ConflictError extends AppError {\r\n  constructor(message = \"Conflict\", details?: unknown) {\r\n    super({\r\n      message,\r\n      statusCode: HTTP_STATUS.CONFLICT,\r\n      code: \"CONFLICT\",\r\n      details,\r\n    });\r\n  }\r\n}\r\n\r\nexport class ValidationError extends AppError {\r\n  constructor(message = \"Validation failed\", details?: unknown) {\r\n    super({\r\n      message,\r\n      statusCode: HTTP_STATUS.UNPROCESSABLE_ENTITY,\r\n      code: \"VALIDATION_ERROR\",\r\n      details,\r\n    });\r\n  }\r\n}\r\n","import type { FilterQuery } from \"../types/query.types\";\r\n\r\n/** Picks only developer-approved filter fields from a query object. */\r\nexport function getFilters<TAllowedField extends string>(\r\n  query: FilterQuery,\r\n  allowedFields: readonly TAllowedField[],\r\n): Partial<Record<TAllowedField, unknown>> {\r\n  return allowedFields.reduce<Partial<Record<TAllowedField, unknown>>>(\r\n    (filters, field) => {\r\n      if (query[field] !== undefined) {\r\n        filters[field] = query[field];\r\n      }\r\n\r\n      return filters;\r\n    },\r\n    {},\r\n  );\r\n}\r\n","export type AsyncRequestHandler<\r\n  TRequest = unknown,\r\n  TResponse = unknown,\r\n  TNext = unknown,\r\n> = (req: TRequest, res: TResponse, next: TNext) => Promise<unknown> | unknown;\r\n\r\n/** Wraps async route handlers and forwards rejected promises to next(). */\r\nexport function asyncHandler<TRequest = unknown, TResponse = unknown>(\n  handler: AsyncRequestHandler<TRequest, TResponse, (error?: unknown) => void>,\n) {\n  const wrapped = (\n    req: TRequest,\n    res: TResponse,\n    next: (error?: unknown) => void,\n  ) => {\n    Promise.resolve(handler(req, res, next)).catch(next);\n  };\n\n  if (handler.name) {\n    Object.defineProperty(wrapped, \"name\", {\n      value: handler.name,\n      configurable: true,\n    });\n  }\n\n  return wrapped;\n}\n","export function getCambodiaTimestamp(date = new Date()): string {\n  const datePart = new Intl.DateTimeFormat(\"en-CA\", {\n    day: \"2-digit\",\n    month: \"2-digit\",\n    timeZone: \"Asia/Phnom_Penh\",\n    year: \"numeric\",\n  }).format(date);\n  const timePart = new Intl.DateTimeFormat(\"en-GB\", {\n    hour: \"2-digit\",\n    hour12: false,\n    minute: \"2-digit\",\n    second: \"2-digit\",\n    timeZone: \"Asia/Phnom_Penh\",\n  }).format(date);\n\n  return `${datePart} ${timePart}`;\n}\n","import type { ApiError } from \"../types/error.types\";\nimport { getCambodiaTimestamp } from \"../utils/timestamp\";\n\r\nexport interface ErrorResponseInput {\r\n  message?: string;\r\n  code?: string;\r\n  details?: unknown;\r\n}\r\n\r\n/** Creates a standard failed JSON API response. */\r\nexport function errorResponse(input: ErrorResponseInput = {}): ApiError {\r\n  const response: ApiError = {\r\n    success: false,\n    message: input.message ?? \"Something went wrong\",\n    error: input.code ?? \"INTERNAL_SERVER_ERROR\",\n    timestamp: getCambodiaTimestamp(),\n  };\n\r\n  if (input.details !== undefined) {\r\n    response.details = input.details;\r\n  }\r\n\r\n  return response;\r\n}\r\n","import { HTTP_STATUS } from \"../constants/http-status\";\r\nimport { AppError } from \"../errors/app-error\";\r\nimport { errorResponse } from \"../responses/error-response\";\r\n\r\ninterface ErrorResponseLike {\r\n  headersSent?: boolean;\r\n  status(code: number): ErrorResponseLike;\r\n  json(body: unknown): unknown;\r\n}\r\n\r\ntype NextFunctionLike = (error?: unknown) => void;\r\n\r\n/** Express-compatible error middleware that emits standard JSON errors. */\r\nexport function errorMiddleware(\r\n  error: unknown,\r\n  _req: unknown,\r\n  res: ErrorResponseLike,\r\n  next: NextFunctionLike,\r\n) {\r\n  if (res.headersSent) {\r\n    return next(error);\r\n  }\r\n\r\n  const appError = error instanceof AppError ? error : null;\r\n  const statusCode = appError?.statusCode ?? HTTP_STATUS.INTERNAL_SERVER_ERROR;\r\n\r\n  return res.status(statusCode).json(\r\n    errorResponse({\r\n      message: appError?.message ?? \"Something went wrong\",\r\n      code: appError?.code ?? \"INTERNAL_SERVER_ERROR\",\r\n      details: appError?.details ?? null,\r\n    }),\r\n  );\r\n}\r\n","import { NotFoundError } from \"../errors/http-errors\";\r\n\r\n/** Express-compatible middleware that forwards unmatched routes as NotFoundError. */\r\nexport function notFoundMiddleware(\r\n  req: { originalUrl?: string; url?: string },\r\n  _res: unknown,\r\n  next: (error?: unknown) => void,\r\n) {\r\n  const path = req.originalUrl ?? req.url ?? \"unknown route\";\r\n  next(new NotFoundError(`Route not found: ${path}`));\r\n}\r\n","import { getCambodiaTimestamp } from \"../utils/timestamp\";\r\n\r\nexport interface LoggerRequest {\r\n  method?: string;\r\n  originalUrl?: string;\r\n  url?: string;\r\n  ip?: string;\r\n  baseUrl?: string;\r\n  path?: string;\r\n  body?: unknown;\r\n  route?: {\r\n    path?: unknown;\r\n    stack?: Array<{\r\n      name?: string;\r\n      handle?: unknown;\r\n    }>;\r\n  };\r\n  headers?: Record<string, string | string[] | undefined>;\r\n  get?: (name: string) => string | undefined;\r\n  user?: unknown;\r\n}\r\n\r\nexport interface LoggerResponse {\r\n  statusCode?: number;\r\n  on?: (event: \"finish\", listener: () => void) => unknown;\r\n  json?: (body: unknown) => unknown;\r\n}\r\n\r\nexport type LoggerNext = () => void;\r\n\r\nexport interface LoggerOptions {\r\n  enabled?: boolean;\r\n  projectName?: string;\r\n  includeRequestFrom?: boolean;\r\n  includeIp?: boolean;\r\n  includeUserAgent?: boolean;\r\n  includeRouteContext?: boolean;\r\n  includeRequestData?: boolean;\r\n  includeResponseData?: boolean;\r\n  maxRequestDataLength?: number;\r\n  maxResponseDataLength?: number;\r\n  redactFields?: readonly string[];\r\n  controllerFileSuffix?: string;\r\n  sourceFile?: string;\r\n  sourceMethod?: string;\r\n  getSourceFile?: (req: LoggerRequest) => string | undefined;\r\n  getSourceMethod?: (req: LoggerRequest) => string | undefined;\r\n  getUser?: (req: LoggerRequest) => string | undefined;\r\n  log?: (message: string) => void;\r\n  logger?: (message: string) => void;\r\n}\r\n\r\nexport type LoggerConfig = LoggerOptions;\r\nexport type RequestLoggerRequest = LoggerRequest;\r\nexport type RequestLoggerResponse = LoggerResponse;\r\nexport type RequestLoggerNext = LoggerNext;\r\nexport type RequestLoggerOptions = LoggerOptions;\r\nexport type RequestLoggerConfig = LoggerConfig;\r\n\r\ntype ProcessLike = {\r\n  argv?: string[];\r\n  env?: Record<string, string | undefined>;\r\n};\r\n\r\nconst DEFAULT_REDACT_FIELDS = [\r\n  \"password\",\r\n  \"passcode\",\r\n  \"token\",\r\n  \"accessToken\",\r\n  \"refreshToken\",\r\n  \"authorization\",\r\n  \"secret\",\r\n  \"apiKey\",\r\n] as const;\r\n\r\nlet globalLoggerConfig: LoggerConfig = {};\r\n\r\nexport function configureLogger(config: LoggerConfig): void {\r\n  globalLoggerConfig = {\r\n    ...globalLoggerConfig,\r\n    ...config,\r\n  };\r\n}\r\n\r\nexport function resetLoggerConfig(): void {\r\n  globalLoggerConfig = {};\r\n}\r\n\r\nfunction getLevel(statusCode?: number): \"INFO\" | \"WARN\" | \"ERROR\" {\r\n  if (statusCode === undefined) {\r\n    return \"INFO\";\r\n  }\r\n\r\n  if (statusCode >= 500) {\r\n    return \"ERROR\";\r\n  }\r\n\r\n  if (statusCode >= 400) {\r\n    return \"WARN\";\r\n  }\r\n\r\n  return \"INFO\";\r\n}\r\n\r\nfunction getHeader(req: LoggerRequest, name: string): string | undefined {\r\n  const fromGetter = req.get?.(name);\r\n\r\n  if (fromGetter) {\r\n    return fromGetter;\r\n  }\r\n\r\n  const value = req.headers?.[name.toLowerCase()];\r\n\r\n  return Array.isArray(value) ? value.join(\", \") : value;\r\n}\r\n\r\nfunction getDefaultProjectName(): string {\r\n  const processLike = (globalThis as { process?: ProcessLike }).process;\r\n  const packageJsonPathParts =\r\n    processLike?.env?.npm_package_json?.split(/[\\\\/]/);\r\n\r\n  return (\r\n    processLike?.env?.APP_NAME ??\r\n    processLike?.env?.npm_package_name ??\r\n    (packageJsonPathParts && packageJsonPathParts.length > 1\r\n      ? packageJsonPathParts[packageJsonPathParts.length - 2]\r\n      : undefined) ??\r\n    \"app\"\r\n  );\r\n}\r\n\r\nfunction getFileNameFromPath(path?: string): string | undefined {\r\n  const fileName = path?.split(/[\\\\/]/).filter(Boolean).pop();\r\n\r\n  return fileName && fileName.includes(\".\") ? fileName : undefined;\r\n}\r\n\r\nfunction getRuntimeSourceFile(): string | undefined {\r\n  const processLike = (globalThis as { process?: ProcessLike }).process;\r\n  const entryFile = processLike?.argv?.[1];\r\n\r\n  if (\r\n    !entryFile ||\r\n    /[\\\\/]node_modules[\\\\/]/.test(entryFile) ||\r\n    /[\\\\/]\\.bin[\\\\/]/.test(entryFile) ||\r\n    /(?:vitest|tsx|ts-node|nodemon)(?:\\.[cm]?js)?$/i.test(entryFile)\r\n  ) {\r\n    return undefined;\r\n  }\r\n\r\n  return getFileNameFromPath(entryFile);\r\n}\r\n\r\nfunction formatUser(user: unknown): string | undefined {\r\n  if (typeof user === \"string\" || typeof user === \"number\") {\r\n    return String(user);\r\n  }\r\n\r\n  if (!user || typeof user !== \"object\") {\r\n    return undefined;\r\n  }\r\n\r\n  const record = user as Record<string, unknown>;\r\n\r\n  for (const key of [\"name\", \"username\", \"email\", \"id\"]) {\r\n    const value = record[key];\r\n\r\n    if (typeof value === \"string\" || typeof value === \"number\") {\r\n      return String(value);\r\n    }\r\n  }\r\n\r\n  return undefined;\r\n}\r\n\r\nfunction getFunctionName(value: unknown): string | undefined {\r\n  if (\r\n    value &&\r\n    (typeof value === \"function\" || typeof value === \"object\") &&\r\n    \"name\" in value\r\n  ) {\r\n    const name = (value as { name?: unknown }).name;\r\n\r\n    return typeof name === \"string\" ? name : undefined;\r\n  }\r\n\r\n  return undefined;\r\n}\r\n\r\nfunction normalizeHandlerName(name?: string): string | undefined {\r\n  const normalized = name?.replace(/^bound\\s+/, \"\").trim();\r\n\r\n  if (\r\n    !normalized ||\r\n    normalized === \"<anonymous>\" ||\r\n    normalized === \"anonymous\" ||\r\n    normalized === \"handler\" ||\r\n    normalized === \"wrapped\"\r\n  ) {\r\n    return undefined;\r\n  }\r\n\r\n  return normalized;\r\n}\r\n\r\nfunction getRouteHandlerName(req: LoggerRequest): string | undefined {\r\n  const stack = req.route?.stack;\r\n\r\n  if (!stack?.length) {\r\n    return undefined;\r\n  }\r\n\r\n  for (const layer of [...stack].reverse()) {\r\n    const name = normalizeHandlerName(\r\n      getFunctionName(layer.handle) ?? layer.name,\r\n    );\r\n\r\n    if (name) {\r\n      return name;\r\n    }\r\n  }\r\n\r\n  return undefined;\r\n}\r\n\r\nfunction getFirstPathSegment(path?: string): string | undefined {\r\n  return path\r\n    ?.split(/[?#]/, 1)[0]\r\n    ?.split(\"/\")\r\n    .filter(\r\n      (segment) =>\r\n        segment && !segment.startsWith(\":\") && segment.toLowerCase() !== \"api\",\r\n    )[0];\r\n}\r\n\r\nfunction getLastPathSegment(path?: string): string | undefined {\r\n  const segments = path\r\n    ?.split(/[?#]/, 1)[0]\r\n    ?.split(\"/\")\r\n    .filter((segment) => segment && !segment.startsWith(\":\"));\r\n\r\n  return segments?.[segments.length - 1];\r\n}\r\n\r\nfunction getRoutePath(req: LoggerRequest): string | undefined {\r\n  if (typeof req.route?.path === \"string\") {\r\n    return req.route.path;\r\n  }\r\n\r\n  return req.path ?? req.originalUrl ?? req.url;\r\n}\r\n\r\nfunction getRouteControllerFile(\r\n  req: LoggerRequest,\r\n  suffix: string,\r\n): string | undefined {\r\n  const routeSegment = getFirstPathSegment(getRoutePath(req));\r\n  const mountedRouterSegment = getLastPathSegment(req.baseUrl);\r\n  const requestSegment = getFirstPathSegment(req.originalUrl ?? req.url);\r\n  const segment = routeSegment ?? mountedRouterSegment ?? requestSegment;\r\n\r\n  return segment ? `${segment}${suffix}` : undefined;\r\n}\r\n\r\nfunction hasEntries(value: unknown): value is Record<string, unknown> {\r\n  return (\r\n    !!value &&\r\n    typeof value === \"object\" &&\r\n    !Array.isArray(value) &&\r\n    Object.keys(value).length > 0\r\n  );\r\n}\r\n\r\nfunction sanitizeLogValue(\r\n  value: unknown,\r\n  redactFields: readonly string[],\r\n): unknown {\r\n  if (Array.isArray(value)) {\r\n    return value.map((item) => sanitizeLogValue(item, redactFields));\r\n  }\r\n\r\n  if (!value || typeof value !== \"object\") {\r\n    return value;\r\n  }\r\n\r\n  return Object.entries(value as Record<string, unknown>).reduce<\r\n    Record<string, unknown>\r\n  >((sanitized, [key, item]) => {\r\n    const shouldRedact = redactFields.some(\r\n      (field) => field.toLowerCase() === key.toLowerCase(),\r\n    );\r\n\r\n    sanitized[key] = shouldRedact\r\n      ? \"[REDACTED]\"\r\n      : sanitizeLogValue(item, redactFields);\r\n\r\n    return sanitized;\r\n  }, {});\r\n}\r\n\r\nfunction canLogRequestBody(method?: string): boolean {\r\n  const normalizedMethod = method?.toUpperCase();\r\n\r\n  return normalizedMethod !== \"GET\" && normalizedMethod !== \"HEAD\";\r\n}\r\n\r\nfunction formatRequestData(\r\n  req: LoggerRequest,\r\n  options: LoggerOptions,\r\n): string | undefined {\r\n  if (\r\n    !canLogRequestBody(req.method) ||\r\n    req.body === undefined ||\r\n    !hasEntries(req.body)\r\n  ) {\r\n    return undefined;\r\n  }\r\n\r\n  const serialized = JSON.stringify(\r\n    sanitizeLogValue(req.body, options.redactFields ?? DEFAULT_REDACT_FIELDS),\r\n  );\r\n  const maxLength = options.maxRequestDataLength ?? 500;\r\n\r\n  return serialized.length > maxLength\r\n    ? `${serialized.slice(0, maxLength)}...`\r\n    : serialized;\r\n}\r\n\r\nfunction formatResponseData(\r\n  responseBody: unknown,\r\n  options: LoggerOptions,\r\n): string | undefined {\r\n  if (responseBody === undefined) {\r\n    return undefined;\r\n  }\r\n\r\n  const serialized = JSON.stringify(\r\n    sanitizeLogValue(\r\n      responseBody,\r\n      options.redactFields ?? DEFAULT_REDACT_FIELDS,\r\n    ),\r\n  );\r\n  const maxLength = options.maxResponseDataLength ?? 2_000;\r\n\r\n  return serialized.length > maxLength\r\n    ? `${serialized.slice(0, maxLength)}...`\r\n    : serialized;\r\n}\r\n\r\nexport function formatRequestLog(input: {\r\n  projectName?: string;\r\n  method?: string;\r\n  url?: string;\r\n  statusCode?: number;\r\n  durationMs: number;\r\n  timestamp?: string;\r\n  requestFrom?: string;\r\n  ip?: string;\r\n  userAgent?: string;\r\n  sourceFile?: string;\r\n  sourceMethod?: string;\r\n  user?: string;\r\n  requestData?: string;\r\n  responseData?: string;\r\n}): string {\r\n  const requestFrom = input.requestFrom ?? input.ip;\r\n  const requestSummary = [\r\n    getLevel(input.statusCode),\r\n    input.method ?? \"REQUEST\",\r\n    input.url ?? \"/\",\r\n    String(input.statusCode ?? 0),\r\n    `${input.durationMs}ms`,\r\n  ].join(\" \");\r\n  const baseParts = [\r\n    `[${input.projectName ?? getDefaultProjectName()}]`,\r\n    input.timestamp ?? getCambodiaTimestamp(),\r\n    requestSummary,\r\n    `file=${input.sourceFile ?? \"unknown\"}`,\r\n    `method=${input.sourceMethod ?? input.method ?? \"REQUEST\"}`,\r\n    `by=${input.user ?? \"anonymous\"}`,\r\n  ];\r\n  const extraParts: string[] = [];\r\n\r\n  if (requestFrom) {\r\n    extraParts.push(`from=${requestFrom}`);\r\n  }\r\n\r\n  if (input.userAgent) {\r\n    extraParts.push(`ua=\"${input.userAgent}\"`);\r\n  }\r\n\r\n  const baseMessage = [...baseParts, ...extraParts].join(\" | \");\r\n\r\n  const lines = [baseMessage];\r\n\r\n  if (input.requestData) {\r\n    lines.push(`request=${input.requestData}`);\r\n  }\r\n\r\n  if (input.responseData) {\r\n    lines.push(`***response=${input.responseData}***`);\r\n  }\r\n\r\n  return lines.join(\"\\n\");\r\n}\r\n\r\nexport function logger(options: LoggerOptions = {}) {\r\n  const resolvedOptions = {\r\n    ...globalLoggerConfig,\r\n    ...options,\r\n  };\r\n  const log = resolvedOptions.log ?? resolvedOptions.logger ?? console.log;\r\n\r\n  return (req: LoggerRequest, res: LoggerResponse, next: LoggerNext): void => {\r\n    if (resolvedOptions.enabled === false) {\r\n      next();\r\n      return;\r\n    }\r\n\r\n    const startedAt = Date.now();\r\n    let responseBody: unknown;\r\n    const shouldIncludeRequestFrom =\r\n      resolvedOptions.includeRequestFrom ?? resolvedOptions.includeIp ?? false;\r\n\r\n    if (res.json) {\r\n      const originalJson = res.json;\r\n\r\n      res.json = function jsonWithLogging(\r\n        this: LoggerResponse,\r\n        body: unknown,\r\n      ): unknown {\r\n        responseBody = body;\r\n\r\n        return originalJson.call(this, body);\r\n      };\r\n    }\r\n\r\n    res.on?.(\"finish\", () => {\r\n      const durationMs = Date.now() - startedAt;\r\n      const requestFrom = getHeader(req, \"x-forwarded-for\") ?? req.ip;\r\n      const userAgent = getHeader(req, \"user-agent\");\r\n      const shouldIncludeRouteContext =\r\n        resolvedOptions.includeRouteContext ?? true;\r\n      const routeSourceFile = shouldIncludeRouteContext\r\n        ? getRouteControllerFile(\r\n            req,\r\n            resolvedOptions.controllerFileSuffix ?? \".controller.ts\",\r\n          )\r\n        : undefined;\r\n      const routeSourceMethod = shouldIncludeRouteContext\r\n        ? getRouteHandlerName(req)\r\n        : undefined;\r\n      const sourceFile =\r\n        resolvedOptions.getSourceFile?.(req) ??\r\n        resolvedOptions.sourceFile ??\r\n        getRuntimeSourceFile() ??\r\n        routeSourceFile;\r\n      const sourceMethod =\r\n        resolvedOptions.getSourceMethod?.(req) ??\r\n        resolvedOptions.sourceMethod ??\r\n        routeSourceMethod;\r\n      const user = resolvedOptions.getUser?.(req) ?? formatUser(req.user);\r\n      const requestData =\r\n        (resolvedOptions.includeRequestData ?? false)\r\n          ? formatRequestData(req, resolvedOptions)\r\n          : undefined;\r\n      const responseData =\r\n        (resolvedOptions.includeResponseData ?? true)\r\n          ? formatResponseData(responseBody, resolvedOptions)\r\n          : undefined;\r\n      const message = formatRequestLog({\r\n        ...(resolvedOptions.projectName\r\n          ? { projectName: resolvedOptions.projectName }\r\n          : {}),\r\n        durationMs,\r\n        ...(req.method ? { method: req.method } : {}),\r\n        ...((req.originalUrl ?? req.url)\r\n          ? { url: req.originalUrl ?? req.url }\r\n          : {}),\r\n        ...(res.statusCode !== undefined ? { statusCode: res.statusCode } : {}),\r\n        ...(shouldIncludeRequestFrom && requestFrom ? { requestFrom } : {}),\r\n        ...(resolvedOptions.includeUserAgent && userAgent ? { userAgent } : {}),\r\n        ...(sourceFile ? { sourceFile } : {}),\r\n        ...(sourceMethod ? { sourceMethod } : {}),\r\n        ...(user ? { user } : {}),\r\n        ...(requestData ? { requestData } : {}),\r\n        ...(responseData ? { responseData } : {}),\r\n      });\r\n\r\n      log(message);\r\n    });\r\n\r\n    next();\r\n  };\r\n}\r\n\r\nexport const requestLogger = logger;\r\n","import type {\r\n  NormalizedPagination,\r\n  PaginatedData,\r\n  PaginationMeta,\r\n  PaginationOptions,\r\n  PaginationQuery,\r\n} from \"../types/pagination.types\";\r\nimport type { SortOrder } from \"../types/query.types\";\r\n\r\nconst DEFAULT_MAX = 10;\r\nconst MAX_MAX = 100;\r\n\r\nfunction toPositiveInteger(value: unknown, fallback: number): number {\r\n  const parsed =\r\n    typeof value === \"number\"\r\n      ? value\r\n      : Number.parseInt(String(value ?? \"\"), 10);\r\n  return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback;\r\n}\r\n\r\nfunction toNonNegativeInteger(value: unknown, fallback = 0): number {\r\n  const parsed =\r\n    typeof value === \"number\"\r\n      ? value\r\n      : Number.parseInt(String(value ?? \"\"), 10);\r\n  return Number.isInteger(parsed) && parsed >= 0 ? parsed : fallback;\r\n}\r\n\r\nfunction toSafeString(value: unknown): string | undefined {\r\n  if (typeof value !== \"string\" && typeof value !== \"number\") {\r\n    return undefined;\r\n  }\r\n\r\n  const normalized = String(value).trim();\r\n  return normalized.length > 0 ? normalized : undefined;\r\n}\r\n\r\nfunction normalizeSortOrder(value: unknown): SortOrder | undefined {\r\n  if (typeof value !== \"string\") {\r\n    return undefined;\r\n  }\r\n\r\n  const normalized = value.trim().toLowerCase();\r\n  return normalized === \"asc\" || normalized === \"desc\" ? normalized : undefined;\r\n}\r\n\r\n/** Normalizes raw pagination query parameters into safe numeric values. */\r\nexport function normalizePaginationQuery(\r\n  query: PaginationQuery = {},\r\n  options: PaginationOptions = {},\r\n): NormalizedPagination {\r\n  const defaultMax = options.defaultMax ?? DEFAULT_MAX;\r\n  const maxMax = options.maxMax ?? MAX_MAX;\r\n\r\n  const requestedMax = toPositiveInteger(query.max, defaultMax);\r\n  const max = Math.min(requestedMax, maxMax);\r\n  const offset = toNonNegativeInteger(query.offset);\r\n  const sortBy = toSafeString(query.sortBy);\r\n  const sortOrder = normalizeSortOrder(query.sortOrder);\r\n\r\n  return {\r\n    max,\r\n    offset,\r\n    ...(sortBy ? { sortBy } : {}),\r\n    ...(sortOrder ? { sortOrder } : {}),\r\n  };\r\n}\r\n\r\n/** Returns normalized pagination settings for repository or service queries. */\r\nexport function getPagination(\r\n  query: PaginationQuery = {},\r\n  options: PaginationOptions = {},\r\n): NormalizedPagination {\r\n  return normalizePaginationQuery(query, options);\r\n}\r\n\r\n/** Slices an array using normalized pagination and includes the full total. */\r\nexport function paginate<T>(\r\n  items: T[],\r\n  pagination: Pick<NormalizedPagination, \"max\" | \"offset\">,\r\n): PaginatedData<T> {\r\n  return {\r\n    data: items.slice(pagination.offset, pagination.offset + pagination.max),\r\n    total: items.length,\r\n  };\r\n}\r\n\r\n/** Builds pagination metadata for API responses. */\r\nexport function getPaginationMeta(input: {\r\n  max?: number;\r\n  offset?: number;\r\n  total: number;\r\n}): PaginationMeta {\r\n  const max = toPositiveInteger(input.max, DEFAULT_MAX);\r\n  const offset = toNonNegativeInteger(input.offset);\r\n  const total = toNonNegativeInteger(input.total);\r\n\r\n  return {\r\n    max,\r\n    offset,\r\n    total,\r\n    hasNextPage: offset + max < total,\r\n    hasPreviousPage: offset > 0 && total > 0,\r\n  };\r\n}\r\n","import { getPaginationMeta } from \"../pagination/pagination\";\r\nimport type { PaginationMeta } from \"../types/pagination.types\";\r\nimport type { PaginatedResponse } from \"../types/response.types\";\r\nimport { getCambodiaTimestamp } from \"../utils/timestamp\";\r\n\r\nexport interface PaginatedResponseInput<T> {\r\n  message?: string;\r\n  data?: T[];\r\n  max?: number;\r\n  offset?: number;\r\n  total: number;\r\n}\r\n\r\nexport interface PaginatedResponseWithMetaInput<T> {\r\n  message?: string;\r\n  data?: T[];\r\n  meta: {\r\n    max?: number;\r\n    offset?: number;\r\n    total: number;\r\n  };\r\n}\r\n\r\n/** Creates a standard successful response with pagination metadata. */\r\nexport function paginatedResponse<T = unknown>(\r\n  input: PaginatedResponseInput<T> | PaginatedResponseWithMetaInput<T>,\r\n): PaginatedResponse<T> {\r\n  const meta = \"meta\" in input ? input.meta : input;\r\n  const paginationInput = {\r\n    ...(meta.max !== undefined ? { max: meta.max } : {}),\r\n    ...(meta.offset !== undefined ? { offset: meta.offset } : {}),\r\n    total: meta.total,\r\n  };\r\n  const pagination: PaginationMeta = getPaginationMeta(paginationInput);\r\n\r\n  return {\r\n    success: true,\r\n    message: input.message ?? \"Data fetched successfully\",\r\n    data: input.data ?? [],\r\n    total: pagination.total,\r\n    timestamp: getCambodiaTimestamp(),\r\n  };\r\n}\r\n","import {\n  statusCode as STATUS_CODE,\n  type HttpStatusCode,\n} from \"../constants/http-status\";\nimport type { ApiResponse } from \"../types/response.types\";\nimport { getCambodiaTimestamp } from \"../utils/timestamp\";\n\r\nexport interface SuccessResponseInput<T> {\n  message?: string;\n  data?: T;\n  total?: number;\n}\n\r\nexport interface ResponseInput<T> extends SuccessResponseInput<T> {\r\n  statusCode?: HttpStatusCode;\r\n  total?: number;\r\n}\r\n\r\nexport type ResponseResult<T> = ApiResponse<T | Record<string, never>> & {\n  statusCode: HttpStatusCode;\n  total: number;\n};\n\nexport type SuccessResponseResult<T> = ApiResponse<T | Record<string, never>> & {\n  total: number;\n};\n\nfunction getTotal(data: unknown, total?: number): number {\n  if (total !== undefined) {\n    return total;\n  }\n\n  if (data === undefined || data === null) {\n    return 0;\n  }\n\n  if (Array.isArray(data)) {\n    return data.length;\n  }\n\n  if (data !== null && typeof data === \"object\") {\n    const totalValue = \"total\" in data ? data.total : undefined;\n\n    if (typeof totalValue === \"number\" && Number.isFinite(totalValue)) {\n      return totalValue;\n    }\n\n    if (\"data\" in data) {\n      return getTotal(data.data);\n    }\n\n    return 1;\n  }\n\n  return 1;\n}\n\r\nfunction isResponseInput<T>(value: unknown): value is ResponseInput<T> {\r\n  if (value === null || Array.isArray(value) || typeof value !== \"object\") {\r\n    return false;\r\n  }\r\n\r\n  return (\r\n    Object.prototype.hasOwnProperty.call(value, \"message\") ||\r\n    Object.prototype.hasOwnProperty.call(value, \"data\") ||\r\n    Object.prototype.hasOwnProperty.call(value, \"statusCode\") ||\r\n    Object.prototype.hasOwnProperty.call(value, \"total\")\r\n  );\r\n}\r\n\r\n/** Creates a standard successful JSON API response. */\r\nexport function successResponse<T = unknown>(\n  input: SuccessResponseInput<T> = {},\n): SuccessResponseResult<T> {\n  const hasData = Object.prototype.hasOwnProperty.call(input, \"data\");\n\n  return {\n    success: true,\n    message: input.message ?? \"Request successful\",\n    data: hasData ? (input.data as T) : {},\n    total: getTotal(hasData ? input.data : undefined, input.total),\n    timestamp: getCambodiaTimestamp(),\n  };\n}\n\r\n/** Creates a simple successful JSON API response from data or an input object. */\r\nexport function response<T = unknown>(\r\n  input?: T | ResponseInput<T>,\r\n  statusMessageOrTotal?: HttpStatusCode | string | number,\r\n  messageOrTotal?: string | number,\r\n  total?: number,\r\n): ResponseResult<T> {\r\n  const statusCode =\r\n    typeof statusMessageOrTotal === \"number\" &&\r\n    typeof messageOrTotal === \"string\"\r\n      ? (statusMessageOrTotal as HttpStatusCode)\r\n      : undefined;\r\n  const message =\r\n    typeof statusMessageOrTotal === \"string\"\r\n      ? statusMessageOrTotal\r\n      : typeof messageOrTotal === \"string\"\r\n        ? messageOrTotal\r\n        : undefined;\r\n  const resolvedTotal =\r\n    typeof statusMessageOrTotal === \"number\" && messageOrTotal === undefined\r\n      ? statusMessageOrTotal\r\n      : typeof messageOrTotal === \"number\"\r\n        ? messageOrTotal\r\n        : total;\r\n  const baseInput: ResponseInput<T> = isResponseInput<T>(input)\r\n    ? input\r\n    : {\r\n        data: input as T,\r\n      };\r\n  const responseInput: ResponseInput<T> = {\r\n    ...baseInput,\r\n    ...(statusCode !== undefined ? { statusCode } : {}),\r\n    ...(message !== undefined ? { message } : {}),\r\n    ...(resolvedTotal !== undefined ? { total: resolvedTotal } : {}),\r\n  };\r\n  const hasData = Object.prototype.hasOwnProperty.call(responseInput, \"data\");\r\n  const responseTotal = getTotal(responseInput, responseInput.total);\r\n  const result = {\r\n    success: true,\r\n    statusCode: responseInput.statusCode ?? STATUS_CODE.OK,\n    message: responseInput.message ?? \"Request successful\",\n    data: hasData ? (responseInput.data as T) : {},\n    total: responseTotal,\n    timestamp: getCambodiaTimestamp(),\n  } as ResponseResult<T>;\n\r\n  return result;\r\n}\r\n","import type { ValidationErrorItem } from \"../types/response.types\";\nimport { getCambodiaTimestamp } from \"../utils/timestamp\";\n\r\nexport interface ValidationErrorResponse {\r\n  success: false;\r\n  message: string;\r\n  errors: ValidationErrorItem[];\r\n  timestamp: string;\r\n}\r\n\r\nexport interface ValidationErrorResponseInput {\r\n  message?: string;\r\n  errors?: ValidationErrorItem[];\r\n}\r\n\r\n/** Creates a standard validation error response. */\r\nexport function validationErrorResponse(\r\n  input: ValidationErrorResponseInput = {},\r\n): ValidationErrorResponse {\r\n  return {\r\n    success: false,\n    message: input.message ?? \"Validation failed\",\n    errors: input.errors ?? [],\n    timestamp: getCambodiaTimestamp(),\n  };\n}\n","import type { SearchQuery } from \"../types/query.types\";\r\n\r\nfunction toKeyword(value: unknown): string | undefined {\r\n  if (typeof value !== \"string\" && typeof value !== \"number\") {\r\n    return undefined;\r\n  }\r\n\r\n  const keyword = String(value).trim();\r\n  return keyword.length > 0 ? keyword : undefined;\r\n}\r\n\r\n/** Extracts a search keyword from q or search query parameters. */\r\nexport function getSearch(query: SearchQuery = {}): { keyword?: string } {\r\n  const keyword = toKeyword(query.q) ?? toKeyword(query.search);\r\n  return keyword ? { keyword } : {};\r\n}\r\n","import type { SortOrder, SortQuery } from \"../types/query.types\";\r\n\r\nfunction normalizeSortOrder(value: unknown): SortOrder {\r\n  return typeof value === \"string\" && value.trim().toLowerCase() === \"desc\"\r\n    ? \"desc\"\r\n    : \"asc\";\r\n}\r\n\r\nfunction toSafeString(value: unknown): string | undefined {\r\n  if (typeof value !== \"string\" && typeof value !== \"number\") {\r\n    return undefined;\r\n  }\r\n\r\n  const normalized = String(value).trim();\r\n  return normalized.length > 0 ? normalized : undefined;\r\n}\r\n\r\n/** Normalizes sorting query parameters. */\r\nexport function getSorting(query: SortQuery = {}): {\r\n  sortBy?: string;\r\n  sortOrder: SortOrder;\r\n} {\r\n  const sortBy = toSafeString(query.sortBy);\r\n\r\n  return {\r\n    ...(sortBy ? { sortBy } : {}),\r\n    sortOrder: normalizeSortOrder(query.sortOrder),\r\n  };\r\n}\r\n"],"mappings":"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","names":["response","statusCode","statusCode","statusCode","normalizeSortOrder","toSafeString"]}