@@ -122,7 +122,7 @@ function computeMetadata (tree, seen) {
122122 }
123123 }
124124
125- tree . children . filter ( ( child ) => ! child . removed && ! child . failed ) . forEach ( ( child ) => computeMetadata ( child , seen ) )
125+ tree . children . filter ( ( child ) => ! child . removed ) . forEach ( ( child ) => computeMetadata ( child , seen ) )
126126
127127 return tree
128128}
@@ -277,7 +277,7 @@ function isNotEmpty (value) {
277277 return value != null && value !== ''
278278}
279279
280- module . exports . computeVersionSpec = computeVersionSpec
280+ exports . computeVersionSpec = computeVersionSpec
281281function computeVersionSpec ( tree , child ) {
282282 validate ( 'OO' , arguments )
283283 var requested
@@ -309,10 +309,6 @@ function moduleNameMatches (name) {
309309 return function ( child ) { return moduleName ( child ) === name }
310310}
311311
312- function noModuleNameMatches ( name ) {
313- return function ( child ) { return moduleName ( child ) !== name }
314- }
315-
316312// while this implementation does not require async calling, doing so
317313// gives this a consistent interface with loadDeps et al
318314exports . removeDeps = function ( args , tree , saveToDependencies , next ) {
@@ -378,19 +374,12 @@ function isDepOptional (tree, name, pkg) {
378374 return false
379375}
380376
381- var failedDependency = exports . failedDependency = function ( tree , name_pkg ) {
382- var name
383- var pkg = { }
384- if ( typeof name_pkg === 'string' ) {
385- name = name_pkg
386- } else {
387- pkg = name_pkg
388- name = moduleName ( pkg )
389- }
390- tree . children = tree . children . filter ( noModuleNameMatches ( name ) )
391-
392- if ( isDepOptional ( tree , name , pkg ) ) {
393- return false
377+ exports . failedDependency = failedDependency
378+ function failedDependency ( tree , name , pkg ) {
379+ if ( name ) {
380+ if ( isDepOptional ( tree , name , pkg || { } ) ) {
381+ return false
382+ }
394383 }
395384
396385 tree . failed = true
@@ -399,17 +388,16 @@ var failedDependency = exports.failedDependency = function (tree, name_pkg) {
399388
400389 if ( tree . userRequired ) return true
401390
402- removeObsoleteDep ( tree )
403-
404391 if ( ! tree . requiredBy ) return false
405392
393+ let anyFailed = false
406394 for ( var ii = 0 ; ii < tree . requiredBy . length ; ++ ii ) {
407395 var requireParent = tree . requiredBy [ ii ]
408- if ( failedDependency ( requireParent , tree . package ) ) {
409- return true
396+ if ( failedDependency ( requireParent , moduleName ( tree ) , tree ) ) {
397+ anyFailed = true
410398 }
411399 }
412- return false
400+ return anyFailed
413401}
414402
415403function andHandleOptionalErrors ( log , tree , name , done ) {
@@ -419,7 +407,6 @@ function andHandleOptionalErrors (log, tree, name, done) {
419407 if ( ! er ) return done ( er , child , childLog )
420408 var isFatal = failedDependency ( tree , name )
421409 if ( er && ! isFatal ) {
422- tree . children = tree . children . filter ( noModuleNameMatches ( name ) )
423410 reportOptionalFailure ( tree , name , er )
424411 return done ( )
425412 } else {
@@ -602,8 +589,9 @@ function resolveWithNewModule (pkg, tree, log, next) {
602589 validate ( 'OOOF' , arguments )
603590
604591 log . silly ( 'resolveWithNewModule' , packageId ( pkg ) , 'checking installable status' )
605- return isInstallable ( pkg , iferr ( next , function ( ) {
606- addBundled ( pkg , iferr ( next , function ( ) {
592+ return isInstallable ( pkg , ( err ) => {
593+ let installable = ! err
594+ addBundled ( pkg , ( bundleErr ) => {
607595 var parent = earliestInstallable ( tree , tree , pkg ) || tree
608596 var isLink = pkg . _requested . type === 'directory'
609597 var child = createChild ( {
@@ -614,8 +602,9 @@ function resolveWithNewModule (pkg, tree, log, next) {
614602 children : pkg . _bundled || [ ] ,
615603 isLink : isLink ,
616604 isInLink : parent . isLink ,
617- knownInstallable : true
605+ knownInstallable : installable
618606 } )
607+ if ( ! installable || bundleErr ) child . failed = true
619608 delete pkg . _bundled
620609 var hasBundled = child . children . length
621610
@@ -631,13 +620,14 @@ function resolveWithNewModule (pkg, tree, log, next) {
631620 }
632621
633622 if ( pkg . _shrinkwrap && pkg . _shrinkwrap . dependencies ) {
634- return inflateShrinkwrap ( child , pkg . _shrinkwrap , function ( er ) {
635- next ( er , child , log )
623+ return inflateShrinkwrap ( child , pkg . _shrinkwrap , ( swErr ) => {
624+ if ( swErr ) child . failed = true
625+ next ( err || bundleErr || swErr , child , log )
636626 } )
637627 }
638- next ( null , child , log )
639- } ) )
640- } ) )
628+ next ( err || bundleErr , child , log )
629+ } )
630+ } )
641631}
642632
643633var validatePeerDeps = exports . validatePeerDeps = function ( tree , onInvalid ) {
@@ -670,7 +660,7 @@ var findRequirement = exports.findRequirement = function (tree, name, requested,
670660 validate ( 'OSO' , [ tree , name , requested ] )
671661 if ( ! requestor ) requestor = tree
672662 var nameMatch = function ( child ) {
673- return moduleName ( child ) === name && child . parent && ! child . removed && ! child . failed
663+ return moduleName ( child ) === name && child . parent && ! child . removed
674664 }
675665 var versionMatch = function ( child ) {
676666 return doesChildVersionMatch ( child , requested , requestor )
0 commit comments