Projekt

Obecné

Profil

Stáhnout (4.62 KB) Statistiky
| Větev: | Revize:
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
}
(1-1/5)