@mks2508/telegram-message-builder 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/builder/builder.d.ts +87 -0
  2. package/dist/builder/index.d.ts +2 -0
  3. package/dist/builder/media.d.ts +351 -0
  4. package/dist/formatters/index.d.ts +86 -0
  5. package/dist/formatters/markdown.d.ts +178 -0
  6. package/dist/formatters/markdownv2.d.ts +183 -0
  7. package/dist/index.cjs +1057 -12
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.d.ts +11 -0
  10. package/dist/index.js +1022 -13
  11. package/dist/index.js.map +1 -1
  12. package/dist/keyboard/index.d.ts +113 -0
  13. package/dist/types/constants.d.ts +13 -0
  14. package/dist/types/core.types.d.ts +74 -0
  15. package/dist/types/index.d.ts +4 -0
  16. package/dist/types/keyboard-types.index.d.ts +1 -0
  17. package/dist/types/keyboard.types.d.ts +95 -0
  18. package/dist/types/main.types.d.ts +22 -0
  19. package/dist/types/media.types.d.ts +157 -0
  20. package/package.json +1 -1
  21. package/src/builder/builder.d.ts +55 -0
  22. package/src/builder/builder.d.ts.map +1 -1
  23. package/src/builder/builder.ts +145 -10
  24. package/src/builder/index.d.ts +2 -1
  25. package/src/builder/index.d.ts.map +1 -1
  26. package/src/builder/index.ts +2 -1
  27. package/src/builder/media.d.ts +352 -0
  28. package/src/builder/media.d.ts.map +1 -0
  29. package/src/builder/media.test.ts +664 -0
  30. package/src/builder/media.ts +484 -0
  31. package/src/builder.test.ts +465 -0
  32. package/src/escaping.test.ts +2 -2
  33. package/src/formatters/index.d.ts +47 -0
  34. package/src/formatters/index.d.ts.map +1 -1
  35. package/src/formatters/index.ts +92 -1
  36. package/src/formatters/markdown.d.ts +179 -0
  37. package/src/formatters/markdown.d.ts.map +1 -0
  38. package/src/formatters/markdown.test.ts +417 -0
  39. package/src/formatters/markdown.ts +220 -0
  40. package/src/formatters/markdownv2.d.ts +184 -0
  41. package/src/formatters/markdownv2.d.ts.map +1 -0
  42. package/src/formatters/markdownv2.ts +235 -0
  43. package/src/formatters.test.ts +17 -7
  44. package/src/index.d.ts +2 -0
  45. package/src/index.d.ts.map +1 -1
  46. package/src/index.ts +12 -0
  47. package/src/integration.test.ts +523 -0
  48. package/src/media-integration.test.ts +384 -0
  49. package/src/types/index.d.ts +1 -0
  50. package/src/types/index.d.ts.map +1 -1
  51. package/src/types/index.ts +1 -0
  52. package/src/types/media.types.d.ts +158 -0
  53. package/src/types/media.types.d.ts.map +1 -0
  54. package/src/types/media.types.ts +178 -0
  55. package/src/types.test.ts +539 -0
  56. package/src/utils/index.d.ts +1 -1
  57. package/src/utils/index.ts +0 -5
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["text: string","language?: string","url: string","url","userId: number","name?: string","tag: string","emojiId: string","email: string","email","link: string","link","mode: ParseMode","type: \"inline\" | \"reply\" | \"force\"","text: string","url: string","data: string","options?: {\n forwardText?: string;\n botUsername?: string;\n requestWriteAccess?: boolean;\n }","query: string","shortName: string","pollType: string","button: IInlineKeyboardButton | IKeyboardButton","parseMode: ParseMode","mode: ParseMode","text: string","key: string","value: string","opts?: {\n bold?: boolean;\n italic?: boolean;\n code?: boolean;\n underline?: boolean;\n }","language?: string","count: number","url: string","url","userId: number","name?: string","tag: string","value: unknown","options: Record<string, unknown>"],"sources":["../src/types/constants.ts","../src/formatters/index.ts","../src/keyboard/index.ts","../src/builder/builder.ts"],"sourcesContent":["/**\n * Constantes del package.\n *\n * @module\n */\n\n/**\n * Prefijo por defecto para saludos.\n */\nexport const DEFAULT_PREFIX = \"Hello\";\n\n/**\n * Sufijo por defecto para saludos.\n */\nexport const DEFAULT_SUFFIX = \"!\";\n","import type { ParseMode } from \"../types\";\n\nexport function escapeHTML(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nexport function escapeMarkdown(text: string): string {\n return text\n .replace(/_/g, \"\\\\_\")\n .replace(/\\*/g, \"\\\\*\")\n .replace(/`/g, \"\\\\`\")\n .replace(/\\[/g, \"\\\\[\");\n}\n\nexport function escapeMarkdownV2(text: string): string {\n const reserved = \"_*[]()~`>#+-=|{}.!\";\n let result = text;\n for (const char of reserved) {\n result = result.split(char).join(`\\\\${char}`);\n }\n return result;\n}\n\nexport function bold(text: string): string {\n return `<b>${escapeHTML(text)}</b>`;\n}\n\nexport function italic(text: string): string {\n return `<i>${escapeHTML(text)}</i>`;\n}\n\nexport function underline(text: string): string {\n return `<u>${escapeHTML(text)}</u>`;\n}\n\nexport function strikethrough(text: string): string {\n return `<s>${escapeHTML(text)}</s>`;\n}\n\nexport function spoiler(text: string): string {\n return `<tg-spoiler>${escapeHTML(text)}</tg-spoiler>`;\n}\n\nexport function code(text: string): string {\n return `<code>${escapeHTML(text)}</code>`;\n}\n\nexport function pre(text: string): string {\n return `<pre>${escapeHTML(text)}</pre>`;\n}\n\nexport function codeBlock(text: string, language?: string): string {\n return language\n ? `<pre><code class=\"language-${language}\">${escapeHTML(text)}</code></pre>`\n : `<pre>${escapeHTML(text)}</pre>`;\n}\n\nexport function link(text: string, url: string): string {\n return `<a href=\"${escapeHTML(url)}\">${escapeHTML(text)}</a>`;\n}\n\nexport function mention(userId: number, name?: string): string {\n const display = name ? escapeHTML(name) : escapeHTML(`user${userId}`);\n return `<a href=\"tg://user?id=${userId}\">${display}</a>`;\n}\n\nexport function hashtag(tag: string): string {\n return `<a href=\"tg://hashtag?tag=${escapeHTML(tag)}\">#${escapeHTML(tag)}</a>`;\n}\n\nexport function customEmoji(emojiId: string): string {\n return `<tg-emoji emoji-id=\"${escapeHTML(emojiId)}\">👻</tg-emoji>`;\n}\n\nexport function email(email: string): string {\n return `<a href=\"mailto:${escapeHTML(email)}\">${escapeHTML(email)}</a>`;\n}\n\nexport function url(link: string): string {\n return `<a href=\"${escapeHTML(link)}\">${escapeHTML(link)}</a>`;\n}\n\nexport function escape(text: string, mode: ParseMode = \"html\"): string {\n switch (mode) {\n case \"html\":\n return escapeHTML(text);\n case \"markdown\":\n return escapeMarkdown(text);\n case \"markdownv2\":\n return escapeMarkdownV2(text);\n }\n}\n\nexport const fmt = {\n bold,\n italic,\n underline,\n strikethrough,\n spoiler,\n code,\n pre,\n codeBlock,\n link,\n mention,\n hashtag,\n email,\n url,\n customEmoji,\n escape,\n escapeHTML,\n escapeMarkdown,\n escapeMarkdownV2,\n};\n","/**\n * @fileoverview Keyboard Builders\n * @description Fluent API for building Telegram keyboards\n * @module telegram-message-builder/keyboard\n */\n\nimport type {\n IInlineKeyboardMarkup,\n IInlineKeyboardButton,\n IReplyKeyboardMarkup,\n IKeyboardButton,\n IForceReplyMarkup,\n} from \"../types\";\n\n/**\n * Telegram Keyboard Builder - Fluent API for building keyboards\n *\n * @example\n * ```typescript\n * const keyboard = TelegramKeyboardBuilder.inline()\n * .urlButton('Google', 'https://google.com')\n * .row()\n * .callbackButton('Yes', 'yes')\n * .callbackButton('No', 'no')\n * .buildMarkup()\n * ```\n */\nexport class TelegramKeyboardBuilder {\n private rows: IInlineKeyboardButton[][] | IKeyboardButton[][] = [];\n private type: \"inline\" | \"reply\" | \"force\" = \"inline\";\n private currentRow: IInlineKeyboardButton[] | IKeyboardButton[] = [];\n\n private constructor(type: \"inline\" | \"reply\" | \"force\") {\n this.type = type;\n }\n\n /**\n * Create an inline keyboard builder\n */\n static inline(): TelegramKeyboardBuilder {\n return new TelegramKeyboardBuilder(\"inline\");\n }\n\n /**\n * Create a reply keyboard builder\n */\n static reply(): TelegramKeyboardBuilder {\n return new TelegramKeyboardBuilder(\"reply\");\n }\n\n /**\n * Create a force reply builder\n */\n static forceReply(): TelegramKeyboardBuilder {\n return new TelegramKeyboardBuilder(\"force\");\n }\n\n /**\n * Add a URL button (inline only)\n */\n urlButton(text: string, url: string): this {\n if (this.type !== \"inline\") {\n throw new Error(\"urlButton is only available for inline keyboards\");\n }\n this.currentRow.push({ text, url });\n return this;\n }\n\n /**\n * Add a callback button (inline only)\n */\n callbackButton(text: string, data: string): this {\n if (this.type !== \"inline\") {\n throw new Error(\"callbackButton is only available for inline keyboards\");\n }\n this.currentRow.push({ text, callback_data: data });\n return this;\n }\n\n /**\n * Add a web app button (inline only)\n */\n webAppButton(text: string, url: string): this {\n if (this.type !== \"inline\") {\n throw new Error(\"webAppButton is only available for inline keyboards\");\n }\n this.currentRow.push({ text, web_app: { url } });\n return this;\n }\n\n /**\n * Add a login button (inline only)\n */\n loginButton(\n text: string,\n url: string,\n options?: {\n forwardText?: string;\n botUsername?: string;\n requestWriteAccess?: boolean;\n },\n ): this {\n if (this.type !== \"inline\") {\n throw new Error(\"loginButton is only available for inline keyboards\");\n }\n this.currentRow.push({\n text,\n login_url: {\n url,\n forward_text: options?.forwardText,\n bot_username: options?.botUsername,\n request_write_access: options?.requestWriteAccess,\n },\n });\n return this;\n }\n\n /**\n * Add a switch inline query button (inline only)\n */\n switchInlineQueryButton(text: string, query: string): this {\n if (this.type !== \"inline\") {\n throw new Error(\n \"switchInlineQueryButton is only available for inline keyboards\",\n );\n }\n this.currentRow.push({ text, switch_inline_query: query });\n return this;\n }\n\n /**\n * Add a switch inline query current chat button (inline only)\n */\n switchInlineQueryCurrentChatButton(text: string, query: string): this {\n if (this.type !== \"inline\") {\n throw new Error(\n \"switchInlineQueryCurrentChatButton is only available for inline keyboards\",\n );\n }\n this.currentRow.push({ text, switch_inline_query_current_chat: query });\n return this;\n }\n\n /**\n * Add a callback game button (inline only)\n */\n callbackGameButton(text: string, shortName: string): this {\n if (this.type !== \"inline\") {\n throw new Error(\n \"callbackGameButton is only available for inline keyboards\",\n );\n }\n this.currentRow.push({ text, callback_game: shortName });\n return this;\n }\n\n /**\n * Add a pay button (inline only)\n */\n payButton(text: string): this {\n if (this.type !== \"inline\") {\n throw new Error(\"payButton is only available for inline keyboards\");\n }\n this.currentRow.push({ text, pay: text });\n return this;\n }\n\n /**\n * Add a text button (reply keyboard only)\n */\n textButton(text: string): this {\n if (this.type !== \"reply\") {\n throw new Error(\"textButton is only available for reply keyboards\");\n }\n this.currentRow.push({ text });\n return this;\n }\n\n /**\n * Add a request contact button (reply keyboard only)\n */\n requestContactButton(text: string): this {\n if (this.type !== \"reply\") {\n throw new Error(\n \"requestContactButton is only available for reply keyboards\",\n );\n }\n this.currentRow.push({ text, request_contact: true });\n return this;\n }\n\n /**\n * Add a request location button (reply keyboard only)\n */\n requestLocationButton(text: string): this {\n if (this.type !== \"reply\") {\n throw new Error(\n \"requestLocationButton is only available for reply keyboards\",\n );\n }\n this.currentRow.push({ text, request_location: true });\n return this;\n }\n\n /**\n * Add a request poll button (reply keyboard only)\n */\n requestPollButton(text: string, pollType: string): this {\n if (this.type !== \"reply\") {\n throw new Error(\n \"requestPollButton is only available for reply keyboards\",\n );\n }\n this.currentRow.push({ text, request_poll: { type: pollType } });\n return this;\n }\n\n /**\n * Add a custom button to current row\n */\n button(button: IInlineKeyboardButton | IKeyboardButton): this {\n this.currentRow.push(button);\n return this;\n }\n\n /**\n * Finish current row and start a new one\n */\n row(): this {\n if (this.currentRow.length > 0) {\n this.rows.push([...this.currentRow]);\n this.currentRow = [];\n }\n return this;\n }\n\n /**\n * Build inline keyboard markup\n */\n buildMarkup(): IInlineKeyboardMarkup {\n // Add last row if not empty\n if (this.currentRow.length > 0) {\n this.rows.push([...this.currentRow]);\n }\n\n return { inline_keyboard: this.rows as IInlineKeyboardButton[][] };\n }\n\n /**\n * Build reply keyboard markup\n */\n buildReplyMarkup(): IReplyKeyboardMarkup {\n // Add last row if not empty\n if (this.currentRow.length > 0) {\n this.rows.push([...this.currentRow]);\n }\n\n return {\n keyboard: this.rows as IKeyboardButton[][],\n resize_keyboard: true,\n one_time_keyboard: false,\n selective: false,\n };\n }\n\n /**\n * Build force reply markup\n */\n buildForceReplyMarkup(): IForceReplyMarkup {\n return { force_reply: true };\n }\n\n /**\n * Build markup based on keyboard type\n */\n build(): IInlineKeyboardMarkup | IReplyKeyboardMarkup | IForceReplyMarkup {\n switch (this.type) {\n case \"inline\":\n return this.buildMarkup();\n case \"reply\":\n return this.buildReplyMarkup();\n case \"force\":\n return this.buildForceReplyMarkup();\n }\n }\n}\n","import type { TelegramMessage, ParseMode } from \"../types\";\nimport * as fmt from \"../formatters\";\n\n/**\n * Telegram Message Builder - Fluent API for building formatted Telegram messages\n */\nexport class TelegramMessageBuilder {\n private parts: string[] = [];\n private parseMode: ParseMode = \"html\";\n private options: Record<string, unknown> = {};\n\n private constructor(parseMode: ParseMode) {\n this.parseMode = parseMode;\n }\n\n static text(): TelegramMessageBuilder {\n return new TelegramMessageBuilder(\"html\");\n }\n\n setParseMode(mode: ParseMode): this {\n this.parseMode = mode;\n return this;\n }\n\n title(text: string): this {\n this.parts.push(fmt.bold(text));\n return this;\n }\n\n section(text: string): this {\n this.parts.push(fmt.underline(text));\n return this;\n }\n\n line(\n key: string,\n value: string,\n opts?: {\n bold?: boolean;\n italic?: boolean;\n code?: boolean;\n underline?: boolean;\n },\n ): this {\n let formattedValue = value;\n\n if (opts?.bold) {\n formattedValue = fmt.bold(value);\n } else if (opts?.italic) {\n formattedValue = fmt.italic(value);\n } else if (opts?.code) {\n formattedValue = fmt.code(value);\n } else if (opts?.underline) {\n formattedValue = fmt.underline(value);\n }\n\n this.parts.push(`${key}: ${formattedValue}`);\n return this;\n }\n\n codeBlock(text: string, language?: string): this {\n this.parts.push(fmt.codeBlock(text, language));\n return this;\n }\n\n listItem(text: string): this {\n this.parts.push(`• ${text}`);\n return this;\n }\n\n newline(count: number = 1): this {\n for (let i = 0; i < count; i++) {\n this.parts.push(\"\\n\\n\");\n }\n return this;\n }\n\n separator(): this {\n this.parts.push(\"---\");\n return this;\n }\n\n text(text: string): this {\n this.parts.push(fmt.escape(text, this.parseMode));\n return this;\n }\n\n link(text: string, url: string): this {\n this.parts.push(fmt.link(text, url));\n return this;\n }\n\n mention(userId: number, name?: string): this {\n this.parts.push(fmt.mention(userId, name));\n return this;\n }\n\n hashtag(tag: string): this {\n this.parts.push(fmt.hashtag(tag));\n return this;\n }\n\n build(): TelegramMessage {\n return {\n text: this.parts.join(\"\\n\"),\n parse_mode: this.parseMode,\n ...this.options,\n };\n }\n\n setOption(key: string, value: unknown): this {\n this.options[key] = value;\n return this;\n }\n\n setOptions(options: Record<string, unknown>): this {\n this.options = { ...this.options, ...options };\n return this;\n }\n\n getParseMode(): ParseMode {\n return this.parseMode;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["text: string","language?: string","url: string","url","userId: number","_name?: string","tag: string","email: string","email","emojiId: string","markdown: string","text: string","language?: string","url: string","url","userId: number","name?: string","tag: string","email: string","email","emojiId: string","markdown: string","text: string","language?: string","url: string","url","userId: number","name?: string","tag: string","emojiId: string","email: string","email","link: string","link","html: string","mode: ParseMode","type: \"inline\" | \"reply\" | \"force\"","text: string","url: string","data: string","options?: {\n forwardText?: string;\n botUsername?: string;\n requestWriteAccess?: boolean;\n }","query: string","shortName: string","pollType: string","button: IInlineKeyboardButton | IKeyboardButton","parseMode: ParseMode","mode: ParseMode","text: string","language?: string","url: string","url","userId: number","name?: string","tag: string","key: string","value: string","opts?: {\n bold?: boolean;\n italic?: boolean;\n code?: boolean;\n underline?: boolean;\n }","count: number","value: unknown","options: Record<string, unknown>","source: MediaSource","mediaType: T","text: string","mode: ParseMode","key: K","value: IMediaCommonOptions[K]","opts: Partial<IMediaCommonOptions>","result: IMediaBuildResult","thumb: Buffer | string","seconds: number","px: number","name: string","type: string"],"sources":["../src/types/constants.ts","../src/formatters/markdown.ts","../src/formatters/markdownv2.ts","../src/formatters/index.ts","../src/keyboard/index.ts","../src/builder/builder.ts","../src/builder/media.ts"],"sourcesContent":["/**\n * Constantes del package.\n *\n * @module\n */\n\n/**\n * Prefijo por defecto para saludos.\n */\nexport const DEFAULT_PREFIX = \"Hello\";\n\n/**\n * Sufijo por defecto para saludos.\n */\nexport const DEFAULT_SUFFIX = \"!\";\n","/**\n * @fileoverview Markdown (Legacy) Formatters\n * @description Text formatting functions for Telegram's legacy Markdown parse mode\n * @module telegram-message-builder/formatters\n *\n * @see {@link https://core.telegram.org/bots/api#formatting-options | Telegram Bot API - Formatting Options}\n */\n\n/**\n * Formats text as bold in Markdown\n *\n * @param text - The text to format\n * @returns Bold formatted text\n * @example\n * ```typescript\n * boldMD(\"Hello\") // \"*Hello*\"\n * ```\n */\nexport function boldMD(text: string): string {\n return `*${text}*`;\n}\n\n/**\n * Formats text as italic in Markdown\n *\n * @param text - The text to format\n * @returns Italic formatted text\n * @example\n * ```typescript\n * italicMD(\"Hello\") // \"_Hello_\"\n * ```\n */\nexport function italicMD(text: string): string {\n return `_${text}_`;\n}\n\n/**\n * Formats text as monospace code in Markdown\n *\n * @param text - The text to format\n * @returns Code formatted text\n * @example\n * ```typescript\n * codeMD(\"const x = 1\") // \"`const x = 1`\"\n * ```\n */\nexport function codeMD(text: string): string {\n return `\\`${text}\\``;\n}\n\n/**\n * Formats text as a code block in Markdown\n *\n * @param text - The code to format\n * @param language - Optional programming language for syntax highlighting\n * @returns Code block formatted text\n * @example\n * ```typescript\n * codeBlockMD(\"console.log('Hello')\") // \"```console.log('Hello')```\"\n * codeBlockMD(\"const x = 1\", \"javascript\") // \"```javascript\\nconst x = 1\\n```\"\n * ```\n */\nexport function codeBlockMD(text: string, language?: string): string {\n return language ? `${language}\\n${text}\\n` : `${text}\\n`;\n}\n\n/**\n * Creates a link in Markdown format\n *\n * @param text - The link text\n * @param url - The URL to link to\n * @returns Link formatted text\n * @example\n * ```typescript\n * linkMD(\"Google\", \"https://google.com\") // \"[Google](https://google.com)\"\n * ```\n */\nexport function linkMD(text: string, url: string): string {\n return `[${text}](${url})`;\n}\n\n/**\n * Creates a user mention link in Markdown format\n *\n * @param userId - The user's ID\n * @param name - Optional display name\n * @returns Mention formatted text\n * @example\n * ```typescript\n * mentionMD(123456) // \"tg://user?id=123456\"\n * mentionMD(123456, \"John\") // \"tg://user?id=123456\"\n * ```\n */\nexport function mentionMD(userId: number, _name?: string): string {\n return `tg://user?id=${userId}`;\n}\n\n/**\n * Creates a hashtag link in Markdown format\n *\n * @param tag - The hashtag text (without #)\n * @returns Hashtag formatted text\n * @example\n * ```typescript\n * hashtagMD(\"test\") // \"#test\"\n * ```\n */\nexport function hashtagMD(tag: string): string {\n return `#${tag}`;\n}\n\n/**\n * Formats text as underline in Markdown (limited support)\n *\n * Note: Standard Markdown doesn't support underline. This uses HTML which\n * may not work in all Telegram clients.\n *\n * @param text - The text to format\n * @returns Underline formatted text (HTML fallback)\n * @example\n * ```typescript\n * underlineMD(\"Hello\") // \"<u>Hello</u>\"\n * ```\n */\nexport function underlineMD(text: string): string {\n return `<u>${text}</u>`;\n}\n\n/**\n * Formats text as strikethrough in Markdown (limited support)\n *\n * Note: Standard Markdown doesn't support strikethrough. This uses HTML which\n * may not work in all Telegram clients.\n *\n * @param text - The text to format\n * @returns Strikethrough formatted text (HTML fallback)\n * @example\n * ```typescript\n * strikethroughMD(\"Hello\") // \"<s>Hello</s>\"\n * ```\n */\nexport function strikethroughMD(text: string): string {\n return `<s>${text}</s>`;\n}\n\n/**\n * Formats text as spoiler in Markdown (limited support)\n *\n * Note: Standard Markdown doesn't support spoiler. This uses HTML which\n * may not work in all Telegram clients.\n *\n * @param text - The text to format\n * @returns Spoiler formatted text (HTML fallback)\n * @example\n * ```typescript\n * spoilerMD(\"Secret\") // \"<tg-spoiler>Secret</tg-spoiler>\"\n * ```\n */\nexport function spoilerMD(text: string): string {\n return `<tg-spoiler>${text}</tg-spoiler>`;\n}\n\n/**\n * Creates an email link in Markdown format\n *\n * @param email - The email address\n * @returns Email link formatted text\n * @example\n * ```typescript\n * emailMD(\"test@example.com\") // \"[test@example.com](mailto:test@example.com)\"\n * ```\n */\nexport function emailMD(email: string): string {\n return `[${email}](mailto:${email})`;\n}\n\n/**\n * Creates a URL link in Markdown format\n *\n * @param url - The URL\n * @returns URL link formatted text\n * @example\n * ```typescript\n * urlMD(\"https://example.com\") // \"[https://example.com](https://example.com)\"\n * ```\n */\nexport function urlMD(url: string): string {\n return `[${url}](${url})`;\n}\n\n/**\n * Creates a custom emoji in Markdown format (limited support)\n *\n * Note: Standard Markdown doesn't support custom emoji. This uses HTML which\n * may not work in all Telegram clients.\n *\n * @param emojiId - The custom emoji ID\n * @returns Custom emoji formatted text (HTML fallback)\n * @example\n * ```typescript\n * customEmojiMD(\"5368324170672642286\") // \"<tg-emoji emoji-id=\\\"5368324170672642286\\\">👻</tg-emoji>\"\n * ```\n */\nexport function customEmojiMD(emojiId: string): string {\n return `<tg-emoji emoji-id=\"${emojiId}\">👻</tg-emoji>`;\n}\n\n/**\n * Raw Markdown string - bypasses any automatic formatting\n *\n * @param markdown - Pre-formatted Markdown string\n * @returns The Markdown string unchanged\n * @example\n * ```typescript\n * rawMD(\"*Hello*\") // \"*Hello*\"\n * ```\n */\nexport function rawMD(markdown: string): string {\n return markdown;\n}\n","/**\n * @fileoverview MarkdownV2 Formatters\n * @description Text formatting functions for Telegram's MarkdownV2 parse mode\n * @module telegram-message-builder/formatters\n *\n * @see {@link https://core.telegram.org/bots/api#markdownv2-style | Telegram Bot API - MarkdownV2 Style}\n */\n\n/**\n * Formats text as bold in MarkdownV2\n *\n * @param text - The text to format\n * @returns Bold formatted text\n * @example\n * ```typescript\n * boldMDv2(\"Hello\") // \"*Hello*\"\n * ```\n */\nexport function boldMDv2(text: string): string {\n return `*${text}*`;\n}\n\n/**\n * Formats text as italic in MarkdownV2\n *\n * @param text - The text to format\n * @returns Italic formatted text\n * @example\n * ```typescript\n * italicMDv2(\"Hello\") // \"_Hello_\"\n * ```\n */\nexport function italicMDv2(text: string): string {\n return `_${text}_`;\n}\n\n/**\n * Formats text as underline in MarkdownV2\n *\n * @param text - The text to format\n * @returns Underline formatted text\n * @example\n * ```typescript\n * underlineMDv2(\"Hello\") // \"__Hello__\"\n * ```\n */\nexport function underlineMDv2(text: string): string {\n return `__${text}__`;\n}\n\n/**\n * Formats text as strikethrough in MarkdownV2\n *\n * @param text - The text to format\n * @returns Strikethrough formatted text\n * @example\n * ```typescript\n * strikethroughMDv2(\"Hello\") // \"~Hello~\"\n * ```\n */\nexport function strikethroughMDv2(text: string): string {\n return `~${text}~`;\n}\n\n/**\n * Formats text as spoiler in MarkdownV2\n *\n * @param text - The text to format\n * @returns Spoiler formatted text\n * @example\n * ```typescript\n * spoilerMDv2(\"Secret\") // \"||Secret||\"\n * ```\n */\nexport function spoilerMDv2(text: string): string {\n return `||${text}||`;\n}\n\n/**\n * Formats text as monospace code in MarkdownV2\n *\n * @param text - The text to format\n * @returns Code formatted text\n * @example\n * ```typescript\n * codeMDv2(\"const x = 1\") // \"`const x = 1`\"\n * ```\n */\nexport function codeMDv2(text: string): string {\n return `\\`${text}\\``;\n}\n\n/**\n * Formats text as a code block in MarkdownV2\n *\n * @param text - The code to format\n * @param language - Optional programming language for syntax highlighting\n * @returns Code block formatted text\n * @example\n * ```typescript\n * codeBlockMDv2(\"console.log('Hello')\") // \"```console.log('Hello')```\"\n * codeBlockMDv2(\"const x = 1\", \"javascript\") // \"```javascript\\nconst x = 1\\n```\"\n * ```\n */\nexport function codeBlockMDv2(text: string, language?: string): string {\n return language ? `${language}\\n${text}\\n` : `${text}\\n`;\n}\n\n/**\n * Creates a link in MarkdownV2 format\n *\n * @param text - The link text\n * @param url - The URL to link to\n * @returns Link formatted text\n * @example\n * ```typescript\n * linkMDv2(\"Google\", \"https://google.com\") // \"[Google](https://google.com)\"\n * ```\n */\nexport function linkMDv2(text: string, url: string): string {\n return `[${text}](${url})`;\n}\n\n/**\n * Creates a user mention link in MarkdownV2 format\n *\n * @param userId - The user's ID\n * @param name - Optional display name (ignored in MarkdownV2)\n * @returns Mention formatted text\n * @example\n * ```typescript\n * mentionMDv2(123456) // \"[user](tg://user?id=123456)\"\n * mentionMDv2(123456, \"John\") // \"[John](tg://user?id=123456)\"\n * ```\n */\nexport function mentionMDv2(userId: number, name?: string): string {\n const display = name || `user`;\n return `[${display}](tg://user?id=${userId})`;\n}\n\n/**\n * Creates a hashtag link in MarkdownV2 format\n *\n * @param tag - The hashtag text (without #)\n * @returns Hashtag formatted text\n * @example\n * ```typescript\n * hashtagMDv2(\"test\") // \"#test\"\n * ```\n */\nexport function hashtagMDv2(tag: string): string {\n return `#${tag}`;\n}\n\n/**\n * Creates an email link in MarkdownV2 format\n *\n * @param email - The email address\n * @returns Email link formatted text\n * @example\n * ```typescript\n * emailMDv2(\"test@example.com\") // \"[test@example.com](mailto:test@example.com)\"\n * ```\n */\nexport function emailMDv2(email: string): string {\n return `[${email}](mailto:${email})`;\n}\n\n/**\n * Creates a URL link in MarkdownV2 format\n *\n * @param url - The URL\n * @returns URL link formatted text\n * @example\n * ```typescript\n * urlMDv2(\"https://example.com\") // \"[https://example.com](https://example.com)\"\n * ```\n */\nexport function urlMDv2(url: string): string {\n return `[${url}](${url})`;\n}\n\n/**\n * Creates a custom emoji in MarkdownV2 format\n *\n * Note: Custom emoji syntax in MarkdownV2 uses a special format with the emoji\n * ID wrapped in special syntax.\n *\n * @param emojiId - The custom emoji ID\n * @returns Custom emoji formatted text\n * @example\n * ```typescript\n * customEmojiMDv2(\"5368324170672642286\") // \"👻 [Custom emoji](tg://emoji?id=5368324170672642286)\"\n * ```\n */\nexport function customEmojiMDv2(emojiId: string): string {\n // MarkdownV2 uses a link format for custom emojis\n return `[👻](tg://emoji?id=${emojiId})`;\n}\n\n/**\n * Raw MarkdownV2 string - bypasses any automatic formatting\n *\n * @param markdown - Pre-formatted MarkdownV2 string\n * @returns The MarkdownV2 string unchanged\n * @example\n * ```typescript\n * rawMDv2(\"*Hello*\") // \"*Hello*\"\n * ```\n */\nexport function rawMDv2(markdown: string): string {\n return markdown;\n}\n\n/**\n * Pre-escapes text for safe use in MarkdownV2 formatting\n *\n * MarkdownV2 requires careful character escaping. This function escapes\n * all reserved characters for safe use in formatted text.\n *\n * @param text - The text to escape\n * @returns Escaped text safe for MarkdownV2\n * @example\n * ```typescript\n * escapeMDv2(\"Hello_World\") // \"Hello\\\\_World\"\n * ```\n */\nexport function escapeMDv2(text: string): string {\n const reserved = \"_*[]()~`>#+-=|{}.!\";\n let result = text;\n for (const char of reserved) {\n result = result.split(char).join(`\\\\${char}`);\n }\n return result;\n}\n","import type { ParseMode } from \"../types\";\n\n// Import Markdown and MarkdownV2 formatters for use in fmt object\nimport {\n boldMD,\n italicMD,\n codeMD,\n codeBlockMD,\n linkMD,\n mentionMD,\n hashtagMD,\n underlineMD,\n strikethroughMD,\n spoilerMD,\n emailMD,\n urlMD,\n customEmojiMD,\n rawMD,\n} from \"./markdown\";\n\nimport {\n boldMDv2,\n italicMDv2,\n underlineMDv2,\n strikethroughMDv2,\n spoilerMDv2,\n codeMDv2,\n codeBlockMDv2,\n linkMDv2,\n mentionMDv2,\n hashtagMDv2,\n emailMDv2,\n urlMDv2,\n customEmojiMDv2,\n rawMDv2,\n escapeMDv2,\n} from \"./markdownv2\";\n\n// Re-export all formatters for external use\nexport * from \"./markdown\";\nexport * from \"./markdownv2\";\n\nexport function escapeHTML(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nexport function escapeMarkdown(text: string): string {\n return text\n .replace(/_/g, \"\\\\_\")\n .replace(/\\*/g, \"\\\\*\")\n .replace(/`/g, \"\\\\`\")\n .replace(/\\[/g, \"\\\\[\");\n}\n\nexport function escapeMarkdownV2(text: string): string {\n const reserved = \"_*[]()~`>#+-=|{}.!\";\n let result = text;\n for (const char of reserved) {\n result = result.split(char).join(`\\\\${char}`);\n }\n return result;\n}\n\nexport function bold(text: string): string {\n return `<b>${escapeHTML(text)}</b>`;\n}\n\nexport function italic(text: string): string {\n return `<i>${escapeHTML(text)}</i>`;\n}\n\nexport function underline(text: string): string {\n return `<u>${escapeHTML(text)}</u>`;\n}\n\nexport function strikethrough(text: string): string {\n return `<s>${escapeHTML(text)}</s>`;\n}\n\nexport function spoiler(text: string): string {\n return `<tg-spoiler>${escapeHTML(text)}</tg-spoiler>`;\n}\n\nexport function code(text: string): string {\n return `<code>${escapeHTML(text)}</code>`;\n}\n\nexport function pre(text: string): string {\n return `<pre>${escapeHTML(text)}</pre>`;\n}\n\nexport function codeBlock(text: string, language?: string): string {\n return language\n ? `<pre><code class=\"language-${language}\">${escapeHTML(text)}</code></pre>`\n : `<pre><code>${escapeHTML(text)}</code></pre>`;\n}\n\nexport function link(text: string, url: string): string {\n return `<a href=\"${escapeHTML(url)}\">${escapeHTML(text)}</a>`;\n}\n\nexport function mention(userId: number, name?: string): string {\n const display = name ? escapeHTML(name) : escapeHTML(`user${userId}`);\n return `<a href=\"tg://user?id=${userId}\">${display}</a>`;\n}\n\nexport function hashtag(tag: string): string {\n return `<a href=\"tg://hashtag?tag=${escapeHTML(tag)}\">#${escapeHTML(tag)}</a>`;\n}\n\nexport function customEmoji(emojiId: string): string {\n return `<tg-emoji emoji-id=\"${escapeHTML(emojiId)}\">👻</tg-emoji>`;\n}\n\nexport function email(email: string): string {\n return `<a href=\"mailto:${escapeHTML(email)}\">${escapeHTML(email)}</a>`;\n}\n\nexport function url(link: string): string {\n return `<a href=\"${escapeHTML(link)}\">${escapeHTML(link)}</a>`;\n}\n\n/**\n * Raw HTML string - bypasses escaping for combining pre-formatted content\n *\n * @example\n * ```typescript\n * // Instead of this (which escapes inner tags):\n * fmt.bold(fmt.italic(\"Text\")) // <b>&lt;i&gt;Text&lt;/i&gt;</b>\n *\n * // Use this:\n * fmt.bold(fmt.raw(fmt.italic(\"Text\"))) // <b><i>Text</i></b>\n * ```\n */\nexport function raw(html: string): string {\n return html;\n}\n\nexport function escape(text: string, mode: ParseMode = \"html\"): string {\n switch (mode) {\n case \"html\":\n return escapeHTML(text);\n case \"markdown\":\n return escapeMarkdown(text);\n case \"markdownv2\":\n return escapeMarkdownV2(text);\n }\n}\n\nexport const fmt = {\n // HTML formatters\n bold,\n italic,\n underline,\n strikethrough,\n spoiler,\n code,\n pre,\n codeBlock,\n link,\n mention,\n hashtag,\n email,\n url,\n customEmoji,\n escape,\n escapeHTML,\n escapeMarkdown,\n escapeMarkdownV2,\n raw,\n\n // Markdown formatters\n boldMD,\n italicMD,\n codeMD,\n codeBlockMD,\n linkMD,\n mentionMD,\n hashtagMD,\n underlineMD,\n strikethroughMD,\n spoilerMD,\n emailMD,\n urlMD,\n customEmojiMD,\n rawMD,\n\n // MarkdownV2 formatters\n boldMDv2,\n italicMDv2,\n underlineMDv2,\n strikethroughMDv2,\n spoilerMDv2,\n codeMDv2,\n codeBlockMDv2,\n linkMDv2,\n mentionMDv2,\n hashtagMDv2,\n emailMDv2,\n urlMDv2,\n customEmojiMDv2,\n rawMDv2,\n escapeMDv2,\n};\n","/**\n * @fileoverview Keyboard Builders\n * @description Fluent API for building Telegram keyboards\n * @module telegram-message-builder/keyboard\n */\n\nimport type {\n IInlineKeyboardMarkup,\n IInlineKeyboardButton,\n IReplyKeyboardMarkup,\n IKeyboardButton,\n IForceReplyMarkup,\n} from \"../types\";\n\n/**\n * Telegram Keyboard Builder - Fluent API for building keyboards\n *\n * @example\n * ```typescript\n * const keyboard = TelegramKeyboardBuilder.inline()\n * .urlButton('Google', 'https://google.com')\n * .row()\n * .callbackButton('Yes', 'yes')\n * .callbackButton('No', 'no')\n * .buildMarkup()\n * ```\n */\nexport class TelegramKeyboardBuilder {\n private rows: IInlineKeyboardButton[][] | IKeyboardButton[][] = [];\n private type: \"inline\" | \"reply\" | \"force\" = \"inline\";\n private currentRow: IInlineKeyboardButton[] | IKeyboardButton[] = [];\n\n private constructor(type: \"inline\" | \"reply\" | \"force\") {\n this.type = type;\n }\n\n /**\n * Create an inline keyboard builder\n */\n static inline(): TelegramKeyboardBuilder {\n return new TelegramKeyboardBuilder(\"inline\");\n }\n\n /**\n * Create a reply keyboard builder\n */\n static reply(): TelegramKeyboardBuilder {\n return new TelegramKeyboardBuilder(\"reply\");\n }\n\n /**\n * Create a force reply builder\n */\n static forceReply(): TelegramKeyboardBuilder {\n return new TelegramKeyboardBuilder(\"force\");\n }\n\n /**\n * Add a URL button (inline only)\n */\n urlButton(text: string, url: string): this {\n if (this.type !== \"inline\") {\n throw new Error(\"urlButton is only available for inline keyboards\");\n }\n this.currentRow.push({ text, url });\n return this;\n }\n\n /**\n * Add a callback button (inline only)\n */\n callbackButton(text: string, data: string): this {\n if (this.type !== \"inline\") {\n throw new Error(\"callbackButton is only available for inline keyboards\");\n }\n this.currentRow.push({ text, callback_data: data });\n return this;\n }\n\n /**\n * Add a web app button (inline only)\n */\n webAppButton(text: string, url: string): this {\n if (this.type !== \"inline\") {\n throw new Error(\"webAppButton is only available for inline keyboards\");\n }\n this.currentRow.push({ text, web_app: { url } });\n return this;\n }\n\n /**\n * Add a login button (inline only)\n */\n loginButton(\n text: string,\n url: string,\n options?: {\n forwardText?: string;\n botUsername?: string;\n requestWriteAccess?: boolean;\n },\n ): this {\n if (this.type !== \"inline\") {\n throw new Error(\"loginButton is only available for inline keyboards\");\n }\n this.currentRow.push({\n text,\n login_url: {\n url,\n forward_text: options?.forwardText,\n bot_username: options?.botUsername,\n request_write_access: options?.requestWriteAccess,\n },\n });\n return this;\n }\n\n /**\n * Add a switch inline query button (inline only)\n */\n switchInlineQueryButton(text: string, query: string): this {\n if (this.type !== \"inline\") {\n throw new Error(\n \"switchInlineQueryButton is only available for inline keyboards\",\n );\n }\n this.currentRow.push({ text, switch_inline_query: query });\n return this;\n }\n\n /**\n * Add a switch inline query current chat button (inline only)\n */\n switchInlineQueryCurrentChatButton(text: string, query: string): this {\n if (this.type !== \"inline\") {\n throw new Error(\n \"switchInlineQueryCurrentChatButton is only available for inline keyboards\",\n );\n }\n this.currentRow.push({ text, switch_inline_query_current_chat: query });\n return this;\n }\n\n /**\n * Add a callback game button (inline only)\n */\n callbackGameButton(text: string, shortName: string): this {\n if (this.type !== \"inline\") {\n throw new Error(\n \"callbackGameButton is only available for inline keyboards\",\n );\n }\n this.currentRow.push({ text, callback_game: shortName });\n return this;\n }\n\n /**\n * Add a pay button (inline only)\n */\n payButton(text: string): this {\n if (this.type !== \"inline\") {\n throw new Error(\"payButton is only available for inline keyboards\");\n }\n this.currentRow.push({ text, pay: text });\n return this;\n }\n\n /**\n * Add a text button (reply keyboard only)\n */\n textButton(text: string): this {\n if (this.type !== \"reply\") {\n throw new Error(\"textButton is only available for reply keyboards\");\n }\n this.currentRow.push({ text });\n return this;\n }\n\n /**\n * Add a request contact button (reply keyboard only)\n */\n requestContactButton(text: string): this {\n if (this.type !== \"reply\") {\n throw new Error(\n \"requestContactButton is only available for reply keyboards\",\n );\n }\n this.currentRow.push({ text, request_contact: true });\n return this;\n }\n\n /**\n * Add a request location button (reply keyboard only)\n */\n requestLocationButton(text: string): this {\n if (this.type !== \"reply\") {\n throw new Error(\n \"requestLocationButton is only available for reply keyboards\",\n );\n }\n this.currentRow.push({ text, request_location: true });\n return this;\n }\n\n /**\n * Add a request poll button (reply keyboard only)\n */\n requestPollButton(text: string, pollType: string): this {\n if (this.type !== \"reply\") {\n throw new Error(\n \"requestPollButton is only available for reply keyboards\",\n );\n }\n this.currentRow.push({ text, request_poll: { type: pollType } });\n return this;\n }\n\n /**\n * Add a custom button to current row\n */\n button(button: IInlineKeyboardButton | IKeyboardButton): this {\n this.currentRow.push(button);\n return this;\n }\n\n /**\n * Finish current row and start a new one\n */\n row(): this {\n if (this.currentRow.length > 0) {\n this.rows.push([...this.currentRow]);\n this.currentRow = [];\n }\n return this;\n }\n\n /**\n * Build inline keyboard markup\n */\n buildMarkup(): IInlineKeyboardMarkup {\n // Add last row if not empty\n if (this.currentRow.length > 0) {\n this.rows.push([...this.currentRow]);\n }\n\n return { inline_keyboard: this.rows as IInlineKeyboardButton[][] };\n }\n\n /**\n * Build reply keyboard markup\n */\n buildReplyMarkup(): IReplyKeyboardMarkup {\n // Add last row if not empty\n if (this.currentRow.length > 0) {\n this.rows.push([...this.currentRow]);\n }\n\n return {\n keyboard: this.rows as IKeyboardButton[][],\n resize_keyboard: true,\n one_time_keyboard: false,\n selective: false,\n };\n }\n\n /**\n * Build force reply markup\n */\n buildForceReplyMarkup(): IForceReplyMarkup {\n return { force_reply: true };\n }\n\n /**\n * Build markup based on keyboard type\n */\n build(): IInlineKeyboardMarkup | IReplyKeyboardMarkup | IForceReplyMarkup {\n switch (this.type) {\n case \"inline\":\n return this.buildMarkup();\n case \"reply\":\n return this.buildReplyMarkup();\n case \"force\":\n return this.buildForceReplyMarkup();\n }\n }\n}\n","import type { TelegramMessage, ParseMode } from \"../types\";\nimport * as fmt from \"../formatters\";\n\n/**\n * Telegram Message Builder - Fluent API for building formatted Telegram messages\n *\n * Supports all three Telegram parse modes: HTML, Markdown, and MarkdownV2\n *\n * @example\n * ```typescript\n * // HTML mode (default)\n * const msg1 = TelegramMessageBuilder.text()\n * .title(\"Welcome\")\n * .line(\"Status\", \"Active\", { bold: true })\n * .build();\n *\n * // Markdown mode\n * const msg2 = TelegramMessageBuilder.text()\n * .setParseMode(\"markdown\")\n * .title(\"Welcome\")\n * .build();\n *\n * // MarkdownV2 mode\n * const msg3 = TelegramMessageBuilder.text()\n * .setParseMode(\"markdownv2\")\n * .title(\"Welcome\")\n * .build();\n * ```\n */\nexport class TelegramMessageBuilder {\n private parts: string[] = [];\n private parseMode: ParseMode = \"html\";\n private options: Record<string, unknown> = {};\n\n private constructor(parseMode: ParseMode) {\n this.parseMode = parseMode;\n }\n\n static text(): TelegramMessageBuilder {\n return new TelegramMessageBuilder(\"html\");\n }\n\n setParseMode(mode: ParseMode): this {\n this.parseMode = mode;\n return this;\n }\n\n /**\n * Formats text as bold based on current parse mode\n */\n private bold(text: string): string {\n switch (this.parseMode) {\n case \"html\":\n return fmt.bold(text);\n case \"markdown\":\n return fmt.boldMD(text);\n case \"markdownv2\":\n return fmt.boldMDv2(text);\n }\n }\n\n /**\n * Formats text as italic based on current parse mode\n */\n private italic(text: string): string {\n switch (this.parseMode) {\n case \"html\":\n return fmt.italic(text);\n case \"markdown\":\n return fmt.italicMD(text);\n case \"markdownv2\":\n return fmt.italicMDv2(text);\n }\n }\n\n /**\n * Formats text as underline based on current parse mode\n */\n private underline(text: string): string {\n switch (this.parseMode) {\n case \"html\":\n return fmt.underline(text);\n case \"markdown\":\n return fmt.underlineMD(text);\n case \"markdownv2\":\n return fmt.underlineMDv2(text);\n }\n }\n\n /**\n * Formats text as code based on current parse mode\n */\n private code(text: string): string {\n switch (this.parseMode) {\n case \"html\":\n return fmt.code(text);\n case \"markdown\":\n return fmt.codeMD(text);\n case \"markdownv2\":\n return fmt.codeMDv2(text);\n }\n }\n\n /**\n * Formats text as code block based on current parse mode\n */\n private codeBlockFormat(text: string, language?: string): string {\n switch (this.parseMode) {\n case \"html\":\n return fmt.codeBlock(text, language);\n case \"markdown\":\n return fmt.codeBlockMD(text, language);\n case \"markdownv2\":\n return fmt.codeBlockMDv2(text, language);\n }\n }\n\n /**\n * Creates a link based on current parse mode\n */\n private linkFormat(text: string, url: string): string {\n switch (this.parseMode) {\n case \"html\":\n return fmt.link(text, url);\n case \"markdown\":\n return fmt.linkMD(text, url);\n case \"markdownv2\":\n return fmt.linkMDv2(text, url);\n }\n }\n\n /**\n * Creates a mention based on current parse mode\n */\n private mentionFormat(userId: number, name?: string): string {\n switch (this.parseMode) {\n case \"html\":\n return fmt.mention(userId, name);\n case \"markdown\":\n return fmt.mentionMD(userId, name);\n case \"markdownv2\":\n return fmt.mentionMDv2(userId, name);\n }\n }\n\n /**\n * Creates a hashtag based on current parse mode\n */\n private hashtagFormat(tag: string): string {\n switch (this.parseMode) {\n case \"html\":\n return fmt.hashtag(tag);\n case \"markdown\":\n return fmt.hashtagMD(tag);\n case \"markdownv2\":\n return fmt.hashtagMDv2(tag);\n }\n }\n\n title(text: string): this {\n this.parts.push(this.bold(text));\n return this;\n }\n\n section(text: string): this {\n this.parts.push(this.underline(text));\n return this;\n }\n\n line(\n key: string,\n value: string,\n opts?: {\n bold?: boolean;\n italic?: boolean;\n code?: boolean;\n underline?: boolean;\n },\n ): this {\n let formattedValue = value;\n\n if (opts?.bold) {\n formattedValue = this.bold(value);\n } else if (opts?.italic) {\n formattedValue = this.italic(value);\n } else if (opts?.code) {\n formattedValue = this.code(value);\n } else if (opts?.underline) {\n formattedValue = this.underline(value);\n }\n\n this.parts.push(`${key}: ${formattedValue}`);\n return this;\n }\n\n codeBlock(text: string, language?: string): this {\n this.parts.push(this.codeBlockFormat(text, language));\n return this;\n }\n\n listItem(text: string): this {\n this.parts.push(`• ${text}`);\n return this;\n }\n\n newline(count: number = 1): this {\n for (let i = 0; i < count; i++) {\n this.parts.push(\"\\n\\n\");\n }\n return this;\n }\n\n separator(): this {\n this.parts.push(\"---\");\n return this;\n }\n\n text(text: string): this {\n this.parts.push(fmt.escape(text, this.parseMode));\n return this;\n }\n\n link(text: string, url: string): this {\n this.parts.push(this.linkFormat(text, url));\n return this;\n }\n\n mention(userId: number, name?: string): this {\n this.parts.push(this.mentionFormat(userId, name));\n return this;\n }\n\n hashtag(tag: string): this {\n this.parts.push(this.hashtagFormat(tag));\n return this;\n }\n\n build(): TelegramMessage {\n return {\n text: this.parts.join(\"\\n\"),\n parse_mode: this.parseMode,\n ...this.options,\n };\n }\n\n setOption(key: string, value: unknown): this {\n this.options[key] = value;\n return this;\n }\n\n setOptions(options: Record<string, unknown>): this {\n this.options = { ...this.options, ...options };\n return this;\n }\n\n getParseMode(): ParseMode {\n return this.parseMode;\n }\n}\n","/**\n * @fileoverview Media Builder\n * @description Fluent API for building media messages for Telegram Bot API\n * @module telegram-message-builder/builder\n *\n * @see {@link https://core.telegram.org/bots/api#sendphoto | Telegram Bot API - sendPhoto}\n * @see {@link https://core.telegram.org/bots/api#sendvideo | Telegram Bot API - sendVideo}\n * @see {@link https://core.telegram.org/bots/api#senddocument | Telegram Bot API - sendDocument}\n * @see {@link https://core.telegram.org/bots/api#sendaudio | Telegram Bot API - sendAudio}\n * @see {@link https://core.telegram.org/bots/api#sendvoice | Telegram Bot API - sendVoice}\n */\n\nimport type {\n MediaSource,\n MediaType,\n IMediaCommonOptions,\n IMediaBuildResult,\n ParseMode,\n} from \"../types\";\nimport * as fmt from \"../formatters\";\n\n/**\n * Telegram Media Builder - Fluent API for building media messages\n *\n * Provides a type-safe, fluent interface for constructing media messages\n * compatible with Telegram Bot API v9.3+.\n *\n * Supports all three Telegram parse modes (HTML, Markdown, MarkdownV2) for caption formatting.\n *\n * @example\n * ```typescript\n * // Simple photo with caption\n * const photo = TelegramMediaBuilder.photo(\"photo.jpg\")\n * .caption(\"My photo\")\n * .build();\n *\n * // Video with caption and options\n * const video = TelegramMediaBuilder.video(\"video.mp4\")\n * .caption(\"My video\")\n * .duration(120)\n * .thumbnail(\"thumb.jpg\")\n * .setParseMode(\"markdown\")\n * .build();\n *\n * // Document with custom options\n * const doc = TelegramMediaBuilder.document(\"report.pdf\")\n * .caption(\"Q4 Report\")\n * .fileName(\"q4_2024.pdf\")\n * .mimeType(\"application/pdf\")\n * .build();\n * ```\n */\nexport class TelegramMediaBuilder<T extends MediaType> {\n protected source: MediaSource;\n protected mediaType: T;\n protected _caption?: string;\n protected parseMode: ParseMode = \"html\";\n protected options: IMediaCommonOptions = {};\n\n protected constructor(source: MediaSource, mediaType: T) {\n this.source = source;\n this.mediaType = mediaType;\n }\n\n /**\n * Create a photo message builder\n *\n * @param source - File ID, URL, Buffer, or file path\n * @returns Photo media builder with thumbnail() method\n *\n * @example\n * ```typescript\n * const photo = TelegramMediaBuilder.photo(\"https://example.com/photo.jpg\")\n * .caption(\"Beautiful sunset\")\n * .thumbnail(\"thumb.jpg\")\n * .build();\n * ```\n */\n static photo(source: MediaSource): PhotoBuilder {\n return new PhotoBuilder(source, \"photo\");\n }\n\n /**\n * Create a video message builder\n *\n * @param source - File ID, URL, Buffer, or file path\n * @returns Video media builder with duration(), width(), height(), thumbnail(), enableStreaming() methods\n *\n * @example\n * ```typescript\n * const video = TelegramMediaBuilder.video(\"video.mp4\")\n * .caption(\"My video\")\n * .duration(120)\n * .width(1920)\n * .height(1080)\n * .build();\n * ```\n */\n static video(source: MediaSource): VideoBuilder {\n return new VideoBuilder(source, \"video\");\n }\n\n /**\n * Create a document message builder\n *\n * @param source - File ID, URL, Buffer, or file path\n * @returns Document media builder with thumbnail(), fileName(), mimeType(), disableContentTypeDetection() methods\n *\n * @example\n * ```typescript\n * const doc = TelegramMediaBuilder.document(\"report.pdf\")\n * .caption(\"Q4 Report\")\n * .fileName(\"q4_2024.pdf\")\n * .mimeType(\"application/pdf\")\n * .build();\n * ```\n */\n static document(source: MediaSource): DocumentBuilder {\n return new DocumentBuilder(source, \"document\");\n }\n\n /**\n * Create an audio message builder\n *\n * @param source - File ID, URL, Buffer, or file path\n * @returns Audio media builder with duration(), performer(), title(), thumbnail() methods\n *\n * @example\n * ```typescript\n * const audio = TelegramMediaBuilder.audio(\"song.mp3\")\n * .caption(\"My favorite song\")\n * .duration(180)\n * .performer(\"Artist Name\")\n * .title(\"Song Title\")\n * .build();\n * ```\n */\n static audio(source: MediaSource): AudioBuilder {\n return new AudioBuilder(source, \"audio\");\n }\n\n /**\n * Create a voice message builder\n *\n * @param source - File ID, URL, Buffer, or file path\n * @returns Voice media builder with duration() method\n *\n * @example\n * ```typescript\n * const voice = TelegramMediaBuilder.voice(\"voice.ogg\")\n * .caption(\"Listen to this\")\n * .duration(30)\n * .build();\n * ```\n */\n static voice(source: MediaSource): VoiceBuilder {\n return new VoiceBuilder(source, \"voice\");\n }\n\n /**\n * Set caption for the media\n *\n * @param text - Caption text (0-1024 characters)\n * @returns This builder for chaining\n */\n caption(text: string): this {\n this._caption = text;\n return this;\n }\n\n /**\n * Set parse mode for caption formatting\n *\n * @param mode - Parse mode (html, markdown, or markdownv2)\n * @returns This builder for chaining\n */\n setParseMode(mode: ParseMode): this {\n this.parseMode = mode;\n return this;\n }\n\n /**\n * Set a custom option\n *\n * @param key - Option name\n * @param value - Option value\n * @returns This builder for chaining\n */\n setOption<K extends keyof IMediaCommonOptions>(\n key: K,\n value: IMediaCommonOptions[K],\n ): this {\n this.options[key] = value;\n return this;\n }\n\n /**\n * Set multiple options at once\n *\n * @param opts - Object with options to set\n * @returns This builder for chaining\n */\n setOptions(opts: Partial<IMediaCommonOptions>): this {\n this.options = { ...this.options, ...opts };\n return this;\n }\n\n /**\n * Build the media message object\n *\n * @returns Complete media message ready for Telegram Bot API\n */\n build(): IMediaBuildResult {\n const result: IMediaBuildResult = {\n media: this.source,\n type: this.mediaType,\n };\n\n if (this._caption !== undefined) {\n result.caption = this.formatCaption(this._caption);\n result.parse_mode = this.parseMode;\n }\n\n // Merge in options\n Object.assign(result, this.options);\n\n return result;\n }\n\n /**\n * Format caption based on current parse mode\n *\n * @param text - Caption text to format\n * @returns Formatted caption\n */\n private formatCaption(text: string): string {\n switch (this.parseMode) {\n case \"html\":\n return fmt.escapeHTML(text);\n case \"markdown\":\n return fmt.escapeMarkdown(text);\n case \"markdownv2\":\n return fmt.escapeMarkdownV2(text);\n }\n }\n}\n\n/**\n * Photo-specific builder with convenience methods\n *\n * @example\n * ```typescript\n * const photo = TelegramMediaBuilder.photo(\"photo.jpg\")\n * .caption(\"My photo\")\n * .thumbnail(\"thumb.jpg\")\n * .build();\n * ```\n */\nexport class PhotoBuilder extends TelegramMediaBuilder<\"photo\"> {\n /**\n * Set thumbnail for the photo\n *\n * @param thumb - Thumbnail as Buffer or file path\n * @returns This builder for chaining\n */\n thumbnail(thumb: Buffer | string): this {\n this.setOption(\"thumb\", thumb);\n return this;\n }\n}\n\n/**\n * Video-specific builder with convenience methods\n *\n * @example\n * ```typescript\n * const video = TelegramMediaBuilder.video(\"video.mp4\")\n * .caption(\"My video\")\n * .duration(120)\n * .width(1920)\n * .height(1080)\n * .thumbnail(\"thumb.jpg\")\n * .enableStreaming()\n * .build();\n * ```\n */\nexport class VideoBuilder extends TelegramMediaBuilder<\"video\"> {\n /**\n * Set video duration\n *\n * @param seconds - Duration in seconds\n * @returns This builder for chaining\n */\n duration(seconds: number): this {\n this.setOption(\"duration\", seconds);\n return this;\n }\n\n /**\n * Set video width\n *\n * @param px - Width in pixels\n * @returns This builder for chaining\n */\n width(px: number): this {\n this.setOption(\"width\", px);\n return this;\n }\n\n /**\n * Set video height\n *\n * @param px - Height in pixels\n * @returns This builder for chaining\n */\n height(px: number): this {\n this.setOption(\"height\", px);\n return this;\n }\n\n /**\n * Set thumbnail for the video\n *\n * @param thumb - Thumbnail as Buffer or file path\n * @returns This builder for chaining\n */\n thumbnail(thumb: Buffer | string): this {\n this.setOption(\"thumb\", thumb);\n return this;\n }\n\n /**\n * Enable streaming for the video\n *\n * @returns This builder for chaining\n */\n enableStreaming(): this {\n this.setOption(\"support_streaming\", true);\n return this;\n }\n}\n\n/**\n * Document-specific builder with convenience methods\n *\n * @example\n * ```typescript\n * const doc = TelegramMediaBuilder.document(\"report.pdf\")\n * .caption(\"Q4 Report\")\n * .thumbnail(\"thumb.jpg\")\n * .fileName(\"q4_2024.pdf\")\n * .mimeType(\"application/pdf\")\n * .disableContentTypeDetection()\n * .build();\n * ```\n */\nexport class DocumentBuilder extends TelegramMediaBuilder<\"document\"> {\n /**\n * Set thumbnail for the document\n *\n * @param thumb - Thumbnail as Buffer or file path\n * @returns This builder for chaining\n */\n thumbnail(thumb: Buffer | string): this {\n this.setOption(\"thumb\", thumb);\n return this;\n }\n\n /**\n * Set original filename\n *\n * @param name - File name\n * @returns This builder for chaining\n */\n fileName(name: string): this {\n this.setOption(\"file_name\", name);\n return this;\n }\n\n /**\n * Set MIME type\n *\n * @param type - MIME type string\n * @returns This builder for chaining\n */\n mimeType(type: string): this {\n this.setOption(\"mime_type\", type);\n return this;\n }\n\n /**\n * Disable automatic file type detection\n *\n * @returns This builder for chaining\n */\n disableContentTypeDetection(): this {\n this.setOption(\"disable_content_type_detection\", true);\n return this;\n }\n}\n\n/**\n * Audio-specific builder with convenience methods\n *\n * @example\n * ```typescript\n * const audio = TelegramMediaBuilder.audio(\"song.mp3\")\n * .caption(\"My favorite song\")\n * .duration(180)\n * .performer(\"Artist Name\")\n * .title(\"Song Title\")\n * .thumbnail(\"album_art.jpg\")\n * .build();\n * ```\n */\nexport class AudioBuilder extends TelegramMediaBuilder<\"audio\"> {\n /**\n * Set audio duration\n *\n * @param seconds - Duration in seconds\n * @returns This builder for chaining\n */\n duration(seconds: number): this {\n this.setOption(\"duration\", seconds);\n return this;\n }\n\n /**\n * Set performer name\n *\n * @param name - Performer name\n * @returns This builder for chaining\n */\n performer(name: string): this {\n this.setOption(\"performer\", name);\n return this;\n }\n\n /**\n * Set track title\n *\n * @param name - Track title\n * @returns This builder for chaining\n */\n title(name: string): this {\n this.setOption(\"title\", name);\n return this;\n }\n\n /**\n * Set thumbnail (album cover)\n *\n * @param thumb - Thumbnail as Buffer or file path\n * @returns This builder for chaining\n */\n thumbnail(thumb: Buffer | string): this {\n this.setOption(\"thumb\", thumb);\n return this;\n }\n}\n\n/**\n * Voice-specific builder with convenience methods\n *\n * @example\n * ```typescript\n * const voice = TelegramMediaBuilder.voice(\"voice.ogg\")\n * .caption(\"Listen to this\")\n * .duration(30)\n * .build();\n * ```\n */\nexport class VoiceBuilder extends TelegramMediaBuilder<\"voice\"> {\n /**\n * Set voice duration\n *\n * @param seconds - Duration in seconds\n * @returns This builder for chaining\n */\n duration(seconds: number): this {\n this.setOption(\"duration\", seconds);\n return this;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export * from "./types";
2
+ export * from "./formatters";
3
+ export * from "./keyboard";
4
+ export * from "./builder";
5
+ export type { ParseMode, FormatOpts, LineOpts, TelegramMessage, BuildResult, ValidationError, } from "./types/core.types";
6
+ export type { IInlineKeyboardMarkup, IInlineKeyboardButton, IReplyKeyboardMarkup, IKeyboardButton, IForceReplyMarkup, } from "./types/keyboard.types";
7
+ export type { MediaSource, MediaType, IMediaCommonOptions, IMediaBuildResult, IPhotoOptions, IVideoOptions, IDocumentOptions, IAudioOptions, IVoiceOptions, } from "./types/media.types";
8
+ export { fmt } from "./formatters";
9
+ export { TelegramMessageBuilder } from "./builder";
10
+ export { TelegramKeyboardBuilder } from "./keyboard";
11
+ export { TelegramMediaBuilder } from "./builder";