'use strict' const { colors, formatTitle, formatText, clearConsole } = require('../utils/log') const chalk = require('chalk') const stringWidth = require('string-width') class BaseReporter { constructor () { this.enabled = true this.initLevels() } enable () { this.enabled = true } log () { if (this.enabled) { console.log.apply(console, arguments) } } initLevels () { for (const level of Object.keys(colors)) { this[level] = (title, message) => { if (!this.enabled) return if (message === undefined) { message = title this.log(message) return } title = formatTitle(level, title) message = formatText(level, message) if (process.env.NODE_ENV !== 'test') { message = this.appendTimestamp(title, message) } this.log(title, message) this.log() } } } appendTimestamp (title, message) { // Make timestamp appear at the end of the line const line = `${title} ${message}` const dateString = chalk.grey(new Date().toLocaleTimeString()) let logSpace = process.stdout.columns - stringWidth(line) - stringWidth(dateString) if (logSpace <= 0) { logSpace = 10 } return `${message}${' '.repeat(logSpace)}${dateString}` } clearConsole () { if (this.enabled) { clearConsole() } } } module.exports = BaseReporter