Skip to content
Draft
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
Expand Up @@ -12,4 +12,4 @@
@using BlazorWebCSharp._1.Client
@*#if (UseWebAssembly && InteractiveAtRoot) -->
@using BlazorWebCSharp._1.Client.Layout
##endif*@
##endif*@
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
@layout MainLayout

<h3>Not Found</h3>
<p>Sorry, the content you are looking for does not exist.</p>
<p>Sorry, the content you are looking for does not exist.</p>
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,4 @@ h1:focus {

.form-floating > .form-control-plaintext:focus::placeholder, .form-floating > .form-control:focus::placeholder {
text-align: start;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
@layout MainLayout

<h3>Not Found</h3>
<p>Sorry, the content you are looking for does not exist.</p>
<p>Sorry, the content you are looking for does not exist.</p>
Original file line number Diff line number Diff line change
Expand Up @@ -114,4 +114,4 @@ code {

.form-floating > .form-control-plaintext:focus::placeholder, .form-floating > .form-control:focus::placeholder {
text-align: start;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,4 @@ body {

.form-floating > .form-control-plaintext:focus::placeholder, .form-floating > .form-control:focus::placeholder {
text-align: start;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,4 @@ body {

.form-floating > .form-control-plaintext:focus::placeholder, .form-floating > .form-control:focus::placeholder {
text-align: start;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,4 @@ body {

.form-floating > .form-control-plaintext:focus::placeholder, .form-floating > .form-control:focus::placeholder {
text-align: start;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
"parameter.UseMinimalAPIs.name": "Použití ovladačů",
"parameter.UseMinimalAPIs.description": "Místo minimálních rozhraní API používejte kontrolery."
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
"parameter.UseMinimalAPIs.name": "Controller verwenden",
"parameter.UseMinimalAPIs.description": "Verwenden Sie Controller anstelle minimaler APIs."
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -99,4 +99,4 @@
"usageExamples": [
""
]
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
"parameter.UseMinimalAPIs.name": "Utilizar controladores",
"parameter.UseMinimalAPIs.description": "Utilice controladores en lugar de API mínimas."
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
"parameter.UseMinimalAPIs.name": "Utiliser des contrôleurs",
"parameter.UseMinimalAPIs.description": "Utilisez des contrôleurs à la place des API minimales."
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
"parameter.UseMinimalAPIs.name": "Usa i controller",
"parameter.UseMinimalAPIs.description": "Usa i controller anziché le API minime."
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
"parameter.UseMinimalAPIs.name": "コントローラーを使用する",
"parameter.UseMinimalAPIs.description": "最小限の API ではなくコントローラーを使用します。"
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
"parameter.UseMinimalAPIs.name": "컨트롤러 사용",
"parameter.UseMinimalAPIs.description": "최소 API 대신 컨트롤러를 사용합니다."
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
"parameter.UseMinimalAPIs.name": "Użyj kontrolerów",
"parameter.UseMinimalAPIs.description": "Użyj kontrolerów zamiast minimalnych interfejsów API."
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
"parameter.UseMinimalAPIs.name": "Usar controles",
"parameter.UseMinimalAPIs.description": "Use controles em vez de APIs mínimas."
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
"parameter.UseMinimalAPIs.name": "Использовать контроллеры",
"parameter.UseMinimalAPIs.description": "Используйте контроллеры вместо минимальных API."
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
"parameter.UseMinimalAPIs.name": "Denetleyicileri kullan",
"parameter.UseMinimalAPIs.description": "Minimal API yerine denetleyicileri kullanın."
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
"parameter.UseMinimalAPIs.name": "使用控制器",
"parameter.UseMinimalAPIs.description": "使用控制器而不是最小 API。"
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@
"parameter.UseMinimalAPIs.name": "使用控制器",
"parameter.UseMinimalAPIs.description": "使用控制器,而不使用最小 API。"
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,4 @@
"usageExamples": [
""
]
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,4 @@
"persistenceScope": "templateGroup"
}
]
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -162,4 +162,4 @@
"continueOnError": true
}
]
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,4 @@ module Program =

builder.Build().Run()

0 // exit code
0 // exit code
91 changes: 91 additions & 0 deletions src/ProjectTemplates/test/Templates.Tests/NewlineEndingTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Collections.Generic;
using System.IO;
using System.Linq;
using Microsoft.AspNetCore.InternalTesting;
using Templates.Test.Helpers;
using Xunit;
using Xunit.Abstractions;

namespace Templates.Test;

public class NewlineEndingTest : LoggedTest
{
private ITestOutputHelper _output;
public ITestOutputHelper Output
{
get
{
if (_output == null)
{
_output = new TestOutputLogger(Logger);
}
return _output;
}
}

[Theory]
[InlineData("Web.ProjectTemplates")]
[InlineData("Web.ItemTemplates")]
[InlineData("Web.Client.ItemTemplates")]
public void TemplateFiles_ShouldEndWithNewline(string projectName)
{
var templateDirectoryPath = GetTemplateDirectoryPath(projectName);

var filesWithoutNewlineEnding = new List<string>();

// Get all template source files (excluding third-party libraries and auto-generated localization files)
var files = Directory.GetFiles(templateDirectoryPath, "*.cs", SearchOption.AllDirectories)
.Concat(Directory.GetFiles(templateDirectoryPath, "*.fs", SearchOption.AllDirectories))
.Concat(Directory.GetFiles(templateDirectoryPath, "*.razor", SearchOption.AllDirectories))
.Concat(Directory.GetFiles(templateDirectoryPath, "*.cshtml", SearchOption.AllDirectories))
.Concat(Directory.GetFiles(templateDirectoryPath, "*.css", SearchOption.AllDirectories))
.Concat(Directory.GetFiles(templateDirectoryPath, "*.js", SearchOption.AllDirectories))
.Concat(Directory.GetFiles(templateDirectoryPath, "*.ts", SearchOption.AllDirectories))
.Concat(Directory.GetFiles(templateDirectoryPath, "*.tsx", SearchOption.AllDirectories))
.Concat(Directory.GetFiles(templateDirectoryPath, "*.html", SearchOption.AllDirectories))
.Concat(Directory.GetFiles(templateDirectoryPath, "*.json", SearchOption.AllDirectories))
.Concat(Directory.GetFiles(templateDirectoryPath, "*.xml", SearchOption.AllDirectories))
.Concat(Directory.GetFiles(templateDirectoryPath, "*.csproj", SearchOption.AllDirectories))
.Concat(Directory.GetFiles(templateDirectoryPath, "*.fsproj", SearchOption.AllDirectories))
.Where(f => !f.Contains($"{Path.DirectorySeparatorChar}wwwroot{Path.DirectorySeparatorChar}lib{Path.DirectorySeparatorChar}")) // Exclude third-party libraries
.Where(f => !f.Contains($"{Path.DirectorySeparatorChar}.template.config{Path.DirectorySeparatorChar}localize{Path.DirectorySeparatorChar}")); // Exclude auto-generated localization files in localize directory

foreach (var file in files)
{
var filePath = Path.GetFullPath(file);

// Skip empty files before opening the stream
var fileInfo = new FileInfo(filePath);
if (fileInfo.Length == 0)
{
continue;
}

// Check if file ends with newline (0x0a)
using var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
fileStream.Seek(-1, SeekOrigin.End);
var lastByte = fileStream.ReadByte();

if (lastByte != 0x0a) // LF
{
Output.WriteLine($"File {filePath} does not end with a newline.");
filesWithoutNewlineEnding.Add(filePath);
}
}

Assert.False(filesWithoutNewlineEnding.Any(), $"Found {filesWithoutNewlineEnding.Count} file(s) without newline ending.");
}

private string GetTemplateDirectoryPath(string projectName)
{
var currentDirectory = Directory.GetCurrentDirectory();
var AssetsDir = Path.Combine(currentDirectory, "Assets");
var path = Path.Combine(projectName, "content");
var templateDirectoryPath = Path.Combine(AssetsDir, path);

return templateDirectoryPath;
}
}
Loading