JAVASCRIPT   308

node.js

Guest on 19th July 2021 07:14:06 PM

  1. /**
  2.  * Module dependencies.
  3.  */
  4.  
  5. var tty = require('tty');
  6. var util = require('util');
  7.  
  8. /**
  9.  * This is the Node.js implementation of `debug()`.
  10.  *
  11.  * Expose `debug()` as the module.
  12.  */
  13.  
  14. exports = module.exports = require('./debug');
  15. exports.init = init;
  16. exports.log = log;
  17. exports.formatArgs = formatArgs;
  18. exports.save = save;
  19. exports.load = load;
  20. exports.useColors = useColors;
  21.  
  22. /**
  23.  * Colors.
  24.  */
  25.  
  26. exports.colors = [6, 2, 3, 4, 5, 1];
  27.  
  28. /**
  29.  * Build up the default `inspectOpts` object from the environment variables.
  30.  *
  31.  *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
  32.  */
  33.  
  34. exports.inspectOpts = Object.keys(process.env).filter(function (key) {
  35.   return /^debug_/i.test(key);
  36. }).reduce(function (obj, key) {
  37.   // camel-case
  38.   var prop = key
  39.     .substring(6)
  40.     .toLowerCase()
  41.     .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() });
  42.  
  43.   // coerce string value into JS value
  44.   var val = process.env[key];
  45.   if (/^(yes|on|true|enabled)$/i.test(val)) val = true;
  46.   else if (/^(no|off|false|disabled)$/i.test(val)) val = false;
  47.   else if (val === 'null') val = null;
  48.   else val = Number(val);
  49.  
  50.   obj[prop] = val;
  51.   return obj;
  52. }, {});
  53.  
  54. /**
  55.  * The file descriptor to write the `debug()` calls to.
  56.  * Set the `DEBUG_FD` env variable to override with another value. i.e.:
  57.  *
  58.  *   $ DEBUG_FD=3 node script.js 3>debug.log
  59.  */
  60.  
  61. var fd = parseInt(process.env.DEBUG_FD, 10) || 2;
  62.  
  63. if (1 !== fd && 2 !== fd) {
  64.   util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')()
  65. }
  66.  
  67. var stream = 1 === fd ? process.stdout :
  68.              2 === fd ? process.stderr :
  69.              createWritableStdioStream(fd);
  70.  
  71. /**
  72.  * Is stdout a TTY? Colored output is enabled when `true`.
  73.  */
  74.  
  75. function useColors() {
  76.   return 'colors' in exports.inspectOpts
  77.     ? Boolean(exports.inspectOpts.colors)
  78.     : tty.isatty(fd);
  79. }
  80.  
  81. /**
  82.  * Map %o to `util.inspect()`, all on a single line.
  83.  */
  84.  
  85. exports.formatters.o = function(v) {
  86.   this.inspectOpts.colors = this.useColors;
  87.   return util.inspect(v, this.inspectOpts)
  88.     .split('\n').map(function(str) {
  89.       return str.trim()
  90.     }).join(' ');
  91. };
  92.  
  93. /**
  94.  * Map %o to `util.inspect()`, allowing multiple lines if needed.
  95.  */
  96.  
  97. exports.formatters.O = function(v) {
  98.   this.inspectOpts.colors = this.useColors;
  99.   return util.inspect(v, this.inspectOpts);
  100. };
  101.  
  102. /**
  103.  * Adds ANSI color escape codes if enabled.
  104.  *
  105.  * @api public
  106.  */
  107.  
  108. function formatArgs(args) {
  109.   var name = this.namespace;
  110.   var useColors = this.useColors;
  111.  
  112.   if (useColors) {
  113.     var c = this.color;
  114.     var prefix = '  \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m';
  115.  
  116.     args[0] = prefix + args[0].split('\n').join('\n' + prefix);
  117.     args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m');
  118.   } else {
  119.     args[0] = new Date().toUTCString()
  120.       + ' ' + name + ' ' + args[0];
  121.   }
  122. }
  123.  
  124. /**
  125.  * Invokes `util.format()` with the specified arguments and writes to `stream`.
  126.  */
  127.  
  128. function log() {
  129.   return stream.write(util.format.apply(util, arguments) + '\n');
  130. }
  131.  
  132. /**
  133.  * Save `namespaces`.
  134.  *
  135.  * @param {String} namespaces
  136.  * @api private
  137.  */
  138.  
  139. function save(namespaces) {
  140.   if (null == namespaces) {
  141.     // If you set a process.env field to null or undefined, it gets cast to the
  142.     // string 'null' or 'undefined'. Just delete instead.
  143.     delete process.env.DEBUG;
  144.   } else {
  145.     process.env.DEBUG = namespaces;
  146.   }
  147. }
  148.  
  149. /**
  150.  * Load `namespaces`.
  151.  *
  152.  * @return {String} returns the previously persisted debug modes
  153.  * @api private
  154.  */
  155.  
  156. function load() {
  157.   return process.env.DEBUG;
  158. }
  159.  
  160. /**
  161.  * Copied from `node/src/node.js`.
  162.  *
  163.  * XXX: It's lame that node doesn't expose this API out-of-the-box. It also
  164.  * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
  165.  */
  166.  
  167. function createWritableStdioStream (fd) {
  168.   var stream;
  169.   var tty_wrap = process.binding('tty_wrap');
  170.  
  171.   // Note stream._type is used for test-module-load-list.js
  172.  
  173.   switch (tty_wrap.guessHandleType(fd)) {
  174.     case 'TTY':
  175.       stream = new tty.WriteStream(fd);
  176.       stream._type = 'tty';
  177.  
  178.       // Hack to have stream not keep the event loop alive.
  179.       // See https://github.com/joyent/node/issues/1726
  180.       if (stream._handle && stream._handle.unref) {
  181.         stream._handle.unref();
  182.       }
  183.       break;
  184.  
  185.     case 'FILE':
  186.       var fs = require('fs');
  187.       stream = new fs.SyncWriteStream(fd, { autoClose: false });
  188.       stream._type = 'fs';
  189.       break;
  190.  
  191.     case 'PIPE':
  192.     case 'TCP':
  193.       var net = require('net');
  194.       stream = new net.Socket({
  195.         fd: fd,
  196.         readable: false,
  197.         writable: true
  198.       });
  199.  
  200.       // FIXME Should probably have an option in net.Socket to create a
  201.       // stream from an existing fd which is writable only. But for now
  202.       // we'll just add this hack and set the `readable` member to false.
  203.       // Test: ./node test/fixtures/echo.js < /etc/passwd
  204.       stream.readable = false;
  205.       stream.read = null;
  206.       stream._type = 'pipe';
  207.  
  208.       // FIXME Hack to have stream not keep the event loop alive.
  209.       // See https://github.com/joyent/node/issues/1726
  210.       if (stream._handle && stream._handle.unref) {
  211.         stream._handle.unref();
  212.       }
  213.       break;
  214.  
  215.     default:
  216.       // Probably an error on in uv_guess_handle()
  217.       throw new Error('Implement me. Unknown stream file type!');
  218.   }
  219.  
  220.   // For supporting legacy API we put the FD here.
  221.   stream.fd = fd;
  222.  
  223.   stream._isStdio = true;
  224.  
  225.   return stream;
  226. }
  227.  
  228. /**
  229.  * Init logic for `debug` instances.
  230.  *
  231.  * Create a new `inspectOpts` object in case `useColors` is set
  232.  * differently for a particular `debug` instance.
  233.  */
  234.  
  235. function init (debug) {
  236.   debug.inspectOpts = {};
  237.  
  238.   var keys = Object.keys(exports.inspectOpts);
  239.   for (var i = 0; i < keys.length; i++) {
  240.     debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
  241.   }
  242. }
  243.  
  244. /**
  245.  * Enable namespaces listed in `process.env.DEBUG` initially.
  246.  */
  247.  
  248. exports.enable(load());

Raw Paste


Login or Register to edit or fork this paste. It's free.