@adriangalilea/utils 1.11.0 → 1.13.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/README.md +1 -0
- package/dist/bot/language.d.ts +52 -2
- package/dist/bot/language.d.ts.map +1 -1
- package/dist/bot/language.js +69 -39
- package/dist/bot/language.js.map +1 -1
- package/dist/bot/menu.d.ts +1 -1
- package/dist/bot/menu.d.ts.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -444,6 +444,7 @@ Then `pnpm install`. Every `ctx.send` / `ctx.sendDocument` / `ctx.reply` / etc.
|
|
|
444
444
|
| `@adriangalilea/utils/bot/access-control` | Personal-bot ACL — gates non-admin/non-default users; admin gets DM with `[✅ Aprobar][❌ Denegar]` on first attempt; `/access` opens a persistent menu (revoke / reapprove / list pending). Backed by `@gramio/session` per-user + a small index. **Native alternative**: BotFather → Bot Settings → Access → "Restrict bot usage" — flat allow-list at Telegram. Use this plugin when you want in-bot approval flow instead of a BotFather round-trip; both can coexist. |
|
|
445
445
|
| `@adriangalilea/utils/bot/allow-list` | Static allow-list by **id and/or @username** — stateless, no session/storage. `allowList({ ids?, usernames? })` is a plugin that decorates `ctx.allowed` (boolean); gate in your handlers (`if (!ctx.allowed) return`). `makeAllowList(...)` is the pure framework-free predicate. The light counterpart to `access-control` (which adds an approve/deny flow + revocable store, needing session+storage). Username caveat: a `@username` is optional and mutable, and the Bot API can't resolve username→id ahead of time — prefer `ids` when known, `usernames` is the pragmatic fallback. |
|
|
446
446
|
| `@adriangalilea/utils/bot/groups` | Group-chat identity as plain functions: `chatIdOf(ctx)` (the chat id on any ctx flavour), `isGroupChat(ctx)` / `isPrivateChat(ctx)`, and `isGroupAdmin(ctx, { chatId?, userId? }?)` — the `getChatMember` creator/administrator check behind every admin-gated group setting (auto-summary toggles, "dismiss" buttons on group welcomes), chat/user defaulted from the ctx. Every reader resolves both gramio spellings — message ctxs carry `chat`, callback ctxs (inline-button taps) only `chatId`/`message.chat` — so the same gate works in handlers and taps; read chat ids via `chatIdOf`, never `ctx.chat?.id`. Takes real gramio ctxs and `MenuCtx` with no cast; a miswired ctx panics, an API rejection fails closed (`false`). Composition over policy: bot-owner override stays at your call site (`ctx.isAdmin \|\| await isGroupAdmin(ctx)`). |
|
|
447
|
+
| `@adriangalilea/utils/bot/language` (picker surface) | The language-picker vocabulary and surfaces, so bots don't fork label lists: `flagFor` / `autonym` / `languageLabel` ("🇪🇸 Español"), `languagePickerItem({ label, codes, isActive, pick })` (the 2-up primary-highlighted MenuItem factory — storage and policy live in your closures), and `addLanguageRows(kb, { codes, pack, active? })` (the raw-InlineKeyboard twin for onboarding / group-welcome keyboards). |
|
|
447
448
|
| `@adriangalilea/utils/bot/user` | `userLabel(u)` — the conditional "[name] [@username] [id]" line every bot re-rolls for admin DMs and logs: `Ada Lovelace (@ada · 42)` / `Ada (42)` / `@ada (42)` / `id 42`, missing pieces drop instead of padding. Reads both gramio spellings (`firstName` / `first_name`); plain text by design. |
|
|
448
449
|
| `@adriangalilea/utils/bot/coalesce` | Joins client-split inbound messages back into one. When a user pastes >4096 chars, Telegram clients fragment it into separate `message` updates with no marker. Middleware detects the burst and emits one combined event. |
|
|
449
450
|
| `@adriangalilea/utils/bot/llm` | The full LLM-chatbot pipeline in one module. **Input:** `streamChat(response)` parses OpenAI-compatible SSE (OpenAI, vllm, mlx-lm, llama.cpp, Together, Groq, …) into a typed `AsyncGenerator<{type: 'content' \| 'reasoning', text}>`. **Output:** `ctx.startStream()` (low-level: debounced markdown to Telegram, 4000-char split, exposes `wasPartial` after `.end()`). `ctx.startChatStream(response)` (high-level: consumes the stream, renders reasoning as a Telegram `expandable_blockquote` entity + content as streamed markdown — both go through `markdownToFormattable` with graceful degradation — returns `{ content, reasoning }`). **History:** `llmHistory({...})` returns `.plugin` (decorates `ctx.llm` with `.add() / .get() / .clear() / .all() / .clearAll()`, per-(user, thread) OpenAI `ChatMessage` shape, persisted in the shared session record so the menu's 🗑 Forget wipes it automatically) AND `.menuItem` (drop-in "🗑 Delete this thread" for `botMenu` — wipes the LLM history AND calls `deleteForumTopic` so the Telegram thread + all its messages disappear from the chat; falls back to Redis-only clear when no `threadId` is present). |
|
package/dist/bot/language.d.ts
CHANGED
|
@@ -61,9 +61,9 @@
|
|
|
61
61
|
* .command('hello', (ctx) => ctx.send({ en: 'Hello', es: 'Hola' }[ctx.lang]))
|
|
62
62
|
*/
|
|
63
63
|
import type { session } from "@gramio/session";
|
|
64
|
-
import { type DeriveDefinitions, Plugin } from "gramio";
|
|
64
|
+
import { type DeriveDefinitions, type InlineKeyboard, Plugin } from "gramio";
|
|
65
65
|
import { type Polyglot } from "../say/index.js";
|
|
66
|
-
import type { MenuItem } from "./menu.js";
|
|
66
|
+
import type { ActionResult, MenuCtx, MenuItem } from "./menu.js";
|
|
67
67
|
/** Branded BCP-47 language tag — obtainable only via the validators below. */
|
|
68
68
|
export type LangCode = string & {
|
|
69
69
|
readonly __langCode: unique symbol;
|
|
@@ -165,6 +165,56 @@ type LanguageDerives<Lang extends string> = {
|
|
|
165
165
|
lang: Lang;
|
|
166
166
|
say: Sayer<Lang>;
|
|
167
167
|
};
|
|
168
|
+
/** A representative flag for a language tag: the region's flag when the tag carries one
|
|
169
|
+
* (`pt-BR` → 🇧🇷), a curated flag for common regionless tags (`es` → 🇪🇸), 🌐 otherwise. */
|
|
170
|
+
export declare const flagFor: (lang: string) => string;
|
|
171
|
+
/** The language's name in itself (`es` → "Español", `ja` → "日本語") — what its own
|
|
172
|
+
* speakers scan a picker for. Falls back to the tag when Intl doesn't know it. */
|
|
173
|
+
export declare const autonym: (lang: string) => string;
|
|
174
|
+
/** The canonical picker label: flag + autonym (`es` → "🇪🇸 Español"). The autonym is
|
|
175
|
+
* title-cased for the label position — Intl returns "español" (correct in running
|
|
176
|
+
* Spanish prose, wrong on a button); caseless scripts pass through untouched. */
|
|
177
|
+
export declare const languageLabel: (lang: string) => string;
|
|
178
|
+
/**
|
|
179
|
+
* The language-picker MenuItem, storage- and policy-agnostic: one submenu entry per
|
|
180
|
+
* code, packed two-up, the active code wearing Telegram's `primary` fill, re-rendered
|
|
181
|
+
* in place after a tap. What "active" means and what a tap DOES live in your closures —
|
|
182
|
+
* the plugin's own session-writing `menuItem`, a group-scoped admin-gated picker, and a
|
|
183
|
+
* tier-gated one are all this one factory.
|
|
184
|
+
*
|
|
185
|
+
* `pick` returns the toast (or a refusal toast — gate inside it); the menu owns the
|
|
186
|
+
* single answerCallbackQuery, so never call `ctx.answer` from `pick`.
|
|
187
|
+
*/
|
|
188
|
+
export type LanguagePickerSpec = {
|
|
189
|
+
/** MenuItem id (default "lang"); submenu entry ids are the codes. */
|
|
190
|
+
id?: string;
|
|
191
|
+
/** The submenu button's label. */
|
|
192
|
+
label: string | Polyglot<string>;
|
|
193
|
+
codes: readonly string[];
|
|
194
|
+
/** Button label per code; default {@link languageLabel}. */
|
|
195
|
+
labelFor?: (code: string) => string;
|
|
196
|
+
isActive: (ctx: MenuCtx, code: string) => boolean | Promise<boolean>;
|
|
197
|
+
pick: (ctx: MenuCtx, code: string) => ActionResult | Promise<ActionResult>;
|
|
198
|
+
};
|
|
199
|
+
export declare function languagePickerItem(spec: LanguagePickerSpec): MenuItem;
|
|
200
|
+
/**
|
|
201
|
+
* Append flag-labeled language rows to an InlineKeyboard — the raw-surface twin of
|
|
202
|
+
* {@link languagePickerItem} for keyboards outside `botMenu` (an onboarding /start, a
|
|
203
|
+
* group welcome). The caller owns the callback schema: `pack(code)` returns the
|
|
204
|
+
* callback_data. Returns the same keyboard, so lead rows go before and trailing rows
|
|
205
|
+
* chain after.
|
|
206
|
+
*/
|
|
207
|
+
export declare function addLanguageRows(kb: InlineKeyboard, opts: {
|
|
208
|
+
codes: readonly string[];
|
|
209
|
+
pack: (code: string) => string;
|
|
210
|
+
labelFor?: (code: string) => string;
|
|
211
|
+
/** The code that wears the active fill (the current setting), if any. */
|
|
212
|
+
active?: string;
|
|
213
|
+
/** The active code's fill (default `primary`). Pass `success` when blue already
|
|
214
|
+
* means something else on the same keyboard (e.g. an active nav tab). */
|
|
215
|
+
activeStyle?: "primary" | "success" | "danger";
|
|
216
|
+
perRow?: number;
|
|
217
|
+
}): InlineKeyboard;
|
|
168
218
|
export declare const language: <const Langs extends readonly string[]>(opts: LanguageOptions<Langs>) => LanguageFeature<Langs[number]>;
|
|
169
219
|
declare const buildLanguagePlugin: <Lang extends string>(args: {
|
|
170
220
|
sessionPlugin: LangSessionPluginRef;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"language.d.ts","sourceRoot":"","sources":["../../src/bot/language.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"language.d.ts","sourceRoot":"","sources":["../../src/bot/language.ts"],"names":[],"mappings":"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"}
|
package/dist/bot/language.js
CHANGED
|
@@ -171,12 +171,21 @@ const REGIONLESS_FLAGS = {
|
|
|
171
171
|
pl: "🇵🇱",
|
|
172
172
|
nl: "🇳🇱",
|
|
173
173
|
uk: "🇺🇦",
|
|
174
|
+
hi: "🇮🇳",
|
|
175
|
+
bn: "🇧🇩",
|
|
176
|
+
id: "🇮🇩",
|
|
177
|
+
vi: "🇻🇳",
|
|
178
|
+
th: "🇹🇭",
|
|
179
|
+
fa: "🇮🇷",
|
|
180
|
+
he: "🇮🇱",
|
|
174
181
|
};
|
|
175
182
|
const regionToFlag = (region) => String.fromCodePoint(...region
|
|
176
183
|
.toUpperCase()
|
|
177
184
|
.split("")
|
|
178
185
|
.map((c) => 0x1f1a5 + c.charCodeAt(0)));
|
|
179
|
-
|
|
186
|
+
/** A representative flag for a language tag: the region's flag when the tag carries one
|
|
187
|
+
* (`pt-BR` → 🇧🇷), a curated flag for common regionless tags (`es` → 🇪🇸), 🌐 otherwise. */
|
|
188
|
+
export const flagFor = (lang) => {
|
|
180
189
|
const parts = lang.split("-");
|
|
181
190
|
if (parts.length > 1) {
|
|
182
191
|
const region = parts.find((p) => /^[A-Z]{2}$/.test(p));
|
|
@@ -185,7 +194,9 @@ const flagFor = (lang) => {
|
|
|
185
194
|
}
|
|
186
195
|
return REGIONLESS_FLAGS[parts[0].toLowerCase()] ?? "🌐";
|
|
187
196
|
};
|
|
188
|
-
|
|
197
|
+
/** The language's name in itself (`es` → "Español", `ja` → "日本語") — what its own
|
|
198
|
+
* speakers scan a picker for. Falls back to the tag when Intl doesn't know it. */
|
|
199
|
+
export const autonym = (lang) => {
|
|
189
200
|
try {
|
|
190
201
|
const dn = new Intl.DisplayNames([lang], { type: "language" });
|
|
191
202
|
return dn.of(lang) ?? lang;
|
|
@@ -194,8 +205,46 @@ const autonym = (lang) => {
|
|
|
194
205
|
return lang;
|
|
195
206
|
}
|
|
196
207
|
};
|
|
197
|
-
|
|
198
|
-
|
|
208
|
+
/** The canonical picker label: flag + autonym (`es` → "🇪🇸 Español"). The autonym is
|
|
209
|
+
* title-cased for the label position — Intl returns "español" (correct in running
|
|
210
|
+
* Spanish prose, wrong on a button); caseless scripts pass through untouched. */
|
|
211
|
+
export const languageLabel = (lang) => {
|
|
212
|
+
const name = autonym(lang);
|
|
213
|
+
return `${flagFor(lang)} ${name.charAt(0).toLocaleUpperCase(lang)}${name.slice(1)}`;
|
|
214
|
+
};
|
|
215
|
+
export function languagePickerItem(spec) {
|
|
216
|
+
const labelFor = spec.labelFor ?? languageLabel;
|
|
217
|
+
return {
|
|
218
|
+
id: spec.id ?? "lang",
|
|
219
|
+
label: spec.label,
|
|
220
|
+
submenu: spec.codes.map((code, i, arr) => ({
|
|
221
|
+
id: code,
|
|
222
|
+
label: labelFor(code),
|
|
223
|
+
// Two per row (break after each even index).
|
|
224
|
+
keepRow: i % 2 === 0 && i < arr.length - 1,
|
|
225
|
+
style: async (ctx) => (await spec.isActive(ctx, code)) ? "primary" : undefined,
|
|
226
|
+
refresh: true,
|
|
227
|
+
action: (ctx) => spec.pick(ctx, code),
|
|
228
|
+
})),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Append flag-labeled language rows to an InlineKeyboard — the raw-surface twin of
|
|
233
|
+
* {@link languagePickerItem} for keyboards outside `botMenu` (an onboarding /start, a
|
|
234
|
+
* group welcome). The caller owns the callback schema: `pack(code)` returns the
|
|
235
|
+
* callback_data. Returns the same keyboard, so lead rows go before and trailing rows
|
|
236
|
+
* chain after.
|
|
237
|
+
*/
|
|
238
|
+
export function addLanguageRows(kb, opts) {
|
|
239
|
+
const labelFor = opts.labelFor ?? languageLabel;
|
|
240
|
+
const perRow = opts.perRow ?? 2;
|
|
241
|
+
opts.codes.forEach((code, i) => {
|
|
242
|
+
if (i % perRow === 0)
|
|
243
|
+
kb.row();
|
|
244
|
+
kb.text(labelFor(code), opts.pack(code), code === opts.active ? { style: opts.activeStyle ?? "primary" } : undefined);
|
|
245
|
+
});
|
|
246
|
+
return kb;
|
|
247
|
+
}
|
|
199
248
|
// ─── feature factory ───────────────────────────────────────────────
|
|
200
249
|
export const language = (opts) => {
|
|
201
250
|
const scopeOpt = opts.scope;
|
|
@@ -256,42 +305,23 @@ export const language = (opts) => {
|
|
|
256
305
|
matchSupported,
|
|
257
306
|
scopeOpt,
|
|
258
307
|
});
|
|
259
|
-
|
|
260
|
-
|
|
308
|
+
// The plugin's stock picker is the generic factory with session-backed closures.
|
|
309
|
+
// `isActive` resolves stored → hint → default LIVE (not `ctx.lang`, the event-start
|
|
310
|
+
// snapshot — stale within the same callback after `pick` mutated the session), so
|
|
311
|
+
// the highlight tracks reality even before any explicit pick exists.
|
|
312
|
+
const menuItem = languagePickerItem({
|
|
261
313
|
label: menuLabel,
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
//
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
// reality even before any explicit pick exists.
|
|
274
|
-
style: (ctx) => (effectiveLang(ctx) === l ? "primary" : undefined),
|
|
275
|
-
// Re-render the submenu in place after the tap so the colour
|
|
276
|
-
// moves to the newly-selected language without the user having
|
|
277
|
-
// to re-open the menu.
|
|
278
|
-
refresh: true,
|
|
279
|
-
action: (ctx) => {
|
|
280
|
-
// ctx.session is the shared session record. Mutating any
|
|
281
|
-
// field on it goes through @gramio/session's Proxy and
|
|
282
|
-
// auto-persists. We own the `language` field by convention.
|
|
283
|
-
//
|
|
284
|
-
// The menu plugin owns the single `answerCallbackQuery` for
|
|
285
|
-
// this tap — we return the toast string and it gets sent.
|
|
286
|
-
// Calling ctx.answer directly here would be a second answer
|
|
287
|
-
// → Telegram rejects → action throws → `refresh: true` skipped
|
|
288
|
-
// → button colour wouldn't update.
|
|
289
|
-
const c = ctx;
|
|
290
|
-
c.session.language = l;
|
|
291
|
-
return `✓ ${l}`;
|
|
292
|
-
},
|
|
293
|
-
})),
|
|
294
|
-
};
|
|
314
|
+
codes: canonical,
|
|
315
|
+
labelFor: (l) => labels[l] ?? languageLabel(l),
|
|
316
|
+
isActive: (ctx, l) => effectiveLang(ctx) === l,
|
|
317
|
+
pick: (ctx, l) => {
|
|
318
|
+
// ctx.session is the shared session record; mutations go through
|
|
319
|
+
// @gramio/session's Proxy and auto-persist. We own `language` by convention.
|
|
320
|
+
const c = ctx;
|
|
321
|
+
c.session.language = l;
|
|
322
|
+
return `✓ ${l}`;
|
|
323
|
+
},
|
|
324
|
+
});
|
|
295
325
|
return { plugin, menuItem };
|
|
296
326
|
};
|
|
297
327
|
// ─── plugin builder ────────────────────────────────────────────────
|
package/dist/bot/language.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"language.js","sourceRoot":"","sources":["../../src/bot/language.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"language.js","sourceRoot":"","sources":["../../src/bot/language.ts"],"names":[],"mappings":"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"}
|
package/dist/bot/menu.d.ts
CHANGED
|
@@ -161,7 +161,7 @@ type Predicate = (ctx: MenuCtx) => boolean | Promise<boolean>;
|
|
|
161
161
|
* and `refresh: true` never runs. Return the toast instead; the menu
|
|
162
162
|
* sends the single answer.
|
|
163
163
|
*/
|
|
164
|
-
type ActionResult = undefined | string | Polyglot<string>;
|
|
164
|
+
export type ActionResult = undefined | string | Polyglot<string>;
|
|
165
165
|
type Action = (ctx: MenuCtx) => Promise<ActionResult> | ActionResult;
|
|
166
166
|
/**
|
|
167
167
|
* Telegram's inline-keyboard-button colour modes
|
package/dist/bot/menu.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/bot/menu.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4EG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAkB,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9D,OAAO,EAAE,KAAK,QAAQ,EAAO,MAAM,iBAAiB,CAAC;AAOrD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,OAAO,GAAG;IACrB,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,IAAI,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE;YAAE,EAAE,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IACvE,IAAI,CAAC,EAAE,CACN,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,IAAI,MAAM,CAAA;KAAE,EACrC,MAAM,CAAC,EAAE,MAAM,KACX,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,KAAK,CAAC,EAAE,CACP,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,IAAI,MAAM,CAAA;KAAE,EACrC,MAAM,CAAC,EAAE,MAAM,KACX,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAI9C,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/D,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,KAAK,KAAK,GACP,MAAM,GACN,QAAQ,CAAC,MAAM,CAAC,GAChB,CAAC,CACD,GAAG,EAAE,OAAO,KACP,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACxE,KAAK,SAAS,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE9D;;;;;;;;;;;;;;GAcG;AACH,
|
|
1
|
+
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/bot/menu.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adriangalilea/utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.13.0",
|
|
4
4
|
"description": "TypeScript utilities - logger, currency, formatter, GramIO bot plugins, and more",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -161,7 +161,8 @@
|
|
|
161
161
|
"test:tg-html": "tsx tests/tg-html-test.ts",
|
|
162
162
|
"test:flags": "tsx tests/flags-test.ts",
|
|
163
163
|
"test:groups": "tsx tests/groups-test.ts",
|
|
164
|
-
"test:user": "tsx tests/user-test.ts"
|
|
164
|
+
"test:user": "tsx tests/user-test.ts",
|
|
165
|
+
"test:language-picker": "tsx tests/language-picker-test.ts"
|
|
165
166
|
},
|
|
166
167
|
"keywords": [
|
|
167
168
|
"typescript",
|