Skip to content

Commit 38bc5fb

Browse files
BridgeARMylesBorins
authored andcommitted
util: remove erroneous whitespace
When inspecting nested objects some times a whitespace was added at the end of a line. This fixes this erroneous space. Besides that the `breakLength` was not followed if a single property was longer than the breakLength. It will now break a single property into the key and value in such cases. PR-URL: #20802 Refs: #20253 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
1 parent 5ce85a7 commit 38bc5fb

4 files changed

Lines changed: 56 additions & 52 deletions

File tree

‎lib/util.js‎

Lines changed: 42 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ function getPrefix(constructor, tag) {
416416
return'';
417417
}
418418

419-
functionformatValue(ctx,value,recurseTimes,ln){
419+
functionformatValue(ctx,value,recurseTimes){
420420
// Primitive types cannot have properties
421421
if(typeofvalue!=='object'&&typeofvalue!=='function'){
422422
returnformatPrimitive(ctx.stylize,value,ctx);
@@ -592,7 +592,7 @@ function formatValue(ctx, value, recurseTimes, ln) {
592592
returnctx.stylize(dateToISOString.call(value),'date');
593593
}
594594
// Make dates with properties first say the date
595-
base=`${dateToISOString.call(value)}`;
595+
base=dateToISOString.call(value);
596596
}elseif(isError(value)){
597597
// Make error with message first say the error
598598
base=formatError(value);
@@ -693,7 +693,7 @@ function formatValue(ctx, value, recurseTimes, ln) {
693693
}
694694
ctx.seen.pop();
695695

696-
returnreduceToSingleString(ctx,output,base,braces,ln);
696+
returnreduceToSingleString(ctx,output,base,braces);
697697
}
698698

699699
functionformatNumber(fn,value){
@@ -768,7 +768,23 @@ function formatNamespaceObject(ctx, value, recurseTimes, keys) {
768768
constlen=keys.length;
769769
constoutput=newArray(len);
770770
for(vari=0;i<len;i++){
771-
output[i]=formatNamespaceProperty(ctx,value,recurseTimes,keys[i]);
771+
try{
772+
output[i]=formatProperty(ctx,value,recurseTimes,keys[i],0);
773+
}catch(err){
774+
if(!(errinstanceofReferenceError)){
775+
throwerr;
776+
}
777+
// Use the existing functionality. This makes sure the indentation and
778+
// line breaks are always correct. Otherwise it is very difficult to keep
779+
// this aligned, even though this is a hacky way of dealing with this.
780+
consttmp={[keys[i]]: ''};
781+
output[i]=formatProperty(ctx,tmp,recurseTimes,keys[i],0);
782+
constpos=output[i].lastIndexOf(' ');
783+
// We have to find the last whitespace and have to replace that value as
784+
// it will be visualized as a regular string.
785+
output[i]=output[i].slice(0,pos+1)+
786+
ctx.stylize('<uninitialized>','special');
787+
}
772788
}
773789
returnoutput;
774790
}
@@ -996,42 +1012,21 @@ function formatPromise(ctx, value, recurseTimes, keys) {
9961012
returnoutput;
9971013
}
9981014

999-
functionformatKey(ctx,key,enumerable){
1000-
if(typeofkey==='symbol'){
1001-
return`[${ctx.stylize(key.toString(),'symbol')}]`;
1002-
}
1003-
if(enumerable===false){
1004-
return`[${key}]`;
1005-
}
1006-
if(keyStrRegExp.test(key)){
1007-
returnctx.stylize(key,'name');
1008-
}
1009-
returnctx.stylize(strEscape(key),'string');
1010-
}
1011-
1012-
functionformatNamespaceProperty(ctx,ns,recurseTimes,key){
1013-
letvalue;
1014-
try{
1015-
value=formatValue(ctx,ns[key],recurseTimes,true);
1016-
}catch(err){
1017-
if(errinstanceofReferenceError){
1018-
value=ctx.stylize('<uninitialized>','special');
1019-
}else{
1020-
throwerr;
1021-
}
1022-
}
1023-
1024-
return`${formatKey(ctx,key)}: ${value}`;
1025-
}
1026-
10271015
functionformatProperty(ctx,value,recurseTimes,key,array){
1028-
letstr;
1016+
letname,str;
1017+
letextra=' ';
10291018
constdesc=Object.getOwnPropertyDescriptor(value,key)||
10301019
{value: value[key],enumerable: true};
10311020
if(desc.value!==undefined){
10321021
constdiff=array!==0||ctx.compact===false ? 2 : 3;
10331022
ctx.indentationLvl+=diff;
1034-
str=formatValue(ctx,desc.value,recurseTimes,array===0);
1023+
str=formatValue(ctx,desc.value,recurseTimes);
1024+
if(diff===3){
1025+
constlen=ctx.colors ? removeColors(str).length : str.length;
1026+
if(ctx.breakLength<len){
1027+
extra=`\n${' '.repeat(ctx.indentationLvl)}`;
1028+
}
1029+
}
10351030
ctx.indentationLvl-=diff;
10361031
}elseif(desc.get!==undefined){
10371032
if(desc.set!==undefined){
@@ -1047,11 +1042,19 @@ function formatProperty(ctx, value, recurseTimes, key, array) {
10471042
if(array===1){
10481043
returnstr;
10491044
}
1050-
1051-
return`${formatKey(ctx,key,desc.enumerable)}: ${str}`;
1045+
if(typeofkey==='symbol'){
1046+
name=`[${ctx.stylize(key.toString(),'symbol')}]`;
1047+
}elseif(desc.enumerable===false){
1048+
name=`[${key}]`;
1049+
}elseif(keyStrRegExp.test(key)){
1050+
name=ctx.stylize(key,'name');
1051+
}else{
1052+
name=ctx.stylize(strEscape(key),'string');
1053+
}
1054+
return`${name}:${extra}${str}`;
10521055
}
10531056

1054-
functionreduceToSingleString(ctx,output,base,braces,addLn){
1057+
functionreduceToSingleString(ctx,output,base,braces){
10551058
constbreakLength=ctx.breakLength;
10561059
leti=0;
10571060
if(ctx.compact===false){
@@ -1080,11 +1083,10 @@ function reduceToSingleString(ctx, output, base, braces, addLn) {
10801083
// we need to force the first item to be on the next line or the
10811084
// items will not line up correctly.
10821085
constindentation=' '.repeat(ctx.indentationLvl);
1083-
constextraLn=addLn===true ? `\n${indentation}` : '';
10841086
constln=base===''&&braces[0].length===1 ?
1085-
' ' : `${base ? ` ${base}` : base}\n${indentation} `;
1087+
' ' : `${base ? ` ${base}` : ''}\n${indentation} `;
10861088
conststr=join(output,`,\n${indentation} `);
1087-
return`${extraLn}${braces[0]}${ln}${str}${braces[1]}`;
1089+
return`${braces[0]}${ln}${str}${braces[1]}`;
10881090
}
10891091

10901092
functionisBoolean(arg){

‎test/parallel/test-util-format.js‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ assert.strictEqual(
126126
util.format('%o',obj),
127127
'{ foo: \'bar\',\n'+
128128
' foobar: 1,\n'+
129-
' func:\n'+
129+
' func:\n'+
130130
' { [Function: func]\n'+
131131
' [length]: 0,\n'+
132132
' [name]: \'func\',\n'+
@@ -135,8 +135,8 @@ assert.strictEqual(
135135
util.format('%o',nestedObj2),
136136
'{ foo: \'bar\',\n'+
137137
' foobar: 1,\n'+
138-
' func:\n'+
139-
' [ { a:\n'+
138+
' func:\n'+
139+
' [ { a:\n'+
140140
' { [Function: a]\n'+
141141
' [length]: 0,\n'+
142142
' [name]: \'a\',\n'+
@@ -145,9 +145,9 @@ assert.strictEqual(
145145
assert.strictEqual(
146146
util.format('%o',nestedObj),
147147
'{ foo: \'bar\',\n'+
148-
' foobar:\n'+
148+
' foobar:\n'+
149149
' { foo: \'bar\',\n'+
150-
' func:\n'+
150+
' func:\n'+
151151
' { [Function: func]\n'+
152152
' [length]: 0,\n'+
153153
' [name]: \'func\',\n'+
@@ -156,14 +156,14 @@ assert.strictEqual(
156156
util.format('%o %o',obj,obj),
157157
'{ foo: \'bar\',\n'+
158158
' foobar: 1,\n'+
159-
' func:\n'+
159+
' func:\n'+
160160
' { [Function: func]\n'+
161161
' [length]: 0,\n'+
162162
' [name]: \'func\',\n'+
163163
' [prototype]: func { [constructor]: [Circular] } } }'+
164164
' { foo: \'bar\',\n'+
165165
' foobar: 1,\n'+
166-
' func:\n'+
166+
' func:\n'+
167167
' { [Function: func]\n'+
168168
' [length]: 0,\n'+
169169
' [name]: \'func\',\n'+
@@ -172,7 +172,7 @@ assert.strictEqual(
172172
util.format('%o %o',obj),
173173
'{ foo: \'bar\',\n'+
174174
' foobar: 1,\n'+
175-
' func:\n'+
175+
' func:\n'+
176176
' { [Function: func]\n'+
177177
' [length]: 0,\n'+
178178
' [name]: \'func\',\n'+

‎test/parallel/test-util-inspect.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1237,7 +1237,7 @@ util.inspect(process);
12371237

12381238
letout=util.inspect(o,{compact: true,depth: 5,breakLength: 80});
12391239
letexpect=[
1240-
'{ a:',
1240+
'{ a:',
12411241
' [ 1,',
12421242
' 2,',
12431243
" [ [ 'Lorem ipsum dolor\\nsit amet,\\tconsectetur adipiscing elit, "+

‎test/parallel/test-whatwg-url-inspect.js‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ const url = new URL('https://username:password@host.name:8080/path/name/?que=ry#
1616
assert.strictEqual(
1717
util.inspect(url),
1818
`URL {
19-
href: 'https://username:password@host.name:8080/path/name/?que=ry#hash',
19+
href:
20+
'https://username:password@host.name:8080/path/name/?que=ry#hash',
2021
origin: 'https://host.name:8080',
2122
protocol: 'https:',
2223
username: 'username',
@@ -32,7 +33,8 @@ assert.strictEqual(
3233
assert.strictEqual(
3334
util.inspect(url,{showHidden: true}),
3435
`URL {
35-
href: 'https://username:password@host.name:8080/path/name/?que=ry#hash',
36+
href:
37+
'https://username:password@host.name:8080/path/name/?que=ry#hash',
3638
origin: 'https://host.name:8080',
3739
protocol: 'https:',
3840
username: 'username',
@@ -46,7 +48,7 @@ assert.strictEqual(
4648
hash: '#hash',
4749
cannotBeBase: false,
4850
special: true,
49-
[Symbol(context)]:\x20
51+
[Symbol(context)]:
5052
URLContext {
5153
flags: 2032,
5254
scheme: 'https:',

0 commit comments

Comments
 (0)