@@ -448,14 +448,11 @@ export function getDisplayNameForReactElement(
448
448
}
449
449
}
450
450
451
- const STRINGIFY_OPTIONS = {
452
- inlineCharacterLimit : 50 ,
453
- singleQuotes : false ,
454
- } ;
451
+ const MAX_PREVIEW_STRING_LENGTH = 50 ;
455
452
456
453
function truncateForDisplay (
457
454
string : string ,
458
- length: number = STRINGIFY_OPTIONS.inlineCharacterLimit ,
455
+ length : number = MAX_PREVIEW_STRING_LENGTH ,
459
456
) {
460
457
if ( string . length > length ) {
461
458
return string . substr ( 0 , length ) + '…' ;
@@ -519,11 +516,18 @@ export function formatDataForPreview(
519
516
return `DataView(${ data . buffer . byteLength } )` ;
520
517
case 'array' :
521
518
if ( showFormattedValue ) {
522
- const formatted = [ ] ;
519
+ let formatted = '' ;
523
520
for ( let i = 0 ; i < data . length ; i ++ ) {
524
- formatted [ i ] = formatDataForPreview ( data [ i ] , false ) ;
521
+ if ( i > 0 ) {
522
+ formatted += ', ' ;
523
+ }
524
+ formatted += formatDataForPreview ( data [ i ] , false ) ;
525
+ if ( formatted . length > MAX_PREVIEW_STRING_LENGTH ) {
526
+ // Prevent doing a lot of unnecessary iteration...
527
+ break;
528
+ }
525
529
}
526
- return `[${ truncateForDisplay ( formatted . join ( ', ' ) ) } ]` ;
530
+ return `[${ truncateForDisplay ( formatted ) } ]` ;
527
531
} else {
528
532
const length = data . hasOwnProperty ( meta . size )
529
533
? data [ meta . size ]
@@ -533,24 +537,38 @@ export function formatDataForPreview(
533
537
case 'typed_array' :
534
538
const shortName = `${ data . constructor . name } (${ data . length } )` ;
535
539
if ( showFormattedValue ) {
536
- return `${ shortName } [${ truncateForDisplay (
537
- data
538
- . toString ( )
539
- . split ( ',' )
540
- . join ( ', ' ) ,
541
- ) } ]`;
540
+ let formatted = '' ;
541
+ for ( let i = 0 ; i < data . length ; i ++ ) {
542
+ if ( i > 0 ) {
543
+ formatted += ', ' ;
544
+ }
545
+ formatted += data [ i ] ;
546
+ if ( formatted . length > MAX_PREVIEW_STRING_LENGTH ) {
547
+ // Prevent doing a lot of unnecessary iteration...
548
+ break ;
549
+ }
550
+ }
551
+ return `${ shortName } [${ truncateForDisplay ( formatted ) } ]` ;
542
552
} else {
543
553
return shortName ;
544
554
}
545
555
case 'iterator ':
546
556
const name = data . constructor . name ;
547
557
if ( showFormattedValue ) {
548
- const valueStrings = [ ] ;
549
558
// TRICKY
550
559
// Don't use [...spread] syntax for this purpose.
551
560
// This project uses @babel /plugin-transform-spread in "loose" mode which only works with Array values.
552
561
// Other types (e.g. typed arrays, Sets) will not spread correctly.
553
- Array . from ( data ) . forEach ( entryOrEntries => {
562
+ const array = Array . from ( data ) ;
563
+
564
+ let formatted = '' ;
565
+ for ( let i = 0 ; i < array . length ; i ++ ) {
566
+ const entryOrEntries = array [ i ] ;
567
+
568
+ if ( i > 0 ) {
569
+ formatted += ', ' ;
570
+ }
571
+
554
572
// TRICKY
555
573
// Browsers display Maps and Sets differently.
556
574
// To mimic their behavior, detect if we've been given an entries tuple.
@@ -559,28 +577,40 @@ export function formatDataForPreview(
559
577
if ( Array . isArray ( entryOrEntries ) ) {
560
578
const key = formatDataForPreview ( entryOrEntries [ 0 ] , true ) ;
561
579
const value = formatDataForPreview ( entryOrEntries [ 1 ] , false ) ;
562
- valueStrings . push ( `${ key } => ${ value } ` ) ;
580
+ formatted += `${ key } => ${ value } ` ;
563
581
} else {
564
- valueStrings . push ( formatDataForPreview ( entryOrEntries , false ) ) ;
582
+ formatted + = formatDataForPreview ( entryOrEntries , false ) ;
583
+ }
584
+
585
+ if ( formatted . length > MAX_PREVIEW_STRING_LENGTH ) {
586
+ // Prevent doing a lot of unnecessary iteration...
587
+ break;
565
588
}
566
- } ) ;
567
- return `${name } (${ data . size } ) { $ { truncateForDisplay (
568
- valueStrings . join ( ', ' ) ,
569
- ) } } `;
589
+ }
590
+
591
+ return `${ name } (${ data . size } ) {${ truncateForDisplay ( formatted ) } }` ;
570
592
} else {
571
593
return `${ name } (${ data . size } )` ;
572
594
}
573
595
case 'date' :
574
596
return data . toString ( ) ;
575
597
case 'object' :
576
598
if ( showFormattedValue ) {
577
- const formatted = [ ] ;
578
- Object . keys ( data )
579
- . sort ( alphaSortEntries )
580
- . forEach ( key => {
581
- formatted . push ( `${ key } : ${ formatDataForPreview ( data [ key ] , false ) } ` ) ;
582
- } ) ;
583
- return `{${ truncateForDisplay ( formatted . join ( ', ' ) ) } }` ;
599
+ const keys = Object . keys ( data ) . sort ( alphaSortEntries ) ;
600
+
601
+ let formatted = '' ;
602
+ for ( let i = 0 ; i < keys . length ; i ++ ) {
603
+ const key = keys [ i ] ;
604
+ if ( i > 0 ) {
605
+ formatted += ', ' ;
606
+ }
607
+ formatted += `${ key } : ${ formatDataForPreview ( data [ key ] , false ) } ` ;
608
+ if ( formatted . length > MAX_PREVIEW_STRING_LENGTH ) {
609
+ // Prevent doing a lot of unnecessary iteration...
610
+ break;
611
+ }
612
+ }
613
+ return `{${ truncateForDisplay ( formatted ) } }` ;
584
614
} else {
585
615
return '{…}' ;
586
616
}
0 commit comments