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 authored and codebytere committed Mar 14, 2020
1 parent bc4cbe3 commit f068788
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');

const { RegExp } = primordials;

Expand Down Expand Up @@ -40,8 +40,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 f068788

Please sign in to comment.