Skip to content

Commit 2571374

Browse files
committed
fix DiffValue, refactor recomputeTree
1 parent b23711b commit 2571374

File tree

7 files changed

+48
-63
lines changed

7 files changed

+48
-63
lines changed

.changeset/crazy-gifts-wonder.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte-tree-view': minor
3+
---
4+
5+
make treeNode required, update site to use new API

packages/site/src/components/DiffValue.svelte

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import type { NodeProps } from 'svelte-tree-view'
55
66
let props: NodeProps = $props()
7-
7+
let value = $derived(props.node.getValue())
88
const {
99
propsStore: { formatValue }
1010
} = props.getTreeContext()
@@ -40,7 +40,7 @@
4040
</script>
4141

4242
<DefaultNode {...props}>
43-
{#snippet value(node)}
43+
{#snippet valueSnippet(node)}
4444
{#if Array.isArray(value)}
4545
<!-- The why https://github.com/benjamine/jsondiffpatch/blob/master/docs/deltas.md -->
4646
{#if value.length === 1}

packages/site/src/lib/parser.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,14 @@ export const parseRecursionOpts = (
1313
): Record<string, unknown> | undefined => {
1414
try {
1515
const parsed = new Function(`return ${str}`)()
16-
console.log('parsed', parsed)
1716
if (parsed && typeof parsed === 'object') {
1817
parsed.isCircularNode(testNode, new Map())
1918
parsed.shouldExpandNode(testNode)
2019
parsed.mapChildren([], 'array', testNode)
2120
return parsed
2221
}
2322
} catch (e) {
24-
console.log('e', e)
23+
console.log(e)
2524
}
2625
return undefined
2726
}
@@ -37,7 +36,7 @@ export const parseValueFormatter = (
3736
return parsed
3837
}
3938
} catch (e) {
40-
console.log('e', e)
39+
console.log(e)
4140
}
4241
return undefined
4342
}

packages/svelte-tree-view/src/lib/DefaultNode.svelte

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
import type { NodeProps, TreeNode } from './types'
44
55
type DefaultNodeProps = NodeProps & {
6-
key?: Snippet<[TreeNode]>
7-
value?: Snippet<[TreeNode]>
6+
keySnippet?: Snippet<[TreeNode]>
7+
valueSnippet?: Snippet<[TreeNode]>
88
}
99
1010
let {
1111
node,
12-
key,
13-
value,
12+
keySnippet,
13+
valueSnippet,
1414
TreeViewNode,
1515
getTreeContext,
1616
handleLogNode,
@@ -38,8 +38,8 @@
3838
onclick={handleToggleCollapse}
3939
role="presentation"
4040
>
41-
{#if key}
42-
{@render key(node)}
41+
{#if keySnippet}
42+
{@render keySnippet(node)}
4343
{:else}
4444
{node.key}:
4545
{/if}
@@ -52,8 +52,8 @@
5252
onclick={handleToggleCollapse}
5353
role="presentation"
5454
>
55-
{#if value}
56-
{@render value(node)}
55+
{#if valueSnippet}
56+
{@render valueSnippet(node)}
5757
{:else}
5858
{valueStr}
5959
{/if}

packages/svelte-tree-view/src/lib/TreeView.svelte

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
const rootElementStore = createRootElementStore()
4343
const treeStore = createTreeStore(propsStore)
4444
const newRecOpts = $derived({ ...DEFAULT_RECURSION_OPTS, ...recursionOpts })
45-
const treeChildren = $derived(treeStore.treeMap['[]']?.children)
45+
const treeChildren = $derived(treeStore.rootNode.children)
4646
4747
setContext<Stores>('svelte-tree-view', {
4848
propsStore,
@@ -77,7 +77,7 @@
7777
const shouldRecompute = oldRecOptions?.shouldExpandNode !== opts.shouldExpandNode
7878
// Use untrack to prevent triggering this effect again
7979
untrack(() => {
80-
treeStore.update(newData, opts, shouldRecompute)
80+
treeStore.recompute(newData, opts, shouldRecompute)
8181
propsStore.setProps(propsObj)
8282
propsObj.recursionOpts = opts
8383
})

packages/svelte-tree-view/src/lib/stores/tree.svelte.ts

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,49 @@
1-
import { get, writable } from 'svelte/store'
1+
import { get } from 'svelte/store'
22

3-
import { createNode, recomputeTree, recurseObjectProperties } from '../tree-utils.svelte'
3+
import { createNode, recurseObjectProperties } from '../tree-utils.svelte'
44
import type { TreeNode, TreeRecursionOpts } from '../types'
55
import type { PropsStore } from './props'
66

77
export type TreeStore = ReturnType<typeof createTreeStore>
88

99
export const createTreeStore = (propsStore: PropsStore) => {
10-
const [defaultRootNode] = createNode(0, 'root', [], 0, null, {})
11-
const tree = writable<TreeNode>(defaultRootNode)
12-
const treeMap = $state<Record<string, TreeNode>>({})
13-
const iteratedValues = writable<Map<any, TreeNode>>(new Map())
10+
const [defaultRootNode] = createNode(-1, 'root', [], 0, null, {})
11+
const treeMap = $state<Record<string, TreeNode>>({
12+
[defaultRootNode.id]: defaultRootNode
13+
})
14+
const rootNode = $derived(treeMap[defaultRootNode.id])
15+
const iteratedValues = new Map<any, TreeNode>()
1416

1517
return {
16-
tree,
1718
treeMap,
18-
defaultRootNode,
19+
rootNode,
1920

20-
update(data: unknown, recursionOpts: TreeRecursionOpts<any>, recomputeExpandNode: boolean) {
21-
const recomputed = recomputeTree(data, treeMap, recursionOpts, recomputeExpandNode)
22-
if (recomputed.tree) {
23-
tree.set(recomputed.tree)
24-
} else {
25-
tree.set(defaultRootNode)
21+
recompute(data: unknown, recursionOpts: TreeRecursionOpts<any>, recomputeExpandNode: boolean) {
22+
const oldIds = new Set(Object.keys(treeMap))
23+
iteratedValues.clear()
24+
recurseObjectProperties(
25+
defaultRootNode.index,
26+
defaultRootNode.key,
27+
data,
28+
defaultRootNode.depth,
29+
true,
30+
null,
31+
treeMap,
32+
oldIds,
33+
iteratedValues,
34+
recomputeExpandNode,
35+
recursionOpts
36+
)
37+
for (const id of oldIds) {
38+
delete treeMap[id]
2639
}
27-
iteratedValues.set(recomputed.iteratedValues)
2840
get(propsStore.props).onUpdate?.(treeMap)
2941
},
3042

3143
toggleCollapse(id: string) {
3244
const node = treeMap[id]
3345
if (!node) {
34-
console.warn(`Attempted to collapse non-existent node: ${id}`)
35-
return
46+
return console.warn(`Attempted to collapse non-existent node: ${id}`)
3647
}
3748
node.collapsed = !node.collapsed
3849
const recursionOpts = get(propsStore.recursionOpts)
@@ -50,7 +61,6 @@ export const createTreeStore = (propsStore: PropsStore) => {
5061
// Only root node has no parent and it should not be expandable
5162
throw Error('No parent in expandNodeChildren for node: ' + node)
5263
}
53-
const previouslyIterated = get(iteratedValues)
5464
const nodeWithUpdatedChildren = recurseObjectProperties(
5565
node.index,
5666
node.key,
@@ -60,14 +70,13 @@ export const createTreeStore = (propsStore: PropsStore) => {
6070
parent,
6171
treeMap,
6272
new Set(),
63-
previouslyIterated,
73+
iteratedValues,
6474
false, // Never recompute shouldExpandNode since it may override the collapsing of this node
6575
recursionOpts
6676
)
6777
if (!nodeWithUpdatedChildren) return
6878
treeMap[nodeWithUpdatedChildren.id] = nodeWithUpdatedChildren
6979
treeMap[parent.id] = parent
70-
iteratedValues.set(previouslyIterated)
7180
get(propsStore.props).onUpdate?.(treeMap)
7281
},
7382

packages/svelte-tree-view/src/lib/tree-utils.svelte.ts

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ export function createNode(
1616
oldNode.getValue = () => value
1717
oldNode.depth = depth
1818
oldNode.type = getValueType(value)
19-
oldNode.circularOfId = null
2019
oldNode.children = []
2120
return [oldNode, oldNode]
2221
}
@@ -198,30 +197,3 @@ export function recurseObjectProperties(
198197

199198
return node
200199
}
201-
202-
export function recomputeTree(
203-
data: unknown,
204-
oldTreeMap: Record<string, TreeNode>,
205-
recursionOpts: TreeRecursionOpts,
206-
recomputeExpandNode: boolean
207-
) {
208-
const oldIds = new Set(Object.keys(oldTreeMap))
209-
const iteratedValues = new Map<any, TreeNode>()
210-
const newTree = recurseObjectProperties(
211-
-1,
212-
'root',
213-
data,
214-
0,
215-
true,
216-
null,
217-
oldTreeMap,
218-
oldIds,
219-
iteratedValues,
220-
recomputeExpandNode,
221-
recursionOpts
222-
)
223-
for (const id of oldIds) {
224-
delete oldTreeMap[id]
225-
}
226-
return { tree: newTree, iteratedValues }
227-
}

0 commit comments

Comments
 (0)