@adriangalilea/utils 0.7.0 → 0.9.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 (81) hide show
  1. package/README.md +29 -5
  2. package/dist/bot/access-control.d.ts +106 -62
  3. package/dist/bot/access-control.d.ts.map +1 -1
  4. package/dist/bot/access-control.js +255 -146
  5. package/dist/bot/access-control.js.map +1 -1
  6. package/dist/bot/index.d.ts +3 -0
  7. package/dist/bot/index.d.ts.map +1 -1
  8. package/dist/bot/index.js +3 -0
  9. package/dist/bot/index.js.map +1 -1
  10. package/dist/bot/kit.d.ts.map +1 -1
  11. package/dist/bot/kit.js +6 -0
  12. package/dist/bot/kit.js.map +1 -1
  13. package/dist/bot/language.d.ts +305 -0
  14. package/dist/bot/language.d.ts.map +1 -0
  15. package/dist/bot/language.js +250 -0
  16. package/dist/bot/language.js.map +1 -0
  17. package/dist/bot/menu.d.ts +189 -0
  18. package/dist/bot/menu.d.ts.map +1 -0
  19. package/dist/bot/menu.js +331 -0
  20. package/dist/bot/menu.js.map +1 -0
  21. package/dist/bot/message-history.d.ts +259 -0
  22. package/dist/bot/message-history.d.ts.map +1 -0
  23. package/dist/bot/message-history.js +111 -0
  24. package/dist/bot/message-history.js.map +1 -0
  25. package/dist/index.d.ts +1 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +2 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/say/index.d.ts +62 -0
  30. package/dist/say/index.d.ts.map +1 -0
  31. package/dist/say/index.js +59 -0
  32. package/dist/say/index.js.map +1 -0
  33. package/package.json +17 -1
  34. package/dist/currency/crypto-symbols-data.d.ts +0 -10
  35. package/dist/currency/crypto-symbols-data.d.ts.map +0 -1
  36. package/dist/currency/crypto-symbols-data.js +0 -13765
  37. package/dist/currency/crypto-symbols-data.js.map +0 -1
  38. package/dist/currency/crypto-symbols.d.ts +0 -20
  39. package/dist/currency/crypto-symbols.d.ts.map +0 -1
  40. package/dist/currency/crypto-symbols.js +0 -23
  41. package/dist/currency/crypto-symbols.js.map +0 -1
  42. package/dist/currency/download-crypto-list.d.ts +0 -10
  43. package/dist/currency/download-crypto-list.d.ts.map +0 -1
  44. package/dist/currency/download-crypto-list.js +0 -69
  45. package/dist/currency/download-crypto-list.js.map +0 -1
  46. package/dist/currency/index.d.ts +0 -84
  47. package/dist/currency/index.d.ts.map +0 -1
  48. package/dist/currency/index.js +0 -230
  49. package/dist/currency/index.js.map +0 -1
  50. package/dist/dir.d.ts +0 -40
  51. package/dist/dir.d.ts.map +0 -1
  52. package/dist/dir.js +0 -108
  53. package/dist/dir.js.map +0 -1
  54. package/dist/file.d.ts +0 -53
  55. package/dist/file.d.ts.map +0 -1
  56. package/dist/file.js +0 -211
  57. package/dist/file.js.map +0 -1
  58. package/dist/format.d.ts +0 -40
  59. package/dist/format.d.ts.map +0 -1
  60. package/dist/format.js +0 -83
  61. package/dist/format.js.map +0 -1
  62. package/dist/kev.d.ts +0 -149
  63. package/dist/kev.d.ts.map +0 -1
  64. package/dist/kev.js +0 -761
  65. package/dist/kev.js.map +0 -1
  66. package/dist/log.d.ts +0 -91
  67. package/dist/log.d.ts.map +0 -1
  68. package/dist/log.js +0 -300
  69. package/dist/log.js.map +0 -1
  70. package/dist/logger.d.ts +0 -91
  71. package/dist/logger.d.ts.map +0 -1
  72. package/dist/logger.js +0 -269
  73. package/dist/logger.js.map +0 -1
  74. package/dist/path.d.ts +0 -67
  75. package/dist/path.d.ts.map +0 -1
  76. package/dist/path.js +0 -107
  77. package/dist/path.js.map +0 -1
  78. package/dist/project.d.ts +0 -35
  79. package/dist/project.d.ts.map +0 -1
  80. package/dist/project.js +0 -154
  81. package/dist/project.js.map +0 -1
