diff --git a/Directory.Build.props b/Directory.Build.props index 650a9d73401c..ef016280ea17 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -46,7 +46,8 @@ nugetaspnet@microsoft.com - https://go.microsoft.com/fwlink/?LinkID=288859 + packageIcon.png + $(MSBuildThisFileDirectory)packageIcon.png https://asp.net $(MSBuildProjectDirectory) @@ -55,6 +56,10 @@ netcoreapp3.1 + + + + true @@ -86,7 +91,7 @@ aspnetcore-targeting-pack - false + false + + $(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion).0.0 + + diff --git a/NuGet.config b/NuGet.config index d0a37a8d8e75..90058d74d526 100644 --- a/NuGet.config +++ b/NuGet.config @@ -3,6 +3,7 @@ + diff --git a/eng/Baseline.Designer.props b/eng/Baseline.Designer.props index 0b3cfa0c078a..1e28129d002d 100644 --- a/eng/Baseline.Designer.props +++ b/eng/Baseline.Designer.props @@ -2,1333 +2,694 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - 2.2.7 + 3.0.0 - - - 2.2.0 + + + 3.0.0 + + + + 3.0.0 + + - 2.2.0 - - - - 2.2.0 - - - - 2.2.0 + 3.0.0 - - - 2.2.0 - - - - - - - - - 2.2.0-preview-35687 - - - - - - - - - - - - - 2.2.0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2.2.7 - - - - - 2.2.7 - - - - - 2.2.0 - - - - - - + 3.0.0 + + + + + + + + + + + + + + + 3.0.0 + - 2.2.0 + 3.0.0 - - - - - + + + - 2.2.0 - - - - - - - - - - 2.2.0 + 3.0.0 - - + + + - - - 2.2.0 + + + 3.0.0 - - - - - + - 2.2.0 + 3.0.0 - - - + - 2.2.2 + 3.0.0 - - - + - 2.2.0 + 3.0.0 - - - + + - 2.2.0 + 3.0.0 - - - - - - 2.2.0 + + + + 3.0.0 - - - + + - 2.2.0 + 3.0.0 - - - + + - 2.2.0 + 3.0.0 - - - + - 2.2.0 - - - - - - - - - 2.2.0 - - - - - - - - - - - - - 2.2.0 - - - - + 3.0.0 + + + + - 2.2.0 + 3.0.0 + + + + + - - + + + - 2.2.5 + 3.0.0 - - - + + + - - - - - - - + + + 3.0.0 + + + - 2.2.5 - - - - + 3.0.0 + + + + + + + 3.0.0-preview9.19465.2 + + + + + + + + + 3.0.0-preview9.19465.2 + + + + + + + 3.0.0-preview9.19465.2 + + + + 3.0.0-preview9.19465.2 + + + + + + + 3.0.0-preview9.19465.2 + + + + + + + + + + 3.0.0-preview9.19465.2 + + + + 3.0.0 + + + + + + + + + + + + + + + 3.0.0 + + + + 3.0.0 + + + + + + + + + + + + 3.0.0 + + + + + + + + + + + 3.0.0 + + + + + + + + + + + + + + + + 3.0.0 + + + + - 2.2.0 + 3.0.0 - - - + + + - - - 2.2.0 - - - - - + + + + - - - 2.2.0 - - - - - - - + + + - 2.2.0 + 3.0.0 - 2.2.0 + 3.0.0 - + - + + + + + 3.0.0 + + + + + + + + + + + + + + + + + + + + + - 2.2.0 + 3.0.0 - 2.2.0 + 3.0.0 - + - 2.2.7 + 3.0.0 - + + - - 2.2.0 + 3.0.0 - - - + + + - 2.2.0 + 3.0.0 + + + + - - + + - 2.2.5 + 3.0.0 - + - - - 2.2.0 + + + 3.0.0 - - - + + - - - 2.2.0 + + + 3.0.0 - - - - - - - - - - - - - - 2.2.0 - - - - - 2.2.1 - - - - - - - - 2.2.0 - - - - - - - - - - 2.2.0 - - - - - - - - - - - - - - - 2.2.0 - - - - - - - - - - 2.2.0 - - - - - - - - - 2.2.0 - - - - + + + - 2.2.0 - - - - - - - - - - - 2.2.7 - - - - - - - - - - - - - - - - - - - 2.2.0 - - - - - - - 2.2.0 - - - - + 3.0.0 + + + - 1.1.0 + 3.0.0 - - - - - - + + + + + + + + - 1.1.0 + 3.0.0 + + + - - - - - - - 1.1.0 - - - - - - - - - - - - - - - - - - - - - - - - 2.2.0 - - - - - - + + - 2.2.0 + 3.0.0 + + + + - - - - - 2.2.2 - - - - - - - - - - - 2.2.0 - - - - - - - - - 2.2.0 - - - - - - - + + - 2.2.0 + 3.0.0 - - - - + + + + + + + - 2.2.0 + 3.0.0 - - - - - - - + + + + + + + - 2.2.5 + 3.0.0 - - - - - - - - - - 2.2.0 - - - - - - + + + + - 2.2.0 + 3.0.0 - - + + - - - 2.2.0 + + + 3.0.0 + + + + + 3.0.0 - - - + + - - - 2.2.0 + + + 3.0.0 - - - - - + + + + - - - 2.2.0 - - - - - - - - - 2.2.0 - - - - - - - - 2.2.0 - - - - - 2.2.6 - - - - - 2.2.0 - - - - - - - 2.2.5 - - - - - - - - - - - - - - - - - - - - - 2.2.0 - - - - - - - - 2.2.0 - - - - - - - - - 2.2.0 - - - - - - - - 2.2.0 - - - - - - - 2.2.0 - - - - - - - - - - 2.2.0 - - - - - - - - - - - - 2.2.0 - - - - - - - - - - - - - - - - - - - - - - - 2.2.5 - - - - - - - 2.2.0 - - - - - - - - + + + 3.0.0 + + + + + - 2.2.0 - - - - - - - - 2.2.0 - - - - - - - - - - - - - - 2.2.0 - - - - - - - - - - - - - - - + 3.0.0 + + + + + - 2.2.0 + 3.0.0 - - - - + + + - 2.2.0 - - - - - - - 2.2.0 - - - - - 2.2.0 - - - - - - 2.2.0 - - - - - - - - 2.2.0 - - - - - - - 2.2.0 - - - - - - - 2.2.0 - - - - - - - - - - - 2.2.0 - - - - - - - - - - - - - - - - - - - 2.2.0 - - - - - - - - - - - - 2.2.0 - - - - - - - 2.2.2 - - - - - - - - - - - - - - - - - - 2.2.6 - - - - - - - - - - - 2.2.6 - - - - - - - - - - - 2.2.1 - - - - - - - - - - - - - - - - - - - 2.2.0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2.2.0 - - - - - - - - - - - - 2.2.0 - - - - + 3.0.0 + + - 2.2.0 + 3.0.0 - - + + - - - - - - - 2.2.1 - - - - - - - - - - - - - - 2.2.0 - - - - - - - - - - 2.2.0 - - - - - - - - - - - 1.1.0 - - - - - - - + + - 1.1.0 + 3.0.0 - - + + + + + + 3.0.0 + + + + + + + + + + + + + + + - 1.1.0 + 3.0.0 - - - - - + + + - - - - - - - - 1.1.0 - - - - - - - - - + + + - 1.1.0 + 3.0.0 + + + - - + - 1.1.5 + 3.0.0 + - - - - 1.1.5 + + + 3.0.0 - - - - - + + + - 1.1.0 - - - - - - - - - - - - - - + 3.0.0 + + + + + + + + - 1.1.5 + 3.0.0 - + - - + - - - 1.1.0 - - - - - - - - 2.2.0 - - - - - - - - 2.2.7 + 3.0.0 - - - - + + - - - 2.2.0 + + + 3.0.0 - - - - - - + + + - 2.2.0 - - - - - - - - 2.2.1 - - - - - - - - - - 2.2.0 - - - - - - - - 2.2.0 - - - - - - - - - - - - - - - - - - - - - - - - 2.2.0 - - - - - - - - - - - + 3.0.0 + + + + + + 3.0.0 + + + + 3.0.0 + + + + 3.0.0 + + + + 3.0.0 + + + + 3.0.0 + + + + 3.0.0 + + + + 3.0.0 + - 2.2.0 + 3.0.0 - - - - + + + + - 2.2.0 + 3.0.0 + + + + + - - - - + + + - 2.2.0 + 3.0.0 + + + + - - - - - - - 2.2.0 - - - - - - - - 2.2.0 - - - - - - 2.2.0 - - - - + + \ No newline at end of file diff --git a/eng/Baseline.xml b/eng/Baseline.xml index b541b834a244..52cbb358f44a 100644 --- a/eng/Baseline.xml +++ b/eng/Baseline.xml @@ -1,138 +1,91 @@  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/eng/PatchConfig.props b/eng/PatchConfig.props index 2c26521f8cad..60adba37fa3f 100644 --- a/eng/PatchConfig.props +++ b/eng/PatchConfig.props @@ -4,8 +4,8 @@ This file contains a list of the package IDs which are patching in a given relea CAUTION: due to limitations in MSBuild, the format of the PackagesInPatch property is picky. When adding a new package, make sure the new line ends with a semicolon and starts with a space. -Later on, this will be checked using this condition: +Directory.Build.props checks this property using the following condition: $(PackagesInPatch.Contains(' $(PackageId);')) --> @@ -15,59 +15,14 @@ Later on, this will be checked using this condition: - - - - - @aspnet/signalr; - Microsoft.AspNetCore.AspNetCoreModuleV2; - Microsoft.AspNetCore.Authentication.Google; - Microsoft.AspNetCore.Http; - Microsoft.AspNetCore.Mvc.Core; - Microsoft.AspNetCore.Routing; - Microsoft.AspNetCore.Server.IIS; - java:signalr; - - - - - @aspnet/signalr; - Microsoft.AspNetCore.AspNetCoreModuleV2; - - - - - Microsoft.AspNetCore.AspNetCoreModule; - Microsoft.AspNetCore.AspNetCoreModuleV2; - Microsoft.AspNetCore.Identity.UI; - java:signalr; - Microsoft.AspNetCore.SignalR.Protocols.MessagePack; - Microsoft.AspNetCore.SignalR.Redis; - Microsoft.AspNetCore.SignalR.StackExchangeRedis; - Microsoft.AspNetCore.DataProtection.StackExchangeRedis; - Microsoft.AspNetCore.Mvc.Core; - Microsoft.AspNetCore.Mvc.RazorPages; - Microsoft.AspNetCore.AzureAppServicesIntegration; - Microsoft.AspNetCore.AzureAppServices.HostingStartup; - Microsoft.AspNetCore.AzureAppServices.SiteExtension; - - - - - Microsoft.AspNetCore.Mvc.Api.Analyzers; - Microsoft.AspNetCore.Server.HttpSys; - Microsoft.AspNetCore.Server.IIS; - - - - - Microsoft.AspNetCore.DataProtection.AzureStorage; - Microsoft.AspNetCore.Hosting; - Microsoft.AspNetCore.SpaServices; - - - - + Microsoft.Net.Http.Headers; + Microsoft.AspNetCore.CookiePolicy; + Microsoft.AspNetCore.DataProtection.EntityFrameworkCore; + @microsoft/signalr; + Microsoft.Net.Http.Headers; + Microsoft.AspNetCore.Http.Abstractions; + Microsoft.AspNetCore.Http.Features; + Microsoft.AspNetCore.CookiePolicy; diff --git a/eng/ProjectReferences.props b/eng/ProjectReferences.props index 4210405c67dd..3ac3e8dbf677 100644 --- a/eng/ProjectReferences.props +++ b/eng/ProjectReferences.props @@ -15,6 +15,7 @@ + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 05afac014116..590767b4d3e9 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -9,428 +9,428 @@ --> - + https://github.com/aspnet/Blazor - 348e050ecd9bd8924581afb677089ae5e2d5e508 + bf49a4e1a5401c0e952147f1c7452261a058813d - + https://github.com/aspnet/AspNetCore-Tooling - 1e85487b5011a3541c78be97baa4407abf87ea1a + c034007a2d17e04decd619d875307392656ae94f - + https://github.com/aspnet/AspNetCore-Tooling - 1e85487b5011a3541c78be97baa4407abf87ea1a + c034007a2d17e04decd619d875307392656ae94f - + https://github.com/aspnet/AspNetCore-Tooling - 1e85487b5011a3541c78be97baa4407abf87ea1a + c034007a2d17e04decd619d875307392656ae94f - + https://github.com/aspnet/AspNetCore-Tooling - 1e85487b5011a3541c78be97baa4407abf87ea1a + c034007a2d17e04decd619d875307392656ae94f - + https://github.com/aspnet/EntityFrameworkCore - 04a13869d538a4519a403d50abfbbff28b5f41fd + b2fe76ff1eddf36f8a36161f02798f663acf9890 - + https://github.com/aspnet/EntityFrameworkCore - 04a13869d538a4519a403d50abfbbff28b5f41fd + b2fe76ff1eddf36f8a36161f02798f663acf9890 - + https://github.com/aspnet/EntityFrameworkCore - 04a13869d538a4519a403d50abfbbff28b5f41fd + b2fe76ff1eddf36f8a36161f02798f663acf9890 - + https://github.com/aspnet/EntityFrameworkCore - 04a13869d538a4519a403d50abfbbff28b5f41fd + b2fe76ff1eddf36f8a36161f02798f663acf9890 - + https://github.com/aspnet/EntityFrameworkCore - 04a13869d538a4519a403d50abfbbff28b5f41fd + b2fe76ff1eddf36f8a36161f02798f663acf9890 - + https://github.com/aspnet/EntityFrameworkCore - 04a13869d538a4519a403d50abfbbff28b5f41fd + b2fe76ff1eddf36f8a36161f02798f663acf9890 - + https://github.com/aspnet/EntityFrameworkCore - 04a13869d538a4519a403d50abfbbff28b5f41fd + b2fe76ff1eddf36f8a36161f02798f663acf9890 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/dotnet/core-setup - 72b39b0473993b932a08c8fc24a8988d45b416a5 + 3a78795f4d10a6a23af378116cabf429efefea88 - + https://github.com/dotnet/core-setup - 72b39b0473993b932a08c8fc24a8988d45b416a5 + 3a78795f4d10a6a23af378116cabf429efefea88 - + https://github.com/dotnet/core-setup - 72b39b0473993b932a08c8fc24a8988d45b416a5 + 3a78795f4d10a6a23af378116cabf429efefea88 - + https://github.com/dotnet/core-setup - 72b39b0473993b932a08c8fc24a8988d45b416a5 + 3a78795f4d10a6a23af378116cabf429efefea88 - + https://github.com/dotnet/corefx - d0f0bfa5b123b4c1183c889cf4017bb529675502 + 58dbf71fd0d9593c4bf8a1ecb2d5d4ff6882e782 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/dotnet/arcade - f8546fbab59a74a66c83b8cb76b3f6877ce1d374 + f70d1fca3d5d4045be75694006f1bee0e0aec572 - + https://github.com/dotnet/arcade - f8546fbab59a74a66c83b8cb76b3f6877ce1d374 + f70d1fca3d5d4045be75694006f1bee0e0aec572 - + https://github.com/dotnet/arcade - f8546fbab59a74a66c83b8cb76b3f6877ce1d374 + f70d1fca3d5d4045be75694006f1bee0e0aec572 - + https://github.com/aspnet/Extensions - 3f7b2e7243e0527fc4ab879a0ff7c6eb0f524d8c + 2f68d18ef7139b6c7577038342464479c7d26c11 - + https://github.com/dotnet/roslyn - cac1be1463d3b277184ed38115ae35b0cb236688 + 7c7708ed32437b99ab18a21d056d7ae0949e8d5c diff --git a/eng/Versions.props b/eng/Versions.props index 762d6c4f604a..8b32f17a1b21 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -22,8 +22,13 @@ $(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion) false + + true - true + true $(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion).$(AspNetCorePatchVersion) $(VersionPrefix) @@ -57,116 +62,116 @@ --> - 1.0.0-beta.19462.4 + 1.0.0-beta.19510.3 - 3.4.0-beta2-19462-08 + 3.4.0-beta3-19518-02 - 3.1.0-preview1.19470.9 - 3.1.0-preview1.19470.9 - 3.1.0-preview1.19470.9 - 2.1.0-preview1.19470.9 + 3.1.0-preview2.19518.8 + 3.1.0-preview2.19518.8 + 3.1.0-preview2.19518.8 + 2.1.0-preview2.19518.8 - 1.1.0-preview1.19463.3 - 4.7.0-preview1.19463.3 - 4.7.0-preview1.19463.3 - 4.7.0-preview1.19463.3 - 4.7.0-preview1.19463.3 - 4.7.0-preview1.19463.3 - 4.7.0-preview1.19463.3 - 4.7.0-preview1.19463.3 - 4.7.0-preview1.19463.3 - 4.7.0-preview1.19463.3 - 1.8.0-preview1.19463.3 - 4.7.0-preview1.19463.3 - 4.7.0-preview1.19463.3 - 4.7.0-preview1.19463.3 - 4.7.0-preview1.19463.3 - 4.7.0-preview1.19463.3 - 4.7.0-preview1.19463.3 - 4.7.0-preview1.19463.3 - 4.7.0-preview1.19463.3 - 4.7.0-preview1.19463.3 - 4.7.0-preview1.19463.3 - 4.7.0-preview1.19463.3 + 1.1.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 1.8.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 + 4.7.0-preview2.19518.6 - 3.1.0-preview1.19463.3 + 3.1.0-preview2.19518.6 - 3.0.0-preview9.19462.2 + 3.1.0-preview1.19503.1 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 - 3.1.0-preview1.19470.2 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 + 3.1.0-preview2.19518.29 - 3.1.0-preview1.19472.2 - 3.1.0-preview1.19472.2 - 3.1.0-preview1.19472.2 - 3.1.0-preview1.19472.2 - 3.1.0-preview1.19472.2 - 3.1.0-preview1.19472.2 - 3.1.0-preview1.19472.2 + 3.1.0-preview2.19518.9 + 3.1.0-preview2.19518.9 + 3.1.0-preview2.19518.9 + 3.1.0-preview2.19518.9 + 3.1.0-preview2.19518.9 + 3.1.0-preview2.19518.9 + 3.1.0-preview2.19518.9 - 3.1.0-preview1.19501.1 - 3.1.0-preview1.19501.1 - 3.1.0-preview1.19501.1 - 3.1.0-preview1.19501.1 + 3.1.0-preview2.19518.7 + 3.1.0-preview2.19518.7 + 3.1.0-preview2.19518.7 + 3.1.0-preview2.19518.7 $(NoWarn);NU5131 + + $(NoWarn);NU5048 diff --git a/eng/common/enable-cross-org-publishing.ps1 b/eng/common/enable-cross-org-publishing.ps1 new file mode 100644 index 000000000000..eccbf9f1b16d --- /dev/null +++ b/eng/common/enable-cross-org-publishing.ps1 @@ -0,0 +1,6 @@ +param( + [string] $token +) + +Write-Host "##vso[task.setvariable variable=VSS_NUGET_ACCESSTOKEN]$token" +Write-Host "##vso[task.setvariable variable=VSS_NUGET_URI_PREFIXES]https://dnceng.pkgs.visualstudio.com/;https://pkgs.dev.azure.com/dnceng/;https://devdiv.pkgs.visualstudio.com/;https://pkgs.dev.azure.com/devdiv/" diff --git a/eng/common/sdl/extract-artifact-packages.ps1 b/eng/common/sdl/extract-artifact-packages.ps1 index 1fdbb14329c4..6e6825013bf5 100644 --- a/eng/common/sdl/extract-artifact-packages.ps1 +++ b/eng/common/sdl/extract-artifact-packages.ps1 @@ -5,6 +5,13 @@ param( $ErrorActionPreference = "Stop" Set-StrictMode -Version 2.0 + +# `tools.ps1` checks $ci to perform some actions. Since the post-build +# scripts don't necessarily execute in the same agent that run the +# build.ps1/sh script this variable isn't automatically set. +$ci = $true +. $PSScriptRoot\..\tools.ps1 + $ExtractPackage = { param( [string] $PackagePath # Full path to a NuGet package diff --git a/eng/common/templates/job/performance.yml b/eng/common/templates/job/performance.yml index f3e1ca3e6421..f877fd7a8980 100644 --- a/eng/common/templates/job/performance.yml +++ b/eng/common/templates/job/performance.yml @@ -20,7 +20,7 @@ jobs: enableTelemetry: ${{ parameters.enableTelemetry }} enablePublishBuildArtifacts: true continueOnError: ${{ parameters.continueOnError }} - + jobs: - job: '${{ parameters.jobName }}' @@ -51,7 +51,7 @@ jobs: - ${{ if ne(parameters.osGroup, 'Windows_NT') }}: - HelixPreCommand: 'export PERFLAB_UPLOAD_TOKEN="$(PerfCommandUploadTokenLinux)"' - IsInternal: --internal - + - group: DotNet-HelixApi-Access - group: dotnet-benchview diff --git a/eng/common/templates/post-build/channels/netcore-3-tools-validation.yml b/eng/common/templates/post-build/channels/netcore-3-tools-validation.yml new file mode 100644 index 000000000000..cdb74031fcfc --- /dev/null +++ b/eng/common/templates/post-build/channels/netcore-3-tools-validation.yml @@ -0,0 +1,95 @@ +parameters: + artifactsPublishingAdditionalParameters: '' + publishInstallersAndChecksums: false + +stages: +- stage: NetCore_3_Tools_Validation_Publish + dependsOn: validate + variables: + - template: ../common-variables.yml + displayName: .NET 3 Tools - Validation Publishing + jobs: + - template: ../setup-maestro-vars.yml + + - job: publish_assets + displayName: Publish Assets + dependsOn: setupMaestroVars + variables: + - group: DotNet-Blob-Feed + - group: AzureDevOps-Artifact-Feeds-Pats + - name: BARBuildId + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ] + - name: IsStableBuild + value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.IsStableBuild'] ] + condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', variables.NETCore_3_Tools_Validation_Channel_Id)) + pool: + vmImage: 'windows-2019' + steps: + - task: DownloadBuildArtifacts@0 + displayName: Download Package Artifacts + inputs: + buildType: current + artifactName: PackageArtifacts + + - task: DownloadBuildArtifacts@0 + displayName: Download Blob Artifacts + inputs: + buildType: current + artifactName: BlobArtifacts + + - task: DownloadBuildArtifacts@0 + displayName: Download Asset Manifests + inputs: + buildType: current + artifactName: AssetManifests + + - task: NuGetToolInstaller@1 + displayName: 'Install NuGet.exe' + + # This is necessary whenever we want to publish/restore to an AzDO private feed + - task: NuGetAuthenticate@0 + displayName: 'Authenticate to AzDO Feeds' + + - task: PowerShell@2 + displayName: Enable cross-org publishing + inputs: + filePath: eng\common\enable-cross-org-publishing.ps1 + arguments: -token $(dn-bot-dnceng-artifact-feeds-rw) + + - task: PowerShell@2 + displayName: Publish Assets + inputs: + filePath: eng\common\sdk-task.ps1 + arguments: -task PublishArtifactsInManifest -restore -msbuildEngine dotnet + /p:ArtifactsCategory=$(_DotNetValidationArtifactsCategory) + /p:IsStableBuild=$(IsStableBuild) + /p:IsInternalBuild=$(IsInternalBuild) + /p:RepositoryName=$(Build.Repository.Name) + /p:CommitSha=$(Build.SourceVersion) + /p:NugetPath=$(NuGetExeToolPath) + /p:AzdoTargetFeedPAT='$(dn-bot-dnceng-universal-packages-rw)' + /p:AzureStorageTargetFeedPAT='$(dotnetfeed-storage-access-key-1)' + /p:BARBuildId=$(BARBuildId) + /p:MaestroApiEndpoint='$(MaestroApiEndPoint)' + /p:BuildAssetRegistryToken='$(MaestroApiAccessToken)' + /p:ManifestsBasePath='$(Build.ArtifactStagingDirectory)/AssetManifests/' + /p:BlobBasePath='$(Build.ArtifactStagingDirectory)/BlobArtifacts/' + /p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts/' + /p:Configuration=Release + /p:PublishInstallersAndChecksums=${{ parameters.publishInstallersAndChecksums }} + /p:InstallersTargetStaticFeed=$(InstallersBlobFeedUrl) + /p:InstallersAzureAccountKey=$(dotnetcli-storage-key) + /p:ChecksumsTargetStaticFeed=$(ChecksumsBlobFeedUrl) + /p:ChecksumsAzureAccountKey=$(dotnetclichecksums-storage-key) + /p:PublishToAzureDevOpsNuGetFeeds=true + /p:AzureDevOpsStaticShippingFeed='https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json' + /p:AzureDevOpsStaticShippingFeedKey='$(dn-bot-dnceng-artifact-feeds-rw)' + /p:AzureDevOpsStaticTransportFeed='https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json' + /p:AzureDevOpsStaticTransportFeedKey='$(dn-bot-dnceng-artifact-feeds-rw)' + /p:AzureDevOpsStaticSymbolsFeed='https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools-symbols/nuget/v3/index.json' + /p:AzureDevOpsStaticSymbolsFeedKey='$(dn-bot-dnceng-artifact-feeds-rw)' + ${{ parameters.artifactsPublishingAdditionalParameters }} + + - template: ../../steps/promote-build.yml + parameters: + ChannelId: ${{ variables.NETCore_3_Tools_Validation_Channel_Id }} diff --git a/eng/common/templates/post-build/channels/netcore-dev-30.yml b/eng/common/templates/post-build/channels/netcore-3-tools.yml similarity index 82% rename from eng/common/templates/post-build/channels/netcore-dev-30.yml rename to eng/common/templates/post-build/channels/netcore-3-tools.yml index 69f1a9013e04..70eec773e750 100644 --- a/eng/common/templates/post-build/channels/netcore-dev-30.yml +++ b/eng/common/templates/post-build/channels/netcore-3-tools.yml @@ -4,18 +4,18 @@ parameters: publishInstallersAndChecksums: false stages: -- stage: NetCore_Dev30_Publish +- stage: NetCore_3_Tools_Publish dependsOn: validate variables: - template: ../common-variables.yml - displayName: .NET Core 3.0 Dev Publishing + displayName: .NET 3 Tools Publishing jobs: - template: ../setup-maestro-vars.yml - job: displayName: Symbol Publishing dependsOn: setupMaestroVars - condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', variables.PublicDevRelease_30_Channel_Id)) + condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', variables.NetCore_3_Tools_Channel_Id)) variables: - group: DotNet-Symbol-Server-Pats pool: @@ -56,7 +56,7 @@ stages: value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ] - name: IsStableBuild value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.IsStableBuild'] ] - condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', variables.PublicDevRelease_30_Channel_Id)) + condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', variables.NetCore_3_Tools_Channel_Id)) pool: vmImage: 'windows-2019' steps: @@ -85,42 +85,46 @@ stages: - task: NuGetAuthenticate@0 displayName: 'Authenticate to AzDO Feeds' + - task: PowerShell@2 + displayName: Enable cross-org publishing + inputs: + filePath: eng\common\enable-cross-org-publishing.ps1 + arguments: -token $(dn-bot-dnceng-artifact-feeds-rw) + - task: PowerShell@2 displayName: Publish Assets - env: - AZURE_DEVOPS_EXT_PAT: $(dn-bot-dnceng-universal-packages-rw) inputs: filePath: eng\common\sdk-task.ps1 - arguments: -task PublishArtifactsInManifest -restore -msbuildEngine dotnet + arguments: -task PublishArtifactsInManifest -restore -msbuildEngine dotnet /p:ArtifactsCategory=$(_DotNetArtifactsCategory) /p:IsStableBuild=$(IsStableBuild) /p:IsInternalBuild=$(IsInternalBuild) /p:RepositoryName=$(Build.Repository.Name) /p:CommitSha=$(Build.SourceVersion) /p:NugetPath=$(NuGetExeToolPath) - /p:AzdoTargetFeedPAT='$(dn-bot-dnceng-universal-packages-rw)' - /p:AzureStorageTargetFeedPAT='$(dotnetfeed-storage-access-key-1)' - /p:BARBuildId=$(BARBuildId) - /p:MaestroApiEndpoint='$(MaestroApiEndPoint)' - /p:BuildAssetRegistryToken='$(MaestroApiAccessToken)' - /p:ManifestsBasePath='$(Build.ArtifactStagingDirectory)/AssetManifests/' - /p:BlobBasePath='$(Build.ArtifactStagingDirectory)/BlobArtifacts/' - /p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts/' - /p:Configuration=Release + /p:AzdoTargetFeedPAT='$(dn-bot-dnceng-universal-packages-rw)' + /p:AzureStorageTargetFeedPAT='$(dotnetfeed-storage-access-key-1)' + /p:BARBuildId=$(BARBuildId) + /p:MaestroApiEndpoint='$(MaestroApiEndPoint)' + /p:BuildAssetRegistryToken='$(MaestroApiAccessToken)' + /p:ManifestsBasePath='$(Build.ArtifactStagingDirectory)/AssetManifests/' + /p:BlobBasePath='$(Build.ArtifactStagingDirectory)/BlobArtifacts/' + /p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts/' + /p:Configuration=Release /p:PublishInstallersAndChecksums=${{ parameters.publishInstallersAndChecksums }} /p:InstallersTargetStaticFeed=$(InstallersBlobFeedUrl) /p:InstallersAzureAccountKey=$(dotnetcli-storage-key) /p:ChecksumsTargetStaticFeed=$(ChecksumsBlobFeedUrl) /p:ChecksumsAzureAccountKey=$(dotnetclichecksums-storage-key) /p:PublishToAzureDevOpsNuGetFeeds=true - /p:AzureDevOpsStaticShippingFeed='https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet3/nuget/v3/index.json' + /p:AzureDevOpsStaticShippingFeed='https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json' /p:AzureDevOpsStaticShippingFeedKey='$(dn-bot-dnceng-artifact-feeds-rw)' - /p:AzureDevOpsStaticTransportFeed='https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet3-transport/nuget/v3/index.json' + /p:AzureDevOpsStaticTransportFeed='https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json' /p:AzureDevOpsStaticTransportFeedKey='$(dn-bot-dnceng-artifact-feeds-rw)' - /p:AzureDevOpsStaticSymbolsFeed='https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet3-symbols/nuget/v3/index.json' + /p:AzureDevOpsStaticSymbolsFeed='https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools-symbols/nuget/v3/index.json' /p:AzureDevOpsStaticSymbolsFeedKey='$(dn-bot-dnceng-artifact-feeds-rw)' ${{ parameters.artifactsPublishingAdditionalParameters }} - template: ../../steps/promote-build.yml parameters: - ChannelId: ${{ variables.PublicDevRelease_30_Channel_Id }} + ChannelId: ${{ variables.NetCore_3_Tools_Channel_Id }} \ No newline at end of file diff --git a/eng/common/templates/post-build/channels/netcore-dev-31.yml b/eng/common/templates/post-build/channels/netcore-dev-31.yml index 720a0ab08a22..db21254187d9 100644 --- a/eng/common/templates/post-build/channels/netcore-dev-31.yml +++ b/eng/common/templates/post-build/channels/netcore-dev-31.yml @@ -85,10 +85,14 @@ stages: - task: NuGetAuthenticate@0 displayName: 'Authenticate to AzDO Feeds' + - task: PowerShell@2 + displayName: Enable cross-org publishing + inputs: + filePath: eng\common\enable-cross-org-publishing.ps1 + arguments: -token $(dn-bot-dnceng-artifact-feeds-rw) + - task: PowerShell@2 displayName: Publish Assets - env: - AZURE_DEVOPS_EXT_PAT: $(dn-bot-dnceng-universal-packages-rw) inputs: filePath: eng\common\sdk-task.ps1 arguments: -task PublishArtifactsInManifest -restore -msbuildEngine dotnet diff --git a/eng/common/templates/post-build/channels/netcore-dev-5.yml b/eng/common/templates/post-build/channels/netcore-dev-5.yml index 9c81e39e9cf8..c4f5a16acb62 100644 --- a/eng/common/templates/post-build/channels/netcore-dev-5.yml +++ b/eng/common/templates/post-build/channels/netcore-dev-5.yml @@ -85,10 +85,14 @@ stages: - task: NuGetAuthenticate@0 displayName: 'Authenticate to AzDO Feeds' + - task: PowerShell@2 + displayName: Enable cross-org publishing + inputs: + filePath: eng\common\enable-cross-org-publishing.ps1 + arguments: -token $(dn-bot-dnceng-artifact-feeds-rw) + - task: PowerShell@2 displayName: Publish Assets - env: - AZURE_DEVOPS_EXT_PAT: $(dn-bot-dnceng-universal-packages-rw) inputs: filePath: eng\common\sdk-task.ps1 arguments: -task PublishArtifactsInManifest -restore -msbuildEngine dotnet diff --git a/eng/common/templates/post-build/channels/netcore-internal-30.yml b/eng/common/templates/post-build/channels/netcore-internal-30.yml index 053163cf6ade..177b38df3571 100644 --- a/eng/common/templates/post-build/channels/netcore-internal-30.yml +++ b/eng/common/templates/post-build/channels/netcore-internal-30.yml @@ -84,10 +84,14 @@ stages: - task: NuGetAuthenticate@0 displayName: 'Authenticate to AzDO Feeds' + - task: PowerShell@2 + displayName: Enable cross-org publishing + inputs: + filePath: eng\common\enable-cross-org-publishing.ps1 + arguments: -token $(dn-bot-dnceng-artifact-feeds-rw) + - task: PowerShell@2 displayName: Publish Assets - env: - AZURE_DEVOPS_EXT_PAT: $(dn-bot-dnceng-universal-packages-rw) inputs: filePath: eng\common\sdk-task.ps1 arguments: -task PublishArtifactsInManifest -restore -msbuildEngine dotnet diff --git a/eng/common/templates/post-build/channels/netcore-release-30.yml b/eng/common/templates/post-build/channels/netcore-release-30.yml index 8ba9237ffc04..16ade0db29de 100644 --- a/eng/common/templates/post-build/channels/netcore-release-30.yml +++ b/eng/common/templates/post-build/channels/netcore-release-30.yml @@ -85,10 +85,14 @@ stages: - task: NuGetAuthenticate@0 displayName: 'Authenticate to AzDO Feeds' + - task: PowerShell@2 + displayName: Enable cross-org publishing + inputs: + filePath: eng\common\enable-cross-org-publishing.ps1 + arguments: -token $(dn-bot-dnceng-artifact-feeds-rw) + - task: PowerShell@2 displayName: Publish Assets - env: - AZURE_DEVOPS_EXT_PAT: $(dn-bot-dnceng-universal-packages-rw) inputs: filePath: eng\common\sdk-task.ps1 arguments: -task PublishArtifactsInManifest -restore -msbuildEngine dotnet diff --git a/eng/common/templates/post-build/channels/netcore-release-31.yml b/eng/common/templates/post-build/channels/netcore-release-31.yml index d8270eadaeab..01d56410c7d4 100644 --- a/eng/common/templates/post-build/channels/netcore-release-31.yml +++ b/eng/common/templates/post-build/channels/netcore-release-31.yml @@ -85,10 +85,14 @@ stages: - task: NuGetAuthenticate@0 displayName: 'Authenticate to AzDO Feeds' + - task: PowerShell@2 + displayName: Enable cross-org publishing + inputs: + filePath: eng\common\enable-cross-org-publishing.ps1 + arguments: -token $(dn-bot-dnceng-artifact-feeds-rw) + - task: PowerShell@2 displayName: Publish Assets - env: - AZURE_DEVOPS_EXT_PAT: $(dn-bot-dnceng-universal-packages-rw) inputs: filePath: eng\common\sdk-task.ps1 arguments: -task PublishArtifactsInManifest -restore -msbuildEngine dotnet diff --git a/eng/common/templates/post-build/channels/netcore-tools-latest.yml b/eng/common/templates/post-build/channels/netcore-tools-latest.yml index c75d18673396..157d2d4b9772 100644 --- a/eng/common/templates/post-build/channels/netcore-tools-latest.yml +++ b/eng/common/templates/post-build/channels/netcore-tools-latest.yml @@ -85,10 +85,14 @@ stages: - task: NuGetAuthenticate@0 displayName: 'Authenticate to AzDO Feeds' + - task: PowerShell@2 + displayName: Enable cross-org publishing + inputs: + filePath: eng\common\enable-cross-org-publishing.ps1 + arguments: -token $(dn-bot-dnceng-artifact-feeds-rw) + - task: PowerShell@2 displayName: Publish Assets - env: - AZURE_DEVOPS_EXT_PAT: $(dn-bot-dnceng-universal-packages-rw) inputs: filePath: eng\common\sdk-task.ps1 arguments: -task PublishArtifactsInManifest -restore -msbuildEngine dotnet diff --git a/eng/common/templates/post-build/channels/public-validation-release.yml b/eng/common/templates/post-build/channels/netcore-tools-validation.yml similarity index 90% rename from eng/common/templates/post-build/channels/public-validation-release.yml rename to eng/common/templates/post-build/channels/netcore-tools-validation.yml index fb2c23d0f4d8..d8447e49af6f 100644 --- a/eng/common/templates/post-build/channels/public-validation-release.yml +++ b/eng/common/templates/post-build/channels/netcore-tools-validation.yml @@ -21,7 +21,7 @@ stages: value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ] - name: IsStableBuild value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.IsStableBuild'] ] - condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', variables.PublicValidationRelease_30_Channel_Id)) + condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], format('[{0}]', variables.NetCore_Tools_Validation_Channel_Id)) pool: vmImage: 'windows-2019' steps: @@ -50,10 +50,14 @@ stages: - task: NuGetAuthenticate@0 displayName: 'Authenticate to AzDO Feeds' + - task: PowerShell@2 + displayName: Enable cross-org publishing + inputs: + filePath: eng\common\enable-cross-org-publishing.ps1 + arguments: -token $(dn-bot-dnceng-artifact-feeds-rw) + - task: PowerShell@2 displayName: Publish Assets - env: - AZURE_DEVOPS_EXT_PAT: $(dn-bot-dnceng-universal-packages-rw) inputs: filePath: eng\common\sdk-task.ps1 arguments: -task PublishArtifactsInManifest -restore -msbuildEngine dotnet @@ -88,4 +92,4 @@ stages: - template: ../../steps/promote-build.yml parameters: - ChannelId: ${{ variables.PublicValidationRelease_30_Channel_Id }} + ChannelId: ${{ variables.NetCore_Tools_Validation_Channel_Id }} diff --git a/eng/common/templates/post-build/common-variables.yml b/eng/common/templates/post-build/common-variables.yml index adb2a854f206..b4eed6f186c0 100644 --- a/eng/common/templates/post-build/common-variables.yml +++ b/eng/common/templates/post-build/common-variables.yml @@ -3,10 +3,6 @@ variables: - group: DotNet-DotNetCli-Storage - group: DotNet-MSRC-Storage - # .NET Core 3 Dev - - name: PublicDevRelease_30_Channel_Id - value: 3 - # .NET Core 3.1 Dev - name: PublicDevRelease_31_Channel_Id value: 128 @@ -16,13 +12,21 @@ variables: value: 131 # .NET Tools - Validation - - name: PublicValidationRelease_30_Channel_Id + - name: NetCore_Tools_Validation_Channel_Id value: 9 # .NET Tools - Latest - name: NetCore_Tools_Latest_Channel_Id value: 2 + # .NET 3 Tools - Validation + - name: NETCore_3_Tools_Validation_Channel_Id + value: 390 + + # .NET 3 Tools - Latest + - name: NetCore_3_Tools_Channel_Id + value: 344 + # .NET Core 3.0 Internal Servicing - name: InternalServicing_30_Channel_Id value: 184 diff --git a/eng/common/templates/post-build/post-build.yml b/eng/common/templates/post-build/post-build.yml index 5b9d0a5d99bf..7ee82d9ff183 100644 --- a/eng/common/templates/post-build/post-build.yml +++ b/eng/common/templates/post-build/post-build.yml @@ -101,29 +101,34 @@ stages: artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} -- template: \eng\common\templates\post-build\channels\netcore-dev-30.yml +- template: \eng\common\templates\post-build\channels\netcore-dev-31.yml parameters: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} -- template: \eng\common\templates\post-build\channels\netcore-dev-31.yml +- template: \eng\common\templates\post-build\channels\netcore-tools-latest.yml parameters: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} -- template: \eng\common\templates\post-build\channels\netcore-tools-latest.yml +- template: \eng\common\templates\post-build\channels\netcore-tools-validation.yml parameters: - symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} -- template: \eng\common\templates\post-build\channels\public-validation-release.yml +- template: \eng\common\templates\post-build\channels\netcore-3-tools-validation.yml parameters: artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} +- template: \eng\common\templates\post-build\channels\netcore-3-tools.yml + parameters: + symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} + artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }} + publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }} + - template: \eng\common\templates\post-build\channels\netcore-release-30.yml parameters: symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }} diff --git a/eng/scripts/ci-source-build.sh b/eng/scripts/ci-source-build.sh index a1a6b6b6ae2a..3387125d7823 100755 --- a/eng/scripts/ci-source-build.sh +++ b/eng/scripts/ci-source-build.sh @@ -9,10 +9,10 @@ set -euo pipefail scriptroot="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" reporoot="$(dirname "$(dirname "$scriptroot")")" -export DotNetBuildFromSource='true' - # Build repo tasks "$reporoot/eng/common/build.sh" --restore --build --ci --configuration Release /p:ProjectToBuild=$reporoot/eng/tools/RepoTasks/RepoTasks.csproj +export DotNetBuildFromSource='true' + # Build projects "$reporoot/eng/common/build.sh" --restore --build --pack "$@" diff --git a/eng/targets/ReferenceAssembly.targets b/eng/targets/ReferenceAssembly.targets index 765cc1693285..149d4e244375 100644 --- a/eng/targets/ReferenceAssembly.targets +++ b/eng/targets/ReferenceAssembly.targets @@ -52,6 +52,7 @@ <_RefSourceOutputPath>$([System.IO.Directory]::GetParent('$(MSBuildProjectDirectory)'))/ref/ <_RefSourceFileName>$(AssemblyName).$(_RefSourceFileTFM).cs + <_ManualRefSourceFileName>$(AssemblyName).Manual.cs <_RefSourceFileOutputPath>$(_RefSourceOutputPath)$(_RefSourceFileName) @@ -87,10 +88,16 @@ + <_ManualReferenceAssemblyContent /> + <_ManualReferenceAssemblyContent Condition="Exists('$(_RefSourceOutputPath)$(_ManualRefSourceFileName)')"> + ]]> + + - + ]]>$(_ManualReferenceAssemblyContent)'', '%0A ') ]]> diff --git a/eng/targets/ResolveReferences.targets b/eng/targets/ResolveReferences.targets index 263edf3eaa04..4efbe58e9769 100644 --- a/eng/targets/ResolveReferences.targets +++ b/eng/targets/ResolveReferences.targets @@ -36,7 +36,8 @@ --> true true - true + true false - true + true true false @@ -122,7 +123,7 @@ Text="Cannot reference "%(_InvalidReferenceToNonSharedFxAssembly.Identity)". This dependency is not in the shared framework. See docs/SharedFramework.md for instructions on how to modify what is in the shared framework." /> - + diff --git a/eng/tools/BaselineGenerator/BaselineGenerator.csproj b/eng/tools/BaselineGenerator/BaselineGenerator.csproj index 082a9eaf029a..df9cc7220a10 100644 --- a/eng/tools/BaselineGenerator/BaselineGenerator.csproj +++ b/eng/tools/BaselineGenerator/BaselineGenerator.csproj @@ -3,7 +3,7 @@ Exe $(DefaultNetCoreTargetFramework) - -s https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json + -s https://api.nuget.org/v3/index.json $(MSBuildThisFileDirectory)../../ diff --git a/eng/tools/RepoTasks/RepoTasks.csproj b/eng/tools/RepoTasks/RepoTasks.csproj index 5bef776106a1..68d4cd23fbf2 100644 --- a/eng/tools/RepoTasks/RepoTasks.csproj +++ b/eng/tools/RepoTasks/RepoTasks.csproj @@ -12,14 +12,14 @@ - + - - - + + + diff --git a/global.json b/global.json index 256d50f24e4e..80408643cf2a 100644 --- a/global.json +++ b/global.json @@ -1,9 +1,9 @@ { "sdk": { - "version": "3.1.100-preview1-014024" + "version": "3.1.100-preview1-014400" }, "tools": { - "dotnet": "3.1.100-preview1-014024", + "dotnet": "3.1.100-preview1-014400", "runtimes": { "dotnet/x64": [ "$(MicrosoftNETCoreAppRuntimeVersion)" @@ -25,7 +25,7 @@ }, "msbuild-sdks": { "Yarn.MSBuild": "1.15.2", - "Microsoft.DotNet.Arcade.Sdk": "1.0.0-beta.19462.4", - "Microsoft.DotNet.Helix.Sdk": "2.0.0-beta.19462.4" + "Microsoft.DotNet.Arcade.Sdk": "1.0.0-beta.19510.3", + "Microsoft.DotNet.Helix.Sdk": "2.0.0-beta.19510.3" } } diff --git a/packageIcon.png b/packageIcon.png new file mode 100644 index 000000000000..a0f1fdbf4d5e Binary files /dev/null and b/packageIcon.png differ diff --git a/src/Analyzers/Analyzers/src/Microsoft.AspNetCore.Analyzers.csproj b/src/Analyzers/Analyzers/src/Microsoft.AspNetCore.Analyzers.csproj index feec3324be12..cc4201ca795e 100644 --- a/src/Analyzers/Analyzers/src/Microsoft.AspNetCore.Analyzers.csproj +++ b/src/Analyzers/Analyzers/src/Microsoft.AspNetCore.Analyzers.csproj @@ -25,6 +25,7 @@ + diff --git a/src/Analyzers/Analyzers/src/Microsoft.AspNetCore.Analyzers.nuspec b/src/Analyzers/Analyzers/src/Microsoft.AspNetCore.Analyzers.nuspec index f906ece2170b..106615a7daa3 100644 --- a/src/Analyzers/Analyzers/src/Microsoft.AspNetCore.Analyzers.nuspec +++ b/src/Analyzers/Analyzers/src/Microsoft.AspNetCore.Analyzers.nuspec @@ -2,10 +2,12 @@ $CommonMetadataElements$ + packageIcon.png + diff --git a/src/Components/Blazor/Build/src/Microsoft.AspNetCore.Blazor.Build.csproj b/src/Components/Blazor/Build/src/Microsoft.AspNetCore.Blazor.Build.csproj index 35853a4b9e53..82968f49999d 100644 --- a/src/Components/Blazor/Build/src/Microsoft.AspNetCore.Blazor.Build.csproj +++ b/src/Components/Blazor/Build/src/Microsoft.AspNetCore.Blazor.Build.csproj @@ -23,6 +23,7 @@ + diff --git a/src/Components/Blazor/Build/src/Microsoft.AspNetCore.Blazor.Build.nuspec b/src/Components/Blazor/Build/src/Microsoft.AspNetCore.Blazor.Build.nuspec index ab73599f0b4c..feffe95c5069 100644 --- a/src/Components/Blazor/Build/src/Microsoft.AspNetCore.Blazor.Build.nuspec +++ b/src/Components/Blazor/Build/src/Microsoft.AspNetCore.Blazor.Build.nuspec @@ -5,6 +5,7 @@ + packageIcon.png @@ -12,5 +13,6 @@ + diff --git a/src/Components/Blazor/DevServer/src/Microsoft.AspNetCore.Blazor.DevServer.csproj b/src/Components/Blazor/DevServer/src/Microsoft.AspNetCore.Blazor.DevServer.csproj index d18ab7c9e442..eada2c3e8240 100644 --- a/src/Components/Blazor/DevServer/src/Microsoft.AspNetCore.Blazor.DevServer.csproj +++ b/src/Components/Blazor/DevServer/src/Microsoft.AspNetCore.Blazor.DevServer.csproj @@ -33,6 +33,7 @@ + diff --git a/src/Components/Blazor/DevServer/src/Microsoft.AspNetCore.Blazor.DevServer.nuspec b/src/Components/Blazor/DevServer/src/Microsoft.AspNetCore.Blazor.DevServer.nuspec index 5142ba2080b8..b59725fc14f3 100644 --- a/src/Components/Blazor/DevServer/src/Microsoft.AspNetCore.Blazor.DevServer.nuspec +++ b/src/Components/Blazor/DevServer/src/Microsoft.AspNetCore.Blazor.DevServer.nuspec @@ -2,10 +2,12 @@ $CommonMetadataElements$ + packageIcon.png + diff --git a/src/Components/Blazor/Server/src/MonoDebugProxy/BlazorMonoDebugProxyAppBuilderExtensions.cs b/src/Components/Blazor/Server/src/MonoDebugProxy/BlazorMonoDebugProxyAppBuilderExtensions.cs index 7a1edc2d8ccd..533cd9939985 100644 --- a/src/Components/Blazor/Server/src/MonoDebugProxy/BlazorMonoDebugProxyAppBuilderExtensions.cs +++ b/src/Components/Blazor/Server/src/MonoDebugProxy/BlazorMonoDebugProxyAppBuilderExtensions.cs @@ -3,6 +3,8 @@ using System; using System.Collections.Generic; +using System.Diagnostics; +using System.IO; using System.Linq; using System.Net; using System.Net.Http; @@ -89,19 +91,26 @@ private static async Task DebugHome(HttpContext context) } catch (Exception ex) { - await context.Response.WriteAsync($@" -

