@ai-devkit/channel-connector 0.6.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.
Files changed (35) hide show
  1. package/.swcrc +27 -0
  2. package/dist/ChannelManager.d.ts +1 -1
  3. package/dist/ChannelManager.d.ts.map +1 -1
  4. package/dist/ChannelManager.js +9 -19
  5. package/dist/ChannelManager.js.map +1 -1
  6. package/dist/ConfigStore.d.ts +1 -1
  7. package/dist/ConfigStore.d.ts.map +1 -1
  8. package/dist/ConfigStore.js +25 -57
  9. package/dist/ConfigStore.js.map +1 -1
  10. package/dist/__tests__/ChannelManager.test.js +70 -0
  11. package/dist/__tests__/ChannelManager.test.js.map +1 -0
  12. package/dist/__tests__/ConfigStore.test.js +146 -0
  13. package/dist/__tests__/ConfigStore.test.js.map +1 -0
  14. package/dist/__tests__/adapters/TelegramAdapter.test.js +240 -0
  15. package/dist/__tests__/adapters/TelegramAdapter.test.js.map +1 -0
  16. package/dist/__tests__/utils/telegramHtml.test.js +86 -0
  17. package/dist/__tests__/utils/telegramHtml.test.js.map +1 -0
  18. package/dist/adapters/ChannelAdapter.d.ts +1 -1
  19. package/dist/adapters/ChannelAdapter.d.ts.map +1 -1
  20. package/dist/adapters/ChannelAdapter.js +7 -2
  21. package/dist/adapters/ChannelAdapter.js.map +1 -1
  22. package/dist/adapters/TelegramAdapter.d.ts +2 -2
  23. package/dist/adapters/TelegramAdapter.d.ts.map +1 -1
  24. package/dist/adapters/TelegramAdapter.js +32 -47
  25. package/dist/adapters/TelegramAdapter.js.map +1 -1
  26. package/dist/index.d.ts +6 -6
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +4 -11
  29. package/dist/index.js.map +1 -1
  30. package/dist/types.js +7 -2
  31. package/dist/types.js.map +1 -1
  32. package/dist/utils/telegramHtml.js +36 -35
  33. package/dist/utils/telegramHtml.js.map +1 -1
  34. package/package.json +17 -12
  35. package/vitest.config.ts +20 -0
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- export { ChannelManager } from './ChannelManager';
2
- export { ConfigStore } from './ConfigStore';
3
- export { TelegramAdapter, TELEGRAM_CHANNEL_TYPE, TELEGRAM_MAX_MESSAGE_LENGTH } from './adapters/TelegramAdapter';
4
- export type { TelegramAdapterOptions } from './adapters/TelegramAdapter';
5
- export type { ChannelAdapter } from './adapters/ChannelAdapter';
6
- export type { IncomingMessage, MessageHandler, ChannelConfig, ChannelEntry, ChannelType, TelegramConfig, } from './types';
1
+ export { ChannelManager } from './ChannelManager.js';
2
+ export { ConfigStore } from './ConfigStore.js';
3
+ export { TelegramAdapter, TELEGRAM_CHANNEL_TYPE, TELEGRAM_MAX_MESSAGE_LENGTH } from './adapters/TelegramAdapter.js';
4
+ export type { TelegramAdapterOptions } from './adapters/TelegramAdapter.js';
5
+ export type { ChannelAdapter } from './adapters/ChannelAdapter.js';
6
+ export type { IncomingMessage, MessageHandler, ChannelConfig, ChannelEntry, ChannelType, TelegramConfig, } from './types.js';
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACjH,YAAY,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEzE,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,YAAY,EACR,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,WAAW,EACX,cAAc,GACjB,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AACpH,YAAY,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAE5E,YAAY,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,YAAY,EACR,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,WAAW,EACX,cAAc,GACjB,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,12 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TELEGRAM_MAX_MESSAGE_LENGTH = exports.TELEGRAM_CHANNEL_TYPE = exports.TelegramAdapter = exports.ConfigStore = exports.ChannelManager = void 0;
4
- var ChannelManager_1 = require("./ChannelManager");
5
- Object.defineProperty(exports, "ChannelManager", { enumerable: true, get: function () { return ChannelManager_1.ChannelManager; } });
6
- var ConfigStore_1 = require("./ConfigStore");
7
- Object.defineProperty(exports, "ConfigStore", { enumerable: true, get: function () { return ConfigStore_1.ConfigStore; } });
8
- var TelegramAdapter_1 = require("./adapters/TelegramAdapter");
9
- Object.defineProperty(exports, "TelegramAdapter", { enumerable: true, get: function () { return TelegramAdapter_1.TelegramAdapter; } });
10
- Object.defineProperty(exports, "TELEGRAM_CHANNEL_TYPE", { enumerable: true, get: function () { return TelegramAdapter_1.TELEGRAM_CHANNEL_TYPE; } });
11
- Object.defineProperty(exports, "TELEGRAM_MAX_MESSAGE_LENGTH", { enumerable: true, get: function () { return TelegramAdapter_1.TELEGRAM_MAX_MESSAGE_LENGTH; } });
1
+ export { ChannelManager } from './ChannelManager.js';
2
+ export { ConfigStore } from './ConfigStore.js';
3
+ export { TelegramAdapter, TELEGRAM_CHANNEL_TYPE, TELEGRAM_MAX_MESSAGE_LENGTH } from './adapters/TelegramAdapter.js';
4
+
12
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mDAAkD;AAAzC,gHAAA,cAAc,OAAA;AACvB,6CAA4C;AAAnC,0GAAA,WAAW,OAAA;AACpB,8DAAiH;AAAxG,kHAAA,eAAe,OAAA;AAAE,wHAAA,qBAAqB,OAAA;AAAE,8HAAA,2BAA2B,OAAA"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { ChannelManager } from './ChannelManager.js';\nexport { ConfigStore } from './ConfigStore.js';\nexport { TelegramAdapter, TELEGRAM_CHANNEL_TYPE, TELEGRAM_MAX_MESSAGE_LENGTH } from './adapters/TelegramAdapter.js';\nexport type { TelegramAdapterOptions } from './adapters/TelegramAdapter.js';\n\nexport type { ChannelAdapter } from './adapters/ChannelAdapter.js';\n\nexport type {\n IncomingMessage,\n MessageHandler,\n ChannelConfig,\n ChannelEntry,\n ChannelType,\n TelegramConfig,\n} from './types.js';\n"],"names":["ChannelManager","ConfigStore","TelegramAdapter","TELEGRAM_CHANNEL_TYPE","TELEGRAM_MAX_MESSAGE_LENGTH"],"mappings":"AAAA,SAASA,cAAc,QAAQ,sBAAsB;AACrD,SAASC,WAAW,QAAQ,mBAAmB;AAC/C,SAASC,eAAe,EAAEC,qBAAqB,EAAEC,2BAA2B,QAAQ,gCAAgC"}
package/dist/types.js CHANGED
@@ -1,3 +1,8 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ /**
2
+ * An incoming message from a messaging platform.
3
+ * Generic — no agent-specific concepts.
4
+ */ /**
5
+ * Telegram-specific configuration.
6
+ */ export { };
7
+
3
8
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["/**\n * An incoming message from a messaging platform.\n * Generic — no agent-specific concepts.\n */\nexport interface IncomingMessage {\n channelType: string;\n chatId: string;\n userId: string;\n text: string;\n timestamp: Date;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Handler function provided by the consumer (e.g., CLI).\n * Fire-and-forget — returns void. Responses are sent separately via sendMessage().\n */\nexport type MessageHandler = (message: IncomingMessage) => Promise<void>;\n\n/**\n * Root configuration for all channels.\n */\nexport interface ChannelConfig {\n channels: Record<string, ChannelEntry>;\n}\n\n/**\n * Configuration entry for a single channel.\n */\nexport interface ChannelEntry {\n type: ChannelType;\n enabled: boolean;\n createdAt: string;\n config: TelegramConfig;\n}\n\n/**\n * Supported channel types.\n */\nexport type ChannelType = 'telegram' | 'slack' | 'whatsapp';\n\n/**\n * Telegram-specific configuration.\n */\nexport interface TelegramConfig {\n botToken: string;\n botUsername: string;\n authorizedChatId?: number;\n}\n"],"names":[],"mappings":"AAAA;;;CAGC,GAsCD;;CAEC,GACD,WAIC"}
@@ -1,88 +1,89 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.markdownToTelegramHtml = markdownToTelegramHtml;
4
- const marked_1 = require("marked");
5
- const escapeHtml = (s) => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
6
- const escapeUrl = (s) => s.replace(/&/g, '&amp;').replace(/"/g, '&quot;');
1
+ import { Marked } from 'marked';
2
+ const escapeHtml = (s)=>s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
3
+ const escapeUrl = (s)=>s.replace(/&/g, '&amp;').replace(/"/g, '&quot;');
7
4
  const renderer = {
8
- heading({ tokens }) {
5
+ heading ({ tokens }) {
9
6
  return `<b>${this.parser.parseInline(tokens)}</b>\n\n`;
10
7
  },
11
- paragraph({ tokens }) {
8
+ paragraph ({ tokens }) {
12
9
  return `${this.parser.parseInline(tokens)}\n\n`;
13
10
  },
14
- strong({ tokens }) {
11
+ strong ({ tokens }) {
15
12
  return `<b>${this.parser.parseInline(tokens)}</b>`;
16
13
  },
17
- em({ tokens }) {
14
+ em ({ tokens }) {
18
15
  return `<i>${this.parser.parseInline(tokens)}</i>`;
19
16
  },
20
- del({ tokens }) {
17
+ del ({ tokens }) {
21
18
  return `<s>${this.parser.parseInline(tokens)}</s>`;
22
19
  },
23
- codespan({ text }) {
20
+ codespan ({ text }) {
24
21
  return `<code>${escapeHtml(text)}</code>`;
25
22
  },
26
- code({ text, lang }) {
23
+ code ({ text, lang }) {
27
24
  const langAttr = lang ? ` class="language-${escapeHtml(lang.split(/\s/)[0])}"` : '';
28
25
  return `<pre><code${langAttr}>${escapeHtml(text)}</code></pre>\n\n`;
29
26
  },
30
- link({ href, tokens }) {
27
+ link ({ href, tokens }) {
31
28
  return `<a href="${escapeUrl(href)}">${this.parser.parseInline(tokens)}</a>`;
32
29
  },
33
- image({ href, text }) {
30
+ image ({ href, text }) {
34
31
  const label = text || href;
35
32
  return `<a href="${escapeUrl(href)}">${escapeHtml(label)}</a>`;
36
33
  },
37
- list({ items, ordered, start }) {
34
+ list ({ items, ordered, start }) {
38
35
  const startNum = typeof start === 'number' ? start : 1;
39
- const lines = items.map((item, i) => {
36
+ const lines = items.map((item, i)=>{
40
37
  const marker = ordered ? `${startNum + i}.` : '•';
41
38
  const inner = this.parser.parseInline(item.tokens).trimEnd();
42
39
  return `${marker} ${inner}`;
43
40
  });
44
41
  return `${lines.join('\n')}\n\n`;
45
42
  },
46
- listitem(item) {
43
+ listitem (item) {
47
44
  return this.parser.parseInline(item.tokens);
48
45
  },
49
- blockquote({ tokens }) {
46
+ blockquote ({ tokens }) {
50
47
  return `<blockquote>${this.parser.parse(tokens).trimEnd()}</blockquote>\n\n`;
51
48
  },
52
- table({ header, rows }) {
53
- const headerCells = header.map((c) => c.text);
54
- const bodyRows = rows.map((row) => row.map((c) => c.text));
55
- const widths = headerCells.map((h, i) => Math.max(h.length, ...bodyRows.map((row) => (row[i] ?? '').length)));
56
- const pad = (cells) => cells.map((c, i) => c.padEnd(widths[i] ?? 0)).join(' | ');
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(' | ');
57
54
  const lines = [
58
55
  pad(headerCells),
59
- widths.map((w) => '-'.repeat(w)).join('-+-'),
60
- ...bodyRows.map(pad),
56
+ widths.map((w)=>'-'.repeat(w)).join('-+-'),
57
+ ...bodyRows.map(pad)
61
58
  ];
62
59
  return `<pre>${escapeHtml(lines.join('\n'))}</pre>\n\n`;
63
60
  },
64
- hr() {
61
+ hr () {
65
62
  return '———\n\n';
66
63
  },
67
- br() {
64
+ br () {
68
65
  return '\n';
69
66
  },
70
- html() {
67
+ html () {
71
68
  return '';
72
69
  },
73
- text(token) {
70
+ text (token) {
74
71
  if ('tokens' in token && token.tokens) {
75
72
  return this.parser.parseInline(token.tokens);
76
73
  }
77
74
  return escapeHtml(token.text);
78
- },
75
+ }
79
76
  };
80
- const marked = new marked_1.Marked({ renderer });
77
+ const marked = new Marked({
78
+ renderer
79
+ });
81
80
  /**
82
81
  * Convert markdown to Telegram-compatible HTML (uses only the tag subset
83
82
  * Telegram's Bot API accepts for parse_mode: 'HTML').
84
- */
85
- function markdownToTelegramHtml(markdown) {
86
- return marked.parse(markdown, { async: false }).trimEnd();
83
+ */ export function markdownToTelegramHtml(markdown) {
84
+ return marked.parse(markdown, {
85
+ async: false
86
+ }).trimEnd();
87
87
  }
88
+
88
89
  //# sourceMappingURL=telegramHtml.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"telegramHtml.js","sourceRoot":"","sources":["../../src/utils/telegramHtml.ts"],"names":[],"mappings":"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"}
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, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n\nconst escapeUrl = (s: string): string =>\n s.replace(/&/g, '&amp;').replace(/\"/g, '&quot;');\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":"AAAA,SAASA,MAAM,QAA0C,SAAS;AAElE,MAAMC,aAAa,CAACC,IAChBA,EAAEC,OAAO,CAAC,MAAM,SAASA,OAAO,CAAC,MAAM,QAAQA,OAAO,CAAC,MAAM;AAEjE,MAAMC,YAAY,CAACF,IACfA,EAAEC,OAAO,CAAC,MAAM,SAASA,OAAO,CAAC,MAAM;AAE3C,MAAME,WAA2B;IAC7BC,SAAQ,EAAEC,MAAM,EAAkB;QAC9B,OAAO,CAAC,GAAG,EAAE,IAAI,CAACC,MAAM,CAACC,WAAW,CAACF,QAAQ,QAAQ,CAAC;IAC1D;IACAG,WAAU,EAAEH,MAAM,EAAoB;QAClC,OAAO,GAAG,IAAI,CAACC,MAAM,CAACC,WAAW,CAACF,QAAQ,IAAI,CAAC;IACnD;IACAI,QAAO,EAAEJ,MAAM,EAAiB;QAC5B,OAAO,CAAC,GAAG,EAAE,IAAI,CAACC,MAAM,CAACC,WAAW,CAACF,QAAQ,IAAI,CAAC;IACtD;IACAK,IAAG,EAAEL,MAAM,EAAa;QACpB,OAAO,CAAC,GAAG,EAAE,IAAI,CAACC,MAAM,CAACC,WAAW,CAACF,QAAQ,IAAI,CAAC;IACtD;IACAM,KAAI,EAAEN,MAAM,EAAc;QACtB,OAAO,CAAC,GAAG,EAAE,IAAI,CAACC,MAAM,CAACC,WAAW,CAACF,QAAQ,IAAI,CAAC;IACtD;IACAO,UAAS,EAAEC,IAAI,EAAmB;QAC9B,OAAO,CAAC,MAAM,EAAEd,WAAWc,MAAM,OAAO,CAAC;IAC7C;IACAC,MAAK,EAAED,IAAI,EAAEE,IAAI,EAAe;QAC5B,MAAMC,WAAWD,OAAO,CAAC,iBAAiB,EAAEhB,WAAWgB,KAAKE,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG;QACjF,OAAO,CAAC,UAAU,EAAED,SAAS,CAAC,EAAEjB,WAAWc,MAAM,iBAAiB,CAAC;IACvE;IACAK,MAAK,EAAEC,IAAI,EAAEd,MAAM,EAAe;QAC9B,OAAO,CAAC,SAAS,EAAEH,UAAUiB,MAAM,EAAE,EAAE,IAAI,CAACb,MAAM,CAACC,WAAW,CAACF,QAAQ,IAAI,CAAC;IAChF;IACAe,OAAM,EAAED,IAAI,EAAEN,IAAI,EAAgB;QAC9B,MAAMQ,QAAQR,QAAQM;QACtB,OAAO,CAAC,SAAS,EAAEjB,UAAUiB,MAAM,EAAE,EAAEpB,WAAWsB,OAAO,IAAI,CAAC;IAClE;IACAC,MAAK,EAAEC,KAAK,EAAEC,OAAO,EAAEC,KAAK,EAAe;QACvC,MAAMC,WAAW,OAAOD,UAAU,WAAWA,QAAQ;QACrD,MAAME,QAAQJ,MAAMK,GAAG,CAAC,CAACC,MAAMC;YAC3B,MAAMC,SAASP,UAAU,GAAGE,WAAWI,EAAE,CAAC,CAAC,GAAG;YAC9C,MAAME,QAAQ,IAAI,CAAC1B,MAAM,CAACC,WAAW,CAACsB,KAAKxB,MAAM,EAAE4B,OAAO;YAC1D,OAAO,GAAGF,OAAO,CAAC,EAAEC,OAAO;QAC/B;QACA,OAAO,GAAGL,MAAMO,IAAI,CAAC,MAAM,IAAI,CAAC;IACpC;IACAC,UAASN,IAAqB;QAC1B,OAAO,IAAI,CAACvB,MAAM,CAACC,WAAW,CAACsB,KAAKxB,MAAM;IAC9C;IACA+B,YAAW,EAAE/B,MAAM,EAAqB;QACpC,OAAO,CAAC,YAAY,EAAE,IAAI,CAACC,MAAM,CAAC+B,KAAK,CAAChC,QAAQ4B,OAAO,GAAG,iBAAiB,CAAC;IAChF;IACAK,OAAM,EAAEC,MAAM,EAAEC,IAAI,EAAgB;QAChC,MAAMC,cAAcF,OAAOX,GAAG,CAAC,CAACc,IAAMA,EAAE7B,IAAI;QAC5C,MAAM8B,WAAWH,KAAKZ,GAAG,CAAC,CAACgB,MAAQA,IAAIhB,GAAG,CAAC,CAACc,IAAMA,EAAE7B,IAAI;QACxD,MAAMgC,SAASJ,YAAYb,GAAG,CAAC,CAACkB,GAAGhB,IAC/BiB,KAAKC,GAAG,CAACF,EAAEG,MAAM,KAAKN,SAASf,GAAG,CAAC,CAACgB,MAAQ,AAACA,CAAAA,GAAG,CAACd,EAAE,IAAI,EAAC,EAAGmB,MAAM;QAErE,MAAMC,MAAM,CAACC,QACTA,MAAMvB,GAAG,CAAC,CAACc,GAAGZ,IAAMY,EAAEU,MAAM,CAACP,MAAM,CAACf,EAAE,IAAI,IAAII,IAAI,CAAC;QAEvD,MAAMP,QAAQ;YACVuB,IAAIT;YACJI,OAAOjB,GAAG,CAAC,CAACyB,IAAM,IAAIC,MAAM,CAACD,IAAInB,IAAI,CAAC;eACnCS,SAASf,GAAG,CAACsB;SACnB;QACD,OAAO,CAAC,KAAK,EAAEnD,WAAW4B,MAAMO,IAAI,CAAC,OAAO,UAAU,CAAC;IAC3D;IACAqB;QACI,OAAO;IACX;IACAC;QACI,OAAO;IACX;IACAC;QACI,OAAO;IACX;IACA5C,MAAK6C,KAAkC;QACnC,IAAI,YAAYA,SAASA,MAAMrD,MAAM,EAAE;YACnC,OAAO,IAAI,CAACC,MAAM,CAACC,WAAW,CAACmD,MAAMrD,MAAM;QAC/C;QACA,OAAON,WAAW2D,MAAM7C,IAAI;IAChC;AACJ;AAEA,MAAM8C,SAAS,IAAI7D,OAAO;IAAEK;AAAS;AAErC;;;CAGC,GACD,OAAO,SAASyD,uBAAuBC,QAAgB;IACnD,OAAO,AAACF,OAAOtB,KAAK,CAACwB,UAAU;QAAEC,OAAO;IAAM,GAAc7B,OAAO;AACvE"}
package/package.json CHANGED
@@ -3,20 +3,23 @@
3
3
  "nx": {
4
4
  "name": "channel-connector"
5
5
  },
6
- "version": "0.6.0",
6
+ "version": "0.8.0",
7
+ "type": "module",
7
8
  "description": "Generic messaging bridge for connecting to external communication platforms",
8
9
  "main": "dist/index.js",
9
10
  "types": "dist/index.d.ts",
10
11
  "exports": {
11
12
  ".": {
12
13
  "types": "./dist/index.d.ts",
13
- "default": "./dist/index.js"
14
+ "import": "./dist/index.js"
14
15
  }
15
16
  },
16
17
  "scripts": {
17
- "build": "tsc",
18
- "test": "jest",
19
- "test:coverage": "jest --coverage",
18
+ "build": "swc src -d dist --strip-leading-paths && tsc --emitDeclarationOnly",
19
+ "dev": "swc src -d dist --strip-leading-paths --watch",
20
+ "test": "vitest run",
21
+ "test:watch": "vitest",
22
+ "test:coverage": "vitest run --coverage",
20
23
  "lint": "eslint src --ext .ts",
21
24
  "typecheck": "tsc --noEmit",
22
25
  "clean": "rm -rf dist"
@@ -32,17 +35,19 @@
32
35
  "license": "MIT",
33
36
  "dependencies": {
34
37
  "marked": "^15.0.12",
35
- "telegraf": "^4.16.3"
38
+ "telegraf": "^4.16.3",
39
+ "uuid": "14.0.0"
36
40
  },
37
41
  "devDependencies": {
38
- "@types/jest": "^30.0.0",
42
+ "@swc/cli": "^0.8.1",
43
+ "@swc/core": "^1.10.0",
39
44
  "@types/node": "^20.11.5",
40
- "@typescript-eslint/eslint-plugin": "^6.19.1",
41
- "@typescript-eslint/parser": "^6.19.1",
45
+ "@typescript-eslint/eslint-plugin": "^8.60.1",
46
+ "@typescript-eslint/parser": "^8.60.1",
47
+ "@vitest/coverage-v8": "^4.1.8",
42
48
  "eslint": "^8.56.0",
43
- "jest": "^29.7.0",
44
- "ts-jest": "^29.4.5",
45
- "typescript": "^5.3.3"
49
+ "typescript": "^5.5.0",
50
+ "vitest": "^4.1.8"
46
51
  },
47
52
  "engines": {
48
53
  "node": ">=20.20.0"
@@ -0,0 +1,20 @@
1
+ import { defineConfig } from 'vitest/config';
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ globals: true,
6
+ environment: 'node',
7
+ include: ['src/**/__tests__/**/*.test.ts', 'src/**/*.test.ts'],
8
+ coverage: {
9
+ provider: 'v8',
10
+ include: ['src/**/*.ts'],
11
+ exclude: ['src/index.ts', 'src/**/*.d.ts', 'src/types.ts'],
12
+ thresholds: {
13
+ branches: 75,
14
+ functions: 75,
15
+ lines: 75,
16
+ statements: 75,
17
+ },
18
+ },
19
+ },
20
+ });