@@ -496,11 +496,19 @@ async function resolveReusableNewerManagedDependency(params: {
496496 requestedResolution : NpmSpecResolution ;
497497 mode : "install" | "update" ;
498498 timeoutMs : number ;
499- } ) : Promise < {
500- dependencySpec : string ;
501- installed : ManagedNpmRootInstalledDependency | null ;
502- resolution : NpmSpecResolution ;
503- } | null > {
499+ } ) : Promise <
500+ | {
501+ ok : true ;
502+ dependencySpec : string ;
503+ installed : ManagedNpmRootInstalledDependency | null ;
504+ resolution : NpmSpecResolution ;
505+ }
506+ | {
507+ ok : false ;
508+ error : string ;
509+ }
510+ | null
511+ > {
504512 const requestedVersion = params . requestedResolution . version ;
505513 if ( params . mode !== "update" || ! requestedVersion ) {
506514 return null ;
@@ -530,32 +538,29 @@ async function resolveReusableNewerManagedDependency(params: {
530538 return null ;
531539 }
532540 const preservedSpec = `${ params . packageName } @${ dependencySpec } ` ;
533- let preservedResolution : NpmSpecResolution = {
534- name : params . requestedResolution . name ?? params . packageName ,
535- version : dependencySpec ,
536- resolvedSpec : preservedSpec ,
537- } ;
538- if ( installed ?. version === dependencySpec ) {
539- if ( installed . integrity ) {
540- preservedResolution = {
541- ...preservedResolution ,
542- integrity : installed . integrity ,
543- } ;
544- }
541+ let preservedResolution : NpmSpecResolution ;
542+ if ( installed ?. version === dependencySpec && installed . integrity ) {
543+ preservedResolution = {
544+ name : params . requestedResolution . name ?? params . packageName ,
545+ version : dependencySpec ,
546+ resolvedSpec : preservedSpec ,
547+ integrity : installed . integrity ,
548+ } ;
545549 } else {
546550 const metadataResult = await resolveNpmSpecMetadata ( {
547551 spec : preservedSpec ,
548552 timeoutMs : params . timeoutMs ,
549553 } ) ;
550- preservedResolution = metadataResult . ok
551- ? metadataResult . metadata
552- : {
553- name : params . requestedResolution . name ?? params . packageName ,
554- version : dependencySpec ,
555- resolvedSpec : preservedSpec ,
556- } ;
554+ if ( ! metadataResult . ok ) {
555+ return {
556+ ok : false ,
557+ error : `Failed to resolve npm metadata for preserved newer managed dependency ${ preservedSpec } : ${ metadataResult . error } ` ,
558+ } ;
559+ }
560+ preservedResolution = metadataResult . metadata ;
557561 }
558562 return {
563+ ok : true ,
559564 dependencySpec,
560565 installed,
561566 resolution : {
@@ -711,12 +716,16 @@ async function installPluginFromManagedNpmRoot(
711716 mode : effectiveMode ,
712717 timeoutMs,
713718 } ) ;
719+ if ( reusableNewerDependency && ! reusableNewerDependency . ok ) {
720+ return { ok : false , error : reusableNewerDependency . error } ;
721+ }
714722 const expectedNpmResolution = reusableNewerDependency ?. resolution ?? params . npmResolution ;
715723 const managedDependencySpec = reusableNewerDependency ?. dependencySpec ?? params . dependencySpec ;
716724 const installedNewerDependency = reusableNewerDependency ?. installed ;
717725 if (
718726 reusableNewerDependency &&
719- installedNewerDependency ?. version === reusableNewerDependency . dependencySpec
727+ installedNewerDependency ?. version === reusableNewerDependency . dependencySpec &&
728+ installedNewerDependency . integrity
720729 ) {
721730 logger . warn ?.(
722731 `Keeping newer installed ${ params . packageName } @${ installedNewerDependency . version } instead of downgrading to ${ params . npmResolution . version } .` ,
0 commit comments