summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/console.js27
-rw-r--r--test/parallel/test-console-group.js36
2 files changed, 56 insertions, 7 deletions
diff --git a/lib/console.js b/lib/console.js
index 13e3c05631..54c8aba829 100644
--- a/lib/console.js
+++ b/lib/console.js
@@ -60,6 +60,8 @@ function Console(stdout, stderr, ignoreErrors = true) {
Object.defineProperty(this, '_stderrErrorHandler', prop);
this[kCounts] = new Map();
+
+ Object.defineProperty(this, kGroupIndent, { writable: true });
this[kGroupIndent] = '';
// 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);
// 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) {
write(this._ignoreErrors,
this._stdout,
- `${this[kGroupIndent]}${util.format.apply(null, args)}\n`,
- this._stdoutErrorHandler);
+ util.format.apply(null, args),
+ this._stdoutErrorHandler,
+ this[kGroupIndent]);
};
@@ -126,8 +137,9 @@ Console.prototype.info = Console.prototype.log;
Console.prototype.warn = function warn(...args) {
write(this._ignoreErrors,
this._stderr,
- `${this[kGroupIndent]}${util.format.apply(null, args)}\n`,
- this._stderrErrorHandler);
+ util.format.apply(null, args),
+ this._stderrErrorHandler,
+ this[kGroupIndent]);
};
@@ -138,8 +150,9 @@ Console.prototype.dir = function dir(object, options) {
options = Object.assign({ customInspect: false }, options);
write(this._ignoreErrors,
this._stdout,
- `${this[kGroupIndent]}${util.inspect(object, options)}\n`,
- this._stdoutErrorHandler);
+ util.inspect(object, options),
+ this._stdoutErrorHandler,
+ this[kGroupIndent]);
};
diff --git a/test/parallel/test-console-group.js b/test/parallel/test-console-group.js
index 8f7d84f2f1..8486d1a7ac 100644
--- a/test/parallel/test-console-group.js
+++ b/test/parallel/test-console-group.js
@@ -109,3 +109,39 @@ function teardown() {
assert.strictEqual(stderr, expectedErr);
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');
+}