Unable to find debuggable browser tab

-

- Could not get a list of browser tabs from {debuggerTabsListUrl}. - Ensure Chrome is running with debugging enabled. -

-

Resolution

+

Unable to find debuggable browser tab

+

+ Could not get a list of browser tabs from {debuggerTabsListUrl}. + Ensure your browser is running with debugging enabled. +

+

Resolution

+

+

If you are using Google Chrome for your development, follow these instructions:

{GetLaunchChromeInstructions(appRootUrl)} -

... then use that new tab for debugging.

-

Underlying exception:

-
{ex}
-"); +

+

+

If you are using Microsoft Edge (Chromium) for your development, follow these instructions:

+ {GetLaunchEdgeInstructions(appRootUrl)} +

+This should launch a new browser window with debugging enabled..

+

Underlying exception:

+
{ex}
+ "); + return; } @@ -144,20 +153,42 @@ There is more than one browser tab at {targetTabUrl}. private static string GetLaunchChromeInstructions(string appRootUrl) { + var profilePath = Path.Combine(Path.GetTempPath(), "blazor-edge-debug"); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { - return $@"

Close all Chrome instances, then press Win+R and enter the following:

-

""%programfiles(x86)%\Google\Chrome\Application\chrome.exe"" --remote-debugging-port=9222 {appRootUrl}

