@adriangalilea/utils 0.20.0 → 0.22.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 CHANGED
@@ -103,6 +103,73 @@ format.percentage(0.05) // "0.05%"
103
103
  format.percentage(123.456) // "123%"
104
104
  ```
105
105
 
106
+ ### CLI presentation (`cli`)
107
+
108
+ Terminal output: aligned tables, key/value blocks, trees, and a semantic color
109
+ palette. Distinct from `format` (universal value formatting) — this is
110
+ terminal-scoped. Colors come from the logger and auto-disable on non-TTY /
111
+ `NO_COLOR`, and alignment is **ANSI-aware** (padding uses visible width), so a
112
+ `table()` renders colored in a terminal and as plain aligned text in a pipe, log
113
+ file, or a bot's monospace block.
114
+
115
+ ```typescript
116
+ import { table, kv, tree, indent, clip, ui } from '@adriangalilea/utils/cli'
117
+
118
+ // Semantic palette — use these, not raw colors, so intent stays consistent
119
+ ui.head('Name') ui.accent('id') ui.muted('note')
120
+ ui.ok('done') ui.warn('!') ui.bad('err') ui.ref('#abc123')
121
+
122
+ // Aligned columns (auto width; per-column align; optional bolded header).
123
+ // Cells may be pre-colored — widths use visible length so they still line up.
124
+ table(
125
+ [['Ada', ui.accent('ada@x.com'), ui.ref('42')],
126
+ ['Bo', ui.accent('bo@y.com'), ui.ref('7')]],
127
+ { head: ['name', 'email', 'msgs'], align: ['l', 'l', 'r'] },
128
+ )
129
+
130
+ // Key/value block (aligned keys) — for a detail view
131
+ kv([['name', 'Ada'], ['email', 'ada@x.com']], { indent: 2 })
132
+
133
+ // Nesting
134
+ tree('Ada', ['email: ada@x.com', 'phone: +1…']) // labeled node + children
135
+ indent(block, 4) // indent every line
136
+ clip('a very long value', 10) // "a very lo…" (ANSI-aware — styled input stays styled)
137
+ ```
138
+
139
+ Run the demo: `FORCE_COLOR=1 pnpm tsx tests/cli-demo.ts`.
140
+
141
+ ### Live output (`cli`) — pinned region, spinner, progress
142
+
143
+ A pinned, self-repainting region at the bottom of the terminal for progress UIs. You own the state; the region is a `render: () => string` repainted on a timer — a frame is just a string, so `table()` / `kv()` / `ui` and the widgets (`spin()`, `bar()`, `elapsed()`) compose inside it unchanged.
144
+
145
+ ```typescript
146
+ import { live, spinner, spin, bar, elapsed, table, ui } from '@adriangalilea/utils/cli'
147
+
148
+ // The one-liner: animated while fn runs, persists "✓ label 1.2s" when done
149
+ await spinner('connecting to imap.gmail.com', () => adapter.connect())
150
+
151
+ // The general region: declarative multi-line progress
152
+ const region = live(() => table(accounts.map(a => [
153
+ a.done === a.total ? ui.ok('✓') : spin(),
154
+ a.alias,
155
+ bar(a.done, a.total, 18),
156
+ ui.muted(`${a.rate}/s`),
157
+ ])))
158
+ // ...mutate your state; it repaints ~12.5fps (region.refresh() for instant)
159
+ region.done() // final frame persists into scrollback (or .clear() to remove)
160
+ ```
161
+
162
+ What makes it hold up:
163
+
164
+ - **Logging never tears the UI, with no API to learn.** While a region is active, `console.log/warn/error` — and therefore the logger — are rerouted to print *above* the region (erase → write → repaint). Keep logging from anywhere, including third-party code.
165
+ - **Non-TTY degrades to sane output.** In a pipe / CI / log file nothing animates: `done()` prints the final frame once, `spinner()` prints just its `✓ label 1.2s` line. Same calling code. Opt-in `heartbeat: ms` prints plain snapshots so long CI runs aren't silent.
166
+ - **Renders to stderr by default** — stdout stays clean for `--json` and pipes.
167
+ - **Crash-safe cursor**: hidden while painting, restored on done/clear, process exit, and signals — politely (if the app has its own SIGINT handler for graceful shutdown, it stays in charge).
168
+ - **Flicker-free**: synchronized-update escapes (`?2026`) make repaints atomic on modern terminals; lines are ANSI-aware clipped to the terminal width so the erase math never breaks.
169
+ - One region at a time, by design (`assert`): two pinned regions can't share the bottom of one screen — compose into a single `render()`.
170
+
171
+ Run the demo: `pnpm tsx tests/live-demo.ts` (and pipe it through `| cat` to see the non-TTY degradation).
172
+
106
173
  ### Offensive Programming
107
174
 
108
175
  Fail loud, fail fast. Zero dependencies, works in Node, Deno, Bun, and browsers.
@@ -191,6 +258,7 @@ Every `SourcedError` carries `source`, `operation`, `status`, `context`, and the
191
258
  - Percentage and basis point utilities
192
259
  - Fiat and stablecoin detection
193
260
  - **Format**: Number and currency formatting with compact notation
261
+ - **CLI**: ANSI-aware tables/kv/trees + semantic palette, and live output — pinned self-repainting region, spinner, progress bar, with logs flowing above and clean non-TTY degradation
194
262
  - **Offensive Programming**: assert, panic, assertNever, must, unwrap (throw `Panic`) + SourcedError for typed boundary failures
195
263
  - **File Operations**: Read, write with automatic path resolution
196
264
  - **Directory Operations**: Create, list, walk directories
@@ -286,16 +354,12 @@ pnpm add @adriangalilea/utils gramio @gramio/storage @gramio/session
286
354
 
287
355
  #### Threaded Mode — pin the `@gramio/contexts` fork
288
356
 
289
- Telegram added [Threaded Mode](https://telegram.org/blog/threaded-conversations) for private chats (BotFather → Bot Settings → Threaded Mode). gramio's `SendMixin` skips auto-threading there, and `CallbackQueryContext` doesn't expose `threadId` at all. Fixes [PR'd upstream](https://github.com/gramiojs/contexts/pull/4); until merged, pin the fork in **your bot project's** `package.json` (pnpm only honors overrides at the workspace root, not transitively):
357
+ Telegram added [Threaded Mode](https://telegram.org/blog/threaded-conversations) for private chats (BotFather → Bot Settings → Threaded Mode). gramio's `SendMixin` skips auto-threading there, and `CallbackQueryContext` doesn't expose `threadId` at all. Fixes [PR'd upstream](https://github.com/gramiojs/contexts/pull/4); until merged, pin the fork in **your bot project's** workspace root (pnpm only honors overrides at the root, not transitively — and pnpm ≥11 reads them from `pnpm-workspace.yaml`, not `package.json`):
290
358
 
291
- ```json
292
- {
293
- "pnpm": {
294
- "overrides": {
295
- "@gramio/contexts": "github:adriangalilea/contexts#local-build/auto-thread-private-chat-threaded-mode"
296
- }
297
- }
298
- }
359
+ ```yaml
360
+ # pnpm-workspace.yaml
361
+ overrides:
362
+ "@gramio/contexts": "github:adriangalilea/contexts#local-build/auto-thread-private-chat-threaded-mode"
299
363
  ```
