From 55bd4e8451b1641a7cbfc6bb92a9b5642f7bc188 Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Tue, 26 Mar 2019 03:59:28 +0100 Subject: [PATCH] util: `inspect()` should not exceed `breakLength` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Using `util.inspect()` with the `compact` option set to a number could result in output that exceeded the `breakLength` option. This change makes sure that limit is taken into account. PR-URL: https://github.com/nodejs/node/pull/26914 Reviewed-By: Michaƫl Zasso Reviewed-By: Matteo Collina --- lib/internal/assert/assertion_error.js | 9 ++- lib/internal/util/inspect.js | 2 + test/parallel/test-util-inspect.js | 90 ++++++++++++++++++++++++++ 3 files changed, 98 insertions(+), 3 deletions(-) diff --git a/lib/internal/assert/assertion_error.js b/lib/internal/assert/assertion_error.js index e12318ec54bf18..18c6e8cf99e66a 100644 --- a/lib/internal/assert/assertion_error.js +++ b/lib/internal/assert/assertion_error.js @@ -18,8 +18,8 @@ const kReadableOperator = { equal: 'Expected values to be loosely equal:', notDeepStrictEqual: 'Expected "actual" not to be strictly deep-equal to:', notStrictEqual: 'Expected "actual" to be strictly unequal to:', - // eslint-disable-next-line max-len - notStrictEqualObject: 'Expected "actual" not to be reference-equal to "expected":', + notStrictEqualObject: + 'Expected "actual" not to be reference-equal to "expected":', notDeepEqual: 'Expected "actual" not to be loosely deep-equal to:', notEqual: 'Expected "actual" to be loosely unequal to:', notIdentical: 'Values identical but not reference-equal:', @@ -52,7 +52,10 @@ function inspectValue(val) { // Assert compares only enumerable properties (with a few exceptions). showHidden: false, // Having a long line as error is better than wrapping the line for - // comparison. + // comparison for now. + // TODO(BridgeAR): `breakLength` should be limited as soon as soon as we + // have meta information about the inspected properties (i.e., know where + // in what line the property starts and ends). breakLength: Infinity, // Assert does not detect proxies currently. showProxy: false, diff --git a/lib/internal/util/inspect.js b/lib/internal/util/inspect.js index 281ef2c87c984c..b2ac7200c48772 100644 --- a/lib/internal/util/inspect.js +++ b/lib/internal/util/inspect.js @@ -913,6 +913,8 @@ function groupArrayElements(ctx, output) { approxCharHeights * (actualMax - bias) * output.length ) / (actualMax - bias) ), + // Do not exceed the breakLength. + Math.floor((ctx.breakLength - ctx.indentationLvl) / actualMax), // Limit array grouping for small `compact` modes as the user requested // minimal grouping. ctx.compact * 3, diff --git a/test/parallel/test-util-inspect.js b/test/parallel/test-util-inspect.js index 8bead13383cf5c..dd44c9c4395cc1 100644 --- a/test/parallel/test-util-inspect.js +++ b/test/parallel/test-util-inspect.js @@ -2233,4 +2233,94 @@ assert.strictEqual( '\u001b[33m3\u001b[39m, \u001b[33m4\u001b[39m ]'; assert.strictEqual(out, expected); + + obj = [ + 'Object', 'Function', 'Array', + 'Number', 'parseFloat', 'parseInt', + 'Infinity', 'NaN', 'undefined', + 'Boolean', 'String', 'Symbol', + 'Date', 'Promise', 'RegExp', + 'Error', 'EvalError', 'RangeError', + 'ReferenceError', 'SyntaxError', 'TypeError', + 'URIError', 'JSON', 'Math', + 'console', 'Intl', 'ArrayBuffer', + 'Uint8Array', 'Int8Array', 'Uint16Array', + 'Int16Array', 'Uint32Array', 'Int32Array', + 'Float32Array', 'Float64Array', 'Uint8ClampedArray', + 'BigUint64Array', 'BigInt64Array', 'DataView', + 'Map', 'BigInt', 'Set', + 'WeakMap', 'WeakSet', 'Proxy', + 'Reflect', 'decodeURI', 'decodeURIComponent', + 'encodeURI', 'encodeURIComponent', 'escape', + 'unescape', 'eval', 'isFinite', + 'isNaN', 'SharedArrayBuffer', 'Atomics', + 'globalThis', 'WebAssembly', 'global', + 'process', 'GLOBAL', 'root', + 'Buffer', 'URL', 'URLSearchParams', + 'TextEncoder', 'TextDecoder', 'clearInterval', + 'clearTimeout', 'setInterval', 'setTimeout', + 'queueMicrotask', 'clearImmediate', 'setImmediate', + 'module', 'require', 'assert', + 'async_hooks', 'buffer', 'child_process', + 'cluster', 'crypto', 'dgram', + 'dns', 'domain', 'events', + 'fs', 'http', 'http2', + 'https', 'inspector', 'net', + 'os', 'path', 'perf_hooks', + 'punycode', 'querystring', 'readline', + 'repl', 'stream', 'string_decoder', + 'tls', 'trace_events', 'tty', + 'url', 'v8', 'vm', + 'worker_threads', 'zlib', '_', + '_error', 'util' + ]; + + out = util.inspect( + obj, + { compact: 3, breakLength: 80, maxArrayLength: 250 } + ); + expected = [ + '[', + " 'Object', 'Function', 'Array',", + " 'Number', 'parseFloat', 'parseInt',", + " 'Infinity', 'NaN', 'undefined',", + " 'Boolean', 'String', 'Symbol',", + " 'Date', 'Promise', 'RegExp',", + " 'Error', 'EvalError', 'RangeError',", + " 'ReferenceError', 'SyntaxError', 'TypeError',", + " 'URIError', 'JSON', 'Math',", + " 'console', 'Intl', 'ArrayBuffer',", + " 'Uint8Array', 'Int8Array', 'Uint16Array',", + " 'Int16Array', 'Uint32Array', 'Int32Array',", + " 'Float32Array', 'Float64Array', 'Uint8ClampedArray',", + " 'BigUint64Array', 'BigInt64Array', 'DataView',", + " 'Map', 'BigInt', 'Set',", + " 'WeakMap', 'WeakSet', 'Proxy',", + " 'Reflect', 'decodeURI', 'decodeURIComponent',", + " 'encodeURI', 'encodeURIComponent', 'escape',", + " 'unescape', 'eval', 'isFinite',", + " 'isNaN', 'SharedArrayBuffer', 'Atomics',", + " 'globalThis', 'WebAssembly', 'global',", + " 'process', 'GLOBAL', 'root',", + " 'Buffer', 'URL', 'URLSearchParams',", + " 'TextEncoder', 'TextDecoder', 'clearInterval',", + " 'clearTimeout', 'setInterval', 'setTimeout',", + " 'queueMicrotask', 'clearImmediate', 'setImmediate',", + " 'module', 'require', 'assert',", + " 'async_hooks', 'buffer', 'child_process',", + " 'cluster', 'crypto', 'dgram',", + " 'dns', 'domain', 'events',", + " 'fs', 'http', 'http2',", + " 'https', 'inspector', 'net',", + " 'os', 'path', 'perf_hooks',", + " 'punycode', 'querystring', 'readline',", + " 'repl', 'stream', 'string_decoder',", + " 'tls', 'trace_events', 'tty',", + " 'url', 'v8', 'vm',", + " 'worker_threads', 'zlib', '_',", + " '_error', 'util'", + ']' + ].join('\n'); + + assert.strictEqual(out, expected); }