Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

util: refactor inspecting long lines #28055

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 6 additions & 33 deletions lib/internal/util/inspect.js
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,6 @@ const numberRegExp = /^(0|[1-9][0-9]*)$/;
const coreModuleRegExp = /^ at (?:[^/\\(]+ \(|)((?<![/\\]).+)\.js:\d+:\d+\)?$/;
const nodeModulesRegExp = /[/\\]node_modules[/\\](.+?)(?=[/\\])/g;

const readableRegExps = {};

const kMinLineLength = 16;

// Constants to map the iterator state.
Expand Down Expand Up @@ -1071,37 +1069,12 @@ function formatBigInt(fn, value) {
function formatPrimitive(fn, value, ctx) {
if (typeof value === 'string') {
if (ctx.compact !== true &&
ctx.indentationLvl + value.length + 4 > ctx.breakLength &&
value.length > kMinLineLength) {
// Subtract the potential quotes, the space and the plus as well (4).
const rawMaxLineLength = ctx.breakLength - ctx.indentationLvl - 4;
const maxLineLength = Math.max(rawMaxLineLength, kMinLineLength);
const lines = Math.ceil(value.length / maxLineLength);
const averageLineLength = Math.ceil(value.length / lines);
const divisor = Math.max(averageLineLength, kMinLineLength);
if (readableRegExps[divisor] === undefined) {
// Build a new RegExp that naturally breaks text into multiple lines.
//
// Rules
// 1. Greedy match all text up the max line length that ends with a
// whitespace or the end of the string.
// 2. If none matches, non-greedy match any text up to a whitespace or
// the end of the string.
//
// eslint-disable-next-line max-len, node-core/no-unescaped-regexp-dot
readableRegExps[divisor] = new RegExp(`(.|\\n){1,${divisor}}(\\s|$)|(\\n|.)+?(\\s|$)`, 'gm');
}
const matches = value.match(readableRegExps[divisor]);
if (matches.length > 1) {
const indent = ' '.repeat(ctx.indentationLvl);
let res = `${fn(strEscape(matches[0]), 'string')} +\n`;
const lastIndex = matches.length - 1;
for (let i = 1; i < lastIndex; i++) {
res += `${indent} ${fn(strEscape(matches[i]), 'string')} +\n`;
}
res += `${indent} ${fn(strEscape(matches[lastIndex]), 'string')}`;
return res;
}
value.length > kMinLineLength &&
value.length > ctx.breakLength - ctx.indentationLvl - 4) {
return value
.split(/(?<=\n)/)
.map((line) => fn(strEscape(line), 'string'))
.join(` +\n${' '.repeat(ctx.indentationLvl + 2)}`);
}
return fn(strEscape(value), 'string');
}
Expand Down
62 changes: 16 additions & 46 deletions test/parallel/test-util-inspect.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ assert.strictEqual(util.inspect(new Date('')), (new Date('')).toString());
assert.strictEqual(util.inspect('\n\u0001'), "'\\n\\u0001'");
assert.strictEqual(
util.inspect(`${Array(75).fill(1)}'\n\u001d\n\u0003`),
`"${Array(75).fill(1)}'\\n" +\n '\\u001d\\n\\u0003'`
`"${Array(75).fill(1)}'\\n" +\n '\\u001d\\n' +\n '\\u0003'`
);
assert.strictEqual(util.inspect([]), '[]');
assert.strictEqual(util.inspect(Object.create([])), 'Array {}');
Expand Down Expand Up @@ -1505,10 +1505,9 @@ util.inspect(process);
' 2,',
' [',
' [',
" 'Lorem ipsum dolor\\nsit amet,\\tconsectetur ' +",
" 'adipiscing elit, sed do eiusmod tempor ' +",
" 'incididunt ut labore et dolore magna ' +",
" 'aliqua.',",
" 'Lorem ipsum dolor\\n' +",
" 'sit amet,\\tconsectetur adipiscing elit, sed do eiusmod " +
"tempor incididunt ut labore et dolore magna aliqua.',",
" 'test',",
" 'foo'",
' ]',
Expand All @@ -1525,12 +1524,9 @@ util.inspect(process);

out = util.inspect(o.a[2][0][0], { compact: false, breakLength: 30 });
expect = [
"'Lorem ipsum dolor\\nsit ' +",
" 'amet,\\tconsectetur ' +",
" 'adipiscing elit, sed do ' +",
" 'eiusmod tempor incididunt ' +",
" 'ut labore et dolore magna ' +",
" 'aliqua.'"
"'Lorem ipsum dolor\\n' +",
" 'sit amet,\\tconsectetur adipiscing elit, sed do eiusmod tempor " +
"incididunt ut labore et dolore magna aliqua.'"
].join('\n');
assert.strictEqual(out, expect);

Expand All @@ -1544,30 +1540,7 @@ util.inspect(process);
'12 45 78 01 34 67 90 23 56 89 123456789012345678901234567890',
{ compact: false, breakLength: 3 });
expect = [
"'12 45 78 01 34 ' +",
" '67 90 23 56 89 ' +",
" '123456789012345678901234567890'"
].join('\n');
assert.strictEqual(out, expect);

out = util.inspect(
'12 45 78 01 34 67 90 23 56 89 1234567890123 0',
{ compact: false, breakLength: 3 });
expect = [
"'12 45 78 01 34 ' +",
" '67 90 23 56 89 ' +",
" '1234567890123 0'"
].join('\n');
assert.strictEqual(out, expect);

out = util.inspect(
'12 45 78 01 34 67 90 23 56 89 12345678901234567 0',
{ compact: false, breakLength: 3 });
expect = [
"'12 45 78 01 34 ' +",
" '67 90 23 56 89 ' +",
" '12345678901234567 ' +",
" '0'"
"'12 45 78 01 34 67 90 23 56 89 123456789012345678901234567890'"
].join('\n');
assert.strictEqual(out, expect);

Expand Down Expand Up @@ -1606,7 +1579,7 @@ util.inspect(process);

o[util.inspect.custom] = () => ({ a: '12 45 78 01 34 67 90 23' });
out = util.inspect(o, { compact: false, breakLength: 3 });
expect = "{\n a: '12 45 78 01 34 ' +\n '67 90 23'\n}";
expect = "{\n a: '12 45 78 01 34 67 90 23'\n}";
assert.strictEqual(out, expect);
}

Expand Down Expand Up @@ -2210,16 +2183,13 @@ assert.strictEqual(
' b: {',
' x: 5,',
' c: {',
" x: '10000000000000000 00000000000000000 ' +",
" '10000000000000000 00000000000000000 ' +",
" '10000000000000000 00000000000000000 ' +",
" '10000000000000000 00000000000000000 ' +",
" '10000000000000000 00000000000000000 ' +",
" '10000000000000000 00000000000000000 ' +",
" '10000000000000000 00000000000000000 ' +",
" '10000000000000000 00000000000000000 ' +",
" '10000000000000000 00000000000000000 ' +",
" '10000000000000000 00000000000000000 ',",
" x: '10000000000000000 00000000000000000 10000000000000000 " +
'00000000000000000 10000000000000000 00000000000000000 ' +
'10000000000000000 00000000000000000 10000000000000000 ' +
'00000000000000000 10000000000000000 00000000000000000 ' +
'10000000000000000 00000000000000000 10000000000000000 ' +
'00000000000000000 10000000000000000 00000000000000000 ' +
"10000000000000000 00000000000000000 ',",
' d: 2,',
' e: 3',
' }',
Expand Down