Skip to content

this commit enable generating static files helpers inside areas #146

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
@model AspNetFeatureFolders.Areas.Products.Search.IndexViewModel
<h1>Index</h1>

<script src="@Links.Areas.Products.Search.Index_js"></script>
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

20 changes: 20 additions & 0 deletions samples/AspNetFeatureFolders/R4Mvc.generated.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,26 @@ public static partial class Links
public const string UrlPath = "~";
public static string Url() => R4MvcHelpers.ProcessVirtualPath(UrlPath);
public static string Url(string fileName) => R4MvcHelpers.ProcessVirtualPath(UrlPath + "/" + fileName);
public static partial class Areas
{
public const string UrlPath = "~/Areas";
public static string Url() => R4MvcHelpers.ProcessVirtualPath(UrlPath);
public static string Url(string fileName) => R4MvcHelpers.ProcessVirtualPath(UrlPath + "/" + fileName);
public static partial class Products
{
public const string UrlPath = "~/Areas/Products";
public static string Url() => R4MvcHelpers.ProcessVirtualPath(UrlPath);
public static string Url(string fileName) => R4MvcHelpers.ProcessVirtualPath(UrlPath + "/" + fileName);
public static partial class Search
{
public const string UrlPath = "~/Areas/Products/Search";
public static string Url() => R4MvcHelpers.ProcessVirtualPath(UrlPath);
public static string Url(string fileName) => R4MvcHelpers.ProcessVirtualPath(UrlPath + "/" + fileName);
public static readonly string Index_js = Url("Index.js");
}
}
}

