Skip to content

Commit 37d17ab

Browse files
committed
feat: add array logging
1 parent a016fe5 commit 37d17ab

File tree

4 files changed

+63
-22
lines changed

4 files changed

+63
-22
lines changed

bin/commands/list.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,5 @@ export default function list(type) {
2525
? availableRules
2626
: availableTransports;
2727

28-
Logger.getInstance().info(list.join('\n'));
28+
Logger.getInstance().info(list);
2929
}

src/logger/__tests__/logger.test.mjs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,4 +181,36 @@ describe('createLogger', () => {
181181

182182
strictEqual(transport.mock.callCount(), 0);
183183
});
184+
185+
it('should log all messages if message is a string array', t => {
186+
const transport = t.mock.fn();
187+
188+
const logger = createLogger(transport, LogLevel.info);
189+
190+
logger.info(['Hello, 1!', 'Hello, 2!', 'Hello, 3!']);
191+
192+
strictEqual(transport.mock.callCount(), 3);
193+
});
194+
195+
it.only('should log error message', t => {
196+
t.mock.timers.enable({ apis: ['Date'] });
197+
198+
const transport = t.mock.fn();
199+
200+
const logger = createLogger(transport, LogLevel.error);
201+
202+
logger.error(new Error('Hello, World!'));
203+
204+
strictEqual(transport.mock.callCount(), 1);
205+
206+
const call = transport.mock.calls[0];
207+
deepStrictEqual(call.arguments, [
208+
{
209+
level: LogLevel.error,
210+
message: 'Hello, World!',
211+
metadata: {},
212+
timestamp: 0,
213+
},
214+
]);
215+
});
184216
});

src/logger/logger.mjs

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22

33
import { LogLevel } from './constants.mjs';
44

5+
/**
6+
* @typedef {import('./types').Metadata} Metadata
7+
* @typedef {import('./types').LogMessage} LogMessage
8+
*/
9+
510
/**
611
* Creates a logger instance with the specified transport, log level and an
712
* optional module name.
@@ -19,19 +24,27 @@ export const createLogger = (
1924
* Logs a message at the given level with optional metadata.
2025
*
2126
* @param {number} level - Log level for the message.
22-
* @param {string} message - Message to log.
23-
* @param {import('./types').Metadata} metadata - Additional metadata
27+
* @param {LogMessage} message - Message to log.
28+
* @param {Metadata} metadata - Additional metadata
29+
* @returns {void}
2430
*/
2531
const log = (level, message, metadata = {}) => {
2632
if (!shouldLog(level)) {
2733
return;
2834
}
2935

36+
if (Array.isArray(message)) {
37+
return message.forEach(msg => log(level, msg, metadata));
38+
}
39+
3040
const timestamp = Date.now();
3141

42+
// Extract message string from Error object or use message as-is
43+
const msg = message instanceof Error ? message.message : message;
44+
3245
transport({
3346
level,
34-
message,
47+
message: msg,
3548
timestamp,
3649
metadata,
3750
...(module && { module }),
@@ -41,8 +54,8 @@ export const createLogger = (
4154
/**
4255
* Logs an info message.
4356
*
44-
* @param {string} message - Info message to log.
45-
* @param {import('./types').Metadata} metadata - Additional metadata
57+
* @param {LogMessage} message - Info message to log.
58+
* @param {Metadata} metadata - Additional metadata
4659
* @returns {void}
4760
*/
4861
const info = (message, metadata = {}) =>
@@ -51,8 +64,8 @@ export const createLogger = (
5164
/**
5265
* Logs a warning message.
5366
*
54-
* @param {string} message - Warning message to log.
55-
* @param {import('./types').Metadata} metadata - Additional metadata
67+
* @param {LogMessage} message - Warning message to log.
68+
* @param {Metadata} metadata - Additional metadata
5669
* @returns {void}
5770
*/
5871
const warn = (message, metadata = {}) =>
@@ -61,34 +74,28 @@ export const createLogger = (
6174
/**
6275
* Logs an error message or Error object.
6376
*
64-
* @param {string | Error} input - Error message or Error object to log.
65-
* @param {import('./types').Metadata} metadata - Additional metadata
77+
* @param {LogMessage} message - Error message or Error object to log.
78+
* @param {Metadata} metadata - Additional metadata
6679
* @returns {void}
6780
*/
68-
const error = (input, metadata = {}) => {
69-
const message = typeof input === 'string' ? input : input.message;
70-
81+
const error = (message, metadata = {}) =>
7182
log(LogLevel.error, message, metadata);
72-
};
7383

7484
/**
7585
* Logs a fatal error message or Error object.
7686
*
77-
* @param {string | Error} input - Fatal error message or Error object to log.
78-
* @param {import('./types').Metadata} metadata - Additional metadata
87+
* @param {LogMessage} message - Fatal error message or Error object to log.
88+
* @param {Metadata} metadata - Additional metadata
7989
* @returns {void}
8090
*/
81-
const fatal = (input, metadata = {}) => {
82-
const message = typeof input === 'string' ? input : input.message;
83-
91+
const fatal = (message, metadata = {}) =>
8492
log(LogLevel.fatal, message, metadata);
85-
};
8693

8794
/**
8895
* Logs a debug message.
8996
*
90-
* @param {string} message - Debug message to log.
91-
* @param {import('./types').Metadata} metadata - Additional metadata
97+
* @param {LogMessage} message - Debug message to log.
98+
* @param {Metadata} metadata - Additional metadata
9299
* @returns {void}
93100
*/
94101
const debug = (message, metadata = {}) =>

src/logger/types.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
export type LogLevel = 'info' | 'warn' | 'error' | 'fatal' | 'trace' | 'debug';
22

3+
export type LogMessage = string | Error | string[];
4+
35
export interface Position {
46
start: { line: number };
57
end: { line: number };

0 commit comments

Comments
 (0)