11import { For } from "solid-js" ;
22import { useStyles } from "../styles/use-styles" ;
33
4- export function JsonTree ( props : { value : any } ) {
4+ export function JsonTree ( props : { value : any } ) {
55 return < JsonValue isRoot value = { props . value } />
66}
77
8- export function JsonValue ( props : { value : any ; keyName ?: string , isRoot ?: boolean } ) {
9- const { value, keyName, isRoot = false } = props ;
8+ export function JsonValue ( props : { value : any ; keyName ?: string , isRoot ?: boolean , isLastKey ?: boolean } ) {
9+ const { value, keyName, isRoot = false , isLastKey } = props ;
1010 const styles = useStyles ( ) ;
1111
12- if ( typeof value === 'string' ) {
13- return < span class = { styles ( ) . tree . valueContainer ( isRoot ) } >
14- < span > { keyName && < span class = { styles ( ) . tree . valueKey } > "{ keyName } ": </ span > }
15- < span class = { styles ( ) . tree . valueString } > "{ value } "</ span > </ span >
16- < span > ,</ span >
17- </ span > ;
18- }
19- if ( typeof value === 'number' ) {
20- return < span class = { styles ( ) . tree . valueContainer ( isRoot ) } >
21- < span > { keyName && < span class = { styles ( ) . tree . valueKey } > "{ keyName } ": </ span > }
22- < span class = { styles ( ) . tree . valueNumber } > { value } </ span > </ span >
23- < span > ,</ span >
24- </ span > ;
25- }
26- if ( typeof value === 'boolean' ) {
27- return < span class = { styles ( ) . tree . valueContainer ( isRoot ) } >
28- < span >
29- { keyName && < span class = { styles ( ) . tree . valueKey } > "{ keyName } ": </ span > }
30- < span class = { styles ( ) . tree . valueBoolean } > { String ( value ) } </ span >
31- </ span >
32- < span > ,</ span >
33- </ span > ;
34- }
35- if ( value === null ) {
36- return < span class = { styles ( ) . tree . valueContainer ( isRoot ) } >
37- < span > { keyName && < span class = { styles ( ) . tree . valueKey } > "{ keyName } ": </ span > }
38- < span class = { styles ( ) . tree . valueNull } > null</ span > </ span >
39- < span > ,</ span >
40- </ span > ;
41- }
42- if ( value === undefined ) {
43- return < span class = { styles ( ) . tree . valueContainer ( isRoot ) } >
44- < span > { keyName && < span class = { styles ( ) . tree . valueKey } > "{ keyName } ": </ span > }
45- < span class = { styles ( ) . tree . valueNull } > undefined</ span > </ span >
46- < span > ,</ span >
47- </ span > ;
48- }
49- if ( Array . isArray ( value ) ) {
50- return < span class = { styles ( ) . tree . valueContainer ( isRoot ) } >
51- < span > { keyName && < span class = { styles ( ) . tree . valueKey } > "{ keyName } ": </ span > }
52- < span class = { styles ( ) . tree . valueBraces } > [</ span >
53- < For each = { value } > { ( item ) => < >
54- < JsonValue value = { item } />
55- </ > }
56- </ For >
57- < span class = { styles ( ) . tree . valueBraces } > ]</ span > </ span >
58- < span > ,</ span >
59- </ span > ;
60- }
61- if ( typeof value === 'object' ) {
62- const keys = Object . keys ( value ) ;
63- return < span class = { styles ( ) . tree . valueContainer ( isRoot ) } >
64- < span > { keyName && < span class = { styles ( ) . tree . valueKey } > "{ keyName } ": </ span > }
65- < span class = { styles ( ) . tree . valueBraces } > { '{' } </ span >
66- < For each = { keys } > { ( k , ) => < >
67- < JsonValue value = { value [ k ] } keyName = { k } />
68- </ > }
69- </ For >
70- < span class = { styles ( ) . tree . valueBraces } > { '}' } </ span > </ span >
12+ return < span class = { styles ( ) . tree . valueContainer ( isRoot ) } >
13+ { ( ( ) => {
14+ if ( typeof value === 'string' ) {
15+ return < span >
16+ { keyName && < span class = { styles ( ) . tree . valueKey } > "{ keyName } ": </ span > }
17+ < span class = { styles ( ) . tree . valueString } > "{ value } "</ span >
18+ </ span >
19+
20+ }
21+ if ( typeof value === 'number' ) {
22+ return < span > { keyName && < span class = { styles ( ) . tree . valueKey } > "{ keyName } ": </ span > }
23+ < span class = { styles ( ) . tree . valueNumber } > { value } </ span >
24+ </ span >
25+
26+ }
27+ if ( typeof value === 'boolean' ) {
28+ return < span >
29+ { keyName && < span class = { styles ( ) . tree . valueKey } > "{ keyName } ": </ span > }
30+ < span class = { styles ( ) . tree . valueBoolean } > { String ( value ) } </ span >
31+ </ span >
32+
33+ }
34+ if ( value === null ) {
35+ return < span >
36+ { keyName && < span class = { styles ( ) . tree . valueKey } > "{ keyName } ": </ span > }
37+ < span class = { styles ( ) . tree . valueNull } > null</ span >
38+ </ span >
39+
40+ }
41+ if ( value === undefined ) {
42+ return < span >
43+ { keyName && < span class = { styles ( ) . tree . valueKey } > "{ keyName } ": </ span > }
44+ < span class = { styles ( ) . tree . valueNull } > undefined</ span >
45+ </ span > ;
46+ }
47+ if ( Array . isArray ( value ) ) {
48+
49+ return < span > { keyName && < span class = { styles ( ) . tree . valueKey } > "{ keyName } ": </ span > }
50+ < span class = { styles ( ) . tree . valueBraces } > [</ span >
51+ < For each = { value } > { ( item , i ) => {
52+ const isLastKey = i ( ) === value . length - 1 ;
53+ return < >
54+ < JsonValue value = { item } isLastKey = { isLastKey } />
55+ </ >
56+ } }
57+ </ For >
58+ < span class = { styles ( ) . tree . valueBraces } > ]</ span >
59+ </ span >
60+ }
61+ if ( typeof value === 'object' ) {
62+ const keys = Object . keys ( value ) ;
63+ const lastKeyName = keys [ keys . length - 1 ] ;
64+ return < span >
65+ { keyName && < span class = { styles ( ) . tree . valueKey } > "{ keyName } ": </ span > }
66+ < span class = { styles ( ) . tree . valueBraces } > { '{' } </ span >
67+ < For each = { keys } > { ( k , ) => < >
68+ < JsonValue value = { value [ k ] } keyName = { k } isLastKey = { lastKeyName === k } />
69+ </ > }
70+ </ For >
71+ < span class = { styles ( ) . tree . valueBraces } > { '}' } </ span >
72+ </ span >
73+
74+ }
75+ return < span /> ;
76+ } ) ( ) }
77+ { isLastKey || isRoot ? '' : < span > ,</ span > }
78+ </ span >
7179
72- </ span > ;
73- }
74- return < span /> ;
7580}
0 commit comments