11// @flow
22import React from 'react' ;
3- import { Iterable } from 'immutable' ;
4- import isIterable from '../utils/isIterable' ;
3+ import getType from '../utils/getType' ;
54
65import type { StylingFunction } from 'react-base16-styling' ;
76
8- const IS_IMMUTABLE_KEY = '@@__IS_IMMUTABLE__@@' ;
7+ function getShortTypeString ( val : any , diff ?: boolean ) : string {
8+ const type = getType ( val ) ;
99
10- function isImmutable ( value ) : boolean {
11- return Iterable . isKeyed ( value ) || Iterable . isIndexed ( value ) || Iterable . isIterable ( value ) ;
12- }
13-
14- function getShortTypeString ( val , diff ) : string {
1510 if ( diff && Array . isArray ( val ) ) {
1611 val = val [ val . length === 2 ? 1 : 0 ] ;
1712 }
1813
19- if ( isIterable ( val ) && ! isImmutable ( val ) ) {
14+ switch ( type ) {
15+ case 'Immutable List' :
16+ case 'Immutable Stack' :
17+ case 'Immutable Seq' :
18+ return '<I>' + val . size ? '[…]' : '[]' ;
19+ case 'Map' :
20+ return val . size ? '{…}' : '{}' ;
21+ case 'WeakMap' :
22+ return '{…}' ;
23+ case 'Set' :
24+ return val . size ? '(…)' : '()' ;
25+ case 'WeakSet' :
26+ return '(…)' ;
27+ case 'Immutable Map' :
28+ case 'Immutable OrderedMap' :
29+ return '<I>' + val . size ? '{…}' : '{}' ;
30+ case 'Immutable Set' :
31+ case 'Immutable OrderedSet' :
32+ return '<I>' + val . size ? '(…)' : '()' ;
33+ case 'Iterable' :
2034 return '(…)' ;
21- } else if ( Array . isArray ( val ) ) {
35+ case ' Array' :
2236 return val . length > 0 ? '[…]' : '[]' ;
23- } else if ( val === null ) {
37+ case 'Null' :
2438 return 'null' ;
25- } else if ( val === undefined ) {
39+ case 'Undefined' :
2640 return 'undef' ;
27- } else if ( typeof val === 'object' ) {
41+ case 'Error' :
42+ return `Error(${ getShortTypeString ( val . message ) } ` ;
43+ case 'Object' :
2844 return Object . keys ( val ) . length > 0 ? '{…}' : '{}' ;
29- } else if ( typeof val === 'function' ) {
45+ case 'Function' :
3046 return 'fn' ;
31- } else if ( typeof val === 'string' ) {
47+ case 'String' :
3248 return `"${ val . substr ( 0 , 10 ) + ( val . length > 10 ? '…' : '' ) } "`
33- } else if ( ( typeof val : any ) === 'symbol' ) {
49+ case 'Symbol' :
3450 return 'symbol' ;
35- } else {
36- return val ;
51+ default :
52+ return val . toString ( ) ;
3753 }
3854}
3955
56+ function getFirstEntries ( data , limit , getEntryString ) : string {
57+ let idx = 0 , arr = [ ] ;
58+
59+ for ( let entry of data ) {
60+ if ( idx === 3 ) {
61+ arr . push ( '…' ) ;
62+ break ;
63+ } ;
64+ arr . push ( getEntryString ( entry ) ) ;
65+ idx ++ ;
66+ }
67+
68+ return arr . join ( ', ' ) ;
69+ }
70+
4071function getText ( type , data , isWideLayout , isDiff ) : string {
41- if ( type === 'Object' ) {
72+ let str ;
73+ type = getType ( data ) ;
74+
75+ switch ( type ) {
76+ case 'Immutable List' :
77+ case 'Immutable Stack' :
78+ case 'Immutable Seq' :
79+ str = getFirstEntries ( data , 3 , entry => getShortTypeString ( entry ) ) ;
80+ return `<I>[ ${ str } ]` ;
81+ case 'Map' :
82+ str = getFirstEntries ( data , 3 , entry =>
83+ `${ getShortTypeString ( entry [ 0 ] ) } => ${ getShortTypeString ( entry [ 1 ] ) } `
84+ ) ;
85+ return `{ ${ str } }` ;
86+ case 'WeakMap' :
87+ return '{…}' ;
88+ case 'Set' :
89+ str = getFirstEntries ( data , 3 , entry => getShortTypeString ( entry ) ) ;
90+ return `( ${ str } )` ;
91+ case 'WeakSet' :
92+ return '(…)' ;
93+ case 'Immutable Map' :
94+ case 'Immutable OrderedMap' :
95+ str = getFirstEntries ( data , 3 , entry =>
96+ `${ getShortTypeString ( entry [ 0 ] ) } => ${ getShortTypeString ( entry [ 1 ] ) } `
97+ ) ;
98+ return `<I>{ ${ str } }` ;
99+ case 'Immutable Set' :
100+ case 'Immutable OrderedSet' :
101+ str = getFirstEntries ( data , 3 , entry => getShortTypeString ( entry ) ) ;
102+ return `<I>( ${ str } )` ;
103+ case 'Object' :
42104 const keys = Object . keys ( data ) ;
43105 if ( ! isWideLayout ) return keys . length ? '{…}' : '{}' ;
44106
45- const str = keys
107+ str = keys
46108 . slice ( 0 , 3 )
47109 . map ( key => `${ key } : ${ getShortTypeString ( data [ key ] , isDiff ) } ` )
48110 . concat ( keys . length > 3 ? [ '…' ] : [ ] )
49111 . join ( ', ' ) ;
50112
51113 return `{ ${ str } }` ;
52- } else if ( type === 'Array' ) {
114+ case 'Array' :
53115 if ( ! isWideLayout ) return data . length ? '[…]' : '[]' ;
54116
55- const str = data
117+ str = data
56118 . slice ( 0 , 4 )
57119 . map ( val => getShortTypeString ( val , isDiff ) )
58120 . concat ( data . length > 4 ? [ '…' ] : [ ] ) . join ( ', ' ) ;
59121
60122 return `[${ str } ]` ;
61- } else {
123+ default :
62124 return type ;
63125 }
64126}
@@ -71,7 +133,6 @@ const getItemString = (
71133 isDiff : boolean = false
72134) : React$Element < * > =>
73135 < span { ...styling ( 'treeItemHint' ) } >
74- { data [ IS_IMMUTABLE_KEY ] ? 'Immutable' : '' }
75136 { getText ( type , data , isWideLayout , isDiff ) }
76137 </ span > ;
77138
0 commit comments