@void.01/advanced-logger 0.0.0-stage → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/ARCHITECTURE.md +342 -0
  2. package/CHANGELOG.md +115 -0
  3. package/LICENSE +21 -0
  4. package/README.md +308 -2
  5. package/dist/actions.d.ts +79 -0
  6. package/dist/actions.d.ts.map +1 -0
  7. package/dist/actions.js +337 -0
  8. package/dist/actions.js.map +1 -0
  9. package/dist/ansi.d.ts +144 -0
  10. package/dist/ansi.d.ts.map +1 -0
  11. package/dist/ansi.js +219 -0
  12. package/dist/ansi.js.map +1 -0
  13. package/dist/caller.d.ts +21 -0
  14. package/dist/caller.d.ts.map +1 -0
  15. package/dist/caller.js +129 -0
  16. package/dist/caller.js.map +1 -0
  17. package/dist/config.d.ts +152 -0
  18. package/dist/config.d.ts.map +1 -0
  19. package/dist/config.js +398 -0
  20. package/dist/config.js.map +1 -0
  21. package/dist/configFile.d.ts +31 -0
  22. package/dist/configFile.d.ts.map +1 -0
  23. package/dist/configFile.js +211 -0
  24. package/dist/configFile.js.map +1 -0
  25. package/dist/core.d.ts +17 -0
  26. package/dist/core.d.ts.map +1 -0
  27. package/dist/core.js +89 -0
  28. package/dist/core.js.map +1 -0
  29. package/dist/index.d.ts +12 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +60 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/logger.d.ts +7 -0
  34. package/dist/logger.d.ts.map +1 -0
  35. package/dist/logger.js +10 -0
  36. package/dist/logger.js.map +1 -0
  37. package/dist/playwright.d.ts +15 -0
  38. package/dist/playwright.d.ts.map +1 -0
  39. package/dist/playwright.js +47 -0
  40. package/dist/playwright.js.map +1 -0
  41. package/dist/redact.d.ts +8 -0
  42. package/dist/redact.d.ts.map +1 -0
  43. package/dist/redact.js +36 -0
  44. package/dist/redact.js.map +1 -0
  45. package/dist/sinks.d.ts +80 -0
  46. package/dist/sinks.d.ts.map +1 -0
  47. package/dist/sinks.js +461 -0
  48. package/dist/sinks.js.map +1 -0
  49. package/dist/theme.d.ts +71 -0
  50. package/dist/theme.d.ts.map +1 -0
  51. package/dist/theme.js +115 -0
  52. package/dist/theme.js.map +1 -0
  53. package/package.json +51 -4
