1 |
3a515b92
|
cagy
|
|
2 |
|
|
/**
|
3 |
|
|
* This is the common logic for both the Node.js and web browser
|
4 |
|
|
* implementations of `debug()`.
|
5 |
|
|
*
|
6 |
|
|
* Expose `debug()` as the module.
|
7 |
|
|
*/
|
8 |
|
|
|
9 |
|
|
exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
|
10 |
|
|
exports.coerce = coerce;
|
11 |
|
|
exports.disable = disable;
|
12 |
|
|
exports.enable = enable;
|
13 |
|
|
exports.enabled = enabled;
|
14 |
|
|
exports.humanize = require('ms');
|
15 |
|
|
|
16 |
|
|
/**
|
17 |
|
|
* The currently active debug mode names, and names to skip.
|
18 |
|
|
*/
|
19 |
|
|
|
20 |
|
|
exports.names = [];
|
21 |
|
|
exports.skips = [];
|
22 |
|
|
|
23 |
|
|
/**
|
24 |
|
|
* Map of special "%n" handling functions, for the debug "format" argument.
|
25 |
|
|
*
|
26 |
|
|
* Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
|
27 |
|
|
*/
|
28 |
|
|
|
29 |
|
|
exports.formatters = {};
|
30 |
|
|
|
31 |
|
|
/**
|
32 |
|
|
* Previous log timestamp.
|
33 |
|
|
*/
|
34 |
|
|
|
35 |
|
|
var prevTime;
|
36 |
|
|
|
37 |
|
|
/**
|
38 |
|
|
* Select a color.
|
39 |
|
|
* @param {String} namespace
|
40 |
|
|
* @return {Number}
|
41 |
|
|
* @api private
|
42 |
|
|
*/
|
43 |
|
|
|
44 |
|
|
function selectColor(namespace) {
|
45 |
|
|
var hash = 0, i;
|
46 |
|
|
|
47 |
|
|
for (i in namespace) {
|
48 |
|
|
hash = ((hash << 5) - hash) + namespace.charCodeAt(i);
|
49 |
|
|
hash |= 0; // Convert to 32bit integer
|
50 |
|
|
}
|
51 |
|
|
|
52 |
|
|
return exports.colors[Math.abs(hash) % exports.colors.length];
|
53 |
|
|
}
|
54 |
|
|
|
55 |
|
|
/**
|
56 |
|
|
* Create a debugger with the given `namespace`.
|
57 |
|
|
*
|
58 |
|
|
* @param {String} namespace
|
59 |
|
|
* @return {Function}
|
60 |
|
|
* @api public
|
61 |
|
|
*/
|
62 |
|
|
|
63 |
|
|
function createDebug(namespace) {
|
64 |
|
|
|
65 |
|
|
function debug() {
|
66 |
|
|
// disabled?
|
67 |
|
|
if (!debug.enabled) return;
|
68 |
|
|
|
69 |
|
|
var self = debug;
|
70 |
|
|
|
71 |
|
|
// set `diff` timestamp
|
72 |
|
|
var curr = +new Date();
|
73 |
|
|
var ms = curr - (prevTime || curr);
|
74 |
|
|
self.diff = ms;
|
75 |
|
|
self.prev = prevTime;
|
76 |
|
|
self.curr = curr;
|
77 |
|
|
prevTime = curr;
|
78 |
|
|
|
79 |
|
|
// turn the `arguments` into a proper Array
|
80 |
|
|
var args = new Array(arguments.length);
|
81 |
|
|
for (var i = 0; i < args.length; i++) {
|
82 |
|
|
args[i] = arguments[i];
|
83 |
|
|
}
|
84 |
|
|
|
85 |
|
|
args[0] = exports.coerce(args[0]);
|
86 |
|
|
|
87 |
|
|
if ('string' !== typeof args[0]) {
|
88 |
|
|
// anything else let's inspect with %O
|
89 |
|
|
args.unshift('%O');
|
90 |
|
|
}
|
91 |
|
|
|
92 |
|
|
// apply any `formatters` transformations
|
93 |
|
|
var index = 0;
|
94 |
|
|
args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
|
95 |
|
|
// if we encounter an escaped % then don't increase the array index
|
96 |
|
|
if (match === '%%') return match;
|
97 |
|
|
index++;
|
98 |
|
|
var formatter = exports.formatters[format];
|
99 |
|
|
if ('function' === typeof formatter) {
|
100 |
|
|
var val = args[index];
|
101 |
|
|
match = formatter.call(self, val);
|
102 |
|
|
|
103 |
|
|
// now we need to remove `args[index]` since it's inlined in the `format`
|
104 |
|
|
args.splice(index, 1);
|
105 |
|
|
index--;
|
106 |
|
|
}
|
107 |
|
|
return match;
|
108 |
|
|
});
|
109 |
|
|
|
110 |
|
|
// apply env-specific formatting (colors, etc.)
|
111 |
|
|
exports.formatArgs.call(self, args);
|
112 |
|
|
|
113 |
|
|
var logFn = debug.log || exports.log || console.log.bind(console);
|
114 |
|
|
logFn.apply(self, args);
|
115 |
|
|
}
|
116 |
|
|
|
117 |
|
|
debug.namespace = namespace;
|
118 |
|
|
debug.enabled = exports.enabled(namespace);
|
119 |
|
|
debug.useColors = exports.useColors();
|
120 |
|
|
debug.color = selectColor(namespace);
|
121 |
|
|
|
122 |
|
|
// env-specific initialization logic for debug instances
|
123 |
|
|
if ('function' === typeof exports.init) {
|
124 |
|
|
exports.init(debug);
|
125 |
|
|
}
|
126 |
|
|
|
127 |
|
|
return debug;
|
128 |
|
|
}
|
129 |
|
|
|
130 |
|
|
/**
|
131 |
|
|
* Enables a debug mode by namespaces. This can include modes
|
132 |
|
|
* separated by a colon and wildcards.
|
133 |
|
|
*
|
134 |
|
|
* @param {String} namespaces
|
135 |
|
|
* @api public
|
136 |
|
|
*/
|
137 |
|
|
|
138 |
|
|
function enable(namespaces) {
|
139 |
|
|
exports.save(namespaces);
|
140 |
|
|
|
141 |
|
|
exports.names = [];
|
142 |
|
|
exports.skips = [];
|
143 |
|
|
|
144 |
|
|
var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
|
145 |
|
|
var len = split.length;
|
146 |
|
|
|
147 |
|
|
for (var i = 0; i < len; i++) {
|
148 |
|
|
if (!split[i]) continue; // ignore empty strings
|
149 |
|
|
namespaces = split[i].replace(/\*/g, '.*?');
|
150 |
|
|
if (namespaces[0] === '-') {
|
151 |
|
|
exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
|
152 |
|
|
} else {
|
153 |
|
|
exports.names.push(new RegExp('^' + namespaces + '$'));
|
154 |
|
|
}
|
155 |
|
|
}
|
156 |
|
|
}
|
157 |
|
|
|
158 |
|
|
/**
|
159 |
|
|
* Disable debug output.
|
160 |
|
|
*
|
161 |
|
|
* @api public
|
162 |
|
|
*/
|
163 |
|
|
|
164 |
|
|
function disable() {
|
165 |
|
|
exports.enable('');
|
166 |
|
|
}
|
167 |
|
|
|
168 |
|
|
/**
|
169 |
|
|
* Returns true if the given mode name is enabled, false otherwise.
|
170 |
|
|
*
|
171 |
|
|
* @param {String} name
|
172 |
|
|
* @return {Boolean}
|
173 |
|
|
* @api public
|
174 |
|
|
*/
|
175 |
|
|
|
176 |
|
|
function enabled(name) {
|
177 |
|
|
var i, len;
|
178 |
|
|
for (i = 0, len = exports.skips.length; i < len; i++) {
|
179 |
|
|
if (exports.skips[i].test(name)) {
|
180 |
|
|
return false;
|
181 |
|
|
}
|
182 |
|
|
}
|
183 |
|
|
for (i = 0, len = exports.names.length; i < len; i++) {
|
184 |
|
|
if (exports.names[i].test(name)) {
|
185 |
|
|
return true;
|
186 |
|
|
}
|
187 |
|
|
}
|
188 |
|
|
return false;
|
189 |
|
|
}
|
190 |
|
|
|
191 |
|
|
/**
|
192 |
|
|
* Coerce `val`.
|
193 |
|
|
*
|
194 |
|
|
* @param {Mixed} val
|
195 |
|
|
* @return {Mixed}
|
196 |
|
|
* @api private
|
197 |
|
|
*/
|
198 |
|
|
|
199 |
|
|
function coerce(val) {
|
200 |
|
|
if (val instanceof Error) return val.stack || val.message;
|
201 |
|
|
return val;
|
202 |
|
|
}
|