| /** | 
|  * 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) {} | 
| } |