From 8fa04cbfae701fa039f85fe236891be968b3012a Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 9 Feb 2024 14:58:58 +0800 Subject: [PATCH] Repalce theme package in `package.json` Resolve #18968 --- .../Volo/Abp/Cli/Commands/NewCommand.cs | 1 - .../Commands/ProjectCreationCommandBase.cs | 61 ------------------- ...eplaceDependencyFromPackageJsonFileStep.cs | 51 ++++++++++++++++ .../Templates/App/AppNoLayersTemplateBase.cs | 45 +++++++++++--- .../Templates/App/AppTemplateBase.cs | 45 +++++++++++--- .../Microservice/MicroserviceTemplateBase.cs | 45 +++++++++++--- 6 files changed, 165 insertions(+), 83 deletions(-) create mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ReplaceDependencyFromPackageJsonFileStep.cs diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs index 7c477da368..051f3e3abc 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs @@ -104,7 +104,6 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien await CheckCreatedRequirements(projectArgs); - ConfigureNpmPackagesForTheme(projectArgs); await CreateOpenIddictPfxFilesAsync(projectArgs); await RunGraphBuildForMicroserviceServiceTemplate(projectArgs); await CreateInitialMigrationsAsync(projectArgs); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs index 09642f38c6..a941438bc3 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs @@ -720,67 +720,6 @@ public abstract class ProjectCreationCommandBase }; } - protected void ConfigureNpmPackagesForTheme(ProjectBuildArgs projectArgs) - { - if (!projectArgs.Theme.HasValue) - { - return; - } - - switch (projectArgs.Theme) - { - case Theme.Basic: - ConfigureNpmPackagesForBasicTheme(projectArgs); - break; - case Theme.Lepton: - ConfigureNpmPackagesForLeptonTheme(projectArgs); - break; - case Theme.NotSpecified: - case Theme.LeptonXLite: - case Theme.LeptonX: - break; - default: - throw new CliUsageException(ExceptionMessageHelper.GetInvalidOptionExceptionMessage(Options.Theme.Long)); - } - } - - private void ConfigureNpmPackagesForBasicTheme(ProjectBuildArgs projectArgs) - { - if (projectArgs.UiFramework is not UiFramework.None or UiFramework.Angular) - { - ThemePackageAdder.AddNpmPackage(projectArgs.OutputFolder, "@abp/aspnetcore.mvc.ui.theme.basic", projectArgs.Version); - } - - if (projectArgs.UiFramework is UiFramework.BlazorServer) - { - ThemePackageAdder.AddNpmPackage(projectArgs.OutputFolder, "@abp/aspnetcore.components.server.basictheme", projectArgs.Version); - } - - if (projectArgs.UiFramework is UiFramework.Angular) - { - ThemePackageAdder.AddAngularPackage(projectArgs.OutputFolder, "@abp/ng.theme.basic", projectArgs.Version); - } - } - - private void ConfigureNpmPackagesForLeptonTheme(ProjectBuildArgs projectArgs) - { - if (projectArgs.UiFramework is not UiFramework.None or UiFramework.Angular) - { - ThemePackageAdder.AddNpmPackage(projectArgs.OutputFolder, "@volo/abp.aspnetcore.mvc.ui.theme.lepton", projectArgs.Version); - } - - if (projectArgs.UiFramework is UiFramework.BlazorServer) - { - ThemePackageAdder.AddNpmPackage(projectArgs.OutputFolder, "@volo/abp.aspnetcore.components.server.leptontheme", projectArgs.Version); - ThemePackageAdder.AddNpmPackage(projectArgs.OutputFolder, "@volo/abp.aspnetcore.mvc.ui.theme.lepton", projectArgs.Version); - } - - if (projectArgs.UiFramework is UiFramework.Angular) - { - ThemePackageAdder.AddAngularPackage(projectArgs.OutputFolder, "@volo/abp.ng.theme.lepton", projectArgs.Version); - } - } - protected void ConfigureAngularJsonForThemeSelection(ProjectBuildArgs projectArgs) { if (projectArgs.TemplateName == ModuleTemplate.TemplateName) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ReplaceDependencyFromPackageJsonFileStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ReplaceDependencyFromPackageJsonFileStep.cs new file mode 100644 index 0000000000..e8755a7bdd --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ReplaceDependencyFromPackageJsonFileStep.cs @@ -0,0 +1,51 @@ +using System.Linq; +using System.Text.RegularExpressions; + +namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps; + +public class ReplaceDependencyFromPackageJsonFileStep : ProjectBuildPipelineStep +{ + private readonly string _packageJsonFilePath; + private readonly string _packageName; + private readonly string _newPackageName; + private readonly string _newPackageVersion; + + public ReplaceDependencyFromPackageJsonFileStep(string packageJsonFilePath, string packageName, string newPackageName, string newPackageVersion) + { + _packageJsonFilePath = packageJsonFilePath; + _packageName = packageName; + _newPackageName = newPackageName; + _newPackageVersion = newPackageVersion; + } + + public override void Execute(ProjectBuildContext context) + { + var packageJsonFile = context.Files.FirstOrDefault(f => f.Name.Contains(_packageJsonFilePath) && !f.Name.Contains("node_modules")); + if (packageJsonFile == null) + { + return; + } + + var lines = packageJsonFile.GetLines(); + for (var i = 0; i < lines.Length; i++) + { + if (lines[i].Contains(_packageName)) + { + if (_newPackageVersion == null) + { + lines[i] = lines[i].Replace(_packageName, _newPackageName); + } + else + { + var space = Regex.Match(lines[i], @"\s+").Value; + var hasComma = lines[i].Contains(",") ? "," : ""; + var caret = lines[i].Contains("^"); + var tilde = lines[i].Contains("~"); + var prefix = caret ? "^" : tilde ? "~" : ""; + lines[i] = $"{space}\"{_newPackageName}\": \"{prefix}{_newPackageVersion}\"{hasComma}"; + } + } + } + packageJsonFile.SetLines(lines); + } +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs index 8b9df09ca5..098048c5b4 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs @@ -256,7 +256,7 @@ public abstract class AppNoLayersTemplateBase : TemplateInfo } steps.Add(new ChangeThemeStep()); - RemoveLeptonXThemePackagesFromPackageJsonFiles(steps, isProTemplate: IsPro(), uiFramework: context.BuildArgs.UiFramework); + ReplaceLeptonXThemePackagesFromPackageJsonFiles(steps, isProTemplate: IsPro(), uiFramework: context.BuildArgs.UiFramework, theme: context.BuildArgs.Theme, version: context.BuildArgs.Version); } private static void RemoveBlazorWasmProjects(List steps) @@ -324,9 +324,21 @@ public abstract class AppNoLayersTemplateBase : TemplateInfo return templateThemes.TryGetValue(args.TemplateName!, out var templateTheme) && templateTheme == args.Theme; } - private static void RemoveLeptonXThemePackagesFromPackageJsonFiles(List steps, bool isProTemplate, UiFramework uiFramework) + private static void ReplaceLeptonXThemePackagesFromPackageJsonFiles(List steps, bool isProTemplate, UiFramework uiFramework, Theme? theme, string version) { var mvcUiPackageName = isProTemplate ? "@volo/abp.aspnetcore.mvc.ui.theme.leptonx" : "@abp/aspnetcore.mvc.ui.theme.leptonxlite"; + var newMvcUiPackageName = theme switch + { + Theme.Basic => "@abp/aspnetcore.mvc.ui.theme.basic", + Theme.Lepton => "@volo/abp.aspnetcore.mvc.ui.theme.lepton", + Theme.LeptonXLite => "@abp/aspnetcore.mvc.ui.theme.leptonxlite", + Theme.LeptonX => "@volo/abp.aspnetcore.mvc.ui.theme.leptonx", + _ => throw new AbpException("Unknown theme: " + theme?.ToString()) + }; + if (theme == Theme.LeptonX || theme == Theme.LeptonXLite) + { + version = null; + } var packageJsonFilePaths = new List { "/MyCompanyName.MyProjectName.Web/package.json", @@ -338,12 +350,20 @@ public abstract class AppNoLayersTemplateBase : TemplateInfo foreach (var packageJsonFilePath in packageJsonFilePaths) { - steps.Add(new RemoveDependencyFromPackageJsonFileStep(packageJsonFilePath, mvcUiPackageName)); + steps.Add(new ReplaceDependencyFromPackageJsonFileStep(packageJsonFilePath, mvcUiPackageName, newMvcUiPackageName, version)); } if (uiFramework == UiFramework.BlazorServer) { var blazorServerUiPackageName = isProTemplate ? "@volo/aspnetcore.components.server.leptonxtheme" : "@abp/aspnetcore.components.server.leptonxlitetheme"; + var newBlazorServerUiPackageName = theme switch + { + Theme.Basic => "@abp/aspnetcore.components.server.basictheme", + Theme.Lepton => "@volo/abp.aspnetcore.components.server.leptontheme", + Theme.LeptonXLite => "@abp/aspnetcore.components.server.leptonxlitetheme", + Theme.LeptonX => "@volo/aspnetcore.components.server.leptonxtheme", + _ => throw new AbpException("Unknown theme: " + theme?.ToString()) + }; var blazorServerPackageJsonFilePaths = new List { "/MyCompanyName.MyProjectName/package.json", @@ -353,13 +373,21 @@ public abstract class AppNoLayersTemplateBase : TemplateInfo foreach (var blazorServerPackageJsonFilePath in blazorServerPackageJsonFilePaths) { - steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, mvcUiPackageName)); - steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, blazorServerUiPackageName)); + steps.Add(new ReplaceDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, mvcUiPackageName, newMvcUiPackageName, version)); + steps.Add(new ReplaceDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, blazorServerUiPackageName, newBlazorServerUiPackageName, version)); } } else if (uiFramework == UiFramework.Angular) { var ngUiPackageName = isProTemplate ? "@volosoft/abp.ng.theme.lepton-x" : "@abp/ng.theme.lepton-x"; + var newNgUiPackageName = theme switch + { + Theme.Basic => "@abp/ng.theme.basic", + Theme.Lepton => "@volo/abp.ng.theme.lepton", + Theme.LeptonXLite => "@abp/ng.theme.lepton-x", + Theme.LeptonX => "@volosoft/abp.ng.theme.lepton-x", + _ => throw new AbpException("Unknown theme: " + theme?.ToString()) + }; var angularPackageJsonFilePaths = new List { "/angular/package.json" @@ -367,8 +395,11 @@ public abstract class AppNoLayersTemplateBase : TemplateInfo foreach (var angularPackageJsonFilePath in angularPackageJsonFilePaths) { - steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, ngUiPackageName)); - steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, "bootstrap-icons")); + steps.Add(new ReplaceDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, ngUiPackageName, newNgUiPackageName, version)); + if (theme == Theme.Basic || theme == Theme.Lepton) + { + steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, "bootstrap-icons")); + } } } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs index 1e849c05ef..8d4717c8b0 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs @@ -232,7 +232,7 @@ public abstract class AppTemplateBase : TemplateInfo } steps.Add(new ChangeThemeStep()); - RemoveLeptonXThemePackagesFromPackageJsonFiles(steps, isProTemplate: IsPro(), uiFramework: context.BuildArgs.UiFramework); + ReplaceLeptonXThemePackagesFromPackageJsonFiles(steps, isProTemplate: IsPro(), uiFramework: context.BuildArgs.UiFramework, theme: context.BuildArgs.Theme, version: context.BuildArgs.Version); } protected void SetDbmsSymbols(ProjectBuildContext context) @@ -289,9 +289,21 @@ public abstract class AppTemplateBase : TemplateInfo return templateThemes.TryGetValue(args.TemplateName!, out var templateTheme) && templateTheme == args.Theme; } - private static void RemoveLeptonXThemePackagesFromPackageJsonFiles(List steps, bool isProTemplate, UiFramework uiFramework) + private static void ReplaceLeptonXThemePackagesFromPackageJsonFiles(List steps, bool isProTemplate, UiFramework uiFramework, Theme? theme, string version) { var mvcUiPackageName = isProTemplate ? "@volo/abp.aspnetcore.mvc.ui.theme.leptonx" : "@abp/aspnetcore.mvc.ui.theme.leptonxlite"; + var newMvcUiPackageName = theme switch + { + Theme.Basic => "@abp/aspnetcore.mvc.ui.theme.basic", + Theme.Lepton => "@volo/abp.aspnetcore.mvc.ui.theme.lepton", + Theme.LeptonXLite => "@abp/aspnetcore.mvc.ui.theme.leptonxlite", + Theme.LeptonX => "@volo/abp.aspnetcore.mvc.ui.theme.leptonx", + _ => throw new AbpException("Unknown theme: " + theme?.ToString()) + }; + if (theme == Theme.LeptonX || theme == Theme.LeptonXLite) + { + version = null; + } var packageJsonFilePaths = new List { "/MyCompanyName.MyProjectName.Web/package.json", @@ -306,12 +318,20 @@ public abstract class AppTemplateBase : TemplateInfo foreach (var packageJsonFilePath in packageJsonFilePaths) { - steps.Add(new RemoveDependencyFromPackageJsonFileStep(packageJsonFilePath, mvcUiPackageName)); + steps.Add(new ReplaceDependencyFromPackageJsonFileStep(packageJsonFilePath, mvcUiPackageName, newMvcUiPackageName, version)); } if (uiFramework == UiFramework.BlazorServer) { var blazorServerUiPackageName = isProTemplate ? "@volo/aspnetcore.components.server.leptonxtheme" : "@abp/aspnetcore.components.server.leptonxlitetheme"; + var newBlazorServerUiPackageName = theme switch + { + Theme.Basic => "@abp/aspnetcore.components.server.basictheme", + Theme.Lepton => "@volo/abp.aspnetcore.components.server.leptontheme", + Theme.LeptonXLite => "@abp/aspnetcore.components.server.leptonxlitetheme", + Theme.LeptonX => "@volo/aspnetcore.components.server.leptonxtheme", + _ => throw new AbpException("Unknown theme: " + theme?.ToString()) + }; var blazorServerPackageJsonFilePaths = new List { "/MyCompanyName.MyProjectName.Blazor/package.json", @@ -320,13 +340,21 @@ public abstract class AppTemplateBase : TemplateInfo foreach (var blazorServerPackageJsonFilePath in blazorServerPackageJsonFilePaths) { - steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, mvcUiPackageName)); - steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, blazorServerUiPackageName)); + steps.Add(new ReplaceDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, mvcUiPackageName, newMvcUiPackageName, version)); + steps.Add(new ReplaceDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, blazorServerUiPackageName, newBlazorServerUiPackageName, version)); } } else if (uiFramework == UiFramework.Angular) { var ngUiPackageName = isProTemplate ? "@volosoft/abp.ng.theme.lepton-x" : "@abp/ng.theme.lepton-x"; + var newNgUiPackageName = theme switch + { + Theme.Basic => "@abp/ng.theme.basic", + Theme.Lepton => "@volo/abp.ng.theme.lepton", + Theme.LeptonXLite => "@abp/ng.theme.lepton-x", + Theme.LeptonX => "@volosoft/abp.ng.theme.lepton-x", + _ => throw new AbpException("Unknown theme: " + theme?.ToString()) + }; var angularPackageJsonFilePaths = new List { "/angular/package.json" @@ -334,8 +362,11 @@ public abstract class AppTemplateBase : TemplateInfo foreach (var angularPackageJsonFilePath in angularPackageJsonFilePaths) { - steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, ngUiPackageName)); - steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, "bootstrap-icons")); + steps.Add(new ReplaceDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, ngUiPackageName, newNgUiPackageName, version)); + if (theme == Theme.Basic || theme == Theme.Lepton) + { + steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, "bootstrap-icons")); + } } } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceTemplateBase.cs index cb7722da10..6f2cb165ec 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceTemplateBase.cs @@ -51,12 +51,24 @@ public abstract class MicroserviceTemplateBase : TemplateInfo } steps.Add(new ChangeThemeStep()); - RemoveLeptonXThemePackagesFromPackageJsonFiles(steps, uiFramework: context.BuildArgs.UiFramework); + ReplaceLeptonXThemePackagesFromPackageJsonFiles(steps, uiFramework: context.BuildArgs.UiFramework, theme: context.BuildArgs.Theme, version: context.BuildArgs.Version); } - private static void RemoveLeptonXThemePackagesFromPackageJsonFiles(List steps, UiFramework uiFramework) + private static void ReplaceLeptonXThemePackagesFromPackageJsonFiles(List steps, UiFramework uiFramework, Theme? theme, string version) { var mvcUiPackageName = "@volo/abp.aspnetcore.mvc.ui.theme.leptonx"; + var newMvcUiPackageName = theme switch + { + Theme.Basic => "@abp/aspnetcore.mvc.ui.theme.basic", + Theme.Lepton => "@volo/abp.aspnetcore.mvc.ui.theme.lepton", + Theme.LeptonXLite => "@abp/aspnetcore.mvc.ui.theme.leptonxlite", + Theme.LeptonX => "@volo/abp.aspnetcore.mvc.ui.theme.leptonx", + _ => throw new AbpException("Unknown theme: " + theme?.ToString()) + }; + if (theme == Theme.LeptonX || theme == Theme.LeptonXLite) + { + version = null; + } var packageJsonFilePaths = new List { "/MyCompanyName.MyProjectName.AuthServer/package.json", @@ -65,12 +77,20 @@ public abstract class MicroserviceTemplateBase : TemplateInfo foreach (var packageJsonFilePath in packageJsonFilePaths) { - steps.Add(new RemoveDependencyFromPackageJsonFileStep(packageJsonFilePath, mvcUiPackageName)); + steps.Add(new ReplaceDependencyFromPackageJsonFileStep(packageJsonFilePath, mvcUiPackageName, newMvcUiPackageName, version)); } if (uiFramework == UiFramework.BlazorServer) { var blazorServerUiPackageName = "@volo/aspnetcore.components.server.leptonxtheme"; + var newBlazorServerUiPackageName = theme switch + { + Theme.Basic => "@abp/aspnetcore.components.server.basictheme", + Theme.Lepton => "@volo/abp.aspnetcore.components.server.leptontheme", + Theme.LeptonXLite => "@abp/aspnetcore.components.server.leptonxlitetheme", + Theme.LeptonX => "@volo/aspnetcore.components.server.leptonxtheme", + _ => throw new AbpException("Unknown theme: " + theme?.ToString()) + }; var blazorServerPackageJsonFilePaths = new List { "/MyCompanyName.MyProjectName.Blazor/package.json" @@ -78,13 +98,21 @@ public abstract class MicroserviceTemplateBase : TemplateInfo foreach (var blazorServerPackageJsonFilePath in blazorServerPackageJsonFilePaths) { - steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, mvcUiPackageName)); - steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, blazorServerUiPackageName)); + steps.Add(new ReplaceDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, mvcUiPackageName, newMvcUiPackageName, version)); + steps.Add(new ReplaceDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, blazorServerUiPackageName, newBlazorServerUiPackageName, version)); } } else if (uiFramework == UiFramework.Angular) { var ngUiPackageName = "@volosoft/abp.ng.theme.lepton-x"; + var newNgUiPackageName = theme switch + { + Theme.Basic => "@abp/ng.theme.basic", + Theme.Lepton => "@volo/abp.ng.theme.lepton", + Theme.LeptonXLite => "@abp/ng.theme.lepton-x", + Theme.LeptonX => "@volosoft/abp.ng.theme.lepton-x", + _ => throw new AbpException("Unknown theme: " + theme?.ToString()) + }; var angularPackageJsonFilePaths = new List { "/angular/package.json" @@ -92,8 +120,11 @@ public abstract class MicroserviceTemplateBase : TemplateInfo foreach (var angularPackageJsonFilePath in angularPackageJsonFilePaths) { - steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, ngUiPackageName)); - steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, "bootstrap-icons")); + steps.Add(new ReplaceDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, ngUiPackageName, newNgUiPackageName, version)); + if (theme == Theme.Basic || theme == Theme.Lepton) + { + steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, "bootstrap-icons")); + } } } }