package/dist/sinks.js ADDED
@@ -0,0 +1,461 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.removeSink = exports.addSink = exports.captureSink = exports.jsonlSink = exports.fullTraceSink = exports.debugTraceSink = exports.partialTraceSink = exports.tableFilesSink = exports.consoleSink = exports.TEST_TAG_MAX = exports.splitLines = void 0;
37
+ exports.closeAllFiles = closeAllFiles;
38
+ exports.traceFilePath = traceFilePath;
39
+ exports.headingSlug = headingSlug;
40
+ exports.nextTableFile = nextTableFile;
41
+ exports.tableFilePath = tableFilePath;
42
+ exports.tableToCsv = tableToCsv;
43
+ exports.tableToJson = tableToJson;
44
+ exports.captureLogs = captureLogs;
45
+ exports.activeSinks = activeSinks;
46
+ const fs = __importStar(require("node:fs"));
47
+ const path = __importStar(require("node:path"));
48
+ const ansi_1 = require("./ansi");
49
+ const redact_1 = require("./redact");
50
+ const config_1 = require("./config");
51
+ const theme_1 = require("./theme");
52
+ const SPLIT_LINES = config_1.LINE_BREAKS_NO_G;
53
+ const splitLines = (m) => m.split(SPLIT_LINES);
54
+ exports.splitLines = splitLines;
55
+ const body = (ev, cfg, line) => ev.ts + cfg.segmentDivider + ev.label + cfg.segmentDivider + line;
56
+ // -- Console -----------------------------------------------------------------
57
+ function githubCommand(ev) {
58
+ if (ev.level === 'ERROR' || ev.intent === 'ALERT')
59
+ return 'error';
60
+ if (ev.level === 'WARN')
61
+ return 'warning';
62
+ return null;
63
+ }
64
+ const escapeGithub = (t) => t.replace(/%/g, '%25').replace(/\r/g, '%0D').replace(/\n/g, '%0A');
65
+ exports.TEST_TAG_MAX = 40;
66
+ /** The opt-in "w1 │ test title │ " console prefix. The worker part matches the trace files' prefix. */
67
+ function consolePrefix(ev, cfg) {
68
+ let p = cfg.consoleWorker ? `${ev.worker} │ ` : '';
69
+ if (cfg.consoleTest && ev.testTitle) {
70
+ const t = ev.testTitle.replace(config_1.LINE_BREAKS, ' ');
71
+ p += (t.length > exports.TEST_TAG_MAX ? t.slice(0, exports.TEST_TAG_MAX - 3) + '...' : t) + ' │ ';
72
+ }
73
+ return p;
74
+ }
75
+ exports.consoleSink = {
76
+ accepts: (level, cfg) => cfg.console && (0, config_1.levelEnabled)(cfg.level, level),
77
+ write(ev, cfg) {
78
+ const div = cfg.segmentDivider;
79
+ const showCaller = (0, config_1.levelEnabled)(cfg.level, 'DEBUG');
80
+ const callerText = showCaller ? ev.caller : '';
81
+ const lines = (0, exports.splitLines)(ev.message);
82
+ const prefix = consolePrefix(ev, cfg);
83
+ const out = [];
84
+ lines.forEach((line, i) => {
85
+ const b = prefix + body(ev, cfg, line);
86
+ const first = i === 0 && callerText !== '';
87
+ let text;
88
+ if (cfg.ansi) {
89
+ // ev.color is '' when fg and bg are both off: leave the body bare rather than emit a lone reset.
90
+ const wrap = (s) => (ev.color ? ev.color + s + theme_1.THEME_RESET : s);
91
+ // callerColor is its own opt-in and is not gated by fg/bg (only ansi=false silences it).
92
+ text =
93
+ first && cfg.callerColor
94
+ ? wrap(b) + div + theme_1.CALLER_FG + callerText + theme_1.THEME_RESET
95
+ : wrap(b + (first ? div + callerText : ''));
96
+ }
97
+ else {
98
+ text = b + (first ? div + callerText : '');
99
+ }
100
+ out.push(text);
101
+ if (cfg.githubAnnotations) {
102
+ const cmd = githubCommand(ev);
103
+ const plain = prefix + ev.ts + div + line;
104
+ if (cmd && plain.trim() !== '')
105
+ out.push(`::${cmd}::${escapeGithub(plain)}`);
106
+ }
107
+ });
108
+ process.stdout.write(out.join('\n') + '\n');
109
+ },
110
+ };
111
+ const FD_CACHE = new Map();
112
+ function fdFor(file) {
113
+ let fd = FD_CACHE.get(file);
114
+ if (fd === undefined) {
115
+ fs.mkdirSync(path.dirname(file), { recursive: true });
116
+ fd = fs.openSync(file, 'a');
117
+ FD_CACHE.set(file, fd);
118
+ }
119
+ return fd;
120
+ }
121
+ /** Synchronous append: nothing is buffered, so a crashing worker loses no lines. */
122
+ function appendSync(file, text) {
123
+ fs.writeSync(fdFor(file), text);
124
+ }
125
+ /** Trace kinds already pruned by this process (once per kind, at its first write). */
126
+ const PRUNED = new Set();
127
+ let RUN_ID_WARNED = false;
128
+ /** One stderr warning per process when a Playwright worker has no shared run id (initRun() was never called). */
129
+ function warnIfRunIdMissing() {
130
+ if (RUN_ID_WARNED || !(0, config_1.runIdMissing)())
131
+ return;
132
+ RUN_ID_WARNED = true;
133
+ process.stderr.write(`[advanced-logger] ${(0, config_1.workerLabel)()}: VOID_RUN_ID is not set, so this worker's log files use their own run id ` +
134
+ 'and log retention is off in this process. Call initRun() from your Playwright globalSetup.\n');
135
+ }
136
+ function pruneSpec(kind) {
137
+ if (kind === 'table-csv' || kind === 'table-json') {
138
+ const ext = kind === 'table-csv' ? 'csv' : 'json';
139
+ return {
140
+ dir: ['attachments', ext],
141
+ // <runId>-<worker>/<NNN>-<heading>.<ext>
142
+ own: new RegExp(`^\\d{3,}-.+\\.${ext}$`),
143
+ run: /^(.+)-(?:main|w\d+)$/,
144
+ perWorkerFolders: true,
145
+ byFileCount: false,
146
+ };
147
+ }
148
+ // <kind>-<runId>-<worker>.<ext>
149
+ return {
150
+ dir: [kind],
151
+ own: new RegExp(`^${kind}-.+\\.(log|jsonl)$`),
152
+ run: new RegExp(`^${kind}-(.+)-(?:main|w\\d+)\\.(?:log|jsonl)$`),
153
+ perWorkerFolders: false,
154
+ byFileCount: true,
155
+ };
156
+ }
157
+ /** The files of one kind in one date folder, with the name the run id is read from (file, or its worker folder). */
158
+ function listKind(dir, spec) {
159
+ const read = (d) => {
160
+ try {
161
+ return fs.readdirSync(d);
162
+ }
163
+ catch {
164
+ return [];
165
+ }
166
+ };
167
+ const out = [];
168
+ if (!spec.perWorkerFolders) {
169
+ for (const name of read(dir))
170
+ if (spec.own.test(name))
171
+ out.push({ file: path.join(dir, name), runName: name });
172
+ return out;
173
+ }
174
+ for (const folder of read(dir)) {
175
+ if (!spec.run.test(folder))
176
+ continue;
177
+ for (const name of read(path.join(dir, folder))) {
178
+ if (spec.own.test(name))
179
+ out.push({ file: path.join(dir, folder, name), runName: folder });
180
+ }
181
+ }
182
+ return out;
183
+ }
184
+ function pruneOnce(cfg, kind) {
185
+ const spec = pruneSpec(kind);
186
+ const maxFiles = spec.byFileCount && cfg.maxLogFiles != null && cfg.maxLogFiles > 0 ? cfg.maxLogFiles : null;
187
+ const maxRuns = cfg.maxRuns != null && cfg.maxRuns > 0 ? cfg.maxRuns : null;
188
+ if (maxFiles == null && maxRuns == null)
189
+ return;
190
+ if ((0, config_1.runIdMissing)())
191
+ return;
192
+ const key = `${path.resolve(cfg.logDir)}|${kind}`;
193
+ if (PRUNED.has(key))
194
+ return;
195
+ PRUNED.add(key);
196
+ try {
197
+ const { runId } = (0, config_1.getRun)();
198
+ const runOf = (name) => spec.run.exec(name)?.[1] ?? name;
199
+ const files = [];
200
+ for (const day of fs.readdirSync(cfg.logDir, { withFileTypes: true })) {
201
+ if (!day.isDirectory())
202
+ continue;
203
+ for (const { file, runName } of listKind(path.join(cfg.logDir, day.name, ...spec.dir), spec)) {
204
+ try {
205
+ files.push({ file, mtime: fs.statSync(file).mtimeMs, run: runOf(runName), current: runName.includes(runId) });
206
+ }
207
+ catch {
208
+ /* removed by another worker */
209
+ }
210
+ }
211
+ }
212
+ const newest = new Map();
213
+ for (const f of files)
214
+ newest.set(f.run, Math.max(newest.get(f.run) ?? 0, f.mtime));
215
+ const now = Date.now();
216
+ const recentMs = cfg.recentRunMinutes * 60_000;
217
+ const others = files.filter((f) => !f.current);
218
+ const doomed = new Set();
219
+ if (maxFiles != null) {
220
+ const keep = Math.max(0, maxFiles - (files.length - others.length));
221
+ for (const f of [...others].sort((a, b) => b.mtime - a.mtime).slice(keep))
222
+ doomed.add(f);
223
+ }
224
+ if (maxRuns != null) {
225
+ const otherRuns = [...new Set(others.map((f) => f.run))].sort((a, b) => newest.get(b) - newest.get(a));
226
+ const keep = Math.max(0, maxRuns - (others.length < files.length ? 1 : 0));
227
+ const old = new Set(otherRuns.slice(keep));
228
+ for (const f of others)
229
+ if (old.has(f.run))
230
+ doomed.add(f);
231
+ }
232
+ for (const f of doomed) {
233
+ if (now - newest.get(f.run) < recentMs)
234
+ continue;
235
+ try {
236
+ fs.rmSync(f.file, { force: true });
237
+ // Remove folders this left empty (kind, attachments, date), never logDir itself.
238
+ const root = path.resolve(cfg.logDir);
239
+ for (let dir = path.dirname(path.resolve(f.file)); dir !== root && dir.startsWith(root); dir = path.dirname(dir)) {
240
+ if (fs.readdirSync(dir).length > 0)
241
+ break;
242
+ fs.rmdirSync(dir);
243
+ }
244
+ }
245
+ catch {
246
+ /* in use, or already gone */
247
+ }
248
+ }
249
+ }
250
+ catch {
251
+ /* retention must never break logging */
252
+ }
253
+ }
254
+ function closeAllFiles() {
255
+ PRUNED.clear();
256
+ RUN_ID_WARNED = false;
257
+ for (const fd of FD_CACHE.values()) {
258
+ try {
259
+ fs.closeSync(fd);
260
+ }
261
+ catch {
262
+ /* already closed */
263
+ }
264
+ }
265
+ FD_CACHE.clear();
266
+ }
267
+ function traceFilePath(cfg, kind, ext = 'log') {
268
+ warnIfRunIdMissing();
269
+ const { runId, runDate } = (0, config_1.getRun)();
270
+ const w = (0, config_1.workerLabel)();
271
+ return path.join(cfg.logDir, runDate, kind, `${kind}-${runId}-${w}.${ext}`);
272
+ }
273
+ // -- Table attachments (CSV + JSON, files.tables) -----------------------------
274
+ /** Per-process table counter. Never reset (not even by closeAllFiles), so a name is never reused and overwritten. */
275
+ let TABLE_SEQ = 0;
276
+ /** A heading as a file-name part: lowercase letters and digits (any script) joined by '-', at most 40 chars. */
277
+ function headingSlug(heading) {
278
+ const slug = heading
279
+ .toLowerCase()
280
+ .replace(/[^\p{L}\p{N}]+/gu, '-')
281
+ .replace(/^-+/, '')
282
+ .slice(0, 40)
283
+ .replace(/-+$/, '');
284
+ return slug || 'table';
285
+ }
286
+ /**
287
+ * The next table's attachment name, `<runId>-<worker>/<NNN>-<heading>`, or undefined when files.tables is off.
288
+ * The folder `<runId>-<worker>` is the part every trace file of this worker shares (`<kind>-<runId>-<worker>.log`),
289
+ * so each parent log has its own folder. NNN counts tables in this process; a number whose file already exists
290
+ * (another process with the same run id and worker label) is skipped rather than overwritten.
291
+ */
292
+ function nextTableFile(cfg, heading) {
293
+ if (!cfg.files.tables)
294
+ return undefined;
295
+ warnIfRunIdMissing();
296
+ const folder = `${(0, config_1.getRun)().runId}-${(0, config_1.workerLabel)()}`;
297
+ const slug = headingSlug(heading);
298
+ let name;
299
+ do {
300
+ TABLE_SEQ += 1;
301
+ name = `${folder}/${String(TABLE_SEQ).padStart(3, '0')}-${slug}`;
302
+ } while (fs.existsSync(tableFilePath(cfg, 'csv', name)) || fs.existsSync(tableFilePath(cfg, 'json', name)));
303
+ return name;
304
+ }
305
+ /** <logDir>/<runDate>/attachments/<csv|json>/<runId>-<worker>/<NNN>-<heading>.<csv|json> */
306
+ function tableFilePath(cfg, ext, file) {
307
+ return path.join(cfg.logDir, (0, config_1.getRun)().runDate, 'attachments', ext, ...file.split('/')) + `.${ext}`;
308
+ }
309
+ /** JSON.stringify replacer for values JSON drops or garbles: Map, Set, bigint, Error. */
310
+ function jsonSafe(_key, v) {
311
+ if (v instanceof Map)
312
+ return Object.fromEntries([...v.entries()].map(([k, x]) => [String(k), x]));
313
+ if (v instanceof Set)
314
+ return [...v];
315
+ if (typeof v === 'bigint')
316
+ return v.toString();
317
+ if (v instanceof Error)
318
+ return v.stack ?? v.message;
319
+ return v;
320
+ }
321
+ /** redactText for attachment cells: mask each string value (never the serialized text, which would break JSON). */
322
+ function maskStrings(v, keys) {
323
+ if (typeof v === 'string')
324
+ return (0, redact_1.maskText)(v, keys);
325
+ if (Array.isArray(v))
326
+ return v.map((x) => maskStrings(x, keys));
327
+ if (v instanceof Map)
328
+ return new Map([...v.entries()].map(([k, x]) => [k, maskStrings(x, keys)]));
329
+ if (v !== null && typeof v === 'object' && Object.getPrototypeOf(v) === Object.prototype) {
330
+ return Object.fromEntries(Object.entries(v).map(([k, x]) => [k, maskStrings(x, keys)]));
331
+ }
332
+ return v;
333
+ }
334
+ /** One CSV field (RFC 4180). A text cell that a spreadsheet would run as a formula gets a leading apostrophe. */
335
+ function csvField(v) {
336
+ let s;
337
+ if (v == null)
338
+ s = '';
339
+ else if (typeof v === 'string')
340
+ s = /^[=+\-@\t\r]/.test(v) && !/^-?\d+(\.\d+)?$/.test(v) ? `'${v}` : v;
341
+ else if (typeof v === 'object')
342
+ s = JSON.stringify(v, jsonSafe) ?? String(v);
343
+ else
344
+ s = String(v);
345
+ return /[",\r\n]|^\s|\s$/.test(s) ? `"${s.replace(/"/g, '""')}"` : s;
346
+ }
347
+ /** UTF-8 BOM (so Excel reads non-ASCII correctly), header row, then one row per table row; CRLF line ends. */
348
+ function tableToCsv(t) {
349
+ const lines = [t.headers.map(csvField).join(',')];
350
+ for (const row of t.rows)
351
+ lines.push(t.headers.map((h) => csvField(row[h])).join(','));
352
+ return '' + lines.join('\r\n') + '\r\n';
353
+ }
354
+ /** The JSON attachment: where the table came from, then its rows. */
355
+ function tableToJson(ev, t) {
356
+ const doc = {
357
+ title: t.title,
358
+ time: ev.time.toISOString(),
359
+ level: ev.level,
360
+ worker: ev.worker,
361
+ runId: (0, config_1.getRun)().runId,
362
+ test: ev.test,
363
+ columns: t.headers,
364
+ rows: t.rows,
365
+ };
366
+ return JSON.stringify(doc, jsonSafe, 2) + '\n';
367
+ }
368
+ /** Writes each table's CSV and JSON attachment. All levels, like debug-trace; non-table events are ignored. */
369
+ exports.tableFilesSink = {
370
+ accepts: (_level, cfg) => cfg.files.tables,
371
+ write(ev, cfg) {
372
+ const t = ev.table;
373
+ if (!t?.file)
374
+ return;
375
+ const masked = cfg.redactText
376
+ ? { ...t, title: t.title === undefined ? undefined : (0, redact_1.maskText)(t.title, cfg.redactKeys), rows: t.rows.map((r) => maskStrings(r, cfg.redactKeys)) }
377
+ : t;
378
+ for (const [ext, text] of [
379
+ ['csv', tableToCsv(masked)],
380
+ ['json', tableToJson(ev, masked)],
381
+ ]) {
382
+ const file = tableFilePath(cfg, ext, t.file);
383
+ fs.mkdirSync(path.dirname(file), { recursive: true });
384
+ fs.writeFileSync(file, text);
385
+ }
386
+ pruneOnce(cfg, 'table-csv');
387
+ pruneOnce(cfg, 'table-json');
388
+ },
389
+ };
390
+ function fileSink(kind, enabled, rootOnly, render) {
391
+ return {
392
+ accepts: (level, cfg) => enabled(cfg) && (!rootOnly || (0, config_1.levelEnabled)(cfg.level, level)),
393
+ write(ev, cfg) {
394
+ const lines = render(ev, cfg);
395
+ if (lines.length === 0)
396
+ return;
397
+ const prefix = `${ev.worker} │ `;
398
+ appendSync(traceFilePath(cfg, kind), lines.map((l) => `${prefix}${(0, ansi_1.stripAnsi)(l)}`).join('\n') + '\n');
399
+ pruneOnce(cfg, kind);
400
+ },
401
+ };
402
+ }
403
+ exports.partialTraceSink = fileSink('partial-trace', (c) => c.files.partialTrace, true, (ev, cfg) => (0, exports.splitLines)(ev.message).map((l) => body(ev, cfg, l)));
404
+ exports.debugTraceSink = fileSink('debug-trace', (c) => c.files.debugTrace, false, (ev, cfg) => (0, exports.splitLines)(ev.message).map((l, i) => {
405
+ const b = body(ev, cfg, l);
406
+ return i === 0 && ev.caller ? b + cfg.segmentDivider + ev.caller : b;
407
+ }));
408
+ exports.fullTraceSink = fileSink('full-trace', (c) => c.files.fullTrace, false, (ev, cfg) => (0, exports.splitLines)(ev.message).map((l) => {
409
+ const b = body(ev, cfg, l);
410
+ return ev.chain ? b + cfg.segmentDivider + '[CHAIN] ' + ev.chain : b;
411
+ }));
412
+ // -- Structured JSONL (opt-in) ----------------------------------------------
413
+ exports.jsonlSink = {
414
+ accepts: (_level, cfg) => cfg.files.jsonl,
415
+ write(ev, cfg) {
416
+ const rec = {
417
+ time: ev.time.toISOString(),
418
+ level: ev.level,
419
+ intent: ev.intent,
420
+ label: ev.label,
421
+ message: (0, ansi_1.stripAnsi)(ev.message),
422
+ caller: ev.caller || undefined,
423
+ chain: ev.chain || undefined,
424
+ worker: ev.worker,
425
+ test: ev.test,
426
+ visible: (0, config_1.levelEnabled)(cfg.level, ev.level),
427
+ };
428
+ appendSync(traceFilePath(cfg, 'jsonl', 'jsonl'), JSON.stringify(rec) + '\n');
429
+ pruneOnce(cfg, 'jsonl');
430
+ },
431
+ };
432
+ const CAPTURES = new Set();
433
+ exports.captureSink = {
434
+ accepts: (level, cfg) => CAPTURES.size > 0 && (0, config_1.levelEnabled)(cfg.level, level),
435
+ write(ev, cfg) {
436
+ const lines = (0, exports.splitLines)(ev.message).map((l) => (0, ansi_1.stripAnsi)(body(ev, cfg, l)));
437
+ for (const buf of CAPTURES)
438
+ buf.push(...lines);
439
+ },
440
+ };
441
+ function captureLogs() {
442
+ const buf = [];
443
+ CAPTURES.add(buf);
444
+ return {
445
+ text: () => buf.join('\n'),
446
+ stop: () => {
447
+ CAPTURES.delete(buf);
448
+ return buf.join('\n');
449
+ },
450
+ };
451
+ }
452
+ // -- Registry ----------------------------------------------------------------
453
+ const CUSTOM = new Set();
454
+ const addSink = (s) => void CUSTOM.add(s);
455
+ exports.addSink = addSink;
456
+ const removeSink = (s) => void CUSTOM.delete(s);
457
+ exports.removeSink = removeSink;
458
+ function activeSinks() {
459
+ return [exports.consoleSink, exports.partialTraceSink, exports.debugTraceSink, exports.fullTraceSink, exports.jsonlSink, exports.tableFilesSink, exports.captureSink, ...CUSTOM];
460
+ }
461
+ //# sourceMappingURL=sinks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sinks.js","sourceRoot":"","sources":["../src/sinks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /** Classifies what a line communicates, independent of level. Port of LogIntent. */
2
+ export declare const LogIntent: {
3
+ readonly BASE: "BASE";
4
+ readonly INTERACTION: "INTERACTION";
5
+ readonly NAVIGATION: "NAVIGATION";
6
+ readonly OBSERVE: "OBSERVE";
7
+ readonly VERIFY: "VERIFY";
8
+ readonly DATA: "DATA";
9
+ readonly SUCCESS: "SUCCESS";
10
+ readonly ALERT: "ALERT";
11
+ };
12
+ export type LogIntent = (typeof LogIntent)[keyof typeof LogIntent];
13
+ export type LevelName = 'DEBUG' | 'INFO' | 'WARN' | 'ERROR';
14
+ /**
15
+ * One foreground per action, inside its intent's hue family, so `click` and `input` differ while every interaction
16
+ * still reads as blue and every alert as red or orange. Picked in OKLCH, then checked: each color is at least 4.6:1
17
+ * against #1e1e1e, colors in one family are at least 10 apart (CIEDE2000), and colors in different families at
18
+ * least 12. Re-check those numbers when changing a value.
19
+ */
20
+ export declare const ACTION_FG: {
21
+ readonly click: string;
22
+ readonly hover: string;
23
+ readonly checkbox: string;
24
+ readonly toggle: string;
25
+ readonly dropdown: string;
26
+ readonly input: string;
27
+ readonly text: string;
28
+ readonly password: string;
29
+ readonly clear: string;
30
+ readonly key: string;
31
+ readonly upload: string;
32
+ readonly navigate: string;
33
+ readonly tab: string;
34
+ readonly frame: string;
35
+ readonly breadcrumb: string;
36
+ readonly wait: string;
37
+ readonly search: string;
38
+ readonly result: string;
39
+ readonly verifying: string;
40
+ readonly grid: string;
41
+ readonly table: string;
42
+ readonly row: string;
43
+ readonly success: string;
44
+ readonly complete: string;
45
+ readonly resolved: string;
46
+ readonly failed: string;
47
+ readonly error: string;
48
+ readonly timeout: string;
49
+ readonly validation: string;
50
+ readonly fallback: string;
51
+ readonly skip: string;
52
+ };
53
+ export type LogAction = keyof typeof ACTION_FG;
54
+ /**
55
+ * Table header rows, both darker than the table body (ACTION_FG.table) and different from each other, so title,
56
+ * column names and data read as three layers of one violet:
57
+ * - title row: dark and saturated. 4.66:1 on #1e1e1e; CIEDE2000 25.8 from the body.
58
+ * - column-name row: a muted mid shade, same hue as the body. 6.15:1; 15.6 from the body, 14.9 from the title.
59
+ * A more saturated column color would drift into the observe pinks (`wait`, `search`).
60
+ */
61
+ export declare const TABLE_TITLE_FG: string;
62
+ export declare const TABLE_COLUMNS_FG: string;
63
+ export declare const CALLER_FG: string;
64
+ export declare const THEME_RESET: string;
65
+ /**
66
+ * Foreground + background, each part gated by config().fg / config().bg ('' when both are off). The foreground is
67
+ * the action's color when there is one, else the intent's, else (BASE) the level's.
68
+ * Independent of config().ansi: callers (themed()) decide whether any color is wanted at all.
69
+ */
70
+ export declare function resolveStyle(level: LevelName, intent: LogIntent, action?: LogAction): string;
71
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAYA,oFAAoF;AACpF,eAAO,MAAM,SAAS;;;;;;;;;CASZ,CAAC;AACX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAEnE,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AA8B5D;;;;;GAKG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCZ,CAAC;AACX,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,SAAS,CAAC;AAE/C;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,QAAuB,CAAC;AACnD,eAAO,MAAM,gBAAgB,QAAuB,CAAC;AAErD,eAAO,MAAM,SAAS,QAAkB,CAAC;AACzC,eAAO,MAAM,WAAW,QAAQ,CAAC;AAEjC;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAQ5F"}