1+ import { For } from "solid-js" ;
2+ import { useStyles } from "../styles/use-styles" ;
3+
4+ export function JsonTree ( props : { value : any } ) {
5+ return < JsonValue isRoot value = { props . value } />
6+ }
7+
8+ export function JsonValue ( props : { value : any ; keyName ?: string , isRoot ?: boolean } ) {
9+ const { value, keyName, isRoot = false } = props ;
10+ const styles = useStyles ( ) ;
11+
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 >
71+
72+ </ span > ;
73+ }
74+ return < span /> ;
75+ }
0 commit comments