@xbibzlibrary/telebibz 0.4.4 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/CHANGELOG.md +35 -138
  2. package/LICENSE +1 -1
  3. package/NOTICE.md +9 -4
  4. package/README.md +173 -242
  5. package/examples/01-quickstart.js +13 -0
  6. package/examples/02-menu-tombol.js +22 -0
  7. package/examples/03-wizard.js +29 -0
  8. package/examples/04-broadcast.js +25 -0
  9. package/examples/05-kirim-file.js +19 -0
  10. package/examples/06-menu.js +35 -0
  11. package/examples/07-inline-query.js +18 -0
  12. package/index.d.ts +81 -0
  13. package/index.js +42 -0
  14. package/lib/api.js +154 -0
  15. package/lib/broadcast.js +35 -0
  16. package/lib/composer.js +174 -0
  17. package/lib/context.js +190 -0
  18. package/lib/errors.js +35 -0
  19. package/lib/file.js +41 -0
  20. package/lib/inline-query.js +28 -0
  21. package/lib/keyboard.js +83 -0
  22. package/lib/logger.js +38 -0
  23. package/lib/menus.js +90 -0
  24. package/lib/net.js +115 -0
  25. package/lib/ratelimit.js +61 -0
  26. package/lib/runner.js +45 -0
  27. package/lib/session.js +36 -0
  28. package/lib/telebibz.js +190 -0
  29. package/lib/wizard.js +81 -0
  30. package/package.json +35 -97
  31. package/test/all.test.js +334 -0
  32. package/CODE_OF_CONDUCT.md +0 -37
  33. package/CONTRIBUTING.md +0 -59
  34. package/CONTRIBUTION_RULES.md +0 -41
  35. package/GOVERNANCE.md +0 -47
  36. package/README.id.md +0 -292
  37. package/README.zh-CN.md +0 -292
  38. package/RELEASE_AUTOMATION.md +0 -78
  39. package/RELEASE_POLICY.md +0 -32
  40. package/SECURITY.md +0 -47
  41. package/SHOWCASE.md +0 -29
  42. package/SUPPORT.md +0 -30
  43. package/assets/readme-preview.html +0 -75
  44. package/assets/telebibz-logo.png +0 -0
  45. package/assets/telebibz-readme-preview.png +0 -0
  46. package/bin/telebibz.mjs +0 -3
  47. package/dist/generated/api.d.ts +0 -13
  48. package/dist/generated/api.d.ts.map +0 -1
  49. package/dist/generated/api.js +0 -192
  50. package/dist/generated/api.js.map +0 -1
  51. package/dist/src/api/client.d.ts +0 -62
  52. package/dist/src/api/client.d.ts.map +0 -1
  53. package/dist/src/api/client.js +0 -104
  54. package/dist/src/api/client.js.map +0 -1
  55. package/dist/src/api/errors.d.ts +0 -45
  56. package/dist/src/api/errors.d.ts.map +0 -1
  57. package/dist/src/api/errors.js +0 -65
  58. package/dist/src/api/errors.js.map +0 -1
  59. package/dist/src/api/index.d.ts +0 -6
  60. package/dist/src/api/index.d.ts.map +0 -1
  61. package/dist/src/api/index.js +0 -6
  62. package/dist/src/api/index.js.map +0 -1
  63. package/dist/src/api/telegram-types/LICENSE +0 -21
  64. package/dist/src/api/telegram-types/api.d.ts +0 -22
  65. package/dist/src/api/telegram-types/checklist.d.ts +0 -72
  66. package/dist/src/api/telegram-types/inline.d.ts +0 -692
  67. package/dist/src/api/telegram-types/langs.d.ts +0 -193
  68. package/dist/src/api/telegram-types/manage.d.ts +0 -1144
  69. package/dist/src/api/telegram-types/markup.d.ts +0 -268
  70. package/dist/src/api/telegram-types/message.d.ts +0 -1537
  71. package/dist/src/api/telegram-types/methods.d.ts +0 -2870
  72. package/dist/src/api/telegram-types/mod.d.ts +0 -14
  73. package/dist/src/api/telegram-types/passport.d.ts +0 -163
  74. package/dist/src/api/telegram-types/payment.d.ts +0 -570
  75. package/dist/src/api/telegram-types/rich.d.ts +0 -1010
  76. package/dist/src/api/telegram-types/settings.d.ts +0 -120
  77. package/dist/src/api/telegram-types/story.d.ts +0 -89
  78. package/dist/src/api/telegram-types/update.d.ts +0 -84
  79. package/dist/src/api/telegram.d.ts +0 -7
  80. package/dist/src/api/telegram.d.ts.map +0 -1
  81. package/dist/src/api/telegram.js +0 -2
  82. package/dist/src/api/telegram.js.map +0 -1
  83. package/dist/src/api/transport.d.ts +0 -68
  84. package/dist/src/api/transport.d.ts.map +0 -1
  85. package/dist/src/api/transport.js +0 -264
  86. package/dist/src/api/transport.js.map +0 -1
  87. package/dist/src/api/types.d.ts +0 -466
  88. package/dist/src/api/types.d.ts.map +0 -1
  89. package/dist/src/api/types.js +0 -2
  90. package/dist/src/api/types.js.map +0 -1
  91. package/dist/src/branding/terminal.d.ts +0 -77
  92. package/dist/src/branding/terminal.d.ts.map +0 -1
  93. package/dist/src/branding/terminal.js +0 -328
  94. package/dist/src/branding/terminal.js.map +0 -1
  95. package/dist/src/broadcast/broadcast.d.ts +0 -50
  96. package/dist/src/broadcast/broadcast.d.ts.map +0 -1
  97. package/dist/src/broadcast/broadcast.js +0 -56
  98. package/dist/src/broadcast/broadcast.js.map +0 -1
  99. package/dist/src/cache/cache.d.ts +0 -34
  100. package/dist/src/cache/cache.d.ts.map +0 -1
  101. package/dist/src/cache/cache.js +0 -41
  102. package/dist/src/cache/cache.js.map +0 -1
  103. package/dist/src/cli.d.ts +0 -2
  104. package/dist/src/cli.d.ts.map +0 -1
  105. package/dist/src/cli.js +0 -84
  106. package/dist/src/cli.js.map +0 -1
  107. package/dist/src/context/context.d.ts +0 -124
  108. package/dist/src/context/context.d.ts.map +0 -1
  109. package/dist/src/context/context.js +0 -302
  110. package/dist/src/context/context.js.map +0 -1
  111. package/dist/src/core/bot.d.ts +0 -204
  112. package/dist/src/core/bot.d.ts.map +0 -1
  113. package/dist/src/core/bot.js +0 -506
  114. package/dist/src/core/bot.js.map +0 -1
  115. package/dist/src/core/events.d.ts +0 -75
  116. package/dist/src/core/events.d.ts.map +0 -1
  117. package/dist/src/core/events.js +0 -35
  118. package/dist/src/core/events.js.map +0 -1
  119. package/dist/src/core/webhook-reply.d.ts +0 -34
  120. package/dist/src/core/webhook-reply.d.ts.map +0 -1
  121. package/dist/src/core/webhook-reply.js +0 -37
  122. package/dist/src/core/webhook-reply.js.map +0 -1
  123. package/dist/src/index.d.ts +0 -24
  124. package/dist/src/index.d.ts.map +0 -1
  125. package/dist/src/index.js +0 -24
  126. package/dist/src/index.js.map +0 -1
  127. package/dist/src/keyboard/index.d.ts +0 -46
  128. package/dist/src/keyboard/index.d.ts.map +0 -1
  129. package/dist/src/keyboard/index.js +0 -55
  130. package/dist/src/keyboard/index.js.map +0 -1
  131. package/dist/src/middleware/compose.d.ts +0 -5
  132. package/dist/src/middleware/compose.d.ts.map +0 -1
  133. package/dist/src/middleware/compose.js +0 -17
  134. package/dist/src/middleware/compose.js.map +0 -1
  135. package/dist/src/observability/logger.d.ts +0 -78
  136. package/dist/src/observability/logger.d.ts.map +0 -1
  137. package/dist/src/observability/logger.js +0 -285
  138. package/dist/src/observability/logger.js.map +0 -1
  139. package/dist/src/plugins/plugin.d.ts +0 -38
  140. package/dist/src/plugins/plugin.d.ts.map +0 -1
  141. package/dist/src/plugins/plugin.js +0 -59
  142. package/dist/src/plugins/plugin.js.map +0 -1
  143. package/dist/src/queue/queue.d.ts +0 -77
  144. package/dist/src/queue/queue.d.ts.map +0 -1
  145. package/dist/src/queue/queue.js +0 -213
  146. package/dist/src/queue/queue.js.map +0 -1
  147. package/dist/src/router/router.d.ts +0 -61
  148. package/dist/src/router/router.d.ts.map +0 -1
  149. package/dist/src/router/router.js +0 -183
  150. package/dist/src/router/router.js.map +0 -1
  151. package/dist/src/state/conversation.d.ts +0 -56
  152. package/dist/src/state/conversation.d.ts.map +0 -1
  153. package/dist/src/state/conversation.js +0 -133
  154. package/dist/src/state/conversation.js.map +0 -1
  155. package/dist/src/state/forms.d.ts +0 -34
  156. package/dist/src/state/forms.d.ts.map +0 -1
  157. package/dist/src/state/forms.js +0 -44
  158. package/dist/src/state/forms.js.map +0 -1
  159. package/dist/src/state/menu.d.ts +0 -78
  160. package/dist/src/state/menu.d.ts.map +0 -1
  161. package/dist/src/state/menu.js +0 -127
  162. package/dist/src/state/menu.js.map +0 -1
  163. package/dist/src/storage/storage.d.ts +0 -146
  164. package/dist/src/storage/storage.d.ts.map +0 -1
  165. package/dist/src/storage/storage.js +0 -195
  166. package/dist/src/storage/storage.js.map +0 -1
  167. package/dist/src/telegram-features.d.ts +0 -33
  168. package/dist/src/telegram-features.d.ts.map +0 -1
  169. package/dist/src/telegram-features.js +0 -71
  170. package/dist/src/telegram-features.js.map +0 -1
  171. package/dist/src/testing.d.ts +0 -24
  172. package/dist/src/testing.d.ts.map +0 -1
  173. package/dist/src/testing.js +0 -38
  174. package/dist/src/testing.js.map +0 -1
  175. package/dist/src/utils/concurrency.d.ts +0 -25
  176. package/dist/src/utils/concurrency.d.ts.map +0 -1
  177. package/dist/src/utils/concurrency.js +0 -52
  178. package/dist/src/utils/concurrency.js.map +0 -1
  179. package/dist/src/utils/files.d.ts +0 -45
  180. package/dist/src/utils/files.d.ts.map +0 -1
  181. package/dist/src/utils/files.js +0 -53
  182. package/dist/src/utils/files.js.map +0 -1
  183. package/dist/src/utils/text.d.ts +0 -39
  184. package/dist/src/utils/text.d.ts.map +0 -1
  185. package/dist/src/utils/text.js +0 -56
  186. package/dist/src/utils/text.js.map +0 -1
  187. package/dist/src/webhook/handler.d.ts +0 -19
  188. package/dist/src/webhook/handler.d.ts.map +0 -1
  189. package/dist/src/webhook/handler.js +0 -141
  190. package/dist/src/webhook/handler.js.map +0 -1
  191. package/dist-cjs/generated/api.js +0 -194
  192. package/dist-cjs/package.json +0 -3
  193. package/dist-cjs/src/api/client.js +0 -107
  194. package/dist-cjs/src/api/errors.js +0 -74
  195. package/dist-cjs/src/api/index.js +0 -21
  196. package/dist-cjs/src/api/telegram-types/LICENSE +0 -21
  197. package/dist-cjs/src/api/telegram-types/api.d.ts +0 -22
  198. package/dist-cjs/src/api/telegram-types/checklist.d.ts +0 -72
  199. package/dist-cjs/src/api/telegram-types/inline.d.ts +0 -692
  200. package/dist-cjs/src/api/telegram-types/langs.d.ts +0 -193
  201. package/dist-cjs/src/api/telegram-types/manage.d.ts +0 -1144
  202. package/dist-cjs/src/api/telegram-types/markup.d.ts +0 -268
  203. package/dist-cjs/src/api/telegram-types/message.d.ts +0 -1537
  204. package/dist-cjs/src/api/telegram-types/methods.d.ts +0 -2870
  205. package/dist-cjs/src/api/telegram-types/mod.d.ts +0 -14
  206. package/dist-cjs/src/api/telegram-types/passport.d.ts +0 -163
  207. package/dist-cjs/src/api/telegram-types/payment.d.ts +0 -570
  208. package/dist-cjs/src/api/telegram-types/rich.d.ts +0 -1010
  209. package/dist-cjs/src/api/telegram-types/settings.d.ts +0 -120
  210. package/dist-cjs/src/api/telegram-types/story.d.ts +0 -89
  211. package/dist-cjs/src/api/telegram-types/update.d.ts +0 -84
  212. package/dist-cjs/src/api/telegram.js +0 -2
  213. package/dist-cjs/src/api/transport.js +0 -267
  214. package/dist-cjs/src/api/types.js +0 -2
  215. package/dist-cjs/src/branding/terminal.js +0 -338
  216. package/dist-cjs/src/broadcast/broadcast.js +0 -58
  217. package/dist-cjs/src/cache/cache.js +0 -45
  218. package/dist-cjs/src/cli.js +0 -86
  219. package/dist-cjs/src/context/context.js +0 -305
  220. package/dist-cjs/src/core/bot.js +0 -510
  221. package/dist-cjs/src/core/events.js +0 -38
  222. package/dist-cjs/src/core/webhook-reply.js +0 -42
  223. package/dist-cjs/src/index.js +0 -47
  224. package/dist-cjs/src/keyboard/index.js +0 -61
  225. package/dist-cjs/src/middleware/compose.js +0 -20
  226. package/dist-cjs/src/observability/logger.js +0 -293
  227. package/dist-cjs/src/plugins/plugin.js +0 -63
  228. package/dist-cjs/src/queue/queue.js +0 -219
  229. package/dist-cjs/src/router/router.js +0 -186
  230. package/dist-cjs/src/state/conversation.js +0 -139
  231. package/dist-cjs/src/state/forms.js +0 -47
  232. package/dist-cjs/src/state/menu.js +0 -133
  233. package/dist-cjs/src/storage/storage.js +0 -202
  234. package/dist-cjs/src/telegram-features.js +0 -76
  235. package/dist-cjs/src/testing.js +0 -45
  236. package/dist-cjs/src/utils/concurrency.js +0 -57
  237. package/dist-cjs/src/utils/files.js +0 -58
  238. package/dist-cjs/src/utils/text.js +0 -63
  239. package/dist-cjs/src/webhook/handler.js +0 -144
  240. package/docs/API.id.md +0 -1935
  241. package/docs/API.md +0 -1969
  242. package/docs/API.zh-CN.md +0 -1929
  243. package/docs/GETTING_STARTED.id.md +0 -85
  244. package/docs/GETTING_STARTED.md +0 -85
  245. package/docs/GETTING_STARTED.zh-CN.md +0 -85
  246. package/docs/GITHUB_PACKAGES.id.md +0 -82
  247. package/docs/GITHUB_PACKAGES.md +0 -82
  248. package/docs/GITHUB_PACKAGES.zh-CN.md +0 -82
  249. package/docs/README.md +0 -48
  250. package/docs/STORAGE.id.md +0 -105
  251. package/docs/STORAGE.md +0 -105
  252. package/docs/STORAGE.zh-CN.md +0 -105
  253. package/examples/README.md +0 -37
  254. package/examples/files.ts +0 -35
  255. package/examples/minimal.ts +0 -12
  256. package/examples/tsconfig.json +0 -9
  257. package/examples/webhook.ts +0 -42
  258. package/examples/wizard-registration.ts +0 -42
