| /** |
| * Module dependencies. |
| */ |
| |
| const tty = require('tty'); |
| const util = require('util'); |
| |
| /** |
| * This is the Node.js implementation of `debug()`. |
| */ |
| |
| exports.init = init; |
| exports.log = log; |
| exports.formatArgs = formatArgs; |
| exports.save = save; |
| exports.load = load; |
| exports.useColors = useColors; |
| |
| /** |
| * Colors. |
| */ |
| |
| exports.colors = [6, 2, 3, 4, 5, 1]; |
| |
| try { |
| // Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json) |
| // eslint-disable-next-line import/no-extraneous-dependencies |
| const supportsColor = require('supports-color'); |
| |
| if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) { |
| exports.colors = [ |
| 20, |
| 21, |
| 26, |
| 27, |
| 32, |
| 33, |
| 38, |
| 39, |
| 40, |
| 41, |
| 42, |
| 43, |
| 44, |
| 45, |
| 56, |
| 57, |
| 62, |
| 63, |
| 68, |
| 69, |
| 74, |
| 75, |
| 76, |
| 77, |
| 78, |
| 79, |
| 80, |
| 81, |
| 92, |
| 93, |
| 98, |
| 99, |
| 112, |
| 113, |
| 128, |
| 129, |
| 134, |
| 135, |
| 148, |
| 149, |
| 160, |
| 161, |
| 162, |
| 163, |
| 164, |
| 165, |
| 166, |
| 167, |
| 168, |
| 169, |
| 170, |
| 171, |
| 172, |
| 173, |
| 178, |
| 179, |
| 184, |
| 185, |
| 196, |
| 197, |
| 198, |
| 199, |
| 200, |
| 201, |
| 202, |
| 203, |
| 204, |
| 205, |
| 206, |
| 207, |
| 208, |
| 209, |
| 214, |
| 215, |
| 220, |
| 221 |
| ]; |
| } |
| } catch (error) { |
| // Swallow - we only care if `supports-color` is available; it doesn't have to be. |
| } |
| |
| /** |
| * Build up the default `inspectOpts` object from the environment variables. |
| * |
| * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js |
| */ |
| |
| exports.inspectOpts = Object.keys(process.env).filter(key => { |
| return /^debug_/i.test(key); |
| }).reduce((obj, key) => { |
| // Camel-case |
| const prop = key |
| .substring(6) |
| .toLowerCase() |
| .replace(/_([a-z])/g, (_, k) => { |
| return k.toUpperCase(); |
| }); |
| |
| // Coerce string value into JS value |
| let val = process.env[key]; |
| if (/^(yes|on|true|enabled)$/i.test(val)) { |
| val = true; |
| } else if (/^(no|off|false|disabled)$/i.test(val)) { |
| val = false; |
| } else if (val === 'null') { |
| val = null; |
| } else { |
| val = Number(val); |
| } |
| |
| obj[prop] = val; |
| return obj; |
| }, {}); |
| |
| /** |
| * Is stdout a TTY? Colored output is enabled when `true`. |
| */ |
| |
| function useColors() { |
| return 'colors' in exports.inspectOpts ? |
| Boolean(exports.inspectOpts.colors) : |
| tty.isatty(process.stderr.fd); |
| } |
| |
| /** |
| * Adds ANSI color escape codes if enabled. |
| * |
| * @api public |
| */ |
| |
| function formatArgs(args) { |
| const {namespace: name, useColors} = this; |
| |
| if (useColors) { |
| const c = this.color; |
| const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c); |
| const prefix = ` ${colorCode};1m${name} \u001B[0m`; |
| |
| args[0] = prefix + args[0].split('\n').join('\n' + prefix); |
| args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m'); |
| } else { |
| args[0] = getDate() + name + ' ' + args[0]; |
| } |
| } |
| |
| function getDate() { |
| if (exports.inspectOpts.hideDate) { |
| return ''; |
| } |
| return new Date().toISOString() + ' '; |
| } |
| |
| /** |
| * Invokes `util.format()` with the specified arguments and writes to stderr. |
| */ |
| |
| function log(...args) { |
| return process.stderr.write(util.format(...args) + '\n'); |
| } |
| |
| /** |
| * Save `namespaces`. |
| * |
| * @param {String} namespaces |
| * @api private |
| */ |
| function save(namespaces) { |
| if (namespaces) { |
| process.env.DEBUG = namespaces; |
| } else { |
| // If you set a process.env field to null or undefined, it gets cast to the |
| // string 'null' or 'undefined'. Just delete instead. |
| delete process.env.DEBUG; |
| } |
| } |
| |
| /** |
| * Load `namespaces`. |
| * |
| * @return {String} returns the previously persisted debug modes |
| * @api private |
| */ |
| |
| function load() { |
| return process.env.DEBUG; |
| } |
| |
| /** |
| * Init logic for `debug` instances. |
| * |
| * Create a new `inspectOpts` object in case `useColors` is set |
| * differently for a particular `debug` instance. |
| */ |
| |
| function init(debug) { |
| debug.inspectOpts = {}; |
| |
| const keys = Object.keys(exports.inspectOpts); |
| for (let i = 0; i < keys.length; i++) { |
| debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; |
| } |
| } |
| |
| module.exports = require('./common')(exports); |
| |
| const {formatters} = module.exports; |
| |
| /** |
| * Map %o to `util.inspect()`, all on a single line. |
| */ |
| |
| formatters.o = function (v) { |
| this.inspectOpts.colors = this.useColors; |
| return util.inspect(v, this.inspectOpts) |
| .replace(/\s*\n\s*/g, ' '); |
| }; |
| |
| /** |
| * Map %O to `util.inspect()`, allowing multiple lines if needed. |
| */ |
| |
| formatters.O = function (v) { |
| this.inspectOpts.colors = this.useColors; |
| return util.inspect(v, this.inspectOpts); |
| }; |