diff options
author | rickyes <mail@zhoumq.cn> | 2020-04-21 17:51:25 +0800 |
---|---|---|
committer | Michaƫl Zasso <targos@protonmail.com> | 2020-05-04 14:23:21 +0200 |
commit | c49e3ea20c2ce73bce64ea714e9cbfab001f97e0 (patch) | |
tree | 2b85948125f5d335683253061c7519dcd2ae8b86 | |
parent | 83e165bf884529c905f8903d969c2966a08410bb (diff) | |
download | node-new-c49e3ea20c2ce73bce64ea714e9cbfab001f97e0.tar.gz |
console: support console constructor groupIndentation option
PR-URL: https://github.com/nodejs/node/pull/32964
Fixes: https://github.com/nodejs/node/issues/32947
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: James M Snell <jasnell@gmail.com>
-rw-r--r-- | doc/api/console.md | 23 | ||||
-rw-r--r-- | lib/internal/console/constructor.js | 27 | ||||
-rw-r--r-- | test/parallel/test-console-group.js | 88 |
3 files changed, 122 insertions, 16 deletions
diff --git a/doc/api/console.md b/doc/api/console.md index 66fa862de8..9122b85efa 100644 --- a/doc/api/console.md +++ b/doc/api/console.md @@ -81,16 +81,19 @@ const { Console } = console; ### `new Console(options)` <!-- YAML changes: - - version: v8.0.0 - pr-url: https://github.com/nodejs/node/pull/9744 - description: The `ignoreErrors` option was introduced. + - version: REPLACEME + pr-url: https://github.com/nodejs/node/pull/32964 + description: The `groupIndentation` option was introduced. + - version: v11.7.0 + pr-url: https://github.com/nodejs/node/pull/24978 + description: The `inspectOptions` option is introduced. - version: v10.0.0 pr-url: https://github.com/nodejs/node/pull/19372 description: The `Console` constructor now supports an `options` argument, and the `colorMode` option was introduced. - - version: v11.7.0 - pr-url: https://github.com/nodejs/node/pull/24978 - description: The `inspectOptions` option is introduced. + - version: v8.0.0 + pr-url: https://github.com/nodejs/node/pull/9744 + description: The `ignoreErrors` option was introduced. --> * `options` {Object} @@ -107,6 +110,8 @@ changes: **Default:** `'auto'`. * `inspectOptions` {Object} Specifies options that are passed along to [`util.inspect()`][]. + * `groupIndentation` {number} Set group indentation. + **Default:** `2`. Creates a new `Console` with one or two writable stream instances. `stdout` is a writable stream to print log or info output. `stderr` is used for warning or @@ -306,7 +311,8 @@ added: v8.5.0 * `...label` {any} -Increases indentation of subsequent lines by two spaces. +Increases indentation of subsequent lines by spaces for `groupIndentation` +length. If one or more `label`s are provided, those are printed first without the additional indentation. @@ -323,7 +329,8 @@ An alias for [`console.group()`][]. added: v8.5.0 --> -Decreases indentation of subsequent lines by two spaces. +Decreases indentation of subsequent lines by spaces for `groupIndentation` +length. ### `console.info([data][, ...args])` <!-- YAML diff --git a/lib/internal/console/constructor.js b/lib/internal/console/constructor.js index dc8dcaa1d0..c5195c77c6 100644 --- a/lib/internal/console/constructor.js +++ b/lib/internal/console/constructor.js @@ -32,6 +32,7 @@ const { ERR_INCOMPATIBLE_OPTION_PAIR, }, } = require('internal/errors'); +const { validateInteger } = require('internal/validators'); const { previewEntries } = internalBinding('util'); const { Buffer: { isBuffer } } = require('buffer'); const { @@ -52,12 +53,14 @@ const kTraceInstant = 'n'.charCodeAt(0); const kSecond = 1000; const kMinute = 60 * kSecond; const kHour = 60 * kMinute; +const kMaxGroupIndentation = 1000; // Lazy loaded for startup performance. let cliTable; // Track amount of indentation required via `console.group()`. const kGroupIndent = Symbol('kGroupIndent'); +const kGroupIndentationWidth = Symbol('kGroupIndentWidth'); const kFormatForStderr = Symbol('kFormatForStderr'); const kFormatForStdout = Symbol('kFormatForStdout'); const kGetInspectOptions = Symbol('kGetInspectOptions'); @@ -93,7 +96,8 @@ function Console(options /* or: stdout, stderr, ignoreErrors = true */) { stderr = stdout, ignoreErrors = true, colorMode = 'auto', - inspectOptions + inspectOptions, + groupIndentation, } = options; if (!stdout || typeof stdout.write !== 'function') { @@ -106,6 +110,11 @@ function Console(options /* or: stdout, stderr, ignoreErrors = true */) { if (typeof colorMode !== 'boolean' && colorMode !== 'auto') throw new ERR_INVALID_ARG_VALUE('colorMode', colorMode); + if (groupIndentation !== undefined) { + validateInteger(groupIndentation, 'groupIndentation', + 0, kMaxGroupIndentation); + } + if (typeof inspectOptions === 'object' && inspectOptions !== null) { if (inspectOptions.colors !== undefined && options.colorMode !== undefined) { @@ -130,7 +139,7 @@ function Console(options /* or: stdout, stderr, ignoreErrors = true */) { } this[kBindStreamsEager](stdout, stderr); - this[kBindProperties](ignoreErrors, colorMode); + this[kBindProperties](ignoreErrors, colorMode, groupIndentation); } const consolePropAttributes = { @@ -181,7 +190,8 @@ Console.prototype[kBindStreamsLazy] = function(object) { }); }; -Console.prototype[kBindProperties] = function(ignoreErrors, colorMode) { +Console.prototype[kBindProperties] = function(ignoreErrors, colorMode, + groupIndentation = 2) { ObjectDefineProperties(this, { '_stdoutErrorHandler': { ...consolePropAttributes, @@ -200,7 +210,11 @@ Console.prototype[kBindProperties] = function(ignoreErrors, colorMode) { [kCounts]: { ...consolePropAttributes, value: new Map() }, [kColorMode]: { ...consolePropAttributes, value: colorMode }, [kIsConsole]: { ...consolePropAttributes, value: true }, - [kGroupIndent]: { ...consolePropAttributes, value: '' } + [kGroupIndent]: { ...consolePropAttributes, value: '' }, + [kGroupIndentationWidth]: { + ...consolePropAttributes, + value: groupIndentation + }, }); }; @@ -403,12 +417,13 @@ const consoleMethods = { if (data.length > 0) { this.log(...data); } - this[kGroupIndent] += ' '; + this[kGroupIndent] += ' '.repeat(this[kGroupIndentationWidth]); }, groupEnd() { this[kGroupIndent] = - this[kGroupIndent].slice(0, this[kGroupIndent].length - 2); + this[kGroupIndent].slice(0, this[kGroupIndent].length - + this[kGroupIndentationWidth]); }, // https://console.spec.whatwg.org/#table diff --git a/test/parallel/test-console-group.js b/test/parallel/test-console-group.js index 99c01fc36e..9b7e836a43 100644 --- a/test/parallel/test-console-group.js +++ b/test/parallel/test-console-group.js @@ -12,7 +12,7 @@ const Console = require('console').Console; let c, stdout, stderr; -function setup() { +function setup(groupIndentation) { stdout = ''; hijackStdout(function(data) { stdout += data; @@ -25,7 +25,8 @@ function setup() { c = new Console({ stdout: process.stdout, stderr: process.stderr, - colorMode: false }); + colorMode: false, + groupIndentation: groupIndentation }); } function teardown() { @@ -155,3 +156,86 @@ function teardown() { assert(!keys.includes('Symbol(groupIndent)'), 'groupIndent should not be enumerable'); } + +// Check custom groupIndentation. +{ + setup(3); + const expectedOut = 'Set the groupIndentation parameter to 3\n' + + 'This is the outer level\n' + + ' Level 2\n' + + ' Level 3\n' + + ' Back to level 2\n' + + 'Back to the outer level\n' + + 'Still at the outer level\n'; + + + const expectedErr = ' More of level 3\n'; + + c.log('Set the groupIndentation parameter to 3'); + c.log('This is the outer level'); + c.group(); + c.log('Level 2'); + c.group(); + c.log('Level 3'); + c.warn('More of level 3'); + c.groupEnd(); + c.log('Back to level 2'); + c.groupEnd(); + c.log('Back to the outer level'); + c.groupEnd(); + c.log('Still at the outer level'); + + assert.strictEqual(stdout, expectedOut); + assert.strictEqual(stderr, expectedErr); + teardown(); +} + +// Check the correctness of the groupIndentation parameter. +{ + // TypeError + [null, 'str', [], false, true, {}].forEach((e) => { + assert.throws( + () => { + new Console({ stdout: process.stdout, + stderr: process.stderr, + groupIndentation: e }); + }, + { + code: 'ERR_INVALID_ARG_TYPE', + name: 'TypeError' + } + ); + }); + + // RangeError for integer + [NaN, 1.01].forEach((e) => { + assert.throws( + () => { + new Console({ stdout: process.stdout, + stderr: process.stderr, + groupIndentation: e }); + }, + { + code: 'ERR_OUT_OF_RANGE', + name: 'RangeError', + message: /an integer/, + } + ); + }); + + // RangeError + [-1, 1001].forEach((e) => { + assert.throws( + () => { + new Console({ stdout: process.stdout, + stderr: process.stderr, + groupIndentation: e }); + }, + { + code: 'ERR_OUT_OF_RANGE', + name: 'RangeError', + message: />= 0 && <= 1000/, + } + ); + }); +} |