UNPKG

4.15 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 (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 levelFormatter: function (level) {
29 return level.toUpperCase();
30 },
31 nameFormatter: function (name) {
32 return name || 'root';
33 },
34 timestampFormatter: function (date) {
35 return date.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, '$1');
36 },
37 format: undefined
38 };
39
40 var loglevel;
41 var configs = {};
42
43 var reg = function (rootLogger) {
44 if (!rootLogger || !rootLogger.getLogger) {
45 throw new TypeError('Argument is not a root logger');
46 }
47 loglevel = rootLogger;
48 };
49
50 var apply = function (logger, config) {
51 if (!logger || !logger.setLevel) {
52 throw new TypeError('Argument is not a logger');
53 }
54
55 /* eslint-disable vars-on-top */
56 var originalFactory = logger.methodFactory;
57 var name = logger.name || '';
58 var parent = configs[name] || configs[''] || defaults;
59 /* eslint-enable vars-on-top */
60
61 function methodFactory(methodName, logLevel, loggerName) {
62 var originalMethod = originalFactory(methodName, logLevel, loggerName);
63 var options = configs[loggerName] || configs[''];
64
65 var hasTimestamp = options.template.indexOf('%t') !== -1;
66 var hasLevel = options.template.indexOf('%l') !== -1;
67 var hasName = options.template.indexOf('%n') !== -1;
68
69 return function () {
70 var content = '';
71
72 var length = arguments.length;
73 var args = Array(length);
74 var key = 0;
75 for (; key < length; key++) {
76 args[key] = arguments[key];
77 }
78
79 // skip the root method for child loggers to prevent duplicate logic
80 if (name || !configs[loggerName]) {
81 /* eslint-disable vars-on-top */
82 var timestamp = options.timestampFormatter(new Date());
83 var level = options.levelFormatter(methodName);
84 var lname = options.nameFormatter(loggerName);
85 /* eslint-enable vars-on-top */
86
87 if (options.format) {
88 content += options.format(level, lname, timestamp);
89 } else {
90 content += options.template;
91 if (hasTimestamp) {
92 content = content.replace(/%t/, timestamp);
93 }
94 if (hasLevel) content = content.replace(/%l/, level);
95 if (hasName) content = content.replace(/%n/, lname);
96 }
97
98 if (args.length && typeof args[0] === 'string') {
99 // concat prefix with first argument to support string substitutions
100 args[0] = content + ' ' + args[0];
101 } else {
102 args.unshift(content);
103 }
104 }
105
106 originalMethod.apply(undefined, args);
107 };
108 }
109
110 if (!configs[name]) {
111 logger.methodFactory = methodFactory;
112 }
113
114 // for remove inherited format option if template option preset
115 config = config || {};
116 if (config.template) config.format = undefined;
117
118 configs[name] = merge({}, parent, config);
119
120 logger.setLevel(logger.getLevel());
121
122 if (!loglevel) {
123 logger.warn(
124 'It is necessary to call the function reg() of loglevel-plugin-prefix before calling apply. From the next release, it will throw an error. See more: https://github.com/kutuluk/loglevel-plugin-prefix/blob/master/README.md'
125 );
126 }
127
128 return logger;
129 };
130
131 var api = {
132 reg: reg,
133 apply: apply
134 };
135
136 var save;
137
138 if (root) {
139 save = root.prefix;
140 api.noConflict = function () {
141 if (root.prefix === api) {
142 root.prefix = save;
143 }
144 return api;
145 };
146 }
147
148 return api;
149}));