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))
-
+
-
+
+