From ab75456eff0dd1e7634d4ab6a85befeeafc51630 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 20 Aug 2024 14:36:41 +0800 Subject: [PATCH 1/6] Show an error page if libs folder is empty. Resolve #20559 --- .../AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs | 2 + .../AspNetCore/Mvc/Libs/AbpMvcLibsOptions.cs | 11 +++ .../AspNetCore/Mvc/Libs/AbpMvcLibsService.cs | 73 +++++++++++++++++++ .../AspNetCore/Mvc/Libs/IAbpMvcLibsService.cs | 6 ++ 4 files changed, 92 insertions(+) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsOptions.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/IAbpMvcLibsService.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs index 7b68fca32d..133b840543 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs @@ -32,6 +32,7 @@ using Volo.Abp.AspNetCore.Mvc.DataAnnotations; using Volo.Abp.AspNetCore.Mvc.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.Infrastructure; using Volo.Abp.AspNetCore.Mvc.Json; +using Volo.Abp.AspNetCore.Mvc.Libs; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.VirtualFileSystem; using Volo.Abp.DependencyInjection; @@ -231,6 +232,7 @@ public class AbpAspNetCoreMvcModule : AbpModule public override void OnApplicationInitialization(ApplicationInitializationContext context) { AddApplicationParts(context); + context.ServiceProvider.GetRequiredService().CheckLibs(context); } private static void AddApplicationParts(ApplicationInitializationContext context) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsOptions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsOptions.cs new file mode 100644 index 0000000000..4daf23204b --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsOptions.cs @@ -0,0 +1,11 @@ +namespace Volo.Abp.AspNetCore.Mvc.Libs; + +public class AbpMvcLibsOptions +{ + public bool CheckLibs { get; set; } + + public AbpMvcLibsOptions() + { + CheckLibs = true; + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs new file mode 100644 index 0000000000..0650cded0a --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs @@ -0,0 +1,73 @@ +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.FileProviders; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.AspNetCore.Mvc.Libs; + +public class AbpMvcLibsService : IAbpMvcLibsService, ITransientDependency +{ + private Task? _checkLibsTask; + + public virtual void CheckLibs(ApplicationInitializationContext context) + { + var options = context.ServiceProvider.GetRequiredService>().Value; + if (options.CheckLibs) + { + var app = context.GetApplicationBuilder(); + app.Use(async (httpContext, next) => + { + if (!await HandleCheckLibsAsyncOnceAsync(httpContext)) + { + httpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; + httpContext.Response.ContentType = "text/html"; + await httpContext.Response.WriteAsync( + "" + + " " + + " ABP MVC Libs Error" + + " " + + " " + + "

ABP MVC Libs folder is not found!

" + + "

Please make sure you have run the abp install-libs command.

" + + "

For more information, see CLI install-libs document.

" + + " " + + "", + Encoding.UTF8 + ); + return; + } + + await next(httpContext); + }); + } + } + + protected virtual Task HandleCheckLibsAsyncOnceAsync(HttpContext httpContext) + { + if (_checkLibsTask == null) + { + _checkLibsTask = HandleCheckLibsAsync(httpContext); + } + + return _checkLibsTask; + } + + protected virtual Task HandleCheckLibsAsync(HttpContext httpContext) + { + var fileProvider = httpContext.RequestServices.GetRequiredService().WebRootFileProvider; + var abpFiles = new IFileInfo[] + { + fileProvider.GetFileInfo("/libs/abp/core/abp.js"), + fileProvider.GetFileInfo("/libs/abp/core/abp.css") + }; + + return Task.FromResult(abpFiles.All(abpFile => abpFile.Exists)); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/IAbpMvcLibsService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/IAbpMvcLibsService.cs new file mode 100644 index 0000000000..98a88184e8 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/IAbpMvcLibsService.cs @@ -0,0 +1,6 @@ +namespace Volo.Abp.AspNetCore.Mvc.Libs; + +public interface IAbpMvcLibsService +{ + void CheckLibs(ApplicationInitializationContext context); +} From faec129c59410894de37bde0e351294b673cf437 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 20 Aug 2024 15:19:15 +0800 Subject: [PATCH 2/6] Only enable the `CheckLibs` if project is depends on `AbpAspNetCoreMvcUiBundlingModule`. --- .../AbpAspNetCoreMvcUiBundlingModule.cs | 11 ++++++++-- .../AspNetCore/Mvc/Libs/AbpMvcLibsOptions.cs | 5 ----- .../AspNetCore/Mvc/Libs/AbpMvcLibsService.cs | 21 +++++++++++-------- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpAspNetCoreMvcUiBundlingModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpAspNetCoreMvcUiBundlingModule.cs index bdd4cb2a27..4e020bfcf8 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpAspNetCoreMvcUiBundlingModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/AbpAspNetCoreMvcUiBundlingModule.cs @@ -1,4 +1,5 @@ -using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; +using Volo.Abp.AspNetCore.Mvc.Libs; +using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; using Volo.Abp.Minify; using Volo.Abp.Modularity; @@ -11,5 +12,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling; )] public class AbpAspNetCoreMvcUiBundlingModule : AbpModule { - + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.CheckLibs = true; + }); + } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsOptions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsOptions.cs index 4daf23204b..d166528a05 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsOptions.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsOptions.cs @@ -3,9 +3,4 @@ namespace Volo.Abp.AspNetCore.Mvc.Libs; public class AbpMvcLibsOptions { public bool CheckLibs { get; set; } - - public AbpMvcLibsOptions() - { - CheckLibs = true; - } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs index 0650cded0a..4cb9952158 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs @@ -5,9 +5,11 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.FileProviders; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Microsoft.Extensions.FileProviders; using Volo.Abp.DependencyInjection; namespace Volo.Abp.AspNetCore.Mvc.Libs; @@ -34,7 +36,7 @@ public class AbpMvcLibsService : IAbpMvcLibsService, ITransientDependency " ABP MVC Libs Error" + " " + " " + - "

