@mks2508/better-logger 4.0.0 → 5.0.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 (183) hide show
  1. package/CHANGELOG.json +67 -1
  2. package/package.json +28 -3
  3. package/packages/core/package.json +1 -1
  4. package/packages/exports/package.json +2 -2
  5. package/packages/styling/package.json +2 -2
  6. package/playground/demo-all.ts +95 -0
  7. package/playground/demo-box.ts +85 -0
  8. package/playground/demo-levels.ts +56 -0
  9. package/playground/demo-real-world.ts +98 -0
  10. package/playground/demo-spinner.ts +77 -0
  11. package/playground/demo-steps.ts +72 -0
  12. package/playground/demo-table.ts +83 -0
  13. package/src/Logger.ts +213 -8
  14. package/src/ScopedLogger.ts +43 -1
  15. package/src/cli-module.ts +21 -0
  16. package/src/cli-primitives/box.ts +86 -0
  17. package/src/cli-primitives/cli-table.ts +62 -0
  18. package/src/cli-primitives/divider.ts +17 -0
  19. package/src/cli-primitives/header.ts +18 -0
  20. package/src/cli-primitives/index.ts +13 -0
  21. package/src/cli-primitives/server-fallback.ts +54 -0
  22. package/src/cli-primitives/spinner.ts +133 -0
  23. package/src/cli-primitives/step.ts +22 -0
  24. package/src/constants.ts +14 -2
  25. package/src/index.ts +18 -1
  26. package/src/terminal/formatter.ts +16 -10
  27. package/src/types/core.ts +53 -0
  28. package/src/types/index.ts +4 -0
  29. package/vite.config.ts +33 -0
  30. package/bun.lock +0 -333
  31. package/dist/Logger.d.ts +0 -863
  32. package/dist/Logger.d.ts.map +0 -1
  33. package/dist/ScopedLogger.d.ts +0 -57
  34. package/dist/ScopedLogger.d.ts.map +0 -1
  35. package/dist/chunks/Logger-D-gmmgR2.js +0 -4458
  36. package/dist/chunks/Logger-D-gmmgR2.js.map +0 -1
  37. package/dist/chunks/Logger-D7cfaz15.js +0 -2
  38. package/dist/chunks/Logger-D7cfaz15.js.map +0 -1
  39. package/dist/chunks/RemoteLogHandler-CjWpWZGl.js +0 -33
  40. package/dist/chunks/RemoteLogHandler-CjWpWZGl.js.map +0 -1
  41. package/dist/chunks/RemoteLogHandler-ymkQ97xl.js +0 -2
  42. package/dist/chunks/RemoteLogHandler-ymkQ97xl.js.map +0 -1
  43. package/dist/chunks/environment-COWvu6Wz.js +0 -1577
  44. package/dist/chunks/environment-COWvu6Wz.js.map +0 -1
  45. package/dist/chunks/environment-C_8J-zQ_.js +0 -4
  46. package/dist/chunks/environment-C_8J-zQ_.js.map +0 -1
  47. package/dist/chunks/formatting-CYjT9yhO.js +0 -380
  48. package/dist/chunks/formatting-CYjT9yhO.js.map +0 -1
  49. package/dist/chunks/formatting-Cg5YhB9Y.js +0 -2
  50. package/dist/chunks/formatting-Cg5YhB9Y.js.map +0 -1
  51. package/dist/cli/CommandProcessor.d.ts +0 -100
  52. package/dist/cli/CommandProcessor.d.ts.map +0 -1
  53. package/dist/cli/commands/ConfigCommand.d.ts +0 -14
  54. package/dist/cli/commands/ConfigCommand.d.ts.map +0 -1
  55. package/dist/cli/commands/ExportCommand.d.ts +0 -48
  56. package/dist/cli/commands/ExportCommand.d.ts.map +0 -1
  57. package/dist/cli/commands/HistoryCommand.d.ts +0 -47
  58. package/dist/cli/commands/HistoryCommand.d.ts.map +0 -1
  59. package/dist/cli/commands/StatusCommand.d.ts +0 -30
  60. package/dist/cli/commands/StatusCommand.d.ts.map +0 -1
  61. package/dist/cli/commands/ThemeCommand.d.ts +0 -30
  62. package/dist/cli/commands/ThemeCommand.d.ts.map +0 -1
  63. package/dist/cli/help.d.ts +0 -12
  64. package/dist/cli/help.d.ts.map +0 -1
  65. package/dist/cli/index.d.ts +0 -15
  66. package/dist/cli/index.d.ts.map +0 -1
  67. package/dist/constants.d.ts +0 -227
  68. package/dist/constants.d.ts.map +0 -1
  69. package/dist/core.cjs +0 -2
  70. package/dist/core.cjs.map +0 -1
  71. package/dist/core.d.ts +0 -127
  72. package/dist/core.d.ts.map +0 -1
  73. package/dist/core.js +0 -291
  74. package/dist/core.js.map +0 -1
  75. package/dist/example.d.ts +0 -18
  76. package/dist/example.d.ts.map +0 -1
  77. package/dist/exports-module.d.ts +0 -196
  78. package/dist/exports-module.d.ts.map +0 -1
  79. package/dist/exports.cjs +0 -2
  80. package/dist/exports.cjs.map +0 -1
  81. package/dist/exports.js +0 -238
  82. package/dist/exports.js.map +0 -1
  83. package/dist/handlers/AnalyticsLogHandler.d.ts +0 -8
  84. package/dist/handlers/AnalyticsLogHandler.d.ts.map +0 -1
  85. package/dist/handlers/ExportLogHandler.d.ts +0 -100
  86. package/dist/handlers/ExportLogHandler.d.ts.map +0 -1
  87. package/dist/handlers/FileLogHandler.d.ts +0 -33
  88. package/dist/handlers/FileLogHandler.d.ts.map +0 -1
  89. package/dist/handlers/RemoteLogHandler.d.ts +0 -11
  90. package/dist/handlers/RemoteLogHandler.d.ts.map +0 -1
  91. package/dist/handlers/index.d.ts +0 -8
  92. package/dist/handlers/index.d.ts.map +0 -1
  93. package/dist/hooks/HookManager.d.ts +0 -21
  94. package/dist/hooks/HookManager.d.ts.map +0 -1
  95. package/dist/hooks/index.d.ts +0 -2
  96. package/dist/hooks/index.d.ts.map +0 -1
  97. package/dist/index.cjs +0 -2
  98. package/dist/index.cjs.map +0 -1
  99. package/dist/index.d.ts +0 -153
  100. package/dist/index.d.ts.map +0 -1
  101. package/dist/index.js +0 -609
  102. package/dist/index.js.map +0 -1
  103. package/dist/main.d.ts +0 -2
  104. package/dist/main.d.ts.map +0 -1
  105. package/dist/serializers/SerializerRegistry.d.ts +0 -16
  106. package/dist/serializers/SerializerRegistry.d.ts.map +0 -1
  107. package/dist/serializers/index.d.ts +0 -2
  108. package/dist/serializers/index.d.ts.map +0 -1
  109. package/dist/styling/LogStyleBuilder.d.ts +0 -146
  110. package/dist/styling/LogStyleBuilder.d.ts.map +0 -1
  111. package/dist/styling/SemanticStyles.d.ts +0 -178
  112. package/dist/styling/SemanticStyles.d.ts.map +0 -1
  113. package/dist/styling/SmartPresets.d.ts +0 -22
  114. package/dist/styling/SmartPresets.d.ts.map +0 -1
  115. package/dist/styling/StyleBuilder.d.ts +0 -140
  116. package/dist/styling/StyleBuilder.d.ts.map +0 -1
  117. package/dist/styling/StyleCache.d.ts +0 -42
  118. package/dist/styling/StyleCache.d.ts.map +0 -1
  119. package/dist/styling/banners.d.ts +0 -42
  120. package/dist/styling/banners.d.ts.map +0 -1
  121. package/dist/styling/index.d.ts +0 -10
  122. package/dist/styling/index.d.ts.map +0 -1
  123. package/dist/styling/themes.d.ts +0 -7
  124. package/dist/styling/themes.d.ts.map +0 -1
  125. package/dist/styling-module.d.ts +0 -178
  126. package/dist/styling-module.d.ts.map +0 -1
  127. package/dist/styling.cjs +0 -2
  128. package/dist/styling.cjs.map +0 -1
  129. package/dist/styling.js +0 -146
  130. package/dist/styling.js.map +0 -1
  131. package/dist/terminal/color-converter.d.ts +0 -73
  132. package/dist/terminal/color-converter.d.ts.map +0 -1
  133. package/dist/terminal/formatter.d.ts +0 -20
  134. package/dist/terminal/formatter.d.ts.map +0 -1
  135. package/dist/terminal/terminal-renderer.d.ts +0 -77
  136. package/dist/terminal/terminal-renderer.d.ts.map +0 -1
  137. package/dist/transports/ConsoleTransport.d.ts +0 -9
  138. package/dist/transports/ConsoleTransport.d.ts.map +0 -1
  139. package/dist/transports/FileTransport.d.ts +0 -15
  140. package/dist/transports/FileTransport.d.ts.map +0 -1
  141. package/dist/transports/HttpTransport.d.ts +0 -16
  142. package/dist/transports/HttpTransport.d.ts.map +0 -1
  143. package/dist/transports/TransportManager.d.ts +0 -14
  144. package/dist/transports/TransportManager.d.ts.map +0 -1
  145. package/dist/transports/index.d.ts +0 -5
  146. package/dist/transports/index.d.ts.map +0 -1
  147. package/dist/types/core.d.ts +0 -333
  148. package/dist/types/core.d.ts.map +0 -1
  149. package/dist/types/handlers.d.ts +0 -85
  150. package/dist/types/handlers.d.ts.map +0 -1
  151. package/dist/types/hooks.d.ts +0 -36
  152. package/dist/types/hooks.d.ts.map +0 -1
  153. package/dist/types/index.d.ts +0 -11
  154. package/dist/types/index.d.ts.map +0 -1
  155. package/dist/types/serializers.d.ts +0 -25
  156. package/dist/types/serializers.d.ts.map +0 -1
  157. package/dist/types/transports.d.ts +0 -47
  158. package/dist/types/transports.d.ts.map +0 -1
  159. package/dist/utils/adapter.d.ts +0 -48
  160. package/dist/utils/adapter.d.ts.map +0 -1
  161. package/dist/utils/ansi-colors.d.ts +0 -156
  162. package/dist/utils/ansi-colors.d.ts.map +0 -1
  163. package/dist/utils/environment-detector.d.ts +0 -45
  164. package/dist/utils/environment-detector.d.ts.map +0 -1
  165. package/dist/utils/environment.d.ts +0 -47
  166. package/dist/utils/environment.d.ts.map +0 -1
  167. package/dist/utils/formatting.d.ts +0 -58
  168. package/dist/utils/formatting.d.ts.map +0 -1
  169. package/dist/utils/index.d.ts +0 -8
  170. package/dist/utils/index.d.ts.map +0 -1
  171. package/dist/utils/opentui-detection.d.ts +0 -34
  172. package/dist/utils/opentui-detection.d.ts.map +0 -1
  173. package/dist/utils/output.d.ts +0 -46
  174. package/dist/utils/output.d.ts.map +0 -1
  175. package/dist/utils/stackTrace.d.ts +0 -6
  176. package/dist/utils/stackTrace.d.ts.map +0 -1
  177. package/dist/utils/timestamps.d.ts +0 -20
  178. package/dist/utils/timestamps.d.ts.map +0 -1
  179. package/dist/vite.svg +0 -1
  180. package/dist/writers/BufferWriter.d.ts +0 -96
  181. package/dist/writers/BufferWriter.d.ts.map +0 -1
  182. package/dist/writers/index.d.ts +0 -6
  183. package/dist/writers/index.d.ts.map +0 -1
