UNPKG

3.08 kBJavaScriptView Raw
1(function (root, factory) {
2 if (typeof define === 'function' && define.amd) {
3 define(factory);
4 } else if (typeof module === 'object' && module.exports) {
5 module.exports = factory();
6 } else {
7 root.prefix = factory(root);
8 }
9}(this, function (root) {
10 'use strict';
11
12 var merge = function merge(target) {
13 var i = 1;
14 var length = arguments.length;
15 var key;
16 for (; i < length; i++) {
17 for (key in arguments[i]) {
18 if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {
19 target[key] = arguments[i][key];
20 }
21 }
22 }
23 return target;
24 };
25
26 var defaults = {
27 template: '[%t] %l:',
28 timestampFormatter: function (date) {
29 return date.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, '$1');
30 },
31 levelFormatter: function (level) {
32 return level.toUpperCase();
33 },
34 nameFormatter: function (name) {
35 return name || 'root';
36 }
37 };
38
39 var loggers = {};
40
41 var apply = function apply(logger, config) {
42 if (!logger || !logger.setLevel) {
43 throw new TypeError('Argument is not a logger');
44 }
45
46 /* eslint-disable vars-on-top */
47 var isRoot = !!logger.getLogger;
48 var originalFactory = logger.methodFactory;
49 var name = logger.name || '';
50 var parent = loggers[name] || loggers[''] || defaults;
51 /* eslint-enable vars-on-top */
52
53 function methodFactory(methodName, logLevel, loggerName) {
54 var originalMethod = originalFactory(methodName, logLevel, loggerName);
55 var options = loggers[loggerName || ''];
56
57 var hasTimestamp = options.template.indexOf('%t') !== -1;
58 var hasLevel = options.template.indexOf('%l') !== -1;
59 var hasName = options.template.indexOf('%n') !== -1;
60
61 return function () {
62 var content = options.template;
63
64 var length = arguments.length;
65 var args = Array(length);
66 var key = 0;
67 for (; key < length; key++) {
68 args[key] = arguments[key];
69 }
70
71 if (!(isRoot && loggers[loggerName])) {
72 if (hasTimestamp) content = content.replace(/%t/, options.timestampFormatter(new Date()));
73 if (hasLevel) content = content.replace(/%l/, options.levelFormatter(methodName));
74 if (hasName) content = content.replace(/%n/, options.nameFormatter(loggerName));
75
76 if (args.length && typeof args[0] === 'string') {
77 // concat prefix with first argument to support string substitutions
78 args[0] = '' + content + ' ' + args[0];
79 } else {
80 args.unshift(content);
81 }
82 }
83
84 originalMethod.apply(undefined, args);
85 };
86 }
87
88 if (!loggers[name]) {
89 logger.methodFactory = methodFactory;
90 }
91 loggers[name] = merge({}, parent, config);
92
93 logger.setLevel(logger.getLevel());
94 return logger;
95 };
96
97 var api = {
98 apply: apply
99 };
100
101 var save;
102 if (root) {
103 save = root.prefix;
104 api.noConflict = function () {
105 if (root.prefix === api) {
106 root.prefix = save;
107 }
108 return api;
109 };
110 }
111
112 return api;
113}));