diff --git a/src/index.ts b/src/index.ts index 157dc2c..52f4d87 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,7 +11,7 @@ export type LogColors = keyof typeof colors export interface LogEntry { timestamp: Date level: LogLevel - message: string + message: any } export class Logger { @@ -60,7 +60,7 @@ export class Logger { * @example * logger.debug('no duplicates found, creating a document...') */ - public debug(message: string, ...positionals: Array): void { + public debug(message: any, ...positionals: Array): void { this.logEntry({ level: 'debug', message: colors.gray(message), @@ -77,7 +77,7 @@ export class Logger { * @example * logger.info('start parsing...') */ - public info(message: string, ...positionals: Array) { + public info(message: any, ...positionals: Array) { this.logEntry({ level: 'info', message, @@ -90,7 +90,7 @@ export class Logger { const performance = new PerformanceEntry() - return (message: string, ...positionals: Array) => { + return (message: any, ...positionals: Array) => { performance.measure() this.logEntry({ @@ -110,7 +110,7 @@ export class Logger { * @example * logger.success('successfully created document') */ - public success(message: string, ...positionals: Array): void { + public success(message: any, ...positionals: Array): void { this.logEntry({ level: 'info', message, @@ -128,7 +128,7 @@ export class Logger { * @example * logger.warning('found legacy document format') */ - public warning(message: string, ...positionals: Array): void { + public warning(message: any, ...positionals: Array): void { this.logEntry({ level: 'warning', message, @@ -146,7 +146,7 @@ export class Logger { * @example * logger.error('something went wrong') */ - public error(message: string, ...positionals: Array): void { + public error(message: any, ...positionals: Array): void { this.logEntry({ level: 'error', message, @@ -172,7 +172,7 @@ export class Logger { callback() } - private createEntry(level: LogLevel, message: string): LogEntry { + private createEntry(level: LogLevel, message: unknown): LogEntry { return { timestamp: new Date(), level, @@ -182,7 +182,7 @@ export class Logger { private logEntry(args: { level: LogLevel - message: string + message: unknown positionals?: Array prefix?: string colors?: { @@ -211,9 +211,9 @@ export class Logger { write( [colorize.timestamp(this.formatTimestamp(entry.timestamp))] .concat(prefix != null ? colorize.prefix(prefix) : []) - .concat(message) + .concat(serializeInput(message)) .join(' '), - ...positionals + ...positionals.map(serializeInput) ) } @@ -304,3 +304,23 @@ function isDefinedAndNotEquals( ): boolean { return value !== undefined && value !== expected } + +function serializeInput(message: any): string { + if (typeof message === 'undefined') { + return 'undefined' + } + + if (message === null) { + return 'null' + } + + if (typeof message === 'string') { + return message + } + + if (typeof message === 'object') { + return JSON.stringify(message) + } + + return message.toString() +} diff --git a/test/node/Logger.test.ts b/test/node/Logger.test.ts index 46f7b86..c36b85c 100644 --- a/test/node/Logger.test.ts +++ b/test/node/Logger.test.ts @@ -100,3 +100,19 @@ it('supports positionals', () => { `${colors.red('12:34:56:789')} ${colors.red('✖ [parser]')} hello world\n` ) }) + +it('serializes the input message', () => { + logger.info({ hello: 'world' }) + expect(process.stdout.write).toHaveBeenCalledWith( + `${colors.gray('12:34:56:789')} ${colors.blue( + '[parser]' + )} {"hello":"world"}\n` + ) + + logger.info([1, 'two', { three: 3 }]) + expect(process.stdout.write).toHaveBeenCalledWith( + `${colors.gray('12:34:56:789')} ${colors.blue( + '[parser]' + )} [1,"two",{"three":3}]\n` + ) +})