ABP MVC Libs folder is not found!

" + + "

ABP MVC Libs folder(wwwroot/libs) does not exist or empty!

" + "

Please make sure you have run the abp install-libs command.

" + "

For more information, see CLI install-libs document.

" + " " + @@ -61,13 +63,14 @@ public class AbpMvcLibsService : IAbpMvcLibsService, ITransientDependency protected virtual Task HandleCheckLibsAsync(HttpContext httpContext) { - var fileProvider = httpContext.RequestServices.GetRequiredService().WebRootFileProvider; - var abpFiles = new IFileInfo[] + var fileProvider = new PhysicalFileProvider(httpContext.RequestServices.GetRequiredService().WebRootPath); + var libsFolder = fileProvider.GetDirectoryContents("/libs"); + if (!libsFolder.Exists || !libsFolder.Any()) { - fileProvider.GetFileInfo("/libs/abp/core/abp.js"), - fileProvider.GetFileInfo("/libs/abp/core/abp.css") - }; - - return Task.FromResult(abpFiles.All(abpFile => abpFile.Exists)); + var logger = httpContext.RequestServices.GetRequiredService>(); + logger.LogError("The 'wwwroot/libs' folder does not exist or empty!"); + return Task.FromResult(false); + } + return Task.FromResult(true); } } From e825b03cdbd0e6f9995770dd06f7e4622f147413 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 20 Aug 2024 16:28:30 +0800 Subject: [PATCH 3/6] Disable `CheckLibs` in unit test. --- .../Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs | 9 +++++---- .../Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs | 6 ++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs index 4cb9952158..5d8fdf4cb3 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs @@ -1,3 +1,4 @@ +using System.IO; using System.Linq; using System.Net; using System.Text; @@ -26,7 +27,7 @@ public class AbpMvcLibsService : IAbpMvcLibsService, ITransientDependency var app = context.GetApplicationBuilder(); app.Use(async (httpContext, next) => { - if (!await HandleCheckLibsAsyncOnceAsync(httpContext)) + if (!await CheckLibsAsyncOnceAsync(httpContext)) { httpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; httpContext.Response.ContentType = "text/html"; @@ -51,17 +52,17 @@ public class AbpMvcLibsService : IAbpMvcLibsService, ITransientDependency } } - protected virtual Task HandleCheckLibsAsyncOnceAsync(HttpContext httpContext) + protected virtual Task CheckLibsAsyncOnceAsync(HttpContext httpContext) { if (_checkLibsTask == null) { - _checkLibsTask = HandleCheckLibsAsync(httpContext); + _checkLibsTask = CheckLibsAsync(httpContext); } return _checkLibsTask; } - protected virtual Task HandleCheckLibsAsync(HttpContext httpContext) + protected virtual Task CheckLibsAsync(HttpContext httpContext) { var fileProvider = new PhysicalFileProvider(httpContext.RequestServices.GetRequiredService().WebRootPath); var libsFolder = fileProvider.GetDirectoryContents("/libs"); diff --git a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs index 027403d226..0e13746d66 100644 --- a/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs +++ b/framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcTestModule.cs @@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; using Volo.Abp.AspNetCore.Mvc.GlobalFeatures; +using Volo.Abp.AspNetCore.Mvc.Libs; using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.Localization.Resource; using Volo.Abp.AspNetCore.Security.Claims; @@ -140,6 +141,11 @@ public class AbpAspNetCoreMvcTestModule : AbpModule }); context.Services.TransformAbpClaims(); + + Configure(options => + { + options.CheckLibs = false; + }); } public override void OnApplicationInitialization(ApplicationInitializationContext context) From 762d54176f18e739c329b1b786bb035f6cb79c86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alper=20Ebi=C3=A7o=C4=9Flu?= <9526587+ebicoglu@users.noreply.github.com> Date: Tue, 20 Aug 2024 12:19:25 +0300 Subject: [PATCH 4/6] update error message --- .../Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs index 5d8fdf4cb3..532ac18239 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs @@ -34,12 +34,13 @@ public class AbpMvcLibsService : IAbpMvcLibsService, ITransientDependency await httpContext.Response.WriteAsync( "" + " " + - " ABP MVC Libs Error" + + " Error — The Libs folder is missing!" + " " + " " + - "

ABP MVC Libs folder(wwwroot/libs) does not exist or empty!

" + - "

Please make sure you have run the abp install-libs command.

" + - "

For more information, see CLI install-libs document.

" + + "

⚠️ The Libs folder under the wwwroot/libs directory is empty!

" + + "

The Libs folder contains mandatory NPM Packages for running the project.

" + + "

Make sure you run the abp install-libs CLI tool command.

" + + "

For more information, check out the ABP CLI documentation

" + " " + "", Encoding.UTF8 From 8467434c87f2787443bc10596200ec3dcf3308c6 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 20 Aug 2024 17:44:04 +0800 Subject: [PATCH 5/6] Catch the exception and log it to prevent crashing the application. --- .../AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs | 7 +++++- .../AspNetCore/Mvc/Libs/AbpMvcLibsService.cs | 24 +++++++++++++------ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs index 133b840543..379523b659 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs @@ -232,7 +232,7 @@ public class AbpAspNetCoreMvcModule : AbpModule public override void OnApplicationInitialization(ApplicationInitializationContext context) { AddApplicationParts(context); - context.ServiceProvider.GetRequiredService().CheckLibs(context); + CheckLibs(context); } private static void AddApplicationParts(ApplicationInitializationContext context) @@ -279,4 +279,9 @@ public class AbpAspNetCoreMvcModule : AbpModule partManager.ApplicationParts.AddIfNotContains(moduleAssembly); } } + + private static void CheckLibs(ApplicationInitializationContext context) + { + context.ServiceProvider.GetRequiredService().CheckLibs(context); + } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs index 532ac18239..5563667438 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs @@ -1,3 +1,4 @@ +using System; using System.IO; using System.Linq; using System.Net; @@ -40,7 +41,7 @@ public class AbpMvcLibsService : IAbpMvcLibsService, ITransientDependency "

⚠️ The Libs folder under the wwwroot/libs directory is empty!

" + "

The Libs folder contains mandatory NPM Packages for running the project.

" + "

Make sure you run the abp install-libs CLI tool command.

" + - "

For more information, check out the ABP CLI documentation

" + + "

For more information, check out the ABP CLI documentation

" + " " + "", Encoding.UTF8 @@ -65,14 +66,23 @@ public class AbpMvcLibsService : IAbpMvcLibsService, ITransientDependency protected virtual Task CheckLibsAsync(HttpContext httpContext) { - var fileProvider = new PhysicalFileProvider(httpContext.RequestServices.GetRequiredService().WebRootPath); - var libsFolder = fileProvider.GetDirectoryContents("/libs"); - if (!libsFolder.Exists || !libsFolder.Any()) + var logger = httpContext.RequestServices.GetRequiredService>(); + try { - var logger = httpContext.RequestServices.GetRequiredService>(); - logger.LogError("The 'wwwroot/libs' folder does not exist or empty!"); - return Task.FromResult(false); + var fileProvider = new PhysicalFileProvider(httpContext.RequestServices.GetRequiredService().WebRootPath); + var libsFolder = fileProvider.GetDirectoryContents("/libs"); + if (!libsFolder.Exists || !libsFolder.Any()) + { + logger.LogError("The 'wwwroot/libs' folder does not exist or empty!"); + return Task.FromResult(false); + } + } + catch (Exception e) + { + // In case of any exception, log it and return true to prevent crashing the application. + logger.LogError(e, "An error occurred while checking the libs folder!"); } + return Task.FromResult(true); } } From a33f3249edb33bac7bedf19bd3c6338eb38c557c Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 20 Aug 2024 17:52:35 +0800 Subject: [PATCH 6/6] Update emoji code. --- .../Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs index 5563667438..1329fa5e27 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Libs/AbpMvcLibsService.cs @@ -35,10 +35,10 @@ public class AbpMvcLibsService : IAbpMvcLibsService, ITransientDependency await httpContext.Response.WriteAsync( "" + " " + - " Error — The Libs folder is missing!" + + " Error - The Libs folder is missing!" + " " + " " + - "

⚠️ The Libs folder under the wwwroot/libs directory is empty!

" + + "

⚠️ The Libs folder under the wwwroot/libs directory is empty!

" + "

The Libs folder contains mandatory NPM Packages for running the project.

" + "

Make sure you run the abp install-libs CLI tool command.

" + "

For more information, check out the ABP CLI documentation

" +