@mks2508/better-logger 3.1.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/CHANGELOG.json +23 -1
  2. package/dist/Logger.d.ts +12 -0
  3. package/dist/Logger.d.ts.map +1 -1
  4. package/dist/chunks/{Logger-C086w3EM.js → Logger-D-gmmgR2.js} +201 -12
  5. package/dist/chunks/Logger-D-gmmgR2.js.map +1 -0
  6. package/dist/chunks/Logger-D7cfaz15.js +2 -0
  7. package/dist/chunks/Logger-D7cfaz15.js.map +1 -0
  8. package/dist/chunks/{environment-DXHouGD4.js → environment-COWvu6Wz.js} +15 -15
  9. package/dist/chunks/{environment-DXHouGD4.js.map → environment-COWvu6Wz.js.map} +1 -1
  10. package/dist/chunks/{formatting-BNnVUPcw.js → formatting-CYjT9yhO.js} +2 -2
  11. package/dist/chunks/{formatting-BNnVUPcw.js.map → formatting-CYjT9yhO.js.map} +1 -1
  12. package/dist/core.js +2 -2
  13. package/dist/exports.cjs +1 -1
  14. package/dist/exports.js +2 -2
  15. package/dist/index.cjs +1 -1
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +141 -192
  20. package/dist/index.js.map +1 -1
  21. package/dist/styling.cjs +1 -1
  22. package/dist/styling.js +3 -3
  23. package/dist/types/core.d.ts +44 -0
  24. package/dist/types/core.d.ts.map +1 -1
  25. package/dist/writers/BufferWriter.d.ts +96 -0
  26. package/dist/writers/BufferWriter.d.ts.map +1 -0
  27. package/dist/writers/index.d.ts +6 -0
  28. package/dist/writers/index.d.ts.map +1 -0
  29. package/package.json +1 -1
  30. package/packages/core/package.json +1 -1
  31. package/src/Logger.ts +51 -9
  32. package/src/index.ts +5 -1
  33. package/src/types/core.ts +46 -0
  34. package/src/writers/BufferWriter.ts +157 -0
  35. package/src/writers/index.ts +6 -0
  36. package/dist/chunks/Logger-BV0v1AyC.js +0 -2
  37. package/dist/chunks/Logger-BV0v1AyC.js.map +0 -1
  38. package/dist/chunks/Logger-C086w3EM.js.map +0 -1
@@ -91,6 +91,46 @@ export type ExportFormat = 'json' | 'csv' | 'markdown' | 'plain' | 'html';
91
91
  * - ci: Formato optimizado para CI/CD (sin emojis, texto simple)
92
92
  */
93
93
  export type OutputFormat = 'auto' | 'plain' | 'ansi' | 'build' | 'ci';
94
+ /**
95
+ * Output modes for controlling where logs are written
96
+ * @typedef {'console' | 'silent' | 'custom'} OutputMode
97
+ *
98
+ * @description
99
+ * - console: Standard console.log output (default)
100
+ * - silent: No output at all
101
+ * - custom: Use custom OutputWriter for advanced scenarios
102
+ */
103
+ export type OutputMode = 'console' | 'silent' | 'custom';
104
+ /**
105
+ * Custom output writer interface for redirecting log output
106
+ *
107
+ * @interface OutputWriter
108
+ * @since 4.0.0
109
+ *
110
+ * @description
111
+ * Allows redirecting log output to custom destinations like:
112
+ * - DraftLog for CLI spinners with concurrent logging
113
+ * - Buffers for collecting logs during operations
114
+ * - Custom streams or transports
115
+ *
116
+ * @example
117
+ * class BufferWriter implements OutputWriter {
118
+ * private buffer: string[] = [];
119
+ *
120
+ * write(message: string, level: LogLevel, styles: string[]): void {
121
+ * this.buffer.push(message);
122
+ * }
123
+ *
124
+ * flush(): void {
125
+ * this.buffer.forEach(msg => console.log(msg));
126
+ * this.buffer = [];
127
+ * }
128
+ * }
129
+ */
130
+ export interface OutputWriter {
131
+ write(message: string, level: LogLevel, styles: string[]): void;
132
+ flush?(): void;
133
+ }
94
134
  /**
95
135
  * Interfaz de configuración para instancias del logger
96
136
  *
@@ -121,6 +161,10 @@ export interface LoggerConfig {
121
161
  bufferSize?: number;
122
162
  autoDetectTheme?: boolean;
123
163
  outputFormat?: OutputFormat;
164
+ /** Output mode: 'console' (default), 'silent', or 'custom' @since 4.0.0 */
165
+ outputMode?: OutputMode;
166
+ /** Custom writer when outputMode is 'custom' @since 4.0.0 */
167
+ outputWriter?: OutputWriter;
124
168
  }
125
169
  /**
126
170
  * Información parseada del stack trace
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/types/core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/types/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ import { LogLevel, OutputWriter } from '../types/core.js';
2
+ /**
3
+ * Entry in the log buffer
4
+ */
5
+ export interface BufferEntry {
6
+ message: string;
7
+ level: LogLevel;
8
+ styles: string[];
9
+ timestamp: number;
10
+ }
11
+ /**
12
+ * BufferWriter collects log messages in memory instead of outputting to console.
13
+ * Useful for:
14
+ * - CLI operations with spinners (buffer logs during spinner, show after)
15
+ * - Testing (capture logs for assertions)
16
+ * - Batch processing (collect logs, process together)
17
+ *
18
+ * @implements {OutputWriter}
19
+ * @since 4.0.0
20
+ *
21
+ * @example
22
+ * import logger, { BufferWriter } from '@mks2508/better-logger';
23
+ *
24
+ * const buffer = new BufferWriter();
25
+ * logger.updateConfig({
26
+ * outputMode: 'custom',
27
+ * outputWriter: buffer
28
+ * });
29
+ *
30
+ * // Logs go to buffer, not console
31
+ * spinner.start('Loading...');
32
+ * logger.info('Connecting...');
33
+ * logger.info('Processing...');
34
+ * spinner.stop();
35
+ *
36
+ * // Show buffered logs
37
+ * logger.updateConfig({ outputMode: 'console' });
38
+ * buffer.flush(); // Outputs all buffered logs to console
39
+ */
40
+ export declare class BufferWriter implements OutputWriter {
41
+ private buffer;
42
+ private maxSize;
43
+ /**
44
+ * Creates a new BufferWriter
45
+ * @param maxSize - Maximum number of entries to buffer (default: 1000)
46
+ */
47
+ constructor(maxSize?: number);
48
+ /**
49
+ * Writes a log entry to the buffer
50
+ * @param message - Formatted log message
51
+ * @param level - Log level
52
+ * @param styles - CSS styles (for browser console)
53
+ */
54
+ write(message: string, level: LogLevel, styles: string[]): void;
55
+ /**
56
+ * Returns all buffered entries
57
+ * @returns Copy of the buffer array
58
+ */
59
+ getBuffer(): BufferEntry[];
60
+ /**
61
+ * Returns buffered entries filtered by log level
62
+ * @param levels - Log levels to include
63
+ * @returns Filtered buffer entries
64
+ */
65
+ getByLevel(...levels: LogLevel[]): BufferEntry[];
66
+ /**
67
+ * Returns the number of buffered entries
68
+ */
69
+ get size(): number;
70
+ /**
71
+ * Checks if buffer is empty
72
+ */
73
+ get isEmpty(): boolean;
74
+ /**
75
+ * Clears all buffered entries
76
+ */
77
+ clear(): void;
78
+ /**
79
+ * Outputs all buffered entries to console and clears the buffer
80
+ */
81
+ flush(): void;
82
+ /**
83
+ * Outputs buffered entries to console without clearing
84
+ */
85
+ replay(): void;
86
+ /**
87
+ * Returns all messages as an array of strings
88
+ */
89
+ toArray(): string[];
90
+ /**
91
+ * Returns all messages joined as a single string
92
+ * @param separator - String to join messages with (default: newline)
93
+ */
94
+ toString(separator?: string): string;
95
+ }
96
+ //# sourceMappingURL=BufferWriter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BufferWriter.d.ts","sourceRoot":"","sources":["../../src/writers/BufferWriter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,QAAQ,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,YAAa,YAAW,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,OAAO,CAAS;IAExB;;;OAGG;gBACS,OAAO,GAAE,MAAa;IAIlC;;;;;OAKG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAa/D;;;OAGG;IACH,SAAS,IAAI,WAAW,EAAE;IAI1B;;;;OAIG;IACH,UAAU,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE;IAIhD;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,KAAK,IAAI,IAAI;IAWb;;OAEG;IACH,MAAM,IAAI,IAAI;IAUd;;OAEG;IACH,OAAO,IAAI,MAAM,EAAE;IAInB;;;OAGG;IACH,QAAQ,CAAC,SAAS,GAAE,MAAa,GAAG,MAAM;CAG7C"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @fileoverview Output writers for better-logger
3
+ * @version 4.0.0
4
+ */
5
+ export { BufferWriter, type BufferEntry } from './BufferWriter.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/writers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mks2508/better-logger",
3
- "version": "3.1.0",
3
+ "version": "4.0.0",
4
4
  "type": "module",
5
5
  "description": "Logger avanzado para consola con estilos CSS, temas adaptativos, badges automáticos, SVG, animaciones, CLI integrado y soporte dual browser/terminal con colores ANSI",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mks2508/better-logger-core",
3
- "version": "0.16.0-alpha.1",
3
+ "version": "0.16.1-alpha.1",
4
4
  "type": "module",
5
5
  "description": "Universal core logging functionality for Better Logger - Works in both Node.js and browser environments",
6
6
  "main": "dist/index.cjs",
package/src/Logger.ts CHANGED
@@ -36,7 +36,8 @@ import { TransportManager } from './transports/index.js';
36
36
  import { parseStackTrace } from './utils/stackTrace.js';
37
37
  import { formatTimestamp } from './utils/timestamps.js';
38
38
  import { createStyledOutput, setupThemeChangeListener } from './utils/output.js';
39
- import { getEnvironment } from './utils/environment-detector.js';
39
+ import { getEnvironment, getColorCapability } from './utils/environment-detector.js';
40
+ import { formatBadge } from './terminal/formatter.js';
40
41
 
41
42
  // Styling imports
42
43
  import {
@@ -942,12 +943,8 @@ export class Logger {
942
943
  const groupIndent = ' '.repeat(this.groupDepth);
943
944
  const finalFormat = groupIndent + format;
944
945
 
945
- // Output to console
946
- if (additionalArgs.length > 0) {
947
- console.log(finalFormat, ...styles, ...additionalArgs);
948
- } else {
949
- console.log(finalFormat, ...styles);
950
- }
946
+ // Output via configured writer (console by default)
947
+ this.writeOutput(finalFormat, level, styles, additionalArgs);
951
948
 
952
949
  // Update export handler group info
953
950
  if (this.exportHandler) {
@@ -999,11 +996,13 @@ export class Logger {
999
996
  if (!this.shouldLog(level)) return;
1000
997
 
1001
998
  let prefix = '';
999
+ const colorCapability = getColorCapability();
1000
+
1002
1001
  if (bindings.badges?.length) {
1003
- prefix += bindings.badges.map(b => `[${b}]`).join('');
1002
+ prefix += bindings.badges.map(b => formatBadge(b, 'pill', colorCapability, '#00ff88')).join(' ') + ' ';
1004
1003
  }
1005
1004
  if (bindings.scope) {
1006
- prefix += `[${bindings.scope}] `;
1005
+ prefix += formatBadge(bindings.scope, 'pill', colorCapability, '#00ffff') + ' ';
1007
1006
  }
1008
1007
 
1009
1008
  if (prefix && args.length > 0) {
@@ -1463,6 +1462,49 @@ export class Logger {
1463
1462
  }
1464
1463
  }
1465
1464
 
1465
+ // ===== OUTPUT WRITER SYSTEM =====
1466
+
1467
+ /**
1468
+ * Writes formatted output to the configured destination.
1469
+ * Respects outputMode configuration for console, silent, or custom output.
1470
+ *
1471
+ * @private
1472
+ * @param {string} message - Formatted log message
1473
+ * @param {LogLevel} level - Log level
1474
+ * @param {string[]} styles - CSS styles for browser console
1475
+ * @param {any[]} additionalArgs - Additional arguments to log
1476
+ * @since 4.0.0
1477
+ */
1478
+ private writeOutput(
1479
+ message: string,
1480
+ level: LogLevel,
1481
+ styles: string[],
1482
+ additionalArgs: any[]
1483
+ ): void {
1484
+ const mode = this.config.outputMode ?? 'console';
1485
+
1486
+ // Silent mode: no output
1487
+ if (mode === 'silent') {
1488
+ return;
1489
+ }
1490
+
1491
+ // Custom mode: use configured writer
1492
+ if (mode === 'custom' && this.config.outputWriter) {
1493
+ const fullMessage = additionalArgs.length > 0
1494
+ ? `${message} ${additionalArgs.map(a => String(a)).join(' ')}`
1495
+ : message;
1496
+ this.config.outputWriter.write(fullMessage, level, styles);
1497
+ return;
1498
+ }
1499
+
1500
+ // Default: console output
1501
+ if (additionalArgs.length > 0) {
1502
+ console.log(message, ...styles, ...additionalArgs);
1503
+ } else {
1504
+ console.log(message, ...styles);
1505
+ }
1506
+ }
1507
+
1466
1508
  // ===== CLI SYSTEM =====
1467
1509
 
1468
1510
  /**
package/src/index.ts CHANGED
@@ -371,4 +371,8 @@ export {
371
371
  getEnvironmentInfo,
372
372
  } from './utils/environment-detector.js';
373
373
 
374
- export type { Environment } from './utils/environment-detector.js';
374
+ export type { Environment } from './utils/environment-detector.js';
375
+
376
+ // Output writers for custom log destinations
377
+ export { BufferWriter, type BufferEntry } from './writers/index.js';
378
+ export type { OutputWriter, OutputMode } from './types/core.js';
package/src/types/core.ts CHANGED
@@ -100,6 +100,48 @@ export type ExportFormat = 'json' | 'csv' | 'markdown' | 'plain' | 'html';
100
100
  */
101
101
  export type OutputFormat = 'auto' | 'plain' | 'ansi' | 'build' | 'ci';
102
102
 
103
+ /**
104
+ * Output modes for controlling where logs are written
105
+ * @typedef {'console' | 'silent' | 'custom'} OutputMode
106
+ *
107
+ * @description
108
+ * - console: Standard console.log output (default)
109
+ * - silent: No output at all
110
+ * - custom: Use custom OutputWriter for advanced scenarios
111
+ */
112
+ export type OutputMode = 'console' | 'silent' | 'custom';
113
+
114
+ /**
115
+ * Custom output writer interface for redirecting log output
116
+ *
117
+ * @interface OutputWriter
118
+ * @since 4.0.0
119
+ *
120
+ * @description
121
+ * Allows redirecting log output to custom destinations like:
122
+ * - DraftLog for CLI spinners with concurrent logging
123
+ * - Buffers for collecting logs during operations
124
+ * - Custom streams or transports
125
+ *
126
+ * @example
127
+ * class BufferWriter implements OutputWriter {
128
+ * private buffer: string[] = [];
129
+ *
130
+ * write(message: string, level: LogLevel, styles: string[]): void {
131
+ * this.buffer.push(message);
132
+ * }
133
+ *
134
+ * flush(): void {
135
+ * this.buffer.forEach(msg => console.log(msg));
136
+ * this.buffer = [];
137
+ * }
138
+ * }
139
+ */
140
+ export interface OutputWriter {
141
+ write(message: string, level: LogLevel, styles: string[]): void;
142
+ flush?(): void;
143
+ }
144
+
103
145
  /**
104
146
  * Interfaz de configuración para instancias del logger
105
147
  *
@@ -130,6 +172,10 @@ export interface LoggerConfig {
130
172
  bufferSize?: number;
131
173
  autoDetectTheme?: boolean;
132
174
  outputFormat?: OutputFormat;
175
+ /** Output mode: 'console' (default), 'silent', or 'custom' @since 4.0.0 */
176
+ outputMode?: OutputMode;
177
+ /** Custom writer when outputMode is 'custom' @since 4.0.0 */
178
+ outputWriter?: OutputWriter;
133
179
  }
134
180
 
135
181
  /**
@@ -0,0 +1,157 @@
1
+ /**
2
+ * @fileoverview BufferWriter - Collects log output in memory for later use
3
+ * @version 4.0.0
4
+ */
5
+
6
+ import type { LogLevel, OutputWriter } from '../types/core.js';
7
+
8
+ /**
9
+ * Entry in the log buffer
10
+ */
11
+ export interface BufferEntry {
12
+ message: string;
13
+ level: LogLevel;
14
+ styles: string[];
15
+ timestamp: number;
16
+ }
17
+
18
+ /**
19
+ * BufferWriter collects log messages in memory instead of outputting to console.
20
+ * Useful for:
21
+ * - CLI operations with spinners (buffer logs during spinner, show after)
22
+ * - Testing (capture logs for assertions)
23
+ * - Batch processing (collect logs, process together)
24
+ *
25
+ * @implements {OutputWriter}
26
+ * @since 4.0.0
27
+ *
28
+ * @example
29
+ * import logger, { BufferWriter } from '@mks2508/better-logger';
30
+ *
31
+ * const buffer = new BufferWriter();
32
+ * logger.updateConfig({
33
+ * outputMode: 'custom',
34
+ * outputWriter: buffer
35
+ * });
36
+ *
37
+ * // Logs go to buffer, not console
38
+ * spinner.start('Loading...');
39
+ * logger.info('Connecting...');
40
+ * logger.info('Processing...');
41
+ * spinner.stop();
42
+ *
43
+ * // Show buffered logs
44
+ * logger.updateConfig({ outputMode: 'console' });
45
+ * buffer.flush(); // Outputs all buffered logs to console
46
+ */
47
+ export class BufferWriter implements OutputWriter {
48
+ private buffer: BufferEntry[] = [];
49
+ private maxSize: number;
50
+
51
+ /**
52
+ * Creates a new BufferWriter
53
+ * @param maxSize - Maximum number of entries to buffer (default: 1000)
54
+ */
55
+ constructor(maxSize: number = 1000) {
56
+ this.maxSize = maxSize;
57
+ }
58
+
59
+ /**
60
+ * Writes a log entry to the buffer
61
+ * @param message - Formatted log message
62
+ * @param level - Log level
63
+ * @param styles - CSS styles (for browser console)
64
+ */
65
+ write(message: string, level: LogLevel, styles: string[]): void {
66
+ if (this.buffer.length >= this.maxSize) {
67
+ this.buffer.shift(); // Remove oldest entry
68
+ }
69
+
70
+ this.buffer.push({
71
+ message,
72
+ level,
73
+ styles,
74
+ timestamp: Date.now()
75
+ });
76
+ }
77
+
78
+ /**
79
+ * Returns all buffered entries
80
+ * @returns Copy of the buffer array
81
+ */
82
+ getBuffer(): BufferEntry[] {
83
+ return [...this.buffer];
84
+ }
85
+
86
+ /**
87
+ * Returns buffered entries filtered by log level
88
+ * @param levels - Log levels to include
89
+ * @returns Filtered buffer entries
90
+ */
91
+ getByLevel(...levels: LogLevel[]): BufferEntry[] {
92
+ return this.buffer.filter(entry => levels.includes(entry.level));
93
+ }
94
+
95
+ /**
96
+ * Returns the number of buffered entries
97
+ */
98
+ get size(): number {
99
+ return this.buffer.length;
100
+ }
101
+
102
+ /**
103
+ * Checks if buffer is empty
104
+ */
105
+ get isEmpty(): boolean {
106
+ return this.buffer.length === 0;
107
+ }
108
+
109
+ /**
110
+ * Clears all buffered entries
111
+ */
112
+ clear(): void {
113
+ this.buffer = [];
114
+ }
115
+
116
+ /**
117
+ * Outputs all buffered entries to console and clears the buffer
118
+ */
119
+ flush(): void {
120
+ this.buffer.forEach(entry => {
121
+ if (entry.styles.length > 0) {
122
+ console.log(entry.message, ...entry.styles);
123
+ } else {
124
+ console.log(entry.message);
125
+ }
126
+ });
127
+ this.clear();
128
+ }
129
+
130
+ /**
131
+ * Outputs buffered entries to console without clearing
132
+ */
133
+ replay(): void {
134
+ this.buffer.forEach(entry => {
135
+ if (entry.styles.length > 0) {
136
+ console.log(entry.message, ...entry.styles);
137
+ } else {
138
+ console.log(entry.message);
139
+ }
140
+ });
141
+ }
142
+
143
+ /**
144
+ * Returns all messages as an array of strings
145
+ */
146
+ toArray(): string[] {
147
+ return this.buffer.map(entry => entry.message);
148
+ }
149
+
150
+ /**
151
+ * Returns all messages joined as a single string
152
+ * @param separator - String to join messages with (default: newline)
153
+ */
154
+ toString(separator: string = '\n'): string {
155
+ return this.toArray().join(separator);
156
+ }
157
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @fileoverview Output writers for better-logger
3
+ * @version 4.0.0
4
+ */
5
+
6
+ export { BufferWriter, type BufferEntry } from './BufferWriter.js';