"; + return $@"

Press Win+R and enter the following:

+

chrome --remote-debugging-port=9222 --user-data-dir=""{profilePath}"" {appRootUrl}

"; } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { - return $@"

Close all Chrome instances, then in a terminal window execute the following:

-

google-chrome --remote-debugging-port=9222 {appRootUrl}

"; + return $@"

In a terminal window execute the following:

+

google-chrome --remote-debugging-port=9222 --user-data-dir={profilePath} {appRootUrl}

"; + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + return $@"

Execute the following:

+

open /Applications/Google\ Chrome.app --args --remote-debugging-port=9222 --user-data-dir={profilePath} {appRootUrl}

"; + } + else + { + throw new InvalidOperationException("Unknown OS platform"); + } + } + + private static string GetLaunchEdgeInstructions(string appRootUrl) + { + var profilePath = Path.Combine(Path.GetTempPath(), "blazor-chrome-debug"); + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + return $@"

Press Win+R and enter the following:

+

msedge --remote-debugging-port=9222 --user-data-dir=""{profilePath}"" {appRootUrl}

"; } else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { - return $@"

Close all Chrome instances, then in a terminal window execute the following:

-

open /Applications/Google\ Chrome.app --args --remote-debugging-port=9222 {appRootUrl}

"; + return $@"

