@@ -96,12 +96,12 @@ public async static Task<List<ComponentsToArtifactory>> GetComponentsToBeUploade
9696 if ( aqlResult != null )
9797 {
9898 components . SrcRepoPathWithFullName = aqlResult . Repo + "/" + aqlResult . Path + "/" + aqlResult . Name ;
99- components . PypiCompName = aqlResult . Name ;
99+ components . PypiOrNpmCompName = aqlResult . Name ;
100100 }
101101 else
102102 {
103103 components . SrcRepoPathWithFullName = string . Empty ;
104- components . PypiCompName = string . Empty ;
104+ components . PypiOrNpmCompName = string . Empty ;
105105 }
106106
107107 components . Path = GetPackagePath ( components , aqlResult ) ;
@@ -730,8 +730,11 @@ public static string GetCopyURL(ComponentsToArtifactory component)
730730 string url = string . Empty ;
731731 if ( component . ComponentType == "NPM" )
732732 {
733- url = $ "{ component . JfrogApi } { ApiConstant . CopyPackageApi } { component . SrcRepoName } /{ component . Name } /-/{ component . PackageName } -{ component . Version } " +
734- $ "{ ApiConstant . NpmExtension } ?to=/{ component . DestRepoName } /{ component . Name } /-/{ component . PackageName } -{ component . Version } { ApiConstant . NpmExtension } ";
733+ url = $ "{ component . JfrogApi } { ApiConstant . CopyPackageApi } { component . SrcRepoPathWithFullName } " +
734+ $ "?to=/{ component . DestRepoName } /{ component . Path } /{ component . PypiOrNpmCompName } ";
735+
736+ // url = $"{component.JfrogApi}{ApiConstant.CopyPackageApi}{component.SrcRepoName}/{component.Name}/-/{component.PackageName}-{component.Version}" +
737+ //$"{ApiConstant.NpmExtension}?to=/{component.DestRepoName}/{component.Name}/-/{component.PackageName}-{component.Version}{ApiConstant.NpmExtension}";
735738 }
736739 else if ( component . ComponentType == "NUGET" )
737740 {
@@ -746,7 +749,7 @@ public static string GetCopyURL(ComponentsToArtifactory component)
746749 else if ( component . ComponentType == "PYTHON" )
747750 {
748751 url = $ "{ component . JfrogApi } { ApiConstant . CopyPackageApi } { component . SrcRepoPathWithFullName } " +
749- $ "?to=/{ component . DestRepoName } /{ component . PypiCompName } ";
752+ $ "?to=/{ component . DestRepoName } /{ component . PypiOrNpmCompName } ";
750753 }
751754 else if ( component . ComponentType == "CONAN" )
752755 {
@@ -772,8 +775,11 @@ public static string GetMoveURL(ComponentsToArtifactory component)
772775 string url = string . Empty ;
773776 if ( component . ComponentType == "NPM" )
774777 {
775- url = $ "{ component . JfrogApi } { ApiConstant . MovePackageApi } { component . SrcRepoName } /{ component . Name } /-/{ component . PackageName } -{ component . Version } " +
776- $ "{ ApiConstant . NpmExtension } ?to=/{ component . DestRepoName } /{ component . Name } /-/{ component . PackageName } -{ component . Version } { ApiConstant . NpmExtension } ";
778+ url = $ "{ component . JfrogApi } { ApiConstant . MovePackageApi } { component . SrcRepoPathWithFullName } " +
779+ $ "?to=/{ component . DestRepoName } /{ component . Path } /{ component . PypiOrNpmCompName } ";
780+
781+ // url = $"{component.JfrogApi}{ApiConstant.MovePackageApi}{component.SrcRepoName}/{component.Name}/-/{component.PackageName}-{component.Version}" +
782+ //$"{ApiConstant.NpmExtension}?to=/{component.DestRepoName}/{component.Name}/-/{component.PackageName}-{component.Version}{ApiConstant.NpmExtension}";
777783 }
778784 else if ( component . ComponentType == "NUGET" )
779785 {
@@ -788,7 +794,7 @@ public static string GetMoveURL(ComponentsToArtifactory component)
788794 else if ( component . ComponentType == "PYTHON" )
789795 {
790796 url = $ "{ component . JfrogApi } { ApiConstant . MovePackageApi } { component . SrcRepoPathWithFullName } " +
791- $ "?to=/{ component . DestRepoName } /{ component . PypiCompName } ";
797+ $ "?to=/{ component . DestRepoName } /{ component . PypiOrNpmCompName } ";
792798 }
793799 else if ( component . ComponentType == "CONAN" )
794800 {
@@ -814,7 +820,15 @@ private static string GetPackagePath(ComponentsToArtifactory component, AqlResul
814820 switch ( component . ComponentType )
815821 {
816822 case "NPM" :
817- return $ "{ component . Name } /-";
823+ if ( aqlResult != null )
824+ {
825+ return $ "{ aqlResult . Path } ";
826+ }
827+ else
828+ {
829+ return $ "{ component . Name } /-";
830+ }
831+
818832
819833 case "CONAN" when aqlResult != null :
820834 string path = aqlResult . Path ;
@@ -847,7 +861,7 @@ private static string GetJfrogPackageName(ComponentsToArtifactory component)
847861 switch ( component . ComponentType )
848862 {
849863 case "NPM" :
850- packageName = $ " { component . PackageName } - { component . Version } { ApiConstant . NpmExtension } " ;
864+ packageName = component . PypiOrNpmCompName ;
851865 break ;
852866
853867 case "NUGET" :
@@ -859,7 +873,7 @@ private static string GetJfrogPackageName(ComponentsToArtifactory component)
859873 break ;
860874
861875 case "PYTHON" :
862- packageName = component . PypiCompName ;
876+ packageName = component . PypiOrNpmCompName ;
863877 break ;
864878
865879 default :
@@ -966,6 +980,15 @@ public async static Task<AqlResult> GetSrcRepoDetailsForPyPiOrConanPackages(Comp
966980 return GetArtifactoryRepoNameForConan ( aqlConanResultList , item ) ;
967981 }
968982 }
983+ else if ( item . Purl . Contains ( "npm" , StringComparison . OrdinalIgnoreCase ) )
984+ {
985+ var aqlNpmResultList = await GetNpmListOfComponentsFromRepo ( new string [ ] { item . Properties . Find ( x => x . Name == Dataconstant . Cdx_ArtifactoryRepoName ) ? . Value } , jFrogService ) ;
986+
987+ if ( aqlNpmResultList . Count > 0 )
988+ {
989+ return GetNpmArtifactoryRepoName ( aqlNpmResultList , item ) ;
990+ }
991+ }
969992
970993 return null ;
971994 }
@@ -1180,13 +1203,36 @@ public static async Task<List<AqlResult>> GetPypiListOfComponentsFromRepo(string
11801203 return aqlResultList ;
11811204 }
11821205
1206+ public static async Task < List < AqlResult > > GetNpmListOfComponentsFromRepo ( string [ ] repoList , IJFrogService jFrogService )
1207+ {
1208+ if ( repoList != null && repoList . Length > 0 )
1209+ {
1210+ foreach ( var repo in repoList )
1211+ {
1212+ var componentRepoData = await jFrogService . GetNpmComponentDataByRepo ( repo ) ?? new List < AqlResult > ( ) ;
1213+ aqlResultList . AddRange ( componentRepoData ) ;
1214+ }
1215+ }
1216+
1217+ return aqlResultList ;
1218+ }
1219+
11831220 private static AqlResult GetArtifactoryRepoName ( List < AqlResult > aqlResultList , Component component )
11841221 {
1185- AqlResult repoName = aqlResultList . Find ( x => x . properties . Any ( p => p . key == "pypi.normalized.name" && p . value == component . Name ) && x . properties . Any ( p => p . key == "pypi.version" && p . value == component . Version ) ) ;
1222+ string jfrogpackageName = GetFullNameOfComponent ( component ) ;
1223+ AqlResult repoName = aqlResultList . Find ( x => x . properties . Any ( p => p . key == "pypi.normalized.name" && p . value == jfrogpackageName ) && x . properties . Any ( p => p . key == "pypi.version" && p . value == component . Version ) ) ;
11861224
11871225 return repoName ;
11881226 }
1189-
1227+
1228+ private static AqlResult GetNpmArtifactoryRepoName ( List < AqlResult > aqlResultList , Component component )
1229+ {
1230+ string jfrogpackageName = GetFullNameOfComponent ( component ) ;
1231+ AqlResult repoName = aqlResultList . Find ( x => x . properties . Any ( p => p . key == "npm.name" && p . value == jfrogpackageName ) && x . properties . Any ( p => p . key == "npm.version" && p . value == component . Version ) ) ;
1232+
1233+ return repoName ;
1234+ }
1235+
11901236
11911237 private static AqlResult GetArtifactoryRepoNameForConan ( List < AqlResult > aqlResultList , Component component )
11921238 {
@@ -1198,6 +1244,17 @@ private static AqlResult GetArtifactoryRepoNameForConan(List<AqlResult> aqlResul
11981244 return repoName ;
11991245 }
12001246
1247+ private static string GetFullNameOfComponent ( Component item )
1248+ {
1249+ if ( ! string . IsNullOrEmpty ( item . Group ) )
1250+ {
1251+ return $ "{ item . Group } /{ item . Name } ";
1252+ }
1253+ else
1254+ {
1255+ return item . Name ;
1256+ }
1257+ }
12011258 public static void UpdateBomArtifactoryRepoUrl ( ref Bom bom , List < ComponentsToArtifactory > componentsUploaded )
12021259 {
12031260 foreach ( var component in componentsUploaded )
0 commit comments