diff --git a/packages/util/src/logger.js b/packages/util/src/logger.js index 770d7df99..1381e0859 100644 --- a/packages/util/src/logger.js +++ b/packages/util/src/logger.js @@ -3,11 +3,18 @@ // of the ISC license. See the LICENSE file for details. // @flow -import type { Logger } from './types'; +import type { Logger, Logger$Data } from './types'; type ConsoleType = 'error' | 'log' | 'warn'; -function apply (log: ConsoleType, type: string, values: Array): void { +const isFunction = require('./is/function'); + +function apply (log: ConsoleType, type: string, values: Logger$Data): void { + if (values.length === 1 && isFunction(values[0])) { + // flowlint-next-line unclear-type:off + return apply(log, type, ((values[0]: any): Function)()); + } + console[log].apply(console, [new Date().toString(), type].concat(values)); } @@ -37,10 +44,10 @@ module.exports = function logger (_type: string): Logger { return { debug: isDebug - ? (...values: Array): void => apply('log', type, values) - : (...values: Array): void => void 0, - error: (...values: Array): void => apply('error', type, values), - log: (...values: Array): void => apply('log', type, values), - warn: (...values: Array): void => apply('warn', type, values) + ? (...values: Logger$Data): void => apply('log', type, values) + : (...values: Logger$Data): void => void 0, + error: (...values: Logger$Data): void => apply('error', type, values), + log: (...values: Logger$Data): void => apply('log', type, values), + warn: (...values: Logger$Data): void => apply('warn', type, values) }; }; diff --git a/packages/util/src/logger.spec.js b/packages/util/src/logger.spec.js index 0c90bf85a..f4e21a688 100644 --- a/packages/util/src/logger.spec.js +++ b/packages/util/src/logger.spec.js @@ -38,6 +38,38 @@ describe('logger', () => { jest.restoreAllMocks(); }); + it('logs to console.log with .log', () => { + l.log('console.log test'); + + expect(spy.log).toHaveBeenCalledWith( + dateMatch, + prefixMatch, + 'console.log test' + ); + }); + + it('logs with mulptiple values', () => { + l.log('test', 'a', 2); + + expect(spy.log).toHaveBeenCalledWith( + dateMatch, + prefixMatch, + 'test', + 'a', + 2 + ); + }); + + it('logs when called with function', () => { + l.log(() => 'a function test'); + + expect(spy.log).toHaveBeenCalledWith( + dateMatch, + prefixMatch, + 'a function test' + ); + }); + it('logs to console.error with .error', () => { l.error('console.error test'); @@ -58,28 +90,6 @@ describe('logger', () => { ); }); - it('logs to console.log with .log', () => { - l.log('console.log test'); - - expect(spy.log).toHaveBeenCalledWith( - dateMatch, - prefixMatch, - 'console.log test' - ); - }); - - it('logs to with mulptiple values', () => { - l.log('test', 'a', 2); - - expect(spy.log).toHaveBeenCalledWith( - dateMatch, - prefixMatch, - 'test', - 'a', - 2 - ); - }); - it('does debug log when DEBUG specified', () => { l.debug('test'); diff --git a/packages/util/src/types.js b/packages/util/src/types.js index 919672095..e95d5f2b6 100644 --- a/packages/util/src/types.js +++ b/packages/util/src/types.js @@ -10,9 +10,11 @@ export interface ExtErrorInterface { stack: string; } +export type Logger$Data = Array Array>; + export type Logger = { - debug: (...values: Array) => void, - error: (...values: Array) => void, - log: (...values: Array) => void, - warn: (...values: Array) => void + debug: (...values: Logger$Data) => void, + error: (...values: Logger$Data) => void, + log: (...values: Logger$Data) => void, + warn: (...values: Logger$Data) => void };