@adriangalilea/utils 7.0.0 → 8.0.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 +13 -23
- package/dist/bot/access-control.d.ts +89 -31
- package/dist/bot/access-control.d.ts.map +1 -1
- package/dist/bot/access-control.js +10 -28
- package/dist/bot/access-control.js.map +1 -1
- package/dist/bot/callbacks.d.ts +0 -13
- package/dist/bot/callbacks.d.ts.map +1 -1
- package/dist/bot/callbacks.js +0 -16
- package/dist/bot/callbacks.js.map +1 -1
- package/dist/bot/kit.d.ts +4 -9
- package/dist/bot/kit.d.ts.map +1 -1
- package/dist/bot/kit.js +0 -1
- package/dist/bot/kit.js.map +1 -1
- package/dist/bot/lang.d.ts +46 -0
- package/dist/bot/lang.d.ts.map +1 -0
- package/dist/bot/lang.js +29 -0
- package/dist/bot/lang.js.map +1 -0
- package/dist/bot/language.d.ts +0 -2
- package/dist/bot/language.d.ts.map +1 -1
- package/dist/bot/language.js +0 -12
- package/dist/bot/language.js.map +1 -1
- package/dist/bot/llm.d.ts +1 -2
- package/dist/bot/llm.d.ts.map +1 -1
- package/dist/bot/llm.js +1 -2
- package/dist/bot/llm.js.map +1 -1
- package/dist/bot/menu.d.ts +7 -0
- package/dist/bot/menu.d.ts.map +1 -1
- package/dist/bot/menu.js +8 -2
- package/dist/bot/menu.js.map +1 -1
- package/dist/bot/payments/callbacks.d.ts +1 -1
- package/dist/bot/payments/callbacks.d.ts.map +1 -1
- package/dist/bot/payments/callbacks.js +9 -11
- package/dist/bot/payments/callbacks.js.map +1 -1
- package/dist/bot/payments/commands.d.ts +1 -1
- package/dist/bot/payments/commands.d.ts.map +1 -1
- package/dist/bot/payments/commands.js +2 -2
- package/dist/bot/payments/commands.js.map +1 -1
- package/dist/bot/payments/derive.d.ts.map +1 -1
- package/dist/bot/payments/derive.js +7 -6
- package/dist/bot/payments/derive.js.map +1 -1
- package/dist/bot/payments/handlers.d.ts +1 -5
- package/dist/bot/payments/handlers.d.ts.map +1 -1
- package/dist/bot/payments/handlers.js +1 -2
- package/dist/bot/payments/handlers.js.map +1 -1
- package/dist/bot/payments/invoice.d.ts.map +1 -1
- package/dist/bot/payments/invoice.js +1 -2
- package/dist/bot/payments/invoice.js.map +1 -1
- package/dist/bot/payments/menu-item.d.ts.map +1 -1
- package/dist/bot/payments/menu-item.js +2 -2
- package/dist/bot/payments/menu-item.js.map +1 -1
- package/dist/bot/payments/payouts.d.ts +3 -3
- package/dist/bot/payments/payouts.js +3 -3
- package/dist/bot/payments/plugin.d.ts +87 -29
- package/dist/bot/payments/plugin.d.ts.map +1 -1
- package/dist/bot/payments/refund.d.ts +1 -5
- package/dist/bot/payments/refund.d.ts.map +1 -1
- package/dist/bot/payments/refund.js +6 -32
- package/dist/bot/payments/refund.js.map +1 -1
- package/dist/bot/payments/types.d.ts +2 -9
- package/dist/bot/payments/types.d.ts.map +1 -1
- package/dist/bot/payments/types.js +0 -7
- package/dist/bot/payments/types.js.map +1 -1
- package/dist/bot/payments/waiver.d.ts +1 -17
- package/dist/bot/payments/waiver.d.ts.map +1 -1
- package/dist/bot/payments/waiver.js +2 -30
- package/dist/bot/payments/waiver.js.map +1 -1
- package/dist/bot/reactions.d.ts +0 -2
- package/dist/bot/reactions.d.ts.map +1 -1
- package/dist/bot/reactions.js +0 -16
- package/dist/bot/reactions.js.map +1 -1
- package/dist/bot/session.d.ts +1 -21
- package/dist/bot/session.d.ts.map +1 -1
- package/dist/bot/session.js +1 -29
- package/dist/bot/session.js.map +1 -1
- package/dist/bot/storage.d.ts +1 -1
- package/dist/bot/storage.js +1 -1
- package/dist/bot/worker.d.ts.map +1 -1
- package/dist/bot/worker.js +1 -4
- package/dist/bot/worker.js.map +1 -1
- package/dist/cli/text.d.ts.map +1 -1
- package/dist/cli/text.js +2 -3
- package/dist/cli/text.js.map +1 -1
- package/dist/llm/index.js +5 -5
- package/dist/llm/index.js.map +1 -1
- package/dist/metrics/d1.d.ts +4 -1
- package/dist/metrics/d1.d.ts.map +1 -1
- package/dist/metrics/d1.js +3 -0
- package/dist/metrics/d1.js.map +1 -1
- package/dist/metrics/index.d.ts +5 -0
- package/dist/metrics/index.d.ts.map +1 -1
- package/dist/metrics/index.js +8 -1
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/libsql.d.ts +4 -1
- package/dist/metrics/libsql.d.ts.map +1 -1
- package/dist/metrics/libsql.js +3 -0
- package/dist/metrics/libsql.js.map +1 -1
- package/dist/metrics/report.d.ts +13 -0
- package/dist/metrics/report.d.ts.map +1 -1
- package/dist/metrics/report.js.map +1 -1
- package/dist/metrics/sqlite.d.ts +15 -1
- package/dist/metrics/sqlite.d.ts.map +1 -1
- package/dist/metrics/sqlite.js +70 -2
- package/dist/metrics/sqlite.js.map +1 -1
- package/dist/runtime.d.ts +0 -4
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +0 -17
- package/dist/runtime.js.map +1 -1
- package/dist/tg-html/index.d.ts +11 -4
- package/dist/tg-html/index.d.ts.map +1 -1
- package/dist/tg-html/index.js +13 -8
- package/dist/tg-html/index.js.map +1 -1
- package/dist/tg-md/index.d.ts +6 -6
- package/dist/tg-md/index.d.ts.map +1 -1
- package/dist/tg-md/index.js +9 -19
- package/dist/tg-md/index.js.map +1 -1
- package/dist/universal/time.d.ts +11 -2
- package/dist/universal/time.d.ts.map +1 -1
- package/dist/universal/time.js +22 -2
- package/dist/universal/time.js.map +1 -1
- package/package.json +9 -15
- package/dist/bot/index.d.ts +0 -31
- package/dist/bot/index.d.ts.map +0 -1
- package/dist/bot/index.js +0 -31
- package/dist/bot/index.js.map +0 -1
- package/dist/universal/currency/download-crypto-list.d.ts +0 -10
- package/dist/universal/currency/download-crypto-list.d.ts.map +0 -1
- package/dist/universal/currency/download-crypto-list.js +0 -69
- package/dist/universal/currency/download-crypto-list.js.map +0 -1
- package/dist/universal/url/update-rules.d.ts +0 -15
- package/dist/universal/url/update-rules.d.ts.map +0 -1
- package/dist/universal/url/update-rules.js +0 -122
- package/dist/universal/url/update-rules.js.map +0 -1
package/dist/tg-md/index.js
CHANGED
|
@@ -25,8 +25,11 @@
|
|
|
25
25
|
*
|
|
26
26
|
* Typography (heading air, bullet glyph, the title underline) IS the opinion;
|
|
27
27
|
* it becomes configurable when a second consumer needs a different look, not
|
|
28
|
-
* before. Zero deps, worker-safe
|
|
28
|
+
* before. Zero external deps, worker-safe; the HTML escaping comes from
|
|
29
|
+
* `tg-html`, which owns the same output dialect.
|
|
29
30
|
*/
|
|
31
|
+
import { escapeAttr, escapeHtml } from "../tg-html/index.js";
|
|
32
|
+
export { escapeHtml };
|
|
30
33
|
/** Unwrap a leading/trailing ```…``` code fence (some models add one) and trim. */
|
|
31
34
|
export function tidyRichMarkdown(raw) {
|
|
32
35
|
const trimmed = raw.trim();
|
|
@@ -46,9 +49,8 @@ export function tidyRichMarkdown(raw) {
|
|
|
46
49
|
* `` `code` `` -> `<code>`; links -> `<a>`
|
|
47
50
|
* Only `*`-based emphasis is honored (never `_`), so `snake_case` survives. Every tag
|
|
48
51
|
* is balanced, so Telegram can't reject the message; unmatched markers stay literal.
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* bullets reads as a wall.
|
|
52
|
+
* Spacing follows the same contract as `tg-html`: every heading is followed by a
|
|
53
|
+
* blank line so sections breathe — a heading hugging its bullets reads as a wall.
|
|
52
54
|
*/
|
|
53
55
|
export function markdownToTelegramHtml(markdown) {
|
|
54
56
|
const lines = tidyRichMarkdown(markdown).split(/\r?\n/);
|
|
@@ -99,8 +101,8 @@ export function markdownToTelegramHtml(markdown) {
|
|
|
99
101
|
if (heading) {
|
|
100
102
|
const level = heading[1].length;
|
|
101
103
|
const text = inlineMd(heading[2]);
|
|
102
|
-
// ###### is the source footer: metadata, not a heading — it renders as a
|
|
103
|
-
// plain line
|
|
104
|
+
// ###### is the source footer: metadata, not a heading — it renders as a
|
|
105
|
+
// quiet plain line, never bold.
|
|
104
106
|
if (level === 1)
|
|
105
107
|
out.push(`<b><u>${text}</u></b>`, "");
|
|
106
108
|
else if (level === 6)
|
|
@@ -234,7 +236,7 @@ function insertCover(out, url) {
|
|
|
234
236
|
out.splice(at, 0, "", img, "");
|
|
235
237
|
}
|
|
236
238
|
/** Normalize rendered HTML: strip trailing whitespace, collapse blank-line runs. Blank lines
|
|
237
|
-
* around lists stay — that air is the layout
|
|
239
|
+
* around lists stay — that air is the layout; only runs of 3+ collapse. */
|
|
238
240
|
function tidyHtml(html) {
|
|
239
241
|
return html
|
|
240
242
|
.replace(/[ \t]+\n/g, "\n")
|
|
@@ -273,18 +275,6 @@ function inlineMd(text) {
|
|
|
273
275
|
s = s.replace(/\|\|([^|]+)\|\|/g, "<tg-spoiler>$1</tg-spoiler>");
|
|
274
276
|
return s.replace(new RegExp(`${STASH}(\\d+)${STASH}`, "g"), (_, i) => tokens[Number(i)]);
|
|
275
277
|
}
|
|
276
|
-
/** Escape text/code content for Telegram HTML. */
|
|
277
|
-
export function escapeHtml(s) {
|
|
278
|
-
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
279
|
-
}
|
|
280
|
-
/** Escape an href for a Telegram HTML attribute. */
|
|
281
|
-
function escapeAttr(s) {
|
|
282
|
-
return s
|
|
283
|
-
.replace(/&/g, "&")
|
|
284
|
-
.replace(/"/g, """)
|
|
285
|
-
.replace(/</g, "<")
|
|
286
|
-
.replace(/>/g, ">");
|
|
287
|
-
}
|
|
288
278
|
/**
|
|
289
279
|
* Strip Markdown to plain text: the fallback when Telegram rejects the rich message.
|
|
290
280
|
* Removes heading/bullet markers and emphasis, unwraps links to their text, but KEEPS
|
package/dist/tg-md/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tg-md/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tg-md/index.ts"],"names":[],"mappings":"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"}
|
package/dist/universal/time.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Humanized time. Three questions, three functions: how long is this
|
|
3
|
-
* duration (`span`), how long ago was
|
|
4
|
-
* duration twin `since`), how long
|
|
3
|
+
* duration (`span`, or `coarseSpan` for one unit only), how long ago was
|
|
4
|
+
* this instant (`ago` — and its raw-duration twin `since`), how long
|
|
5
|
+
* until this instant (`until`).
|
|
5
6
|
*
|
|
6
7
|
* `ago` degrades by distance instead of stacking units: fresh instants are
|
|
7
8
|
* relative ("now", "3m ago", "2h 15m ago"), older ones snap to the clock the
|
|
@@ -18,6 +19,14 @@
|
|
|
18
19
|
export type Dateish = Date | string | number | null | undefined;
|
|
19
20
|
/** Duration in ms → "45s", "47m", "1h 40m", "2d 3h". Negative clamps to "0s". */
|
|
20
21
|
export declare function span(ms: number): string;
|
|
22
|
+
/**
|
|
23
|
+
* Duration in ms → its coarsest single unit: "45s", "47min", "3h", "2d".
|
|
24
|
+
* For a line that has room for one number and no column to align it in
|
|
25
|
+
* (a notification, a list row); reach for `span` when the remainder
|
|
26
|
+
* matters. Minutes are spelled in full here because the value stands
|
|
27
|
+
* alone with no neighbouring unit to read "m" against.
|
|
28
|
+
*/
|
|
29
|
+
export declare function coarseSpan(ms: number): string;
|
|
21
30
|
/** Elapsed since an instant, as a bare duration: "47m", "1h 40m" (no "ago"). */
|
|
22
31
|
export declare function since(d: Dateish, now?: Dateish): string;
|
|
23
32
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/universal/time.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/universal/time.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAuBhE,iFAAiF;AACjF,wBAAgB,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAOvC;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQ7C;AAED,gFAAgF;AAChF,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,GAAE,OAAoB,GAAG,MAAM,CAKnE;AAED;;;;GAIG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,GAAE,OAAoB,GAAG,MAAM,CAejE;AAED,4EAA4E;AAC5E,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,GAAE,OAAoB,GAAG,MAAM,CAOnE"}
|
package/dist/universal/time.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Humanized time. Three questions, three functions: how long is this
|
|
3
|
-
* duration (`span`), how long ago was
|
|
4
|
-
* duration twin `since`), how long
|
|
3
|
+
* duration (`span`, or `coarseSpan` for one unit only), how long ago was
|
|
4
|
+
* this instant (`ago` — and its raw-duration twin `since`), how long
|
|
5
|
+
* until this instant (`until`).
|
|
5
6
|
*
|
|
6
7
|
* `ago` degrades by distance instead of stacking units: fresh instants are
|
|
7
8
|
* relative ("now", "3m ago", "2h 15m ago"), older ones snap to the clock the
|
|
@@ -46,6 +47,25 @@ export function span(ms) {
|
|
|
46
47
|
return `${Math.floor(ms / HOUR)}h ${Math.floor((ms % HOUR) / MIN)}m`;
|
|
47
48
|
return `${Math.floor(ms / DAY)}d ${Math.floor((ms % DAY) / HOUR)}h`;
|
|
48
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Duration in ms → its coarsest single unit: "45s", "47min", "3h", "2d".
|
|
52
|
+
* For a line that has room for one number and no column to align it in
|
|
53
|
+
* (a notification, a list row); reach for `span` when the remainder
|
|
54
|
+
* matters. Minutes are spelled in full here because the value stands
|
|
55
|
+
* alone with no neighbouring unit to read "m" against.
|
|
56
|
+
*/
|
|
57
|
+
export function coarseSpan(ms) {
|
|
58
|
+
const s = Math.floor(ms / 1000);
|
|
59
|
+
if (s < 60)
|
|
60
|
+
return `${s}s`;
|
|
61
|
+
const m = Math.floor(s / 60);
|
|
62
|
+
if (m < 60)
|
|
63
|
+
return `${m}min`;
|
|
64
|
+
const h = Math.floor(m / 60);
|
|
65
|
+
if (h < 24)
|
|
66
|
+
return `${h}h`;
|
|
67
|
+
return `${Math.floor(h / 24)}d`;
|
|
68
|
+
}
|
|
49
69
|
/** Elapsed since an instant, as a bare duration: "47m", "1h 40m" (no "ago"). */
|
|
50
70
|
export function since(d, now = Date.now()) {
|
|
51
71
|
const ms = toMs(d);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/universal/time.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/universal/time.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adriangalilea/utils",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.0.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",
|
|
@@ -64,10 +64,6 @@
|
|
|
64
64
|
"types": "./dist/tg-md/index.d.ts",
|
|
65
65
|
"default": "./dist/tg-md/index.js"
|
|
66
66
|
},
|
|
67
|
-
"./bot": {
|
|
68
|
-
"types": "./dist/bot/index.d.ts",
|
|
69
|
-
"default": "./dist/bot/index.js"
|
|
70
|
-
},
|
|
71
67
|
"./bot/access-control": {
|
|
72
68
|
"types": "./dist/bot/access-control.d.ts",
|
|
73
69
|
"default": "./dist/bot/access-control.js"
|
|
@@ -225,17 +221,17 @@
|
|
|
225
221
|
"dist"
|
|
226
222
|
],
|
|
227
223
|
"scripts": {
|
|
228
|
-
"build": "tsc",
|
|
229
|
-
"dev": "tsx src/index.ts",
|
|
224
|
+
"build": "rm -rf dist && tsc",
|
|
230
225
|
"test": "tsx tests/metrics-test.ts",
|
|
226
|
+
"test:all": "pnpm run test && pnpm run test:log && pnpm run test:runtime && pnpm run test:text && pnpm run test:tg-html && pnpm run test:tg-md && pnpm run test:flags && pnpm run test:groups && pnpm run test:user && pnpm run test:language-picker && pnpm run test:self-echo && pnpm run test:update-identity && pnpm run test:bot-text && pnpm run test:url && pnpm run test:bot-urls && pnpm run test:bot-updates && pnpm run test:bot-announce && pnpm run test:reactions && pnpm run test:llm-reset && pnpm run test:worker-safe",
|
|
231
227
|
"test:log": "tsx tests/log-test.ts",
|
|
232
228
|
"test:runtime": "tsx tests/runtime-test.ts",
|
|
233
229
|
"test:text": "tsx tests/text-test.ts",
|
|
234
|
-
"test:browser": "open tests/browser-test.html",
|
|
235
230
|
"example": "tsx tests/example.ts",
|
|
236
|
-
"update-crypto": "tsx
|
|
237
|
-
"update-url-rules": "tsx
|
|
231
|
+
"update-crypto": "tsx scripts/update-crypto-list.ts",
|
|
232
|
+
"update-url-rules": "tsx scripts/update-url-rules.ts",
|
|
238
233
|
"type-check": "tsc --noEmit",
|
|
234
|
+
"type-check:tests": "tsc -p tests/tsconfig.json",
|
|
239
235
|
"lint": "biome lint",
|
|
240
236
|
"format": "biome format",
|
|
241
237
|
"check": "biome check",
|
|
@@ -244,6 +240,9 @@
|
|
|
244
240
|
"prepublishOnly": "pnpm run build",
|
|
245
241
|
"test:worker-safe": "pnpm run build && tsx tests/worker-safe-test.ts",
|
|
246
242
|
"demo:bot": "tsx tests/create-demo.ts",
|
|
243
|
+
"demo:bot-integration": "tsx tests/bot-integration.ts",
|
|
244
|
+
"demo:cli": "tsx tests/cli-demo.ts",
|
|
245
|
+
"demo:live": "tsx tests/live-demo.ts",
|
|
247
246
|
"test:tg-html": "tsx tests/tg-html-test.ts",
|
|
248
247
|
"test:flags": "tsx tests/flags-test.ts",
|
|
249
248
|
"test:groups": "tsx tests/groups-test.ts",
|
|
@@ -282,7 +281,6 @@
|
|
|
282
281
|
"@types/node": "^24.3.0",
|
|
283
282
|
"ai": "^7.0.22",
|
|
284
283
|
"gramio": "^0.14.0",
|
|
285
|
-
"marked": "^15.0.11",
|
|
286
284
|
"tsx": "^4.20.4",
|
|
287
285
|
"typescript": "^5.9.2",
|
|
288
286
|
"zod": "^4.4.3"
|
|
@@ -297,7 +295,6 @@
|
|
|
297
295
|
"@openrouter/ai-sdk-provider": "^3.0.0",
|
|
298
296
|
"ai": "^7.0.0",
|
|
299
297
|
"gramio": "^0.14.0",
|
|
300
|
-
"marked": ">=12",
|
|
301
298
|
"zod": ">=3.22"
|
|
302
299
|
},
|
|
303
300
|
"peerDependenciesMeta": {
|
|
@@ -313,9 +310,6 @@
|
|
|
313
310
|
"gramio": {
|
|
314
311
|
"optional": true
|
|
315
312
|
},
|
|
316
|
-
"marked": {
|
|
317
|
-
"optional": true
|
|
318
|
-
},
|
|
319
313
|
"zod": {
|
|
320
314
|
"optional": true
|
|
321
315
|
},
|
package/dist/bot/index.d.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Telegram bot plugins for GramIO. Imported as subpaths so this module
|
|
3
|
-
* has zero footprint for consumers that don't use them.
|
|
4
|
-
*
|
|
5
|
-
* Peer deps (all optional): `gramio`, `@gramio/format`, `@gramio/storage`, `marked`.
|
|
6
|
-
*
|
|
7
|
-
* import { adminContext, gracefulStart } from '@adriangalilea/utils/bot/kit'
|
|
8
|
-
* import { accessControl } from '@adriangalilea/utils/bot/access-control'
|
|
9
|
-
* import { streamChatReply, llmHistory } from '@adriangalilea/utils/bot/llm'
|
|
10
|
-
*
|
|
11
|
-
* Or all-in-one (pulls every subpath):
|
|
12
|
-
* import { ... } from '@adriangalilea/utils/bot'
|
|
13
|
-
*/
|
|
14
|
-
export * from "./access-control.js";
|
|
15
|
-
export * from "./admin.js";
|
|
16
|
-
export * from "./callbacks.js";
|
|
17
|
-
export * from "./coalesce.js";
|
|
18
|
-
export * from "./ctx.js";
|
|
19
|
-
export * from "./draft.js";
|
|
20
|
-
export * from "./groups.js";
|
|
21
|
-
export * from "./inline-feedback.js";
|
|
22
|
-
export * from "./keys.js";
|
|
23
|
-
export * from "./kit.js";
|
|
24
|
-
export * from "./language.js";
|
|
25
|
-
export * from "./llm.js";
|
|
26
|
-
export * from "./menu.js";
|
|
27
|
-
export * from "./notify.js";
|
|
28
|
-
export * from "./payments/index.js";
|
|
29
|
-
export * from "./storage.js";
|
|
30
|
-
export * from "./user.js";
|
|
31
|
-
//# sourceMappingURL=index.d.ts.map
|
package/dist/bot/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bot/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
|
package/dist/bot/index.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Telegram bot plugins for GramIO. Imported as subpaths so this module
|
|
3
|
-
* has zero footprint for consumers that don't use them.
|
|
4
|
-
*
|
|
5
|
-
* Peer deps (all optional): `gramio`, `@gramio/format`, `@gramio/storage`, `marked`.
|
|
6
|
-
*
|
|
7
|
-
* import { adminContext, gracefulStart } from '@adriangalilea/utils/bot/kit'
|
|
8
|
-
* import { accessControl } from '@adriangalilea/utils/bot/access-control'
|
|
9
|
-
* import { streamChatReply, llmHistory } from '@adriangalilea/utils/bot/llm'
|
|
10
|
-
*
|
|
11
|
-
* Or all-in-one (pulls every subpath):
|
|
12
|
-
* import { ... } from '@adriangalilea/utils/bot'
|
|
13
|
-
*/
|
|
14
|
-
export * from "./access-control.js";
|
|
15
|
-
export * from "./admin.js";
|
|
16
|
-
export * from "./callbacks.js";
|
|
17
|
-
export * from "./coalesce.js";
|
|
18
|
-
export * from "./ctx.js";
|
|
19
|
-
export * from "./draft.js";
|
|
20
|
-
export * from "./groups.js";
|
|
21
|
-
export * from "./inline-feedback.js";
|
|
22
|
-
export * from "./keys.js";
|
|
23
|
-
export * from "./kit.js";
|
|
24
|
-
export * from "./language.js";
|
|
25
|
-
export * from "./llm.js";
|
|
26
|
-
export * from "./menu.js";
|
|
27
|
-
export * from "./notify.js";
|
|
28
|
-
export * from "./payments/index.js";
|
|
29
|
-
export * from "./storage.js";
|
|
30
|
-
export * from "./user.js";
|
|
31
|
-
//# sourceMappingURL=index.js.map
|
package/dist/bot/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bot/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
/**
|
|
3
|
-
* Downloads the latest cryptocurrency symbols from CoinGecko API
|
|
4
|
-
* and generates a TypeScript data file with all symbols.
|
|
5
|
-
*
|
|
6
|
-
* Usage: tsx src/currency/download-crypto-list.ts
|
|
7
|
-
*/
|
|
8
|
-
declare function downloadCryptoSymbols(): Promise<void>;
|
|
9
|
-
export { downloadCryptoSymbols };
|
|
10
|
-
//# sourceMappingURL=download-crypto-list.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"download-crypto-list.d.ts","sourceRoot":"","sources":["../../../src/universal/currency/download-crypto-list.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AASH,iBAAe,qBAAqB,kBA8DnC;AAOD,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
/**
|
|
3
|
-
* Downloads the latest cryptocurrency symbols from CoinGecko API
|
|
4
|
-
* and generates a TypeScript data file with all symbols.
|
|
5
|
-
*
|
|
6
|
-
* Usage: tsx src/currency/download-crypto-list.ts
|
|
7
|
-
*/
|
|
8
|
-
import { writeFileSync } from "node:fs";
|
|
9
|
-
import { dirname, join } from "node:path";
|
|
10
|
-
import { fileURLToPath } from "node:url";
|
|
11
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
-
const __dirname = dirname(__filename);
|
|
13
|
-
async function downloadCryptoSymbols() {
|
|
14
|
-
console.log("Fetching cryptocurrency list from CoinGecko...");
|
|
15
|
-
try {
|
|
16
|
-
const response = await fetch("https://api.coingecko.com/api/v3/coins/list");
|
|
17
|
-
if (!response.ok) {
|
|
18
|
-
throw new Error(`HTTP error! status: ${response.status}`);
|
|
19
|
-
}
|
|
20
|
-
const coins = (await response.json());
|
|
21
|
-
// Exclude list for problematic/invalid symbols
|
|
22
|
-
const excludeSymbols = new Set([
|
|
23
|
-
"", // Empty string
|
|
24
|
-
"!", // Just exclamation mark
|
|
25
|
-
'" "', // Quotes with full-width space
|
|
26
|
-
" ", // Just full-width space
|
|
27
|
-
]);
|
|
28
|
-
// Extract and uppercase all symbols, remove duplicates and excluded ones
|
|
29
|
-
const symbols = [...new Set(coins.map((coin) => coin.symbol.toUpperCase()))]
|
|
30
|
-
.filter((symbol) => !excludeSymbols.has(symbol))
|
|
31
|
-
.sort();
|
|
32
|
-
const now = new Date().toISOString();
|
|
33
|
-
// Generate TypeScript file content
|
|
34
|
-
const tsContent = `/**
|
|
35
|
-
* Generated on ${now}
|
|
36
|
-
* ${symbols.length.toLocaleString()} cryptocurrency symbols from CoinGecko API
|
|
37
|
-
*
|
|
38
|
-
* Run 'npm run update-crypto' to refresh this list
|
|
39
|
-
*/
|
|
40
|
-
|
|
41
|
-
export const cryptoSymbolsData: readonly string[] = [
|
|
42
|
-
${symbols.map((s) => ` ${JSON.stringify(s)}`).join(",\n")}
|
|
43
|
-
]
|
|
44
|
-
|
|
45
|
-
export const lastUpdated = "${now}"
|
|
46
|
-
export const symbolCount = ${symbols.length}
|
|
47
|
-
`;
|
|
48
|
-
// Write to file
|
|
49
|
-
const outputPath = join(__dirname, "crypto-symbols-data.ts");
|
|
50
|
-
writeFileSync(outputPath, tsContent, "utf-8");
|
|
51
|
-
console.log(`✅ Generated ${outputPath}`);
|
|
52
|
-
console.log(` ${symbols.length.toLocaleString()} symbols`);
|
|
53
|
-
console.log(` Last updated: ${now}`);
|
|
54
|
-
// Also write a simple text file for reference (optional)
|
|
55
|
-
const textPath = join(__dirname, `crypto-symbols-${now.split("T")[0]}.txt`);
|
|
56
|
-
writeFileSync(textPath, symbols.join("\n"), "utf-8");
|
|
57
|
-
console.log(`📄 Also saved text backup to ${textPath}`);
|
|
58
|
-
}
|
|
59
|
-
catch (error) {
|
|
60
|
-
console.error("❌ Error downloading crypto symbols:", error);
|
|
61
|
-
process.exit(1);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
// Run if executed directly
|
|
65
|
-
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
66
|
-
downloadCryptoSymbols();
|
|
67
|
-
}
|
|
68
|
-
export { downloadCryptoSymbols };
|
|
69
|
-
//# sourceMappingURL=download-crypto-list.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"download-crypto-list.js","sourceRoot":"","sources":["../../../src/universal/currency/download-crypto-list.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
/**
|
|
3
|
-
* Vendors the tracking-parameter ruleset from @protontech/tidy-url (Proton's
|
|
4
|
-
* maintained fork of DrKain/tidy-url, MIT) into ./tidy-rules.ts. Same pattern
|
|
5
|
-
* as currency's download-crypto-list.ts: dataset knowledge is community-
|
|
6
|
-
* maintained upstream; we vendor a snapshot instead of taking a runtime dep.
|
|
7
|
-
*
|
|
8
|
-
* Only the param-stripping fields are carried over (name, match, match_href,
|
|
9
|
-
* rules, allow, exclude). Upstream's redirect-unwrapping, AMP, and base64-
|
|
10
|
-
* decode features are out of scope — providers that ONLY do those are dropped.
|
|
11
|
-
*
|
|
12
|
-
* Usage: pnpm update-url-rules
|
|
13
|
-
*/
|
|
14
|
-
export {};
|
|
15
|
-
//# sourceMappingURL=update-rules.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"update-rules.d.ts","sourceRoot":"","sources":["../../../src/universal/url/update-rules.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG"}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env tsx
|
|
2
|
-
/**
|
|
3
|
-
* Vendors the tracking-parameter ruleset from @protontech/tidy-url (Proton's
|
|
4
|
-
* maintained fork of DrKain/tidy-url, MIT) into ./tidy-rules.ts. Same pattern
|
|
5
|
-
* as currency's download-crypto-list.ts: dataset knowledge is community-
|
|
6
|
-
* maintained upstream; we vendor a snapshot instead of taking a runtime dep.
|
|
7
|
-
*
|
|
8
|
-
* Only the param-stripping fields are carried over (name, match, match_href,
|
|
9
|
-
* rules, allow, exclude). Upstream's redirect-unwrapping, AMP, and base64-
|
|
10
|
-
* decode features are out of scope — providers that ONLY do those are dropped.
|
|
11
|
-
*
|
|
12
|
-
* Usage: pnpm update-url-rules
|
|
13
|
-
*/
|
|
14
|
-
import { execSync } from "node:child_process";
|
|
15
|
-
import { mkdtempSync, readFileSync, writeFileSync } from "node:fs";
|
|
16
|
-
import { createRequire } from "node:module";
|
|
17
|
-
import { tmpdir } from "node:os";
|
|
18
|
-
import { dirname, join } from "node:path";
|
|
19
|
-
import { fileURLToPath } from "node:url";
|
|
20
|
-
const OUT = join(dirname(fileURLToPath(import.meta.url)), "tidy-rules.ts");
|
|
21
|
-
const PACKAGE = "@protontech/tidy-url";
|
|
22
|
-
function fetchUpstream() {
|
|
23
|
-
const dir = mkdtempSync(join(tmpdir(), "tidy-url-"));
|
|
24
|
-
console.log(`Packing ${PACKAGE}@latest ...`);
|
|
25
|
-
const tarball = execSync(`npm pack ${PACKAGE}@latest --pack-destination ${JSON.stringify(dir)}`, {
|
|
26
|
-
encoding: "utf8",
|
|
27
|
-
})
|
|
28
|
-
.trim()
|
|
29
|
-
.split("\n")
|
|
30
|
-
.at(-1);
|
|
31
|
-
if (!tarball)
|
|
32
|
-
throw new Error("npm pack produced no tarball name");
|
|
33
|
-
execSync(`tar xzf ${JSON.stringify(join(dir, tarball))} -C ${JSON.stringify(dir)}`);
|
|
34
|
-
const pkg = JSON.parse(readFileSync(join(dir, "package/package.json"), "utf8"));
|
|
35
|
-
// data/rules.js is CommonJS (`module.exports = [...]`) with RegExp literals;
|
|
36
|
-
// requiring it yields real RegExp objects — no parsing of our own.
|
|
37
|
-
const rules = createRequire(import.meta.url)(join(dir, "package/data/rules.js"));
|
|
38
|
-
const copyright = readFileSync(join(dir, "package/LICENSE"), "utf8")
|
|
39
|
-
.split("\n")
|
|
40
|
-
.find((l) => l.startsWith("Copyright"));
|
|
41
|
-
if (!Array.isArray(rules) || rules.length === 0)
|
|
42
|
-
throw new Error("upstream rules did not load");
|
|
43
|
-
if (pkg.license !== "MIT")
|
|
44
|
-
throw new Error(`upstream license changed to ${pkg.license} — review before vendoring`);
|
|
45
|
-
return {
|
|
46
|
-
rules,
|
|
47
|
-
version: pkg.version,
|
|
48
|
-
license: `${pkg.license} — ${copyright ?? ""}`.trim(),
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
/** A regex serialized for the generated file; `g`/`y` are dropped (statefulness). */
|
|
52
|
-
function serializeRegex(re) {
|
|
53
|
-
return { match: re.source, flags: re.flags.replace(/[gy]/g, "") };
|
|
54
|
-
}
|
|
55
|
-
function assertStrings(list, where) {
|
|
56
|
-
for (const item of list) {
|
|
57
|
-
if (typeof item !== "string")
|
|
58
|
-
throw new Error(`non-string entry in ${where}: ${JSON.stringify(item)}`);
|
|
59
|
-
}
|
|
60
|
-
return list;
|
|
61
|
-
}
|
|
62
|
-
function generate() {
|
|
63
|
-
const { rules, version, license } = fetchUpstream();
|
|
64
|
-
const kept = rules
|
|
65
|
-
.filter((r) => (r.rules?.length ?? 0) > 0 || (r.allow?.length ?? 0) > 0)
|
|
66
|
-
.map((r) => {
|
|
67
|
-
if (typeof r.name !== "string" || !(r.match instanceof RegExp)) {
|
|
68
|
-
throw new Error(`malformed provider: ${JSON.stringify(r.name)}`);
|
|
69
|
-
}
|
|
70
|
-
return {
|
|
71
|
-
name: r.name,
|
|
72
|
-
...serializeRegex(r.match),
|
|
73
|
-
...(r.match_href === true ? { matchHref: true } : {}),
|
|
74
|
-
rules: assertStrings(r.rules ?? [], r.name),
|
|
75
|
-
...(r.allow?.length
|
|
76
|
-
? { allow: assertStrings(r.allow, `${r.name}.allow`) }
|
|
77
|
-
: {}),
|
|
78
|
-
...(r.exclude?.length
|
|
79
|
-
? { exclude: r.exclude.map(serializeRegex) }
|
|
80
|
-
: {}),
|
|
81
|
-
};
|
|
82
|
-
});
|
|
83
|
-
const dropped = rules.length - kept.length;
|
|
84
|
-
const body = kept.map((p) => `\t${JSON.stringify(p)},`).join("\n");
|
|
85
|
-
const file = `// GENERATED FILE — do not edit; refresh with \`pnpm update-url-rules\`.
|
|
86
|
-
//
|
|
87
|
-
// Tracking-parameter ruleset vendored from ${PACKAGE}@${version} (data/rules.js),
|
|
88
|
-
// Proton's maintained fork of https://github.com/DrKain/tidy-url.
|
|
89
|
-
// Upstream license: ${license}
|
|
90
|
-
//
|
|
91
|
-
// Carried fields: the host matcher (match/flags; tested against the URL host,
|
|
92
|
-
// or the full href when matchHref), the param names to strip (rules), params
|
|
93
|
-
// protected from any rule (allow), and URL patterns that opt a URL out of the
|
|
94
|
-
// provider (exclude). Upstream's redirect/AMP/decode features are out of scope;
|
|
95
|
-
// ${dropped} providers that only did those were dropped (${kept.length} kept).
|
|
96
|
-
// Generated ${new Date().toISOString().slice(0, 10)}.
|
|
97
|
-
|
|
98
|
-
export interface TrackingProvider {
|
|
99
|
-
name: string;
|
|
100
|
-
/** Host-matcher regex source; tested against the URL host (href when matchHref). */
|
|
101
|
-
match: string;
|
|
102
|
-
flags: string;
|
|
103
|
-
matchHref?: boolean;
|
|
104
|
-
/** Param names to strip (compared lowercased). */
|
|
105
|
-
rules: readonly string[];
|
|
106
|
-
/** Param names protected from ANY rule on this provider's URLs. */
|
|
107
|
-
allow?: readonly string[];
|
|
108
|
-
/** URL patterns that opt a URL out of this provider entirely. */
|
|
109
|
-
exclude?: readonly { match: string; flags: string }[];
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export const TIDY_VERSION = ${JSON.stringify(version)};
|
|
113
|
-
|
|
114
|
-
export const TIDY_RULES: readonly TrackingProvider[] = [
|
|
115
|
-
${body}
|
|
116
|
-
];
|
|
117
|
-
`;
|
|
118
|
-
writeFileSync(OUT, file);
|
|
119
|
-
console.log(`Wrote ${kept.length} providers (${dropped} dropped) from ${PACKAGE}@${version} → ${OUT}`);
|
|
120
|
-
}
|
|
121
|
-
generate();
|
|
122
|
-
//# sourceMappingURL=update-rules.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"update-rules.js","sourceRoot":"","sources":["../../../src/universal/url/update-rules.ts"],"names":[],"mappings":"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"}
|