@mks2508/telegram-message-builder 0.4.0 → 0.5.0
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.
- package/dist/builder/builder.d.ts +2 -2
- package/dist/builder/media.d.ts +2 -2
- package/dist/index.cjs +38 -38
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +38 -38
- package/dist/index.js.map +1 -1
- package/dist/types/core.types.d.ts +1 -1
- package/package.json +1 -1
- package/src/builder/builder.ts +28 -28
- package/src/builder/media.test.ts +20 -20
- package/src/builder/media.ts +6 -6
- package/src/builder.test.ts +30 -30
- package/src/escaping.test.ts +3 -3
- package/src/formatters/index.ts +4 -4
- package/src/formatters.test.ts +3 -3
- package/src/integration.test.ts +13 -13
- package/src/media-integration.test.ts +11 -11
- package/src/types/core.types.ts +1 -1
- package/src/types.test.ts +18 -18
package/dist/index.js
CHANGED
|
@@ -514,11 +514,11 @@ function url(link$1) {
|
|
|
514
514
|
function raw(html) {
|
|
515
515
|
return html;
|
|
516
516
|
}
|
|
517
|
-
function escape(text, mode = "
|
|
517
|
+
function escape(text, mode = "HTML") {
|
|
518
518
|
switch (mode) {
|
|
519
|
-
case "
|
|
520
|
-
case "
|
|
521
|
-
case "
|
|
519
|
+
case "HTML": return escapeHTML(text);
|
|
520
|
+
case "Markdown": return escapeMarkdown(text);
|
|
521
|
+
case "MarkdownV2": return escapeMarkdownV2(text);
|
|
522
522
|
}
|
|
523
523
|
}
|
|
524
524
|
const fmt = {
|
|
@@ -817,26 +817,26 @@ var TelegramKeyboardBuilder = class TelegramKeyboardBuilder {
|
|
|
817
817
|
*
|
|
818
818
|
* // Markdown mode
|
|
819
819
|
* const msg2 = TelegramMessageBuilder.text()
|
|
820
|
-
* .setParseMode("
|
|
820
|
+
* .setParseMode("Markdown")
|
|
821
821
|
* .title("Welcome")
|
|
822
822
|
* .build();
|
|
823
823
|
*
|
|
824
824
|
* // MarkdownV2 mode
|
|
825
825
|
* const msg3 = TelegramMessageBuilder.text()
|
|
826
|
-
* .setParseMode("
|
|
826
|
+
* .setParseMode("MarkdownV2")
|
|
827
827
|
* .title("Welcome")
|
|
828
828
|
* .build();
|
|
829
829
|
* ```
|
|
830
830
|
*/
|
|
831
831
|
var TelegramMessageBuilder = class TelegramMessageBuilder {
|
|
832
832
|
parts = [];
|
|
833
|
-
parseMode = "
|
|
833
|
+
parseMode = "HTML";
|
|
834
834
|
options = {};
|
|
835
835
|
constructor(parseMode) {
|
|
836
836
|
this.parseMode = parseMode;
|
|
837
837
|
}
|
|
838
838
|
static text() {
|
|
839
|
-
return new TelegramMessageBuilder("
|
|
839
|
+
return new TelegramMessageBuilder("HTML");
|
|
840
840
|
}
|
|
841
841
|
setParseMode(mode) {
|
|
842
842
|
this.parseMode = mode;
|
|
@@ -847,9 +847,9 @@ var TelegramMessageBuilder = class TelegramMessageBuilder {
|
|
|
847
847
|
*/
|
|
848
848
|
bold(text) {
|
|
849
849
|
switch (this.parseMode) {
|
|
850
|
-
case "
|
|
851
|
-
case "
|
|
852
|
-
case "
|
|
850
|
+
case "HTML": return bold(text);
|
|
851
|
+
case "Markdown": return boldMD(text);
|
|
852
|
+
case "MarkdownV2": return boldMDv2(text);
|
|
853
853
|
}
|
|
854
854
|
}
|
|
855
855
|
/**
|
|
@@ -857,9 +857,9 @@ var TelegramMessageBuilder = class TelegramMessageBuilder {
|
|
|
857
857
|
*/
|
|
858
858
|
italic(text) {
|
|
859
859
|
switch (this.parseMode) {
|
|
860
|
-
case "
|
|
861
|
-
case "
|
|
862
|
-
case "
|
|
860
|
+
case "HTML": return italic(text);
|
|
861
|
+
case "Markdown": return italicMD(text);
|
|
862
|
+
case "MarkdownV2": return italicMDv2(text);
|
|
863
863
|
}
|
|
864
864
|
}
|
|
865
865
|
/**
|
|
@@ -867,9 +867,9 @@ var TelegramMessageBuilder = class TelegramMessageBuilder {
|
|
|
867
867
|
*/
|
|
868
868
|
underline(text) {
|
|
869
869
|
switch (this.parseMode) {
|
|
870
|
-
case "
|
|
871
|
-
case "
|
|
872
|
-
case "
|
|
870
|
+
case "HTML": return underline(text);
|
|
871
|
+
case "Markdown": return underlineMD(text);
|
|
872
|
+
case "MarkdownV2": return underlineMDv2(text);
|
|
873
873
|
}
|
|
874
874
|
}
|
|
875
875
|
/**
|
|
@@ -877,9 +877,9 @@ var TelegramMessageBuilder = class TelegramMessageBuilder {
|
|
|
877
877
|
*/
|
|
878
878
|
code(text) {
|
|
879
879
|
switch (this.parseMode) {
|
|
880
|
-
case "
|
|
881
|
-
case "
|
|
882
|
-
case "
|
|
880
|
+
case "HTML": return code(text);
|
|
881
|
+
case "Markdown": return codeMD(text);
|
|
882
|
+
case "MarkdownV2": return codeMDv2(text);
|
|
883
883
|
}
|
|
884
884
|
}
|
|
885
885
|
/**
|
|
@@ -887,9 +887,9 @@ var TelegramMessageBuilder = class TelegramMessageBuilder {
|
|
|
887
887
|
*/
|
|
888
888
|
codeBlockFormat(text, language) {
|
|
889
889
|
switch (this.parseMode) {
|
|
890
|
-
case "
|
|
891
|
-
case "
|
|
892
|
-
case "
|
|
890
|
+
case "HTML": return codeBlock(text, language);
|
|
891
|
+
case "Markdown": return codeBlockMD(text, language);
|
|
892
|
+
case "MarkdownV2": return codeBlockMDv2(text, language);
|
|
893
893
|
}
|
|
894
894
|
}
|
|
895
895
|
/**
|
|
@@ -897,9 +897,9 @@ var TelegramMessageBuilder = class TelegramMessageBuilder {
|
|
|
897
897
|
*/
|
|
898
898
|
linkFormat(text, url$1) {
|
|
899
899
|
switch (this.parseMode) {
|
|
900
|
-
case "
|
|
901
|
-
case "
|
|
902
|
-
case "
|
|
900
|
+
case "HTML": return link(text, url$1);
|
|
901
|
+
case "Markdown": return linkMD(text, url$1);
|
|
902
|
+
case "MarkdownV2": return linkMDv2(text, url$1);
|
|
903
903
|
}
|
|
904
904
|
}
|
|
905
905
|
/**
|
|
@@ -907,9 +907,9 @@ var TelegramMessageBuilder = class TelegramMessageBuilder {
|
|
|
907
907
|
*/
|
|
908
908
|
mentionFormat(userId, name) {
|
|
909
909
|
switch (this.parseMode) {
|
|
910
|
-
case "
|
|
911
|
-
case "
|
|
912
|
-
case "
|
|
910
|
+
case "HTML": return mention(userId, name);
|
|
911
|
+
case "Markdown": return mentionMD(userId, name);
|
|
912
|
+
case "MarkdownV2": return mentionMDv2(userId, name);
|
|
913
913
|
}
|
|
914
914
|
}
|
|
915
915
|
/**
|
|
@@ -917,9 +917,9 @@ var TelegramMessageBuilder = class TelegramMessageBuilder {
|
|
|
917
917
|
*/
|
|
918
918
|
hashtagFormat(tag) {
|
|
919
919
|
switch (this.parseMode) {
|
|
920
|
-
case "
|
|
921
|
-
case "
|
|
922
|
-
case "
|
|
920
|
+
case "HTML": return hashtag(tag);
|
|
921
|
+
case "Markdown": return hashtagMD(tag);
|
|
922
|
+
case "MarkdownV2": return hashtagMDv2(tag);
|
|
923
923
|
}
|
|
924
924
|
}
|
|
925
925
|
title(text) {
|
|
@@ -1016,7 +1016,7 @@ var TelegramMessageBuilder = class TelegramMessageBuilder {
|
|
|
1016
1016
|
* .caption("My video")
|
|
1017
1017
|
* .duration(120)
|
|
1018
1018
|
* .thumbnail("thumb.jpg")
|
|
1019
|
-
* .setParseMode("
|
|
1019
|
+
* .setParseMode("Markdown")
|
|
1020
1020
|
* .build();
|
|
1021
1021
|
*
|
|
1022
1022
|
* // Document with custom options
|
|
@@ -1031,7 +1031,7 @@ var TelegramMediaBuilder = class {
|
|
|
1031
1031
|
source;
|
|
1032
1032
|
mediaType;
|
|
1033
1033
|
_caption;
|
|
1034
|
-
parseMode = "
|
|
1034
|
+
parseMode = "HTML";
|
|
1035
1035
|
options = {};
|
|
1036
1036
|
constructor(source, mediaType) {
|
|
1037
1037
|
this.source = source;
|
|
@@ -1140,7 +1140,7 @@ var TelegramMediaBuilder = class {
|
|
|
1140
1140
|
/**
|
|
1141
1141
|
* Set parse mode for caption formatting
|
|
1142
1142
|
*
|
|
1143
|
-
* @param mode - Parse mode (
|
|
1143
|
+
* @param mode - Parse mode (HTML, Markdown, or MarkdownV2)
|
|
1144
1144
|
* @returns This builder for chaining
|
|
1145
1145
|
*/
|
|
1146
1146
|
setParseMode(mode) {
|
|
@@ -1196,9 +1196,9 @@ var TelegramMediaBuilder = class {
|
|
|
1196
1196
|
*/
|
|
1197
1197
|
formatCaption(text) {
|
|
1198
1198
|
switch (this.parseMode) {
|
|
1199
|
-
case "
|
|
1200
|
-
case "
|
|
1201
|
-
case "
|
|
1199
|
+
case "HTML": return escapeHTML(text);
|
|
1200
|
+
case "Markdown": return escapeMarkdown(text);
|
|
1201
|
+
case "MarkdownV2": return escapeMarkdownV2(text);
|
|
1202
1202
|
}
|
|
1203
1203
|
}
|
|
1204
1204
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\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><i>Text</i></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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"}
|
|
1
|
+
{"version":3,"file":"index.js","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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\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><i>Text</i></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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mks2508/telegram-message-builder",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Telegram bot messaging utilities suite with focus on good DX. Template Strings Native. Keyboard Builder, Media Types Full Support, Zero Runtime Dependencies, Fully typed and schema validated, 100% telegraf compatible. Bot API v9.3+.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|