public static partial class css
{
public const string UrlPath = "~/css";
Expand Down
5 changes: 4 additions & 1 deletion samples/AspNetFeatureFolders/r4mvc.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@
"FeatureFolders": {
"Enabled": true,
"FeaturesPath": "Features",
"StaticFileAccess": false,
"StaticFileAccess": true,
"IncludedStaticFileExtensions": [
".js"
],
"FeatureOnlyAreas": [
"Products"
]
Expand Down
2 changes: 1 addition & 1 deletion src/R4Mvc.Tools/Locators/DefaultStaticFileLocator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public DefaultStaticFileLocator(IFileLocator fileLocator, Settings settings)
_settings = settings;
}

public IEnumerable<StaticFile> Find(string staticPathRoot)
public IEnumerable<StaticFile> Find(string projectRoot, string staticPathRoot)
{
var files = _fileLocator.GetFiles(staticPathRoot, "*", recurse: true).AsEnumerable();
if (_settings.ExcludedStaticFileExtensions?.Length > 0)
Expand Down
39 changes: 39 additions & 0 deletions src/R4Mvc.Tools/Locators/FeatureFolderStaticFileLocator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace R4Mvc.Tools.Locators
{
public class FeatureFolderStaticFileLocator : IStaticFileLocator
{
private readonly IFileLocator _fileLocator;
private readonly Settings _settings;

public FeatureFolderStaticFileLocator(IFileLocator fileLocator, Settings settings)
{
_fileLocator = fileLocator;
_settings = settings;
}

public IEnumerable<StaticFile> Find(string projectRoot, string staticPathRoot)
{
if (_settings.FeatureFolders.StaticFileAccess == false)
return Array.Empty<StaticFile>();

var files = _fileLocator.GetFiles(projectRoot, "*", recurse: true).AsEnumerable();
files = files.Where(r => r.StartsWith(staticPathRoot, StringComparison.InvariantCultureIgnoreCase) == false);

if (_settings.ExcludedStaticFileExtensions?.Length > 0)
files = files.Where(f => !_settings.ExcludedStaticFileExtensions.Any(e => f.EndsWith(e)));
if (!projectRoot.EndsWith("/"))
projectRoot += "/";
var rootUri = new Uri(projectRoot);
if(_settings.FeatureFolders.IncludedStaticFileExtensions?.Length >0)
files = files.Where(r => _settings.FeatureFolders.IncludedStaticFileExtensions.Contains(Path.GetExtension(r)));
return files.Select(f => new StaticFile(rootUri.MakeRelativeUri(new Uri(f))));

}

}
}
2 changes: 1 addition & 1 deletion src/R4Mvc.Tools/Locators/IStaticFileLocator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ namespace R4Mvc.Tools.Locators
{
public interface IStaticFileLocator
{
IEnumerable<StaticFile> Find(string staticPathRoot);
IEnumerable<StaticFile> Find(string projectRoot, string staticPathRoot);
}
}
1 change: 1 addition & 0 deletions src/R4Mvc.Tools/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@ static void ConfigureServices(IServiceCollection services, IConfigurationRoot co
services.AddTransient<IViewLocator, DefaultRazorViewLocator>();
services.AddTransient<IPageViewLocator, DefaultRazorPageViewLocator>();
services.AddTransient<IStaticFileLocator, DefaultStaticFileLocator>();
services.AddTransient<IStaticFileLocator, FeatureFolderStaticFileLocator>();
services.AddTransient<IFileLocator, PhysicalFileLocator>();
services.AddTransient<IGeneratedFileTesterService, GeneratedFileTesterService>();
services.AddTransient<IStaticFileGeneratorService, StaticFileGeneratorService>();
Expand Down
2 changes: 1 addition & 1 deletion src/R4Mvc.Tools/Properties/launchSettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
"profiles": {
"R4Mvc.Tools": {
"commandName": "Project",
"commandLineArgs": "generate -p \"..\\..\\..\\..\\..\\samples\\AspNetFeatureFolders\\AspNetFeatureFolders.csproj\"",
"commandLineArgs_blank": "",
"commandLineArgs": "generate -p \"..\\..\\..\\..\\..\\samples\\AspNetSimple.NetCore3\\AspNetSimple.NetCore3.csproj\"",
"commandLineArgs2": "generate -p \"..\\..\\..\\..\\..\\samples\\AspNetSimple\\AspNetSimple.csproj\"",
"commandLineArgs_aspNetFeatureFolders": "generate -p \"..\\..\\..\\..\\..\\samples\\AspNetFeatureFolders\\AspNetFeatureFolders.csproj\""
}
Expand Down
2 changes: 1 addition & 1 deletion src/R4Mvc.Tools/Services/StaticFileGeneratorService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public StaticFileGeneratorService(IEnumerable<IStaticFileLocator> staticFileLoca
public MemberDeclarationSyntax GenerateStaticFiles(string projectRoot)
{
var staticFilesRoot = GetStaticFilesPath(projectRoot);
var staticfiles = _staticFileLocators.SelectMany(x => x.Find(staticFilesRoot));
var staticfiles = _staticFileLocators.SelectMany(x => x.Find(projectRoot, staticFilesRoot));

var linksClass = new ClassBuilder(_settings.LinksNamespace)
.WithModifiers(SyntaxKind.PublicKeyword, SyntaxKind.StaticKeyword, SyntaxKind.PartialKeyword)
Expand Down
1 change: 1 addition & 0 deletions src/R4Mvc.Tools/Settings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public class FeatureFoldersClass
public bool Enabled { get; set; }
public string FeaturesPath { get; set; } = "Features";
public bool StaticFileAccess { get; set; }
public string[] IncludedStaticFileExtensions { get; set; }
public string[] FeatureOnlyAreas { get; set; }
}
}
Expand Down
4 changes: 2 additions & 2 deletions test/R4Mvc.Test/Locators/DefaultStaticFileLocatorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public void StaticFileLocator()
{
var settings = new Settings();
var locator = new DefaultStaticFileLocator(VirtualFileLocator.Default, settings);
Assert.Collection(locator.Find(@"D:\Project\wwwroot"),
Assert.Collection(locator.Find(@"D:\Project", @"D:\Project\wwwroot"),
f =>
{
Assert.Equal("core.js", f.FileName);
Expand Down Expand Up @@ -44,7 +44,7 @@ public void StaticFileLocator_Exclusions()
{
var settings = new Settings { ExcludedStaticFileExtensions = new[] { ".ico", ".css" } };
var locator = new DefaultStaticFileLocator(VirtualFileLocator.Default, settings);
Assert.Collection(locator.Find(@"D:\Project\wwwroot"),
Assert.Collection(locator.Find(@"D:\Project", @"D:\Project\wwwroot"),
f => Assert.Equal("lib/jslib/core.js", f.RelativePath.ToString()),
f => Assert.Equal("js/site.js", f.RelativePath.ToString())
);
Expand Down
51 changes: 51 additions & 0 deletions test/R4Mvc.Test/Locators/FeatureFolderStaticFileLocatorTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
using R4Mvc.Tools;
using R4Mvc.Tools.Locators;
using Xunit;

namespace R4Mvc.Test.Locators
{
public class FeatureFolderStaticFileLocatorTests
{
Settings _settings;
public FeatureFolderStaticFileLocatorTests()
{
_settings = new Settings();
_settings.FeatureFolders = new Settings.FeatureFoldersClass
{
Enabled = true,
FeatureOnlyAreas = new[] { "Admin" },
IncludedStaticFileExtensions = new[] { ".js", ".css" },
StaticFileAccess = true,
};
}
[Fact]
public void StaticFileLocator()
{
var locator = new FeatureFolderStaticFileLocator(VirtualFileLocator.Default, _settings);
Assert.Collection(locator.Find(@"D:\Project", @"D:\Project\wwwroot"),
f =>
{
Assert.Equal("Index.js", f.FileName);
Assert.Equal("Areas/Admin/Features/Home/Index.js", f.RelativePath.ToString());
Assert.Equal("Areas/Admin/Features/Home", f.Container);
},
f =>
{
Assert.Equal("Index.css", f.FileName);
Assert.Equal("Areas/Admin/Features/Home/Index.css", f.RelativePath.ToString());
Assert.Equal("Areas/Admin/Features/Home", f.Container);
}
);
}

[Fact]
public void StaticFileLocator_Exclusions()
{
_settings.ExcludedStaticFileExtensions = new[] {".css" };
var locator = new FeatureFolderStaticFileLocator(VirtualFileLocator.Default, _settings);
Assert.Collection(locator.Find(@"D:\Project", @"D:\Project\wwwroot"),
f => Assert.Equal("Areas/Admin/Features/Home/Index.js", f.RelativePath.ToString())
);
}
}
}
2 changes: 2 additions & 0 deletions test/R4Mvc.Test/Locators/VirtualFileLocator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ public static VirtualFileLocator Default
@"D:\Project\Areas\Admin\Controllers\HomeController.cs",
@"D:\Project\Areas\Admin\Features\Home\HomeController.cs",
@"D:\Project\Areas\Admin\Features\Home\Index.cshtml",
@"D:\Project\Areas\Admin\Features\Home\Index.js",
@"D:\Project\Areas\Admin\Features\Home\Index.css",
@"D:\Project\Areas\Admin\Views\Home\Index.cshtml",
@"D:\Project\Areas\Admin\Views\Shared\EditorTemplates\User.cshtml",
@"D:\Project\Areas\Admin\Views\Shared\_Layout.cshtml",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public void AddStaticFiles()
{
var settings = new Tools.Settings();
var staticFileLocator = new DefaultStaticFileLocator(VirtualFileLocator.Default, settings);
var staticFiles = staticFileLocator.Find(VirtualFileLocator.ProjectRoot_wwwroot);
var staticFiles = staticFileLocator.Find(VirtualFileLocator.ProjectRoot, VirtualFileLocator.ProjectRoot_wwwroot);
var staticFileGeneratorService = new StaticFileGeneratorService(new[] { staticFileLocator }, new Tools.Settings());

var c = new ClassBuilder("Test")
Expand Down