@@ -783,6 +783,144 @@ public async Task TestPnpmDetector_V9_GoodLockVersion_SkipsFileAndLinkDependenci
783783 parentComponent => parentComponent . Name == "sampleDependency" ) ;
784784 }
785785
786+ [ TestMethod ]
787+ public async Task TestPnpmDetector_V9_GoodLockVersion_FileAndLinkDependenciesAreNotRegistered ( )
788+ {
789+ var yamlFile = @"
790+ lockfileVersion: '9.0'
791+ settings:
792+ autoInstallPeers: true
793+ excludeLinksFromLockfile: false
794+ importers:
795+ .:
796+ dependencies:
797+ sampleDependency:
798+ specifier: ^1.1.1
799+ version: 1.1.1
800+ sampleFileDependency:
801+ specifier: file:../test
802+ version: file:../test
803+ SampleLinkDependency:
804+ specifier: workspace:*
805+ version: link:SampleLinkDependency
806+ packages:
807+ 808+ resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
809+ 810+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
811+ engines: {node: '>= 0.8'}
812+ 813+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
814+ engines: {node: '>=0.4.0'}
815+
816+ snapshots:
817+ 818+ dependencies:
819+ sampleIndirectDependency: 3.3.3
820+ sampleIndirectDependency2: 2.2.2
821+ 'file://../sampleFile': 'link:../\\'
822+ 823+ 824+ sampleFileDependency@file:../test': {}
825+ " ;
826+
827+ var ( scanResult , componentRecorder ) = await this . DetectorTestUtility
828+ . WithFile ( "pnpm-lock.yaml" , yamlFile )
829+ . ExecuteDetectorAsync ( ) ;
830+
831+ scanResult . ResultCode . Should ( ) . Be ( ProcessingResultCode . Success ) ;
832+
833+ var detectedComponents = componentRecorder . GetDetectedComponents ( ) ;
834+ detectedComponents . Should ( ) . HaveCount ( 3 ) ;
835+ var npmComponents = detectedComponents . Select ( x => new { Component = x . Component as NpmComponent , DetectedComponent = x } ) ;
836+ npmComponents . Should ( ) . Contain ( x => x . Component . Name == "sampleDependency" && x . Component . Version == "1.1.1" ) ;
837+ npmComponents . Should ( ) . Contain ( x => x . Component . Name == "sampleIndirectDependency2" && x . Component . Version == "2.2.2" ) ;
838+ npmComponents . Should ( ) . Contain ( x => x . Component . Name == "sampleIndirectDependency" && x . Component . Version == "3.3.3" ) ;
839+
840+ var noDevDependencyComponent = npmComponents . First ( x => x . Component . Name == "sampleDependency" ) ;
841+ var indirectDependencyComponent2 = npmComponents . First ( x => x . Component . Name == "sampleIndirectDependency2" ) ;
842+ var indirectDependencyComponent = npmComponents . First ( x => x . Component . Name == "sampleIndirectDependency" ) ;
843+
844+ componentRecorder . GetEffectiveDevDependencyValue ( noDevDependencyComponent . Component . Id ) . Should ( ) . BeFalse ( ) ;
845+ componentRecorder . GetEffectiveDevDependencyValue ( indirectDependencyComponent2 . Component . Id ) . Should ( ) . BeFalse ( ) ;
846+ componentRecorder . GetEffectiveDevDependencyValue ( indirectDependencyComponent . Component . Id ) . Should ( ) . BeFalse ( ) ;
847+ componentRecorder . AssertAllExplicitlyReferencedComponents < NpmComponent > (
848+ indirectDependencyComponent . Component . Id ,
849+ parentComponent => parentComponent . Name == "sampleDependency" ) ;
850+ componentRecorder . AssertAllExplicitlyReferencedComponents < NpmComponent > (
851+ indirectDependencyComponent2 . Component . Id ,
852+ parentComponent => parentComponent . Name == "sampleDependency" ) ;
853+ }
854+
855+ [ TestMethod ]
856+ public async Task TestPnpmDetector_V9_GoodLockVersion_HttpDependenciesAreNotRegistered ( )
857+ {
858+ var yamlFile = @"
859+ lockfileVersion: '9.0'
860+ settings:
861+ autoInstallPeers: true
862+ excludeLinksFromLockfile: false
863+ importers:
864+ .:
865+ dependencies:
866+ sampleDependency:
867+ specifier: ^1.1.1
868+ version: 1.1.1
869+ sampleHttpDependency:
870+ specifier: https://samplePackage/tar.gz/32f550d3b3bdb1b781aabe100683311cd982c98e
871+ version: sample@https://samplePackage/tar.gz/32f550d3b3bdb1b781aabe100683311cd982c98e
872+ SampleLinkDependency:
873+ specifier: workspace:*
874+ version: link:SampleLinkDependency
875+ packages:
876+ 877+ resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
878+ 879+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
880+ engines: {node: '>= 0.8'}
881+ 882+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
883+ engines: {node: '>=0.4.0'}
884+
885+ snapshots:
886+ 887+ dependencies:
888+ sampleIndirectDependency: 3.3.3
889+ sampleIndirectDependency2: 2.2.2
890+ 'file://../sampleFile': 'link:../\\'
891+ 892+ 893+ sampleHttpDependency@https://samplePackage/tar.gz/32f550d3b3bdb1b781aabe100683311cd982c98e': {}
894+ " ;
895+
896+ var ( scanResult , componentRecorder ) = await this . DetectorTestUtility
897+ . WithFile ( "pnpm-lock.yaml" , yamlFile )
898+ . ExecuteDetectorAsync ( ) ;
899+
900+ scanResult . ResultCode . Should ( ) . Be ( ProcessingResultCode . Success ) ;
901+
902+ var detectedComponents = componentRecorder . GetDetectedComponents ( ) ;
903+ detectedComponents . Should ( ) . HaveCount ( 3 ) ;
904+ var npmComponents = detectedComponents . Select ( x => new { Component = x . Component as NpmComponent , DetectedComponent = x } ) ;
905+ npmComponents . Should ( ) . Contain ( x => x . Component . Name == "sampleDependency" && x . Component . Version == "1.1.1" ) ;
906+ npmComponents . Should ( ) . Contain ( x => x . Component . Name == "sampleIndirectDependency2" && x . Component . Version == "2.2.2" ) ;
907+ npmComponents . Should ( ) . Contain ( x => x . Component . Name == "sampleIndirectDependency" && x . Component . Version == "3.3.3" ) ;
908+
909+ var noDevDependencyComponent = npmComponents . First ( x => x . Component . Name == "sampleDependency" ) ;
910+ var indirectDependencyComponent2 = npmComponents . First ( x => x . Component . Name == "sampleIndirectDependency2" ) ;
911+ var indirectDependencyComponent = npmComponents . First ( x => x . Component . Name == "sampleIndirectDependency" ) ;
912+
913+ componentRecorder . GetEffectiveDevDependencyValue ( noDevDependencyComponent . Component . Id ) . Should ( ) . BeFalse ( ) ;
914+ componentRecorder . GetEffectiveDevDependencyValue ( indirectDependencyComponent2 . Component . Id ) . Should ( ) . BeFalse ( ) ;
915+ componentRecorder . GetEffectiveDevDependencyValue ( indirectDependencyComponent . Component . Id ) . Should ( ) . BeFalse ( ) ;
916+ componentRecorder . AssertAllExplicitlyReferencedComponents < NpmComponent > (
917+ indirectDependencyComponent . Component . Id ,
918+ parentComponent => parentComponent . Name == "sampleDependency" ) ;
919+ componentRecorder . AssertAllExplicitlyReferencedComponents < NpmComponent > (
920+ indirectDependencyComponent2 . Component . Id ,
921+ parentComponent => parentComponent . Name == "sampleDependency" ) ;
922+ }
923+
786924 [ TestMethod ]
787925 public async Task TestPnpmDetector_V9_GoodLockVersion_MissingSnapshotsSuccess ( )
788926 {
0 commit comments