aboutsummaryrefslogtreecommitdiff
path: root/node_modules/webpack-log/index.js
blob: 79a2cabd6e4c5be19089b1ba05587d530bdfab20 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
'use strict';

const chalk = require('chalk');
const loglevel = require('loglevelnext'); //eslint-disable-line
const logSymbols = require('log-symbols');
const uuid = require('uuid/v4');

const symbols = {
  trace: chalk.grey('₸'),
  debug: chalk.cyan('➤'),
  info: logSymbols.info,
  warn: logSymbols.warning,
  error: logSymbols.error
};

const defaults = {
  name: '<unknown>',
  level: 'info',
  unique: true
};

const prefix = {
  level: opts => symbols[opts.level],
  template: `{{level}} ${chalk.gray('「{{name}}」')}: `
};

module.exports = function webpackLog(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;
};

// NOTE: this is exported so that consumers of webpack-log can use the same
//       version of chalk to decorate log messages without incurring additional
//       dependency overhead. This is an atypical practice, but chalk version
//       segmentation is a common issue.
module.exports.chalk = chalk;

/**
 * @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;