util: special handle maxArrayLength
while grouping arrays
This makes sure that large arrays with lots of small entries ignore the `... n more item(s)` part since it often resulted in output that users did not expect. Now that part is printed on a separate line to indicate extra entries. PR-URL: https://github.com/nodejs/node/pull/28059 Refs: https://github.com/nodejs/node/issues/27690 Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com>
This commit is contained in:
parent
97a42465ab
commit
0059b877e3
@ -971,12 +971,17 @@ function groupArrayElements(ctx, output) {
|
|||||||
let totalLength = 0;
|
let totalLength = 0;
|
||||||
let maxLength = 0;
|
let maxLength = 0;
|
||||||
let i = 0;
|
let i = 0;
|
||||||
|
let outputLength = output.length;
|
||||||
|
if (ctx.maxArrayLength < output.length) {
|
||||||
|
// This makes sure the "... n more items" part is not taken into account.
|
||||||
|
outputLength--;
|
||||||
|
}
|
||||||
const separatorSpace = 2; // Add 1 for the space and 1 for the separator.
|
const separatorSpace = 2; // Add 1 for the space and 1 for the separator.
|
||||||
const dataLen = new Array(output.length);
|
const dataLen = new Array(outputLength);
|
||||||
// Calculate the total length of all output entries and the individual max
|
// Calculate the total length of all output entries and the individual max
|
||||||
// entries length of all output entries. We have to remove colors first,
|
// entries length of all output entries. We have to remove colors first,
|
||||||
// otherwise the length would not be calculated properly.
|
// otherwise the length would not be calculated properly.
|
||||||
for (; i < output.length; i++) {
|
for (; i < outputLength; i++) {
|
||||||
const len = ctx.colors ? removeColors(output[i]).length : output[i].length;
|
const len = ctx.colors ? removeColors(output[i]).length : output[i].length;
|
||||||
dataLen[i] = len;
|
dataLen[i] = len;
|
||||||
totalLength += len + separatorSpace;
|
totalLength += len + separatorSpace;
|
||||||
@ -1004,7 +1009,7 @@ function groupArrayElements(ctx, output) {
|
|||||||
// The added bias slightly increases the columns for short entries.
|
// The added bias slightly increases the columns for short entries.
|
||||||
Math.round(
|
Math.round(
|
||||||
Math.sqrt(
|
Math.sqrt(
|
||||||
approxCharHeights * (actualMax - bias) * output.length
|
approxCharHeights * (actualMax - bias) * outputLength
|
||||||
) / (actualMax - bias)
|
) / (actualMax - bias)
|
||||||
),
|
),
|
||||||
// Do not exceed the breakLength.
|
// Do not exceed the breakLength.
|
||||||
@ -1028,20 +1033,23 @@ function groupArrayElements(ctx, output) {
|
|||||||
firstLineMaxLength = dataLen[i];
|
firstLineMaxLength = dataLen[i];
|
||||||
}
|
}
|
||||||
// Each iteration creates a single line of grouped entries.
|
// Each iteration creates a single line of grouped entries.
|
||||||
for (i = 0; i < output.length; i += columns) {
|
for (i = 0; i < outputLength; i += columns) {
|
||||||
// Calculate extra color padding in case it's active. This has to be done
|
// Calculate extra color padding in case it's active. This has to be done
|
||||||
// line by line as some lines might contain more colors than others.
|
// line by line as some lines might contain more colors than others.
|
||||||
let colorPadding = output[i].length - dataLen[i];
|
let colorPadding = output[i].length - dataLen[i];
|
||||||
// Add padding to the first column of the output.
|
// Add padding to the first column of the output.
|
||||||
let str = output[i].padStart(firstLineMaxLength + colorPadding, ' ');
|
let str = output[i].padStart(firstLineMaxLength + colorPadding, ' ');
|
||||||
// The last lines may contain less entries than columns.
|
// The last lines may contain less entries than columns.
|
||||||
const max = Math.min(i + columns, output.length);
|
const max = Math.min(i + columns, outputLength);
|
||||||
for (var j = i + 1; j < max; j++) {
|
for (var j = i + 1; j < max; j++) {
|
||||||
colorPadding = output[j].length - dataLen[j];
|
colorPadding = output[j].length - dataLen[j];
|
||||||
str += `, ${output[j].padStart(maxLength + colorPadding, ' ')}`;
|
str += `, ${output[j].padStart(maxLength + colorPadding, ' ')}`;
|
||||||
}
|
}
|
||||||
tmp.push(str);
|
tmp.push(str);
|
||||||
}
|
}
|
||||||
|
if (ctx.maxArrayLength < output.length) {
|
||||||
|
tmp.push(output[outputLength]);
|
||||||
|
}
|
||||||
output = tmp;
|
output = tmp;
|
||||||
}
|
}
|
||||||
return output;
|
return output;
|
||||||
|
@ -2197,7 +2197,7 @@ assert.strictEqual(
|
|||||||
[ 1, 2, { a: 1, b: 2, c: 3 } ]
|
[ 1, 2, { a: 1, b: 2, c: 3 } ]
|
||||||
],
|
],
|
||||||
c: ['foo', 4, 444444],
|
c: ['foo', 4, 444444],
|
||||||
d: Array.from({ length: 100 }).map((e, i) => {
|
d: Array.from({ length: 101 }).map((e, i) => {
|
||||||
return i % 2 === 0 ? i * i : i;
|
return i % 2 === 0 ? i * i : i;
|
||||||
}),
|
}),
|
||||||
e: Array(6).fill('foobar'),
|
e: Array(6).fill('foobar'),
|
||||||
@ -2246,7 +2246,8 @@ assert.strictEqual(
|
|||||||
' 77, 6084, 79, 6400, 81, 6724, 83,',
|
' 77, 6084, 79, 6400, 81, 6724, 83,',
|
||||||
' 7056, 85, 7396, 87, 7744, 89, 8100,',
|
' 7056, 85, 7396, 87, 7744, 89, 8100,',
|
||||||
' 91, 8464, 93, 8836, 95, 9216, 97,',
|
' 91, 8464, 93, 8836, 95, 9216, 97,',
|
||||||
' 9604, 99',
|
' 9604, 99,',
|
||||||
|
' ... 1 more item',
|
||||||
' ],',
|
' ],',
|
||||||
' e: [',
|
' e: [',
|
||||||
" 'foobar',",
|
" 'foobar',",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user