@@ -0,0 +1,133 @@
1
+ /**
2
+ * @fileoverview Built-in spinner implementation for CLI primitives
3
+ * @since 5.0.0
4
+ */
5
+
6
+ import type { ISpinnerHandle, LoggerConfig } from '../types/core.js';
7
+ import type { Logger } from '../Logger.js';
8
+ import { ANSI } from '../terminal/color-converter.js';
9
+
10
+ /** Braille-based spinner animation frames */
11
+ const SPINNER_FRAMES = ['\u280b', '\u2819', '\u2839', '\u2838', '\u283c', '\u2834', '\u2826', '\u2827', '\u2807', '\u280f'];
12
+
13
+ /** Spinner frame interval in milliseconds */
14
+ const FRAME_INTERVAL = 80;
15
+
16
+ /**
17
+ * Interactive terminal spinner with in-place line updates.
18
+ * Writes to stderr to avoid polluting piped stdout.
19
+ *
20
+ * @implements {ISpinnerHandle}
21
+ * @since 5.0.0
22
+ */
23
+ export class SpinnerManager implements ISpinnerHandle {
24
+ private message: string;
25
+ private frameIndex = 0;
26
+ private interval: ReturnType<typeof setInterval> | null = null;
27
+ private _logger: Logger;
28
+
29
+ constructor(message: string, _config: LoggerConfig, logger: Logger) {
30
+ this.message = message;
31
+ this._logger = logger;
32
+ }
33
+
34
+ /** Start the spinner animation */
35
+ start(): void {
36
+ if (this.interval) return; // Already running
37
+
38
+ // Switch logger to buffer mode to prevent garbled output
39
+ this._logger.updateConfig({ outputMode: 'silent' });
40
+
41
+ this.frameIndex = 0;
42
+ this.render();
43
+ this.interval = setInterval(() => {
44
+ this.frameIndex = (this.frameIndex + 1) % SPINNER_FRAMES.length;
45
+ this.render();
46
+ }, FRAME_INTERVAL);
47
+ }
48
+
49
+ /** Stop the spinner without a status message */
50
+ stop(): void {
51
+ this.clearInterval();
52
+ this.clearLine();
53
+ // Restore logger output
54
+ this._logger.updateConfig({ outputMode: 'console' });
55
+ }
56
+
57
+ /** Stop with a success indicator */
58
+ succeed(msg?: string): void {
59
+ this.clearInterval();
60
+ this.clearLine();
61
+ const text = msg ?? this.message;
62
+ process.stderr.write(` ${ANSI.fg.green}\u2713${ANSI.reset} ${text}\n`);
63
+ this._logger.updateConfig({ outputMode: 'console' });
64
+ }
65
+
66
+ /** Stop with a failure indicator */
67
+ fail(msg?: string): void {
68
+ this.clearInterval();
69
+ this.clearLine();
70
+ const text = msg ?? this.message;
71
+ process.stderr.write(` ${ANSI.fg.red}\u2717${ANSI.reset} ${text}\n`);
72
+ this._logger.updateConfig({ outputMode: 'console' });
73
+ }
74
+
75
+ /** Update the spinner text while running */
76
+ text(msg: string): void {
77
+ this.message = msg;
78
+ }
79
+
80
+ private render(): void {
81
+ const frame = SPINNER_FRAMES[this.frameIndex] ?? SPINNER_FRAMES[0];
82
+ const line = ` ${ANSI.fg.cyan}${frame}${ANSI.reset} ${this.message}`;
83
+ process.stderr.write(`\r\x1b[K${line}`);
84
+ }
85
+
86
+ private clearLine(): void {
87
+ process.stderr.write('\r\x1b[K');
88
+ }
89
+
90
+ private clearInterval(): void {
91
+ if (this.interval) {
92
+ clearInterval(this.interval);
93
+ this.interval = null;
94
+ }
95
+ }
96
+ }
97
+
98
+ /**
99
+ * No-op spinner for non-TTY environments or silent mode.
100
+ * Logs start/succeed/fail as plain log messages.
101
+ *
102
+ * @implements {ISpinnerHandle}
103
+ * @since 5.0.0
104
+ */
105
+ export class NoopSpinner implements ISpinnerHandle {
106
+ private message: string;
107
+ private _logger: Logger;
108
+
109
+ constructor(message: string, logger: Logger) {
110
+ this.message = message;
111
+ this._logger = logger;
112
+ }
113
+
114
+ start(): void {
115
+ this._logger.info(this.message);
116
+ }
117
+
118
+ stop(): void {
119
+ // No-op
120
+ }
121
+
122
+ succeed(msg?: string): void {
123
+ this._logger.success(msg ?? this.message);
124
+ }
125
+
126
+ fail(msg?: string): void {
127
+ this._logger.error(msg ?? this.message);
128
+ }
129
+
130
+ text(msg: string): void {
131
+ this.message = msg;
132
+ }
133
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @fileoverview Step progress renderer for CLI primitives
3
+ * @since 5.0.0
4
+ */
5
+
6
+ import { getANSIForeground, ANSI, type ColorCapability } from '../terminal/color-converter.js';
7
+
8
+ /**
9
+ * Renders a step progress indicator like ` [2/5] Analyzing repository...`
10
+ * @param current - Current step number
11
+ * @param total - Total number of steps
12
+ * @param msg - Step description message
13
+ * @param colorCap - Terminal color capability
14
+ * @returns Formatted step string
15
+ */
16
+ export function renderStep(current: number, total: number, msg: string, colorCap: ColorCapability): string {
17
+ const label = `[${current}/${total}]`;
18
+ const colored = colorCap !== 'none'
19
+ ? getANSIForeground('#00bcd4', colorCap) + ANSI.bold + label + ANSI.reset
20
+ : label;
21
+ return ` ${colored} ${msg}`;
22
+ }
package/src/constants.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  * @fileoverview Global constants for Advanced Logger
3
3
  */
4
4
 
5
- import type { LogLevel, AdaptiveColors } from './types/index.js';
5
+ import type { LogLevel, AdaptiveColors, CLILogLevel, Verbosity } from './types/index.js';
6
6
  import type { LevelStyleConfig } from './utils/index.js';
7
7
 
8
8
  /**
@@ -298,4 +298,16 @@ export function getOptimalConfig() {
298
298
  ...DEFAULT_CONFIG,
299
299
  ...BUILD_PRESETS[preset]
300
300
  };
301
- }
301
+ }
302
+
303
+ /**
304
+ * CLI log level to internal verbosity mapping
305
+ * @since 5.0.0
306
+ */
307
+ export const CLI_LEVEL_MAP: Record<CLILogLevel, { verbosity: Verbosity; showPrimitives: boolean }> = {
308
+ silent: { verbosity: 'silent', showPrimitives: false },
309
+ quiet: { verbosity: 'error', showPrimitives: false },
310
+ normal: { verbosity: 'info', showPrimitives: true },
311
+ verbose: { verbosity: 'debug', showPrimitives: true },
312
+ debug: { verbosity: 'debug', showPrimitives: true },
313
+ } as const;
package/src/index.ts CHANGED
@@ -18,7 +18,10 @@ import type {
18
18
  ThemeVariant,
19
19
  BannerType,
20
20
  StyleOptions,
21
- ILogHandler
21
+ ILogHandler,
22
+ CLILogLevel,
23
+ IBoxOptions,
24
+ ITableOptions,
22
25
  } from './types/index.js';
23
26
 
24
27
  // Lazy singleton - se inicializa solo cuando se necesita
@@ -115,6 +118,16 @@ export const logAnimated = (message: string, duration?: number) =>
115
118
  getLogger().logAnimated(message, duration);
116
119
  export const cli = (command: string) => getLogger().cli(command);
117
120
 
121
+ // CLI Primitives (v5.0)
122
+ export const step = (current: number, total: number, message: string) => getLogger().step(current, total, message);
123
+ export const spinner = (message: string) => getLogger().spinner(message);
124
+ export const box = (content: string, options?: IBoxOptions) => getLogger().box(content, options);
125
+ export const cliTable = (rows: Record<string, unknown>[], options?: ITableOptions) => getLogger().cliTable(rows, options);
126
+ export const header = (title: string, subtitle?: string) => getLogger().header(title, subtitle);
127
+ export const divider = () => getLogger().divider();
128
+ export const blank = () => getLogger().blank();
129
+ export const setCLILevel = (level: CLILogLevel) => getLogger().setCLILevel(level);
130
+
118
131
  // Type exports
119
132
  export type {
120
133
  LogLevel,
@@ -152,6 +165,10 @@ export type {
152
165
  ColumnAlign,
153
166
  ColumnConfig,
154
167
  LogOptions,
168
+ CLILogLevel,
169
+ ISpinnerHandle,
170
+ IBoxOptions,
171
+ ITableOptions,
155
172
  } from './types/index.js';
156
173
 
157
174
  // Styling utilities
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import { getTerminalWidth } from '../utils/environment-detector.js';
6
- import { getANSIForeground, ANSI, type ColorCapability } from './color-converter.js';
6
+ import { getANSIForeground, getANSIBackground, ANSI, type ColorCapability } from './color-converter.js';
7
7
  import type { ColumnConfig, ColumnAlign, BadgeStyle, TimestampFormat, LogOptions } from '../types/index.js';
8
8
 
9
9
  export function stripAnsi(str: string): string {
@@ -137,26 +137,32 @@ export function formatBadge(
137
137
  colorCapability: ColorCapability = 'full',
138
138
  color?: string
139
139
  ): string {
140
- const colorCode = color && colorCapability !== 'none'
141
- ? getANSIForeground(color, colorCapability)
142
- : '';
143
140
  const reset = colorCapability !== 'none' ? ANSI.reset : '';
144
- const bgBlack = colorCapability !== 'none' ? ANSI.bg.black : '';
145
141
 
146
142
  const text = badge.toUpperCase();
147
143
 
148
144
  switch (style) {
149
145
  case 'rounded':
150
- return `${bgBlack}${colorCode}⟨${text}⟩${reset}`;
146
+ const colorCode1 = color && colorCapability !== 'none' ? getANSIForeground(color, colorCapability) : '';
147
+ const bgBlack1 = colorCapability !== 'none' ? ANSI.bg.black : '';
148
+ return `${bgBlack1}${colorCode1}⟨${text}⟩${reset}`;
151
149
  case 'plain':
152
- return `${colorCode}${text}${reset}`;
150
+ const colorCode2 = color && colorCapability !== 'none' ? getANSIForeground(color, colorCapability) : '';
151
+ return `${colorCode2}${text}${reset}`;
153
152
  case 'unicode':
154
- return `${bgBlack}${colorCode}╭${text}╮${reset}`;
153
+ const colorCode3 = color && colorCapability !== 'none' ? getANSIForeground(color, colorCapability) : '';
154
+ const bgBlack3 = colorCapability !== 'none' ? ANSI.bg.black : '';
155
+ return `${bgBlack3}${colorCode3}╭${text}╮${reset}`;
155
156
  case 'pill':
156
- return `${bgBlack}${colorCode}⦗${text}⦘${reset}`;
157
+ // Badge con background de color y texto blanco/negro
158
+ const bgColor = color && colorCapability !== 'none' ? getANSIBackground(color, colorCapability) : '';
159
+ const fgColor = colorCapability !== 'none' ? getANSIForeground('#000000', colorCapability) : '';
160
+ return `${bgColor}${fgColor}[${text}]${reset}`;
157
161
  case 'brackets':
158
162
  default:
159
- return `${bgBlack}${colorCode}[${text}]${reset}`;
163
+ const colorCode5 = color && colorCapability !== 'none' ? getANSIForeground(color, colorCapability) : '';
164
+ const bgBlack5 = colorCapability !== 'none' ? ANSI.bg.black : '';
165
+ return `${bgBlack5}${colorCode5}[${text}]${reset}`;
160
166
  }
161
167
  }
162
168
 
package/src/types/core.ts CHANGED
@@ -176,6 +176,8 @@ export interface LoggerConfig {
176
176
  outputMode?: OutputMode;
177
177
  /** Custom writer when outputMode is 'custom' @since 4.0.0 */
178
178
  outputWriter?: OutputWriter;
179
+ /** CLI verbosity level for controlling primitive output @since 5.0.0 */
180
+ cliLevel?: CLILogLevel;
179
181
  }
180
182
 
181
183
  /**
@@ -361,4 +363,55 @@ export interface LogOptions {
361
363
  keyValue?: boolean;
362
364
  badgeStyle?: BadgeStyle;
363
365
  timestampFormat?: TimestampFormat;
366
+ }
367
+
368
+ // ===== CLI PRIMITIVES (v5.0) =====
369
+
370
+ /**
371
+ * CLI verbosity levels for controlling primitive output
372
+ * @since 5.0.0
373
+ */
374
+ export type CLILogLevel = 'silent' | 'quiet' | 'normal' | 'verbose' | 'debug';
375
+
376
+ /**
377
+ * Handle returned by logger.spinner() for controlling spinner lifecycle
378
+ * @since 5.0.0
379
+ */
380
+ export interface ISpinnerHandle {
381
+ /** Start the spinner animation */
382
+ start(): void;
383
+ /** Stop the spinner without a status message */
384
+ stop(): void;
385
+ /** Stop the spinner with a success message */
386
+ succeed(msg?: string): void;
387
+ /** Stop the spinner with a failure message */
388
+ fail(msg?: string): void;
389
+ /** Update the spinner text while running */
390
+ text(msg: string): void;
391
+ }
392
+
393
+ /**
394
+ * Options for logger.box() output
395
+ * @since 5.0.0
396
+ */
397
+ export interface IBoxOptions {
398
+ /** Title displayed in the top border */
399
+ title?: string;
400
+ /** Color of the border (hex, CSS name, or ANSI name) */
401
+ borderColor?: string;
402
+ /** Border character style */
403
+ borderStyle?: 'single' | 'double' | 'rounded' | 'bold';
404
+ /** Inner padding lines (default: 0) */
405
+ padding?: number;
406
+ }
407
+
408
+ /**
409
+ * Options for logger.cliTable() output
410
+ * @since 5.0.0
411
+ */
412
+ export interface ITableOptions {
413
+ /** Column names to display (overrides auto-detection) */
414
+ columns?: string[];
415
+ /** Header labels (defaults to column names) */
416
+ head?: string[];
364
417
  }
@@ -30,6 +30,10 @@ export type {
30
30
  ColumnAlign,
31
31
  ColumnConfig,
32
32
  LogOptions,
33
+ CLILogLevel,
34
+ ISpinnerHandle,
35
+ IBoxOptions,
36
+ ITableOptions,
33
37
  } from './core.js';
34
38
 
35
39
  export { LOG_LEVELS } from './core.js';
package/vite.config.ts CHANGED
@@ -57,6 +57,7 @@ const buildConfigs = {
57
57
  entry: {
58
58
  index: resolve(__dirname, 'src/index.ts'),
59
59
  core: resolve(__dirname, 'src/core.ts'),
60
+ cli: resolve(__dirname, 'src/cli-module.ts'),
60
61
  styling: resolve(__dirname, 'src/styling-module.ts'),
61
62
  exports: resolve(__dirname, 'src/exports-module.ts')
62
63
  },
@@ -210,6 +211,38 @@ const buildConfigs = {
210
211
  }
211
212
  }
212
213
  }
214
+ },
215
+
216
+ // Build modular - Solo CLI primitives (spinners, boxes, tables, steps)
217
+ cli: {
218
+ ...baseConfig,
219
+ plugins: [
220
+ dts({
221
+ ...baseConfig.plugins[0].options,
222
+ outDir: 'packages/cli/dist/types',
223
+ include: ['src/cli-module.ts', 'src/cli-primitives/**/*', 'src/types/**/*', 'src/terminal/**/*', 'src/utils/environment-detector.ts'],
224
+ })
225
+ ],
226
+ build: {
227
+ ...baseConfig.build,
228
+ outDir: 'packages/cli/dist',
229
+ lib: {
230
+ entry: resolve(__dirname, 'src/cli-module.ts'),
231
+ name: 'BetterLoggerCLI',
232
+ formats: ['es', 'cjs'],
233
+ fileName: (format) => {
234
+ const ext = format === 'cjs' ? 'cjs' : 'js';
235
+ return `index.${ext}`;
236
+ }
237
+ },
238
+ rollupOptions: {
239
+ external: [],
240
+ output: {
241
+ globals: {},
242
+ exports: 'named'
243
+ }
244
+ }
245
+ }
213
246
  }
214
247
  };
215
248