@@ -1,133 +0,0 @@
1
- import { MemoryStorage } from "../storage/storage.js";
2
- export function conversationKeyFromContext(ctx) {
3
- return ctx.chat?.id !== undefined ? `${ctx.chat.id}:${ctx.from?.id ?? "anonymous"}` : `update:${ctx.update.update_id}`;
4
- }
5
- export class ConversationFlow {
6
- ctx;
7
- state;
8
- constructor(ctx, state) {
9
- this.ctx = ctx;
10
- this.state = state;
11
- }
12
- get values() { return this.state.values; }
13
- set(key, value) { this.state.values[key] = value; this.state.updatedAt = Date.now(); return this; }
14
- get(key) { return this.state.values[key]; }
15
- next() { this.state.step += 1; this.state.updatedAt = Date.now(); return this; }
16
- previous() { this.state.step = Math.max(0, this.state.step - 1); this.state.updatedAt = Date.now(); return this; }
17
- complete() { this.state.status = "completed"; this.state.updatedAt = Date.now(); }
18
- cancel() { this.state.status = "cancelled"; this.state.updatedAt = Date.now(); }
19
- }
20
- export class ConversationManager {
21
- active = new Map();
22
- storage;
23
- constructor(storage = new MemoryStorage()) {
24
- this.storage = storage;
25
- }
26
- start(key, name, values = {}) {
27
- const state = { name, step: 0, values, status: "active", updatedAt: Date.now() };
28
- this.active.set(key, state);
29
- void this.storage.set(key, state).catch(() => undefined);
30
- return state;
31
- }
32
- async startAsync(key, name, values = {}) {
33
- const state = { name, step: 0, values, status: "active", updatedAt: Date.now() };
34
- this.active.set(key, state);
35
- await this.storage.set(key, state);
36
- return state;
37
- }
38
- get(key) { return this.active.get(key); }
39
- async getAsync(key) {
40
- const cached = this.active.get(key);
41
- if (cached)
42
- return cached;
43
- const stored = await this.storage.get(key);
44
- if (stored)
45
- this.active.set(key, stored);
46
- return stored;
47
- }
48
- cancel(key) {
49
- const state = this.active.get(key);
50
- if (!state)
51
- return false;
52
- state.status = "cancelled";
53
- state.updatedAt = Date.now();
54
- void this.storage.set(key, state).catch(() => undefined);
55
- return true;
56
- }
57
- async cancelAsync(key) {
58
- const state = await this.getAsync(key);
59
- if (!state)
60
- return false;
61
- state.status = "cancelled";
62
- state.updatedAt = Date.now();
63
- await this.storage.set(key, state);
64
- return true;
65
- }
66
- clearExpired(maxAgeMs) {
67
- if (!Number.isFinite(maxAgeMs) || maxAgeMs < 0)
68
- throw new RangeError("maxAgeMs must be non-negative");
69
- const threshold = Date.now() - maxAgeMs;
70
- let removed = 0;
71
- for (const [key, state] of this.active)
72
- if (state.updatedAt < threshold) {
73
- this.active.delete(key);
74
- void this.storage.delete(key);
75
- removed += 1;
76
- }
77
- return removed;
78
- }
79
- async clearExpiredAsync(maxAgeMs) {
80
- if (!Number.isFinite(maxAgeMs) || maxAgeMs < 0)
81
- throw new RangeError("maxAgeMs must be non-negative");
82
- const threshold = Date.now() - maxAgeMs;
83
- let removed = 0;
84
- for await (const [key, state] of this.storage.entries()) {
85
- if (state.updatedAt < threshold) {
86
- await this.storage.delete(key);
87
- this.active.delete(key);
88
- removed += 1;
89
- }
90
- }
91
- return removed;
92
- }
93
- async run(ctx, key, name, steps) {
94
- const existing = await this.getAsync(key);
95
- const state = existing ?? await this.startAsync(key, name);
96
- if (state.name !== name)
97
- throw new Error(`Conversation ${key} belongs to ${state.name}, not ${name}`);
98
- if (state.status !== "active")
99
- return state;
100
- const flow = new ConversationFlow(ctx, state);
101
- const step = steps[state.step];
102
- if (!step)
103
- state.status = "completed";
104
- else {
105
- await step(flow);
106
- if (state.step >= steps.length)
107
- state.status = "completed";
108
- }
109
- state.updatedAt = Date.now();
110
- await this.storage.set(key, state);
111
- this.active.set(key, state);
112
- return state;
113
- }
114
- }
115
- export class Wizard {
116
- stepsList = [];
117
- defaultManager;
118
- constructor(manager) {
119
- this.defaultManager = manager ?? new ConversationManager();
120
- }
121
- step(step) { this.stepsList.push(step); return this; }
122
- /**
123
- * Runs the active step for a conversation key. The default manager belongs to
124
- * this Wizard instance and is intentionally reused across updates; passing a
125
- * manager is useful when the application owns persistent storage explicitly.
126
- */
127
- async run(ctx, key = conversationKeyFromContext(ctx), manager) {
128
- return (manager ?? this.defaultManager).run(ctx, key, "wizard", this.stepsList.map((step) => step.run));
129
- }
130
- get steps() { return this.stepsList; }
131
- get manager() { return this.defaultManager; }
132
- }
133
- //# sourceMappingURL=conversation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../../src/state/conversation.ts"],"names":[],"mappings":"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"}
@@ -1,34 +0,0 @@
1
- export interface ValidationIssue {
2
- path: string;
3
- message: string;
4
- code?: string;
5
- }
6
- export interface Field<T> {
7
- name: string;
8
- parse: (input: unknown) => T;
9
- validate?: (value: T) => string | undefined | Promise<string | undefined>;
10
- transform?: (value: T) => T | Promise<T>;
11
- required?: boolean;
12
- }
13
- export declare class Form<T extends Record<string, unknown>> {
14
- private readonly fields;
15
- field<K extends keyof T & string>(definition: Field<T[K]> & {
16
- name: K;
17
- }): this;
18
- parse(input: Record<string, unknown>): Promise<{
19
- success: true;
20
- data: T;
21
- } | {
22
- success: false;
23
- issues: ValidationIssue[];
24
- }>;
25
- reset(): void;
26
- }
27
- export declare const validators: {
28
- string: (value: unknown) => string;
29
- number: (value: unknown) => number;
30
- integer: (value: unknown) => number;
31
- email: (value: unknown) => string;
32
- url: (value: unknown) => string;
33
- };
34
- //# sourceMappingURL=forms.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../../src/state/forms.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;AACjF,MAAM,WAAW,KAAK,CAAC,CAAC;IAAI,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE;AACjN,qBAAa,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+C;IACtE,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,GAAG,IAAI;IACxE,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,eAAe,EAAE,CAAA;KAAE,CAAC;IAsBhI,KAAK,IAAI,IAAI;CACd;AACD,eAAO,MAAM,UAAU;oBAAqB,OAAO,KAAG,MAAM;oBAA8G,OAAO,KAAG,MAAM;qBAAiL,OAAO,KAAG,MAAM;mBAAwJ,OAAO,KAAG,MAAM;iBAAkK,OAAO,KAAG,MAAM;CAAgI,CAAC"}
@@ -1,44 +0,0 @@
1
- export class Form {
2
- fields = new Map();
3
- field(definition) { this.fields.set(definition.name, definition); return this; }
4
- async parse(input) {
5
- const issues = [];
6
- const values = {};
7
- for (const [name, field] of this.fields) {
8
- const raw = input[name];
9
- if ((raw === undefined || raw === null || raw === "") && field.required) {
10
- issues.push({ path: name, message: "Field is required", code: "required" });
11
- continue;
12
- }
13
- if (raw === undefined || raw === null || raw === "")
14
- continue;
15
- try {
16
- let value = field.parse(raw);
17
- if (field.transform)
18
- value = await field.transform(value);
19
- const error = await field.validate?.(value);
20
- if (error)
21
- issues.push({ path: name, message: error, code: "invalid" });
22
- else
23
- values[name] = value;
24
- }
25
- catch (error) {
26
- issues.push({ path: name, message: error instanceof Error ? error.message : "Invalid value", code: "parse" });
27
- }
28
- }
29
- return issues.length ? { success: false, issues } : { success: true, data: values };
30
- }
31
- reset() { }
32
- }
33
- export const validators = { string: (value) => { if (typeof value !== "string")
34
- throw new TypeError("Expected string"); return value; }, number: (value) => { const number = typeof value === "number" ? value : Number(value); if (!Number.isFinite(number))
35
- throw new TypeError("Expected number"); return number; }, integer: (value) => { const number = validators.number(value); if (!Number.isInteger(number))
36
- throw new TypeError("Expected integer"); return number; }, email: (value) => { const email = validators.string(value); if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email))
37
- throw new TypeError("Expected email"); return email; }, url: (value) => { const url = validators.string(value); try {
38
- new URL(url);
39
- return url;
40
- }
41
- catch {
42
- throw new TypeError("Expected URL");
43
- } } };
44
- //# sourceMappingURL=forms.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"forms.js","sourceRoot":"","sources":["../../../src/state/forms.ts"],"names":[],"mappings":"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"}
@@ -1,78 +0,0 @@
1
- import { InlineKeyboard } from "../keyboard/index.js";
2
- import type { InlineKeyboardButton, InlineKeyboardMarkup } from "../api/types.js";
3
- export interface Page<T> {
4
- items: T[];
5
- page: number;
6
- pageCount: number;
7
- hasPrevious: boolean;
8
- hasNext: boolean;
9
- }
10
- export declare function paginate<T>(items: readonly T[], page: number, pageSize: number): Page<T>;
11
- export declare function paginationButtons(page: Page<unknown>, prefix: string, labels?: {
12
- previous?: string;
13
- next?: string;
14
- }): InlineKeyboardButton[];
15
- export interface MenuContext {
16
- userId?: number;
17
- permissions?: Iterable<string>;
18
- [key: string]: unknown;
19
- }
20
- export type MenuVisibility = boolean | ((context: MenuContext, item: MenuItem) => boolean | Promise<boolean>);
21
- export type MenuPermission = string | ((context: MenuContext, item: MenuItem) => boolean | Promise<boolean>);
22
- export interface MenuItem {
23
- id: string;
24
- label: string;
25
- callbackData?: string;
26
- url?: string;
27
- visible?: MenuVisibility;
28
- permission?: MenuPermission;
29
- }
30
- export interface MenuBuildOptions {
31
- columns?: number;
32
- includeBreadcrumbs?: boolean;
33
- }
34
- export declare class Menu {
35
- readonly id: string;
36
- private readonly itemsList;
37
- private readonly parents;
38
- constructor(id: string);
39
- item(item: MenuItem): this;
40
- breadcrumb(label: string): this;
41
- get items(): readonly MenuItem[];
42
- get breadcrumbs(): readonly string[];
43
- visibleItems(context?: MenuContext): Promise<MenuItem[]>;
44
- build(context?: MenuContext, options?: MenuBuildOptions): Promise<InlineKeyboard>;
45
- }
46
- export interface MenuControllerOptions<T> {
47
- id: string;
48
- items: readonly T[] | (() => readonly T[] | Promise<readonly T[]>);
49
- pageSize: number;
50
- label: (item: T, index: number) => string;
51
- callback?: (item: T, context: MenuContext) => void | Promise<void>;
52
- context?: MenuContext;
53
- labels?: {
54
- previous?: string;
55
- next?: string;
56
- };
57
- }
58
- export type MenuControllerResult<T> = {
59
- type: "page";
60
- page: Page<T>;
61
- keyboard: InlineKeyboardMarkup;
62
- } | {
63
- type: "select";
64
- item: T;
65
- index: number;
66
- } | {
67
- type: "noop";
68
- } | undefined;
69
- export declare class MenuController<T> {
70
- private currentPage;
71
- private readonly options;
72
- constructor(options: MenuControllerOptions<T>);
73
- get page(): number;
74
- private allItems;
75
- render(context?: MenuContext): Promise<InlineKeyboardMarkup>;
76
- handle(data: string, context?: MenuContext): Promise<MenuControllerResult<T>>;
77
- }
78
- //# sourceMappingURL=menu.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../../src/state/menu.ts"],"names":[],"mappings":"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"}
@@ -1,127 +0,0 @@
1
- import { InlineKeyboard } from "../keyboard/index.js";
2
- export function paginate(items, page, pageSize) {
3
- if (!Number.isInteger(page) || page < 0)
4
- throw new RangeError("page must be a non-negative integer");
5
- if (!Number.isInteger(pageSize) || pageSize < 1)
6
- throw new RangeError("pageSize must be a positive integer");
7
- const pageCount = Math.max(1, Math.ceil(items.length / pageSize));
8
- const safePage = Math.min(page, pageCount - 1);
9
- const start = safePage * pageSize;
10
- return { items: items.slice(start, start + pageSize), page: safePage, pageCount, hasPrevious: safePage > 0, hasNext: safePage < pageCount - 1 };
11
- }
12
- export function paginationButtons(page, prefix, labels = {}) {
13
- const buttons = [];
14
- if (page.hasPrevious)
15
- buttons.push({ text: labels.previous ?? "Previous", callback_data: `${prefix}:page:${page.page - 1}` });
16
- buttons.push({ text: `${page.page + 1}/${page.pageCount}`, callback_data: `${prefix}:noop` });
17
- if (page.hasNext)
18
- buttons.push({ text: labels.next ?? "Next", callback_data: `${prefix}:page:${page.page + 1}` });
19
- return buttons;
20
- }
21
- export class Menu {
22
- id;
23
- itemsList = [];
24
- parents = [];
25
- constructor(id) {
26
- this.id = id;
27
- }
28
- item(item) {
29
- if (!item.id || !item.label)
30
- throw new Error("Menu item id and label are required.");
31
- if (item.url !== undefined && item.callbackData !== undefined)
32
- throw new Error("A menu item cannot have both url and callbackData.");
33
- this.itemsList.push(item);
34
- return this;
35
- }
36
- breadcrumb(label) { if (label)
37
- this.parents.push(label); return this; }
38
- get items() { return this.itemsList; }
39
- get breadcrumbs() { return this.parents; }
40
- async visibleItems(context = {}) {
41
- const permissions = context.permissions ? new Set(context.permissions) : undefined;
42
- const result = [];
43
- for (const item of this.itemsList) {
44
- const visible = typeof item.visible === "function" ? await item.visible(context, item) : item.visible ?? true;
45
- if (!visible)
46
- continue;
47
- const allowed = typeof item.permission === "function"
48
- ? await item.permission(context, item)
49
- : item.permission === undefined
50
- ? true
51
- : permissions?.has(item.permission) ?? false;
52
- if (allowed)
53
- result.push(item);
54
- }
55
- return result;
56
- }
57
- async build(context = {}, options = {}) {
58
- const columns = options.columns ?? 1;
59
- if (!Number.isInteger(columns) || columns < 1)
60
- throw new RangeError("columns must be a positive integer");
61
- const keyboard = new InlineKeyboard();
62
- if (options.includeBreadcrumbs && this.parents.length)
63
- keyboard.text(this.parents.join(" / "), `${this.id}:breadcrumb`);
64
- const buttons = (await this.visibleItems(context)).map((item) => item.url
65
- ? { text: item.label, url: item.url }
66
- : { text: item.label, callback_data: item.callbackData ?? `${this.id}:${item.id}` });
67
- keyboard.grid(buttons, columns);
68
- return keyboard;
69
- }
70
- }
71
- export class MenuController {
72
- currentPage = 0;
73
- options;
74
- constructor(options) {
75
- if (!options.id || !options.id.trim())
76
- throw new Error("MenuController id is required.");
77
- if (!Number.isInteger(options.pageSize) || options.pageSize < 1)
78
- throw new RangeError("pageSize must be a positive integer");
79
- this.options = options;
80
- }
81
- get page() { return this.currentPage; }
82
- async allItems() { return typeof this.options.items === "function" ? await this.options.items() : this.options.items; }
83
- async render(context = this.options.context ?? {}) {
84
- const items = await this.allItems();
85
- const page = paginate(items, this.currentPage, this.options.pageSize);
86
- this.currentPage = page.page;
87
- const keyboard = new InlineKeyboard();
88
- for (let index = 0; index < page.items.length; index += 1) {
89
- const absoluteIndex = page.page * this.options.pageSize + index;
90
- keyboard.text(this.options.label(page.items[index], absoluteIndex), `${this.options.id}:select:${absoluteIndex}`);
91
- }
92
- const navigation = paginationButtons(page, this.options.id, this.options.labels);
93
- if (navigation.length)
94
- keyboard.row(...navigation);
95
- void context;
96
- return keyboard.build();
97
- }
98
- async handle(data, context = this.options.context ?? {}) {
99
- const prefix = `${this.options.id}:`;
100
- if (!data.startsWith(prefix))
101
- return undefined;
102
- const action = data.slice(prefix.length);
103
- if (action === "noop" || action === "breadcrumb")
104
- return { type: "noop" };
105
- if (action.startsWith("page:")) {
106
- const page = Number(action.slice("page:".length));
107
- if (!Number.isInteger(page) || page < 0)
108
- return undefined;
109
- this.currentPage = page;
110
- const items = await this.allItems();
111
- const pageData = paginate(items, this.currentPage, this.options.pageSize);
112
- this.currentPage = pageData.page;
113
- return { type: "page", page: pageData, keyboard: await this.render(context) };
114
- }
115
- if (action.startsWith("select:")) {
116
- const index = Number(action.slice("select:".length));
117
- const items = await this.allItems();
118
- const item = items[index];
119
- if (item === undefined || !Number.isInteger(index) || index < 0)
120
- return undefined;
121
- await this.options.callback?.(item, context);
122
- return { type: "select", item, index };
123
- }
124
- return undefined;
125
- }
126
- }
127
- //# sourceMappingURL=menu.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"menu.js","sourceRoot":"","sources":["../../../src/state/menu.ts"],"names":[],"mappings":"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"}
@@ -1,146 +0,0 @@
1
- export interface StorageOptions {
2
- ttlMs?: number;
3
- }
4
- export interface Storage<K, V> {
5
- get(key: K): Promise<V | undefined>;
6
- set(key: K, value: V, options?: StorageOptions): Promise<void>;
7
- delete(key: K): Promise<boolean>;
8
- has(key: K): Promise<boolean>;
9
- clear(): Promise<void>;
10
- keys(): AsyncIterable<K>;
11
- values(): AsyncIterable<V>;
12
- entries(): AsyncIterable<[K, V]>;
13
- update<T extends V>(key: K, updater: (current: V | undefined) => T | Promise<T>, options?: StorageOptions): Promise<T>;
14
- }
15
- type Entry<V> = {
16
- value: V;
17
- expiresAt?: number;
18
- };
19
- export declare class MemoryStorage<K, V> implements Storage<K, V> {
20
- private readonly valuesMap;
21
- private readonly locks;
22
- get(key: K): Promise<V | undefined>;
23
- /**
24
- * Reads the raw entry including expiry metadata. Intended for storage adapters
25
- * (such as `JsonFileStorage`) that need to persist TTL information across restarts.
26
- */
27
- readEntry(key: K): Promise<Entry<V> | undefined>;
28
- set(key: K, value: V, options?: StorageOptions): Promise<void>;
29
- delete(key: K): Promise<boolean>;
30
- has(key: K): Promise<boolean>;
31
- clear(): Promise<void>;
32
- keys(): AsyncIterable<K>;
33
- values(): AsyncIterable<V>;
34
- entries(): AsyncIterable<[K, V]>;
35
- update<T extends V>(key: K, updater: (current: V | undefined) => T | Promise<T>, options?: StorageOptions): Promise<T>;
36
- }
37
- export declare class JsonFileStorage<V> implements Storage<string, V> {
38
- readonly filePath: string;
39
- private readonly memory;
40
- private readonly ready;
41
- private writeChain;
42
- constructor(filePath: string);
43
- private load;
44
- private persist;
45
- get(key: string): Promise<V | undefined>;
46
- set(key: string, value: V, options?: StorageOptions): Promise<void>;
47
- delete(key: string): Promise<boolean>;
48
- has(key: string): Promise<boolean>;
49
- clear(): Promise<void>;
50
- keys(): AsyncIterable<string>;
51
- values(): AsyncIterable<V>;
52
- entries(): AsyncIterable<[string, V]>;
53
- update<T extends V>(key: string, updater: (current: V | undefined) => T | Promise<T>, options?: StorageOptions): Promise<T>;
54
- }
55
- export interface RedisLikeClient {
56
- get(key: string): Promise<string | null>;
57
- set(key: string, value: string, options?: {
58
- EX?: number;
59
- PX?: number;
60
- }): Promise<unknown>;
61
- del(key: string): Promise<number>;
62
- exists(key: string): Promise<number>;
63
- keys(pattern: string): Promise<string[]>;
64
- }
65
- export declare class RedisStorage<V> implements Storage<string, V> {
66
- private readonly client;
67
- private readonly prefix;
68
- constructor(client: RedisLikeClient, prefix?: string);
69
- private key;
70
- private unkey;
71
- get(key: string): Promise<V | undefined>;
72
- set(key: string, value: V, options?: StorageOptions): Promise<void>;
73
- delete(key: string): Promise<boolean>;
74
- has(key: string): Promise<boolean>;
75
- clear(): Promise<void>;
76
- keys(): AsyncIterable<string>;
77
- values(): AsyncIterable<V>;
78
- entries(): AsyncIterable<[string, V]>;
79
- update<T extends V>(key: string, updater: (current: V | undefined) => T | Promise<T>, options?: StorageOptions): Promise<T>;
80
- }
81
- export interface SqlStorageDriver<V> {
82
- get(key: string): Promise<V | undefined>;
83
- set(key: string, value: V, expiresAt?: number): Promise<void>;
84
- delete(key: string): Promise<boolean>;
85
- has(key: string): Promise<boolean>;
86
- clear(): Promise<void>;
87
- entries(): Promise<Array<[string, V, number | undefined]>>;
88
- }
89
- export declare class SqlStorage<V> implements Storage<string, V> {
90
- private readonly driver;
91
- constructor(driver: SqlStorageDriver<V>);
92
- get(key: string): Promise<V | undefined>;
93
- set(key: string, value: V, options?: StorageOptions): Promise<void>;
94
- delete(key: string): Promise<boolean>;
95
- has(key: string): Promise<boolean>;
96
- clear(): Promise<void>;
97
- keys(): AsyncIterable<string>;
98
- values(): AsyncIterable<V>;
99
- entries(): AsyncIterable<[string, V]>;
100
- update<T extends V>(key: string, updater: (current: V | undefined) => T | Promise<T>, options?: StorageOptions): Promise<T>;
101
- }
102
- export interface MongoStorageCollection<V> {
103
- findOne(filter: {
104
- key: string;
105
- }): Promise<{
106
- value: V;
107
- expiresAt?: number;
108
- } | null>;
109
- replaceOne(filter: {
110
- key: string;
111
- }, document: {
112
- key: string;
113
- value: V;
114
- expiresAt?: number;
115
- }, options?: {
116
- upsert?: boolean;
117
- }): Promise<unknown>;
118
- deleteOne(filter: {
119
- key: string;
120
- }): Promise<{
121
- deletedCount?: number;
122
- }>;
123
- deleteMany(filter: Record<string, unknown>): Promise<unknown>;
124
- find(filter?: Record<string, unknown>): {
125
- toArray(): Promise<Array<{
126
- key: string;
127
- value: V;
128
- expiresAt?: number;
129
- }>>;
130
- };
131
- }
132
- export declare class MongoStorage<V> implements Storage<string, V> {
133
- private readonly collection;
134
- constructor(collection: MongoStorageCollection<V>);
135
- get(key: string): Promise<V | undefined>;
136
- set(key: string, value: V, options?: StorageOptions): Promise<void>;
137
- delete(key: string): Promise<boolean>;
138
- has(key: string): Promise<boolean>;
139
- clear(): Promise<void>;
140
- keys(): AsyncIterable<string>;
141
- values(): AsyncIterable<V>;
142
- entries(): AsyncIterable<[string, V]>;
143
- update<T extends V>(key: string, updater: (current: V | undefined) => T | Promise<T>, options?: StorageOptions): Promise<T>;
144
- }
145
- export {};
146
- //# sourceMappingURL=storage.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/storage/storage.ts"],"names":[],"mappings":"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"}