You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
4.6 KiB
185 lines
4.6 KiB
/** |
|
* This is the web browser implementation of `debug()`. |
|
* |
|
* Expose `debug()` as the module. |
|
*/ |
|
|
|
exports = module.exports = require('./debug'); |
|
exports.log = log; |
|
exports.formatArgs = formatArgs; |
|
exports.save = save; |
|
exports.load = load; |
|
exports.useColors = useColors; |
|
exports.storage = 'undefined' != typeof chrome |
|
&& 'undefined' != typeof chrome.storage |
|
? chrome.storage.local |
|
: localstorage(); |
|
|
|
/** |
|
* Colors. |
|
*/ |
|
|
|
exports.colors = [ |
|
'lightseagreen', |
|
'forestgreen', |
|
'goldenrod', |
|
'dodgerblue', |
|
'darkorchid', |
|
'crimson' |
|
]; |
|
|
|
/** |
|
* Currently only WebKit-based Web Inspectors, Firefox >= v31, |
|
* and the Firebug extension (any Firefox version) are known |
|
* to support "%c" CSS customizations. |
|
* |
|
* TODO: add a `localStorage` variable to explicitly enable/disable colors |
|
*/ |
|
|
|
function useColors() { |
|
// NB: In an Electron preload script, document will be defined but not fully |
|
// initialized. Since we know we're in Chrome, we'll just detect this case |
|
// explicitly |
|
if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { |
|
return true; |
|
} |
|
|
|
// is webkit? http://stackoverflow.com/a/16459606/376773 |
|
// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 |
|
return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || |
|
// is firebug? http://stackoverflow.com/a/398120/376773 |
|
(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || |
|
// is firefox >= v31? |
|
// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages |
|
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || |
|
// double check webkit in userAgent just in case we are in a worker |
|
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); |
|
} |
|
|
|
/** |
|
* Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. |
|
*/ |
|
|
|
exports.formatters.j = function(v) { |
|
try { |
|
return JSON.stringify(v); |
|
} catch (err) { |
|
return '[UnexpectedJSONParseError]: ' + err.message; |
|
} |
|
}; |
|
|
|
|
|
/** |
|
* Colorize log arguments if enabled. |
|
* |
|
* @api public |
|
*/ |
|
|
|
function formatArgs(args) { |
|
var useColors = this.useColors; |
|
|
|
args[0] = (useColors ? '%c' : '') |
|
+ this.namespace |
|
+ (useColors ? ' %c' : ' ') |
|
+ args[0] |
|
+ (useColors ? '%c ' : ' ') |
|
+ '+' + exports.humanize(this.diff); |
|
|
|
if (!useColors) return; |
|
|
|
var c = 'color: ' + this.color; |
|
args.splice(1, 0, c, 'color: inherit') |
|
|
|
// the final "%c" is somewhat tricky, because there could be other |
|
// arguments passed either before or after the %c, so we need to |
|
// figure out the correct index to insert the CSS into |
|
var index = 0; |
|
var lastC = 0; |
|
args[0].replace(/%[a-zA-Z%]/g, function(match) { |
|
if ('%%' === match) return; |
|
index++; |
|
if ('%c' === match) { |
|
// we only are interested in the *last* %c |
|
// (the user may have provided their own) |
|
lastC = index; |
|
} |
|
}); |
|
|
|
args.splice(lastC, 0, c); |
|
} |
|
|
|
/** |
|
* Invokes `console.log()` when available. |
|
* No-op when `console.log` is not a "function". |
|
* |
|
* @api public |
|
*/ |
|
|
|
function log() { |
|
// this hackery is required for IE8/9, where |
|
// the `console.log` function doesn't have 'apply' |
|
return 'object' === typeof console |
|
&& console.log |
|
&& Function.prototype.apply.call(console.log, console, arguments); |
|
} |
|
|
|
/** |
|
* Save `namespaces`. |
|
* |
|
* @param {String} namespaces |
|
* @api private |
|
*/ |
|
|
|
function save(namespaces) { |
|
try { |
|
if (null == namespaces) { |
|
exports.storage.removeItem('debug'); |
|
} else { |
|
exports.storage.debug = namespaces; |
|
} |
|
} catch(e) {} |
|
} |
|
|
|
/** |
|
* Load `namespaces`. |
|
* |
|
* @return {String} returns the previously persisted debug modes |
|
* @api private |
|
*/ |
|
|
|
function load() { |
|
var r; |
|
try { |
|
r = exports.storage.debug; |
|
} catch(e) {} |
|
|
|
// If debug isn't set in LS, and we're in Electron, try to load $DEBUG |
|
if (!r && typeof process !== 'undefined' && 'env' in process) { |
|
r = process.env.DEBUG; |
|
} |
|
|
|
return r; |
|
} |
|
|
|
/** |
|
* Enable namespaces listed in `localStorage.debug` initially. |
|
*/ |
|
|
|
exports.enable(load()); |
|
|
|
/** |
|
* Localstorage attempts to return the localstorage. |
|
* |
|
* This is necessary because safari throws |
|
* when a user disables cookies/localstorage |
|
* and you attempt to access it. |
|
* |
|
* @return {LocalStorage} |
|
* @api private |
|
*/ |
|
|
|
function localstorage() { |
|
try { |
|
return window.localStorage; |
|
} catch (e) {} |
|
}
|
|
|