@@ -138,6 +138,17 @@ const graphNodesTotalMap = new Map<string, GraphNodesTotalData>()
138138const modulesMap = new Map < string , GraphNodesTotalData > ( )
139139const 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+
141152export 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
216227function 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
0 commit comments