@adriangalilea/utils 0.21.0 → 0.23.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 +92 -9
- package/dist/cli/index.d.ts +5 -19
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +6 -24
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/live.d.ts +74 -0
- package/dist/cli/live.d.ts.map +1 -0
- package/dist/cli/live.js +243 -0
- package/dist/cli/live.js.map +1 -0
- package/dist/cli/text.d.ts +29 -0
- package/dist/cli/text.d.ts.map +1 -0
- package/dist/cli/text.js +67 -0
- package/dist/cli/text.js.map +1 -0
- package/dist/universal/log.d.ts +0 -1
- package/dist/universal/log.d.ts.map +1 -1
- package/dist/universal/log.js +0 -1
- package/dist/universal/log.js.map +1 -1
- package/package.json +2 -9
package/README.md
CHANGED
|
@@ -103,6 +103,92 @@ 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
|
+
Patterns:
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
// Relabel a spinner mid-flight — fn receives a setter
|
|
166
|
+
await spinner('connecting 0/4', async (set) => {
|
|
167
|
+
for (const [i, a] of accounts.entries()) { await a.connect(); set(`connecting ${i + 1}/4`) }
|
|
168
|
+
})
|
|
169
|
+
|
|
170
|
+
// Streaming table — rows appear as they arrive, columns re-align retroactively
|
|
171
|
+
const rows: string[][] = []
|
|
172
|
+
const region = live(() => table(rows, { head: ['day', 'author', 'title'] }))
|
|
173
|
+
for await (const e of feed) { rows.push(renderRow(e)); region.refresh() }
|
|
174
|
+
region.done() // full aligned table persists (a pipe gets exactly this, once)
|
|
175
|
+
|
|
176
|
+
// State-dependent bar color — style hook on the filled part
|
|
177
|
+
bar(done, total, 18, ui.warn) // amber: throttled/cooling
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
What makes it hold up:
|
|
181
|
+
|
|
182
|
+
- **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. Boundary: only `console.*` is patched — a library writing raw to `process.stdout.write` bypasses the routing and can tear.
|
|
183
|
+
- **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.
|
|
184
|
+
- **Renders to stderr by default** — stdout stays clean for `--json` and pipes.
|
|
185
|
+
- **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).
|
|
186
|
+
- **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.
|
|
187
|
+
- **Measurement is grapheme-aware**: a ZWJ emoji / flag counts as one visible unit in `width()`/`clip()`/`table()` alignment. East-Asian double-width (CJK) is a known TODO — those columns can drift a cell.
|
|
188
|
+
- One **region** at a time, by design (`assert`): two pinned regions can't share the bottom of one screen — compose into a single `render()`. A `spinner()` started *under* an active region is legitimate composition and degrades gracefully: its final line prints above the region.
|
|
189
|
+
|
|
190
|
+
Run the demo: `pnpm tsx tests/live-demo.ts` (and pipe it through `| cat` to see the non-TTY degradation).
|
|
191
|
+
|
|
106
192
|
### Offensive Programming
|
|
107
193
|
|
|
108
194
|
Fail loud, fail fast. Zero dependencies, works in Node, Deno, Bun, and browsers.
|
|
@@ -191,6 +277,7 @@ Every `SourcedError` carries `source`, `operation`, `status`, `context`, and the
|
|
|
191
277
|
- Percentage and basis point utilities
|
|
192
278
|
- Fiat and stablecoin detection
|
|
193
279
|
- **Format**: Number and currency formatting with compact notation
|
|
280
|
+
- **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
281
|
- **Offensive Programming**: assert, panic, assertNever, must, unwrap (throw `Panic`) + SourcedError for typed boundary failures
|
|
195
282
|
- **File Operations**: Read, write with automatic path resolution
|
|
196
283
|
- **Directory Operations**: Create, list, walk directories
|
|
@@ -286,16 +373,12 @@ pnpm add @adriangalilea/utils gramio @gramio/storage @gramio/session
|
|
|
286
373
|
|
|
287
374
|
#### Threaded Mode — pin the `@gramio/contexts` fork
|
|
288
375
|
|
|
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**
|
|
376
|
+
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
377
|
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
"@gramio/contexts": "github:adriangalilea/contexts#local-build/auto-thread-private-chat-threaded-mode"
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
}
|
|
378
|
+
```yaml
|
|
379
|
+
# pnpm-workspace.yaml
|
|
380
|
+
overrides:
|
|
381
|
+
"@gramio/contexts": "github:adriangalilea/contexts#local-build/auto-thread-private-chat-threaded-mode"
|
|
299
382
|
```
|
|
300
383
|
|
|
301
384
|
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.
|
package/dist/cli/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `cli` — terminal presentation: aligned tables, key/value blocks, trees, a
|
|
3
|
-
* semantic palette
|
|
4
|
-
*
|
|
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.
|
|
5
6
|
*
|
|
6
7
|
* Colors come from `universal/log` and auto-disable on non-TTY / NO_COLOR, so a
|
|
7
8
|
* `table()` renders colored in a terminal and as plain aligned text in a pipe,
|
|
@@ -19,21 +20,8 @@
|
|
|
19
20
|
* { head: ['name', 'email', 'label'] },
|
|
20
21
|
* ))
|
|
21
22
|
*/
|
|
22
|
-
|
|
23
|
-
export
|
|
24
|
-
/** Truncate to `n` visible chars with an ellipsis. Assumes `s` is unstyled. */
|
|
25
|
-
export declare const truncate: (s: string, n: number) => string;
|
|
26
|
-
/** Semantic palette — use these, not raw colors, so intent stays consistent. */
|
|
27
|
-
export declare const ui: {
|
|
28
|
-
head: (s: string) => string;
|
|
29
|
-
accent: (s: string) => string;
|
|
30
|
-
muted: (s: string) => string;
|
|
31
|
-
ok: (s: string) => string;
|
|
32
|
-
warn: (s: string) => string;
|
|
33
|
-
bad: (s: string) => string;
|
|
34
|
-
/** ids / refs — de-emphasized monospace-ish */
|
|
35
|
-
ref: (s: string) => string;
|
|
36
|
-
};
|
|
23
|
+
export * from "./live.js";
|
|
24
|
+
export { clip, ui, width } from "./text.js";
|
|
37
25
|
export interface TableOpts {
|
|
38
26
|
/** Column headers (bolded). */
|
|
39
27
|
head?: string[];
|
|
@@ -61,6 +49,4 @@ export declare const indent: (s: string, n: number) => string;
|
|
|
61
49
|
export declare function tree(label: string, children: string[], opts?: {
|
|
62
50
|
indent?: number;
|
|
63
51
|
}): string;
|
|
64
|
-
/** A small inline badge, e.g. `badge('golden', ui.ok)`. */
|
|
65
|
-
export declare const badge: (text: string, style?: (s: string) => string) => string;
|
|
66
52
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA
|
|
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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `cli` — terminal presentation: aligned tables, key/value blocks, trees, a
|
|
3
|
-
* semantic palette
|
|
4
|
-
*
|
|
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.
|
|
5
6
|
*
|
|
6
7
|
* Colors come from `universal/log` and auto-disable on non-TTY / NO_COLOR, so a
|
|
7
8
|
* `table()` renders colored in a terminal and as plain aligned text in a pipe,
|
|
@@ -19,26 +20,9 @@
|
|
|
19
20
|
* { head: ['name', 'email', 'label'] },
|
|
20
21
|
* ))
|
|
21
22
|
*/
|
|
22
|
-
import {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
/** Visible width of a string — ANSI escape codes stripped, counted by code point. */
|
|
26
|
-
export const width = (s) => [...s.replace(ANSI_RE, "")].length;
|
|
27
|
-
/** Truncate to `n` visible chars with an ellipsis. Assumes `s` is unstyled. */
|
|
28
|
-
export const truncate = (s, n) => width(s) > n ? `${[...s].slice(0, Math.max(0, n - 1)).join("")}…` : s;
|
|
29
|
-
const padEndV = (s, n) => s + " ".repeat(Math.max(0, n - width(s)));
|
|
30
|
-
const padStartV = (s, n) => " ".repeat(Math.max(0, n - width(s))) + s;
|
|
31
|
-
/** Semantic palette — use these, not raw colors, so intent stays consistent. */
|
|
32
|
-
export const ui = {
|
|
33
|
-
head: (s) => bold(s),
|
|
34
|
-
accent: (s) => cyan(s),
|
|
35
|
-
muted: (s) => dim(s),
|
|
36
|
-
ok: (s) => green(s),
|
|
37
|
-
warn: (s) => yellow(s),
|
|
38
|
-
bad: (s) => red(s),
|
|
39
|
-
/** ids / refs — de-emphasized monospace-ish */
|
|
40
|
-
ref: (s) => gray(s),
|
|
41
|
-
};
|
|
23
|
+
import { padEndV, padStartV, ui, width } from "./text.js";
|
|
24
|
+
export * from "./live.js";
|
|
25
|
+
export { clip, ui, width } from "./text.js";
|
|
42
26
|
/**
|
|
43
27
|
* Render rows as aligned columns. Cells may be pre-colored — widths use visible
|
|
44
28
|
* length so colored columns still line up. The last left-aligned column isn't
|
|
@@ -87,6 +71,4 @@ export function tree(label, children, opts = {}) {
|
|
|
87
71
|
const lead = " ".repeat(opts.indent ?? 0);
|
|
88
72
|
return [lead + label, ...children.map((c) => `${lead} ${c}`)].join("\n");
|
|
89
73
|
}
|
|
90
|
-
/** A small inline badge, e.g. `badge('golden', ui.ok)`. */
|
|
91
|
-
export const badge = (text, style = ui.muted) => style(text);
|
|
92
74
|
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
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; `style` colors the filled part (default green —
|
|
55
|
+
* pass e.g. `ui.warn` for a throttled/cooling state). `done > total` clamps to
|
|
56
|
+
* full — live counters drift (e.g. a server-count proxy that overcounts) and
|
|
57
|
+
* that's the caller's data, not a bug here.
|
|
58
|
+
*/
|
|
59
|
+
export declare function bar(done: number, total: number, width?: number, style?: (s: string) => string): string;
|
|
60
|
+
/** Compact elapsed time since a `Date.now()` timestamp: 0.4s · 12s · 1m05s · 1h02m. */
|
|
61
|
+
export declare function elapsed(since: number): string;
|
|
62
|
+
/**
|
|
63
|
+
* The one-liner: animate `label` with a spinner + elapsed time while `fn`
|
|
64
|
+
* runs, persist `✓ label 1.2s` on success, `⨯ label 1.2s message` on failure
|
|
65
|
+
* (and rethrow). `fn` receives a setter for relabeling mid-flight:
|
|
66
|
+
* `spinner('connecting 0/4', async (set) => { …; set('connecting 2/4') })`.
|
|
67
|
+
*
|
|
68
|
+
* Non-TTY prints just the final line. Started while a live region is active
|
|
69
|
+
* (a helper deep in a call stack, under a dashboard), it degrades the same
|
|
70
|
+
* way — the final line lands ABOVE the region via the console routing. Only
|
|
71
|
+
* a second live() region screams; a nested spinner is legitimate composition.
|
|
72
|
+
*/
|
|
73
|
+
export declare function spinner<T>(label: string, fn: (set: (label: string) => void) => Promise<T>): Promise<T>;
|
|
74
|
+
//# 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;;;;;GAKG;AACH,wBAAgB,GAAG,CAClB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,SAAK,EACV,KAAK,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAc,GAClC,MAAM,CAIR;AAED,uFAAuF;AACvF,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ7C;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,OAAO,CAAC,CAAC,EAC9B,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAC9C,OAAO,CAAC,CAAC,CAAC,CAqBZ"}
|
package/dist/cli/live.js
ADDED
|
@@ -0,0 +1,243 @@
|
|
|
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; `style` colors the filled part (default green —
|
|
189
|
+
* pass e.g. `ui.warn` for a throttled/cooling state). `done > total` clamps to
|
|
190
|
+
* full — live counters drift (e.g. a server-count proxy that overcounts) and
|
|
191
|
+
* that's the caller's data, not a bug here.
|
|
192
|
+
*/
|
|
193
|
+
export function bar(done, total, width = 24, style = green) {
|
|
194
|
+
assert(done >= 0 && total >= 0, "bar: negative counts", done, total);
|
|
195
|
+
const fill = Math.round(Math.min(1, total === 0 ? 1 : done / total) * width);
|
|
196
|
+
return style("█".repeat(fill)) + dim("░".repeat(width - fill));
|
|
197
|
+
}
|
|
198
|
+
/** Compact elapsed time since a `Date.now()` timestamp: 0.4s · 12s · 1m05s · 1h02m. */
|
|
199
|
+
export function elapsed(since) {
|
|
200
|
+
const s = (Date.now() - since) / 1000;
|
|
201
|
+
if (s < 10)
|
|
202
|
+
return `${s.toFixed(1)}s`;
|
|
203
|
+
const r = Math.round(s);
|
|
204
|
+
if (r < 60)
|
|
205
|
+
return `${r}s`;
|
|
206
|
+
const m = Math.floor(r / 60);
|
|
207
|
+
if (m < 60)
|
|
208
|
+
return `${m}m${String(r % 60).padStart(2, "0")}s`;
|
|
209
|
+
return `${Math.floor(m / 60)}h${String(m % 60).padStart(2, "0")}m`;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* The one-liner: animate `label` with a spinner + elapsed time while `fn`
|
|
213
|
+
* runs, persist `✓ label 1.2s` on success, `⨯ label 1.2s message` on failure
|
|
214
|
+
* (and rethrow). `fn` receives a setter for relabeling mid-flight:
|
|
215
|
+
* `spinner('connecting 0/4', async (set) => { …; set('connecting 2/4') })`.
|
|
216
|
+
*
|
|
217
|
+
* Non-TTY prints just the final line. Started while a live region is active
|
|
218
|
+
* (a helper deep in a call stack, under a dashboard), it degrades the same
|
|
219
|
+
* way — the final line lands ABOVE the region via the console routing. Only
|
|
220
|
+
* a second live() region screams; a nested spinner is legitimate composition.
|
|
221
|
+
*/
|
|
222
|
+
export async function spinner(label, fn) {
|
|
223
|
+
const start = Date.now();
|
|
224
|
+
let current = label;
|
|
225
|
+
const set = (l) => {
|
|
226
|
+
current = l;
|
|
227
|
+
};
|
|
228
|
+
const l = active === null
|
|
229
|
+
? live(() => `${spin()} ${current} ${dim(elapsed(start))}`)
|
|
230
|
+
: null;
|
|
231
|
+
const persist = (line) => l ? l.done(line) : console.log(line);
|
|
232
|
+
try {
|
|
233
|
+
const v = await fn(set);
|
|
234
|
+
persist(`${green("✓")} ${current} ${dim(elapsed(start))}`);
|
|
235
|
+
return v;
|
|
236
|
+
}
|
|
237
|
+
catch (e) {
|
|
238
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
239
|
+
persist(`${red("⨯")} ${current} ${dim(elapsed(start))} ${red(msg)}`);
|
|
240
|
+
throw e;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//# 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 escapes stripped, counted by grapheme cluster. */
|
|
9
|
+
export declare const width: (s: string) => number;
|
|
10
|
+
/**
|
|
11
|
+
* Truncate to `n` visible graphemes (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;AAazC,sFAAsF;AACtF,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,KAAG,MACoB,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAwBjD;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"}
|
package/dist/cli/text.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
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
|
+
// biome-ignore lint/suspicious/noControlCharactersInRegex: split on ANSI escapes, keeping them
|
|
11
|
+
const ANSI_SPLIT_RE = /(\x1b\[[0-9;]*m)/;
|
|
12
|
+
// Grapheme clusters, not code points: what the terminal renders as ONE symbol
|
|
13
|
+
// (ZWJ emoji 👨👩👧, flags 🇪🇸, skin tones) is several code points — counting
|
|
14
|
+
// pieces breaks alignment.
|
|
15
|
+
// TODO: East-Asian width — CJK and wide emoji occupy TWO terminal cells but
|
|
16
|
+
// count as one here, so CJK-heavy columns can drift a cell; needs a wcwidth
|
|
17
|
+
// range table.
|
|
18
|
+
const GRAPHEMES = new Intl.Segmenter();
|
|
19
|
+
/** Visible width of a string — ANSI escapes stripped, counted by grapheme cluster. */
|
|
20
|
+
export const width = (s) => [...GRAPHEMES.segment(s.replace(ANSI_RE, ""))].length;
|
|
21
|
+
/**
|
|
22
|
+
* Truncate to `n` visible graphemes (ellipsis at the cut), ANSI-aware: escape
|
|
23
|
+
* sequences pass through so styling survives, and open styles are closed
|
|
24
|
+
* with a final reset. Plain strings work too — this is THE truncate.
|
|
25
|
+
*/
|
|
26
|
+
export function clip(s, n) {
|
|
27
|
+
if (width(s) <= n)
|
|
28
|
+
return s;
|
|
29
|
+
let out = "";
|
|
30
|
+
let vis = 0;
|
|
31
|
+
let styled = false;
|
|
32
|
+
for (const part of s.split(ANSI_SPLIT_RE)) {
|
|
33
|
+
if (part === "")
|
|
34
|
+
continue;
|
|
35
|
+
if (part.startsWith("\x1b")) {
|
|
36
|
+
out += part;
|
|
37
|
+
styled = true;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
for (const g of GRAPHEMES.segment(part)) {
|
|
41
|
+
if (vis < n - 1) {
|
|
42
|
+
out += g.segment;
|
|
43
|
+
vis++;
|
|
44
|
+
}
|
|
45
|
+
else if (vis === n - 1) {
|
|
46
|
+
out += "…";
|
|
47
|
+
vis++;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// close any open style, without doubling a reset the input already ends on
|
|
52
|
+
return styled && !out.endsWith("\x1b[0m") ? `${out}\x1b[0m` : out;
|
|
53
|
+
}
|
|
54
|
+
export const padEndV = (s, n) => s + " ".repeat(Math.max(0, n - width(s)));
|
|
55
|
+
export const padStartV = (s, n) => " ".repeat(Math.max(0, n - width(s))) + s;
|
|
56
|
+
/** Semantic palette — use these, not raw colors, so intent stays consistent. */
|
|
57
|
+
export const ui = {
|
|
58
|
+
head: (s) => bold(s),
|
|
59
|
+
accent: (s) => cyan(s),
|
|
60
|
+
muted: (s) => dim(s),
|
|
61
|
+
ok: (s) => green(s),
|
|
62
|
+
warn: (s) => yellow(s),
|
|
63
|
+
bad: (s) => red(s),
|
|
64
|
+
/** ids / refs — de-emphasized monospace-ish */
|
|
65
|
+
ref: (s) => gray(s),
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/cli/text.ts"],"names":[],"mappings":"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"}
|
package/dist/universal/log.d.ts
CHANGED
|
@@ -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":"AAAA
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/universal/log.ts"],"names":[],"mappings":"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"}
|
package/dist/universal/log.js
CHANGED
|
@@ -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":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,+BAA+B;AAC/B,MAAM,IAAI,GAAG;IACZ,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IAEd,oBAAoB;IACpB,KAAK,EAAE,UAAU;IACjB,GAAG,EAAE,UAAU;IACf,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;IACjB,IAAI,EAAE,UAAU;IAEhB,gCAAgC;IAChC,MAAM,EAAE,wBAAwB;IAEhC,oBAAoB;IACpB,KAAK,EAAE,UAAU;IACjB,OAAO,EAAE,UAAU;IACnB,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,UAAU;IAClB,SAAS,EAAE,UAAU;IACrB,MAAM,EAAE,UAAU;IAClB,OAAO,EAAE,UAAU;CACV,CAAC;AAEX,qCAAqC;AACrC,MAAM,cAAc,GAAG,GAAY,EAAE;IACpC,IAAI,OAAO,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC,CAAC,uDAAuD;IAE3F,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO,CACN,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,MAAM,CAC5E,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,cAAc,EAAE,CAAC;AAEtC,2BAA2B;AAC3B,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE;IACtD,IAAI,CAAC,YAAY;QAAE,OAAO,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC;IAC/C,OAAO,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC;AACjD,CAAC,CAAC;AAEF,yBAAyB;AACzB,MAAM,CAAC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3C,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/C,MAAM,CAAC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3C,MAAM,CAAC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAE7C,oBAAoB;AACpB,MAAM,CAAC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3C,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/C,MAAM,CAAC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACjD,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACnD,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAE/C,wCAAwC;AACxC,MAAM,QAAQ,GAAG;IAChB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvB,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;CAChB,CAAC;AAIX,sDAAsD;AACtD,MAAM,UAAU,GAAG;IAClB,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACC,CAAC;AAIX,SAAS,aAAa,CAAC,KAAyB;IAC/C,QAAQ,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;QAC9B,KAAK,OAAO;YACX,OAAO,UAAU,CAAC,KAAK,CAAC;QACzB,KAAK,MAAM;YACV,OAAO,UAAU,CAAC,IAAI,CAAC;QACxB,KAAK,MAAM;YACV,OAAO,UAAU,CAAC,IAAI,CAAC;QACxB,KAAK,OAAO,CAAC;QACb,KAAK,OAAO;YACX,OAAO,UAAU,CAAC,KAAK,CAAC;QACzB;YACC,OAAO,UAAU,CAAC,IAAI,CAAC;IACzB,CAAC;AACF,CAAC;AAED,IAAI,eAAe,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;AAE9D,wEAAwE;AACxE,MAAM,UAAU,WAAW,CAAC,KAAmB;IAC9C,eAAe,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,wCAAwC;AACxC,MAAM,QAAQ;IACL,KAAK,GAAG,IAAI,GAAG,EAAQ,CAAC;IACxB,OAAO,CAAS;IAExB,YAAY,OAAe;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,GAAG,CAAC,GAAM;QACT,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,mCAAmC;YACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,GAAG,CAAC,GAAM,EAAE,KAAQ;QACnB,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAE3B,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YACpC,0CAA0C;YAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAChD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC;QACF,CAAC;IACF,CAAC;IAED,GAAG,CAAC,GAAM;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;CACD;AAED,MAAM,aAAa,GAAG,IAAI,QAAQ,CAAkB,MAAM,CAAC,CAAC;AAE5D,wBAAwB;AACxB,SAAS,WAAW,CAAC,KAAe,EAAE,GAAG,QAAmB;IAC3D,8CAA8C;IAC9C,MAAM,aAAa,GAClB,UAAU,CAAC,KAAgC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC;IACjE,IAAI,aAAa,GAAG,eAAe,EAAE,CAAC;QACrC,OAAO,CAAC,gBAAgB;IACzB,CAAC;IAED,6BAA6B;IAC7B,IACC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;QACjD,QAAQ,CAAC,MAAM,KAAK,CAAC,EACpB,CAAC;QACF,QAAQ,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED,0CAA0C;IAC1C,MAAM,aAAa,GAClB,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE/B,wBAAwB;IACxB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3B,OAAO;IACR,CAAC;IAED,6BAA6B;IAC7B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC9D,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,MAAM,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC;IACnD,CAAC;AACF,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,SAAS,CAAC,GAAG,QAAkB;IAC9C,OAAO,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,IAAI,CAAC,GAAG,QAAmB;IAC1C,WAAW,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAG,QAAmB;IAC3C,WAAW,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAG,QAAmB;IAC1C,WAAW,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAG,QAAmB;IAC3C,WAAW,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAG,QAAmB;IAC1C,WAAW,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAG,QAAmB;IAC7C,WAAW,CAAC,SAAS,EAAE,GAAG,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAG,QAAmB;IAC3C,WAAW,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAG,QAAmB;IAC3C,WAAW,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,QAAQ,CAAC,GAAG,QAAmB;IAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IACnB,CAAC;AACF,CAAC;AAED,8CAA8C;AAC9C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEzC,MAAM,UAAU,IAAI,CAAC,KAAa;IACjC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa;IACpC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,CAAC,UAAU,KAAK,kBAAkB,CAAC,CAAC;QACxC,OAAO;IACR,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;IACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAErB,MAAM,SAAS,GACd,QAAQ,GAAG,KAAK;QACf,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG;QACvC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;IAEhC,KAAK,CAAC,GAAG,KAAK,KAAK,SAAS,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,YAAY,CAAC,MAAc;IAC1C,OAAO;QACN,IAAI,EAAE,CAAC,GAAG,QAAmB,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC;QAClE,KAAK,EAAE,CAAC,GAAG,QAAmB,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC;QACpE,IAAI,EAAE,CAAC,GAAG,QAAmB,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC;QAClE,KAAK,EAAE,CAAC,GAAG,QAAmB,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC;QACpE,IAAI,EAAE,CAAC,GAAG,QAAmB,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC;QAClE,OAAO,EAAE,CAAC,GAAG,QAAmB,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC;QACxE,KAAK,EAAE,CAAC,GAAG,QAAmB,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC;QACpE,KAAK,EAAE,CAAC,GAAG,QAAmB,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC;QACpE,QAAQ,EAAE,CAAC,GAAG,QAAmB,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC;QAC1E,IAAI,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC;QACnD,OAAO,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC;KACzD,CAAC;AACH,CAAC;AAED,gCAAgC;AAChC,MAAM,GAAG,GAAG;IACX,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,OAAO;IACP,KAAK;IACL,KAAK;IACL,QAAQ;IACR,IAAI;IACJ,OAAO;IACP,SAAS;IACT,YAAY;IACZ,WAAW;IAEX,kBAAkB;IAClB,MAAM,EAAE;QACP,IAAI;QACJ,GAAG;QACH,GAAG;QACH,KAAK;QACL,MAAM;QACN,IAAI;QACJ,OAAO;QACP,IAAI;QACJ,KAAK;QACL,IAAI;QACJ,MAAM;QACN,KAAK;QACL,OAAO;QACP,QAAQ;QACR,MAAM;QACN,SAAS;QACT,MAAM;QACN,OAAO;KACP;CACD,CAAC;AAEF,OAAO,EAAE,GAAG,EAAE,CAAC;AAEf,uBAAuB;AACvB,MAAM,UAAU,aAAa,CAAC,OAM7B;IACA,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,WAAW,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAEzE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAChD,SAAS,CAAC,0BAA0B,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IAEpD,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QAC1B,SAAS,CAAC,0BAA0B,iBAAiB,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QACjB,SAAS,CAAC,mBAAmB,WAAW,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,CAAC;AACV,CAAC;AAED,gCAAgC;AAChC,SAAS,iBAAiB;IACzB,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;QAAE,OAAO,WAAW,CAAC,CAAC,uDAAuD;IAEzG,IAAI,CAAC;QACJ,+DAA+D;QAC/D,oEAAoE;QACpE,gEAAgE;QAChE,iEAAiE;QACjE,oDAAoD;QACpD,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAM3B,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC;YAC1D,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;gBAC1B,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;oBAChD,OAAO,KAAK,CAAC,OAAO,CAAC;gBACtB,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,0CAA0C;IAC3C,CAAC;IAED,OAAO,WAAW,CAAC;AACpB,CAAC"}
|
|
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.
|
|
3
|
+
"version": "0.23.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",
|
|
@@ -93,6 +93,7 @@
|
|
|
93
93
|
"dev": "tsx src/index.ts",
|
|
94
94
|
"test": "echo 'Tests not configured yet'",
|
|
95
95
|
"test:runtime": "tsx tests/runtime-test.ts",
|
|
96
|
+
"test:text": "tsx tests/text-test.ts",
|
|
96
97
|
"test:browser": "open tests/browser-test.html",
|
|
97
98
|
"example": "tsx tests/example.ts",
|
|
98
99
|
"update-crypto": "tsx src/universal/currency/download-crypto-list.ts",
|
|
@@ -125,9 +126,6 @@
|
|
|
125
126
|
"typescript": "^5.9.2",
|
|
126
127
|
"zod": "^4.4.3"
|
|
127
128
|
},
|
|
128
|
-
"dependencies": {
|
|
129
|
-
"chalk": "^5.6.0"
|
|
130
|
-
},
|
|
131
129
|
"peerDependencies": {
|
|
132
130
|
"@gramio/format": ">=0.8.0",
|
|
133
131
|
"@gramio/session": ">=0.2.0",
|
|
@@ -160,11 +158,6 @@
|
|
|
160
158
|
"access": "public",
|
|
161
159
|
"registry": "https://registry.npmjs.org/"
|
|
162
160
|
},
|
|
163
|
-
"pnpm": {
|
|
164
|
-
"overrides": {
|
|
165
|
-
"@gramio/contexts": "github:adriangalilea/contexts#local-build/auto-thread-private-chat-threaded-mode"
|
|
166
|
-
}
|
|
167
|
-
},
|
|
168
161
|
"repository": {
|
|
169
162
|
"type": "git",
|
|
170
163
|
"url": "git+https://github.com/adriangalilea/ts-utils.git"
|