util: change util.inspect depth default
The current default is not ideal in most use cases. Therefore it is changed to inspect objects to a maximum depth of 20 in case util.inspect is called with it's defaults. The default is kept at 2 when using console.log() and similar in the repl. PR-URL: https://github.com/nodejs/node/pull/17907 Refs: https://github.com/nodejs/node/issues/12693 PR-URL: https://github.com/nodejs/node/pull/22846 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Denys Otrishko <shishugi@gmail.com> Reviewed-By: Roman Reiss <me@silverwind.io>
This commit is contained in:
parent
83d0404971
commit
ac7450a09a
@ -360,6 +360,9 @@ stream.write('With ES6');
|
|||||||
<!-- YAML
|
<!-- YAML
|
||||||
added: v0.3.0
|
added: v0.3.0
|
||||||
changes:
|
changes:
|
||||||
|
- version: REPLACEME
|
||||||
|
pr-url: https://github.com/nodejs/node/pull/22846
|
||||||
|
description: The `depth` default changed to `20`.
|
||||||
- version: REPLACEME
|
- version: REPLACEME
|
||||||
pr-url: https://github.com/nodejs/node/pull/22788
|
pr-url: https://github.com/nodejs/node/pull/22788
|
||||||
description: The `sorted` option is supported now.
|
description: The `sorted` option is supported now.
|
||||||
@ -401,7 +404,7 @@ changes:
|
|||||||
* `depth` {number} Specifies the number of times to recurse while formatting
|
* `depth` {number} Specifies the number of times to recurse while formatting
|
||||||
the `object`. This is useful for inspecting large complicated objects. To
|
the `object`. This is useful for inspecting large complicated objects. To
|
||||||
make it recurse up to the maximum call stack size pass `Infinity` or `null`.
|
make it recurse up to the maximum call stack size pass `Infinity` or `null`.
|
||||||
**Default:** `2`.
|
**Default:** `20`.
|
||||||
* `colors` {boolean} If `true`, the output will be styled with ANSI color
|
* `colors` {boolean} If `true`, the output will be styled with ANSI color
|
||||||
codes. Colors are customizable, see [Customizing `util.inspect` colors][].
|
codes. Colors are customizable, see [Customizing `util.inspect` colors][].
|
||||||
**Default:** `false`.
|
**Default:** `false`.
|
||||||
@ -458,12 +461,23 @@ util.inspect(new Bar()); // 'Bar {}'
|
|||||||
util.inspect(baz); // '[foo] {}'
|
util.inspect(baz); // '[foo] {}'
|
||||||
```
|
```
|
||||||
|
|
||||||
The following example inspects all properties of the `util` object:
|
The following example limits the inspected output of the `paths` property:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const util = require('util');
|
const util = require('util');
|
||||||
|
|
||||||
console.log(util.inspect(util, { showHidden: true, depth: null }));
|
console.log(util.inspect(module, { depth: 0 }));
|
||||||
|
// Instead of showing all entries in `paths` `[Array]` is used to limit the
|
||||||
|
// output for readability:
|
||||||
|
|
||||||
|
// Module {
|
||||||
|
// id: '<repl>',
|
||||||
|
// exports: {},
|
||||||
|
// parent: undefined,
|
||||||
|
// filename: null,
|
||||||
|
// loaded: false,
|
||||||
|
// children: [],
|
||||||
|
// paths: [Array] }
|
||||||
```
|
```
|
||||||
|
|
||||||
The following example highlights the difference with the `compact` option:
|
The following example highlights the difference with the `compact` option:
|
||||||
@ -479,7 +493,7 @@ const o = {
|
|||||||
'foo']], 4],
|
'foo']], 4],
|
||||||
b: new Map([['za', 1], ['zb', 'test']])
|
b: new Map([['za', 1], ['zb', 'test']])
|
||||||
};
|
};
|
||||||
console.log(util.inspect(o, { compact: true, depth: 5, breakLength: 80 }));
|
console.log(util.inspect(o, { compact: true, breakLength: 80 }));
|
||||||
|
|
||||||
// This will print
|
// This will print
|
||||||
|
|
||||||
@ -493,7 +507,7 @@ console.log(util.inspect(o, { compact: true, depth: 5, breakLength: 80 }));
|
|||||||
// b: Map { 'za' => 1, 'zb' => 'test' } }
|
// b: Map { 'za' => 1, 'zb' => 'test' } }
|
||||||
|
|
||||||
// Setting `compact` to false changes the output to be more reader friendly.
|
// Setting `compact` to false changes the output to be more reader friendly.
|
||||||
console.log(util.inspect(o, { compact: false, depth: 5, breakLength: 80 }));
|
console.log(util.inspect(o, { compact: false, breakLength: 80 }));
|
||||||
|
|
||||||
// {
|
// {
|
||||||
// a: [
|
// a: [
|
||||||
|
@ -94,7 +94,7 @@ const hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
|
|||||||
|
|
||||||
const inspectDefaultOptions = Object.seal({
|
const inspectDefaultOptions = Object.seal({
|
||||||
showHidden: false,
|
showHidden: false,
|
||||||
depth: 2,
|
depth: 20,
|
||||||
colors: false,
|
colors: false,
|
||||||
customInspect: true,
|
customInspect: true,
|
||||||
showProxy: false,
|
showProxy: false,
|
||||||
|
@ -128,8 +128,9 @@ function hasOwnProperty(obj, prop) {
|
|||||||
// Can overridden with custom print functions, such as `probe` or `eyes.js`.
|
// Can overridden with custom print functions, such as `probe` or `eyes.js`.
|
||||||
// This is the default "writer" value if none is passed in the REPL options.
|
// This is the default "writer" value if none is passed in the REPL options.
|
||||||
const writer = exports.writer = (obj) => util.inspect(obj, writer.options);
|
const writer = exports.writer = (obj) => util.inspect(obj, writer.options);
|
||||||
writer.options =
|
writer.options = Object.assign({},
|
||||||
Object.assign({}, util.inspect.defaultOptions, { showProxy: true });
|
util.inspect.defaultOptions,
|
||||||
|
{ showProxy: true, depth: 2 });
|
||||||
|
|
||||||
exports._builtinLibs = builtinLibs;
|
exports._builtinLibs = builtinLibs;
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
require('../common');
|
require('../common');
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const BufferList = require('internal/streams/buffer_list');
|
const BufferList = require('internal/streams/buffer_list');
|
||||||
|
const util = require('util');
|
||||||
|
|
||||||
// Test empty buffer list.
|
// Test empty buffer list.
|
||||||
const emptyList = new BufferList();
|
const emptyList = new BufferList();
|
||||||
@ -30,3 +31,10 @@ assert.strictEqual(list.join(','), 'foo');
|
|||||||
const shifted = list.shift();
|
const shifted = list.shift();
|
||||||
assert.strictEqual(shifted, buf);
|
assert.strictEqual(shifted, buf);
|
||||||
assert.deepStrictEqual(list, new BufferList());
|
assert.deepStrictEqual(list, new BufferList());
|
||||||
|
|
||||||
|
const tmp = util.inspect.defaultOptions.colors;
|
||||||
|
util.inspect.defaultOptions = { colors: true };
|
||||||
|
assert.strictEqual(
|
||||||
|
util.inspect(list),
|
||||||
|
'BufferList { length: \u001b[33m0\u001b[39m }');
|
||||||
|
util.inspect.defaultOptions = { colors: tmp };
|
||||||
|
@ -50,13 +50,17 @@ const expected1 = 'Proxy [ {}, {} ]';
|
|||||||
const expected2 = 'Proxy [ Proxy [ {}, {} ], {} ]';
|
const expected2 = 'Proxy [ Proxy [ {}, {} ], {} ]';
|
||||||
const expected3 = 'Proxy [ Proxy [ Proxy [ {}, {} ], {} ], Proxy [ {}, {} ] ]';
|
const expected3 = 'Proxy [ Proxy [ Proxy [ {}, {} ], {} ], Proxy [ {}, {} ] ]';
|
||||||
const expected4 = 'Proxy [ Proxy [ {}, {} ], Proxy [ Proxy [ {}, {} ], {} ] ]';
|
const expected4 = 'Proxy [ Proxy [ {}, {} ], Proxy [ Proxy [ {}, {} ], {} ] ]';
|
||||||
const expected5 = 'Proxy [ Proxy [ Proxy [ Proxy [Array], {} ],' +
|
const expected5 = 'Proxy [ Proxy [ Proxy [ Proxy [ {}, {} ], {} ],' +
|
||||||
' Proxy [ {}, {} ] ],\n Proxy [ Proxy [ {}, {} ]' +
|
' Proxy [ {}, {} ] ],\n Proxy [ Proxy [ {}, {} ]' +
|
||||||
', Proxy [ Proxy [Array], {} ] ] ]';
|
', Proxy [ Proxy [ {}, {} ], {} ] ] ]';
|
||||||
const expected6 = 'Proxy [ Proxy [ Proxy [ Proxy [Array], Proxy [Array]' +
|
const expected6 = 'Proxy [ Proxy [ Proxy [ Proxy [ Proxy [ {}, {} ], {} ], ' +
|
||||||
' ],\n Proxy [ Proxy [Array], Proxy [Array] ] ],\n' +
|
'Proxy [ {}, {} ] ],\n' +
|
||||||
' Proxy [ Proxy [ Proxy [Array], Proxy [Array] ],\n' +
|
' Proxy [ Proxy [ {}, {} ], ' +
|
||||||
' Proxy [ Proxy [Array], Proxy [Array] ] ] ]';
|
'Proxy [ Proxy [ {}, {} ], {} ] ] ],\n' +
|
||||||
|
' Proxy [ Proxy [ Proxy [ Proxy [ {}, {} ], {} ], ' +
|
||||||
|
'Proxy [ {}, {} ] ],\n' +
|
||||||
|
' Proxy [ Proxy [ {}, {} ], ' +
|
||||||
|
'Proxy [ Proxy [ {}, {} ], {} ] ] ] ]';
|
||||||
assert.strictEqual(
|
assert.strictEqual(
|
||||||
util.inspect(proxy1, { showProxy: true, depth: null }),
|
util.inspect(proxy1, { showProxy: true, depth: null }),
|
||||||
expected1);
|
expected1);
|
||||||
|
@ -71,7 +71,7 @@ assert.strictEqual(util.inspect({ a: 1, b: 2 }), '{ a: 1, b: 2 }');
|
|||||||
assert.strictEqual(util.inspect({ 'a': {} }), '{ a: {} }');
|
assert.strictEqual(util.inspect({ 'a': {} }), '{ a: {} }');
|
||||||
assert.strictEqual(util.inspect({ 'a': { 'b': 2 } }), '{ a: { b: 2 } }');
|
assert.strictEqual(util.inspect({ 'a': { 'b': 2 } }), '{ a: { b: 2 } }');
|
||||||
assert.strictEqual(util.inspect({ 'a': { 'b': { 'c': { 'd': 2 } } } }),
|
assert.strictEqual(util.inspect({ 'a': { 'b': { 'c': { 'd': 2 } } } }),
|
||||||
'{ a: { b: { c: [Object] } } }');
|
'{ a: { b: { c: { d: 2 } } } }');
|
||||||
assert.strictEqual(
|
assert.strictEqual(
|
||||||
util.inspect({ 'a': { 'b': { 'c': { 'd': 2 } } } }, false, null),
|
util.inspect({ 'a': { 'b': { 'c': { 'd': 2 } } } }, false, null),
|
||||||
'{ a: { b: { c: { d: 2 } } } }');
|
'{ a: { b: { c: { d: 2 } } } }');
|
||||||
@ -110,7 +110,7 @@ assert.strictEqual(util.inspect((new JSStream())._externalStream),
|
|||||||
assert.strictEqual(util.inspect({ a: regexp }, false, 0), '{ a: /regexp/ }');
|
assert.strictEqual(util.inspect({ a: regexp }, false, 0), '{ a: /regexp/ }');
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(/Object/.test(
|
assert(!/Object/.test(
|
||||||
util.inspect({ a: { a: { a: { a: {} } } } }, undefined, undefined, true)
|
util.inspect({ a: { a: { a: { a: {} } } } }, undefined, undefined, true)
|
||||||
));
|
));
|
||||||
assert(!/Object/.test(
|
assert(!/Object/.test(
|
||||||
@ -1055,15 +1055,15 @@ if (typeof Symbol !== 'undefined') {
|
|||||||
// Empty and circular before depth.
|
// Empty and circular before depth.
|
||||||
{
|
{
|
||||||
const arr = [[[[]]]];
|
const arr = [[[[]]]];
|
||||||
assert.strictEqual(util.inspect(arr), '[ [ [ [] ] ] ]');
|
assert.strictEqual(util.inspect(arr, { depth: 2 }), '[ [ [ [] ] ] ]');
|
||||||
arr[0][0][0][0] = [];
|
arr[0][0][0][0] = [];
|
||||||
assert.strictEqual(util.inspect(arr), '[ [ [ [Array] ] ] ]');
|
assert.strictEqual(util.inspect(arr, { depth: 2 }), '[ [ [ [Array] ] ] ]');
|
||||||
arr[0][0][0] = {};
|
arr[0][0][0] = {};
|
||||||
assert.strictEqual(util.inspect(arr), '[ [ [ {} ] ] ]');
|
assert.strictEqual(util.inspect(arr, { depth: 2 }), '[ [ [ {} ] ] ]');
|
||||||
arr[0][0][0] = { a: 2 };
|
arr[0][0][0] = { a: 2 };
|
||||||
assert.strictEqual(util.inspect(arr), '[ [ [ [Object] ] ] ]');
|
assert.strictEqual(util.inspect(arr, { depth: 2 }), '[ [ [ [Object] ] ] ]');
|
||||||
arr[0][0][0] = arr;
|
arr[0][0][0] = arr;
|
||||||
assert.strictEqual(util.inspect(arr), '[ [ [ [Circular] ] ] ]');
|
assert.strictEqual(util.inspect(arr, { depth: 2 }), '[ [ [ [Circular] ] ] ]');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Corner cases.
|
// Corner cases.
|
||||||
@ -1160,10 +1160,10 @@ if (typeof Symbol !== 'undefined') {
|
|||||||
assert(!/1 more item/.test(util.inspect(arr)));
|
assert(!/1 more item/.test(util.inspect(arr)));
|
||||||
util.inspect.defaultOptions.maxArrayLength = oldOptions.maxArrayLength;
|
util.inspect.defaultOptions.maxArrayLength = oldOptions.maxArrayLength;
|
||||||
assert(/1 more item/.test(util.inspect(arr)));
|
assert(/1 more item/.test(util.inspect(arr)));
|
||||||
util.inspect.defaultOptions.depth = null;
|
util.inspect.defaultOptions.depth = 2;
|
||||||
assert(!/Object/.test(util.inspect(obj)));
|
|
||||||
util.inspect.defaultOptions.depth = oldOptions.depth;
|
|
||||||
assert(/Object/.test(util.inspect(obj)));
|
assert(/Object/.test(util.inspect(obj)));
|
||||||
|
util.inspect.defaultOptions.depth = oldOptions.depth;
|
||||||
|
assert(!/Object/.test(util.inspect(obj)));
|
||||||
assert.strictEqual(
|
assert.strictEqual(
|
||||||
JSON.stringify(util.inspect.defaultOptions),
|
JSON.stringify(util.inspect.defaultOptions),
|
||||||
JSON.stringify(oldOptions)
|
JSON.stringify(oldOptions)
|
||||||
@ -1175,7 +1175,7 @@ if (typeof Symbol !== 'undefined') {
|
|||||||
assert(/Object/.test(util.inspect(obj)));
|
assert(/Object/.test(util.inspect(obj)));
|
||||||
util.inspect.defaultOptions = oldOptions;
|
util.inspect.defaultOptions = oldOptions;
|
||||||
assert(/1 more item/.test(util.inspect(arr)));
|
assert(/1 more item/.test(util.inspect(arr)));
|
||||||
assert(/Object/.test(util.inspect(obj)));
|
assert(!/Object/.test(util.inspect(obj)));
|
||||||
assert.strictEqual(
|
assert.strictEqual(
|
||||||
JSON.stringify(util.inspect.defaultOptions),
|
JSON.stringify(util.inspect.defaultOptions),
|
||||||
JSON.stringify(oldOptions)
|
JSON.stringify(oldOptions)
|
||||||
@ -1561,11 +1561,19 @@ util.inspect(process);
|
|||||||
let head = list;
|
let head = list;
|
||||||
// A linked list of length 100k should be inspectable in some way, even though
|
// A linked list of length 100k should be inspectable in some way, even though
|
||||||
// the real cutoff value is much lower than 100k.
|
// the real cutoff value is much lower than 100k.
|
||||||
for (let i = 0; i < 100000; i++)
|
for (let i = 0; i < 100000; i++) {
|
||||||
head = head.next = {};
|
head = head.next = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = Array(15)
|
||||||
|
.fill(0)
|
||||||
|
.map((_, i) => `{ next:\n${' '.repeat(i + 1)}`)
|
||||||
|
.join('') +
|
||||||
|
'{ next: { next: { next: { next: { next: { next:' +
|
||||||
|
' [Object] } } } } } } } } } } } } } } } } } } } } }';
|
||||||
assert.strictEqual(
|
assert.strictEqual(
|
||||||
util.inspect(list),
|
util.inspect(list),
|
||||||
'{ next: { next: { next: [Object] } } }'
|
res
|
||||||
);
|
);
|
||||||
const longList = util.inspect(list, { depth: Infinity });
|
const longList = util.inspect(list, { depth: Infinity });
|
||||||
const match = longList.match(/next/g);
|
const match = longList.match(/next/g);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user