{"version":3,"file":"telegram-formatter.mjs","sources":["../../../../src/logger/formatter/telegram-formatter.ts"],"sourcesContent":["import type { Formatter, LogRecord } from '../../types/logger'\nimport { AbstractFormatter } from './abstract-formatter'\n\n/**\n * TelegramFormatter\n *\n * Formats a log entry for sending to Telegram.\n * Supports HTML markup with escaped special characters.\n *\n * @link https://core.telegram.org/bots/api#html-style\n */\nexport class TelegramFormatter extends AbstractFormatter implements Formatter {\n  private useHtml: boolean\n  private maxMessageLength: number\n\n  constructor(\n    useHtml: boolean = true,\n    dateFormat: string = 'YYYY-MM-DD HH:mm:ss',\n    maxMessageLength: number = 4096\n  ) {\n    super(dateFormat)\n    this.useHtml = useHtml\n    this.maxMessageLength = maxMessageLength\n  }\n\n  public override format(record: LogRecord): string {\n    // Basic formatting\n    let message = this._formatBaseMessage(record)\n\n    // Add context and extra, if any\n    const additionalInfo = this._formatAdditionalInfo(record)\n    if (additionalInfo) {\n      message += `\\n\\n${additionalInfo}`\n    }\n\n    // Truncate the message if it exceeds the maximum length\n    if (message.length > this.maxMessageLength) {\n      message = message.substring(0, this.maxMessageLength - 3) + '...'\n    }\n\n    return message\n  }\n\n  protected _formatBaseMessage(record: LogRecord): string {\n    const date = this._formatDate(record.timestamp)\n    const level = record.levelName\n\n    if (this.useHtml) {\n      return `<b>${level}</b> | <code>${record.channel}</code>\\n`\n        + `<i>Time:</i> ${date}\\n`\n        + `<i>Message:</i>\\n${record.message}`\n    } else {\n      return `*${level}* \\`${record.channel}\\`\\n`\n        + `_Time:_ \\`${date}\\`\\n`\n        + `_Message:_\\n${record.message}`\n    }\n  }\n\n  protected _formatAdditionalInfo(record: LogRecord): string {\n    const parts: string[] = []\n\n    // Add context if it is not empty\n    if (record.context && Object.keys(record.context).length > 0) {\n      const contextStr = JSON.stringify(record.context, null, 2)\n      if (this.useHtml) {\n        parts.push(`<i>Context:</i>\\n<pre><code class=\"language-json\">${this._escapeHtml(contextStr)}</code></pre>`)\n      } else {\n        parts.push(`_Context:_\\n\\`\\`\\`json\\n${contextStr}\\n\\`\\`\\``)\n      }\n    }\n\n    // Add extra if it is not empty\n    if (record.extra && Object.keys(record.extra).length > 0) {\n      const extraStr = JSON.stringify(record.extra, null, 2)\n      if (this.useHtml) {\n        parts.push(`<i>Extra:</i>\\n<pre><code class=\"language-json\">${this._escapeHtml(extraStr)}</code></pre>`)\n      } else {\n        parts.push(`_Extra:_\\n\\`\\`\\`json\\n${extraStr}\\n\\`\\`\\``)\n      }\n    }\n\n    return parts.join('\\n\\n')\n  }\n\n  protected _escapeHtml(text: string): string {\n    return text\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;')\n      .replace(/'/g, '&#039;')\n  }\n\n  protected _escapeMarkdownV2(text: string): string {\n    return text\n      .replace(/_/g, '\\\\_')\n      .replace(/\\*/g, '\\\\*')\n      .replace(/\\[/g, '\\\\[')\n      .replace(/\\]/g, '\\\\]')\n      .replace(/\\(/g, '\\\\(')\n      .replace(/\\)/g, '\\\\)')\n      .replace(/~/g, '\\\\~')\n      .replace(/`/g, '\\\\`')\n      .replace(/>/g, '\\\\>')\n      .replace(/#/g, '\\\\#')\n      .replace(/\\+/g, '\\\\+')\n      .replace(/-/g, '\\\\-')\n      .replace(/=/g, '\\\\=')\n      .replace(/\\|/g, '\\\\|')\n      .replace(/\\{/g, '\\\\{')\n      .replace(/\\}/g, '\\\\}')\n      .replace(/\\./g, '\\\\.')\n      .replace(/!/g, '\\\\!')\n  }\n\n  /**\n   * Set the use of HTML markup\n   */\n  public setUseHtml(useHtml: boolean): this {\n    this.useHtml = useHtml\n    return this\n  }\n\n  /**\n   * // Set the maximum message length\n   */\n  public setMaxMessageLength(maxLength: number): this {\n    this.maxMessageLength = maxLength\n    return this\n  }\n}\n"],"names":[],"mappings":"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"}