@@ -46,6 +46,7 @@ export default class Package {
4646 #localization;
4747 #rootSlug;
4848 #parentSlug;
49+ #dependencies;
4950
5051 constructor ( root , { rootPackage, parentPackage } = { } ) {
5152 this . #root = root ;
@@ -318,8 +319,21 @@ export default class Package {
318319 return fs . existsSync ( this . root + "/npm-shrinkwrap.json" ) ;
319320 }
320321
322+ get dependencies ( ) {
323+ if ( ! this . #dependencies ) {
324+ this . #dependencies = new Map ( Object . entries ( {
325+ ...this . config . dependencies ,
326+ ...this . config . devDependencies ,
327+ ...this . config . peerDependencies ,
328+ ...this . config . optionalDependencies ,
329+ } ) ) ;
330+ }
331+
332+ return this . #dependencies;
333+ }
334+
321335 get hasDependencies ( ) {
322- return Object . keys ( this . config . dependencies || { } ) . length || Object . keys ( this . config . devDependencies || { } ) . length || Object . keys ( this . config . peerDependencies || { } ) . length || Object . keys ( this . config . optionalDependencies || { } ) . length ;
336+ return Boolean ( this . dependencies . size ) ;
323337 }
324338
325339 // public
@@ -425,45 +439,38 @@ export default class Package {
425439 }
426440
427441 hasPreReleaseDependencies ( ) {
428- const config = this . config ;
429-
430- for ( const name of [ "dependencies" , "devDependencies" , "peerDependencies" , "optionalDependencies" ] ) {
431- if ( ! config [ name ] ) continue ;
442+ for ( const [ name , version ] of this . dependencies . entries ( ) ) {
432443
433- for ( const dependencyName in config [ name ] ) {
434- const version = config [ name ] [ dependencyName ] ;
435-
436- // process known tags
437- if ( version === "latest" ) {
438- continue ;
439- }
440- else if ( version === "next" ) {
441- return result ( [ 500 , `Package "${ this . name } " has pre-release dependency "${ dependencyName } @${ version } "` ] ) ;
442- }
444+ // process known tags
445+ if ( version === "latest" ) {
446+ continue ;
447+ }
448+ else if ( version === "next" ) {
449+ return result ( [ 500 , `Package "${ this . name } " has pre-release dependency "${ name } @${ version } "` ] ) ;
450+ }
443451
444- let dependencyRange ;
452+ let dependencyRange ;
445453
446- // detect git url
447- const match = version . match ( / # s e m v e r : ( .+ ) $ / ) ;
454+ // detect git url
455+ const match = version . match ( / # s e m v e r : ( .+ ) $ / ) ;
448456
449- if ( match ) {
450- dependencyRange = match [ 1 ] ;
451- }
452- else {
453- dependencyRange = version ;
454- }
457+ if ( match ) {
458+ dependencyRange = match [ 1 ] ;
459+ }
460+ else {
461+ dependencyRange = version ;
462+ }
455463
456- dependencyRange = new SemanticVersionRange ( dependencyRange ) ;
464+ dependencyRange = new SemanticVersionRange ( dependencyRange ) ;
457465
458- try {
459- if ( dependencyRange . isPreRelease ) {
460- return result ( [ 500 , `Package "${ this . name } " has pre-release dependency "${ dependencyName } @${ version } "` ] ) ;
461- }
462- }
463- catch {
464- return result ( [ 500 , `Unable to parse dependency version "${ dependencyName } @ ${ version } "` ] ) ;
466+ try {
467+ if ( dependencyRange . isPreRelease ) {
468+ return result ( [ 500 , `Package "${ this . name } " has pre-release dependency "${ name } @${ version } "` ] ) ;
465469 }
466470 }
471+ catch {
472+ return result ( [ 500 , `Unable to parse dependency version "${ name } @ ${ version } "` ] ) ;
473+ }
467474 }
468475
469476 return result ( 200 ) ;
@@ -694,7 +701,9 @@ export default class Package {
694701 var res ;
695702
696703 if ( install && reinstallLinked && ! reinstall ) {
697- reinstall = await this . #hasLinkedPackages( ) ;
704+ const missedDependencies = await this . #getMissedDependencies( ) ;
705+
706+ reinstall = Boolean ( missedDependencies . size ) ;
698707 }
699708
700709 // get outdated dependencies
@@ -1195,6 +1204,7 @@ export default class Package {
11951204 this . #version = undefined ;
11961205 this . #workspaces = undefined ;
11971206 this . #subPackages = undefined ;
1207+ this . #dependencies = undefined ;
11981208 }
11991209
12001210 async #updateMetadata ( { dependabot, commit } = { } ) {
@@ -1467,33 +1477,26 @@ export default class Package {
14671477 ) ;
14681478 }
14691479
1470- async #hasLinkedPackages ( ) {
1471- const dirs = await glob (
1472- [
1473-
1474- //
1475- "*" ,
1476- "@*/*" ,
1477- ] ,
1478- {
1479- "cwd" : this . root + "/node_modules" ,
1480- "absolute" : true ,
1481- "files" : false ,
1482- "directories" : true ,
1483- }
1484- ) ;
1480+ async #getMissedDependencies ( ) {
1481+ const dependencies = new Map ( ) ;
14851482
1486- var hasLinkedPackages = false ;
1483+ await Promise . all ( [ ...this . dependencies . keys ( ) ] . map ( name =>
1484+ fs . promises
1485+ . readlink ( `${ this . root } /node_modules/${ name } ` )
1486+ . then ( link => dependencies . set ( name , link ) )
1487+ . catch ( e => {
14871488
1488- await Promise . all ( dirs . map ( dir => {
1489- return fs . promises
1490- . readlink ( dir )
1491- . then ( link => {
1492- hasLinkedPackages = true ;
1493- } )
1494- . catch ( e => { } ) ;
1495- } ) ) ;
1489+ // not exists
1490+ if ( e . code === "ENOENT" ) {
1491+ dependencies . set ( name , null ) ;
1492+ }
1493+
1494+ // other error
1495+ else if ( e . code !== "EINVAL" ) {
1496+ console . log ( e ) ;
1497+ }
1498+ } ) ) ) ;
14961499
1497- return hasLinkedPackages ;
1500+ return dependencies ;
14981501 }
14991502}
0 commit comments