Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Avatar for KuCalc : devops.
Download
50650 views
1
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
}
203
204