Skip to content

Commit a7513ca

Browse files
fix(client): deduplicated and set recursive max depth for graph nodes (#108)
1 parent c5a45fa commit a7513ca

File tree

2 files changed

+32
-7
lines changed

2 files changed

+32
-7
lines changed

packages/client/src/composables/graph.ts

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,17 @@ const graphNodesTotalMap = new Map<string, GraphNodesTotalData>()
138138
const modulesMap = new Map<string, GraphNodesTotalData>()
139139
const moduleReferences = new Map<string, { path: string, displayPath: string, mod: ModuleInfo }[]>()
140140

141+
const uniqueNodes = (nodes: Node[]) => nodes.reduce<Node[]>((prev, node) => {
142+
if (!prev.some(n => n.id === node.id))
143+
prev.push(node)
144+
return prev
145+
}, [])
146+
const uniqueEdges = (edges: Edge[]) => edges.reduce<Edge[]>((prev, edge) => {
147+
if (!prev.some(e => e.from === edge.from && e.to === edge.to))
148+
prev.push(edge)
149+
return prev
150+
}, [])
151+
141152
export function cleanupGraphRelatedStates() {
142153
graphNodesTotal.value = []
143154
graphNodesTotalMap.clear()
@@ -209,8 +220,8 @@ function updateGraph() {
209220
}
210221
}
211222

212-
graphNodes.add(matchedNodes)
213-
graphEdges.add(matchedEdges)
223+
graphNodes.add(uniqueNodes(matchedNodes))
224+
graphEdges.add(uniqueEdges(matchedEdges))
214225
}
215226

216227
function recursivelyGetNodeByDep(node: SearcherNode[]) {
@@ -314,6 +325,8 @@ export function parseGraphRawData(modules: ModuleInfo[], root: string) {
314325
edges.push(getEdge(mod.id, dep))
315326
})
316327
const incrementalDeps = uniqueDeps.filter(dep => !nodeData.mod.deps.includes(dep))
328+
if (!incrementalDeps.length)
329+
return
317330
nodeData.mod.deps.push(...incrementalDeps)
318331
totalEdges.push(...edges)
319332
return
@@ -367,8 +380,9 @@ export function parseGraphRawData(modules: ModuleInfo[], root: string) {
367380
}
368381
})
369382
// set initial data
383+
// nodes has been unique in `modules.forEach`
370384
graphNodes.add(totalNode.slice())
371-
graphEdges.add(totalEdges.slice())
385+
graphEdges.add(uniqueEdges(totalEdges))
372386
}
373387
// #endregion
374388

@@ -449,17 +463,23 @@ export function getGraphFilterDataset() {
449463
return dataset
450464
}
451465

452-
function recursivelyGetGraphNodeData(nodeId: string): GraphNodesTotalData[] {
466+
// max depth is 20
467+
function recursivelyGetGraphNodeData(nodeId: string, depth = 0): GraphNodesTotalData[] {
453468
const node = modulesMap.get(nodeId)
454-
if (!node)
469+
depth += 1
470+
if (!node || depth > 20)
455471
return []
456472
const result = [node]
457473
node.mod.deps.forEach((dep) => {
458474
const node = modulesMap.get(dep)
459475
if (node)
460-
result.push(...recursivelyGetGraphNodeData(node.mod.id))
476+
result.push(...recursivelyGetGraphNodeData(node.mod.id, depth))
461477
})
462478
// unique result
463-
return Array.from(new Set(result))
479+
return result.reduce<GraphNodesTotalData[]>((prev, node) => {
480+
if (!prev.some(n => n.mod.id === node.mod.id))
481+
prev.push(node)
482+
return prev
483+
}, [])
464484
}
465485
// #endregion

packages/client/src/pages/graph.vue

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ function mountNetwork() {
3131
network.on('deselectNode', () => {
3232
toggleGraphDrawer(false)
3333
})
34+
35+
watch(() => graphFilterNodeId.value, (id) => {
36+
if (id)
37+
network.moveTo({ position: { x: 0, y: 0 } })
38+
})
3439
}
3540
3641
onMounted(() => {

0 commit comments

Comments
 (0)