{"version":3,"file":"index.cjs","sources":["../../src/lib/index.ts","../../src/logger.ts","../../src/define-transport.ts","../../src/define-middlewares.ts"],"sourcesContent":["import { getByPath } from \"@krainovsd/js-helpers\";\nimport { trace } from \"@opentelemetry/api\";\nimport type { FastifyReply, FastifyRequest } from \"fastify\";\nimport { v4 } from \"uuid\";\nimport type { TransportFormat } from \"../logger-types\";\n\nexport function getTraceId() {\n  return trace?.getActiveSpan?.()?.spanContext?.()?.traceId ?? undefined;\n}\n\nexport function getErrorInfo(err: unknown, stack: boolean = true) {\n  const error = getByPath(err, \"message\") ?? undefined;\n  const errorStatus = getByPath(err, \"status\") ?? undefined;\n  const errorDescription = getByPath(err, \"description\") ?? undefined;\n  const errorStack = stack ? (err instanceof Error ? err.stack : undefined) : undefined;\n\n  const traceID = getTraceId();\n\n  return { error, errorStatus, errorDescription, errorStack, traceID };\n}\n\nexport function getRequestInfo(req: FastifyRequest) {\n  const host = req.ip;\n  const url = req.url;\n  const method = req.method;\n  const traceID = req.traceId ?? getTraceId();\n  const operationId = req.operationId ?? v4();\n\n  return { host, url, method, traceID, operationId };\n}\n\nexport function getResponseInfo(res: FastifyReply) {\n  const status = res?.statusCode ? String(res.statusCode) : null;\n\n  return { status };\n}\n\nfunction isHasSpace(str: unknown): str is string {\n  return typeof str === \"string\" && str.includes(\" \");\n}\n\nexport function getCorrectLog(\n  obj: Record<string, unknown>,\n  deniedProperties?: string[],\n  format: TransportFormat = \"logfmt\",\n) {\n  const correctObj = Object.fromEntries(\n    Object.entries(obj).filter(\n      ([key, value]) =>\n        !(deniedProperties?.includes?.(key.toLowerCase()) || typeof value === \"undefined\"),\n    ),\n  );\n\n  switch (format) {\n    case \"logfmt\": {\n      let log = \"\";\n\n      Object.entries(correctObj).forEach(([key, value]) => {\n        if (isHasSpace(value)) {\n          value = `\"${value}\"`;\n        }\n\n        log += `${key}=${value} `;\n      });\n      // eslint-disable-next-line no-console\n      console.log(log.trim());\n      break;\n    }\n    case \"json\": {\n      // eslint-disable-next-line no-console\n      console.log(correctObj);\n      break;\n    }\n    default: {\n      break;\n    }\n  }\n}\n","import { ResponseError, isBoolean, isObject } from \"@krainovsd/js-helpers\";\nimport type { FastifyBaseLogger } from \"fastify\";\nimport { getErrorInfo } from \"./lib\";\nimport type {\n  LoggerErrorOptions,\n  LoggerExecuteOptions,\n  LoggerInfoOptions,\n  LoggerLayerOptions,\n  LoggerServiceConstructorOptions,\n  LoggerWarnOptions,\n} from \"./logger-types\";\n\nexport class Logger {\n  private logger: FastifyBaseLogger;\n\n  constructor({ logger }: LoggerServiceConstructorOptions) {\n    this.logger = logger;\n  }\n\n  async loggerLayer<T>({\n    action,\n    processData,\n    loggerExecute = { error: true, start: false, stop: false },\n    loggerMessage,\n    loggerInfo,\n  }: LoggerLayerOptions<T>) {\n    try {\n      if (this.isHasLoggerAction(loggerExecute, \"start\"))\n        this.debug({ info: loggerInfo, message: `start ${loggerMessage}` });\n\n      const data = await action();\n      const processingData = processData ? await processData(data) : data;\n\n      if (this.isHasLoggerAction(loggerExecute, \"stop\"))\n        this.debug({ info: loggerInfo, message: `stop ${loggerMessage}` });\n\n      return processingData as T;\n    } catch (error) {\n      if (this.isHasLoggerAction(loggerExecute, \"error\"))\n        this.warn({ info: loggerInfo, error, message: `error ${loggerMessage}` });\n\n      throw error;\n    }\n  }\n\n  async controllerLayer<T = unknown>(\n    action: () => Promise<T>,\n    logger: boolean = true,\n  ): Promise<\n    | { data: T; status: 200; success: true }\n    | { data: { message: string }; status: number; success: false }\n  > {\n    try {\n      const result = await action();\n\n      return {\n        data: result,\n        status: 200,\n        success: true,\n      };\n    } catch (error) {\n      if (logger) this.error({ error });\n\n      if (error instanceof ResponseError) {\n        return { data: { message: error.message }, status: error.status, success: false };\n      }\n\n      throw error;\n    }\n  }\n\n  debug({ info = {}, message = \"debug\" }: LoggerInfoOptions) {\n    this.logger.debug(info, message);\n  }\n\n  info({ info = {}, message = \"info\" }: LoggerInfoOptions) {\n    this.logger.info(info, message);\n  }\n\n  warn({ info = {}, message = \"warn\", error }: LoggerWarnOptions) {\n    const errorInfo = getErrorInfo(error, false);\n    this.logger.warn({ ...errorInfo, ...info }, message);\n  }\n\n  error({ error, info = {}, message = \"error\" }: LoggerErrorOptions) {\n    const errorInfo = getErrorInfo(error);\n    this.logger.error({ ...errorInfo, ...info }, message);\n  }\n\n  private isHasLoggerAction(\n    options: LoggerExecuteOptions | boolean | undefined,\n    action: keyof LoggerExecuteOptions,\n  ) {\n    if (isBoolean(options)) return options;\n    if (isObject(options)) return Boolean(options[action]);\n\n    return false;\n  }\n}\n","import type { PinoLoggerOptions } from \"fastify/types/logger\";\nimport { join } from \"path\";\nimport type { TransportSettings } from \"./logger-types\";\n\nexport function defineTransport(\n  settings: TransportSettings & { ext?: string } = {},\n): PinoLoggerOptions[\"transport\"] {\n  const { ext = \".cjs\", ...rest } = settings;\n\n  return {\n    target: getTransportPath(ext),\n    options: {\n      ...rest,\n    },\n  };\n}\n\nfunction getTransportPath(ext: string) {\n  return join(__dirname, `./transport.${ext.replace(/^./, \"\")}`);\n}\n","import type { FastifyInstance } from \"fastify\";\nimport { getRequestInfo, getResponseInfo } from \"./lib\";\nimport { Logger } from \"./logger\";\nimport type { DefineMiddlewareSettings } from \"./logger-types\";\n\nexport function defineMiddlewares(\n  fastify: FastifyInstance,\n  settings: DefineMiddlewareSettings = {},\n) {\n  const logger = new Logger({ logger: fastify.log });\n\n  fastify.setErrorHandler(function onError(error, request, reply) {\n    const status = error.statusCode ?? 500;\n    if (\n      status === 500 &&\n      (settings.errorLogFilter == undefined || settings.errorLogFilter(request))\n    ) {\n      const requestInfo = getRequestInfo(request);\n      logger.error({ error, info: requestInfo, message: \"error\" });\n    }\n\n    settings.onError?.(error, request, reply);\n\n    reply\n      .status(status)\n      .header(\"traceId\", request.traceId)\n      .header(\"operationId\", request.operationId)\n      .send({\n        traceId: request.traceId,\n        operationId: request.operationId,\n        message: error.message,\n      });\n  });\n\n  fastify.addHook(\"onRequest\", function onRequest(request, reply, done) {\n    if (settings.accessLogFilter != undefined && !settings.accessLogFilter(request)) {\n      done();\n\n      return;\n    }\n\n    const requestInfo = getRequestInfo(request);\n    request.traceId = requestInfo.traceID;\n    request.operationId = requestInfo.operationId;\n    logger.info({ info: requestInfo, message: \"receive request\" });\n\n    settings.onRequest?.(request, reply);\n\n    done();\n  });\n  fastify.addHook(\"onSend\", async function onSend(request, reply, payload) {\n    reply.header(\"traceId\", request.traceId);\n    reply.header(\"operationId\", request.operationId);\n\n    await settings.onSend?.(request, reply, payload);\n\n    return payload;\n  });\n  fastify.addHook(\"onResponse\", function onResponse(request, reply, done) {\n    if (settings.accessLogFilter != undefined && !settings.accessLogFilter(request)) {\n      done();\n\n      return;\n    }\n\n    const requestInfo = getRequestInfo(request);\n    const responseInfo = getResponseInfo(reply);\n\n    settings.onResponse?.(request, reply);\n\n    logger.info({\n      info: {\n        ...requestInfo,\n        ...responseInfo,\n      },\n      message: \"send response\",\n    });\n\n    done();\n  });\n}\n"],"names":["trace","getByPath","v4","ResponseError","isBoolean","isObject","join"],"mappings":"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"}