@@ -657,125 +657,107 @@ export default class Package {
657657
658658 outdatedDependencies ||= { } ;
659659
660- // add missed / linked deps
661- {
662- const linkedDependencies = await this . #getLinkedDependencies( ) ;
663-
664- for ( const dependency of linkedDependencies . values ( ) ) {
665- if ( ! outdatedDependencies [ dependency . name ] ) {
666- outdatedDependencies [ dependency . name ] = [ ] ;
667- }
668- else if ( ! Array . isArray ( outdatedDependencies [ dependency . name ] ) ) {
669- outdatedDependencies [ dependency . name ] = [ outdatedDependencies [ dependency . name ] ] ;
670- }
671-
672- if ( dependency . missed || ( linked && dependency . link ) ) {
673- outdatedDependencies [ dependency . name ] . push ( {
674-
675- // XXX location
676- "location" : "-" ,
677- "missed" : dependency . missed ,
678- "linked" : dependency . link ,
679- } ) ;
680- }
681- }
682- }
683-
684- var hasUpdates ;
685-
686- const updateDependencies = [ ] ;
660+ const linkedDependencies = await this . #getLinkedDependencies( ) ,
661+ index = { } ;
687662
663+ // index dependencies
688664 for ( const name in outdatedDependencies ) {
689- let specs ;
665+ let dependencies ;
690666
691667 if ( Array . isArray ( outdatedDependencies [ name ] ) ) {
692- specs = outdatedDependencies [ name ] ;
668+ dependencies = outdatedDependencies [ name ] ;
693669 }
694670 else {
695- specs = [ outdatedDependencies [ name ] ] ;
671+ dependencies = [ outdatedDependencies [ name ] ] ;
696672 }
697673
698- const index = { } ;
699-
700- for ( const spec of specs ) {
674+ for ( const dependency of dependencies ) {
701675
702- // group specs by id
703- const id = spec . location ;
676+ // group by id
677+ const id = dependency . location ;
704678
705679 index [ id ] ??= {
706680 name,
707- "current" : spec . current ,
708- "wanted" : spec . wanted ,
709- "latest" : spec . latest ,
710- "location" : spec . location ,
681+ "current" : dependency . current ,
682+ "wanted" : dependency . wanted ,
683+ "latest" : dependency . latest ,
684+ "location" : dependency . location ,
711685 "dependent" : new Set ( ) ,
712- "missed" : spec . missed ,
713- "linked" : spec . linked ,
714- "topLevel" : this . dependencies . has ( name ) && spec . location === path . join ( this . root , "node_modules" , name ) ,
686+ "topLevel" : this . dependencies . has ( name ) && dependency . location === path . join ( this . root , "node_modules" , name ) ,
715687 } ;
716688
717- index [ id ] . dependent . add ( spec . dependent ) ;
689+ index [ id ] . dependent . add ( dependency . dependent ) ;
690+
691+ const linkedDependency = linkedDependencies . get ( name ) ;
692+ if ( linkedDependency && linkedDependency . location === dependency . location ) {
693+ index [ id ] . missed = linkedDependency . missed ;
694+ index [ id ] . linked = linkedDependency . linked ;
695+ }
718696 }
697+ }
719698
720- specs = Object . values ( index ) . map ( spec => {
721- spec . dependent = [ ...spec . dependent ] . sort ( ) . join ( ", " ) ;
699+ // add missed deps
700+ for ( const dependency of linkedDependencies . values ( ) ) {
701+ if ( ! dependency . missed ) continue ;
722702
723- return spec ;
724- } ) ;
703+ if ( ! index [ dependency . location ] ) {
704+ index [ dependency . location ] = dependency ;
705+ }
706+ }
725707
726- for ( const spec of specs ) {
708+ var hasUpdates ;
727709
728- // outdated dependency
729- spec . outdated = spec . wanted !== spec . latest && new SemanticVersion ( spec . latest ) . gt ( spec . wanted ) ;
710+ const updateDependencies = [ ] ;
730711
731- // include installed, updatable deps by default
732- let include ;
712+ for ( const dependency of Object . values ( index ) ) {
733713
734- // linked
735- if ( spec . linked ) {
714+ // outdated dependency
715+ dependency . outdated = dependency . wanted !== dependency . latest && new SemanticVersion ( dependency . latest ) . gt ( dependency . wanted ) ;
736716
737- // XXX
738- if ( linked ) {
739- spec . updatable = true ;
717+ // include installed, updatable deps by default
718+ let include ;
740719
741- include = true ;
742- }
743- }
744- else {
745- spec . updatable = spec . current !== spec . wanted ;
720+ // linked
721+ if ( dependency . linked ) {
746722
747- if ( spec . updatable && spec . current ) {
748- include = true ;
749- }
750- }
723+ // XXX
724+ if ( linked ) {
725+ dependency . updatable = true ;
751726
752- // include top-level outdated deps
753- if ( outdated && spec . outdated && spec . topLevel ) {
754727 include = true ;
755728 }
729+ }
730+ else {
731+ dependency . updatable = dependency . current !== dependency . wanted ;
756732
757- // include linked deps
758- if ( spec . linked ) {
733+ if ( dependency . updatable && dependency . current ) {
759734 include = true ;
760735 }
736+ }
761737
762- // include missed deps
763- if ( spec . missed ) {
764- include = true ;
765- }
738+ // include top-level outdated deps
739+ if ( outdated && dependency . outdated && dependency . topLevel ) {
740+ include = true ;
741+ }
766742
767- if ( ! include ) continue ;
743+ // include linked deps
744+ if ( dependency . linked ) {
745+ include = true ;
746+ }
768747
769- // updatable dependency
770- if ( spec . updatable ) {
771- hasUpdates = true ;
772- }
748+ // include missed deps
749+ if ( dependency . missed ) {
750+ include = true ;
751+ }
773752
774- updateDependencies . push ( {
775- name,
776- ...spec ,
777- } ) ;
753+ if ( ! include ) continue ;
754+
755+ // updatable dependency
756+ if ( dependency . updatable ) {
757+ hasUpdates = true ;
778758 }
759+
760+ updateDependencies . push ( dependency ) ;
779761 }
780762
781763 install = install && ( hasUpdates || reinstall ) ;
@@ -798,6 +780,14 @@ export default class Package {
798780 "title" : ansi . hl ( "DEPENDENCY" ) ,
799781 "headerAlign" : "center" ,
800782 "headerValign" : "end" ,
783+ format ( value ) {
784+ if ( value ) {
785+ return [ ...value ] . sort ( ) . join ( ", " ) ;
786+ }
787+ else {
788+ return "-" ;
789+ }
790+ } ,
801791 } ,
802792 "dependent" : {
803793 "title" : ansi . hl ( "DEPENDENT" ) ,
@@ -1554,26 +1544,33 @@ export default class Package {
15541544
15551545 return fs . promises
15561546 . readlink ( location )
1557- . then ( link =>
1547+ . then ( link => {
1548+
1549+ // linked
15581550 dependencies . set ( name , {
15591551 name,
15601552 location,
1561- link,
1562- } ) )
1553+ "linked" : link ,
1554+ } ) ;
1555+ } )
15631556 . catch ( e => {
15641557
1565- // not exists
1566- if ( e . code === "ENOENT" ) {
1567- dependencies . set ( name , {
1568- name,
1569- location,
1570- "missed" : true ,
1571- } ) ;
1572- }
1573-
1574- // other error
1575- else if ( e . code !== "EINVAL" ) {
1576- console . log ( e ) ;
1558+ // not a link
1559+ if ( e . code !== "EINVAL" ) {
1560+
1561+ // missed
1562+ if ( e . code === "ENOENT" ) {
1563+ dependencies . set ( name , {
1564+ name,
1565+ location,
1566+ "missed" : true ,
1567+ } ) ;
1568+ }
1569+
1570+ // error
1571+ else {
1572+ console . log ( e ) ;
1573+ }
15771574 }
15781575 } ) ;
15791576 } ) ) ;
0 commit comments