@@ -635,13 +635,47 @@ async function installPluginFromManagedNpmRoot(
635635 const rollbackPeerDependencySnapshot = await readManagedNpmRootPeerDependencySnapshot ( {
636636 npmRoot,
637637 } ) ;
638+ const rollbackFailedManagedNpmInstall = async ( error : string ) : Promise < InstallPluginResult > => {
639+ await rollbackManagedNpmPluginInstall ( {
640+ npmRoot,
641+ packageName : params . packageName ,
642+ targetDir : installRoot ,
643+ timeoutMs,
644+ logger,
645+ peerDependencySnapshot : rollbackPeerDependencySnapshot ,
646+ } ) ;
647+ return { ok : false , error } ;
648+ } ;
649+ const syncManagedPeerDependenciesForInstall = async ( options ?: {
650+ omitUnsupportedManagedOverrides ?: boolean ;
651+ } ) : Promise < { ok : true ; changed : boolean } | { ok : false ; error : string } > => {
652+ try {
653+ return {
654+ ok : true ,
655+ changed : await syncManagedNpmRootPeerDependencies ( {
656+ npmRoot,
657+ managedOverrides,
658+ omitUnsupportedManagedOverrides : options ?. omitUnsupportedManagedOverrides ,
659+ timeoutMs,
660+ } ) ,
661+ } ;
662+ } catch ( error ) {
663+ return {
664+ ok : false ,
665+ error : `npm peer dependency planning failed: ${ error instanceof Error ? error . message : String ( error ) } ` ,
666+ } ;
667+ }
668+ } ;
638669 await upsertManagedNpmRootDependency ( {
639670 npmRoot,
640671 packageName : params . packageName ,
641672 dependencySpec : params . dependencySpec ,
642673 managedOverrides,
643674 } ) ;
644- await syncManagedNpmRootPeerDependencies ( { npmRoot, managedOverrides, timeoutMs } ) ;
675+ const initialPeerSync = await syncManagedPeerDependenciesForInstall ( ) ;
676+ if ( ! initialPeerSync . ok ) {
677+ return await rollbackFailedManagedNpmInstall ( initialPeerSync . error ) ;
678+ }
645679 const npmInstallArgs = [
646680 "npm" ,
647681 ...createSafeNpmInstallArgs ( {
@@ -676,12 +710,12 @@ async function installPluginFromManagedNpmRoot(
676710 managedOverrides,
677711 omitUnsupportedManagedOverrides : true ,
678712 } ) ;
679- await syncManagedNpmRootPeerDependencies ( {
680- npmRoot,
681- managedOverrides,
713+ const aliasRetryPeerSync = await syncManagedPeerDependenciesForInstall ( {
682714 omitUnsupportedManagedOverrides : true ,
683- timeoutMs,
684715 } ) ;
716+ if ( ! aliasRetryPeerSync . ok ) {
717+ return await rollbackFailedManagedNpmInstall ( aliasRetryPeerSync . error ) ;
718+ }
685719 install = await runCommandWithTimeout ( npmInstallArgs , npmInstallOptions ) ;
686720 }
687721 if ( install . code !== 0 ) {
@@ -700,12 +734,13 @@ async function installPluginFromManagedNpmRoot(
700734 }
701735 let settledManagedPeerDependencies = false ;
702736 for ( let peerSyncPass = 0 ; peerSyncPass < 10 ; peerSyncPass += 1 ) {
703- const syncedPeerDependencies = await syncManagedNpmRootPeerDependencies ( {
704- npmRoot,
705- managedOverrides,
737+ const peerSync = await syncManagedPeerDependenciesForInstall ( {
706738 omitUnsupportedManagedOverrides,
707- timeoutMs,
708739 } ) ;
740+ if ( ! peerSync . ok ) {
741+ return await rollbackFailedManagedNpmInstall ( peerSync . error ) ;
742+ }
743+ const syncedPeerDependencies = peerSync . changed ;
709744 if ( ! syncedPeerDependencies ) {
710745 settledManagedPeerDependencies = true ;
711746 break ;
@@ -727,13 +762,13 @@ async function installPluginFromManagedNpmRoot(
727762 }
728763 }
729764 if ( ! settledManagedPeerDependencies ) {
730- const syncedPeerDependencies = await syncManagedNpmRootPeerDependencies ( {
731- npmRoot,
732- managedOverrides,
765+ const peerSync = await syncManagedPeerDependenciesForInstall ( {
733766 omitUnsupportedManagedOverrides,
734- timeoutMs,
735767 } ) ;
736- settledManagedPeerDependencies = ! syncedPeerDependencies ;
768+ if ( ! peerSync . ok ) {
769+ return await rollbackFailedManagedNpmInstall ( peerSync . error ) ;
770+ }
771+ settledManagedPeerDependencies = ! peerSync . changed ;
737772 }
738773 if ( ! settledManagedPeerDependencies ) {
739774 await rollbackManagedNpmPluginInstall ( {
0 commit comments