{"version":3,"file":"log-file.mjs","names":[],"sources":["../../../src/node/log/log-file.ts"],"sourcesContent":["import type { LogHandlerOptions, LogMessage } from '../../common/log/log-base'\nimport type { LogRotationOptions } from './log-file-rotation'\nimport { createWriteStream, mkdirSync } from 'node:fs'\nimport { basename, dirname, resolve } from 'node:path'\nimport process from 'node:process'\nimport { renderMessages } from '../../common/data/message'\nimport { LogLevelError, LogLevelInfo, LogLevelWarn } from '../../common/log/log-base'\nimport { useLevelFilter, useNamespaceFilter } from '../../common/log/log-filter'\nimport { getLogRotationConfig } from './log-file-rotation'\nimport { createRotationStream } from './log-rotation'\n\nconst namespaces: Record<string, any> = {}\n\nexport interface LogFileHandlerOptions extends LogHandlerOptions {\n  /**\n   * Optional rotation options for log files. When provided, enables automatic log rotation.\n   * Can be:\n   * - `true`: Use default rotation settings (10MB size, 5 files, gzip compression)\n   * - Rotation options object: Customize rotation behavior\n   * - Shortcut strings: 'daily' | 'weekly' | 'monthly' | 'size'\n   *\n   * Examples:\n   * - Enable with defaults: { rotation: true }\n   * - Rotate daily: { rotation: { interval: '1d' } }\n   * - Rotate when file reaches 10MB: { rotation: { size: '10M' } }\n   * - Keep max 5 files: { rotation: { maxFiles: 5 } }\n   * - Compress rotated files: { rotation: { compress: 'gzip' } }\n   */\n  rotation?: LogRotationOptions\n}\n\nexport function LoggerFileHandler(path: string, opt: LogFileHandlerOptions = {}) {\n  const {\n    level = undefined,\n    filter = undefined,\n    time = true,\n    pretty = false,\n    rotation,\n  } = opt\n\n  path = resolve(process.cwd(), path)\n  const pathFolder = dirname(path)\n  mkdirSync(pathFolder, { recursive: true })\n\n  // Use rotating stream if rotation options are provided\n  const rotationOpts = getLogRotationConfig(rotation)\n\n  let stream: ReturnType<typeof createWriteStream> | ReturnType<typeof createRotationStream>\n  if (rotationOpts) {\n    // ensure rotation writes into the same folder\n    rotationOpts.path = pathFolder\n    stream = createRotationStream(basename(path), rotationOpts)\n  }\n  else {\n    stream = createWriteStream(path, { flags: 'a' })\n  }\n\n  const matchesNamespace = useNamespaceFilter(filter)\n  const matchesLevel = useLevelFilter(level)\n  return (msg: LogMessage) => {\n    if (!matchesLevel(msg.level))\n      return\n    if (!matchesNamespace(msg.name))\n      return\n\n    const timeNow = time ? `${new Date().toISOString()} ` : ''\n    const name = msg.name || ''\n    const ninfo = namespaces[name || '']\n    if (ninfo == null)\n      namespaces[name] = ninfo\n\n    const args: string[] = [\n      `[${name || '*'}]`,\n      renderMessages(msg.messages, { pretty }),\n    ]\n\n    function write(...args: string[]): void {\n      stream.write(`${args.join('\\t')}\\n`)\n    }\n\n    switch (msg.level) {\n      case LogLevelInfo:\n        write(`${timeNow}I|*  `, ...args)\n        break\n      case LogLevelWarn:\n        write(`${timeNow}W|** `, ...args)\n        break\n      case LogLevelError:\n        write(`${timeNow}E|***`, ...args)\n        break\n      default:\n        write(`${timeNow}D|   `, ...args)\n        break\n    }\n  }\n}\n"],"mappings":";;;;;;;;;;AAWA,MAAM,aAAkC,EAAE;AAoB1C,SAAgB,kBAAkB,MAAc,MAA6B,EAAE,EAAE;CAC/E,MAAM,EACJ,QAAQ,QACR,SAAS,QACT,OAAO,MACP,SAAS,OACT,aACE;AAEJ,QAAO,QAAQ,QAAQ,KAAK,EAAE,KAAK;CACnC,MAAM,aAAa,QAAQ,KAAK;AAChC,WAAU,YAAY,EAAE,WAAW,MAAM,CAAC;CAG1C,MAAM,eAAe,qBAAqB,SAAS;CAEnD,IAAI;AACJ,KAAI,cAAc;AAEhB,eAAa,OAAO;AACpB,WAAS,qBAAqB,SAAS,KAAK,EAAE,aAAa;OAG3D,UAAS,kBAAkB,MAAM,EAAE,OAAO,KAAK,CAAC;CAGlD,MAAM,mBAAmB,mBAAmB,OAAO;CACnD,MAAM,eAAe,eAAe,MAAM;AAC1C,SAAQ,QAAoB;AAC1B,MAAI,CAAC,aAAa,IAAI,MAAM,CAC1B;AACF,MAAI,CAAC,iBAAiB,IAAI,KAAK,CAC7B;EAEF,MAAM,UAAU,OAAO,oBAAG,IAAI,MAAM,EAAC,aAAa,CAAC,KAAK;EACxD,MAAM,OAAO,IAAI,QAAQ;EACzB,MAAM,QAAQ,WAAW,QAAQ;AACjC,MAAI,SAAS,KACX,YAAW,QAAQ;EAErB,MAAM,OAAiB,CACrB,IAAI,QAAQ,IAAI,IAChB,eAAe,IAAI,UAAU,EAAE,QAAQ,CAAC,CACzC;EAED,SAAS,MAAM,GAAG,MAAsB;AACtC,UAAO,MAAM,GAAG,KAAK,KAAK,IAAK,CAAC,IAAI;;AAGtC,UAAQ,IAAI,OAAZ;GACE;AACE,UAAM,GAAG,QAAQ,QAAQ,GAAG,KAAK;AACjC;GACF;AACE,UAAM,GAAG,QAAQ,QAAQ,GAAG,KAAK;AACjC;GACF;AACE,UAAM,GAAG,QAAQ,QAAQ,GAAG,KAAK;AACjC;GACF;AACE,UAAM,GAAG,QAAQ,QAAQ,GAAG,KAAK;AACjC"}