Skip to content

Commit ca5ba21

Browse files
committed
feat: Add shouldTreatIterableAsObject to treat iterable as plain object
1 parent 401b579 commit ca5ba21

File tree

6 files changed

+18
-6
lines changed

6 files changed

+18
-6
lines changed

.changeset/strong-readers-pay.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte-json-tree': minor
3+
---
4+
5+
Add `shouldTreatIterableAsObject` to treat iterable as plain object

src/lib/svelte-json-tree/SvelteJsonTree/JSONNode.svelte

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@
1212
import JsonSvelteStoreNode from './JSONSvelteStoreNode.svelte';
1313
import TypedArrayNode from './TypedArrayNode.svelte';
1414
import RegExpNode from './RegExpNode.svelte';
15+
import { useState } from './utils/context';
1516
1617
export let value: unknown;
1718
const nodeType = writable<string>();
18-
$: $nodeType = objType(value);
19+
const { shouldTreatIterableAsObject } = useState();
20+
21+
$: $nodeType = objType(value, shouldTreatIterableAsObject);
1922
$: [componentType, props] = getComponentAndProps($nodeType, value);
2023
2124
function getComponentAndProps(nodeType: string, value: any) {
@@ -70,7 +73,7 @@
7073
case 'RegExp':
7174
return [RegExpNode];
7275
default:
73-
return [JSONValueNode, { nodeType, value: `<${nodeType}>` }];
76+
return [JSONObjectNode, { summary: nodeType }];
7477
}
7578
}
7679
</script>

src/lib/svelte-json-tree/SvelteJsonTree/JSONObjectNode.svelte

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,16 @@
44
import PreviewList from './PreviewList.svelte';
55
66
export let value: Record<string, unknown>;
7+
export let summary: string | undefined;
78
89
$: keys = Object.getOwnPropertyNames(value);
910
$: previewKeys = keys.slice(0, 5);
1011
</script>
1112

1213
<JSONNested {keys}>
13-
<svelte:fragment slot="summary"><span class="label">{'{…}'}</span></svelte:fragment>
14+
<svelte:fragment slot="summary"><span class="label">{summary ?? '{…}'}</span></svelte:fragment>
1415
<svelte:fragment slot="preview" let:root>
15-
<PreviewList list={previewKeys} hasMore={previewKeys.length < keys.length} prefix={'{'} postfix={'}'} {root}>
16+
<PreviewList list={previewKeys} hasMore={previewKeys.length < keys.length} prefix={summary ? `${summary} {` : '{'} postfix={'}'} {root}>
1617
<svelte:fragment slot="item" let:item
1718
><span class="property">{item}</span><span class="operator">{': '}</span><JSONNode value={value[item]} /></svelte:fragment
1819
>

src/lib/svelte-json-tree/SvelteJsonTree/Root.svelte

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
88
export let value: unknown;
99
export let shouldShowPreview: boolean = true;
10+
export let shouldTreatIterableAsObject: boolean = false;
1011
export let defaultExpandedPaths: string[] = [];
1112
export let defaultExpandedLevel: number = 0;
1213
@@ -21,6 +22,7 @@
2122
level: 0,
2223
keyPath: [],
2324
showPreview: shouldShowPreview,
25+
shouldTreatIterableAsObject,
2426
});
2527
</script>
2628

src/lib/svelte-json-tree/SvelteJsonTree/utils/context.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export type State = {
1212
keyPath: string[],
1313
level: number,
1414
showPreview: boolean;
15+
shouldTreatIterableAsObject: boolean;
1516
};
1617

1718
export function useState(newState?: Partial<State> | ((state: State) => Partial<State>), opts?: { expandable?: boolean }): State {

src/lib/svelte-json-tree/SvelteJsonTree/utils/objType.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
export default function objType(obj: unknown): string {
1+
export default function objType(obj: unknown, shouldTreatIterableAsObject: boolean): string {
22
const type = Object.prototype.toString.call(obj).slice(8, -1);
33
if (type === 'Object') {
4-
if (typeof obj[Symbol.iterator] === 'function') {
4+
if (!shouldTreatIterableAsObject && typeof obj[Symbol.iterator] === 'function') {
55
return 'Iterable';
66
}
77
return obj.constructor.name;

0 commit comments

Comments
 (0)