In a terminal window execute the following:

+

open /Applications/Microsoft\ Edge\ Dev.app --args --remote-debugging-port=9222 --user-data-dir={profilePath} {appRootUrl}

"; } else { diff --git a/src/Components/Blazor/Templates/src/Microsoft.AspNetCore.Blazor.Templates.csproj b/src/Components/Blazor/Templates/src/Microsoft.AspNetCore.Blazor.Templates.csproj index c91a32128d65..640d8f21d07c 100644 --- a/src/Components/Blazor/Templates/src/Microsoft.AspNetCore.Blazor.Templates.csproj +++ b/src/Components/Blazor/Templates/src/Microsoft.AspNetCore.Blazor.Templates.csproj @@ -15,6 +15,10 @@ false + + + + diff --git a/src/Components/Blazor/Templates/src/Microsoft.AspNetCore.Blazor.Templates.nuspec b/src/Components/Blazor/Templates/src/Microsoft.AspNetCore.Blazor.Templates.nuspec index 70b93d725348..cde7bc4c1fdb 100644 --- a/src/Components/Blazor/Templates/src/Microsoft.AspNetCore.Blazor.Templates.nuspec +++ b/src/Components/Blazor/Templates/src/Microsoft.AspNetCore.Blazor.Templates.nuspec @@ -5,11 +5,13 @@ + packageIcon.png + diff --git a/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Client/Shared/SurveyPrompt.razor b/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Client/Shared/SurveyPrompt.razor index 168aafe54252..2b7b716c201e 100644 --- a/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Client/Shared/SurveyPrompt.razor +++ b/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Client/Shared/SurveyPrompt.razor @@ -4,7 +4,7 @@ Please take our - brief survey + brief survey and tell us what you think. diff --git a/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Client/wwwroot/css/site.css b/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Client/wwwroot/css/site.css index fa2c7f19b7d6..4e4425c9b3d0 100644 --- a/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Client/wwwroot/css/site.css +++ b/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Client/wwwroot/css/site.css @@ -4,6 +4,16 @@ html, body { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; } +a, .btn-link { + color: #0366d6; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + app { position: relative; display: flex; @@ -21,10 +31,21 @@ app { } .main .top-row { - background-color: #e6e6e6; + background-color: #f7f7f7; border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; } + .main .top-row > a, .main .top-row .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + } + +.main .top-row a:first-child { + overflow: hidden; + text-overflow: ellipsis; +} + .sidebar { background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); } @@ -44,38 +65,38 @@ app { top: -2px; } -.nav-item { - font-size: 0.9rem; - padding-bottom: 0.5rem; -} - - .nav-item:first-of-type { - padding-top: 1rem; - } - - .nav-item:last-of-type { - padding-bottom: 1rem; + .sidebar .nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; } - .nav-item a { - color: #d7d7d7; - border-radius: 4px; - height: 3rem; - display: flex; - align-items: center; - line-height: 3rem; - } + .sidebar .nav-item:first-of-type { + padding-top: 1rem; + } - .nav-item a.active { - background-color: rgba(255,255,255,0.25); - color: white; + .sidebar .nav-item:last-of-type { + padding-bottom: 1rem; } - .nav-item a:hover { - background-color: rgba(255,255,255,0.1); - color: white; + .sidebar .nav-item a { + color: #d7d7d7; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; } + .sidebar .nav-item a.active { + background-color: rgba(255,255,255,0.25); + color: white; + } + + .sidebar .nav-item a:hover { + background-color: rgba(255,255,255,0.1); + color: white; + } + .content { padding-top: 1.1rem; } @@ -96,10 +117,37 @@ app { color: red; } +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + +#blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; +} + @media (max-width: 767.98px) { - .main .top-row { + .main .top-row:not(.auth) { display: none; } + + .main .top-row.auth { + justify-content: space-between; + } + + .main .top-row a, .main .top-row .btn-link { + margin-left: 0; + } } @media (min-width: 768px) { diff --git a/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Client/wwwroot/index.html b/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Client/wwwroot/index.html index 5ca6c3f6e669..586253b52cb8 100644 --- a/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Client/wwwroot/index.html +++ b/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Client/wwwroot/index.html @@ -1,5 +1,6 @@ + @@ -8,9 +9,16 @@ + Loading... +
+ An unhandled error has occurred. + Reload + 🗙 +
+ diff --git a/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Server/BlazorWasm-CSharp.Server.csproj b/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Server/BlazorWasm-CSharp.Server.csproj index eb9834dd9b1c..2742595431f2 100644 --- a/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Server/BlazorWasm-CSharp.Server.csproj +++ b/src/Components/Blazor/Templates/src/content/BlazorWasm-CSharp/Server/BlazorWasm-CSharp.Server.csproj @@ -1,7 +1,7 @@  - $(DefaultNetCoreTargetFramework) + netcoreapp3.1 7.3 diff --git a/src/Components/Blazor/Validation/src/ComparePropertyAttribute.cs b/src/Components/Blazor/Validation/src/ComparePropertyAttribute.cs new file mode 100644 index 000000000000..3f74ce647f37 --- /dev/null +++ b/src/Components/Blazor/Validation/src/ComparePropertyAttribute.cs @@ -0,0 +1,34 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace System.ComponentModel.DataAnnotations +{ + /// + /// A that compares two properties + /// + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] + public sealed class ComparePropertyAttribute : CompareAttribute + { + /// + /// Initializes a new instance of . + /// + /// The property to compare with the current property. + public ComparePropertyAttribute(string otherProperty) + : base(otherProperty) + { + } + + /// + protected override ValidationResult IsValid(object value, ValidationContext validationContext) + { + var validationResult = base.IsValid(value, validationContext); + if (validationResult == ValidationResult.Success) + { + return validationResult; + } + + return new ValidationResult(validationResult.ErrorMessage, new[] { validationContext.MemberName }); + } + } +} + diff --git a/src/Components/Blazor/Validation/src/Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.csproj b/src/Components/Blazor/Validation/src/Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.csproj new file mode 100644 index 000000000000..a166d5f1f3d1 --- /dev/null +++ b/src/Components/Blazor/Validation/src/Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.csproj @@ -0,0 +1,18 @@ + + + + netstandard2.0 + Provides experimental support for validation using DataAnnotations. + true + false + + + + + + + + + + + diff --git a/src/Components/Blazor/Validation/src/ObjectGraphDataAnnotationsValidator.cs b/src/Components/Blazor/Validation/src/ObjectGraphDataAnnotationsValidator.cs new file mode 100644 index 000000000000..df1971e0a200 --- /dev/null +++ b/src/Components/Blazor/Validation/src/ObjectGraphDataAnnotationsValidator.cs @@ -0,0 +1,125 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; + +namespace Microsoft.AspNetCore.Components.Forms +{ + public class ObjectGraphDataAnnotationsValidator : ComponentBase + { + private static readonly object ValidationContextValidatorKey = new object(); + private static readonly object ValidatedObjectsKey = new object(); + private ValidationMessageStore _validationMessageStore; + + [CascadingParameter] + internal EditContext EditContext { get; set; } + + protected override void OnInitialized() + { + _validationMessageStore = new ValidationMessageStore(EditContext); + + // Perform object-level validation (starting from the root model) on request + EditContext.OnValidationRequested += (sender, eventArgs) => + { + _validationMessageStore.Clear(); + ValidateObject(EditContext.Model, new HashSet()); + EditContext.NotifyValidationStateChanged(); + }; + + // Perform per-field validation on each field edit + EditContext.OnFieldChanged += (sender, eventArgs) => + ValidateField(EditContext, _validationMessageStore, eventArgs.FieldIdentifier); + } + + internal void ValidateObject(object value, HashSet visited) + { + if (value is null) + { + return; + } + + if (!visited.Add(value)) + { + // Already visited this object. + return; + } + + if (value is IEnumerable enumerable) + { + var index = 0; + foreach (var item in enumerable) + { + ValidateObject(item, visited); + index++; + } + + return; + } + + var validationResults = new List(); + ValidateObject(value, visited, validationResults); + + // Transfer results to the ValidationMessageStore + foreach (var validationResult in validationResults) + { + if (!validationResult.MemberNames.Any()) + { + _validationMessageStore.Add(new FieldIdentifier(value, string.Empty), validationResult.ErrorMessage); + continue; + } + + foreach (var memberName in validationResult.MemberNames) + { + var fieldIdentifier = new FieldIdentifier(value, memberName); + _validationMessageStore.Add(fieldIdentifier, validationResult.ErrorMessage); + } + } + } + + private void ValidateObject(object value, HashSet visited, List validationResults) + { + var validationContext = new ValidationContext(value); + validationContext.Items.Add(ValidationContextValidatorKey, this); + validationContext.Items.Add(ValidatedObjectsKey, visited); + Validator.TryValidateObject(value, validationContext, validationResults, validateAllProperties: true); + } + + internal static bool TryValidateRecursive(object value, ValidationContext validationContext) + { + if (validationContext.Items.TryGetValue(ValidationContextValidatorKey, out var result) && result is ObjectGraphDataAnnotationsValidator validator) + { + var visited = (HashSet)validationContext.Items[ValidatedObjectsKey]; + validator.ValidateObject(value, visited); + + return true; + } + + return false; + } + + private static void ValidateField(EditContext editContext, ValidationMessageStore messages, in FieldIdentifier fieldIdentifier) + { + // DataAnnotations only validates public properties, so that's all we'll look for + var propertyInfo = fieldIdentifier.Model.GetType().GetProperty(fieldIdentifier.FieldName); + if (propertyInfo != null) + { + var propertyValue = propertyInfo.GetValue(fieldIdentifier.Model); + var validationContext = new ValidationContext(fieldIdentifier.Model) + { + MemberName = propertyInfo.Name + }; + var results = new List(); + + Validator.TryValidateProperty(propertyValue, validationContext, results); + messages.Clear(fieldIdentifier); + messages.Add(fieldIdentifier, results.Select(result => result.ErrorMessage)); + + // We have to notify even if there were no messages before and are still no messages now, + // because the "state" that changed might be the completion of some async validation task + editContext.NotifyValidationStateChanged(); + } + } + } +} diff --git a/src/Components/Blazor/Validation/src/ValidateComplexTypeAttribute.cs b/src/Components/Blazor/Validation/src/ValidateComplexTypeAttribute.cs new file mode 100644 index 000000000000..4769d84767ad --- /dev/null +++ b/src/Components/Blazor/Validation/src/ValidateComplexTypeAttribute.cs @@ -0,0 +1,30 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNetCore.Components.Forms; + +namespace System.ComponentModel.DataAnnotations +{ + /// + /// A that indicates that the property is a complex or collection type that further needs to be validated. + /// + /// By default does not recurse in to complex property types during validation. + /// When used in conjunction with , this property allows the validation system to validate + /// complex or collection type properties. + /// + /// + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] + public sealed class ValidateComplexTypeAttribute : ValidationAttribute + { + /// + protected override ValidationResult IsValid(object value, ValidationContext validationContext) + { + if (!ObjectGraphDataAnnotationsValidator.TryValidateRecursive(value, validationContext)) + { + throw new InvalidOperationException($"{nameof(ValidateComplexTypeAttribute)} can only used with {nameof(ObjectGraphDataAnnotationsValidator)}."); + } + + return ValidationResult.Success; + } + } +} diff --git a/src/Components/Blazor/Validation/test/Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.Tests.csproj b/src/Components/Blazor/Validation/test/Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.Tests.csproj new file mode 100644 index 000000000000..02e85615362b --- /dev/null +++ b/src/Components/Blazor/Validation/test/Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.Tests.csproj @@ -0,0 +1,11 @@ + + + + $(DefaultNetCoreTargetFramework) + + + + + + + diff --git a/src/Components/Blazor/Validation/test/ObjectGraphDataAnnotationsValidatorTest.cs b/src/Components/Blazor/Validation/test/ObjectGraphDataAnnotationsValidatorTest.cs new file mode 100644 index 000000000000..6703eb35d540 --- /dev/null +++ b/src/Components/Blazor/Validation/test/ObjectGraphDataAnnotationsValidatorTest.cs @@ -0,0 +1,540 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using Microsoft.AspNetCore.Components.Forms; +using Xunit; + +namespace Microsoft.AspNetCore.Components +{ + public class ObjectGraphDataAnnotationsValidatorTest + { + public class SimpleModel + { + [Required] + public string Name { get; set; } + + [Range(1, 16)] + public int Age { get; set; } + } + + [Fact] + public void ValidateObject_SimpleObject() + { + var model = new SimpleModel + { + Age = 23, + }; + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(() => model.Name); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => model.Age); + Assert.Single(messages); + + Assert.Equal(2, editContext.GetValidationMessages().Count()); + } + + [Fact] + public void ValidateObject_SimpleObject_AllValid() + { + var model = new SimpleModel { Name = "Test", Age = 5 }; + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(() => model.Name); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => model.Age); + Assert.Empty(messages); + + Assert.Empty(editContext.GetValidationMessages()); + } + + public class ModelWithComplexProperty + { + [Required] + public string Property1 { get; set; } + + [ValidateComplexType] + public SimpleModel SimpleModel { get; set; } + } + + [Fact] + public void ValidateObject_NullComplexProperty() + { + var model = new ModelWithComplexProperty(); + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(() => model.Property1); + Assert.Single(messages); + + Assert.Single(editContext.GetValidationMessages()); + } + + [Fact] + public void ValidateObject_ModelWithComplexProperties() + { + var model = new ModelWithComplexProperty { SimpleModel = new SimpleModel() }; + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(() => model.Property1); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => model.SimpleModel); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => model.SimpleModel.Age); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => model.SimpleModel.Name); + Assert.Single(messages); + + Assert.Equal(3, editContext.GetValidationMessages().Count()); + } + + [Fact] + public void ValidateObject_ModelWithComplexProperties_SomeValid() + { + var model = new ModelWithComplexProperty + { + Property1 = "Value", + SimpleModel = new SimpleModel { Name = "Some Value" }, + }; + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(() => model.Property1); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => model.SimpleModel); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => model.SimpleModel.Age); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => model.SimpleModel.Name); + Assert.Empty(messages); + + Assert.Single(editContext.GetValidationMessages()); + } + + public class TestValidatableObject : IValidatableObject + { + [Required] + public string Name { get; set; } + + public IEnumerable Validate(ValidationContext validationContext) + { + yield return new ValidationResult("Custom validation error"); + } + } + + public class ModelWithValidatableComplexProperty + { + [Required] + public string Property1 { get; set; } + + [ValidateComplexType] + public TestValidatableObject Property2 { get; set; } = new TestValidatableObject(); + } + + [Fact] + public void ValidateObject_ValidatableComplexProperty() + { + var model = new ModelWithValidatableComplexProperty(); + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(() => model.Property1); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => model.Property2); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => model.Property2.Name); + Assert.Single(messages); + + Assert.Equal(2, editContext.GetValidationMessages().Count()); + } + + [Fact] + public void ValidateObject_ValidatableComplexProperty_ValidatesIValidatableProperty() + { + var model = new ModelWithValidatableComplexProperty + { + Property2 = new TestValidatableObject { Name = "test" }, + }; + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(() => model.Property1); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(new FieldIdentifier(model.Property2, string.Empty)); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => model.Property2.Name); + Assert.Empty(messages); + + Assert.Equal(2, editContext.GetValidationMessages().Count()); + } + + [Fact] + public void ValidateObject_ModelIsIValidatable_PropertyHasError() + { + var model = new TestValidatableObject(); + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(new FieldIdentifier(model, string.Empty)); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => model.Name); + Assert.Single(messages); + + Assert.Single(editContext.GetValidationMessages()); + } + + [Fact] + public void ValidateObject_ModelIsIValidatable_ModelHasError() + { + var model = new TestValidatableObject { Name = "test" }; + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(new FieldIdentifier(model, string.Empty)); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => model.Name); + Assert.Empty(messages); + + Assert.Single(editContext.GetValidationMessages()); + } + + [Fact] + public void ValidateObject_CollectionModel() + { + var model = new List + { + new SimpleModel(), + new SimpleModel { Name = "test", }, + }; + + var editContext = Validate(model); + + var item = model[0]; + var messages = editContext.GetValidationMessages(new FieldIdentifier(model, "0")); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => item.Name); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => item.Age); + Assert.Single(messages); + + item = model[1]; + messages = editContext.GetValidationMessages(new FieldIdentifier(model, "1")); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => item.Name); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => item.Age); + Assert.Single(messages); + + Assert.Equal(3, editContext.GetValidationMessages().Count()); + } + + [Fact] + public void ValidateObject_CollectionValidatableModel() + { + var model = new List + { + new TestValidatableObject(), + new TestValidatableObject { Name = "test", }, + }; + + var editContext = Validate(model); + + var item = model[0]; + var messages = editContext.GetValidationMessages(() => item.Name); + Assert.Single(messages); + + item = model[1]; + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => item.Name); + Assert.Empty(messages); + + Assert.Equal(2, editContext.GetValidationMessages().Count()); + } + + private class Level1Validation + { + [ValidateComplexType] + public Level2Validation Level2 { get; set; } + } + + public class Level2Validation + { + [ValidateComplexType] + public SimpleModel Level3 { get; set; } + } + + [Fact] + public void ValidateObject_ManyLevels() + { + var model = new Level1Validation + { + Level2 = new Level2Validation + { + Level3 = new SimpleModel + { + Age = 47, + } + } + }; + + var editContext = Validate(model); + var level3 = model.Level2.Level3; + + var messages = editContext.GetValidationMessages(() => level3.Name); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => level3.Age); + Assert.Single(messages); + + Assert.Equal(2, editContext.GetValidationMessages().Count()); + } + + private class Person + { + [Required] + public string Name { get; set; } + + [ValidateComplexType] + public Person Related { get; set; } + } + + [Fact] + public void ValidateObject_RecursiveRelation() + { + var model = new Person { Related = new Person() }; + model.Related.Related = model; + + var editContext = Validate(model); + + var messages = editContext.GetValidationMessages(() => model.Name); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => model.Related.Name); + Assert.Single(messages); + + Assert.Equal(2, editContext.GetValidationMessages().Count()); + } + + [Fact] + public void ValidateObject_RecursiveRelation_OverManySteps() + { + var person1 = new Person(); + var person2 = new Person { Name = "Valid name" }; + var person3 = new Person(); + var person4 = new Person(); + + person1.Related = person2; + person2.Related = person3; + person3.Related = person4; + person4.Related = person1; + + var editContext = Validate(person1); + + var messages = editContext.GetValidationMessages(() => person1.Name); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => person2.Name); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => person3.Name); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => person4.Name); + Assert.Single(messages); + + Assert.Equal(3, editContext.GetValidationMessages().Count()); + } + + private class Node + { + [Required] + public string Id { get; set; } + + [ValidateComplexType] + public List Related { get; set; } = new List(); + } + + [Fact] + public void ValidateObject_RecursiveRelation_ViaCollection() + { + var node1 = new Node(); + var node2 = new Node { Id = "Valid Id" }; + var node3 = new Node(); + node1.Related.Add(node2); + node2.Related.Add(node3); + node3.Related.Add(node1); + + var editContext = Validate(node1); + + var messages = editContext.GetValidationMessages(() => node1.Id); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => node2.Id); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => node3.Id); + Assert.Single(messages); + + Assert.Equal(2, editContext.GetValidationMessages().Count()); + } + + [Fact] + public void ValidateObject_RecursiveRelation_InCollection() + { + var person1 = new Person(); + var person2 = new Person { Name = "Valid name" }; + var person3 = new Person(); + var person4 = new Person(); + + person1.Related = person2; + person2.Related = person3; + person3.Related = person4; + person4.Related = person1; + + var editContext = Validate(person1); + + var messages = editContext.GetValidationMessages(() => person1.Name); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => person2.Name); + Assert.Empty(messages); + + messages = editContext.GetValidationMessages(() => person3.Name); + Assert.Single(messages); + + messages = editContext.GetValidationMessages(() => person4.Name); + Assert.Single(messages); + + Assert.Equal(3, editContext.GetValidationMessages().Count()); + } + + [Fact] + public void ValidateField_PropertyValid() + { + var model = new SimpleModel { Age = 1 }; + var fieldIdentifier = FieldIdentifier.Create(() => model.Age); + + var editContext = ValidateField(model, fieldIdentifier); + var messages = editContext.GetValidationMessages(fieldIdentifier); + Assert.Empty(messages); + + Assert.Empty(editContext.GetValidationMessages()); + } + + [Fact] + public void ValidateField_PropertyInvalid() + { + var model = new SimpleModel { Age = 42 }; + var fieldIdentifier = FieldIdentifier.Create(() => model.Age); + + var editContext = ValidateField(model, fieldIdentifier); + var messages = editContext.GetValidationMessages(fieldIdentifier); + Assert.Single(messages); + + Assert.Single(editContext.GetValidationMessages()); + } + + [Fact] + public void ValidateField_AfterSubmitValidation() + { + var model = new SimpleModel { Age = 42 }; + var fieldIdentifier = FieldIdentifier.Create(() => model.Age); + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(fieldIdentifier); + Assert.Single(messages); + + Assert.Equal(2, editContext.GetValidationMessages().Count()); + + model.Age = 4; + + editContext.NotifyFieldChanged(fieldIdentifier); + messages = editContext.GetValidationMessages(fieldIdentifier); + Assert.Empty(messages); + + Assert.Single(editContext.GetValidationMessages()); + } + + [Fact] + public void ValidateField_ModelWithComplexProperty() + { + var model = new ModelWithComplexProperty + { + SimpleModel = new SimpleModel { Age = 1 }, + }; + var fieldIdentifier = FieldIdentifier.Create(() => model.SimpleModel.Name); + + var editContext = ValidateField(model, fieldIdentifier); + var messages = editContext.GetValidationMessages(fieldIdentifier); + Assert.Single(messages); + + Assert.Single(editContext.GetValidationMessages()); + } + + [Fact] + public void ValidateField_ModelWithComplexProperty_AfterSubmitValidation() + { + var model = new ModelWithComplexProperty + { + Property1 = "test", + SimpleModel = new SimpleModel { Age = 29, Name = "Test" }, + }; + var fieldIdentifier = FieldIdentifier.Create(() => model.SimpleModel.Age); + + var editContext = Validate(model); + var messages = editContext.GetValidationMessages(fieldIdentifier); + Assert.Single(messages); + + model.SimpleModel.Age = 9; + editContext.NotifyFieldChanged(fieldIdentifier); + + messages = editContext.GetValidationMessages(fieldIdentifier); + Assert.Empty(messages); + Assert.Empty(editContext.GetValidationMessages()); + } + + private static EditContext Validate(object model) + { + var editContext = new EditContext(model); + var validator = new TestObjectGraphDataAnnotationsValidator { EditContext = editContext, }; + validator.OnInitialized(); + + editContext.Validate(); + + return editContext; + } + + private static EditContext ValidateField(object model, in FieldIdentifier field) + { + var editContext = new EditContext(model); + var validator = new TestObjectGraphDataAnnotationsValidator { EditContext = editContext, }; + validator.OnInitialized(); + + editContext.NotifyFieldChanged(field); + + return editContext; + } + + private class TestObjectGraphDataAnnotationsValidator : ObjectGraphDataAnnotationsValidator + { + public new void OnInitialized() => base.OnInitialized(); + } + } +} diff --git a/src/Components/Blazor/testassets/StandaloneApp/wwwroot/css/site.css b/src/Components/Blazor/testassets/StandaloneApp/wwwroot/css/site.css index fa2c7f19b7d6..c15c2e155636 100644 --- a/src/Components/Blazor/testassets/StandaloneApp/wwwroot/css/site.css +++ b/src/Components/Blazor/testassets/StandaloneApp/wwwroot/css/site.css @@ -1,9 +1,19 @@ -@import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); +@import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); html, body { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; } +a, .btn-link { + color: #0366d6; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + app { position: relative; display: flex; @@ -21,10 +31,21 @@ app { } .main .top-row { - background-color: #e6e6e6; + background-color: #f7f7f7; border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; } + .main .top-row > a, .main .top-row .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + } + +.main .top-row a:first-child { + overflow: hidden; + text-overflow: ellipsis; +} + .sidebar { background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); } @@ -44,38 +65,38 @@ app { top: -2px; } -.nav-item { - font-size: 0.9rem; - padding-bottom: 0.5rem; -} - - .nav-item:first-of-type { - padding-top: 1rem; - } - - .nav-item:last-of-type { - padding-bottom: 1rem; + .sidebar .nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; } - .nav-item a { - color: #d7d7d7; - border-radius: 4px; - height: 3rem; - display: flex; - align-items: center; - line-height: 3rem; - } + .sidebar .nav-item:first-of-type { + padding-top: 1rem; + } - .nav-item a.active { - background-color: rgba(255,255,255,0.25); - color: white; + .sidebar .nav-item:last-of-type { + padding-bottom: 1rem; } - .nav-item a:hover { - background-color: rgba(255,255,255,0.1); - color: white; + .sidebar .nav-item a { + color: #d7d7d7; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; } + .sidebar .nav-item a.active { + background-color: rgba(255,255,255,0.25); + color: white; + } + + .sidebar .nav-item a:hover { + background-color: rgba(255,255,255,0.1); + color: white; + } + .content { padding-top: 1.1rem; } @@ -96,10 +117,37 @@ app { color: red; } +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + +#blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; +} + @media (max-width: 767.98px) { - .main .top-row { + .main .top-row:not(.auth) { display: none; } + + .main .top-row.auth { + justify-content: space-between; + } + + .main .top-row a, .main .top-row .btn-link { + margin-left: 0; + } } @media (min-width: 768px) { diff --git a/src/Components/Components.sln b/src/Components/Components.sln index 046fc0b7cab5..ba0b2476ffb3 100644 --- a/src/Components/Components.sln +++ b/src/Components/Components.sln @@ -240,6 +240,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ignitor", "Ignitor\src\Igni EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ignitor.Test", "Ignitor\test\Ignitor.Test.csproj", "{F31E8118-014E-4CCE-8A48-5282F7B9BB3E}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Validation", "Validation", "{FD9BD646-9D50-42ED-A3E1-90558BA0C6B2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Blazor.DataAnnotations.Validation", "Blazor\Validation\src\Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.csproj", "{B70F90C7-2696-4050-B24E-BF0308F4E059}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.Tests", "Blazor\Validation\test\Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.Tests.csproj", "{A5617A9D-C71E-44DE-936C-27611EB40A02}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1486,6 +1492,30 @@ Global {F31E8118-014E-4CCE-8A48-5282F7B9BB3E}.Release|x64.Build.0 = Release|Any CPU {F31E8118-014E-4CCE-8A48-5282F7B9BB3E}.Release|x86.ActiveCfg = Release|Any CPU {F31E8118-014E-4CCE-8A48-5282F7B9BB3E}.Release|x86.Build.0 = Release|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Debug|x64.ActiveCfg = Debug|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Debug|x64.Build.0 = Debug|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Debug|x86.ActiveCfg = Debug|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Debug|x86.Build.0 = Debug|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Release|Any CPU.Build.0 = Release|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Release|x64.ActiveCfg = Release|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Release|x64.Build.0 = Release|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Release|x86.ActiveCfg = Release|Any CPU + {B70F90C7-2696-4050-B24E-BF0308F4E059}.Release|x86.Build.0 = Release|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Debug|x64.ActiveCfg = Debug|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Debug|x64.Build.0 = Debug|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Debug|x86.ActiveCfg = Debug|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Debug|x86.Build.0 = Debug|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Release|Any CPU.Build.0 = Release|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Release|x64.ActiveCfg = Release|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Release|x64.Build.0 = Release|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Release|x86.ActiveCfg = Release|Any CPU + {A5617A9D-C71E-44DE-936C-27611EB40A02}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1596,6 +1626,9 @@ Global {BBF37AF9-8290-4B70-8BA8-0F6017B3B620} = {46E4300C-5726-4108-B9A2-18BB94EB26ED} {CD0EF85C-4187-4515-A355-E5A0D4485F40} = {BDE2397D-C53A-4783-8B3A-1F54F48A6926} {F31E8118-014E-4CCE-8A48-5282F7B9BB3E} = {BDE2397D-C53A-4783-8B3A-1F54F48A6926} + {FD9BD646-9D50-42ED-A3E1-90558BA0C6B2} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF} + {B70F90C7-2696-4050-B24E-BF0308F4E059} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF} + {A5617A9D-C71E-44DE-936C-27611EB40A02} = {7260DED9-22A9-4E9D-92F4-5E8A4404DEAF} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {CC3C47E1-AD1A-4619-9CD3-E08A0148E5CE} diff --git a/src/Components/Components/ref/Microsoft.AspNetCore.Components.netcoreapp.cs b/src/Components/Components/ref/Microsoft.AspNetCore.Components.netcoreapp.cs index 72adf28aa70b..c4a48435b453 100644 --- a/src/Components/Components/ref/Microsoft.AspNetCore.Components.netcoreapp.cs +++ b/src/Components/Components/ref/Microsoft.AspNetCore.Components.netcoreapp.cs @@ -207,7 +207,10 @@ public readonly partial struct EventCallback public sealed partial class EventHandlerAttribute : System.Attribute { public EventHandlerAttribute(string attributeName, System.Type eventArgsType) { } + public EventHandlerAttribute(string attributeName, System.Type eventArgsType, bool enableStopPropagation, bool enablePreventDefault) { } public string AttributeName { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } + public bool EnablePreventDefault { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } + public bool EnableStopPropagation { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } public System.Type EventArgsType { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } } public partial interface IComponent diff --git a/src/Components/Components/ref/Microsoft.AspNetCore.Components.netstandard2.0.cs b/src/Components/Components/ref/Microsoft.AspNetCore.Components.netstandard2.0.cs index 72adf28aa70b..c4a48435b453 100644 --- a/src/Components/Components/ref/Microsoft.AspNetCore.Components.netstandard2.0.cs +++ b/src/Components/Components/ref/Microsoft.AspNetCore.Components.netstandard2.0.cs @@ -207,7 +207,10 @@ public readonly partial struct EventCallback public sealed partial class EventHandlerAttribute : System.Attribute { public EventHandlerAttribute(string attributeName, System.Type eventArgsType) { } + public EventHandlerAttribute(string attributeName, System.Type eventArgsType, bool enableStopPropagation, bool enablePreventDefault) { } public string AttributeName { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } + public bool EnablePreventDefault { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } + public bool EnableStopPropagation { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } public System.Type EventArgsType { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } } } public partial interface IComponent diff --git a/src/Components/Components/src/EventHandlerAttribute.cs b/src/Components/Components/src/EventHandlerAttribute.cs index 767b3c5b2a8d..67307fb9efe5 100644 --- a/src/Components/Components/src/EventHandlerAttribute.cs +++ b/src/Components/Components/src/EventHandlerAttribute.cs @@ -16,7 +16,18 @@ public sealed class EventHandlerAttribute : Attribute /// /// /// - public EventHandlerAttribute(string attributeName, Type eventArgsType) + public EventHandlerAttribute(string attributeName, Type eventArgsType) : this(attributeName, eventArgsType, false, false) + { + } + + /// + /// Constructs an instance of . + /// + /// + /// + /// + /// + public EventHandlerAttribute(string attributeName, Type eventArgsType, bool enableStopPropagation, bool enablePreventDefault) { if (attributeName == null) { @@ -30,6 +41,8 @@ public EventHandlerAttribute(string attributeName, Type eventArgsType) AttributeName = attributeName; EventArgsType = eventArgsType; + EnableStopPropagation = enableStopPropagation; + EnablePreventDefault = enablePreventDefault; } /// @@ -41,5 +54,15 @@ public EventHandlerAttribute(string attributeName, Type eventArgsType) /// Gets the event argument type. /// public Type EventArgsType { get; } + + /// + /// Gets the event's ability to stop propagation. + /// + public bool EnableStopPropagation { get; } + + /// + /// Gets the event's ability to prevent default event flow. + /// + public bool EnablePreventDefault { get; } } } diff --git a/src/Components/Components/src/Microsoft.AspNetCore.Components.csproj b/src/Components/Components/src/Microsoft.AspNetCore.Components.csproj index 68d1e48c8e00..5fe8fe7f361a 100644 --- a/src/Components/Components/src/Microsoft.AspNetCore.Components.csproj +++ b/src/Components/Components/src/Microsoft.AspNetCore.Components.csproj @@ -23,6 +23,14 @@ + + + + + + + + + diff --git a/src/Components/Components/src/Microsoft.AspNetCore.Components.multitarget.nuspec b/src/Components/Components/src/Microsoft.AspNetCore.Components.multitarget.nuspec index 3c4fee8be5c0..ada9186afa78 100644 --- a/src/Components/Components/src/Microsoft.AspNetCore.Components.multitarget.nuspec +++ b/src/Components/Components/src/Microsoft.AspNetCore.Components.multitarget.nuspec @@ -15,11 +15,13 @@ + packageIcon.png + diff --git a/src/Components/Components/src/Microsoft.AspNetCore.Components.netcoreapp.nuspec b/src/Components/Components/src/Microsoft.AspNetCore.Components.netcoreapp.nuspec index 80f61e7f1770..3d1738ac21ba 100644 --- a/src/Components/Components/src/Microsoft.AspNetCore.Components.netcoreapp.nuspec +++ b/src/Components/Components/src/Microsoft.AspNetCore.Components.netcoreapp.nuspec @@ -9,11 +9,13 @@ + packageIcon.png + diff --git a/src/Components/ComponentsNoDeps.slnf b/src/Components/ComponentsNoDeps.slnf index ce01e6468f2e..09f6a0859f95 100644 --- a/src/Components/ComponentsNoDeps.slnf +++ b/src/Components/ComponentsNoDeps.slnf @@ -15,6 +15,8 @@ "Blazor\\Http\\test\\Microsoft.AspNetCore.Blazor.HttpClient.Tests.csproj", "Blazor\\Server\\src\\Microsoft.AspNetCore.Blazor.Server.csproj", "Blazor\\Templates\\src\\Microsoft.AspNetCore.Blazor.Templates.csproj", + "Blazor\\Validation\\src\\Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.csproj", + "Blazor\\Validation\\test\\Microsoft.AspNetCore.Blazor.DataAnnotations.Validation.Tests.csproj", "Blazor\\testassets\\HostedInAspNet.Client\\HostedInAspNet.Client.csproj", "Blazor\\testassets\\HostedInAspNet.Server\\HostedInAspNet.Server.csproj", "Blazor\\testassets\\Microsoft.AspNetCore.Blazor.E2EPerformance\\Microsoft.AspNetCore.Blazor.E2EPerformance.csproj", diff --git a/src/Components/Forms/src/EditContextDataAnnotationsExtensions.cs b/src/Components/Forms/src/EditContextDataAnnotationsExtensions.cs index 9fce473a415f..e7f9d5f15507 100644 --- a/src/Components/Forms/src/EditContextDataAnnotationsExtensions.cs +++ b/src/Components/Forms/src/EditContextDataAnnotationsExtensions.cs @@ -52,6 +52,12 @@ private static void ValidateModel(EditContext editContext, ValidationMessageStor messages.Clear(); foreach (var validationResult in validationResults) { + if (!validationResult.MemberNames.Any()) + { + messages.Add(new FieldIdentifier(editContext.Model, fieldName: string.Empty), validationResult.ErrorMessage); + continue; + } + foreach (var memberName in validationResult.MemberNames) { messages.Add(editContext.Field(memberName), validationResult.ErrorMessage); diff --git a/src/Components/Ignitor/src/Ignitor.csproj b/src/Components/Ignitor/src/Ignitor.csproj index d2fce7263e3e..2b139eb30f45 100644 --- a/src/Components/Ignitor/src/Ignitor.csproj +++ b/src/Components/Ignitor/src/Ignitor.csproj @@ -1,7 +1,8 @@  - $(DefaultNetCoreTargetFramework) + + netcoreapp3.0 true false false diff --git a/src/Components/Samples/BlazorServerApp/BlazorServerApp.csproj b/src/Components/Samples/BlazorServerApp/BlazorServerApp.csproj index 101fe45c133b..2a82b7453aa5 100644 --- a/src/Components/Samples/BlazorServerApp/BlazorServerApp.csproj +++ b/src/Components/Samples/BlazorServerApp/BlazorServerApp.csproj @@ -12,6 +12,7 @@ + diff --git a/src/Components/Samples/BlazorServerApp/Pages/Index.razor b/src/Components/Samples/BlazorServerApp/Pages/Index.razor index 16dac3192520..e6a33ccd4367 100644 --- a/src/Components/Samples/BlazorServerApp/Pages/Index.razor +++ b/src/Components/Samples/BlazorServerApp/Pages/Index.razor @@ -1,4 +1,4 @@ -@page "/" +@page "/"

Hello, world!

diff --git a/src/Components/Samples/BlazorServerApp/Pages/_Host.cshtml b/src/Components/Samples/BlazorServerApp/Pages/_Host.cshtml index 7818ea3afd3a..1c35c6954a47 100644 --- a/src/Components/Samples/BlazorServerApp/Pages/_Host.cshtml +++ b/src/Components/Samples/BlazorServerApp/Pages/_Host.cshtml @@ -13,10 +13,16 @@ - - @(await Html.RenderComponentAsync(RenderMode.ServerPrerendered)) - + - + + diff --git a/src/Components/Samples/BlazorServerApp/Shared/MainLayout.razor b/src/Components/Samples/BlazorServerApp/Shared/MainLayout.razor index 9b5407d03bab..0efbcd4908a5 100644 --- a/src/Components/Samples/BlazorServerApp/Shared/MainLayout.razor +++ b/src/Components/Samples/BlazorServerApp/Shared/MainLayout.razor @@ -1,4 +1,4 @@ -@inherits LayoutComponentBase +@inherits LayoutComponentBase +
+ An unhandled error has occurred. + Reload + X
diff --git a/src/Components/Samples/BlazorServerApp/Shared/NavMenu.razor b/src/Components/Samples/BlazorServerApp/Shared/NavMenu.razor index 99495049acf1..f96cc8326cbe 100644 --- a/src/Components/Samples/BlazorServerApp/Shared/NavMenu.razor +++ b/src/Components/Samples/BlazorServerApp/Shared/NavMenu.razor @@ -1,4 +1,4 @@ - +
+ long: + @inputNumberLong +
decimal: @inputNumberDecimal @@ -99,8 +103,18 @@ DateTimeOffset inputTypeDateDateTimeOffset = new DateTimeOffset(new DateTime(1985, 3, 4)); int inputNumberInt = 42; + long inputNumberLong = 4200; decimal inputNumberDecimal = 4.2m; DateTime inputDateDateTime = new DateTime(1985, 3, 4); DateTimeOffset inputDateDateTimeOffset = new DateTimeOffset(new DateTime(1985, 3, 4)); + + DateTime inputTypeDateTimeLocalDateTime = new DateTime(1985, 3, 4); + DateTimeOffset inputTypeDateTimeLocalDateTimeOffset = new DateTimeOffset(new DateTime(1985, 3, 4)); + + DateTime inputTypeMonthDateTime = new DateTime(1985, 3, 4); + DateTimeOffset inputTypeMonthDateTimeOffset = new DateTimeOffset(new DateTime(1985, 3, 4)); + + DateTime inputTypeTimeDateTime = new DateTime(1985, 3, 4); + DateTimeOffset inputTypeTimeDateTimeOffset = new DateTimeOffset(new DateTime(1985, 3, 4)); } diff --git a/src/Components/test/testassets/BasicTestApp/Index.razor b/src/Components/test/testassets/BasicTestApp/Index.razor index de422dd76ad4..f836fa6c390a 100644 --- a/src/Components/test/testassets/BasicTestApp/Index.razor +++ b/src/Components/test/testassets/BasicTestApp/Index.razor @@ -1,6 +1,6 @@ @using Microsoft.AspNetCore.Components.Rendering
- Select test: + Select test: