@ai-devkit/channel-connector 0.7.0 → 0.8.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/.swcrc +27 -0
- package/dist/ChannelManager.js +8 -12
- package/dist/ChannelManager.js.map +1 -1
- package/dist/ConfigStore.js +21 -17
- package/dist/ConfigStore.js.map +1 -1
- package/dist/__tests__/ChannelManager.test.js +70 -0
- package/dist/__tests__/ChannelManager.test.js.map +1 -0
- package/dist/__tests__/ConfigStore.test.js +146 -0
- package/dist/__tests__/ConfigStore.test.js.map +1 -0
- package/dist/__tests__/adapters/TelegramAdapter.test.js +240 -0
- package/dist/__tests__/adapters/TelegramAdapter.test.js.map +1 -0
- package/dist/__tests__/utils/telegramHtml.test.js +86 -0
- package/dist/__tests__/utils/telegramHtml.test.js.map +1 -0
- package/dist/adapters/ChannelAdapter.js +7 -1
- package/dist/adapters/ChannelAdapter.js.map +1 -1
- package/dist/adapters/TelegramAdapter.js +20 -32
- package/dist/adapters/TelegramAdapter.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/types.js +7 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/telegramHtml.js +35 -31
- package/dist/utils/telegramHtml.js.map +1 -1
- package/package.json +11 -7
|
@@ -1,85 +1,89 @@
|
|
|
1
1
|
import { Marked } from 'marked';
|
|
2
|
-
const escapeHtml = (s)
|
|
3
|
-
const escapeUrl = (s)
|
|
2
|
+
const escapeHtml = (s)=>s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
3
|
+
const escapeUrl = (s)=>s.replace(/&/g, '&').replace(/"/g, '"');
|
|
4
4
|
const renderer = {
|
|
5
|
-
heading({ tokens }) {
|
|
5
|
+
heading ({ tokens }) {
|
|
6
6
|
return `<b>${this.parser.parseInline(tokens)}</b>\n\n`;
|
|
7
7
|
},
|
|
8
|
-
paragraph({ tokens }) {
|
|
8
|
+
paragraph ({ tokens }) {
|
|
9
9
|
return `${this.parser.parseInline(tokens)}\n\n`;
|
|
10
10
|
},
|
|
11
|
-
strong({ tokens }) {
|
|
11
|
+
strong ({ tokens }) {
|
|
12
12
|
return `<b>${this.parser.parseInline(tokens)}</b>`;
|
|
13
13
|
},
|
|
14
|
-
em({ tokens }) {
|
|
14
|
+
em ({ tokens }) {
|
|
15
15
|
return `<i>${this.parser.parseInline(tokens)}</i>`;
|
|
16
16
|
},
|
|
17
|
-
del({ tokens }) {
|
|
17
|
+
del ({ tokens }) {
|
|
18
18
|
return `<s>${this.parser.parseInline(tokens)}</s>`;
|
|
19
19
|
},
|
|
20
|
-
codespan({ text }) {
|
|
20
|
+
codespan ({ text }) {
|
|
21
21
|
return `<code>${escapeHtml(text)}</code>`;
|
|
22
22
|
},
|
|
23
|
-
code({ text, lang }) {
|
|
23
|
+
code ({ text, lang }) {
|
|
24
24
|
const langAttr = lang ? ` class="language-${escapeHtml(lang.split(/\s/)[0])}"` : '';
|
|
25
25
|
return `<pre><code${langAttr}>${escapeHtml(text)}</code></pre>\n\n`;
|
|
26
26
|
},
|
|
27
|
-
link({ href, tokens }) {
|
|
27
|
+
link ({ href, tokens }) {
|
|
28
28
|
return `<a href="${escapeUrl(href)}">${this.parser.parseInline(tokens)}</a>`;
|
|
29
29
|
},
|
|
30
|
-
image({ href, text }) {
|
|
30
|
+
image ({ href, text }) {
|
|
31
31
|
const label = text || href;
|
|
32
32
|
return `<a href="${escapeUrl(href)}">${escapeHtml(label)}</a>`;
|
|
33
33
|
},
|
|
34
|
-
list({ items, ordered, start }) {
|
|
34
|
+
list ({ items, ordered, start }) {
|
|
35
35
|
const startNum = typeof start === 'number' ? start : 1;
|
|
36
|
-
const lines = items.map((item, i)
|
|
36
|
+
const lines = items.map((item, i)=>{
|
|
37
37
|
const marker = ordered ? `${startNum + i}.` : '•';
|
|
38
38
|
const inner = this.parser.parseInline(item.tokens).trimEnd();
|
|
39
39
|
return `${marker} ${inner}`;
|
|
40
40
|
});
|
|
41
41
|
return `${lines.join('\n')}\n\n`;
|
|
42
42
|
},
|
|
43
|
-
listitem(item) {
|
|
43
|
+
listitem (item) {
|
|
44
44
|
return this.parser.parseInline(item.tokens);
|
|
45
45
|
},
|
|
46
|
-
blockquote({ tokens }) {
|
|
46
|
+
blockquote ({ tokens }) {
|
|
47
47
|
return `<blockquote>${this.parser.parse(tokens).trimEnd()}</blockquote>\n\n`;
|
|
48
48
|
},
|
|
49
|
-
table({ header, rows }) {
|
|
50
|
-
const headerCells = header.map((c)
|
|
51
|
-
const bodyRows = rows.map((row)
|
|
52
|
-
const widths = headerCells.map((h, i)
|
|
53
|
-
const pad = (cells)
|
|
49
|
+
table ({ header, rows }) {
|
|
50
|
+
const headerCells = header.map((c)=>c.text);
|
|
51
|
+
const bodyRows = rows.map((row)=>row.map((c)=>c.text));
|
|
52
|
+
const widths = headerCells.map((h, i)=>Math.max(h.length, ...bodyRows.map((row)=>(row[i] ?? '').length)));
|
|
53
|
+
const pad = (cells)=>cells.map((c, i)=>c.padEnd(widths[i] ?? 0)).join(' | ');
|
|
54
54
|
const lines = [
|
|
55
55
|
pad(headerCells),
|
|
56
|
-
widths.map((w)
|
|
57
|
-
...bodyRows.map(pad)
|
|
56
|
+
widths.map((w)=>'-'.repeat(w)).join('-+-'),
|
|
57
|
+
...bodyRows.map(pad)
|
|
58
58
|
];
|
|
59
59
|
return `<pre>${escapeHtml(lines.join('\n'))}</pre>\n\n`;
|
|
60
60
|
},
|
|
61
|
-
hr() {
|
|
61
|
+
hr () {
|
|
62
62
|
return '———\n\n';
|
|
63
63
|
},
|
|
64
|
-
br() {
|
|
64
|
+
br () {
|
|
65
65
|
return '\n';
|
|
66
66
|
},
|
|
67
|
-
html() {
|
|
67
|
+
html () {
|
|
68
68
|
return '';
|
|
69
69
|
},
|
|
70
|
-
text(token) {
|
|
70
|
+
text (token) {
|
|
71
71
|
if ('tokens' in token && token.tokens) {
|
|
72
72
|
return this.parser.parseInline(token.tokens);
|
|
73
73
|
}
|
|
74
74
|
return escapeHtml(token.text);
|
|
75
|
-
}
|
|
75
|
+
}
|
|
76
76
|
};
|
|
77
|
-
const marked = new Marked({
|
|
77
|
+
const marked = new Marked({
|
|
78
|
+
renderer
|
|
79
|
+
});
|
|
78
80
|
/**
|
|
79
81
|
* Convert markdown to Telegram-compatible HTML (uses only the tag subset
|
|
80
82
|
* Telegram's Bot API accepts for parse_mode: 'HTML').
|
|
81
|
-
*/
|
|
82
|
-
|
|
83
|
-
|
|
83
|
+
*/ export function markdownToTelegramHtml(markdown) {
|
|
84
|
+
return marked.parse(markdown, {
|
|
85
|
+
async: false
|
|
86
|
+
}).trimEnd();
|
|
84
87
|
}
|
|
88
|
+
|
|
85
89
|
//# sourceMappingURL=telegramHtml.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../src/utils/telegramHtml.ts"],"sourcesContent":["import { Marked, type RendererObject, type Tokens } from 'marked';\n\nconst escapeHtml = (s: string): string =>\n s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n\nconst escapeUrl = (s: string): string =>\n s.replace(/&/g, '&').replace(/\"/g, '"');\n\nconst renderer: RendererObject = {\n heading({ tokens }: Tokens.Heading): string {\n return `<b>${this.parser.parseInline(tokens)}</b>\\n\\n`;\n },\n paragraph({ tokens }: Tokens.Paragraph): string {\n return `${this.parser.parseInline(tokens)}\\n\\n`;\n },\n strong({ tokens }: Tokens.Strong): string {\n return `<b>${this.parser.parseInline(tokens)}</b>`;\n },\n em({ tokens }: Tokens.Em): string {\n return `<i>${this.parser.parseInline(tokens)}</i>`;\n },\n del({ tokens }: Tokens.Del): string {\n return `<s>${this.parser.parseInline(tokens)}</s>`;\n },\n codespan({ text }: Tokens.Codespan): string {\n return `<code>${escapeHtml(text)}</code>`;\n },\n code({ text, lang }: Tokens.Code): string {\n const langAttr = lang ? ` class=\"language-${escapeHtml(lang.split(/\\s/)[0])}\"` : '';\n return `<pre><code${langAttr}>${escapeHtml(text)}</code></pre>\\n\\n`;\n },\n link({ href, tokens }: Tokens.Link): string {\n return `<a href=\"${escapeUrl(href)}\">${this.parser.parseInline(tokens)}</a>`;\n },\n image({ href, text }: Tokens.Image): string {\n const label = text || href;\n return `<a href=\"${escapeUrl(href)}\">${escapeHtml(label)}</a>`;\n },\n list({ items, ordered, start }: Tokens.List): string {\n const startNum = typeof start === 'number' ? start : 1;\n const lines = items.map((item, i) => {\n const marker = ordered ? `${startNum + i}.` : '•';\n const inner = this.parser.parseInline(item.tokens).trimEnd();\n return `${marker} ${inner}`;\n });\n return `${lines.join('\\n')}\\n\\n`;\n },\n listitem(item: Tokens.ListItem): string {\n return this.parser.parseInline(item.tokens);\n },\n blockquote({ tokens }: Tokens.Blockquote): string {\n return `<blockquote>${this.parser.parse(tokens).trimEnd()}</blockquote>\\n\\n`;\n },\n table({ header, rows }: Tokens.Table): string {\n const headerCells = header.map((c) => c.text);\n const bodyRows = rows.map((row) => row.map((c) => c.text));\n const widths = headerCells.map((h, i) =>\n Math.max(h.length, ...bodyRows.map((row) => (row[i] ?? '').length))\n );\n const pad = (cells: string[]) =>\n cells.map((c, i) => c.padEnd(widths[i] ?? 0)).join(' | ');\n\n const lines = [\n pad(headerCells),\n widths.map((w) => '-'.repeat(w)).join('-+-'),\n ...bodyRows.map(pad),\n ];\n return `<pre>${escapeHtml(lines.join('\\n'))}</pre>\\n\\n`;\n },\n hr(): string {\n return '———\\n\\n';\n },\n br(): string {\n return '\\n';\n },\n html(): string {\n return '';\n },\n text(token: Tokens.Text | Tokens.Escape): string {\n if ('tokens' in token && token.tokens) {\n return this.parser.parseInline(token.tokens);\n }\n return escapeHtml(token.text);\n },\n};\n\nconst marked = new Marked({ renderer });\n\n/**\n * Convert markdown to Telegram-compatible HTML (uses only the tag subset\n * Telegram's Bot API accepts for parse_mode: 'HTML').\n */\nexport function markdownToTelegramHtml(markdown: string): string {\n return (marked.parse(markdown, { async: false }) as string).trimEnd();\n}\n"],"names":["Marked","escapeHtml","s","replace","escapeUrl","renderer","heading","tokens","parser","parseInline","paragraph","strong","em","del","codespan","text","code","lang","langAttr","split","link","href","image","label","list","items","ordered","start","startNum","lines","map","item","i","marker","inner","trimEnd","join","listitem","blockquote","parse","table","header","rows","headerCells","c","bodyRows","row","widths","h","Math","max","length","pad","cells","padEnd","w","repeat","hr","br","html","token","marked","markdownToTelegramHtml","markdown","async"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"nx": {
|
|
4
4
|
"name": "channel-connector"
|
|
5
5
|
},
|
|
6
|
-
"version": "0.
|
|
6
|
+
"version": "0.8.0",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"description": "Generic messaging bridge for connecting to external communication platforms",
|
|
9
9
|
"main": "dist/index.js",
|
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
}
|
|
16
16
|
},
|
|
17
17
|
"scripts": {
|
|
18
|
-
"build": "tsc",
|
|
18
|
+
"build": "swc src -d dist --strip-leading-paths && tsc --emitDeclarationOnly",
|
|
19
|
+
"dev": "swc src -d dist --strip-leading-paths --watch",
|
|
19
20
|
"test": "vitest run",
|
|
20
21
|
"test:watch": "vitest",
|
|
21
22
|
"test:coverage": "vitest run --coverage",
|
|
@@ -34,16 +35,19 @@
|
|
|
34
35
|
"license": "MIT",
|
|
35
36
|
"dependencies": {
|
|
36
37
|
"marked": "^15.0.12",
|
|
37
|
-
"telegraf": "^4.16.3"
|
|
38
|
+
"telegraf": "^4.16.3",
|
|
39
|
+
"uuid": "14.0.0"
|
|
38
40
|
},
|
|
39
41
|
"devDependencies": {
|
|
42
|
+
"@swc/cli": "^0.8.1",
|
|
43
|
+
"@swc/core": "^1.10.0",
|
|
40
44
|
"@types/node": "^20.11.5",
|
|
41
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
42
|
-
"@typescript-eslint/parser": "^
|
|
43
|
-
"@vitest/coverage-v8": "^
|
|
45
|
+
"@typescript-eslint/eslint-plugin": "^8.60.1",
|
|
46
|
+
"@typescript-eslint/parser": "^8.60.1",
|
|
47
|
+
"@vitest/coverage-v8": "^4.1.8",
|
|
44
48
|
"eslint": "^8.56.0",
|
|
45
49
|
"typescript": "^5.5.0",
|
|
46
|
-
"vitest": "^
|
|
50
|
+
"vitest": "^4.1.8"
|
|
47
51
|
},
|
|
48
52
|
"engines": {
|
|
49
53
|
"node": ">=20.20.0"
|