300
364
 
301
365
  Then `pnpm install`. Every `ctx.send` / `ctx.sendDocument` / `ctx.reply` / etc. — including from callback handlers — will auto-forward `message_thread_id` and stay in the thread the message came from. If you don't use Threaded Mode, skip this.
@@ -0,0 +1,52 @@
1
+ /**
2
+ * `cli` — terminal presentation: aligned tables, key/value blocks, trees, a
3
+ * semantic palette, and live output (pinned region, spinner, progress bar).
4
+ * Separate from `format` (which is universal value formatting, for every
5
+ * layer) — this is terminal-scoped output.
6
+ *
7
+ * Colors come from `universal/log` and auto-disable on non-TTY / NO_COLOR, so a
8
+ * `table()` renders colored in a terminal and as plain aligned text in a pipe,
9
+ * log file, or a bot's monospace block — correct everywhere.
10
+ *
11
+ * Alignment is ANSI-aware: padding is computed on the *visible* width (escape
12
+ * codes stripped), so colored cells line up.
13
+ *
14
+ * @example
15
+ * import { table, kv, ui, indent } from '@adriangalilea/utils/cli'
16
+ *
17
+ * console.log(table(
18
+ * [['Ada', ui.accent('ada@x.com'), ui.muted('work')],
19
+ * ['Bo', ui.accent('bo@y.com'), ui.muted('home')]],
20
+ * { head: ['name', 'email', 'label'] },
21
+ * ))
22
+ */
23
+ export * from "./live.js";
24
+ export { clip, ui, width } from "./text.js";
25
+ export interface TableOpts {
26
+ /** Column headers (bolded). */
27
+ head?: string[];
28
+ /** Per-column alignment; default all left. */
29
+ align?: ("l" | "r")[];
30
+ /** Spaces between columns (default 2). */
31
+ gap?: number;
32
+ /** Left indent for the whole table (default 0). */
33
+ indent?: number;
34
+ }
35
+ /**
36
+ * Render rows as aligned columns. Cells may be pre-colored — widths use visible
37
+ * length so colored columns still line up. The last left-aligned column isn't
38
+ * right-padded (no trailing whitespace).
39
+ */
40
+ export declare function table(rows: string[][], opts?: TableOpts): string;
41
+ /** Key/value block (aligned keys), e.g. for a detail view. */
42
+ export declare function kv(pairs: [string, string][], opts?: {
43
+ indent?: number;
44
+ gap?: number;
45
+ }): string;
46
+ /** Indent every line of a (possibly multi-line) string by `n` spaces. */
47
+ export declare const indent: (s: string, n: number) => string;
48
+ /** A labeled node with child lines drawn under it. */
49
+ export declare function tree(label: string, children: string[], opts?: {
50
+ indent?: number;
51
+ }): string;
52
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,WAAW,SAAS;IACzB,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;IACtB,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,GAAE,SAAc,GAAG,MAAM,CAwBpE;AAED,8DAA8D;AAC9D,wBAAgB,EAAE,CACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EACzB,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1C,MAAM,CAOR;AAED,yEAAyE;AACzE,eAAO,MAAM,MAAM,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,MAIjC,CAAC;AAEd,sDAAsD;AACtD,wBAAgB,IAAI,CACnB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAAE,EAClB,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5B,MAAM,CAGR"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * `cli` — terminal presentation: aligned tables, key/value blocks, trees, a
3
+ * semantic palette, and live output (pinned region, spinner, progress bar).
4
+ * Separate from `format` (which is universal value formatting, for every
5
+ * layer) — this is terminal-scoped output.
6
+ *
7
+ * Colors come from `universal/log` and auto-disable on non-TTY / NO_COLOR, so a
8
+ * `table()` renders colored in a terminal and as plain aligned text in a pipe,
9
+ * log file, or a bot's monospace block — correct everywhere.
10
+ *
11
+ * Alignment is ANSI-aware: padding is computed on the *visible* width (escape
12
+ * codes stripped), so colored cells line up.
13
+ *
14
+ * @example
15
+ * import { table, kv, ui, indent } from '@adriangalilea/utils/cli'
16
+ *
17
+ * console.log(table(
18
+ * [['Ada', ui.accent('ada@x.com'), ui.muted('work')],
19
+ * ['Bo', ui.accent('bo@y.com'), ui.muted('home')]],
20
+ * { head: ['name', 'email', 'label'] },
21
+ * ))
22
+ */
23
+ import { padEndV, padStartV, ui, width } from "./text.js";
24
+ export * from "./live.js";
25
+ export { clip, ui, width } from "./text.js";
26
+ /**
27
+ * Render rows as aligned columns. Cells may be pre-colored — widths use visible
28
+ * length so colored columns still line up. The last left-aligned column isn't
29
+ * right-padded (no trailing whitespace).
30
+ */
31
+ export function table(rows, opts = {}) {
32
+ const gap = " ".repeat(opts.gap ?? 2);
33
+ const lead = " ".repeat(opts.indent ?? 0);
34
+ const body = opts.head ? [opts.head, ...rows] : rows;
35
+ const cols = Math.max(0, ...body.map((r) => r.length));
36
+ const w = Array.from({ length: cols }, (_, c) => Math.max(0, ...body.map((r) => width(r[c] ?? ""))));
37
+ const line = (r) => {
38
+ const cells = Array.from({ length: cols }, (_, c) => {
39
+ const cell = r[c] ?? "";
40
+ const isLast = c === cols - 1;
41
+ const right = opts.align?.[c] === "r";
42
+ if (right)
43
+ return padStartV(cell, w[c]);
44
+ return isLast ? cell : padEndV(cell, w[c]);
45
+ });
46
+ return lead + cells.join(gap).replace(/\s+$/, "");
47
+ };
48
+ const out = [];
49
+ if (opts.head)
50
+ out.push(line(opts.head.map((h) => ui.head(h))));
51
+ for (const r of rows)
52
+ out.push(line(r));
53
+ return out.join("\n");
54
+ }
55
+ /** Key/value block (aligned keys), e.g. for a detail view. */
56
+ export function kv(pairs, opts = {}) {
57
+ const lead = " ".repeat(opts.indent ?? 0);
58
+ const gap = " ".repeat(opts.gap ?? 2);
59
+ const w = Math.max(0, ...pairs.map(([k]) => width(k)));
60
+ return pairs
61
+ .map(([k, v]) => `${lead}${ui.muted(padEndV(k, w))}${gap}${v}`)
62
+ .join("\n");
63
+ }
64
+ /** Indent every line of a (possibly multi-line) string by `n` spaces. */
65
+ export const indent = (s, n) => s
66
+ .split("\n")
67
+ .map((l) => " ".repeat(n) + l)
68
+ .join("\n");
69
+ /** A labeled node with child lines drawn under it. */
70
+ export function tree(label, children, opts = {}) {
71
+ const lead = " ".repeat(opts.indent ?? 0);
72
+ return [lead + label, ...children.map((c) => `${lead} ${c}`)].join("\n");
73
+ }
74
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * `live` — a pinned, self-repainting terminal region, the pure widgets that
3
+ * animate inside it (`spin` / `bar` / `elapsed`), and the `spinner()` one-liner.
4
+ *
5
+ * The model: you own the state, the region owns the screen. A region is a
6
+ * `render: () => string` repainted on a timer (plus `refresh()` for instant
7
+ * updates). A frame is just a string — `table()` / `kv()` / `ui` compose
8
+ * inside it unchanged, and widgets are plain string functions.
9
+ *
10
+ * The hard problem this solves is interleaving: while a region is active,
11
+ * `console.log/warn/error` — and therefore the logger, which writes through
12
+ * console — are rerouted to print ABOVE the region (erase → write → repaint).
13
+ * Logging never tears the UI, and there is no new logging API to learn.
14
+ *
15
+ * Non-TTY (pipe / CI / log file): nothing animates, nothing repaints.
16
+ * `done(final)` prints the final frame once; the opt-in `heartbeat` prints
17
+ * plain snapshots for long CI silences. Same calling code either way.
18
+ *
19
+ * Crash-safe cursor: hidden while painting, restored on done/clear, process
20
+ * exit, and fatal signals. Signals are handled politely — if the app has its
21
+ * own SIGINT handler (graceful shutdown), we restore the cursor and stay out
22
+ * of the way; if we are the only listener, default die-on-signal is preserved.
23
+ *
24
+ * Exactly one region can be active: two pinned regions can't share the bottom
25
+ * of one screen. Compose everything into a single `render()` — that's the
26
+ * point of frames being strings.
27
+ */
28
+ export interface LiveOpts {
29
+ /** Target stream. Default stderr — stdout stays clean for pipes / --json. */
30
+ stream?: NodeJS.WriteStream;
31
+ /** Repaints per second while active (default 12.5 — the spinner's cadence). */
32
+ fps?: number;
33
+ /** Non-TTY only: print a plain snapshot every N ms so long CI runs aren't silent. Default off. */
34
+ heartbeat?: number;
35
+ }
36
+ export interface Live {
37
+ /** Repaint now (state changed and 80ms is too long to wait). */
38
+ refresh(): void;
39
+ /** Swap the render function (e.g. a new phase of the same operation). */
40
+ update(render: () => string): void;
41
+ /** Stop and persist a final frame (default: the current render) into scrollback. */
42
+ done(final?: string): void;
43
+ /** Stop and remove the region entirely. */
44
+ clear(): void;
45
+ }
46
+ /**
47
+ * Start a pinned region at the bottom of the terminal, repainting
48
+ * `render()` until `done()` / `clear()`. Non-TTY → inert (see module doc).
49
+ */
50
+ export declare function live(render: () => string, opts?: LiveOpts): Live;
51
+ /** Spinner frame for "now" — call it inside `render()` and it animates. */
52
+ export declare const spin: () => string;
53
+ /**
54
+ * Progress bar, `width` cells. `done > total` clamps to full — live counters
55
+ * drift (e.g. a server-count proxy that overcounts) and that's the caller's
56
+ * data, not a bug here.
57
+ */
58
+ export declare function bar(done: number, total: number, width?: number): string;
59
+ /** Compact elapsed time since a `Date.now()` timestamp: 0.4s · 12s · 1m05s · 1h02m. */
60
+ export declare function elapsed(since: number): string;
61
+ /**
62
+ * The one-liner: animate `label` with a spinner + elapsed time while `fn`
63
+ * runs, persist `✓ label 1.2s` on success, `⨯ label 1.2s message` on failure
64
+ * (and rethrow). Non-TTY prints just the final line.
65
+ */
66
+ export declare function spinner<T>(label: string, fn: () => Promise<T>): Promise<T>;
67
+ //# sourceMappingURL=live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../src/cli/live.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAkBH,MAAM,WAAW,QAAQ;IACxB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IAC5B,+EAA+E;IAC/E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kGAAkG;IAClG,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,IAAI;IACpB,gEAAgE;IAChE,OAAO,IAAI,IAAI,CAAC;IAChB,yEAAyE;IACzE,MAAM,CAAC,MAAM,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACnC,oFAAoF;IACpF,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,2CAA2C;IAC3C,KAAK,IAAI,IAAI,CAAC;CACd;AA+JD;;;GAGG;AACH,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAEhE;AAMD,2EAA2E;AAC3E,eAAO,MAAM,IAAI,QAAO,MACsD,CAAC;AAE/E;;;;GAIG;AACH,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,CAInE;AAED,uFAAuF;AACvF,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ7C;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,CAAC,EAC9B,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAClB,OAAO,CAAC,CAAC,CAAC,CAYZ"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * `live` — a pinned, self-repainting terminal region, the pure widgets that
3
+ * animate inside it (`spin` / `bar` / `elapsed`), and the `spinner()` one-liner.
4
+ *
5
+ * The model: you own the state, the region owns the screen. A region is a
6
+ * `render: () => string` repainted on a timer (plus `refresh()` for instant
7
+ * updates). A frame is just a string — `table()` / `kv()` / `ui` compose
8
+ * inside it unchanged, and widgets are plain string functions.
9
+ *
10
+ * The hard problem this solves is interleaving: while a region is active,
11
+ * `console.log/warn/error` — and therefore the logger, which writes through
12
+ * console — are rerouted to print ABOVE the region (erase → write → repaint).
13
+ * Logging never tears the UI, and there is no new logging API to learn.
14
+ *
15
+ * Non-TTY (pipe / CI / log file): nothing animates, nothing repaints.
16
+ * `done(final)` prints the final frame once; the opt-in `heartbeat` prints
17
+ * plain snapshots for long CI silences. Same calling code either way.
18
+ *
19
+ * Crash-safe cursor: hidden while painting, restored on done/clear, process
20
+ * exit, and fatal signals. Signals are handled politely — if the app has its
21
+ * own SIGINT handler (graceful shutdown), we restore the cursor and stay out
22
+ * of the way; if we are the only listener, default die-on-signal is preserved.
23
+ *
24
+ * Exactly one region can be active: two pinned regions can't share the bottom
25
+ * of one screen. Compose everything into a single `render()` — that's the
26
+ * point of frames being strings.
27
+ */
28
+ import { assert } from "../offensive.js";
29
+ import { cyan, dim, green, red } from "../universal/log.js";
30
+ import { clip } from "./text.js";
31
+ const HIDE_CURSOR = "\x1b[?25l";
32
+ const SHOW_CURSOR = "\x1b[?25h";
33
+ // Synchronized-update markers: modern terminals (iTerm2, kitty, Ghostty,
34
+ // WezTerm, recent Terminal.app) paint the wrapped write atomically — no
35
+ // flicker on erase+rewrite. Unknown CSIs are ignored elsewhere, so this is
36
+ // free to always emit.
37
+ const SYNC_ON = "\x1b[?2026h";
38
+ const SYNC_OFF = "\x1b[?2026l";
39
+ /** Cursor to the first line of an `n`-line region + erase to end of screen. */
40
+ const wipe = (n) => (n > 0 ? `\x1b[${n}F\x1b[J` : "");
41
+ let active = null;
42
+ const SIGNALS = ["SIGINT", "SIGTERM"];
43
+ class LiveRegion {
44
+ render;
45
+ stream;
46
+ tty;
47
+ painted = 0;
48
+ stopped = false;
49
+ timer;
50
+ orig;
51
+ sigHandlers = new Map();
52
+ onExit = () => {
53
+ this.stream.write(SHOW_CURSOR);
54
+ };
55
+ constructor(render, opts = {}) {
56
+ this.render = render;
57
+ this.stream = opts.stream ?? process.stderr;
58
+ this.tty = this.stream.isTTY === true;
59
+ if (!this.tty) {
60
+ if (opts.heartbeat) {
61
+ this.timer = setInterval(() => {
62
+ this.stream.write(`${this.render()}\n`);
63
+ }, opts.heartbeat);
64
+ this.timer.unref();
65
+ }
66
+ return;
67
+ }
68
+ assert(active === null, "one live region at a time — compose into a single render()");
69
+ active = this;
70
+ this.patchConsole();
71
+ this.installGuards();
72
+ this.stream.write(HIDE_CURSOR);
73
+ this.paint();
74
+ this.timer = setInterval(() => this.paint(), 1000 / (opts.fps ?? 12.5));
75
+ this.timer.unref();
76
+ }
77
+ refresh() {
78
+ if (this.tty && !this.stopped)
79
+ this.paint();
80
+ }
81
+ update(render) {
82
+ this.render = render;
83
+ this.refresh();
84
+ }
85
+ done(final) {
86
+ assert(!this.stopped, "live region already stopped");
87
+ if (!this.tty) {
88
+ this.stopped = true;
89
+ clearInterval(this.timer);
90
+ this.stream.write(`${final ?? this.render()}\n`);
91
+ return;
92
+ }
93
+ const frame = final ?? this.render();
94
+ this.stop();
95
+ this.stream.write(`${wipe(this.painted)}${frame}\n${SHOW_CURSOR}`);
96
+ }
97
+ clear() {
98
+ assert(!this.stopped, "live region already stopped");
99
+ if (!this.tty) {
100
+ this.stopped = true;
101
+ clearInterval(this.timer);
102
+ return;
103
+ }
104
+ this.stop();
105
+ this.stream.write(wipe(this.painted) + SHOW_CURSOR);
106
+ }
107
+ // --- internals (TTY path) ---
108
+ paint() {
109
+ // `||` not `??` — a sizeless PTY (CI emulators, `script`) reports 0×0.
110
+ const cols = this.stream.columns || 80;
111
+ const rows = this.stream.rows || 24;
112
+ // Clip each line to the terminal width — a wrapped line would break the
113
+ // erase math. Clamp height to rows-1, keeping the BOTTOM of the frame
114
+ // (latest activity), so an oversized frame degrades instead of corrupting.
115
+ const lines = this.render()
116
+ .split("\n")
117
+ .map((l) => clip(l, cols - 1));
118
+ const frame = lines.length < rows ? lines : lines.slice(lines.length - (rows - 1));
119
+ this.stream.write(`${SYNC_ON}${wipe(this.painted)}${frame.join("\n")}\n${SYNC_OFF}`);
120
+ this.painted = frame.length;
121
+ }
122
+ /**
123
+ * Erase the region, run a write (a console call), repaint underneath it.
124
+ * The wipe opens a sync block; paint() re-asserts SYNC_ON (a no-op set)
125
+ * and its SYNC_OFF closes the whole erase→log→repaint atomically.
126
+ */
127
+ above(write) {
128
+ this.stream.write(SYNC_ON + wipe(this.painted));
129
+ this.painted = 0;
130
+ write();
131
+ this.paint();
132
+ }
133
+ patchConsole() {
134
+ const orig = {
135
+ log: console.log.bind(console),
136
+ warn: console.warn.bind(console),
137
+ error: console.error.bind(console),
138
+ };
139
+ this.orig = orig;
140
+ console.log = (...a) => this.above(() => orig.log(...a));
141
+ console.warn = (...a) => this.above(() => orig.warn(...a));
142
+ console.error = (...a) => this.above(() => orig.error(...a));
143
+ }
144
+ installGuards() {
145
+ process.on("exit", this.onExit);
146
+ for (const sig of SIGNALS) {
147
+ const h = () => {
148
+ this.stream.write(SHOW_CURSOR);
149
+ // Only listener (count includes us) → preserve default semantics:
150
+ // re-raise and die. Otherwise the app owns shutdown; cursor is
151
+ // restored and its handler proceeds over a still-painting region
152
+ // that its own exit path will finalize.
153
+ if (process.listenerCount(sig) === 1) {
154
+ process.removeListener(sig, h);
155
+ process.kill(process.pid, sig);
156
+ }
157
+ };
158
+ process.on(sig, h);
159
+ this.sigHandlers.set(sig, h);
160
+ }
161
+ }
162
+ stop() {
163
+ this.stopped = true;
164
+ clearInterval(this.timer);
165
+ const orig = this.orig;
166
+ assert(orig !== undefined, "stop() before patchConsole()");
167
+ console.log = orig.log;
168
+ console.warn = orig.warn;
169
+ console.error = orig.error;
170
+ process.removeListener("exit", this.onExit);
171
+ for (const [sig, h] of this.sigHandlers)
172
+ process.removeListener(sig, h);
173
+ active = null;
174
+ }
175
+ }
176
+ /**
177
+ * Start a pinned region at the bottom of the terminal, repainting
178
+ * `render()` until `done()` / `clear()`. Non-TTY → inert (see module doc).
179
+ */
180
+ export function live(render, opts) {
181
+ return new LiveRegion(render, opts);
182
+ }
183
+ // --- widgets: pure string builders, animated by being re-rendered ---
184
+ const SPIN_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
185
+ /** Spinner frame for "now" — call it inside `render()` and it animates. */
186
+ export const spin = () => cyan(SPIN_FRAMES[Math.floor(Date.now() / 80) % SPIN_FRAMES.length]);
187
+ /**
188
+ * Progress bar, `width` cells. `done > total` clamps to full — live counters
189
+ * drift (e.g. a server-count proxy that overcounts) and that's the caller's
190
+ * data, not a bug here.
191
+ */
192
+ export function bar(done, total, width = 24) {
193
+ assert(done >= 0 && total >= 0, "bar: negative counts", done, total);
194
+ const fill = Math.round(Math.min(1, total === 0 ? 1 : done / total) * width);
195
+ return green("█".repeat(fill)) + dim("░".repeat(width - fill));
196
+ }
197
+ /** Compact elapsed time since a `Date.now()` timestamp: 0.4s · 12s · 1m05s · 1h02m. */
198
+ export function elapsed(since) {
199
+ const s = (Date.now() - since) / 1000;
200
+ if (s < 10)
201
+ return `${s.toFixed(1)}s`;
202
+ const r = Math.round(s);
203
+ if (r < 60)
204
+ return `${r}s`;
205
+ const m = Math.floor(r / 60);
206
+ if (m < 60)
207
+ return `${m}m${String(r % 60).padStart(2, "0")}s`;
208
+ return `${Math.floor(m / 60)}h${String(m % 60).padStart(2, "0")}m`;
209
+ }
210
+ /**
211
+ * The one-liner: animate `label` with a spinner + elapsed time while `fn`
212
+ * runs, persist `✓ label 1.2s` on success, `⨯ label 1.2s message` on failure
213
+ * (and rethrow). Non-TTY prints just the final line.
214
+ */
215
+ export async function spinner(label, fn) {
216
+ const start = Date.now();
217
+ const l = live(() => `${spin()} ${label} ${dim(elapsed(start))}`);
218
+ try {
219
+ const v = await fn();
220
+ l.done(`${green("✓")} ${label} ${dim(elapsed(start))}`);
221
+ return v;
222
+ }
223
+ catch (e) {
224
+ const msg = e instanceof Error ? e.message : String(e);
225
+ l.done(`${red("⨯")} ${label} ${dim(elapsed(start))} ${red(msg)}`);
226
+ throw e;
227
+ }
228
+ }
229
+ //# sourceMappingURL=live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.js","sourceRoot":"","sources":["../../src/cli/live.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Shared text primitives for terminal presentation: ANSI-aware measurement,
3
+ * clipping, padding, and the semantic `ui` palette. Both the static layer
4
+ * (`cli/index` — table/kv/tree) and the live layer (`cli/live` — pinned
5
+ * region/spinner) build on these; keeping them here avoids an import cycle.
6
+ */
7
+ export declare const ANSI_RE: RegExp;
8
+ /** Visible width of a string — ANSI escape codes stripped, counted by code point. */
9
+ export declare const width: (s: string) => number;
10
+ /**
11
+ * Truncate to `n` visible chars (ellipsis at the cut), ANSI-aware: escape
12
+ * sequences pass through so styling survives, and open styles are closed
13
+ * with a final reset. Plain strings work too — this is THE truncate.
14
+ */
15
+ export declare function clip(s: string, n: number): string;
16
+ export declare const padEndV: (s: string, n: number) => string;
17
+ export declare const padStartV: (s: string, n: number) => string;
18
+ /** Semantic palette — use these, not raw colors, so intent stays consistent. */
19
+ export declare const ui: {
20
+ head: (s: string) => string;
21
+ accent: (s: string) => string;
22
+ muted: (s: string) => string;
23
+ ok: (s: string) => string;
24
+ warn: (s: string) => string;
25
+ bad: (s: string) => string;
26
+ /** ids / refs — de-emphasized monospace-ish */
27
+ ref: (s: string) => string;
28
+ };
29
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/cli/text.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,eAAO,MAAM,OAAO,QAAoB,CAAC;AAEzC,qFAAqF;AACrF,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,KAAG,MAA4C,CAAC;AAK/E;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAkBjD;AAED,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,MACL,CAAC;AAC3C,eAAO,MAAM,SAAS,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,MACP,CAAC;AAE3C,gFAAgF;AAChF,eAAO,MAAM,EAAE;cACJ,MAAM;gBACJ,MAAM;eACP,MAAM;YACT,MAAM;cACJ,MAAM;aACP,MAAM;IACf,+CAA+C;aACtC,MAAM;CACf,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Shared text primitives for terminal presentation: ANSI-aware measurement,
3
+ * clipping, padding, and the semantic `ui` palette. Both the static layer
4
+ * (`cli/index` — table/kv/tree) and the live layer (`cli/live` — pinned
5
+ * region/spinner) build on these; keeping them here avoids an import cycle.
6
+ */
7
+ import { bold, cyan, dim, gray, green, red, yellow } from "../universal/log.js";
8
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: matching ANSI escapes is the point
9
+ export const ANSI_RE = /\x1b\[[0-9;]*m/g;
10
+ /** Visible width of a string — ANSI escape codes stripped, counted by code point. */
11
+ export const width = (s) => [...s.replace(ANSI_RE, "")].length;
12
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: tokenizes into ANSI escapes + code points
13
+ const TOKEN_RE = /\x1b\[[0-9;]*m|./gsu;
14
+ /**
15
+ * Truncate to `n` visible chars (ellipsis at the cut), ANSI-aware: escape
16
+ * sequences pass through so styling survives, and open styles are closed
17
+ * with a final reset. Plain strings work too — this is THE truncate.
18
+ */
19
+ export function clip(s, n) {
20
+ if (width(s) <= n)
21
+ return s;
22
+ let out = "";
23
+ let vis = 0;
24
+ let styled = false;
25
+ for (const t of s.match(TOKEN_RE) ?? []) {
26
+ if (t.startsWith("\x1b")) {
27
+ out += t;
28
+ styled = true;
29
+ }
30
+ else if (vis < n - 1) {
31
+ out += t;
32
+ vis++;
33
+ }
34
+ else if (vis === n - 1) {
35
+ out += "…";
36
+ vis++;
37
+ }
38
+ }
39
+ return styled ? `${out}\x1b[0m` : out;
40
+ }
41
+ export const padEndV = (s, n) => s + " ".repeat(Math.max(0, n - width(s)));
42
+ export const padStartV = (s, n) => " ".repeat(Math.max(0, n - width(s))) + s;
43
+ /** Semantic palette — use these, not raw colors, so intent stays consistent. */
44
+ export const ui = {
45
+ head: (s) => bold(s),
46
+ accent: (s) => cyan(s),
47
+ muted: (s) => dim(s),
48
+ ok: (s) => green(s),
49
+ warn: (s) => yellow(s),
50
+ bad: (s) => red(s),
51
+ /** ids / refs — de-emphasized monospace-ish */
52
+ ref: (s) => gray(s),
53
+ };
54
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/cli/text.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAEhF,8FAA8F;AAC9F,MAAM,CAAC,MAAM,OAAO,GAAG,iBAAiB,CAAC;AAEzC,qFAAqF;AACrF,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AAE/E,qGAAqG;AACrG,MAAM,QAAQ,GAAG,qBAAqB,CAAC;AAEvC;;;;GAIG;AACH,MAAM,UAAU,IAAI,CAAC,CAAS,EAAE,CAAS;IACxC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC5B,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACzC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,GAAG,IAAI,CAAC,CAAC;YACT,MAAM,GAAG,IAAI,CAAC;QACf,CAAC;aAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,GAAG,IAAI,CAAC,CAAC;YACT,GAAG,EAAE,CAAC;QACP,CAAC;aAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,GAAG,IAAI,GAAG,CAAC;YACX,GAAG,EAAE,CAAC;QACP,CAAC;IACF,CAAC;IACD,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE,CACvD,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE,CACzD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAE3C,gFAAgF;AAChF,MAAM,CAAC,MAAM,EAAE,GAAG;IACjB,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9B,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,EAAE,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3B,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9B,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,+CAA+C;IAC/C,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;CAC3B,CAAC"}
@@ -3,7 +3,6 @@
3
3
  * Provides colored output with Unicode symbols for different log levels
4
4
  *
5
5
  * Known limitations:
6
- * - Global level is frozen at import time (const). No runtime setLevel().
7
6
  * - createLogger() is just a prefix wrapper, not a real scoped instance.
8
7
  * No per-scope level control (can't silence 'bor' but keep 'bdns' verbose).
9
8
  * - No withTag/child pattern — consumer can't control library log levels.
@@ -1 +1 @@
1
- {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/universal/log.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/universal/log.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,6 @@
3
3
  * Provides colored output with Unicode symbols for different log levels
4
4
  *
5
5
  * Known limitations:
6
- * - Global level is frozen at import time (const). No runtime setLevel().
7
6
  * - createLogger() is just a prefix wrapper, not a real scoped instance.
8
7
  * No per-scope level control (can't silence 'bor' but keep 'bdns' verbose).
9
8
  * - No withTag/child pattern — consumer can't control library log levels.
@@ -1 +1 @@
1
- {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/universal/log.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/universal/log.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adriangalilea/utils",
3
- "version": "0.20.0",
3
+ "version": "0.22.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",
@@ -24,6 +24,10 @@
24
24
  "types": "./dist/universal/format.d.ts",
25
25
  "default": "./dist/universal/format.js"
26
26
  },
27
+ "./cli": {
28
+ "types": "./dist/cli/index.d.ts",
29
+ "default": "./dist/cli/index.js"
30
+ },
27
31
  "./currency": {
28
32
  "types": "./dist/universal/currency/index.d.ts",
29
33
  "default": "./dist/universal/currency/index.js"
@@ -121,9 +125,6 @@
121
125
  "typescript": "^5.9.2",
122
126
  "zod": "^4.4.3"
123
127
  },
124
- "dependencies": {
125
- "chalk": "^5.6.0"
126
- },
127
128
  "peerDependencies": {
128
129
  "@gramio/format": ">=0.8.0",
129
130
  "@gramio/session": ">=0.2.0",
@@ -156,11 +157,6 @@
156
157
  "access": "public",
157
158
  "registry": "https://registry.npmjs.org/"
158
159
  },
159
- "pnpm": {
160
- "overrides": {
161
- "@gramio/contexts": "github:adriangalilea/contexts#local-build/auto-thread-private-chat-threaded-mode"
162
- }
163
- },
164
160
  "repository": {
165
161
  "type": "git",
166
162
  "url": "git+https://github.com/adriangalilea/ts-utils.git"