@uiw/react-json-view 2.0.0-alpha.3 → 2.0.0-alpha.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +217 -26
- package/basic.d.ts +3 -0
- package/cjs/Container.d.ts +2 -0
- package/cjs/Container.js +13 -6
- package/cjs/arrow/TriangleArrow.js +1 -1
- package/cjs/comps/Copied.d.ts +2 -4
- package/cjs/comps/Copied.js +50 -17
- package/cjs/comps/KeyValues.d.ts +2 -4
- package/cjs/comps/KeyValues.js +62 -27
- package/cjs/comps/NestedClose.d.ts +1 -0
- package/cjs/comps/NestedClose.js +15 -5
- package/cjs/comps/NestedOpen.d.ts +2 -3
- package/cjs/comps/NestedOpen.js +34 -14
- package/cjs/comps/Value.d.ts +1 -2
- package/cjs/comps/Value.js +4 -8
- package/cjs/comps/useIdCompat.d.ts +1 -0
- package/cjs/comps/useIdCompat.js +14 -0
- package/cjs/editor/KeyName.d.ts +2 -0
- package/cjs/editor/KeyName.js +82 -0
- package/cjs/editor/index.d.ts +18 -0
- package/cjs/editor/index.js +44 -0
- package/cjs/editor/store.d.ts +27 -0
- package/cjs/editor/store.js +23 -0
- package/cjs/index.d.ts +10 -3
- package/cjs/index.js +9 -4
- package/cjs/section/Copied.d.ts +1 -1
- package/cjs/section/Copied.js +1 -2
- package/cjs/section/CountInfo.d.ts +1 -2
- package/cjs/section/CountInfo.js +3 -5
- package/cjs/section/CountInfoExtra.d.ts +1 -2
- package/cjs/section/CountInfoExtra.js +2 -4
- package/cjs/section/Ellipsis.d.ts +0 -1
- package/cjs/section/Ellipsis.js +4 -5
- package/cjs/section/KeyName.d.ts +7 -6
- package/cjs/section/KeyName.js +8 -6
- package/cjs/section/Row.d.ts +13 -0
- package/cjs/section/Row.js +51 -0
- package/cjs/store/Expands.js +2 -4
- package/cjs/store/Section.d.ts +12 -6
- package/cjs/store/Section.js +6 -4
- package/cjs/store/ShowTools.js +2 -4
- package/cjs/store/Symbols.d.ts +10 -3
- package/cjs/store/Symbols.js +2 -4
- package/cjs/store/Types.d.ts +29 -25
- package/cjs/store/Types.js +8 -8
- package/cjs/store.d.ts +8 -4
- package/cjs/store.js +5 -10
- package/cjs/symbol/Arrow.d.ts +1 -1
- package/cjs/symbol/Arrow.js +1 -2
- package/cjs/symbol/BraceLeft.d.ts +1 -1
- package/cjs/symbol/BraceLeft.js +1 -2
- package/cjs/symbol/BraceRight.d.ts +1 -1
- package/cjs/symbol/BraceRight.js +1 -2
- package/cjs/symbol/BracketsLeft.d.ts +1 -1
- package/cjs/symbol/BracketsLeft.js +1 -2
- package/cjs/symbol/BracketsRight.d.ts +1 -1
- package/cjs/symbol/BracketsRight.js +1 -2
- package/cjs/symbol/Colon.d.ts +1 -1
- package/cjs/symbol/Colon.js +1 -2
- package/cjs/symbol/Quote.d.ts +1 -1
- package/cjs/symbol/Quote.js +1 -2
- package/cjs/symbol/ValueQuote.d.ts +1 -1
- package/cjs/symbol/ValueQuote.js +1 -2
- package/cjs/symbol/index.d.ts +11 -16
- package/cjs/symbol/index.js +75 -30
- package/cjs/theme/basic.d.ts +1 -2
- package/cjs/theme/basic.js +4 -3
- package/cjs/theme/dark.d.ts +1 -2
- package/cjs/theme/dark.js +2 -3
- package/cjs/theme/github.dark.d.ts +1 -2
- package/cjs/theme/github.dark.js +2 -3
- package/cjs/theme/github.light.d.ts +1 -2
- package/cjs/theme/github.light.js +2 -3
- package/cjs/theme/gruvbox.d.ts +1 -2
- package/cjs/theme/gruvbox.js +2 -3
- package/cjs/theme/light.d.ts +1 -2
- package/cjs/theme/light.js +2 -3
- package/cjs/theme/monokai.d.ts +1 -2
- package/cjs/theme/monokai.js +2 -3
- package/cjs/theme/nord.d.ts +1 -2
- package/cjs/theme/nord.js +2 -3
- package/cjs/theme/vscode.d.ts +1 -2
- package/cjs/theme/vscode.js +2 -3
- package/cjs/types/Bigint.d.ts +1 -1
- package/cjs/types/Bigint.js +1 -2
- package/cjs/types/Date.d.ts +1 -1
- package/cjs/types/Date.js +1 -2
- package/cjs/types/False.d.ts +1 -1
- package/cjs/types/False.js +1 -2
- package/cjs/types/Float.d.ts +1 -1
- package/cjs/types/Float.js +1 -2
- package/cjs/types/Int.d.ts +1 -1
- package/cjs/types/Int.js +1 -2
- package/cjs/types/Map.d.ts +1 -1
- package/cjs/types/Map.js +1 -2
- package/cjs/types/Nan.d.ts +1 -1
- package/cjs/types/Nan.js +1 -2
- package/cjs/types/Null.d.ts +1 -1
- package/cjs/types/Null.js +1 -2
- package/cjs/types/Set.d.ts +1 -1
- package/cjs/types/Set.js +1 -2
- package/cjs/types/String.d.ts +1 -1
- package/cjs/types/String.js +1 -2
- package/cjs/types/True.d.ts +1 -1
- package/cjs/types/True.js +1 -2
- package/cjs/types/Undefined.d.ts +1 -1
- package/cjs/types/Undefined.js +1 -2
- package/cjs/types/Url.d.ts +1 -1
- package/cjs/types/Url.js +1 -2
- package/cjs/types/index.d.ts +3 -1
- package/cjs/types/index.js +96 -124
- package/cjs/utils/useHighlight.d.ts +0 -1
- package/cjs/utils/useRender.d.ts +1 -1
- package/editor.d.ts +22 -20
- package/esm/Container.d.ts +2 -0
- package/esm/Container.js +15 -7
- package/esm/arrow/TriangleArrow.js +1 -1
- package/esm/comps/Copied.d.ts +2 -4
- package/esm/comps/Copied.js +48 -16
- package/esm/comps/KeyValues.d.ts +2 -4
- package/esm/comps/KeyValues.js +53 -21
- package/esm/comps/NestedClose.d.ts +1 -0
- package/esm/comps/NestedClose.js +13 -3
- package/esm/comps/NestedOpen.d.ts +2 -3
- package/esm/comps/NestedOpen.js +33 -14
- package/esm/comps/Value.d.ts +1 -2
- package/esm/comps/Value.js +2 -4
- package/esm/comps/useIdCompat.d.ts +1 -0
- package/esm/comps/useIdCompat.js +8 -0
- package/esm/editor/KeyName.d.ts +2 -0
- package/esm/editor/KeyName.js +77 -0
- package/esm/editor/index.d.ts +18 -0
- package/esm/editor/index.js +33 -0
- package/esm/editor/store.d.ts +27 -0
- package/esm/editor/store.js +13 -0
- package/esm/index.d.ts +10 -3
- package/esm/index.js +10 -5
- package/esm/section/Copied.d.ts +1 -1
- package/esm/section/CountInfo.d.ts +1 -2
- package/esm/section/CountInfo.js +1 -1
- package/esm/section/CountInfoExtra.d.ts +1 -2
- package/esm/section/Ellipsis.d.ts +0 -1
- package/esm/section/Ellipsis.js +1 -1
- package/esm/section/KeyName.d.ts +7 -6
- package/esm/section/KeyName.js +6 -2
- package/esm/section/Row.d.ts +13 -0
- package/esm/section/Row.js +47 -0
- package/esm/store/Section.d.ts +12 -6
- package/esm/store/Section.js +4 -0
- package/esm/store/Symbols.d.ts +10 -3
- package/esm/store/Types.d.ts +29 -25
- package/esm/store/Types.js +6 -4
- package/esm/store.d.ts +8 -4
- package/esm/symbol/Arrow.d.ts +1 -1
- package/esm/symbol/BraceLeft.d.ts +1 -1
- package/esm/symbol/BraceRight.d.ts +1 -1
- package/esm/symbol/BracketsLeft.d.ts +1 -1
- package/esm/symbol/BracketsRight.d.ts +1 -1
- package/esm/symbol/Colon.d.ts +1 -1
- package/esm/symbol/Quote.d.ts +1 -1
- package/esm/symbol/ValueQuote.d.ts +1 -1
- package/esm/symbol/index.d.ts +11 -16
- package/esm/symbol/index.js +76 -23
- package/esm/theme/basic.d.ts +1 -2
- package/esm/theme/basic.js +2 -0
- package/esm/theme/dark.d.ts +1 -2
- package/esm/theme/github.dark.d.ts +1 -2
- package/esm/theme/github.light.d.ts +1 -2
- package/esm/theme/gruvbox.d.ts +1 -2
- package/esm/theme/light.d.ts +1 -2
- package/esm/theme/monokai.d.ts +1 -2
- package/esm/theme/nord.d.ts +1 -2
- package/esm/theme/vscode.d.ts +1 -2
- package/esm/types/Bigint.d.ts +1 -1
- package/esm/types/Date.d.ts +1 -1
- package/esm/types/False.d.ts +1 -1
- package/esm/types/Float.d.ts +1 -1
- package/esm/types/Int.d.ts +1 -1
- package/esm/types/Map.d.ts +1 -1
- package/esm/types/Nan.d.ts +1 -1
- package/esm/types/Null.d.ts +1 -1
- package/esm/types/Set.d.ts +1 -1
- package/esm/types/String.d.ts +1 -1
- package/esm/types/True.d.ts +1 -1
- package/esm/types/Undefined.d.ts +1 -1
- package/esm/types/Url.d.ts +1 -1
- package/esm/types/index.d.ts +3 -1
- package/esm/types/index.js +82 -100
- package/esm/utils/useHighlight.d.ts +0 -1
- package/esm/utils/useRender.d.ts +1 -1
- package/githubDark.d.ts +3 -0
- package/githubLight.d.ts +3 -0
- package/gruvbox.d.ts +3 -0
- package/monokai.d.ts +3 -0
- package/nord.d.ts +3 -0
- package/package.json +11 -5
- package/vscode.d.ts +3 -0
package/README.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
react-json-view
|
|
2
2
|
===
|
|
3
3
|
|
|
4
|
+
[](https://jaywcjlove.github.io/#/sponsor)
|
|
4
5
|
[](https://github.com/uiwjs/react-json-view/actions/workflows/ci.yml)
|
|
5
6
|
[](https://www.npmjs.com/package/@uiw/react-json-view)
|
|
6
7
|
[](https://www.npmjs.com/package/@uiw/react-json-view)
|
|
@@ -126,7 +127,6 @@ export default function Demo() {
|
|
|
126
127
|
}
|
|
127
128
|
```
|
|
128
129
|
|
|
129
|
-
|
|
130
130
|
Example of custom `vscode` theme styles:
|
|
131
131
|
|
|
132
132
|
```tsx mdx:preview
|
|
@@ -146,6 +146,7 @@ const object = {
|
|
|
146
146
|
const customTheme = {
|
|
147
147
|
'--w-rjv-font-family': 'monospace',
|
|
148
148
|
'--w-rjv-color': '#9cdcfe',
|
|
149
|
+
'--w-rjv-key-number': '#268bd2',
|
|
149
150
|
'--w-rjv-key-string': '#9cdcfe',
|
|
150
151
|
'--w-rjv-background-color': '#1e1e1e',
|
|
151
152
|
'--w-rjv-line-color': '#36334280',
|
|
@@ -159,6 +160,7 @@ const customTheme = {
|
|
|
159
160
|
'--w-rjv-curlybraces-color': '#d4d4d4',
|
|
160
161
|
'--w-rjv-colon-color': '#d4d4d4',
|
|
161
162
|
'--w-rjv-brackets-color': '#d4d4d4',
|
|
163
|
+
'--w-rjv-ellipsis-color': '#cb4b16',
|
|
162
164
|
'--w-rjv-quotes-color': 'var(--w-rjv-key-string)',
|
|
163
165
|
'--w-rjv-quotes-string-color': 'var(--w-rjv-type-string-color)',
|
|
164
166
|
|
|
@@ -216,6 +218,7 @@ const object = {
|
|
|
216
218
|
}
|
|
217
219
|
const customTheme = {
|
|
218
220
|
'--w-rjv-color': '#9cdcfe',
|
|
221
|
+
'--w-rjv-key-number': '#268bd2',
|
|
219
222
|
'--w-rjv-key-string': '#9cdcfe',
|
|
220
223
|
'--w-rjv-background-color': '#1e1e1e',
|
|
221
224
|
'--w-rjv-line-color': '#36334280',
|
|
@@ -229,6 +232,7 @@ const customTheme = {
|
|
|
229
232
|
'--w-rjv-curlybraces-color': '#d4d4d4',
|
|
230
233
|
'--w-rjv-colon-color': '#d4d4d4',
|
|
231
234
|
'--w-rjv-brackets-color': '#d4d4d4',
|
|
235
|
+
'--w-rjv-ellipsis-color': '#cb4b16',
|
|
232
236
|
'--w-rjv-quotes-color': '#9cdcfe',
|
|
233
237
|
'--w-rjv-quotes-string-color': '#ce9178',
|
|
234
238
|
|
|
@@ -278,21 +282,31 @@ export default function Demo() {
|
|
|
278
282
|
/>
|
|
279
283
|
<div>
|
|
280
284
|
<Colorful color={hex} onChange={onChange} />
|
|
281
|
-
<div style={{ display: 'flex', gap: '0.4rem', flexDirection: 'column' }}>
|
|
285
|
+
<div style={{ display: 'flex', gap: '0.4rem', flexDirection: 'column', ...customTheme }}>
|
|
282
286
|
{Object.keys(customTheme).map((varname, idx) => {
|
|
283
287
|
const click = () => {
|
|
284
288
|
setCssvar(varname);
|
|
285
289
|
setHex(customTheme[varname]);
|
|
286
290
|
};
|
|
287
291
|
const active = cssvar === varname ? '#a8a8a8' : '';
|
|
288
|
-
return
|
|
292
|
+
return (
|
|
293
|
+
<button key={idx}
|
|
294
|
+
style={{ background: active, border: 0,boxShadow: 'inset 0px 0px 1px #000', display: 'flex', alignItems: 'center', gap: 5, padding: '1px 3px' }}
|
|
295
|
+
onClick={click}
|
|
296
|
+
>
|
|
297
|
+
<span style={{ display: 'inline-block', width: 12, height: 12, background: `var(${varname})` }}></span>
|
|
298
|
+
{varname}
|
|
299
|
+
</button>
|
|
300
|
+
)
|
|
289
301
|
})}
|
|
290
302
|
</div>
|
|
291
303
|
</div>
|
|
292
304
|
</div>
|
|
293
|
-
<
|
|
305
|
+
<div>
|
|
294
306
|
Copy the theme configuration below into your project.
|
|
295
|
-
|
|
307
|
+
</div>
|
|
308
|
+
<pre style={{ padding: 10 }}>
|
|
309
|
+
{JSON.stringify(theme, null, 2)}
|
|
296
310
|
</pre>
|
|
297
311
|
</React.Fragment>
|
|
298
312
|
);
|
|
@@ -324,13 +338,13 @@ export default function Demo() {
|
|
|
324
338
|
}}
|
|
325
339
|
>
|
|
326
340
|
<JsonView.String
|
|
327
|
-
render={({ children, ...reset }, { type }) => {
|
|
328
|
-
const isImg = /^https?.*\.(jpg|png)$/i.test(
|
|
341
|
+
render={({ children, ...reset }, { type, value, keyName }) => {
|
|
342
|
+
const isImg = /^https?.*\.(jpg|png)$/i.test(value)
|
|
329
343
|
if (type === 'type' && isImg) {
|
|
330
344
|
return <span />
|
|
331
345
|
}
|
|
332
346
|
if (type === 'value' && isImg) {
|
|
333
|
-
return <img {...reset} height="26" src={
|
|
347
|
+
return <img {...reset} height="26" src={value} />
|
|
334
348
|
}
|
|
335
349
|
}}
|
|
336
350
|
/>
|
|
@@ -362,7 +376,7 @@ export default function Demo() {
|
|
|
362
376
|
}
|
|
363
377
|
```
|
|
364
378
|
|
|
365
|
-
Supports certain partial customizations such as: `<Copied />`, `<CountInfo />`, `<CountInfoExtra />`, `<Ellipsis />`, `<KeyName />`
|
|
379
|
+
Supports certain partial customizations such as: `<Copied />`, `<CountInfo />`, `<CountInfoExtra />`, `<Ellipsis />`, `<KeyName />`, `<Row />`
|
|
366
380
|
|
|
367
381
|
```tsx mdx:preview
|
|
368
382
|
import React, { Fragment } from 'react';
|
|
@@ -415,6 +429,59 @@ export default function Demo() {
|
|
|
415
429
|
}
|
|
416
430
|
```
|
|
417
431
|
|
|
432
|
+
More in-depth customization ([#19](https://github.com/uiwjs/react-json-view/issues/19))
|
|
433
|
+
|
|
434
|
+
```tsx mdx:preview
|
|
435
|
+
import React from 'react';
|
|
436
|
+
import JsonView from '@uiw/react-json-view';
|
|
437
|
+
|
|
438
|
+
const object = {
|
|
439
|
+
_id: "ObjectId('13212hakjdhajksd')",
|
|
440
|
+
uid: "test1",
|
|
441
|
+
attival_time: new Date('Tue Sep 13 2022 14:07:44 GMT-0500 (Central Daylight Time)'),
|
|
442
|
+
__v: 0
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
export default function Demo() {
|
|
446
|
+
return (
|
|
447
|
+
<JsonView
|
|
448
|
+
value={object}
|
|
449
|
+
// keyName="root"
|
|
450
|
+
displayObjectSize={false}
|
|
451
|
+
style={{
|
|
452
|
+
'--w-rjv-background-color': '#ffffff',
|
|
453
|
+
}}
|
|
454
|
+
>
|
|
455
|
+
<JsonView.Quote render={() => <span />}/>
|
|
456
|
+
<JsonView.String
|
|
457
|
+
render={({ children, ...reset }, { type, value, keyName }) => {
|
|
458
|
+
if (type === 'type') {
|
|
459
|
+
return <span />
|
|
460
|
+
}
|
|
461
|
+
if (type === 'value' && /ObjectId\(['"](.*?)['"]\)/.test(value)) {
|
|
462
|
+
return <span {...reset}>{children}</span>
|
|
463
|
+
}
|
|
464
|
+
}}
|
|
465
|
+
/>
|
|
466
|
+
<JsonView.Date
|
|
467
|
+
render={({ children, ...reset }, { type, value, keyName }) => {
|
|
468
|
+
if (type === 'type') {
|
|
469
|
+
return <span />
|
|
470
|
+
}
|
|
471
|
+
}}
|
|
472
|
+
/>
|
|
473
|
+
<JsonView.Int
|
|
474
|
+
render={({ children, ...reset }, { type, value, keyName }) => {
|
|
475
|
+
if (type === 'type') {
|
|
476
|
+
return <span />
|
|
477
|
+
}
|
|
478
|
+
}}
|
|
479
|
+
/>
|
|
480
|
+
</JsonView>
|
|
481
|
+
)
|
|
482
|
+
}
|
|
483
|
+
```
|
|
484
|
+
|
|
418
485
|
Inspector
|
|
419
486
|
|
|
420
487
|
```tsx mdx:preview
|
|
@@ -526,6 +593,52 @@ Passing **as="tagName"** will automatically infer the type.
|
|
|
526
593
|
/>
|
|
527
594
|
```
|
|
528
595
|
|
|
596
|
+
Add a click event on the data row
|
|
597
|
+
|
|
598
|
+
```tsx mdx:preview
|
|
599
|
+
import React from 'react';
|
|
600
|
+
import JsonView from '@uiw/react-json-view';
|
|
601
|
+
|
|
602
|
+
export default function Demo() {
|
|
603
|
+
return (
|
|
604
|
+
<JsonView
|
|
605
|
+
style={{
|
|
606
|
+
'--w-rjv-background-color': '#ffffff',
|
|
607
|
+
}}
|
|
608
|
+
value={{
|
|
609
|
+
name: 'John',
|
|
610
|
+
age: 30,
|
|
611
|
+
hobbies: ['reading', 'coding', 'swimming'],
|
|
612
|
+
address: {
|
|
613
|
+
street: '123 Main St',
|
|
614
|
+
city: 'New York',
|
|
615
|
+
country: {
|
|
616
|
+
name: 'Main ',
|
|
617
|
+
codex: '123'
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
}}
|
|
621
|
+
>
|
|
622
|
+
<JsonView.Row
|
|
623
|
+
as="div"
|
|
624
|
+
render={(props, { keyName, value, parentValue }) => {
|
|
625
|
+
return (
|
|
626
|
+
<div
|
|
627
|
+
{...props}
|
|
628
|
+
onClick={() => {
|
|
629
|
+
console.log("keyName", keyName)
|
|
630
|
+
console.log("value", value)
|
|
631
|
+
console.log("parentValue", parentValue)
|
|
632
|
+
}}
|
|
633
|
+
/>
|
|
634
|
+
)
|
|
635
|
+
}}
|
|
636
|
+
/>
|
|
637
|
+
</JsonView>
|
|
638
|
+
)
|
|
639
|
+
}
|
|
640
|
+
```
|
|
641
|
+
|
|
529
642
|
## Highlight Updates
|
|
530
643
|
|
|
531
644
|
```tsx mdx:preview
|
|
@@ -568,6 +681,74 @@ export default function Demo() {
|
|
|
568
681
|
|
|
569
682
|
This feature can be disabled with `highlightUpdates={false}`, and the default color can be changed with `--w-rjv-update-color`.
|
|
570
683
|
|
|
684
|
+
## Do not display array index
|
|
685
|
+
|
|
686
|
+
```tsx mdx:preview
|
|
687
|
+
import React, { Fragment } from 'react';
|
|
688
|
+
import JsonView from '@uiw/react-json-view';
|
|
689
|
+
|
|
690
|
+
export default function Demo() {
|
|
691
|
+
const value = { data: ["123", 23] }
|
|
692
|
+
return (
|
|
693
|
+
<JsonView value={value} style={{ '--w-rjv-background-color': '#ffffff' }}>
|
|
694
|
+
<JsonView.Colon render={(props, { parentValue, value, keyName }) => {
|
|
695
|
+
if (Array.isArray(parentValue) && props.children == ":") {
|
|
696
|
+
return <span />
|
|
697
|
+
}
|
|
698
|
+
return <span {...props} />
|
|
699
|
+
}}/>
|
|
700
|
+
<JsonView.KeyName
|
|
701
|
+
render={({ ...props }, { type, parentValue, value, keyName }) => {
|
|
702
|
+
if (Array.isArray(parentValue) && Number.isFinite( props.children)) {
|
|
703
|
+
return <span />
|
|
704
|
+
}
|
|
705
|
+
return <span {...props} />
|
|
706
|
+
}}
|
|
707
|
+
/>
|
|
708
|
+
</JsonView>
|
|
709
|
+
)
|
|
710
|
+
}
|
|
711
|
+
```
|
|
712
|
+
|
|
713
|
+
## Default Collapse/Expand
|
|
714
|
+
|
|
715
|
+
```tsx mdx:preview
|
|
716
|
+
import React from 'react';
|
|
717
|
+
import JsonView from '@uiw/react-json-view';
|
|
718
|
+
const object = {
|
|
719
|
+
string: 'Lorem ipsum dolor sit amet',
|
|
720
|
+
integer: 42,
|
|
721
|
+
float: 114.514,
|
|
722
|
+
object: {
|
|
723
|
+
'first-child': true,
|
|
724
|
+
'second-child': false,
|
|
725
|
+
'last-child': null,
|
|
726
|
+
},
|
|
727
|
+
nestedArray: [
|
|
728
|
+
[1, 2],
|
|
729
|
+
[3, 4],
|
|
730
|
+
],
|
|
731
|
+
}
|
|
732
|
+
export default function Demo() {
|
|
733
|
+
return (
|
|
734
|
+
<JsonView
|
|
735
|
+
value={object}
|
|
736
|
+
collapsed={2}
|
|
737
|
+
shouldExpandNodeInitially={(isExpanded, { value, keys, level }) => {
|
|
738
|
+
if (keys.length > 0 && keys[0] == "object") {
|
|
739
|
+
return true
|
|
740
|
+
}
|
|
741
|
+
return isExpanded
|
|
742
|
+
}}
|
|
743
|
+
style={{
|
|
744
|
+
'--w-rjv-background-color': '#ffffff',
|
|
745
|
+
}}
|
|
746
|
+
>
|
|
747
|
+
</JsonView>
|
|
748
|
+
)
|
|
749
|
+
}
|
|
750
|
+
```
|
|
751
|
+
|
|
571
752
|
## Modify Icon Style
|
|
572
753
|
|
|
573
754
|
Use built-in default icons.
|
|
@@ -687,7 +868,7 @@ export interface JsonViewProps<T extends object> extends React.DetailedHTMLProps
|
|
|
687
868
|
/** Define the root node name. @default undefined */
|
|
688
869
|
keyName?: string | number;
|
|
689
870
|
/** Whether sort keys through `String.prototype.localeCompare()` @default false */
|
|
690
|
-
objectSortKeys?: boolean | ((
|
|
871
|
+
objectSortKeys?: boolean | ((keyA: string, keyB: string, valueA: T, valueB: T) => number);
|
|
691
872
|
/** Set the indent-width for nested objects @default 15 */
|
|
692
873
|
indentWidth?: number;
|
|
693
874
|
/** When set to `true`, `objects` and `arrays` are labeled with size @default true */
|
|
@@ -696,15 +877,19 @@ export interface JsonViewProps<T extends object> extends React.DetailedHTMLProps
|
|
|
696
877
|
displayDataTypes?: boolean;
|
|
697
878
|
/** The user can copy objects and arrays to clipboard by clicking on the clipboard icon. @default true */
|
|
698
879
|
enableClipboard?: boolean;
|
|
880
|
+
/** When set to true, all nodes will be collapsed by default. Use an integer value to collapse at a particular depth. @default false */
|
|
881
|
+
collapsed?: boolean | number;
|
|
882
|
+
/** Determine whether the node should be expanded on the first render, or you can use collapsed to control the level of expansion (by default, the root is expanded). */
|
|
883
|
+
shouldExpandNodeInitially?: (
|
|
884
|
+
isExpanded: boolean,
|
|
885
|
+
props: { value?: T; keys: (number | string)[]; level: number },
|
|
886
|
+
) => boolean;
|
|
699
887
|
/** Whether to highlight updates. @default true */
|
|
700
888
|
highlightUpdates?: boolean;
|
|
889
|
+
/** Shorten long JSON strings, Set to `0` to disable this feature @default 30 */
|
|
890
|
+
shortenTextAfterLength?: number;
|
|
701
891
|
/** Callback function for when a treeNode is expanded or collapsed */
|
|
702
|
-
onExpand?: (props: {
|
|
703
|
-
expand: boolean;
|
|
704
|
-
value?: T;
|
|
705
|
-
keyid: string;
|
|
706
|
-
keyName?: string | number;
|
|
707
|
-
}) => void;
|
|
892
|
+
onExpand?: (props: { expand: boolean; value?: T; keyid: string; keyName?: string | number }) => void;
|
|
708
893
|
/** Fires event when you copy */
|
|
709
894
|
onCopied?: (text: string, value?: T) => void;
|
|
710
895
|
}
|
|
@@ -719,6 +904,7 @@ import { Arrow } from './symbol/Arrow';
|
|
|
719
904
|
import { Colon } from './symbol/Colon';
|
|
720
905
|
import { Quote } from './symbol/Quote';
|
|
721
906
|
import { ValueQuote } from './symbol/ValueQuote';
|
|
907
|
+
|
|
722
908
|
import { Bigint } from './types/Bigint';
|
|
723
909
|
import { Date } from './types/Date';
|
|
724
910
|
import { False } from './types/False';
|
|
@@ -732,13 +918,24 @@ import { StringText } from './types/String';
|
|
|
732
918
|
import { True } from './types/True';
|
|
733
919
|
import { Undefined } from './types/Undefined';
|
|
734
920
|
import { Url } from './types/Url';
|
|
921
|
+
|
|
735
922
|
import { Copied } from './section/Copied';
|
|
736
923
|
import { CountInfo } from './section/CountInfo';
|
|
737
924
|
import { CountInfoExtra } from './section/CountInfoExtra';
|
|
738
925
|
import { Ellipsis } from './section/Ellipsis';
|
|
739
926
|
import { KeyName } from './section/KeyName';
|
|
927
|
+
import { Row } from './section/Row';
|
|
740
928
|
|
|
741
929
|
type JsonViewComponent = React.FC<React.PropsWithRef<JsonViewProps<object>>> & {
|
|
930
|
+
BraceLeft: typeof BraceLeft;
|
|
931
|
+
BraceRight: typeof BraceRight;
|
|
932
|
+
BracketsLeft: typeof BracketsLeft;
|
|
933
|
+
BracketsRight: typeof BracketsRight;
|
|
934
|
+
Arrow: typeof Arrow;
|
|
935
|
+
Colon: typeof Colon;
|
|
936
|
+
Quote: typeof Quote;
|
|
937
|
+
ValueQuote: typeof ValueQuote;
|
|
938
|
+
|
|
742
939
|
Bigint: typeof Bigint;
|
|
743
940
|
Date: typeof Date;
|
|
744
941
|
False: typeof False;
|
|
@@ -752,19 +949,13 @@ type JsonViewComponent = React.FC<React.PropsWithRef<JsonViewProps<object>>> & {
|
|
|
752
949
|
True: typeof True;
|
|
753
950
|
Undefined: typeof Undefined;
|
|
754
951
|
Url: typeof Url;
|
|
755
|
-
|
|
756
|
-
BraceRight: typeof BraceRight;
|
|
757
|
-
BracketsLeft: typeof BracketsLeft;
|
|
758
|
-
BracketsRight: typeof BracketsRight;
|
|
759
|
-
Colon: typeof Colon;
|
|
760
|
-
Ellipsis: typeof Ellipsis;
|
|
761
|
-
Quote: typeof Quote;
|
|
762
|
-
ValueQuote: typeof ValueQuote;
|
|
763
|
-
Arrow: typeof Arrow;
|
|
952
|
+
|
|
764
953
|
Copied: typeof Copied;
|
|
765
954
|
CountInfo: typeof CountInfo;
|
|
766
955
|
CountInfoExtra: typeof CountInfoExtra;
|
|
956
|
+
Ellipsis: typeof Ellipsis;
|
|
767
957
|
KeyName: typeof KeyName;
|
|
958
|
+
Row: typeof Row;
|
|
768
959
|
};
|
|
769
960
|
declare const JsonView: JsonViewComponent;
|
|
770
961
|
export default JsonView;
|
|
@@ -786,7 +977,7 @@ Here is the size benchmark (using [bundlephobia.com](https://bundlephobia.com))
|
|
|
786
977
|
| [react-domify](https://github.com/JedWatson/react-domify) | [](https://bundlephobia.com/result?p=react-domify) [](https://bundlephobia.com/result?p=react-domify) | [](https://bundlephobia.com/result?p=react-domify) | [](https://github.com/JedWatson/react-domify/commits) | [](https://www.npmjs.com/package/react-domify) | ❌ | [demo](https://jedwatson.github.io/react-domify/) |
|
|
787
978
|
| [react18-json-view](https://github.com/YYsuni/react18-json-view) | [](https://bundlephobia.com/result?p=react18-json-view) [](https://bundlephobia.com/result?p=react18-json-view) | [](https://bundlephobia.com/result?p=react18-json-view) | [](https://github.com/YYsuni/react18-json-view/commits) | [](https://www.npmjs.com/package/react18-json-view) | ❌ | [demo](https://jv.yysuni.com/) |
|
|
788
979
|
| [@textea/json-viewer](https://github.com/TexteaInc/json-viewer) | [](https://bundlephobia.com/result?p=@textea/json-viewer) [](https://bundlephobia.com/result?p=@textea/json-viewer) | [](https://bundlephobia.com/result?p=@textea/json-viewer) | [](https://github.com/TexteaInc/json-viewer/commits) | [](https://www.npmjs.com/package/@textea/json-viewer) | ✅ | [demo](https://stackblitz.com/edit/textea-json-viewer-v3-b4wgxq) |
|
|
789
|
-
| [react-editable-json-tree](https://github.com/oxyno-zeta/react-editable-json-tree) | [](https://bundlephobia.com/result?p=react-editable-json-tree) [](https://bundlephobia.com/result?p=react-editable-json-tree) | [](https://bundlephobia.com/result?p=react-editable-json-tree) | [ | [](https://bundlephobia.com/result?p=react-editable-json-tree) [](https://bundlephobia.com/result?p=react-editable-json-tree) | [](https://bundlephobia.com/result?p=react-editable-json-tree) | [](https://github.com/oxyno-zeta/react-editable-json-tree/commits) | [](https://www.npmjs.com/package/react-editable-json-tree) | ✅ | [demo](https://oxyno-zeta.github.io/react-editable-json-tree/) |
|
|
790
981
|
| [react-json-view](https://github.com/HuolalaTech/react-json-view) | [](https://bundlephobia.com/result?p=@huolala-tech/react-json-view) [](https://bundlephobia.com/result?p=@huolala-tech/react-json-view) | [](https://bundlephobia.com/result?p=@huolala-tech/react-json-view) | [](https://github.com/HuolalaTech/react-json-view/commits) | [](https://www.npmjs.com/package/@huolala-tech/react-json-view) | ❌ | [demo](https://huolalatech.github.io/react-json-view/) |
|
|
791
982
|
|
|
792
983
|
## Development
|
package/basic.d.ts
ADDED
package/cjs/Container.d.ts
CHANGED
|
@@ -6,5 +6,7 @@ export interface ContainerProps<T extends object> extends React.HTMLAttributes<H
|
|
|
6
6
|
level?: number;
|
|
7
7
|
value?: T;
|
|
8
8
|
initialValue?: T;
|
|
9
|
+
/** Index of the parent `keyName` */
|
|
10
|
+
keys?: (string | number)[];
|
|
9
11
|
}
|
|
10
12
|
export declare const Container: React.ForwardRefExoticComponent<ContainerProps<object> & React.RefAttributes<HTMLDivElement>>;
|
package/cjs/Container.js
CHANGED
|
@@ -13,10 +13,11 @@ var _react = _interopRequireWildcard(require("react"));
|
|
|
13
13
|
var _NestedClose = require("./comps/NestedClose");
|
|
14
14
|
var _NestedOpen = require("./comps/NestedOpen");
|
|
15
15
|
var _KeyValues = require("./comps/KeyValues");
|
|
16
|
+
var _useIdCompat = require("./comps/useIdCompat");
|
|
16
17
|
var _ShowTools = require("./store/ShowTools");
|
|
17
18
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
18
|
-
var _excluded = ["className", "children", "parentValue", "keyid", "level", "value", "initialValue", "keyName"];
|
|
19
|
-
var Container = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
19
|
+
var _excluded = ["className", "children", "parentValue", "keyid", "level", "value", "initialValue", "keys", "keyName"];
|
|
20
|
+
var Container = exports.Container = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
20
21
|
var _props$className = props.className,
|
|
21
22
|
className = _props$className === void 0 ? '' : _props$className,
|
|
22
23
|
children = props.children,
|
|
@@ -26,10 +27,11 @@ var Container = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
|
26
27
|
level = _props$level === void 0 ? 1 : _props$level,
|
|
27
28
|
value = props.value,
|
|
28
29
|
initialValue = props.initialValue,
|
|
30
|
+
keys = props.keys,
|
|
29
31
|
keyName = props.keyName,
|
|
30
32
|
elmProps = (0, _objectWithoutProperties2["default"])(props, _excluded);
|
|
31
33
|
var dispatch = (0, _ShowTools.useShowToolsDispatch)();
|
|
32
|
-
var subkeyid = (0,
|
|
34
|
+
var subkeyid = (0, _useIdCompat.useIdCompat)();
|
|
33
35
|
var defaultClassNames = [className, 'w-rjv-inner'].filter(Boolean).join(' ');
|
|
34
36
|
var reset = {
|
|
35
37
|
onMouseEnter: function onMouseEnter() {
|
|
@@ -47,18 +49,23 @@ var Container = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
|
47
49
|
expandKey: subkeyid,
|
|
48
50
|
value: value,
|
|
49
51
|
level: level,
|
|
52
|
+
keys: keys,
|
|
53
|
+
parentValue: parentValue,
|
|
50
54
|
keyName: keyName,
|
|
51
55
|
initialValue: initialValue
|
|
52
56
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_KeyValues.KeyValues, {
|
|
53
57
|
expandKey: subkeyid,
|
|
54
58
|
value: value,
|
|
55
|
-
level: level
|
|
59
|
+
level: level,
|
|
60
|
+
keys: keys,
|
|
61
|
+
parentValue: parentValue,
|
|
62
|
+
keyName: keyName
|
|
56
63
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_NestedClose.NestedClose, {
|
|
57
64
|
expandKey: subkeyid,
|
|
58
65
|
value: value,
|
|
59
|
-
level: level
|
|
66
|
+
level: level,
|
|
67
|
+
keys: keys
|
|
60
68
|
})]
|
|
61
69
|
}));
|
|
62
70
|
});
|
|
63
|
-
exports.Container = Container;
|
|
64
71
|
Container.displayName = 'JVR.Container';
|
|
@@ -18,7 +18,7 @@ function TriangleArrow(props) {
|
|
|
18
18
|
height: '1em',
|
|
19
19
|
width: '1em',
|
|
20
20
|
userSelect: 'none',
|
|
21
|
-
display: 'flex'
|
|
21
|
+
display: 'inline-flex'
|
|
22
22
|
}, style);
|
|
23
23
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)("svg", (0, _objectSpread2["default"])((0, _objectSpread2["default"])({
|
|
24
24
|
viewBox: "0 0 24 24",
|
package/cjs/comps/Copied.d.ts
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import { type SectionElementResult } from '../store/Section';
|
|
2
2
|
import { type TagType } from '../store/Types';
|
|
3
3
|
export type CopiedOption<T extends object> = {
|
|
4
4
|
value?: T;
|
|
5
5
|
copied: boolean;
|
|
6
6
|
setCopied: React.Dispatch<React.SetStateAction<boolean>>;
|
|
7
7
|
};
|
|
8
|
-
export interface CopiedProps<T extends object> extends React.SVGProps<SVGSVGElement> {
|
|
9
|
-
value?: T;
|
|
10
|
-
keyName: string | number;
|
|
8
|
+
export interface CopiedProps<T extends object> extends React.SVGProps<SVGSVGElement>, SectionElementResult<T> {
|
|
11
9
|
expandKey: string;
|
|
12
10
|
}
|
|
13
11
|
export declare const Copied: {
|
package/cjs/comps/Copied.js
CHANGED
|
@@ -10,15 +10,18 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
|
|
|
10
10
|
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
11
11
|
var _react = require("react");
|
|
12
12
|
var _store = require("../store");
|
|
13
|
-
var _ShowTools = require("../store/ShowTools");
|
|
14
13
|
var _Section = require("../store/Section");
|
|
14
|
+
var _ShowTools = require("../store/ShowTools");
|
|
15
|
+
var _types = require("../types");
|
|
15
16
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
16
|
-
var _excluded = ["keyName", "value", "expandKey"],
|
|
17
|
+
var _excluded = ["keyName", "value", "parentValue", "expandKey", "keys"],
|
|
17
18
|
_excluded2 = ["as", "render"];
|
|
18
|
-
var Copied = function Copied(props) {
|
|
19
|
+
var Copied = exports.Copied = function Copied(props) {
|
|
19
20
|
var keyName = props.keyName,
|
|
20
21
|
value = props.value,
|
|
22
|
+
parentValue = props.parentValue,
|
|
21
23
|
expandKey = props.expandKey,
|
|
24
|
+
keys = props.keys,
|
|
22
25
|
other = (0, _objectWithoutProperties2["default"])(props, _excluded);
|
|
23
26
|
var _useStore = (0, _store.useStore)(),
|
|
24
27
|
onCopied = _useStore.onCopied,
|
|
@@ -35,18 +38,42 @@ var Copied = function Copied(props) {
|
|
|
35
38
|
if (enableClipboard === false || !isShowTools) return null;
|
|
36
39
|
var click = function click(event) {
|
|
37
40
|
event.stopPropagation();
|
|
38
|
-
var copyText =
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
var copyText = '';
|
|
42
|
+
if (typeof value === 'number' && value === Infinity) {
|
|
43
|
+
copyText = 'Infinity';
|
|
44
|
+
} else if (typeof value === 'number' && isNaN(value)) {
|
|
45
|
+
copyText = 'NaN';
|
|
46
|
+
} else if (typeof value === 'bigint') {
|
|
47
|
+
copyText = (0, _types.bigIntToString)(value);
|
|
48
|
+
} else if (value instanceof Date) {
|
|
49
|
+
copyText = value.toLocaleString();
|
|
50
|
+
} else {
|
|
51
|
+
copyText = JSON.stringify(value, function (_, v) {
|
|
52
|
+
return typeof v === 'bigint' ? (0, _types.bigIntToString)(v) : v;
|
|
53
|
+
}, 2);
|
|
54
|
+
}
|
|
55
|
+
onCopied && onCopied(copyText, value);
|
|
56
|
+
setCopied(true);
|
|
57
|
+
var _clipboard = navigator.clipboard || {
|
|
58
|
+
writeText: function writeText(text) {
|
|
59
|
+
return new Promise(function (reslove, reject) {
|
|
60
|
+
var textarea = document.createElement('textarea');
|
|
61
|
+
textarea.style.position = 'absolute';
|
|
62
|
+
textarea.style.opacity = '0';
|
|
63
|
+
textarea.style.left = '-99999999px';
|
|
64
|
+
textarea.value = text;
|
|
65
|
+
document.body.appendChild(textarea);
|
|
66
|
+
textarea.select();
|
|
67
|
+
if (!document.execCommand('copy')) {
|
|
68
|
+
reject();
|
|
69
|
+
} else {
|
|
70
|
+
reslove();
|
|
71
|
+
}
|
|
72
|
+
textarea.remove();
|
|
73
|
+
});
|
|
41
74
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if (typeof value === 'number' && value === Infinity) copyText = 'Infinity';
|
|
45
|
-
if (typeof value === 'number' && isNaN(value)) copyText = 'NaN';
|
|
46
|
-
if (typeof value === 'bigint') copyText = value + 'n';
|
|
47
|
-
navigator.clipboard.writeText(copyText).then(function () {
|
|
48
|
-
onCopied && onCopied(copyText, value);
|
|
49
|
-
setCopied(true);
|
|
75
|
+
};
|
|
76
|
+
_clipboard.writeText(copyText).then(function () {
|
|
50
77
|
var timer = setTimeout(function () {
|
|
51
78
|
setCopied(false);
|
|
52
79
|
clearTimeout(timer);
|
|
@@ -54,19 +81,26 @@ var Copied = function Copied(props) {
|
|
|
54
81
|
})["catch"](function (error) {});
|
|
55
82
|
};
|
|
56
83
|
var svgProps = {
|
|
84
|
+
style: {
|
|
85
|
+
display: 'inline-flex'
|
|
86
|
+
},
|
|
57
87
|
fill: copied ? 'var(--w-rjv-copied-success-color, #28a745)' : 'var(--w-rjv-copied-color, currentColor)',
|
|
58
88
|
onClick: click
|
|
59
89
|
};
|
|
60
90
|
var as = Comp.as,
|
|
61
91
|
render = Comp.render,
|
|
62
92
|
reset = (0, _objectWithoutProperties2["default"])(Comp, _excluded2);
|
|
63
|
-
var elmProps = (0, _objectSpread2["default"])((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, reset), other), svgProps)
|
|
93
|
+
var elmProps = (0, _objectSpread2["default"])((0, _objectSpread2["default"])((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, reset), other), svgProps), {}, {
|
|
94
|
+
style: (0, _objectSpread2["default"])((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, reset.style), other.style), svgProps.style)
|
|
95
|
+
});
|
|
64
96
|
var isRender = render && typeof render === 'function';
|
|
65
97
|
var child = isRender && render((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, elmProps), {}, {
|
|
66
98
|
'data-copied': copied
|
|
67
99
|
}), {
|
|
68
100
|
value: value,
|
|
69
|
-
keyName: keyName
|
|
101
|
+
keyName: keyName,
|
|
102
|
+
keys: keys,
|
|
103
|
+
parentValue: parentValue
|
|
70
104
|
});
|
|
71
105
|
if (child) return child;
|
|
72
106
|
if (copied) {
|
|
@@ -86,5 +120,4 @@ var Copied = function Copied(props) {
|
|
|
86
120
|
})
|
|
87
121
|
}));
|
|
88
122
|
};
|
|
89
|
-
exports.Copied = Copied;
|
|
90
123
|
Copied.displayName = 'JVR.Copied';
|
package/cjs/comps/KeyValues.d.ts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
value?: T;
|
|
4
|
-
parentValue?: T;
|
|
1
|
+
import { type SectionElementResult } from '../store/Section';
|
|
2
|
+
interface KeyValuesProps<T extends object> extends SectionElementResult<T> {
|
|
5
3
|
expandKey?: string;
|
|
6
4
|
level: number;
|
|
7
5
|
}
|