Skip to content

Commit

Permalink
util: add colors to debuglog()
Browse files Browse the repository at this point in the history
This adds colors to the passed through arguments in case the stream
supports colors. The PID will also be highlighted.

PR-URL: #30930
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information
BridgeAR committed Dec 25, 2019
1 parent be3c7ac commit a034583
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 9 deletions.
8 changes: 5 additions & 3 deletions lib/internal/util/debuglog.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

const { format } = require('internal/util/inspect');
const { inspect, format, formatWithOptions } = require('internal/util/inspect');

// `debugs` is deliberately initialized to undefined so any call to
// debuglog() before initializeDebugEnv() is called will throw.
Expand Down Expand Up @@ -38,8 +38,10 @@ function debuglogImpl(set) {
const pid = process.pid;
emitWarningIfNeeded(set);
debugs[set] = function debug(...args) {
const msg = format(...args);
process.stderr.write(format('%s %d: %s\n', set, pid, msg));
const colors = process.stderr.hasColors && process.stderr.hasColors();
const msg = formatWithOptions({ colors }, ...args);
const coloredPID = inspect(pid, { colors });
process.stderr.write(format('%s %s: %s\n', set, coloredPID, msg));
};
} else {
debugs[set] = null;
Expand Down
38 changes: 32 additions & 6 deletions test/sequential/test-util-debug.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const util = require('util');

const [, , modeArgv, sectionArgv] = process.argv;

Expand Down Expand Up @@ -54,19 +55,36 @@ function parent() {
test('*-test', true, 'abc-test');
}

function test(environ, shouldWrite, section) {
function test(environ, shouldWrite, section, forceColors = false) {
let expectErr = '';
const expectOut = 'ok\n';

const spawn = require('child_process').spawn;
const child = spawn(process.execPath, [__filename, 'child', section], {
env: Object.assign(process.env, { NODE_DEBUG: environ })
env: Object.assign(process.env, {
NODE_DEBUG: environ,
FORCE_COLOR: forceColors ? 'true' : 'false'
})
});

if (shouldWrite) {
expectErr =
`${section.toUpperCase()} ${child.pid}: this { is: 'a' } /debugging/\n${
section.toUpperCase()} ${child.pid}: num=1 str=a obj={"foo":"bar"}\n`;
if (forceColors) {
const { colors, styles } = util.inspect;
const addCodes = (arr) => [`\x1B[${arr[0]}m`, `\x1B[${arr[1]}m`];
const num = addCodes(colors[styles.number]);
const str = addCodes(colors[styles.string]);
const regexp = addCodes(colors[styles.regexp]);
const start = `${section.toUpperCase()} ${num[0]}${child.pid}${num[1]}`;
const debugging = `${regexp[0]}/debugging/${regexp[1]}`;
expectErr =
`${start}: this { is: ${str[0]}'a'${str[1]} } ${debugging}\n` +
`${start}: num=1 str=a obj={"foo":"bar"}\n`;
} else {
const start = `${section.toUpperCase()} ${child.pid}`;
expectErr =
`${start}: this { is: 'a' } /debugging/\n` +
`${start}: num=1 str=a obj={"foo":"bar"}\n`;
}
}

let err = '';
Expand All @@ -85,12 +103,20 @@ function test(environ, shouldWrite, section) {
assert(!c);
assert.strictEqual(err, expectErr);
assert.strictEqual(out, expectOut);
// Run the test again, this time with colors enabled.
if (!forceColors) {
test(environ, shouldWrite, section, true);
}
}));
}


function child(section) {
const util = require('util');
const tty = require('tty');
// Make sure we check for colors, no matter of the stream's default.
Object.defineProperty(process.stderr, 'hasColors', {
value: tty.WriteStream.prototype.hasColors
});
const debug = util.debuglog(section);
debug('this', { is: 'a' }, /debugging/);
debug('num=%d str=%s obj=%j', 1, 'a', { foo: 'bar' });
Expand Down

0 comments on commit a034583

Please sign in to comment.