package/README.md CHANGED
@@ -8,8 +8,6 @@ TypeScript utilities - logger, currency, offensive programming, file operations,
8
8
  pnpm add @adriangalilea/utils
9
9
  ```
10
10
 
11
- Also available on [JSR](https://jsr.io/@adriangalilea/utils) but the JSR publish pipeline is not automated — versions may lag behind npm.
12
-
13
11
  ## Usage
14
12
 
15
13
  ### Logger
@@ -250,6 +248,34 @@ newMessages = [{ id: '2', from: 'bob', text: 'hey' }]
250
248
 
251
249
  Saves state to: `$XDG_STATE_HOME/unseen/{name}.json`
252
250
 
251
+ ### Polyglot strings (`say`)
252
+
253
+ A typed multi-language string is just an object literal `{ en, es, … }` — the keys are the source of truth, the TS compiler enforces completeness, there's no JSON file / extraction tool / registry.
254
+
255
+ ```typescript
256
+ import { say, type Polyglot } from '@adriangalilea/utils/say'
257
+
258
+ say({ en: 'Hello', es: 'Hola' }, 'es') // → 'Hola'
259
+ say({ en: 'Hello', es: 'Hola' }, 'fr') // TS error: '"fr"' not in '"en" | "es"'
260
+
261
+ // parametric — closures, no wrapper:
262
+ const greeting = (name: string) => ({ en: `Hi ${name}`, es: `Hola ${name}` })
263
+ say(greeting('Adrian'), 'es') // → 'Hola Adrian'
264
+
265
+ // type your own adapter:
266
+ const notify = (msg: Polyglot<'en' | 'es'>, lang: 'en' | 'es') =>
267
+ transport.send(say(msg, lang))
268
+ ```
269
+
270
+ In a bot, `bot/language` adds `ctx.say` — a callable namespace bound to `ctx.lang`:
271
+
272
+ ```typescript
273
+ ctx.say({ en: 'Continue', es: 'Continuar' }) // → string
274
+ await ctx.say.send({ en: 'Hi', es: 'Hola' }) // → ctx.send(resolved)
275
+ await ctx.say.edit({ en: 'Done', es: 'Listo' }) // → ctx.editText (callback only)
276
+ await ctx.say.answer({ en: 'OK', es: 'OK' }) // → ctx.answer (callback only)
277
+ ```
278
+
253
279
  ### Telegram bot plugins (GramIO)
254
280
 
255
281
  Plugins for personal Telegram bots built on [GramIO](https://gramio.dev). Each plugin lives at its own subpath; peer deps (`gramio`, `@gramio/storage`, `@gramio/session`, `@gramio/format`, `marked`) are **all optional** — install only what you import.
@@ -297,15 +323,13 @@ See `src/bot/CLAUDE.md` for storage layout, design decisions, and gotchas.
297
323
 
298
324
  ## Release
299
325
 
300
- Bump version in `package.json` (and `jsr.json`), push to `main`. CI handles everything:
326
+ Bump version in `package.json`, push to `main`. CI handles everything:
301
327
 
302
328
  1. Type-check, lint, build
303
329
  2. Publish to npm via [OIDC trusted publishing](https://docs.npmjs.com/generating-provenance-statements) (no tokens — GitHub Actions proves identity directly to npm)
304
330
  3. Create git tag `vX.Y.Z`
305
331
  4. Generate changelog via [git-cliff](https://github.com/orhun/git-cliff) and create GitHub release
306
332
 
307
- JSR publishing is not automated — see `jsr.json` TODO.
308
-
309
333
  ## License
310
334
 
311
335
  MIT
@@ -11,51 +11,71 @@
11
11
  * │ no → drop + notify admin (rate-limited) │
12
12
  * └─────────────────────────────────────────────────┘
13
13
  * │
14
- * admin gets DM with [✅ Aprobar] [❌ Denegar]
14
+ * admin gets DM with [✅ Approve] [❌ Deny]
15
15
  * │
16
16
  * admin taps
17
17
  * │
18
18
  * stranger's session updated · stranger gets DM
19
19
  *
20
- * **Storage layout.** Per-user state lives in its own key, written
21
- * through `@gramio/session` so the gate read on the hot path costs
22
- * nothing extra (session is loaded for the user already). A single
23
- * tiny index key keeps track of who's pending / approved / denied so
24
- * the `/access` admin menu can list without scanning the whole DB.
20
+ * **Storage layout.** This plugin stores its per-user record under
21
+ * the `access` field of the shared session record (see
22
+ * `bot/CLAUDE.md` § "Shared session, one record per user"). All
23
+ * per-user state across our plugins coexists in the same record:
25
24
  *
26
- * storage:
27
- * access:<userId> → AccessRecord (the user's session)
28
- * ac:index → { pending, approved, denied }
25
+ * storage[String(userId)] = {
26
+ * access: { status, approvedAt, … }, // ← this plugin
27
+ * language: 'es', // bot/language
28
+ * history: { items: [...] }, // ← bot/message-history
29
+ * }
29
30
  *
30
- * **Cross-user mutations.** When you tap `[✅ Aprobar]` on Pepe's
31
- * notification, ctx is *yours* (the admin), so `ctx.access` is your
32
- * own record. To mutate Pepe's record we hit the storage at the same
33
- * key format we registered the session with (`access:<id>`) and
34
- * update the index. This isn't a hack — it's our own module
35
- * coordinating with itself.
31
+ * Plus one tiny admin-side index so `/access` can list pending /
32
+ * approved / denied without scanning every user:
36
33
  *
37
- * **Composes with `adminContext`** (kit.ts) that plugin must be
38
- * extended first or `bot.start()` throws. Inside this plugin,
39
- * `ctx.adminId` and `ctx.isAdmin` are typed.
34
+ * storage['ac:index'] = { pending: [...ids], approved: [...], denied: [...] }
40
35
  *
41
- * Peer deps: `gramio`, `@gramio/storage`, `@gramio/session`.
36
+ * **Cross-user mutations.** When the admin taps `[✅ Approve]` on
37
+ * Pepe's notification, `ctx` is the admin's, so `ctx.session` is the
38
+ * admin's record — useless for mutating Pepe. We reach for Pepe's
39
+ * record directly via `storage.get(String(pepeId))`, preserve other
40
+ * plugins' fields in it (read-modify-write), and put it back.
41
+ *
42
+ * **i18n.** Every user-facing string is an inline `{ en, es }`
43
+ * polyglot literal resolved via `say(value, lang)` at the call site
44
+ * — no message bundle, no override registry. The recipient's stored
45
+ * `language` field (set by `bot/language`) picks the variant; falls
46
+ * back to `'en'`. Want a different default? Set `language` on the
47
+ * relevant session record before this plugin fires.
48
+ *
49
+ * **Composes with**:
50
+ * - `adminContext` (kit.ts) — required, gives us `ctx.adminId` /
51
+ * `ctx.isAdmin`. Declared as a runtime dependency.
52
+ * - `@gramio/session` — the user creates ONE session at bot level
53
+ * and passes it to this plugin (and the other session-using
54
+ * ones). gramio's runtime dedup ensures the session derive runs
55
+ * exactly once per update.
56
+ *
57
+ * Peer deps: `gramio`, `@gramio/session`, `@gramio/storage`.
42
58
  *
43
59
  * @example
44
60
  * import { Bot } from 'gramio'
61
+ * import { session } from '@gramio/session'
45
62
  * import { redisStorage } from '@gramio/storage-redis'
46
63
  * import { adminContext, gracefulStart } from '@adriangalilea/utils/bot/kit'
47
64
  * import { accessControl } from '@adriangalilea/utils/bot/access-control'
48
65
  *
49
66
  * const storage = redisStorage()
67
+ * const userSession = session({ storage, key: 'session', initial: () => ({}) })
50
68
  *
51
69
  * const bot = new Bot(process.env.BOT_TOKEN!)
52
70
  * .extend(adminContext({ adminId: 190202471 }))
53
- * .extend(accessControl({ storage, defaults: [1158734055] }))
54
- * .command('start', (ctx) => ctx.send(`hola, source=${ctx.access.source}`))
71
+ * .extend(userSession)
72
+ * .extend(accessControl({ session: userSession, storage, defaults: [1158734055] }))
73
+ * .command('start', (ctx) => ctx.send(`source=${ctx.access.source ?? 'denied'}`))
55
74
  *
56
75
  * await gracefulStart(bot)
57
76
  */
58
77
  import { type AnyBot, type DeriveDefinitions, Plugin } from 'gramio';
78
+ import { session } from '@gramio/session';
59
79
  import { type Storage } from '@gramio/storage';
60
80
  export type AccessStatus = 'unknown' | 'pending' | 'approved' | 'denied';
61
81
  export type AccessUser = {
@@ -65,8 +85,10 @@ export type AccessUser = {
65
85
  username?: string;
66
86
  };
67
87
  /**
68
- * The shape persisted per-user via session at `access:<userId>`.
69
- * `unknown` is the initial state (session never seen this user).
88
+ * What this plugin persists under `ctx.session.access` per user. When
89
+ * `ctx.session.access` is `undefined`, the user has never interacted
90
+ * (or has been wiped via /forget). The plugin treats that as
91
+ * status='unknown' for gating purposes.
70
92
  */
71
93
  export type AccessRecord = {
72
94
  status: AccessStatus;
@@ -105,13 +127,33 @@ export type AccessInfo = {
105
127
  allowed: false;
106
128
  reason: 'denied' | 'pending' | 'unknown' | 'no-sender';
107
129
  };
130
+ /**
131
+ * Loose session shape — this plugin writes `access`; it READS `language`
132
+ * to localize messages it sends to the subject. Both are optional.
133
+ */
134
+ type SessionLike = {
135
+ access?: AccessRecord;
136
+ language?: string;
137
+ };
138
+ /** @internal — kept unexported so it doesn't clash with peers' refs. */
139
+ type AcSessionPluginRef = ReturnType<typeof session<SessionLike, 'session'>>;
108
140
  export type AccessControlOptions = {
109
- /** Persistence. Default `inMemoryStorage()` (data lost on restart — warns once). */
110
- storage?: Storage;
141
+ /**
142
+ * Shared session plugin. This plugin extends it for type flow;
143
+ * gramio's runtime dedup ensures it only runs once per update.
144
+ * `ctx.session.access` is where the per-user access record lives.
145
+ */
146
+ session: AcSessionPluginRef;
147
+ /**
148
+ * Storage backend for cross-user mutations (admin approves Pepe →
149
+ * write to Pepe's session record from admin's ctx). Must be the
150
+ * same storage instance passed to `session()`.
151
+ */
152
+ storage: Storage;
111
153
  /** Always-allowed user ids, hardcoded. Bypass the entire flow. */
112
154
  defaults?: ReadonlyArray<number>;
113
- /** Reply sent to denied users on first attempt. `false` to silence. */
114
- denyMessage?: string | false;
155
+ /** Pass `false` to silence the first-attempt reply to denied users. */
156
+ silentDeny?: boolean;
115
157
  /** Min ms between repeat admin notifications for the same user. Default 6h. */
116
158
  notifyThrottleMs?: number;
117
159
  /** Callbacks for your own logging / metrics. */
@@ -132,157 +174,159 @@ type AdminDerives = {
132
174
  adminId: number;
133
175
  isAdmin: boolean;
134
176
  };
135
- type AccessSessionDerives = {
136
- _accessSession: AccessRecord;
137
- };
138
177
  type AccessDerives = {
139
178
  access: AccessInfo;
140
179
  };
141
- export declare const accessControl: (opts?: AccessControlOptions) => Plugin<{}, DeriveDefinitions & {
142
- global: AdminDerives & AccessSessionDerives & AccessDerives;
180
+ type SessionDerives = {
181
+ session: SessionLike & {
182
+ $clear: () => Promise<void>;
183
+ };
184
+ };
185
+ export declare const accessControl: (opts: AccessControlOptions) => Plugin<{}, DeriveDefinitions & {
186
+ global: AdminDerives & AccessDerives & SessionDerives;
143
187
  } & {
144
188
  message: {
145
- _accessSession: AccessRecord & {
189
+ session: SessionLike & {
146
190
  $clear: () => Promise<void>;
147
191
  };
148
192
  };
149
193
  channel_post: {
150
- _accessSession: AccessRecord & {
194
+ session: SessionLike & {
151
195
  $clear: () => Promise<void>;
152
196
  };
153
197
  };
154
198
  inline_query: {
155
- _accessSession: AccessRecord & {
199
+ session: SessionLike & {
156
200
  $clear: () => Promise<void>;
157
201
  };
158
202
  };
159
203
  chosen_inline_result: {
160
- _accessSession: AccessRecord & {
204
+ session: SessionLike & {
161
205
  $clear: () => Promise<void>;
162
206
  };
163
207
  };
164
208
  callback_query: {
165
- _accessSession: AccessRecord & {
209
+ session: SessionLike & {
166
210
  $clear: () => Promise<void>;
167
211
  };
168
212
  };
169
213
  shipping_query: {
170
- _accessSession: AccessRecord & {
214
+ session: SessionLike & {
171
215
  $clear: () => Promise<void>;
172
216
  };
173
217
  };
174
218
  pre_checkout_query: {
175
- _accessSession: AccessRecord & {
219
+ session: SessionLike & {
176
220
  $clear: () => Promise<void>;
177
221
  };
178
222
  };
179
223
  poll_answer: {
180
- _accessSession: AccessRecord & {
224
+ session: SessionLike & {
181
225
  $clear: () => Promise<void>;
182
226
  };
183
227
  };
184
228
  chat_join_request: {
185
- _accessSession: AccessRecord & {
229
+ session: SessionLike & {
186
230
  $clear: () => Promise<void>;
187
231
  };
188
232
  };
189
233
  new_chat_members: {
190
- _accessSession: AccessRecord & {
234
+ session: SessionLike & {
191
235
  $clear: () => Promise<void>;
192
236
  };
193
237
  };
194
238
  new_chat_title: {
195
- _accessSession: AccessRecord & {
239
+ session: SessionLike & {
196
240
  $clear: () => Promise<void>;
197
241
  };
198
242
  };
199
243
  new_chat_photo: {
200
- _accessSession: AccessRecord & {
244
+ session: SessionLike & {
201
245
  $clear: () => Promise<void>;
202
246
  };
203
247
  };
204
248
  delete_chat_photo: {
205
- _accessSession: AccessRecord & {
249
+ session: SessionLike & {
206
250
  $clear: () => Promise<void>;
207
251
  };
208
252
  };
209
253
  group_chat_created: {
210
- _accessSession: AccessRecord & {
254
+ session: SessionLike & {
211
255
  $clear: () => Promise<void>;
212
256
  };
213
257
  };
214
258
  message_auto_delete_timer_changed: {
215
- _accessSession: AccessRecord & {
259
+ session: SessionLike & {
216
260
  $clear: () => Promise<void>;
217
261
  };
218
262
  };
219
263
  migrate_to_chat_id: {
220
- _accessSession: AccessRecord & {
264
+ session: SessionLike & {
221
265
  $clear: () => Promise<void>;
222
266
  };
223
267
  };
224
268
  migrate_from_chat_id: {
225
- _accessSession: AccessRecord & {
269
+ session: SessionLike & {
226
270
  $clear: () => Promise<void>;
227
271
  };
228
272
  };
229
273
  pinned_message: {
230
- _accessSession: AccessRecord & {
274
+ session: SessionLike & {
231
275
  $clear: () => Promise<void>;
232
276
  };
233
277
  };
234
278
  invoice: {
235
- _accessSession: AccessRecord & {
279
+ session: SessionLike & {
236
280
  $clear: () => Promise<void>;
237
281
  };
238
282
  };
239
283
  successful_payment: {
240
- _accessSession: AccessRecord & {
284
+ session: SessionLike & {
241
285
  $clear: () => Promise<void>;
242
286
  };
243
287
  };
244
288
  chat_shared: {
245
- _accessSession: AccessRecord & {
289
+ session: SessionLike & {
246
290
  $clear: () => Promise<void>;
247
291
  };
248
292
  };
249
293
  proximity_alert_triggered: {
250
- _accessSession: AccessRecord & {
294
+ session: SessionLike & {
251
295
  $clear: () => Promise<void>;
252
296
  };
253
297
  };
254
298
  video_chat_scheduled: {
255
- _accessSession: AccessRecord & {
299
+ session: SessionLike & {
256
300
  $clear: () => Promise<void>;
257
301
  };
258
302
  };
259
303
  video_chat_started: {
260
- _accessSession: AccessRecord & {
304
+ session: SessionLike & {
261
305
  $clear: () => Promise<void>;
262
306
  };
263
307
  };
264
308
  video_chat_ended: {
265
- _accessSession: AccessRecord & {
309
+ session: SessionLike & {
266
310
  $clear: () => Promise<void>;
267
311
  };
268
312
  };
269
313
  video_chat_participants_invited: {
270
- _accessSession: AccessRecord & {
314
+ session: SessionLike & {
271
315
  $clear: () => Promise<void>;
272
316
  };
273
317
  };
274
318
  web_app_data: {
275
- _accessSession: AccessRecord & {
319
+ session: SessionLike & {
276
320
  $clear: () => Promise<void>;
277
321
  };
278
322
  };
279
323
  location: {
280
- _accessSession: AccessRecord & {
324
+ session: SessionLike & {
281
325
  $clear: () => Promise<void>;
282
326
  };
283
327
  };
284
328
  passport_data: {
285
- _accessSession: AccessRecord & {
329
+ session: SessionLike & {
286
330
  $clear: () => Promise<void>;
287
331
  };
288
332
  };
@@ -329,7 +373,7 @@ export declare const accessControl: (opts?: AccessControlOptions) => Plugin<{},
329
373
  * easily spin up a second Telegram account. Writes a `pending` record
330
374
  * to storage at the same key the plugin's session would, updates the
331
375
  * index, then DMs the admin with the real
332
- * `[✅ Aprobar][❌ Denegar]` keyboard. Tapping those buttons exercises
376
+ * `[✅ Approve][❌ Deny]` keyboard. Tapping those buttons exercises
333
377
  * the real callback handlers end-to-end.
334
378
  *
335
379
  * Pass the SAME `storage` instance you passed to `accessControl({ storage })`.
@@ -1 +1 @@
1
- {"version":3,"file":"access-control.d.ts","sourceRoot":"","sources":["../../src/bot/access-control.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"access-control.d.ts","sourceRoot":"","sources":["../../src/bot/access-control.ts"],"names":[],"mappings":"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"}