|  |  |  | @ -7,6 +7,7 @@ using System.Threading.Tasks; | 
			
		
	
		
			
				
					|  |  |  |  | using System.Xml; | 
			
		
	
		
			
				
					|  |  |  |  | using Microsoft.Extensions.Logging; | 
			
		
	
		
			
				
					|  |  |  |  | using Microsoft.Extensions.Logging.Abstractions; | 
			
		
	
		
			
				
					|  |  |  |  | using Newtonsoft.Json.Linq; | 
			
		
	
		
			
				
					|  |  |  |  | using Volo.Abp.Cli.Args; | 
			
		
	
		
			
				
					|  |  |  |  | using Volo.Abp.Cli.Commands; | 
			
		
	
		
			
				
					|  |  |  |  | using Volo.Abp.Cli.Commands.Services; | 
			
		
	
	
		
			
				
					|  |  |  | @ -42,7 +43,8 @@ namespace Volo.Abp.Cli.ProjectModification | 
			
		
	
		
			
				
					|  |  |  |  |             Logger = NullLogger<ProjectNpmPackageAdder>.Instance; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         public async Task AddAngularPackageAsync(string directory, string npmPackageName, string version = null, bool withSourceCode = false) | 
			
		
	
		
			
				
					|  |  |  |  |         public async Task AddAngularPackageAsync(string directory, string npmPackageName, string version = null, | 
			
		
	
		
			
				
					|  |  |  |  |             bool withSourceCode = false) | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |             await AddAngularPackageAsync( | 
			
		
	
		
			
				
					|  |  |  |  |                 directory, | 
			
		
	
	
		
			
				
					|  |  |  | @ -52,7 +54,8 @@ namespace Volo.Abp.Cli.ProjectModification | 
			
		
	
		
			
				
					|  |  |  |  |             ); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         public async Task AddAngularPackageAsync(string directory, NpmPackageInfo npmPackage, string version = null, bool withSourceCode = false) | 
			
		
	
		
			
				
					|  |  |  |  |         public async Task AddAngularPackageAsync(string directory, NpmPackageInfo npmPackage, string version = null, | 
			
		
	
		
			
				
					|  |  |  |  |             bool withSourceCode = false) | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |             var packageJsonFilePath = Path.Combine(directory, "package.json"); | 
			
		
	
		
			
				
					|  |  |  |  |             if (!File.Exists(packageJsonFilePath)) | 
			
		
	
	
		
			
				
					|  |  |  | @ -85,9 +88,11 @@ namespace Volo.Abp.Cli.ProjectModification | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         protected virtual async Task DownloadAngularSourceCode(string angularDirectory, NpmPackageInfo package, string version = null) | 
			
		
	
		
			
				
					|  |  |  |  |         protected virtual async Task DownloadAngularSourceCode(string angularDirectory, NpmPackageInfo package, | 
			
		
	
		
			
				
					|  |  |  |  |             string version = null) | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |             var targetFolder = Path.Combine(angularDirectory, "projects", package.Name.RemovePreFix("@").Replace("/","-")); | 
			
		
	
		
			
				
					|  |  |  |  |             var targetFolder = Path.Combine(angularDirectory, "projects", | 
			
		
	
		
			
				
					|  |  |  |  |                 package.Name.RemovePreFix("@").Replace("/", "-")); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             if (Directory.Exists(targetFolder)) | 
			
		
	
		
			
				
					|  |  |  |  |             { | 
			
		
	
	
		
			
				
					|  |  |  | @ -101,7 +106,8 @@ namespace Volo.Abp.Cli.ProjectModification | 
			
		
	
		
			
				
					|  |  |  |  |             ); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         public Task AddMvcPackageAsync(string directory, NpmPackageInfo npmPackage, string version = null, bool skipGulpCommand = false) | 
			
		
	
		
			
				
					|  |  |  |  |         public Task AddMvcPackageAsync(string directory, NpmPackageInfo npmPackage, string version = null, | 
			
		
	
		
			
				
					|  |  |  |  |             bool skipGulpCommand = false) | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |             var packageJsonFilePath = Path.Combine(directory, "package.json"); | 
			
		
	
		
			
				
					|  |  |  |  |             if (!File.Exists(packageJsonFilePath) || | 
			
		
	
	
		
			
				
					|  |  |  | @ -113,6 +119,11 @@ namespace Volo.Abp.Cli.ProjectModification | 
			
		
	
		
			
				
					|  |  |  |  |             Logger.LogInformation($"Installing '{npmPackage.Name}' package to the project '{packageJsonFilePath}'..."); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             if (version == null) | 
			
		
	
		
			
				
					|  |  |  |  |             { | 
			
		
	
		
			
				
					|  |  |  |  |                 version = DetectAbpVersionOrNull(Path.Combine(directory, "package.json")); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             var versionPostfix = version != null ? $"@{version}" : string.Empty; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             using (DirectoryHelper.ChangeCurrentDirectory(directory)) | 
			
		
	
	
		
			
				
					|  |  |  | @ -132,9 +143,45 @@ namespace Volo.Abp.Cli.ProjectModification | 
			
		
	
		
			
				
					|  |  |  |  |             return Task.CompletedTask; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         private async Task<NpmPackageInfo> FindNpmPackageInfoAsync(string packageName) | 
			
		
	
		
			
				
					|  |  |  |  |         private string DetectAbpVersionOrNull(string packageJsonFile) | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |             if (string.IsNullOrEmpty(packageJsonFile) || | 
			
		
	
		
			
				
					|  |  |  |  |                 !File.Exists(packageJsonFile)) | 
			
		
	
		
			
				
					|  |  |  |  |             { | 
			
		
	
		
			
				
					|  |  |  |  |                 return null; | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             try | 
			
		
	
		
			
				
					|  |  |  |  |             { | 
			
		
	
		
			
				
					|  |  |  |  |                 var packageJsonFileContent = File.ReadAllText(packageJsonFile); | 
			
		
	
		
			
				
					|  |  |  |  |                 var packageJsonObject = JObject.Parse(packageJsonFileContent); | 
			
		
	
		
			
				
					|  |  |  |  |                 var dependenciesObject = (JObject) packageJsonObject["dependencies"]; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 if (dependenciesObject == null) | 
			
		
	
		
			
				
					|  |  |  |  |                 { | 
			
		
	
		
			
				
					|  |  |  |  |                     return null; | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 var packages = dependenciesObject.Children<JProperty>(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 foreach (var package in packages) | 
			
		
	
		
			
				
					|  |  |  |  |                 { | 
			
		
	
		
			
				
					|  |  |  |  |                     if (package.Name.StartsWith("@abp/") || package.Name.StartsWith("@volo/")) | 
			
		
	
		
			
				
					|  |  |  |  |                     { | 
			
		
	
		
			
				
					|  |  |  |  |                         return package.Value.ToString(); | 
			
		
	
		
			
				
					|  |  |  |  |                     } | 
			
		
	
		
			
				
					|  |  |  |  |                 } | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |             catch (Exception ex) | 
			
		
	
		
			
				
					|  |  |  |  |             { | 
			
		
	
		
			
				
					|  |  |  |  |                 Logger.LogWarning("Cannot detect ABP package version. " + ex.Message); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             return null; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         private async Task<NpmPackageInfo> FindNpmPackageInfoAsync(string packageName) | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |             var url = $"{CliUrls.WwwAbpIo}api/app/npmPackage/byName/?name=" + packageName; | 
			
		
	
		
			
				
					|  |  |  |  |             var client = _cliHttpClientFactory.CreateClient(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -155,4 +202,4 @@ namespace Volo.Abp.Cli.ProjectModification | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | } |