1 | import React from 'react';
|
2 | import objType from './objType.js';
|
3 | import JSONObjectNode from './JSONObjectNode.js';
|
4 | import JSONArrayNode from './JSONArrayNode.js';
|
5 | import JSONIterableNode from './JSONIterableNode.js';
|
6 | import JSONValueNode from './JSONValueNode.js';
|
7 | export default function JSONNode({ getItemString, keyPath, labelRenderer, styling, value, valueRenderer, isCustomNode, ...rest }) {
|
8 | const nodeType = isCustomNode(value) ? 'Custom' : objType(value);
|
9 | const simpleNodeProps = {
|
10 | getItemString,
|
11 | key: keyPath[0],
|
12 | keyPath,
|
13 | labelRenderer,
|
14 | nodeType,
|
15 | styling,
|
16 | value,
|
17 | valueRenderer,
|
18 | };
|
19 | const nestedNodeProps = {
|
20 | ...rest,
|
21 | ...simpleNodeProps,
|
22 | data: value,
|
23 | isCustomNode,
|
24 | };
|
25 | switch (nodeType) {
|
26 | case 'Object':
|
27 | case 'Error':
|
28 | case 'WeakMap':
|
29 | case 'WeakSet':
|
30 | return React.createElement(JSONObjectNode, { ...nestedNodeProps });
|
31 | case 'Array':
|
32 | return React.createElement(JSONArrayNode, { ...nestedNodeProps });
|
33 | case 'Iterable':
|
34 | case 'Map':
|
35 | case 'Set':
|
36 | return React.createElement(JSONIterableNode, { ...nestedNodeProps });
|
37 | case 'String':
|
38 | return (React.createElement(JSONValueNode, { ...simpleNodeProps, valueGetter: (raw) => `"${raw}"` }));
|
39 | case 'Number':
|
40 | return React.createElement(JSONValueNode, { ...simpleNodeProps });
|
41 | case 'Boolean':
|
42 | return (React.createElement(JSONValueNode, { ...simpleNodeProps, valueGetter: (raw) => (raw ? 'true' : 'false') }));
|
43 | case 'Date':
|
44 | return (React.createElement(JSONValueNode, { ...simpleNodeProps, valueGetter: (raw) => raw.toISOString() }));
|
45 | case 'Null':
|
46 | return React.createElement(JSONValueNode, { ...simpleNodeProps, valueGetter: () => 'null' });
|
47 | case 'Undefined':
|
48 | return (React.createElement(JSONValueNode, { ...simpleNodeProps, valueGetter: () => 'undefined' }));
|
49 | case 'Function':
|
50 | case 'Symbol':
|
51 | return (React.createElement(JSONValueNode, { ...simpleNodeProps, valueGetter: (raw) => raw.toString() }));
|
52 | case 'Custom':
|
53 | return React.createElement(JSONValueNode, { ...simpleNodeProps });
|
54 | default:
|
55 | return (React.createElement(JSONValueNode, { ...simpleNodeProps, valueGetter: () => `<${nodeType}>` }));
|
56 | }
|
57 | }
|