@@ -20,11 +20,14 @@ function readInstalled (args, cb) {
20
20
packages = packages . filter ( function ( dir ) {
21
21
return ( showAll || args . indexOf ( dir ) !== - 1 ) && dir . charAt ( 0 ) !== "."
22
22
} )
23
- asyncMap ( packages , function ( package , cb ) {
24
- data [ package ] = data [ package ] || { }
25
- var packageDir = path . join ( npm . dir , package )
26
- , active = path . join ( packageDir , "active" )
23
+ var pkgDirs = { }
24
+ packages . forEach ( function ( p ) {
25
+ pkgDirs [ p ] = path . join ( npm . dir , p )
26
+ data [ p ] = { }
27
+ } )
27
28
29
+ asyncMap ( packages , function ( package , cb ) {
30
+ var active = path . join ( pkgDirs [ package ] , "active" )
28
31
fs . lstat ( active , function ( er , s ) {
29
32
if ( er || ! s . isSymbolicLink ( ) ) return cb ( )
30
33
fs . readlink ( active , function ( er , p ) {
@@ -35,18 +38,22 @@ function readInstalled (args, cb) {
35
38
return cb ( )
36
39
} )
37
40
} )
38
-
39
- fs . readdir ( packageDir , function ( er , versions ) {
40
- if ( er ) return cb ( ) // skip over non-dirs or missing things.
41
+ } , function ( package , cb ) {
42
+ fs . readdir ( pkgDirs [ package ] , function ( er , versions ) {
43
+ if ( er ) {
44
+ delete data [ package ]
45
+ return cb ( ) // skip over non-dirs or missing things.
46
+ }
41
47
asyncMap ( versions , function ( version , cb ) {
42
- if ( ! version ) return cb ( )
43
48
if ( semver . valid ( version ) ) {
44
49
data [ package ] [ version ] = data [ package ] [ version ] || { }
45
50
}
51
+ cb ( )
46
52
} , cb )
47
53
} )
48
-
49
- // just return the data object we've created.
50
- } , function ( er ) { cb ( er , data ) } )
54
+ } , function ( er ) {
55
+ // just return the data object we've created.
56
+ cb ( er , data )
57
+ } )
51
58
} )
52
59
}
0 commit comments