'use strict'; /* global window: true */ /* eslint-disable no-shadow, no-param-reassign, space-before-function-paren */ const uuid = require('uuid/v4'); const colors = require('ansi-colors'); const loglevel = require('./loglevel'); const symbols = { trace: colors.grey('₸'), debug: colors.cyan('➤'), info: colors.blue(colors.symbols.info), warn: colors.yellow(colors.symbols.warning), error: colors.red(colors.symbols.cross) }; const defaults = { name: '', level: 'info', unique: true }; const prefix = { level (options) { return symbols[options.level]; }, template: `{{level}} ${colors.gray('「{{name}}」')}: ` }; function log (options) { const opts = Object.assign({}, defaults, options); const { id } = options; opts.prefix = Object.assign({}, prefix, options.prefix); delete opts.id; Object.defineProperty(opts, 'id', { get() { if (!id) { return this.name + (opts.unique ? `-${uuid()}` : ''); } return id; } }); if (opts.timestamp) { opts.prefix.template = `[{{time}}] ${opts.prefix.template}`; } const log = loglevel.getLogger(opts); if (!Object.prototype.hasOwnProperty.call(log, 'id')) { Object.defineProperty(log, 'id', { get() { return opts.id; } }); } return log; } module.exports = log; // NOTE: this is exported so that consumers of webpack-log can use the same // version of ansi-colors to decorate log messages without incurring additional // dependency overhead module.exports.colors = colors; // NOTE: This is an undocumented function solely for the purpose of tests. // Do not use this method in production code. Using in production code // may result in strange behavior. module.exports.delLogger = function delLogger(name) { delete loglevel.loggers[name]; }; module.exports.factories = loglevel.factories;