Browse Source

console: improve console.group()

Preserve indentation for multiline strings, objects that span multiple
lines, etc.

also make groupIndent non-enumerable

Hide the internal `groupIndent` key a bit by making it non-enumerable
and non-configurable.

PR-URL: https://github.com/nodejs/node/pull/14999
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Timothy Gu <timothygu99@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Daijiro Wachi <daijiro.wachi@gmail.com>
Reviewed-By: Yuta Hiroto <hello@about-hiroppy.com>
canary-base
Rich Trott 8 years ago
committed by James M Snell
parent
commit
af11867b41
  1. 27
      lib/console.js
  2. 36
      test/parallel/test-console-group.js

27
lib/console.js

@ -60,6 +60,8 @@ function Console(stdout, stderr, ignoreErrors = true) {
Object.defineProperty(this, '_stderrErrorHandler', prop); Object.defineProperty(this, '_stderrErrorHandler', prop);
this[kCounts] = new Map(); this[kCounts] = new Map();
Object.defineProperty(this, kGroupIndent, { writable: true });
this[kGroupIndent] = ''; this[kGroupIndent] = '';
// bind the prototype functions to this Console instance // bind the prototype functions to this Console instance
@ -86,7 +88,15 @@ function createWriteErrorHandler(stream) {
}; };
} }
function write(ignoreErrors, stream, string, errorhandler) { function write(ignoreErrors, stream, string, errorhandler, groupIndent) {
if (groupIndent.length !== 0) {
if (string.indexOf('\n') !== -1) {
string = string.replace(/\n/g, `\n${groupIndent}`);
}
string = groupIndent + string;
}
string += '\n';
if (!ignoreErrors) return stream.write(string); if (!ignoreErrors) return stream.write(string);
// There may be an error occurring synchronously (e.g. for files or TTYs // There may be an error occurring synchronously (e.g. for files or TTYs
@ -115,8 +125,9 @@ function write(ignoreErrors, stream, string, errorhandler) {
Console.prototype.log = function log(...args) { Console.prototype.log = function log(...args) {
write(this._ignoreErrors, write(this._ignoreErrors,
this._stdout, this._stdout,
`${this[kGroupIndent]}${util.format.apply(null, args)}\n`, util.format.apply(null, args),
this._stdoutErrorHandler); this._stdoutErrorHandler,
this[kGroupIndent]);
}; };
@ -126,8 +137,9 @@ Console.prototype.info = Console.prototype.log;
Console.prototype.warn = function warn(...args) { Console.prototype.warn = function warn(...args) {
write(this._ignoreErrors, write(this._ignoreErrors,
this._stderr, this._stderr,
`${this[kGroupIndent]}${util.format.apply(null, args)}\n`, util.format.apply(null, args),
this._stderrErrorHandler); this._stderrErrorHandler,
this[kGroupIndent]);
}; };
@ -138,8 +150,9 @@ Console.prototype.dir = function dir(object, options) {
options = Object.assign({ customInspect: false }, options); options = Object.assign({ customInspect: false }, options);
write(this._ignoreErrors, write(this._ignoreErrors,
this._stdout, this._stdout,
`${this[kGroupIndent]}${util.inspect(object, options)}\n`, util.inspect(object, options),
this._stdoutErrorHandler); this._stdoutErrorHandler,
this[kGroupIndent]);
}; };

36
test/parallel/test-console-group.js

@ -109,3 +109,39 @@ function teardown() {
assert.strictEqual(stderr, expectedErr); assert.strictEqual(stderr, expectedErr);
teardown(); teardown();
} }
// Check that multiline strings and object output are indented properly.
{
setup();
const expectedOut = 'not indented\n' +
' indented\n' +
' also indented\n' +
" { also: 'a',\n" +
" multiline: 'object',\n" +
" should: 'be',\n" +
" indented: 'properly',\n" +
" kthx: 'bai' }\n";
const expectedErr = '';
c.log('not indented');
c.group();
c.log('indented\nalso indented');
c.log({ also: 'a',
multiline: 'object',
should: 'be',
indented: 'properly',
kthx: 'bai' });
assert.strictEqual(stdout, expectedOut);
assert.strictEqual(stderr, expectedErr);
teardown();
}
// Check that the kGroupIndent symbol property is not enumerable
{
const keys = Reflect.ownKeys(console)
.filter((val) => console.propertyIsEnumerable(val))
.map((val) => val.toString());
assert(!keys.includes('Symbol(groupIndent)'),
'groupIndent should not be enumerable');
}

Loading…
Cancel
Save