@@ -676,35 +676,41 @@ async function addOverrides(
676
676
if ( spinner ) {
677
677
spinner . text = `Adding overrides${ workspaceName ? ` to ${ workspaceName } ` : '' } ...`
678
678
}
679
- const depAliasMap = new Map < string , { id : string ; version : string } > ( )
679
+ const depAliasMap = new Map < string , string > ( )
680
680
// Chunk package names to process them in parallel 3 at a time.
681
681
await pEach ( manifestEntries , 3 , async ( { 1 : data } ) => {
682
- const { name : regPkgName , package : origPkgName , version } = data
682
+ const { name : sockRegPkgName , package : origPkgName , version } = data
683
683
const major = semver . major ( version )
684
+ const sockOverridePrefix = `${ NPM } :${ sockRegPkgName } @`
685
+ const sockOverrideSpec = `${ sockOverridePrefix } ${ pin ? version : `^${ major } ` } `
684
686
for ( const { 1 : depObj } of depEntries ) {
685
- let pkgSpec = depObj [ origPkgName ]
686
- if ( pkgSpec ) {
687
- let thisVersion = version
687
+ const sockSpec = hasOwn ( depObj , sockRegPkgName )
688
+ ? depObj [ sockRegPkgName ]
689
+ : undefined
690
+ if ( sockSpec ) {
691
+ depAliasMap . set ( sockRegPkgName , sockSpec )
692
+ }
693
+ const origSpec = hasOwn ( depObj , origPkgName )
694
+ ? depObj [ origPkgName ]
695
+ : undefined
696
+ if ( origSpec ) {
697
+ let thisSpec = origSpec
688
698
// Add package aliases for direct dependencies to avoid npm EOVERRIDE errors.
689
699
// https://docs.npmjs.com/cli/v8/using-npm/package-spec#aliases
690
- const regSpecStartsLike = `npm:${ regPkgName } @`
691
- const existingVersion = pkgSpec . startsWith ( regSpecStartsLike )
692
- ? ( semver . coerce ( npa ( pkgSpec ) . rawSpec ) ?. version ?? '' )
693
- : ''
694
- if ( existingVersion ) {
695
- thisVersion = existingVersion
696
- } else {
697
- pkgSpec = `${ regSpecStartsLike } ^${ version } `
698
- depObj [ origPkgName ] = pkgSpec
699
- state . added . add ( regPkgName )
700
+ if (
701
+ ! (
702
+ thisSpec . startsWith ( sockOverridePrefix ) &&
703
+ semver . coerce ( npa ( thisSpec ) . rawSpec ) ?. version
704
+ )
705
+ ) {
706
+ thisSpec = sockOverrideSpec
707
+ depObj [ origPkgName ] = thisSpec
708
+ state . added . add ( sockRegPkgName )
700
709
if ( workspaceName ) {
701
710
state . addedInWorkspaces . add ( workspaceName )
702
711
}
703
712
}
704
- depAliasMap . set ( origPkgName , {
705
- id : pkgSpec ,
706
- version : thisVersion
707
- } )
713
+ depAliasMap . set ( origPkgName , thisSpec )
708
714
}
709
715
}
710
716
if ( isRoot ) {
@@ -716,42 +722,44 @@ async function addOverrides(
716
722
thingScanner ( thingToScan , origPkgName , lockBasename )
717
723
) {
718
724
const oldSpec = overrideExists ? overrides [ origPkgName ] : undefined
719
- const depAlias = depAliasMap . get ( origPkgName )
720
- const regSpecStartsLike = ` ${ NPM } : ${ regPkgName } @`
721
- let newSpec = ` ${ regSpecStartsLike } ${ pin ? version : `^ ${ major } ` } `
722
- let thisVersion = version
723
- if ( depAlias && type === NPM ) {
725
+ const origDepAlias = depAliasMap . get ( origPkgName )
726
+ const sockRegDepAlias = depAliasMap . get ( sockRegPkgName )
727
+ const depAlias = sockRegDepAlias ?? origDepAlias
728
+ let newSpec = sockOverrideSpec
729
+ if ( type === NPM && depAlias ) {
724
730
// With npm one may not set an override for a package that one directly
725
731
// depends on unless both the dependency and the override itself share
726
732
// the exact same spec. To make this limitation easier to deal with,
727
733
// overrides may also be defined as a reference to a spec for a direct
728
734
// dependency by prefixing the name of the package to match the version
729
735
// of with a $.
730
736
// https://docs.npmjs.com/cli/v8/configuring-npm/package-json#overrides
731
- newSpec = `$${ origPkgName } `
737
+ newSpec = `$${ sockRegDepAlias ? sockRegPkgName : origPkgName } `
732
738
} else if ( overrideExists ) {
733
739
const thisSpec = oldSpec . startsWith ( '$' )
734
- ? ( depAlias ?. id ?? newSpec )
735
- : ( oldSpec ?? newSpec )
736
- if ( thisSpec . startsWith ( regSpecStartsLike ) ) {
737
- if ( pin ) {
738
- thisVersion =
739
- semver . major (
740
- semver . coerce ( npa ( thisSpec ) . rawSpec ) ?. version ?? version
741
- ) === major
742
- ? version
743
- : ( ( await fetchPackageManifest ( thisSpec ) ) ?. version ??
744
- version )
740
+ ? depAlias || newSpec
741
+ : oldSpec || newSpec
742
+ if ( thisSpec . startsWith ( sockOverridePrefix ) ) {
743
+ if (
744
+ pin &&
745
+ semver . major (
746
+ semver . coerce ( npa ( thisSpec ) . rawSpec ) ?. version ?? version
747
+ ) !== major
748
+ ) {
749
+ const otherVersion = ( await fetchPackageManifest ( thisSpec ) )
750
+ ?. version
751
+ if ( otherVersion !== version ) {
752
+ newSpec = `${ sockOverridePrefix } ${ pin ? otherVersion : `^${ semver . major ( otherVersion ) } ` } `
753
+ }
745
754
}
746
- newSpec = `${ regSpecStartsLike } ${ pin ? thisVersion : `^${ semver . major ( thisVersion ) } ` } `
747
755
} else {
748
756
newSpec = oldSpec
749
757
}
750
758
}
751
759
if ( newSpec !== oldSpec ) {
752
760
overrides [ origPkgName ] = newSpec
753
761
const addedOrUpdated = overrideExists ? 'updated' : 'added'
754
- state [ addedOrUpdated ] . add ( regPkgName )
762
+ state [ addedOrUpdated ] . add ( sockRegPkgName )
755
763
}
756
764
}
757
765
} )
0 commit comments