@@ -825,7 +825,14 @@ module.exports = cls => class Reifier extends cls {
825
825
// symlink
826
826
const dir = dirname ( node . path )
827
827
const target = node . realpath
828
- const rel = relative ( dir , target )
828
+
829
+ let rel
830
+ if ( node . resolved ?. startsWith ( 'file:' ) ) {
831
+ rel = this . #calculateRelativePath( node , dir , target , nm )
832
+ } else {
833
+ rel = relative ( dir , target )
834
+ }
835
+
829
836
await mkdir ( dir , { recursive : true } )
830
837
return symlink ( rel , node . path , 'junction' )
831
838
}
@@ -843,6 +850,36 @@ module.exports = cls => class Reifier extends cls {
843
850
} ) : p ) . then ( ( ) => node )
844
851
}
845
852
853
+ #calculateRelativePath ( node , dir , target ) {
854
+ // Check if the node is affected by a root override
855
+ let hasRootOverride = [ ...node . edgesIn ] . some ( edge => edge . from . isRoot && edge . overrides )
856
+ // If not set via edges, see if the root package.json explicitly lists an override
857
+ if ( ! hasRootOverride && node . root ) {
858
+ const rootPackage = node . root . target
859
+ hasRootOverride = ! ! ( rootPackage &&
860
+ rootPackage . package . overrides &&
861
+ rootPackage . package . overrides [ node . name ] )
862
+ }
863
+ if ( ! hasRootOverride ) {
864
+ return relative ( dir , target )
865
+ }
866
+ // If an override is detected, attempt to retrieve the override spec from the root package.json
867
+ const overrideSpec = node . root ?. target ?. package ?. overrides ?. [ node . name ]
868
+ if ( typeof overrideSpec === 'string' && overrideSpec . startsWith ( 'file:' ) ) {
869
+ const overridePath = overrideSpec . replace ( / ^ f i l e : / , '' )
870
+ const rootDir = node . root . target . path
871
+ return relative ( dir , resolve ( rootDir , overridePath ) )
872
+ }
873
+
874
+ // Fallback: derive the package name from node.resolved in a platform-agnostic way
875
+ const filePath = node . resolved . replace ( / ^ f i l e : / , '' )
876
+ // A node.package.name could be different than the folder name
877
+ const pathParts = filePath . split ( / [ \\ / ] / )
878
+ const packageName = pathParts [ pathParts . length - 1 ]
879
+
880
+ return join ( '..' , packageName )
881
+ }
882
+
846
883
#registryResolved ( resolved ) {
847
884
// the default registry url is a magic value meaning "the currently
848
885
// configured registry".
0 commit comments