@node-cli/logger 1.3.0 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,249 +1,384 @@
1
- # Node CLI Logger
1
+ # @node-cli/logger
2
2
 
3
3
  ![npm](https://img.shields.io/npm/v/@node-cli/logger?label=version&logo=npm)
4
4
 
5
- > Logger is a dead-simple console logger for nodejs command-line applications.
5
+ > A powerful, flexible console logger for Node.js command-line applications with rich formatting options and in-memory logging capabilities.
6
6
 
7
7
  ## Installation
8
8
 
9
9
  ```sh
10
- > cd your-project
11
- > npm install --save-dev @node-cli/logger
10
+ npm install --save-dev @node-cli/logger
12
11
  ```
13
12
 
14
- 2 classes are available:
13
+ ## Overview
15
14
 
16
- - `Logger` which is a facade for `console` and with added methods, such as `printBox()`
17
- - `Spinner` is an "elegant terminal spinner", relying behind the scenes on the excellent [ora](https://github.com/sindresorhus/ora)
15
+ `@node-cli/logger` provides two main classes:
18
16
 
19
- ## Usage
17
+ - **`Logger`**: A versatile console logger with enhanced formatting, colors, and utility methods
18
+ - **`Spinner`**: An elegant terminal spinner for displaying progress, based on [ora](https://github.com/sindresorhus/ora)
19
+
20
+ ## Basic Usage
21
+
22
+ ### Logger
20
23
 
21
24
  ```js
22
25
  import { Logger } from "@node-cli/logger";
26
+
27
+ // Create a new logger instance
23
28
  const log = new Logger();
24
29
 
25
- log.info("this is an informational log");
26
- log.warn("this is a warning log");
27
- log.error("this is an error log");
30
+ // Basic logging methods
31
+ log.info("This is an informational message");
32
+ log.warn("This is a warning message");
33
+ log.error("This is an error message");
34
+ log.debug("This is a debug message");
35
+ log.log("This is a standard log message");
28
36
  ```
29
37
 
38
+ ### Spinner
39
+
30
40
  ```js
31
41
  import { Spinner } from "@node-cli/logger";
32
- const spinner = new Spinner("Updating package.json...");
33
-
34
- // assuming a long running process here...
35
- spinner.text = "Git stage and commit, please wait...";
36
- // assuming a long running process here...
37
- spinner.text = "Almost there...";
38
- // assuming a long running process here... returning some result
39
- if (result === "success") {
40
- spinner.stop("Process completed successfully!");
41
- } else {
42
- spinner.stop("Process failed miserably...", Spinner.ERROR);
43
- }
44
- ```
45
-
46
- ## API
47
42
 
48
- ### Spinner methods
43
+ // Create a new spinner with initial text
44
+ const spinner = new Spinner("Processing files...");
49
45
 
50
- | Method | Arguments | Description |
51
- | ----------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
52
- | constructor | options | Initialize a Spinner instance with [ora](https://github.com/sindresorhus/ora) options |
53
- | start | text | Starts the spinner on the terminal and append a string to it |
54
- | stop | text, status | Stop the spinner, change it to a green, red, yellow or blue marker, and persist the current text, or text if provided. The argument `status` can be one of `Spinner.SUCCESS`, `Spinner.ERROR`, `Spinner.WARNING` or `Spinner.INFO` |
46
+ // Start the spinner
47
+ spinner.start();
55
48
 
56
- | Setter | Description |
57
- | ------ | ----------------------------------------------------------------------------------- |
58
- | text | Set the text of the spinner. If the spinner is stopped, the text will be persisted. |
49
+ // Update the spinner text during a long-running process
50
+ spinner.text = "Analyzing data...";
59
51
 
60
- ### Logger methods
52
+ // Complete the spinner with different statuses
53
+ spinner.stop("Process completed successfully!"); // Success (default)
54
+ // or
55
+ spinner.stop("Process failed!", Spinner.ERROR); // Error
56
+ // or
57
+ spinner.stop("Process needs attention", Spinner.WARNING); // Warning
58
+ // or
59
+ spinner.stop("Process information", Spinner.INFO); // Info
60
+ ```
61
61
 
62
- Logger relies on `console` behind the scenes, and therefore supports the same [string substitution](https://developer.mozilla.org/en-US/docs/Web/API/console#Using_string_substitutions) capabilities and uses the following methods:
62
+ ## Advanced Logger Examples
63
63
 
64
- | Method | Description | Output color |
65
- | ------------------ | --------------------------------------------------------- | ------------ |
66
- | debug | Outputs a message to the console with the log level debug | grey |
67
- | log | For general output of logging information. | white |
68
- | info | Informative logging of information. | blue |
69
- | warn | Outputs a message to the console with the log level debug | yellow |
70
- | error | Outputs an error message. | red |
71
- | printBox | Output message(s) in a box | custom |
72
- | printErrorsAndExit | Output error message(s) and exit | red |
64
+ ### Customizing Logger Output
73
65
 
74
- ### Options
66
+ ```js
67
+ // Initialize with options
68
+ const log = new Logger({
69
+ boring: false, // Enable colors (default)
70
+ silent: false, // Enable logging (default)
71
+ prefix: "MyApp:", // Add a prefix to all logs
72
+ timestamp: true, // Add timestamps to logs
73
+ inMemory: false // Log to console (default)
74
+ });
75
75
 
76
- #### Disabling logging
76
+ // Log with different levels
77
+ log.info("Starting application...");
78
+ log.debug("Debug information");
79
+ log.warn("Warning: configuration file not found");
80
+ log.error("Error: failed to connect to database");
81
+
82
+ // Output:
83
+ // MyApp: [ Tue Mar 18 2025 10:30:00 AM ] Starting application...
84
+ // MyApp: [ Tue Mar 18 2025 10:30:01 AM ] Debug information
85
+ // MyApp: [ Tue Mar 18 2025 10:30:02 AM ] Warning: configuration file not found
86
+ // MyApp: [ Tue Mar 18 2025 10:30:03 AM ] Error: failed to connect to database
87
+ ```
77
88
 
78
- You can disable logging with `silent`:
89
+ ### Dynamic Configuration
79
90
 
80
91
  ```js
81
- import { Logger } from "@node-cli/logger";
82
92
  const log = new Logger();
83
93
 
84
- log.info("this will be logged");
85
- // disabling logs in production for example
86
- log.silent = process.env.NODE_ENV === "production";
87
- log.info("but this will not");
88
- log.silent = false;
89
- log.info("this will be logged again!");
90
- ```
94
+ // Change configuration at runtime
95
+ log.info("Normal colored output");
91
96
 
92
- This option can also be passed to the constructor:
97
+ // Disable colors for test environments
98
+ log.boring = process.env.NODE_ENV === "test";
99
+ log.info("No colors in test environment");
93
100
 
94
- ```js
95
- import { Logger } from "@node-cli/logger";
96
- const log = new Logger({ silent: true });
101
+ // Add a prefix for specific sections
102
+ log.prefix = "[CONFIG]";
103
+ log.info("Loading configuration..."); // Output: [CONFIG] Loading configuration...
97
104
 
98
- log.info("this will not be logged");
105
+ // Add timestamps for debugging
106
+ log.timestamp = true;
107
+ log.debug("Detailed timing information"); // Output: [CONFIG] [ Tue Mar 18 2025 10:30:00 AM ] Detailed timing information
108
+
109
+ // Silence logs temporarily
110
+ log.silent = true;
111
+ log.info("This won't be displayed");
112
+
113
+ // Re-enable logs
99
114
  log.silent = false;
100
- log.info("this will be logged again!");
115
+ log.info("Logging resumed");
101
116
  ```
102
117
 
103
- ### Disabling colors
104
-
105
- You can disable colors with `boring`:
118
+ ### Printing Messages in a Box
106
119
 
107
120
  ```js
108
- import { Logger } from "@node-cli/logger";
109
- const log = new Logger();
110
-
111
- log.info("this will be logged in the default [info] color");
112
- // disabling colors in test mode for example
113
- log.boring = process.env.NODE_ENV === "test";
114
- log.info("but this will not have any colors :/");
115
- log.boring = false;
116
- log.info("colors are back!");
121
+ // Simple box with default options
122
+ log.printBox("Important Message");
123
+ /*
124
+ ┌─────────────────────┐
125
+ │ │
126
+ │ Important Message │
127
+ │ │
128
+ └─────────────────────┘
129
+ */
130
+
131
+ // Multiple messages in a box
132
+ log.printBox(["Welcome to MyApp v1.2.3", "Copyright © 2025"]);
133
+ /*
134
+ ┌──────────────────────────┐
135
+ │ │
136
+ │ Welcome to MyApp v1.2.3 │
137
+ │ Copyright © 2025 │
138
+ │ │
139
+ └──────────────────────────┘
140
+ */
141
+
142
+ // Customized box
143
+ log.printBox("WARNING: Disk space low", {
144
+ borderColor: "red",
145
+ padding: 2,
146
+ textAlignment: "center",
147
+ title: "System Alert",
148
+ newLineAfter: true,
149
+ newLineBefore: true
150
+ });
151
+ /*
152
+ ┌─ System Alert ───────────────┐
153
+ │ │
154
+ │ │
155
+ │ WARNING: Disk space low │
156
+ │ │
157
+ │ │
158
+ └──────────────────────────────┘
159
+ */
117
160
  ```
118
161
 
119
- This option can also be passed to the constructor:
162
+ ### Error Handling and Process Exit
120
163
 
121
164
  ```js
122
- import { Logger } from "@node-cli/logger";
123
- const log = new Logger({ boring: true });
124
-
125
- log.info("this will not be logged in color");
126
- log.boring = false;
127
- log.info("this will be logged again!");
165
+ // Display multiple errors and exit the process
166
+ const errors = [
167
+ "Failed to connect to database",
168
+ "Configuration file is invalid",
169
+ "Required environment variables missing"
170
+ ];
171
+
172
+ // Display errors and exit with code 1
173
+ log.printErrorsAndExit(errors, 1);
174
+
175
+ // Or just display errors without exiting
176
+ log.printErrorsAndExit(errors);
128
177
  ```
129
178
 
130
- ### Adding a prefix
131
-
132
- You can add a prefix to the logs with `prefix`:
179
+ ### In-Memory Logging
133
180
 
134
181
  ```js
135
- import { Logger } from "@node-cli/logger";
182
+ // Create a logger that stores logs in memory instead of console
183
+ const memoryLogger = new Logger({ inMemory: true });
184
+
185
+ // Log messages that are stored in memory
186
+ memoryLogger.info("Starting process");
187
+ memoryLogger.warn("Resource usage high");
188
+ memoryLogger.error("Process failed");
189
+
190
+ // Retrieve all logs as a string
191
+ const logs = memoryLogger.getMemoryLogs();
192
+ console.log(logs);
193
+ // Output:
194
+ // Starting process
195
+ // Resource usage high
196
+ // Process failed
197
+
198
+ // Clear memory logs when no longer needed
199
+ memoryLogger.clearMemoryLogs();
200
+
201
+ // Toggle between console and memory logging
136
202
  const log = new Logger();
203
+ log.info("This goes to console");
137
204
 
138
- log.info("this will be logged with no prefix");
139
- log.prefix = "[INFO]";
140
- log.info("this will have a prefix!");
141
- ```
205
+ log.inMemory = true;
206
+ log.info("This goes to memory only");
142
207
 
143
- The output of that last line would be:
208
+ // Get only the in-memory logs
209
+ const memLogs = log.getMemoryLogs(); // Contains only "This goes to memory only"
144
210
 
145
- ```sh
146
- > [INFO] this will have a prefix!
211
+ log.inMemory = false;
212
+ log.info("Back to console logging");
147
213
  ```
148
214
 
149
- This option can also be passed to the constructor:
215
+ ## Advanced Spinner Examples
216
+
217
+ ### Spinner with Custom Options
150
218
 
151
219
  ```js
152
- import { Logger } from "@node-cli/logger";
153
- const log = new Logger({ prefix: "Log:" });
220
+ // Create a spinner with custom options
221
+ const spinner = new Spinner({
222
+ text: "Processing...",
223
+ color: "blue",
224
+ spinner: "dots" // Use the 'dots' spinner pattern
225
+ });
154
226
 
155
- log.info("this will be logged with a prefix");
156
- log.prefix = false;
157
- log.info("this will be NOT be logged with a prefix");
227
+ spinner.start();
158
228
  ```
159
229
 
160
- ### Adding a local timestamp
161
-
162
- You can add a timestamp to the logs with `timestamp`:
230
+ ### Spinner in Async Functions
163
231
 
164
232
  ```js
165
- import { Logger } from "@node-cli/logger";
166
- const log = new Logger();
233
+ import { Spinner } from "@node-cli/logger";
167
234
 
168
- log.info("this will be logged with no timestamp");
169
- log.timestamp = true;
170
- log.info("this will have a timestamp!");
235
+ async function deployApplication() {
236
+ const spinner = new Spinner("Preparing deployment...");
237
+ spinner.start();
238
+
239
+ try {
240
+ // Building phase
241
+ spinner.text = "Building application...";
242
+ await buildApp();
243
+
244
+ // Testing phase
245
+ spinner.text = "Running tests...";
246
+ await runTests();
247
+
248
+ // Deployment phase
249
+ spinner.text = "Deploying to production...";
250
+ await deploy();
251
+
252
+ // Success
253
+ spinner.stop("Deployment completed successfully!");
254
+ return true;
255
+ } catch (error) {
256
+ // Handle failure
257
+ spinner.stop(`Deployment failed: ${error.message}`, Spinner.ERROR);
258
+ return false;
259
+ }
260
+ }
171
261
  ```
172
262
 
173
- The output of that last line would look like:
263
+ ### Chaining Multiple Spinners
174
264
 
175
- ```sh
176
- > [ Tue Feb 02 2021 8:32:58 PM ] this will have a timestamp!
265
+ ```js
266
+ import { Spinner } from "@node-cli/logger";
267
+
268
+ async function processWorkflow() {
269
+ // Step 1
270
+ const step1 = new Spinner("Step 1: Data validation");
271
+ step1.start();
272
+ await validateData();
273
+ step1.stop("Data validation complete", Spinner.SUCCESS);
274
+
275
+ // Step 2
276
+ const step2 = new Spinner("Step 2: Processing records");
277
+ step2.start();
278
+ await processRecords();
279
+ step2.stop("Records processed", Spinner.SUCCESS);
280
+
281
+ // Step 3
282
+ const step3 = new Spinner("Step 3: Generating report");
283
+ step3.start();
284
+ await generateReport();
285
+ step3.stop("Report generated", Spinner.SUCCESS);
286
+
287
+ console.log("Workflow completed successfully!");
288
+ }
177
289
  ```
178
290
 
179
- This option can also be passed to the constructor:
291
+ ## API Reference
180
292
 
181
- ```js
182
- import { Logger } from "@node-cli/logger";
183
- const log = new Logger({ timestamp: true });
293
+ ### Logger Class
184
294
 
185
- log.info("this will be logged with a timestamp");
186
- log.timestamp = false;
187
- log.info("this will be NOT be logged with a timestamp");
188
- ```
295
+ #### Constructor Options
189
296
 
190
- ### Log one or more messages in a box
297
+ | Option | Type | Default | Description |
298
+ | ----------- | ------- | ------- | --------------------------------------- |
299
+ | `boring` | boolean | `false` | Disable colors in output |
300
+ | `silent` | boolean | `false` | Disable all logging |
301
+ | `prefix` | string | `""` | Add a prefix to all log messages |
302
+ | `timestamp` | boolean | `false` | Add timestamps to all log messages |
303
+ | `inMemory` | boolean | `false` | Store logs in memory instead of console |
191
304
 
192
- The `printBox` method is a wrapper around the excellent [Boxen](https://github.com/sindresorhus/boxen), with sensible defaults.
305
+ #### Methods
193
306
 
194
- ```js
195
- import { Logger } from "@node-cli/logger";
196
- const log = new Logger();
307
+ | Method | Arguments | Description |
308
+ | -------------------- | ----------------------------------------------------------- | ------------------------------------------------------ |
309
+ | `log` | `...args` | Standard log output (white) |
310
+ | `info` | `...args` | Informational log output (blue) |
311
+ | `debug` | `...args` | Debug log output (grey) |
312
+ | `warn` | `...args` | Warning log output (yellow) |
313
+ | `error` | `...args` | Error log output (red) |
314
+ | `printBox` | `messages: string \| string[]`, `options?: PrintBoxOptions` | Display message(s) in a formatted box |
315
+ | `printErrorsAndExit` | `errorMessages: string[]`, `exitStatus?: number` | Display error messages and optionally exit the process |
316
+ | `getMemoryLogs` | none | Get all logs stored in memory as a string |
317
+ | `clearMemoryLogs` | none | Clear all logs stored in memory |
197
318
 
198
- log.printBox(["Message One!", "Message Two!"]);
319
+ #### Properties (Setters)
199
320
 
200
- ┌──────────────────┐
201
- │ │
202
- │ Message One! │
203
- │ Message Two! │
204
- │ │
205
- └──────────────────┘
321
+ | Property | Type | Description |
322
+ | ----------- | ------- | -------------------------------- |
323
+ | `silent` | boolean | Enable/disable logging |
324
+ | `boring` | boolean | Enable/disable colors |
325
+ | `prefix` | string | Set prefix for log messages |
326
+ | `timestamp` | boolean | Enable/disable timestamps |
327
+ | `inMemory` | boolean | Enable/disable in-memory logging |
206
328
 
207
- ```
329
+ #### PrintBox Options
208
330
 
209
- `printBox` accepts the following options as a second argument:
331
+ | Option | Type | Default | Description |
332
+ | --------------- | ------- | ----------- | ------------------------------------------------ |
333
+ | `newLineAfter` | boolean | `true` | Print a new line after the box |
334
+ | `newLineBefore` | boolean | `true` | Print a new line before the box |
335
+ | `borderColor` | string | `"yellow"` | Color of the box border |
336
+ | `padding` | number | `1` | Padding inside the box |
337
+ | `textAlignment` | string | `"center"` | Text alignment (`"left"`, `"center"`, `"right"`) |
338
+ | `title` | string | `undefined` | Optional title for the box |
210
339
 
211
- - `printLineAfter` (default to `true`)
212
- - `printLineBefore` (default to `true`)
213
- - As well as all the options available with [Boxen](https://github.com/sindresorhus/boxen)
340
+ Plus all options from [Boxen](https://github.com/sindresorhus/boxen).
214
341
 
215
- Here is a custom example with:
342
+ ### Spinner Class
216
343
 
217
- - a red border color
218
- - no extra line after the box
219
- - no padding (no space between the border and the text)
220
- - text is justified to the right
221
- - there is a title injected at the top of the box
344
+ #### Constructor Options
222
345
 
223
- ```js
224
- import { Logger } from "@node-cli/logger";
225
- const log = new Logger();
346
+ Accepts all options from [ora](https://github.com/sindresorhus/ora).
226
347
 
227
- log.printBox(["Message One!", "Message Two!"], {
228
- borderColor: "red",
229
- newLineAfter: false,
230
- padding: 0,
231
- textAlignment: "right",
232
- title: "Hello World Box Title",
233
- });
234
- ```
348
+ | Option | Type | Description |
349
+ | --------- | ---------------- | --------------------------------- |
350
+ | `text` | string | Text to display after the spinner |
351
+ | `color` | string | Color of the spinner |
352
+ | `spinner` | string \| object | Spinner pattern to use |
353
+ | ... | ... | All other ora options |
235
354
 
236
- ### Log multiple errors and optionally exit the main program
355
+ #### Methods
237
356
 
238
- The following will print 2 error messages and exit with error code 666.
239
- If the second parameter (a number) is not provided, the process does not exit.
357
+ | Method | Arguments | Description |
358
+ | ------- | ---------------------------------- | ---------------------------------------------- |
359
+ | `start` | `text?: string` | Start the spinner with optional text |
360
+ | `stop` | `text?: string`, `status?: string` | Stop the spinner with optional text and status |
240
361
 
241
- ```js
242
- import { Logger } from "@node-cli/logger";
243
- const log = new Logger();
362
+ #### Properties
244
363
 
245
- log.printErrorsAndExit(["Error One!", "Error Two!"], 666);
246
- ```
364
+ | Property | Type | Description |
365
+ | -------- | ------ | -------------------- |
366
+ | `text` | string | Set the spinner text |
367
+
368
+ #### Status Constants
369
+
370
+ | Constant | Value | Description |
371
+ | ----------------- | ----------- | ----------------------------------- |
372
+ | `Spinner.SUCCESS` | `"success"` | Success status (green checkmark) |
373
+ | `Spinner.ERROR` | `"fail"` | Error status (red X) |
374
+ | `Spinner.WARNING` | `"warn"` | Warning status (yellow exclamation) |
375
+ | `Spinner.INFO` | `"info"` | Info status (blue i) |
376
+
377
+ ## Environment Compatibility
378
+
379
+ - Works with Node.js >=16
380
+ - ESM module format
381
+ - TypeScript definitions included
247
382
 
248
383
  ## License
249
384
 
package/dist/Logger.d.ts CHANGED
@@ -26,12 +26,12 @@ export declare class Logger {
26
26
  set timestamp(flag: boolean);
27
27
  set inMemory(flag: boolean);
28
28
  /**
29
- * Get the accumulated logs as a string
29
+ * Get the accumulated logs as a string.
30
30
  * @returns {string} All logs joined by the separator
31
31
  */
32
32
  getMemoryLogs(): string;
33
33
  /**
34
- * Clear all accumulated logs from memory
34
+ * Clear all accumulated logs from memory.
35
35
  */
36
36
  clearMemoryLogs(): void;
37
37
  info(...arguments_: any): void;
@@ -40,13 +40,14 @@ export declare class Logger {
40
40
  warn(...arguments_: any): void;
41
41
  error(...arguments_: any): void;
42
42
  /**
43
- * Log multiple error messages at the prompt using `console.error` behind the scenes.
43
+ * Log multiple error messages at the prompt using `console.error` behind the
44
+ * scenes.
44
45
  * @param {string[]} errorMessages array of error message to display line by line
45
46
  * @param {number} [exitStatus] the process will exit with this value if provided
46
47
  */
47
48
  printErrorsAndExit(errorMessages: string[], exitStatus?: number): void;
48
49
  /**
49
- * Print sets of logs in a box (wrapper to Boxen)
50
+ * Print sets of logs in a box (wrapper to Boxen).
50
51
  * @param messages Messages to print
51
52
  * @param options
52
53
  */
package/dist/Logger.js CHANGED
@@ -1,7 +1,7 @@
1
- import boxen from "boxen";
2
- import ora from "ora";
3
1
  import util from "node:util";
2
+ import boxen from "boxen";
4
3
  import kleur from "kleur";
4
+ import ora from "ora";
5
5
  export class Logger {
6
6
  #shouldLog;
7
7
  #globalPrefix;
@@ -15,7 +15,7 @@ export class Logger {
15
15
  this.#showTimestamp = timestamp;
16
16
  this.#inMemory = inMemory;
17
17
  this.#memoryLogs = [];
18
- // When in memory mode, we disable colors
18
+ // When in memory mode, we disable colors.
19
19
  this.#printOptions = {
20
20
  colors: !boring && !inMemory,
21
21
  compact: false,
@@ -26,7 +26,7 @@ export class Logger {
26
26
  this.#shouldLog = !flag;
27
27
  }
28
28
  set boring(flag) {
29
- // Only set colors if not in memory mode
29
+ // Only set colors if not in memory mode.
30
30
  if (!this.#inMemory) {
31
31
  this.#printOptions.colors = !flag;
32
32
  }
@@ -39,19 +39,19 @@ export class Logger {
39
39
  }
40
40
  set inMemory(flag) {
41
41
  this.#inMemory = flag;
42
- // When enabling in-memory mode, disable colors
42
+ // When enabling in-memory mode, disable colors.
43
43
  if (flag) {
44
44
  this.#printOptions.colors = false;
45
45
  }
46
46
  }
47
47
  /**
48
- * Get the accumulated logs as a string
48
+ * Get the accumulated logs as a string.
49
49
  * @returns {string} All logs joined by the separator
50
50
  */ getMemoryLogs() {
51
51
  return this.#memoryLogs.join("\n");
52
52
  }
53
53
  /**
54
- * Clear all accumulated logs from memory
54
+ * Clear all accumulated logs from memory.
55
55
  */ clearMemoryLogs() {
56
56
  this.#memoryLogs = [];
57
57
  }
@@ -70,11 +70,11 @@ export class Logger {
70
70
  }
71
71
  message = util.formatWithOptions(this.#printOptions, prefix.join(" "), ...arguments_);
72
72
  }
73
- // Store in memory if enabled
73
+ // Store in memory if enabled.
74
74
  if (this.#inMemory) {
75
75
  this.#memoryLogs.push(message);
76
76
  }
77
- // Still output to console if not in memory-only mode
77
+ // Still output to console if not in memory-only mode.
78
78
  if (!this.#inMemory) {
79
79
  console[type.method](this.#printOptions.colors ? `${type.color(message)}` : message);
80
80
  }
@@ -111,7 +111,8 @@ export class Logger {
111
111
  }, ...arguments_);
112
112
  }
113
113
  /**
114
- * Log multiple error messages at the prompt using `console.error` behind the scenes.
114
+ * Log multiple error messages at the prompt using `console.error` behind the
115
+ * scenes.
115
116
  * @param {string[]} errorMessages array of error message to display line by line
116
117
  * @param {number} [exitStatus] the process will exit with this value if provided
117
118
  */ printErrorsAndExit(errorMessages, exitStatus) {
@@ -128,7 +129,7 @@ export class Logger {
128
129
  }
129
130
  }
130
131
  /**
131
- * Print sets of logs in a box (wrapper to Boxen)
132
+ * Print sets of logs in a box (wrapper to Boxen).
132
133
  * @param messages Messages to print
133
134
  * @param options
134
135
  */ printBox(messages, options = {}) {
@@ -138,8 +139,7 @@ export class Logger {
138
139
  ...options
139
140
  };
140
141
  /**
141
- * Setting some sensible Boxen options if
142
- * not provided by the user.
142
+ * Setting some sensible Boxen options if not provided by the user.
143
143
  */ const borderColor = options.borderColor || "yellow";
144
144
  const boxenOptions = {
145
145
  ...options,
@@ -158,7 +158,7 @@ export class Logger {
158
158
  this.#globalPrefix = oldPrefix;
159
159
  }
160
160
  }
161
- /* istanbul ignore next */ export class Spinner {
161
+ /* v8 ignore next 48 */ export class Spinner {
162
162
  spinner;
163
163
  constructor(options){
164
164
  this.spinner = ora({
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Logger.ts"],"sourcesContent":["import boxen, { Options as BoxenOptions } from \"boxen\";\nimport ora, { Ora, Options as OraOptions } from \"ora\";\n\nimport util from \"node:util\";\nimport kleur from \"kleur\";\n\nexport type PrintBoxOptions = {\n\tnewLineAfter?: boolean;\n\tnewLineBefore?: boolean;\n} & BoxenOptions;\n\nexport type LoggerOptions = {\n\tboring?: boolean;\n\tsilent?: boolean;\n\tprefix?: string;\n\ttimestamp?: boolean;\n\tinMemory?: boolean;\n};\n\nexport class Logger {\n\t#shouldLog: boolean;\n\t#globalPrefix: string;\n\t#showTimestamp: boolean;\n\t#printOptions: { colors: boolean; compact: boolean; depth: number };\n\t#inMemory: boolean;\n\t#memoryLogs: string[];\n\n\tconstructor({\n\t\tboring = false,\n\t\tsilent = false,\n\t\tprefix = \"\",\n\t\ttimestamp = false,\n\t\tinMemory = false,\n\t} = {}) {\n\t\tthis.#shouldLog = !silent;\n\t\tthis.#globalPrefix = prefix;\n\t\tthis.#showTimestamp = timestamp;\n\t\tthis.#inMemory = inMemory;\n\t\tthis.#memoryLogs = [];\n\n\t\t// When in memory mode, we disable colors\n\t\tthis.#printOptions = {\n\t\t\tcolors: !boring && !inMemory,\n\t\t\tcompact: false,\n\t\t\tdepth: 5,\n\t\t};\n\t}\n\n\tset silent(flag: boolean) {\n\t\tthis.#shouldLog = !flag;\n\t}\n\n\tset boring(flag: boolean) {\n\t\t// Only set colors if not in memory mode\n\t\tif (!this.#inMemory) {\n\t\t\tthis.#printOptions.colors = !flag;\n\t\t}\n\t}\n\n\tset prefix(prefix: string) {\n\t\tthis.#globalPrefix = prefix;\n\t}\n\n\tset timestamp(flag: boolean) {\n\t\tthis.#showTimestamp = flag;\n\t}\n\n\tset inMemory(flag: boolean) {\n\t\tthis.#inMemory = flag;\n\t\t// When enabling in-memory mode, disable colors\n\t\tif (flag) {\n\t\t\tthis.#printOptions.colors = false;\n\t\t}\n\t}\n\n\t/**\n\t * Get the accumulated logs as a string\n\t * @returns {string} All logs joined by the separator\n\t */\n\tgetMemoryLogs(): string {\n\t\treturn this.#memoryLogs.join(\"\\n\");\n\t}\n\n\t/**\n\t * Clear all accumulated logs from memory\n\t */\n\tclearMemoryLogs(): void {\n\t\tthis.#memoryLogs = [];\n\t}\n\n\t#_log(\n\t\ttype: { method: string | number; color: (argument0: any) => any },\n\t\t...arguments_: string[]\n\t) {\n\t\tif (this.#shouldLog) {\n\t\t\tlet message: string;\n\t\t\tif (!this.#showTimestamp && !this.#globalPrefix) {\n\t\t\t\tmessage = util.formatWithOptions(this.#printOptions, ...arguments_);\n\t\t\t} else {\n\t\t\t\tconst prefix = this.#globalPrefix ? [this.#globalPrefix] : [];\n\t\t\t\tif (this.#showTimestamp) {\n\t\t\t\t\tconst now = new Date();\n\t\t\t\t\tprefix.push(\n\t\t\t\t\t\tthis.#printOptions.colors\n\t\t\t\t\t\t\t? `${kleur.grey(\n\t\t\t\t\t\t\t\t\t`[ ${now.toDateString()} ${now.toLocaleTimeString()} ]`,\n\t\t\t\t\t\t\t\t)}`\n\t\t\t\t\t\t\t: `[ ${now.toDateString()} ${now.toLocaleTimeString()} ]`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tmessage = util.formatWithOptions(\n\t\t\t\t\tthis.#printOptions,\n\t\t\t\t\tprefix.join(\" \"),\n\t\t\t\t\t...arguments_,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Store in memory if enabled\n\t\t\tif (this.#inMemory) {\n\t\t\t\tthis.#memoryLogs.push(message);\n\t\t\t}\n\n\t\t\t// Still output to console if not in memory-only mode\n\t\t\tif (!this.#inMemory) {\n\t\t\t\tconsole[type.method](\n\t\t\t\t\tthis.#printOptions.colors ? `${type.color(message)}` : message,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tinfo(...arguments_: any) {\n\t\tthis.#_log({ method: \"info\", color: kleur.blue }, ...arguments_);\n\t}\n\n\tlog(...arguments_: any) {\n\t\tthis.#_log({ method: \"log\", color: kleur.white }, ...arguments_);\n\t}\n\n\tdebug(...arguments_: any) {\n\t\tthis.#_log({ method: \"debug\", color: kleur.grey }, ...arguments_);\n\t}\n\n\twarn(...arguments_: any) {\n\t\tthis.#_log({ method: \"warn\", color: kleur.yellow }, ...arguments_);\n\t}\n\n\terror(...arguments_: any) {\n\t\tthis.#_log({ method: \"error\", color: kleur.red }, ...arguments_);\n\t}\n\n\t/**\n\t * Log multiple error messages at the prompt using `console.error` behind the scenes.\n\t * @param {string[]} errorMessages array of error message to display line by line\n\t * @param {number} [exitStatus] the process will exit with this value if provided\n\t */\n\tprintErrorsAndExit(errorMessages: string[], exitStatus?: number) {\n\t\tif (errorMessages && errorMessages.length > 0) {\n\t\t\tthis.log();\n\t\t\tfor (const message of errorMessages) {\n\t\t\t\tthis.error(message);\n\t\t\t}\n\t\t\tthis.log();\n\n\t\t\tif (typeof exitStatus === \"number\") {\n\t\t\t\t// eslint-disable-next-line unicorn/no-process-exit\n\t\t\t\tprocess.exit(exitStatus);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Print sets of logs in a box (wrapper to Boxen)\n\t * @param messages Messages to print\n\t * @param options\n\t */\n\tprintBox(messages: string | string[], options: PrintBoxOptions = {}) {\n\t\tconst { newLineAfter, newLineBefore } = {\n\t\t\tnewLineAfter: true,\n\t\t\tnewLineBefore: true,\n\t\t\t...options,\n\t\t};\n\n\t\t/**\n\t\t * Setting some sensible Boxen options if\n\t\t * not provided by the user.\n\t\t */\n\t\tconst borderColor = options.borderColor || \"yellow\";\n\t\tconst boxenOptions: BoxenOptions = {\n\t\t\t...options,\n\t\t\tborderColor: this.#printOptions.colors ? borderColor : \"white\",\n\t\t\tpadding: typeof options.padding === \"number\" ? options.padding : 1,\n\t\t\ttextAlignment: options.textAlignment || \"center\",\n\t\t};\n\n\t\tconst oldPrefix = this.#globalPrefix;\n\t\tconst oldTimestamp = this.#showTimestamp;\n\n\t\tthis.#globalPrefix = \"\";\n\t\tthis.#showTimestamp = false;\n\n\t\tnewLineBefore && this.log();\n\t\tthis.log(\n\t\t\tboxen(\n\t\t\t\ttypeof messages === \"string\" ? messages : messages.join(\"\\n\"),\n\t\t\t\tboxenOptions,\n\t\t\t),\n\t\t);\n\t\tnewLineAfter && this.log();\n\n\t\tthis.#showTimestamp = oldTimestamp;\n\t\tthis.#globalPrefix = oldPrefix;\n\t}\n}\n\n/* istanbul ignore next */\nexport class Spinner {\n\tspinner: Ora;\n\n\tconstructor(options?: OraOptions) {\n\t\tthis.spinner = ora({\n\t\t\t...options,\n\t\t\tisSilent: process.env.NODE_ENV === \"test\",\n\t\t});\n\t}\n\n\tset text(message: string) {\n\t\tthis.spinner.text = message;\n\t}\n\n\tstart(message?: string) {\n\t\tthis.spinner.start(message);\n\t}\n\n\tstop(message?: string, type?: string) {\n\t\tswitch (type) {\n\t\t\tcase Spinner.ERROR: {\n\t\t\t\tthis.spinner.fail(message);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase Spinner.WARNING: {\n\t\t\t\tthis.spinner.warn(message);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase Spinner.INFO: {\n\t\t\t\tthis.spinner.info(message);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.spinner.succeed(message);\n\t\t\t\t}, 1000);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic SUCCESS = \"success\";\n\tstatic ERROR = \"fail\";\n\tstatic WARNING = \"warn\";\n\tstatic INFO = \"info\";\n}\n"],"names":["boxen","ora","util","kleur","Logger","constructor","boring","silent","prefix","timestamp","inMemory","colors","compact","depth","flag","getMemoryLogs","join","clearMemoryLogs","type","arguments_","message","formatWithOptions","now","Date","push","grey","toDateString","toLocaleTimeString","console","method","color","info","blue","log","white","debug","warn","yellow","error","red","printErrorsAndExit","errorMessages","exitStatus","length","process","exit","printBox","messages","options","newLineAfter","newLineBefore","borderColor","boxenOptions","padding","textAlignment","oldPrefix","oldTimestamp","Spinner","spinner","isSilent","env","NODE_ENV","text","start","stop","ERROR","fail","WARNING","INFO","setTimeout","succeed","SUCCESS"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/Logger.ts"],"sourcesContent":["import util from \"node:util\";\nimport boxen, { Options as BoxenOptions } from \"boxen\";\nimport kleur from \"kleur\";\nimport ora, { Ora, Options as OraOptions } from \"ora\";\n\nexport type PrintBoxOptions = {\n\tnewLineAfter?: boolean;\n\tnewLineBefore?: boolean;\n} & BoxenOptions;\n\nexport type LoggerOptions = {\n\tboring?: boolean;\n\tsilent?: boolean;\n\tprefix?: string;\n\ttimestamp?: boolean;\n\tinMemory?: boolean;\n};\n\nexport class Logger {\n\t#shouldLog: boolean;\n\t#globalPrefix: string;\n\t#showTimestamp: boolean;\n\t#printOptions: { colors: boolean; compact: boolean; depth: number };\n\t#inMemory: boolean;\n\t#memoryLogs: string[];\n\n\tconstructor({\n\t\tboring = false,\n\t\tsilent = false,\n\t\tprefix = \"\",\n\t\ttimestamp = false,\n\t\tinMemory = false,\n\t} = {}) {\n\t\tthis.#shouldLog = !silent;\n\t\tthis.#globalPrefix = prefix;\n\t\tthis.#showTimestamp = timestamp;\n\t\tthis.#inMemory = inMemory;\n\t\tthis.#memoryLogs = [];\n\n\t\t// When in memory mode, we disable colors.\n\t\tthis.#printOptions = {\n\t\t\tcolors: !boring && !inMemory,\n\t\t\tcompact: false,\n\t\t\tdepth: 5,\n\t\t};\n\t}\n\n\tset silent(flag: boolean) {\n\t\tthis.#shouldLog = !flag;\n\t}\n\n\tset boring(flag: boolean) {\n\t\t// Only set colors if not in memory mode.\n\t\tif (!this.#inMemory) {\n\t\t\tthis.#printOptions.colors = !flag;\n\t\t}\n\t}\n\n\tset prefix(prefix: string) {\n\t\tthis.#globalPrefix = prefix;\n\t}\n\n\tset timestamp(flag: boolean) {\n\t\tthis.#showTimestamp = flag;\n\t}\n\n\tset inMemory(flag: boolean) {\n\t\tthis.#inMemory = flag;\n\t\t// When enabling in-memory mode, disable colors.\n\t\tif (flag) {\n\t\t\tthis.#printOptions.colors = false;\n\t\t}\n\t}\n\n\t/**\n\t * Get the accumulated logs as a string.\n\t * @returns {string} All logs joined by the separator\n\t */\n\tgetMemoryLogs(): string {\n\t\treturn this.#memoryLogs.join(\"\\n\");\n\t}\n\n\t/**\n\t * Clear all accumulated logs from memory.\n\t */\n\tclearMemoryLogs(): void {\n\t\tthis.#memoryLogs = [];\n\t}\n\n\t#_log(\n\t\ttype: { method: string | number; color: (argument0: any) => any },\n\t\t...arguments_: string[]\n\t) {\n\t\tif (this.#shouldLog) {\n\t\t\tlet message: string;\n\t\t\tif (!this.#showTimestamp && !this.#globalPrefix) {\n\t\t\t\tmessage = util.formatWithOptions(this.#printOptions, ...arguments_);\n\t\t\t} else {\n\t\t\t\tconst prefix = this.#globalPrefix ? [this.#globalPrefix] : [];\n\t\t\t\tif (this.#showTimestamp) {\n\t\t\t\t\tconst now = new Date();\n\t\t\t\t\tprefix.push(\n\t\t\t\t\t\tthis.#printOptions.colors\n\t\t\t\t\t\t\t? `${kleur.grey(\n\t\t\t\t\t\t\t\t\t`[ ${now.toDateString()} ${now.toLocaleTimeString()} ]`,\n\t\t\t\t\t\t\t\t)}`\n\t\t\t\t\t\t\t: `[ ${now.toDateString()} ${now.toLocaleTimeString()} ]`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tmessage = util.formatWithOptions(\n\t\t\t\t\tthis.#printOptions,\n\t\t\t\t\tprefix.join(\" \"),\n\t\t\t\t\t...arguments_,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Store in memory if enabled.\n\t\t\tif (this.#inMemory) {\n\t\t\t\tthis.#memoryLogs.push(message);\n\t\t\t}\n\n\t\t\t// Still output to console if not in memory-only mode.\n\t\t\tif (!this.#inMemory) {\n\t\t\t\tconsole[type.method](\n\t\t\t\t\tthis.#printOptions.colors ? `${type.color(message)}` : message,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tinfo(...arguments_: any) {\n\t\tthis.#_log({ method: \"info\", color: kleur.blue }, ...arguments_);\n\t}\n\n\tlog(...arguments_: any) {\n\t\tthis.#_log({ method: \"log\", color: kleur.white }, ...arguments_);\n\t}\n\n\tdebug(...arguments_: any) {\n\t\tthis.#_log({ method: \"debug\", color: kleur.grey }, ...arguments_);\n\t}\n\n\twarn(...arguments_: any) {\n\t\tthis.#_log({ method: \"warn\", color: kleur.yellow }, ...arguments_);\n\t}\n\n\terror(...arguments_: any) {\n\t\tthis.#_log({ method: \"error\", color: kleur.red }, ...arguments_);\n\t}\n\n\t/**\n\t * Log multiple error messages at the prompt using `console.error` behind the\n\t * scenes.\n\t * @param {string[]} errorMessages array of error message to display line by line\n\t * @param {number} [exitStatus] the process will exit with this value if provided\n\t */\n\tprintErrorsAndExit(errorMessages: string[], exitStatus?: number) {\n\t\tif (errorMessages && errorMessages.length > 0) {\n\t\t\tthis.log();\n\t\t\tfor (const message of errorMessages) {\n\t\t\t\tthis.error(message);\n\t\t\t}\n\t\t\tthis.log();\n\n\t\t\tif (typeof exitStatus === \"number\") {\n\t\t\t\t// eslint-disable-next-line unicorn/no-process-exit\n\t\t\t\tprocess.exit(exitStatus);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Print sets of logs in a box (wrapper to Boxen).\n\t * @param messages Messages to print\n\t * @param options\n\t */\n\tprintBox(messages: string | string[], options: PrintBoxOptions = {}) {\n\t\tconst { newLineAfter, newLineBefore } = {\n\t\t\tnewLineAfter: true,\n\t\t\tnewLineBefore: true,\n\t\t\t...options,\n\t\t};\n\n\t\t/**\n\t\t * Setting some sensible Boxen options if not provided by the user.\n\t\t */\n\t\tconst borderColor = options.borderColor || \"yellow\";\n\t\tconst boxenOptions: BoxenOptions = {\n\t\t\t...options,\n\t\t\tborderColor: this.#printOptions.colors ? borderColor : \"white\",\n\t\t\tpadding: typeof options.padding === \"number\" ? options.padding : 1,\n\t\t\ttextAlignment: options.textAlignment || \"center\",\n\t\t};\n\n\t\tconst oldPrefix = this.#globalPrefix;\n\t\tconst oldTimestamp = this.#showTimestamp;\n\n\t\tthis.#globalPrefix = \"\";\n\t\tthis.#showTimestamp = false;\n\n\t\tnewLineBefore && this.log();\n\t\tthis.log(\n\t\t\tboxen(\n\t\t\t\ttypeof messages === \"string\" ? messages : messages.join(\"\\n\"),\n\t\t\t\tboxenOptions,\n\t\t\t),\n\t\t);\n\t\tnewLineAfter && this.log();\n\n\t\tthis.#showTimestamp = oldTimestamp;\n\t\tthis.#globalPrefix = oldPrefix;\n\t}\n}\n\n/* v8 ignore next 48 */\nexport class Spinner {\n\tspinner: Ora;\n\n\tconstructor(options?: OraOptions) {\n\t\tthis.spinner = ora({\n\t\t\t...options,\n\t\t\tisSilent: process.env.NODE_ENV === \"test\",\n\t\t});\n\t}\n\n\tset text(message: string) {\n\t\tthis.spinner.text = message;\n\t}\n\n\tstart(message?: string) {\n\t\tthis.spinner.start(message);\n\t}\n\n\tstop(message?: string, type?: string) {\n\t\tswitch (type) {\n\t\t\tcase Spinner.ERROR: {\n\t\t\t\tthis.spinner.fail(message);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase Spinner.WARNING: {\n\t\t\t\tthis.spinner.warn(message);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase Spinner.INFO: {\n\t\t\t\tthis.spinner.info(message);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.spinner.succeed(message);\n\t\t\t\t}, 1000);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic SUCCESS = \"success\";\n\tstatic ERROR = \"fail\";\n\tstatic WARNING = \"warn\";\n\tstatic INFO = \"info\";\n}\n"],"names":["util","boxen","kleur","ora","Logger","boring","silent","prefix","timestamp","inMemory","colors","compact","depth","flag","getMemoryLogs","join","clearMemoryLogs","type","arguments_","message","formatWithOptions","now","Date","push","grey","toDateString","toLocaleTimeString","console","method","color","info","blue","log","white","debug","warn","yellow","error","red","printErrorsAndExit","errorMessages","exitStatus","length","process","exit","printBox","messages","options","newLineAfter","newLineBefore","borderColor","boxenOptions","padding","textAlignment","oldPrefix","oldTimestamp","Spinner","spinner","isSilent","env","NODE_ENV","text","start","stop","ERROR","fail","WARNING","INFO","setTimeout","succeed","SUCCESS"],"mappings":"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"}
package/package.json CHANGED
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "name": "@node-cli/logger",
3
- "version": "1.3.0",
3
+ "version": "1.3.2",
4
4
  "license": "MIT",
5
5
  "author": "Arno Versini",
6
6
  "description": "A tiny console logger for nodejs CLI apps",
7
7
  "type": "module",
8
8
  "exports": "./dist/Logger.js",
9
9
  "files": [
10
- "dist"
10
+ "dist",
11
+ "README.md"
11
12
  ],
12
13
  "node": ">=16",
13
14
  "dependencies": {
@@ -21,14 +22,21 @@
21
22
  "build:js": "swc --strip-leading-paths --source-maps --out-dir dist src",
22
23
  "build:types": "tsc",
23
24
  "clean": "rimraf dist types coverage",
25
+ "comments:fix": "comments --merge-line-comments 'src/**/*.ts'",
24
26
  "lint": "biome lint src",
25
- "test": "cross-env-shell NODE_OPTIONS=--experimental-vm-modules jest",
26
- "test:coverage": "npm run test -- --coverage",
27
- "test:watch": "npm run test -- --watch",
27
+ "lint:fix": "biome check src --write --no-errors-on-unmatched",
28
+ "test": "vitest run --globals",
29
+ "test:coverage": "vitest run --coverage --globals",
30
+ "test:watch": "vitest --globals",
28
31
  "watch": "swc --strip-leading-paths --watch --out-dir dist src"
29
32
  },
30
33
  "publishConfig": {
31
34
  "access": "public"
32
35
  },
33
- "gitHead": "92d48ec7a2e19ad36b077d9e219d91f782dd4a0a"
36
+ "devDependencies": {
37
+ "@node-cli/comments": "0.2.0",
38
+ "@vitest/coverage-v8": "3.2.4",
39
+ "vitest": "3.2.4"
40
+ },
41
+ "gitHead": "d90392dcb766dd605bc3eeabc7c7a7ab0c8e6da6"
34
42
  }