1
|
/**
|
2
|
* This is the web browser implementation of `debug()`.
|
3
|
*
|
4
|
* Expose `debug()` as the module.
|
5
|
*/
|
6
|
|
7
|
exports = module.exports = require('./debug');
|
8
|
exports.log = log;
|
9
|
exports.formatArgs = formatArgs;
|
10
|
exports.save = save;
|
11
|
exports.load = load;
|
12
|
exports.useColors = useColors;
|
13
|
exports.storage = 'undefined' != typeof chrome
|
14
|
&& 'undefined' != typeof chrome.storage
|
15
|
? chrome.storage.local
|
16
|
: localstorage();
|
17
|
|
18
|
/**
|
19
|
* Colors.
|
20
|
*/
|
21
|
|
22
|
exports.colors = [
|
23
|
'lightseagreen',
|
24
|
'forestgreen',
|
25
|
'goldenrod',
|
26
|
'dodgerblue',
|
27
|
'darkorchid',
|
28
|
'crimson'
|
29
|
];
|
30
|
|
31
|
/**
|
32
|
* Currently only WebKit-based Web Inspectors, Firefox >= v31,
|
33
|
* and the Firebug extension (any Firefox version) are known
|
34
|
* to support "%c" CSS customizations.
|
35
|
*
|
36
|
* TODO: add a `localStorage` variable to explicitly enable/disable colors
|
37
|
*/
|
38
|
|
39
|
function useColors() {
|
40
|
// NB: In an Electron preload script, document will be defined but not fully
|
41
|
// initialized. Since we know we're in Chrome, we'll just detect this case
|
42
|
// explicitly
|
43
|
if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
|
44
|
return true;
|
45
|
}
|
46
|
|
47
|
// is webkit? http://stackoverflow.com/a/16459606/376773
|
48
|
// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
|
49
|
return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
|
50
|
// is firebug? http://stackoverflow.com/a/398120/376773
|
51
|
(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
|
52
|
// is firefox >= v31?
|
53
|
// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
|
54
|
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
|
55
|
// double check webkit in userAgent just in case we are in a worker
|
56
|
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
|
57
|
}
|
58
|
|
59
|
/**
|
60
|
* Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
|
61
|
*/
|
62
|
|
63
|
exports.formatters.j = function(v) {
|
64
|
try {
|
65
|
return JSON.stringify(v);
|
66
|
} catch (err) {
|
67
|
return '[UnexpectedJSONParseError]: ' + err.message;
|
68
|
}
|
69
|
};
|
70
|
|
71
|
|
72
|
/**
|
73
|
* Colorize log arguments if enabled.
|
74
|
*
|
75
|
* @api public
|
76
|
*/
|
77
|
|
78
|
function formatArgs(args) {
|
79
|
var useColors = this.useColors;
|
80
|
|
81
|
args[0] = (useColors ? '%c' : '')
|
82
|
+ this.namespace
|
83
|
+ (useColors ? ' %c' : ' ')
|
84
|
+ args[0]
|
85
|
+ (useColors ? '%c ' : ' ')
|
86
|
+ '+' + exports.humanize(this.diff);
|
87
|
|
88
|
if (!useColors) return;
|
89
|
|
90
|
var c = 'color: ' + this.color;
|
91
|
args.splice(1, 0, c, 'color: inherit')
|
92
|
|
93
|
// the final "%c" is somewhat tricky, because there could be other
|
94
|
// arguments passed either before or after the %c, so we need to
|
95
|
// figure out the correct index to insert the CSS into
|
96
|
var index = 0;
|
97
|
var lastC = 0;
|
98
|
args[0].replace(/%[a-zA-Z%]/g, function(match) {
|
99
|
if ('%%' === match) return;
|
100
|
index++;
|
101
|
if ('%c' === match) {
|
102
|
// we only are interested in the *last* %c
|
103
|
// (the user may have provided their own)
|
104
|
lastC = index;
|
105
|
}
|
106
|
});
|
107
|
|
108
|
args.splice(lastC, 0, c);
|
109
|
}
|
110
|
|
111
|
/**
|
112
|
* Invokes `console.log()` when available.
|
113
|
* No-op when `console.log` is not a "function".
|
114
|
*
|
115
|
* @api public
|
116
|
*/
|
117
|
|
118
|
function log() {
|
119
|
// this hackery is required for IE8/9, where
|
120
|
// the `console.log` function doesn't have 'apply'
|
121
|
return 'object' === typeof console
|
122
|
&& console.log
|
123
|
&& Function.prototype.apply.call(console.log, console, arguments);
|
124
|
}
|
125
|
|
126
|
/**
|
127
|
* Save `namespaces`.
|
128
|
*
|
129
|
* @param {String} namespaces
|
130
|
* @api private
|
131
|
*/
|
132
|
|
133
|
function save(namespaces) {
|
134
|
try {
|
135
|
if (null == namespaces) {
|
136
|
exports.storage.removeItem('debug');
|
137
|
} else {
|
138
|
exports.storage.debug = namespaces;
|
139
|
}
|
140
|
} catch(e) {}
|
141
|
}
|
142
|
|
143
|
/**
|
144
|
* Load `namespaces`.
|
145
|
*
|
146
|
* @return {String} returns the previously persisted debug modes
|
147
|
* @api private
|
148
|
*/
|
149
|
|
150
|
function load() {
|
151
|
var r;
|
152
|
try {
|
153
|
r = exports.storage.debug;
|
154
|
} catch(e) {}
|
155
|
|
156
|
// If debug isn't set in LS, and we're in Electron, try to load $DEBUG
|
157
|
if (!r && typeof process !== 'undefined' && 'env' in process) {
|
158
|
r = process.env.DEBUG;
|
159
|
}
|
160
|
|
161
|
return r;
|
162
|
}
|
163
|
|
164
|
/**
|
165
|
* Enable namespaces listed in `localStorage.debug` initially.
|
166
|
*/
|
167
|
|
168
|
exports.enable(load());
|
169
|
|
170
|
/**
|
171
|
* Localstorage attempts to return the localstorage.
|
172
|
*
|
173
|
* This is necessary because safari throws
|
174
|
* when a user disables cookies/localstorage
|
175
|
* and you attempt to access it.
|
176
|
*
|
177
|
* @return {LocalStorage}
|
178
|
* @api private
|
179
|
*/
|
180
|
|
181
|
function localstorage() {
|
182
|
try {
|
183
|
return window.localStorage;
|
184
|
} catch (e) {}
|
185
|
}
|