'use strict'; var EventEmitter = require('events').EventEmitter; var fmt = require('util').format; var inherits = require('util').inherits; var chalk = require('chalk'); var consoleStream = require('console-stream'); var lpadAlign = require('lpad-align'); /** * Initialize a new `Squeak` * * @param {Object} opts * @api public */ function Squeak(opts) { if (!(this instanceof Squeak)) { return new Squeak(opts); } EventEmitter.call(this); this.opts = opts || {}; this.align = this.opts.align !== false; this.indent = this.opts.indent || 2; this.separator = this.opts.separator || ' : '; this.stream = this.opts.stream || process.stderr || consoleStream(); this.types = []; } inherits(Squeak, EventEmitter); module.exports = Squeak; /** * Write args to stream * * @api public */ Squeak.prototype.write = function () { this.log([].slice.call(arguments)); return this; }; /** * Write args and new line to stream * * @api public */ Squeak.prototype.writeln = function () { this.log([].slice.call(arguments)); this.stream.write('\n'); return this; }; /** * Pad and write args to stream * * @api public */ Squeak.prototype.writelpad = function () { var args = [].slice.call(arguments); var pad = new Array(this.indent + 1).join(' '); if (args.length) { args[0] = pad + args[0]; } this.log(args); return this; }; /** * Add type * * @param {String} type * @param {Object} opts * @param {Function} cb * @api public */ Squeak.prototype.type = function (type, opts, cb) { if (!cb && typeof opts === 'function') { cb = opts; opts = {}; } opts = opts || {}; opts.color = opts.color || 'reset'; opts.prefix = opts.prefix || type; this.types.push(opts.prefix); this[type] = function () { this.log([].slice.call(arguments), opts); if (cb) { cb(); } }; return this; }; /** * End * * @param {Function} cb * @api public */ Squeak.prototype.end = function (cb) { this.stream.write('\n'); if (cb) { cb(); } return this; }; /** * Log * * @param {Array} args * @param {Object} opts * @api private */ Squeak.prototype.log = function (args, opts) { opts = opts || {}; var msg = [fmt.apply(null, args)]; var color = opts.color; var prefix = opts.prefix; if (prefix) { var arr = this.align ? this.types : [prefix]; msg.unshift(chalk[color](lpadAlign(prefix, arr, this.indent))); } this.stream.write(msg.join(this.separator)); this.stream.write('\n'); return this; };