From da572dc43fe30070b8f943f771f9388052ca0b19 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 16 Jun 2023 13:17:04 +0000 Subject: [PATCH 01/38] Update dependencies from https://github.com/dotnet/runtime build 20230616.1 (#48849) [main] Update dependencies from dotnet/runtime --- eng/Version.Details.xml | 276 ++++++++++++++++++++-------------------- eng/Versions.props | 138 ++++++++++---------- 2 files changed, 207 insertions(+), 207 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 76b13dbca737..418d3cfea5e6 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -41,288 +41,288 @@ https://github.com/dotnet/efcore ef30eb29656f1924c289c29278192de79ea98b42 - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde https://github.com/dotnet/source-build-externals 7f9ae67f86a5adc1d9bf2f22f4bf3ec05b6d7b68 - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde https://github.com/dotnet/xdt @@ -355,9 +355,9 @@ - + https://github.com/dotnet/runtime - 171a525880315369e48c6adf6c181f98357352a5 + be6a1389c852fdc96a919769867fb3f3ddb0fbde https://github.com/dotnet/arcade diff --git a/eng/Versions.props b/eng/Versions.props index d103a72997da..1386b694e8cf 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -63,77 +63,77 @@ --> - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 - 8.0.0-preview.6.23314.15 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23316.1 8.0.0-preview.6.23315.1 8.0.0-preview.6.23315.1 From c53f18a72d047e58ce5f667773b28df4ddc202ad Mon Sep 17 00:00:00 2001 From: Safia Abdalla Date: Fri, 16 Jun 2023 09:01:34 -0700 Subject: [PATCH 02/38] Add complex form binding support to RDF (#48790) * Add complex form binding support to RDF * Address feedback from peer review --- .../Factories/CollectionConverterFactory.cs | 5 + .../ConcreteTypeCollectionConverterFactory.cs | 6 + .../TypedCollectionConverterFactory.cs | 9 + .../ComplexTypeExpressionConverterFactory.cs | 4 + ...omplexTypeExpressionConverterFactoryOfT.cs | 5 + .../Factories/ComplexTypeConverterFactory.cs | 6 +- .../ConcreteTypeDictionaryConverterFactory.cs | 6 + .../TypedDictionaryConverterFactory.cs | 5 + .../Factories/DictionaryConverterFactory.cs | 5 + .../Factories/NullableConverterFactory.cs | 5 + .../Factories/ParsableConverterFactory.cs | 5 + .../src/Binding/FormBindingHelpers.cs | 10 + .../src/Binding/FormDataMapperOptions.cs | 5 +- .../src/Binding/IFormDataConverterFactory.cs | 6 + .../src/Microsoft.AspNetCore.JsonPatch.csproj | 1 + ...icrosoft.AspNetCore.Http.Extensions.csproj | 5 + .../src/RequestDelegateFactory.cs | 58 ++++- ...RuntimeCreationTests.ComplexFormBinding.cs | 207 ++++++++++++++++++ .../RuntimeCreationTests.cs | 2 +- .../ClosedGenericMatcher.cs | 5 +- 20 files changed, 353 insertions(+), 7 deletions(-) create mode 100644 src/Components/Endpoints/src/Binding/FormBindingHelpers.cs create mode 100644 src/Http/Http.Extensions/test/RequestDelegateGenerator/RuntimeCreationTests.ComplexFormBinding.cs diff --git a/src/Components/Endpoints/src/Binding/Factories/CollectionConverterFactory.cs b/src/Components/Endpoints/src/Binding/Factories/CollectionConverterFactory.cs index 0a9c17840d0b..9ca5edcd68b4 100644 --- a/src/Components/Endpoints/src/Binding/Factories/CollectionConverterFactory.cs +++ b/src/Components/Endpoints/src/Binding/Factories/CollectionConverterFactory.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Components.Endpoints.Binding; @@ -9,6 +10,8 @@ internal class CollectionConverterFactory : IFormDataConverterFactory { public static readonly CollectionConverterFactory Instance = new(); + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public bool CanConvert(Type type, FormDataMapperOptions options) { var enumerable = ClosedGenericMatcher.ExtractGenericInterface(type, typeof(IEnumerable<>)); @@ -28,6 +31,8 @@ public bool CanConvert(Type type, FormDataMapperOptions options) return factory.CanConvert(type, options); } + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public FormDataConverter CreateConverter(Type type, FormDataMapperOptions options) { ArgumentNullException.ThrowIfNull(type); diff --git a/src/Components/Endpoints/src/Binding/Factories/Collections/ConcreteTypeCollectionConverterFactory.cs b/src/Components/Endpoints/src/Binding/Factories/Collections/ConcreteTypeCollectionConverterFactory.cs index 667a76ffe3c2..1fa3bce2837b 100644 --- a/src/Components/Endpoints/src/Binding/Factories/Collections/ConcreteTypeCollectionConverterFactory.cs +++ b/src/Components/Endpoints/src/Binding/Factories/Collections/ConcreteTypeCollectionConverterFactory.cs @@ -1,6 +1,8 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics.CodeAnalysis; + namespace Microsoft.AspNetCore.Components.Endpoints.Binding; internal class ConcreteTypeCollectionConverterFactory @@ -9,8 +11,12 @@ internal class ConcreteTypeCollectionConverterFactory public static readonly ConcreteTypeCollectionConverterFactory Instance = new(); + [UnconditionalSuppressMessage("Trimming", "IL2046", Justification = "This derived implementation doesn't require unreferenced code like other implementations of the interface.")] + [UnconditionalSuppressMessage("AOT", "IL3051", Justification = "This derived implementation doesn't use dynamic code like other implementations of the interface.")] public bool CanConvert(Type _, FormDataMapperOptions options) => true; + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public FormDataConverter CreateConverter(Type _, FormDataMapperOptions options) { // Resolve the element type converter diff --git a/src/Components/Endpoints/src/Binding/Factories/Collections/TypedCollectionConverterFactory.cs b/src/Components/Endpoints/src/Binding/Factories/Collections/TypedCollectionConverterFactory.cs index e3b922555748..29a491765909 100644 --- a/src/Components/Endpoints/src/Binding/Factories/Collections/TypedCollectionConverterFactory.cs +++ b/src/Components/Endpoints/src/Binding/Factories/Collections/TypedCollectionConverterFactory.cs @@ -4,18 +4,25 @@ using System.Collections.Concurrent; using System.Collections.Immutable; using System.Collections.ObjectModel; +using System.Diagnostics.CodeAnalysis; namespace Microsoft.AspNetCore.Components.Endpoints.Binding; internal abstract class TypedCollectionConverterFactory : IFormDataConverterFactory { + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public abstract bool CanConvert(Type type, FormDataMapperOptions options); + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public abstract FormDataConverter CreateConverter(Type type, FormDataMapperOptions options); } internal sealed class TypedCollectionConverterFactory : TypedCollectionConverterFactory { + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public override bool CanConvert(Type _, FormDataMapperOptions options) { // Resolve the element type converter @@ -101,6 +108,8 @@ var _ when type.IsAssignableTo(typeof(ICollection)) && type.GetConstru // the Queue directly as the buffer (queues don't implement ICollection, so the adapter uses Push instead), // or for ImmutableXXX we either use ImmuttableXXX.CreateBuilder to create a builder we use as a buffer, // or collect the collection into an array buffer and call CreateRange to build the final collection. + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public override FormDataConverter CreateConverter(Type _, FormDataMapperOptions options) { // Resolve the element type converter diff --git a/src/Components/Endpoints/src/Binding/Factories/ComplexType/ComplexTypeExpressionConverterFactory.cs b/src/Components/Endpoints/src/Binding/Factories/ComplexType/ComplexTypeExpressionConverterFactory.cs index 68d22f323d09..12503309bb8f 100644 --- a/src/Components/Endpoints/src/Binding/Factories/ComplexType/ComplexTypeExpressionConverterFactory.cs +++ b/src/Components/Endpoints/src/Binding/Factories/ComplexType/ComplexTypeExpressionConverterFactory.cs @@ -1,9 +1,13 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics.CodeAnalysis; + namespace Microsoft.AspNetCore.Components.Endpoints.Binding; internal abstract class ComplexTypeExpressionConverterFactory { + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] internal abstract FormDataConverter CreateConverter(Type type, FormDataMapperOptions options); } diff --git a/src/Components/Endpoints/src/Binding/Factories/ComplexType/ComplexTypeExpressionConverterFactoryOfT.cs b/src/Components/Endpoints/src/Binding/Factories/ComplexType/ComplexTypeExpressionConverterFactoryOfT.cs index 4b87ce6accff..91348bfbe642 100644 --- a/src/Components/Endpoints/src/Binding/Factories/ComplexType/ComplexTypeExpressionConverterFactoryOfT.cs +++ b/src/Components/Endpoints/src/Binding/Factories/ComplexType/ComplexTypeExpressionConverterFactoryOfT.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics.CodeAnalysis; using System.Linq.Expressions; using Microsoft.Extensions.Internal; @@ -8,12 +9,16 @@ namespace Microsoft.AspNetCore.Components.Endpoints.Binding; internal sealed class ComplexTypeExpressionConverterFactory : ComplexTypeExpressionConverterFactory { + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] internal override CompiledComplexTypeConverter CreateConverter(Type type, FormDataMapperOptions options) { var body = CreateConverterBody(type, options); return new CompiledComplexTypeConverter(body); } + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] private CompiledComplexTypeConverter.ConverterDelegate CreateConverterBody(Type type, FormDataMapperOptions options) { var properties = PropertyHelper.GetVisibleProperties(type); diff --git a/src/Components/Endpoints/src/Binding/Factories/ComplexTypeConverterFactory.cs b/src/Components/Endpoints/src/Binding/Factories/ComplexTypeConverterFactory.cs index f633aca53e1e..c67a521eea7c 100644 --- a/src/Components/Endpoints/src/Binding/Factories/ComplexTypeConverterFactory.cs +++ b/src/Components/Endpoints/src/Binding/Factories/ComplexTypeConverterFactory.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Components.Endpoints.Binding; @@ -11,6 +12,8 @@ internal class ComplexTypeConverterFactory : IFormDataConverterFactory { internal static readonly ComplexTypeConverterFactory Instance = new(); + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public bool CanConvert(Type type, FormDataMapperOptions options) { if (type.GetConstructor(Type.EmptyTypes) == null && !type.IsValueType) @@ -105,7 +108,8 @@ public bool CanConvert(Type type, FormDataMapperOptions options) // return converterFunc(ref reader, type, options, out result, out found); // } // } - + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public FormDataConverter CreateConverter(Type type, FormDataMapperOptions options) { if (Activator.CreateInstance(typeof(ComplexTypeExpressionConverterFactory<>).MakeGenericType(type)) diff --git a/src/Components/Endpoints/src/Binding/Factories/Dictionary/ConcreteTypeDictionaryConverterFactory.cs b/src/Components/Endpoints/src/Binding/Factories/Dictionary/ConcreteTypeDictionaryConverterFactory.cs index a3f77d3600c6..fc83a37ae600 100644 --- a/src/Components/Endpoints/src/Binding/Factories/Dictionary/ConcreteTypeDictionaryConverterFactory.cs +++ b/src/Components/Endpoints/src/Binding/Factories/Dictionary/ConcreteTypeDictionaryConverterFactory.cs @@ -1,6 +1,8 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics.CodeAnalysis; + namespace Microsoft.AspNetCore.Components.Endpoints.Binding; internal sealed class ConcreteTypeDictionaryConverterFactory : IFormDataConverterFactory @@ -8,8 +10,12 @@ internal sealed class ConcreteTypeDictionaryConverterFactory Instance = new(); + [UnconditionalSuppressMessage("Trimming", "IL2046", Justification = "This derived implementation doesn't require unreferenced code like other implementations of the interface.")] + [UnconditionalSuppressMessage("AOT", "IL3051", Justification = "This derived implementation doesn't use dynamic code like other implementations of the interface.")] public bool CanConvert(Type type, FormDataMapperOptions options) => true; + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public FormDataConverter CreateConverter(Type type, FormDataMapperOptions options) { // Resolve the element type converter diff --git a/src/Components/Endpoints/src/Binding/Factories/Dictionary/TypedDictionaryConverterFactory.cs b/src/Components/Endpoints/src/Binding/Factories/Dictionary/TypedDictionaryConverterFactory.cs index a2822b4b9364..def5d833725d 100644 --- a/src/Components/Endpoints/src/Binding/Factories/Dictionary/TypedDictionaryConverterFactory.cs +++ b/src/Components/Endpoints/src/Binding/Factories/Dictionary/TypedDictionaryConverterFactory.cs @@ -4,12 +4,15 @@ using System.Collections.Concurrent; using System.Collections.Immutable; using System.Collections.ObjectModel; +using System.Diagnostics.CodeAnalysis; namespace Microsoft.AspNetCore.Components.Endpoints.Binding; internal sealed class TypedDictionaryConverterFactory : IFormDataConverterFactory where TKey : IParsable { + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public bool CanConvert(Type type, FormDataMapperOptions options) { // Resolve the value type converter @@ -70,6 +73,8 @@ var _ when type.IsAssignableTo(typeof(IDictionary)) && type.GetCon return false; } + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public FormDataConverter CreateConverter(Type type, FormDataMapperOptions options) { // Resolve the value type converter diff --git a/src/Components/Endpoints/src/Binding/Factories/DictionaryConverterFactory.cs b/src/Components/Endpoints/src/Binding/Factories/DictionaryConverterFactory.cs index ee92552e357d..cc237af2bae6 100644 --- a/src/Components/Endpoints/src/Binding/Factories/DictionaryConverterFactory.cs +++ b/src/Components/Endpoints/src/Binding/Factories/DictionaryConverterFactory.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Components.Endpoints.Binding; @@ -9,6 +10,8 @@ internal class DictionaryConverterFactory : IFormDataConverterFactory { internal static readonly DictionaryConverterFactory Instance = new(); + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public bool CanConvert(Type type, FormDataMapperOptions options) { // Type must implement IDictionary IReadOnlyDictionary @@ -58,6 +61,8 @@ public bool CanConvert(Type type, FormDataMapperOptions options) return factory.CanConvert(type, options); } + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public FormDataConverter CreateConverter(Type type, FormDataMapperOptions options) { // Type must implement IDictionary IReadOnlyDictionary diff --git a/src/Components/Endpoints/src/Binding/Factories/NullableConverterFactory.cs b/src/Components/Endpoints/src/Binding/Factories/NullableConverterFactory.cs index ea635aab6cb4..c99bedfe6763 100644 --- a/src/Components/Endpoints/src/Binding/Factories/NullableConverterFactory.cs +++ b/src/Components/Endpoints/src/Binding/Factories/NullableConverterFactory.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; namespace Microsoft.AspNetCore.Components.Endpoints.Binding; @@ -9,12 +10,16 @@ internal sealed class NullableConverterFactory : IFormDataConverterFactory { public static readonly NullableConverterFactory Instance = new(); + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public bool CanConvert(Type type, FormDataMapperOptions options) { var underlyingType = Nullable.GetUnderlyingType(type); return underlyingType != null && options.ResolveConverter(underlyingType) != null; } + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public FormDataConverter CreateConverter(Type type, FormDataMapperOptions options) { var underlyingType = Nullable.GetUnderlyingType(type); diff --git a/src/Components/Endpoints/src/Binding/Factories/ParsableConverterFactory.cs b/src/Components/Endpoints/src/Binding/Factories/ParsableConverterFactory.cs index 73cc5fccf1b7..d6d151f71177 100644 --- a/src/Components/Endpoints/src/Binding/Factories/ParsableConverterFactory.cs +++ b/src/Components/Endpoints/src/Binding/Factories/ParsableConverterFactory.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.Internal; namespace Microsoft.AspNetCore.Components.Endpoints.Binding; @@ -9,11 +10,15 @@ internal sealed class ParsableConverterFactory : IFormDataConverterFactory { public static readonly ParsableConverterFactory Instance = new(); + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public bool CanConvert(Type type, FormDataMapperOptions options) { return ClosedGenericMatcher.ExtractGenericInterface(type, typeof(IParsable<>)) is not null; } + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public FormDataConverter CreateConverter(Type type, FormDataMapperOptions options) { return Activator.CreateInstance(typeof(ParsableConverter<>).MakeGenericType(type)) as FormDataConverter ?? diff --git a/src/Components/Endpoints/src/Binding/FormBindingHelpers.cs b/src/Components/Endpoints/src/Binding/FormBindingHelpers.cs new file mode 100644 index 000000000000..de9a6b61240d --- /dev/null +++ b/src/Components/Endpoints/src/Binding/FormBindingHelpers.cs @@ -0,0 +1,10 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Microsoft.AspNetCore.Components.Endpoints.Binding; + +internal static class FormBindingHelpers +{ + public const string RequiresUnreferencedCodeMessage = "Form binding is not compatible with trimming, as it requires dynamic access to code that is not referenced statically."; + public const string RequiresDynamicCodeMessage = "Form binding may require dynamic code generation."; +} diff --git a/src/Components/Endpoints/src/Binding/FormDataMapperOptions.cs b/src/Components/Endpoints/src/Binding/FormDataMapperOptions.cs index f678a579ff0e..e28a5cf51574 100644 --- a/src/Components/Endpoints/src/Binding/FormDataMapperOptions.cs +++ b/src/Components/Endpoints/src/Binding/FormDataMapperOptions.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Concurrent; +using System.Diagnostics.CodeAnalysis; namespace Microsoft.AspNetCore.Components.Endpoints.Binding; @@ -10,6 +11,8 @@ internal sealed class FormDataMapperOptions private readonly ConcurrentDictionary _converters = new(); private readonly List> _factories = new(); + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public FormDataMapperOptions() { _converters = new(WellKnownConverters.Converters); @@ -27,7 +30,7 @@ public FormDataMapperOptions() // Binding to collection using hashes, where the payload can be crafted to force the worst case on insertion // which is O(n). internal int MaxCollectionSize = 100; - + internal bool HasConverter(Type valueType) => _converters.ContainsKey(valueType); internal bool IsSingleValueConverter(Type type) diff --git a/src/Components/Endpoints/src/Binding/IFormDataConverterFactory.cs b/src/Components/Endpoints/src/Binding/IFormDataConverterFactory.cs index 04a77cf83c49..f128b8c2c1c6 100644 --- a/src/Components/Endpoints/src/Binding/IFormDataConverterFactory.cs +++ b/src/Components/Endpoints/src/Binding/IFormDataConverterFactory.cs @@ -1,11 +1,17 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics.CodeAnalysis; + namespace Microsoft.AspNetCore.Components.Endpoints.Binding; internal interface IFormDataConverterFactory { + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public bool CanConvert(Type type, FormDataMapperOptions options); + [RequiresDynamicCode(FormBindingHelpers.RequiresDynamicCodeMessage)] + [RequiresUnreferencedCode(FormBindingHelpers.RequiresUnreferencedCodeMessage)] public FormDataConverter CreateConverter(Type type, FormDataMapperOptions options); } diff --git a/src/Features/JsonPatch/src/Microsoft.AspNetCore.JsonPatch.csproj b/src/Features/JsonPatch/src/Microsoft.AspNetCore.JsonPatch.csproj index 6c78abd09dbd..57cc0737ff21 100644 --- a/src/Features/JsonPatch/src/Microsoft.AspNetCore.JsonPatch.csproj +++ b/src/Features/JsonPatch/src/Microsoft.AspNetCore.JsonPatch.csproj @@ -18,6 +18,7 @@ + diff --git a/src/Http/Http.Extensions/src/Microsoft.AspNetCore.Http.Extensions.csproj b/src/Http/Http.Extensions/src/Microsoft.AspNetCore.Http.Extensions.csproj index c6472b75143d..b867d52b45ee 100644 --- a/src/Http/Http.Extensions/src/Microsoft.AspNetCore.Http.Extensions.csproj +++ b/src/Http/Http.Extensions/src/Microsoft.AspNetCore.Http.Extensions.csproj @@ -26,6 +26,11 @@ + + + + + diff --git a/src/Http/Http.Extensions/src/RequestDelegateFactory.cs b/src/Http/Http.Extensions/src/RequestDelegateFactory.cs index c6a0e2d5f432..36289c003ca4 100644 --- a/src/Http/Http.Extensions/src/RequestDelegateFactory.cs +++ b/src/Http/Http.Extensions/src/RequestDelegateFactory.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Collections.ObjectModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; @@ -14,6 +15,7 @@ using System.Text.Json; using System.Text.Json.Serialization.Metadata; using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Components.Endpoints.Binding; using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Http.Json; @@ -36,6 +38,7 @@ namespace Microsoft.AspNetCore.Http; public static partial class RequestDelegateFactory { private static readonly ParameterBindingMethodCache ParameterBindingMethodCache = new(); + private static readonly FormDataMapperOptions FormDataMapperOptions = new(); private static readonly MethodInfo ExecuteTaskWithEmptyResultMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteTaskWithEmptyResult), BindingFlags.NonPublic | BindingFlags.Static)!; private static readonly MethodInfo ExecuteValueTaskWithEmptyResultMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteValueTaskWithEmptyResult), BindingFlags.NonPublic | BindingFlags.Static)!; @@ -113,6 +116,10 @@ public static partial class RequestDelegateFactory private static readonly MemberExpression FilterContextHttpContextStatusCodeExpr = Expression.Property(FilterContextHttpContextResponseExpr, typeof(HttpResponse).GetProperty(nameof(HttpResponse.StatusCode))!); private static readonly ParameterExpression InvokedFilterContextExpr = Expression.Parameter(typeof(EndpointFilterInvocationContext), "filterContext"); + private static readonly ConstructorInfo FormDataReaderConstructor = typeof(FormDataReader).GetConstructor(new[] { typeof(IReadOnlyDictionary), typeof(CultureInfo) })!; + private static readonly MethodInfo FormToReadOnlyDictionaryMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ToReadOnlyDictionary), BindingFlags.Static | BindingFlags.NonPublic, new[] { typeof(IFormCollection) })!; + private static readonly MethodInfo FormDataMapperMapMethod = typeof(FormDataMapper).GetMethod(nameof(FormDataMapper.Map))!; + private static readonly string[] DefaultAcceptsAndProducesContentType = new[] { JsonConstants.JsonContentType }; private static readonly string[] FormFileContentType = new[] { "multipart/form-data" }; private static readonly string[] FormContentType = new[] { "multipart/form-data", "application/x-www-form-urlencoded" }; @@ -730,8 +737,19 @@ private static Expression CreateArgument(ParameterInfo parameter, RequestDelegat } return BindParameterFromFormCollection(parameter, factoryContext); } - - return BindParameterFromFormItem(parameter, formAttribute.Name ?? parameter.Name, factoryContext); + // Continue to use the simple binding support that exists in RDF/RDG for currently + // supported scenarios to maintain compatible semantics between versions of RDG. + // For complex types, leverage the shared form binding infrastructure. For example, + // shared form binding does not currently only supports types that implement IParsable + // while RDF's binding implementation supports all TryParse implementations. + var useSimpleBinding = parameter.ParameterType == typeof(string) || + parameter.ParameterType == typeof(StringValues) || + parameter.ParameterType == typeof(StringValues?) || + ParameterBindingMethodCache.HasTryParseMethod(parameter.ParameterType) || + (parameter.ParameterType.IsArray && ParameterBindingMethodCache.HasTryParseMethod(parameter.ParameterType.GetElementType()!)); + return useSimpleBinding + ? BindParameterFromFormItem(parameter, formAttribute.Name ?? parameter.Name, factoryContext) + : BindComplexParameterFromFormItem(parameter, formAttribute.Name ?? parameter.Name, factoryContext); } else if (parameter.CustomAttributes.Any(a => typeof(IFromServiceMetadata).IsAssignableFrom(a.AttributeType))) { @@ -1943,6 +1961,42 @@ private static Expression BindParameterFromFormItem( "form"); } + private static Expression BindComplexParameterFromFormItem( + ParameterInfo parameter, + string key, + RequestDelegateFactoryContext factoryContext) + { + factoryContext.FirstFormRequestBodyParameter ??= parameter; + factoryContext.TrackedParameters.Add(key, RequestDelegateFactoryConstants.FormAttribute); + factoryContext.ReadForm = true; + + // var name_local; + // var name_reader; + var formArgument = Expression.Variable(parameter.ParameterType, $"{parameter.Name}_local"); + var formReader = Expression.Variable(typeof(FormDataReader), $"{parameter.Name}_reader"); + + // name_reader = new FormDataReader(context.Request.Form.ToReadOnlyDictionary()), CultureInfo.InvariantCulture); + var initializeReaderExpr = Expression.Assign( + formReader, + Expression.New(FormDataReaderConstructor, + Expression.Call(FormToReadOnlyDictionaryMethod, FormExpr), + Expression.Constant(CultureInfo.InvariantCulture))); + // FormDataMapper.Map(name_reader, FormDataMapperOptions); + var invokeMapMethodExpr = Expression.Call( + FormDataMapperMapMethod.MakeGenericMethod(parameter.ParameterType), + formReader, + Expression.Constant(FormDataMapperOptions)); + + return Expression.Block( + new[] { formArgument, formReader }, + initializeReaderExpr, + Expression.Assign(formArgument, invokeMapMethodExpr) + ); + } + + private static IReadOnlyDictionary ToReadOnlyDictionary(IFormCollection form) + => new ReadOnlyDictionary(form.ToDictionary()); + private static Expression BindParameterFromFormFiles( ParameterInfo parameter, RequestDelegateFactoryContext factoryContext) diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RuntimeCreationTests.ComplexFormBinding.cs b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RuntimeCreationTests.ComplexFormBinding.cs new file mode 100644 index 000000000000..a23ffc9896d4 --- /dev/null +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RuntimeCreationTests.ComplexFormBinding.cs @@ -0,0 +1,207 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Net.Http; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.Extensions.Primitives; + +namespace Microsoft.AspNetCore.Http.Generators.Tests; + +public partial class RuntimeCreationTests : RequestDelegateCreationTests +{ + [Fact] + public async Task SupportsBindingComplexTypeFromForm_UrlEncoded() + { + var source = """ +app.MapPost("/", ([FromForm] Todo todo) => Results.Ok(todo)); +"""; + var (_, compilation) = await RunGeneratorAsync(source); + var endpoint = GetEndpointFromCompilation(compilation); + var httpContext = CreateHttpContext(); + + var content = new FormUrlEncodedContent(new Dictionary { ["Id"] = "1", ["Name"] = "Write tests", ["IsComplete"] = "true" }); + var stream = new MemoryStream(); + await content.CopyToAsync(stream); + + stream.Seek(0, SeekOrigin.Begin); + + httpContext.Request.Body = stream; + httpContext.Request.Headers["Content-Type"] = "application/x-www-form-urlencoded"; + httpContext.Features.Set(new RequestBodyDetectionFeature(true)); + + await endpoint.RequestDelegate(httpContext); + + await VerifyResponseJsonBodyAsync(httpContext, (todo) => + { + Assert.Equal(1, todo.Id); + Assert.Equal("Write tests", todo.Name); + Assert.True(todo.IsComplete); + }); + } + + [Fact] + public async Task SupportsBindingComplexTypeFromForm_Multipart() + { + var source = """ +app.MapPost("/", ([FromForm] Todo todo) => Results.Ok(todo)); +"""; + var (_, compilation) = await RunGeneratorAsync(source); + var endpoint = GetEndpointFromCompilation(compilation); + var httpContext = CreateHttpContext(); + + var content = new MultipartFormDataContent("some-boundary"); + content.Add(new StringContent("1"), "Id"); + content.Add(new StringContent("Write tests"), "Name"); + content.Add(new StringContent("true"), "IsComplete"); + + var stream = new MemoryStream(); + await content.CopyToAsync(stream); + + stream.Seek(0, SeekOrigin.Begin); + + httpContext.Request.Body = stream; + httpContext.Request.Headers["Content-Type"] = "multipart/form-data;boundary=some-boundary"; + httpContext.Features.Set(new RequestBodyDetectionFeature(true)); + + await endpoint.RequestDelegate(httpContext); + + await VerifyResponseJsonBodyAsync(httpContext, (todo) => + { + Assert.Equal(1, todo.Id); + Assert.Equal("Write tests", todo.Name); + Assert.True(todo.IsComplete); + }); + } + + [Fact] + public async Task SupportsBindingDictionaryFromForm_UrlEncoded() + { + var source = """ +app.MapPost("/", ([FromForm] Dictionary elements) => Results.Ok(elements)); +"""; + var (_, compilation) = await RunGeneratorAsync(source); + var endpoint = GetEndpointFromCompilation(compilation); + var httpContext = CreateHttpContext(); + + var content = new FormUrlEncodedContent(new Dictionary { ["[foo]"] = "true", ["[bar]"] = "false", ["[baz]"] = "true" }); + var stream = new MemoryStream(); + await content.CopyToAsync(stream); + + stream.Seek(0, SeekOrigin.Begin); + + httpContext.Request.Body = stream; + httpContext.Request.Headers["Content-Type"] = "application/x-www-form-urlencoded"; + httpContext.Features.Set(new RequestBodyDetectionFeature(true)); + + await endpoint.RequestDelegate(httpContext); + + await VerifyResponseJsonBodyAsync>(httpContext, (elements) => + { + Assert.Equal(3, elements.Count); + Assert.True(elements["foo"]); + Assert.False(elements["bar"]); + Assert.True(elements["baz"]); + }); + } + + [Fact] + public async Task SupportsBindingDictionaryFromForm_Multipart() + { + var source = """ +app.MapPost("/", ([FromForm] Dictionary elements) => Results.Ok(elements)); +"""; + var (_, compilation) = await RunGeneratorAsync(source); + var endpoint = GetEndpointFromCompilation(compilation); + var httpContext = CreateHttpContext(); + + var content = new MultipartFormDataContent("some-boundary"); + content.Add(new StringContent("true"), "[foo]"); + content.Add(new StringContent("false"), "[bar]"); + content.Add(new StringContent("true"), "[baz]"); + + var stream = new MemoryStream(); + await content.CopyToAsync(stream); + + stream.Seek(0, SeekOrigin.Begin); + + httpContext.Request.Body = stream; + httpContext.Request.Headers["Content-Type"] = "multipart/form-data;boundary=some-boundary"; + httpContext.Features.Set(new RequestBodyDetectionFeature(true)); + + await endpoint.RequestDelegate(httpContext); + + await VerifyResponseJsonBodyAsync>(httpContext, (elements) => + { + Assert.Equal(3, elements.Count); + Assert.True(elements["foo"]); + Assert.False(elements["bar"]); + Assert.True(elements["baz"]); + }); + } + + [Fact] + public async Task SupportsBindingListFromForm_UrlEncoded() + { + var source = """ +app.MapPost("/", ([FromForm] List elements) => Results.Ok(elements)); +"""; + var (_, compilation) = await RunGeneratorAsync(source); + var endpoint = GetEndpointFromCompilation(compilation); + var httpContext = CreateHttpContext(); + + var content = new FormUrlEncodedContent(new Dictionary { ["[0]"] = "1", ["[1]"] = "3", ["[2]"] = "5" }); + var stream = new MemoryStream(); + await content.CopyToAsync(stream); + + stream.Seek(0, SeekOrigin.Begin); + + httpContext.Request.Body = stream; + httpContext.Request.Headers["Content-Type"] = "application/x-www-form-urlencoded"; + httpContext.Features.Set(new RequestBodyDetectionFeature(true)); + + await endpoint.RequestDelegate(httpContext); + + await VerifyResponseJsonBodyAsync>(httpContext, (elements) => + { + Assert.Equal(3, elements.Count); + Assert.Equal(1, elements[0]); + Assert.Equal(3, elements[1]); + Assert.Equal(5, elements[2]); + }); + } + + [Fact] + public async Task SupportsBindingListFromForm_Multipart() + { + var source = """ +app.MapPost("/", ([FromForm] List elements) => Results.Ok(elements)); +"""; + var (_, compilation) = await RunGeneratorAsync(source); + var endpoint = GetEndpointFromCompilation(compilation); + var httpContext = CreateHttpContext(); + + var content = new MultipartFormDataContent("some-boundary"); + content.Add(new StringContent("1"), "[0]"); + content.Add(new StringContent("3"), "[1]"); + content.Add(new StringContent("5"), "[2]"); + + var stream = new MemoryStream(); + await content.CopyToAsync(stream); + + stream.Seek(0, SeekOrigin.Begin); + + httpContext.Request.Body = stream; + httpContext.Request.Headers["Content-Type"] = "multipart/form-data;boundary=some-boundary"; + httpContext.Features.Set(new RequestBodyDetectionFeature(true)); + + await endpoint.RequestDelegate(httpContext); + + await VerifyResponseJsonBodyAsync>(httpContext, (elements) => + { + Assert.Equal(3, elements.Count); + Assert.Equal(1, elements[0]); + Assert.Equal(3, elements[1]); + Assert.Equal(5, elements[2]); + }); + } +} diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RuntimeCreationTests.cs b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RuntimeCreationTests.cs index fd52208fd3f0..61e8e8145ea1 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/RuntimeCreationTests.cs +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/RuntimeCreationTests.cs @@ -8,7 +8,7 @@ using Microsoft.Extensions.Logging; namespace Microsoft.AspNetCore.Http.Generators.Tests; -public class RuntimeCreationTests : RequestDelegateCreationTests +public partial class RuntimeCreationTests : RequestDelegateCreationTests { protected override bool IsGeneratorEnabled { get; } = false; diff --git a/src/Shared/ClosedGenericMatcher/ClosedGenericMatcher.cs b/src/Shared/ClosedGenericMatcher/ClosedGenericMatcher.cs index c1989174bc1e..235c9d5a4a8c 100644 --- a/src/Shared/ClosedGenericMatcher/ClosedGenericMatcher.cs +++ b/src/Shared/ClosedGenericMatcher/ClosedGenericMatcher.cs @@ -4,6 +4,7 @@ #nullable enable using System; +using System.Diagnostics.CodeAnalysis; using System.Reflection; using Microsoft.AspNetCore.Shared; @@ -30,7 +31,7 @@ internal static class ClosedGenericMatcher /// typeof(KeyValuePair{,}), and is /// typeof(KeyValuePair{string, object}). /// - public static Type? ExtractGenericInterface(Type queryType, Type interfaceType) + public static Type? ExtractGenericInterface([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] Type queryType, Type interfaceType) { #if !NET8_0_OR_GREATER ArgumentNullThrowHelper.ThrowIfNull(queryType); @@ -62,7 +63,7 @@ private static bool IsGenericInstantiation(Type candidate, Type interfaceType) candidate.GetGenericTypeDefinition() == interfaceType; } - private static Type? GetGenericInstantiation(Type queryType, Type interfaceType) + private static Type? GetGenericInstantiation([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] Type queryType, Type interfaceType) { Type? bestMatch = null; var interfaces = queryType.GetInterfaces(); From 883f06cbf5bfa9d82ef797c09fbcb6af7cbb1536 Mon Sep 17 00:00:00 2001 From: Mackinnon Buck Date: Fri, 16 Jun 2023 09:08:12 -0700 Subject: [PATCH 03/38] [Blazor] Take cascading parameter attribute type into account when supplying cascading values (#48554) --- .../test/AuthorizeRouteViewTest.cs | 1 - .../src/Binding/CascadingModelBinder.cs | 146 ++-- .../Binding/CascadingModelBindingProvider.cs | 69 ++ .../CascadingQueryModelBindingProvider.cs | 138 ++++ .../src/Binding/IFormValueSupplier.cs | 2 +- .../src/CascadingParameterAttribute.cs | 4 +- .../src/CascadingParameterAttributeBase.cs | 16 + .../Components/src/CascadingParameterInfo.cs | 32 + .../Components/src/CascadingParameterState.cs | 73 +- .../Components/src/CascadingValue.cs | 30 +- .../src/ICascadingValueComponent.cs | 22 - .../Components/src/ICascadingValueSupplier.cs | 19 + .../src/IHostEnvironmentCascadingParameter.cs | 11 - .../Components/src/ParameterView.cs | 3 +- .../Components/src/PublicAPI.Unshipped.txt | 28 + .../src/Reflection/ComponentProperties.cs | 15 +- .../Components/src/RenderTree/Renderer.cs | 1 - .../src/Rendering/ComponentState.cs | 8 +- src/Components/Components/src/RouteView.cs | 18 - .../Routing/QueryParameterValueSupplier.cs | 183 +---- .../src/SupplyParameterFromQueryAttribute.cs | 4 +- .../test/CascadingModelBinderTest.cs | 1 + .../test/CascadingParameterStateTest.cs | 98 ++- .../Components/test/CascadingParameterTest.cs | 128 ++++ .../test/ParameterViewTest.Assignment.cs | 38 +- .../Components/test/ParameterViewTest.cs | 31 +- .../Components/test/RouteViewTest.cs | 1 + .../QueryParameterValueSupplierTest.cs | 644 +++++++----------- ...orComponentsServiceCollectionExtensions.cs | 2 + ...mponentsServiceCollectionExtensionsTest.cs | 6 + .../CascadingFormModelBindingProvider.cs | 64 ++ .../Web/src/PublicAPI.Unshipped.txt | 6 +- .../src/SupplyParameterFromFormAttribute.cs | 4 +- src/Components/Web/test/Forms/EditFormTest.cs | 2 + .../src/Hosting/WebAssemblyHostBuilder.cs | 1 + ...nentsWebViewServiceCollectionExtensions.cs | 1 + .../test/E2ETest/Tests/RoutingTest.cs | 14 + .../RouterTest/NestedQueryParameters.razor | 12 + .../RouterTest/WithQueryParameters.razor | 14 +- 39 files changed, 1045 insertions(+), 845 deletions(-) create mode 100644 src/Components/Components/src/Binding/CascadingModelBindingProvider.cs create mode 100644 src/Components/Components/src/Binding/CascadingQueryModelBindingProvider.cs create mode 100644 src/Components/Components/src/CascadingParameterAttributeBase.cs create mode 100644 src/Components/Components/src/CascadingParameterInfo.cs delete mode 100644 src/Components/Components/src/ICascadingValueComponent.cs create mode 100644 src/Components/Components/src/ICascadingValueSupplier.cs delete mode 100644 src/Components/Components/src/IHostEnvironmentCascadingParameter.cs create mode 100644 src/Components/Web/src/Binding/CascadingFormModelBindingProvider.cs create mode 100644 src/Components/test/testassets/BasicTestApp/RouterTest/NestedQueryParameters.razor diff --git a/src/Components/Authorization/test/AuthorizeRouteViewTest.cs b/src/Components/Authorization/test/AuthorizeRouteViewTest.cs index 05609873187d..83c7549b574b 100644 --- a/src/Components/Authorization/test/AuthorizeRouteViewTest.cs +++ b/src/Components/Authorization/test/AuthorizeRouteViewTest.cs @@ -34,7 +34,6 @@ public AuthorizeRouteViewTest() serviceCollection.AddSingleton(); serviceCollection.AddSingleton(_testAuthorizationService); serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); var services = serviceCollection.BuildServiceProvider(); _renderer = new TestRenderer(services); diff --git a/src/Components/Components/src/Binding/CascadingModelBinder.cs b/src/Components/Components/src/Binding/CascadingModelBinder.cs index 994e8430c3d6..0b1b0e2a5d4e 100644 --- a/src/Components/Components/src/Binding/CascadingModelBinder.cs +++ b/src/Components/Components/src/Binding/CascadingModelBinder.cs @@ -1,6 +1,8 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics.CodeAnalysis; +using System.Linq; using System.Reflection.Metadata; using Microsoft.AspNetCore.Components.Binding; using Microsoft.AspNetCore.Components.Rendering; @@ -11,12 +13,13 @@ namespace Microsoft.AspNetCore.Components; /// /// Defines the binding context for data bound from external sources. /// -public sealed class CascadingModelBinder : IComponent, ICascadingValueComponent, IDisposable +public sealed class CascadingModelBinder : IComponent, ICascadingValueSupplier, IDisposable { + private readonly Dictionary _providersByCascadingParameterAttributeType = new(); + private RenderHandle _handle; private ModelBindingContext? _bindingContext; private bool _hasPendingQueuedRender; - private BindingInfo? _bindingInfo; /// /// The binding context name. @@ -40,7 +43,9 @@ public sealed class CascadingModelBinder : IComponent, ICascadingValueComponent, [Inject] internal NavigationManager Navigation { get; set; } = null!; - [Inject] internal IFormValueSupplier FormValueSupplier { get; set; } = null!; + [Inject] internal IEnumerable ModelBindingProviders { get; set; } = Enumerable.Empty(); + + internal ModelBindingContext? BindingContext => _bindingContext; void IComponent.Attach(RenderHandle renderHandle) { @@ -110,24 +115,25 @@ internal void UpdateBindingInformation(string url) // BindingContextId = <>((<>&)|?)handler=my-handler var name = ModelBindingContext.Combine(ParentContext, Name); var bindingId = string.IsNullOrEmpty(name) ? "" : GenerateBindingContextId(name); + var bindingContextDidChange = + _bindingContext is null || + !string.Equals(_bindingContext.Name, name, StringComparison.Ordinal) || + !string.Equals(_bindingContext.BindingContextId, bindingId, StringComparison.Ordinal); - var bindingContext = _bindingContext != null && - string.Equals(_bindingContext.Name, name, StringComparison.Ordinal) && - string.Equals(_bindingContext.BindingContextId, bindingId, StringComparison.Ordinal) ? - _bindingContext : new ModelBindingContext(name, bindingId, FormValueSupplier.CanConvertSingleValue); - - // It doesn't matter that we don't check IsFixed, since the CascadingValue we are setting up will throw if the app changes. - if (IsFixed && _bindingContext != null && _bindingContext != bindingContext) + if (bindingContextDidChange) { - // Throw an exception if either the Name or the BindingContextId changed. Once a CascadingModelBinder has been initialized - // as fixed, it can't change it's name nor its BindingContextId. This can happen in several situations: - // * Component ParentContext hierarchy changes. - // * Technically, the component won't be retained in this case and will be destroyed instead. - // * A parent changes Name. - throw new InvalidOperationException($"'{nameof(CascadingModelBinder)}' 'Name' can't change after initialized."); - } + if (IsFixed && _bindingContext is not null) + { + // Throw an exception if either the Name or the BindingContextId changed. Once a CascadingModelBinder has been initialized + // as fixed, it can't change it's name nor its BindingContextId. This can happen in several situations: + // * Component ParentContext hierarchy changes. + // * Technically, the component won't be retained in this case and will be destroyed instead. + // * A parent changes Name. + throw new InvalidOperationException($"'{nameof(CascadingModelBinder)}' 'Name' can't change after initialized."); + } - _bindingContext = bindingContext; + _bindingContext = new ModelBindingContext(name, bindingId, CanBind); + } string GenerateBindingContextId(string name) { @@ -135,60 +141,92 @@ string GenerateBindingContextId(string name) var hashIndex = bindingId.IndexOf('#'); return hashIndex == -1 ? bindingId : new string(bindingId.AsSpan(0, hashIndex)); } + + bool CanBind(Type type) + { + foreach (var provider in ModelBindingProviders) + { + if (provider.SupportsParameterType(type)) + { + return true; + } + } + + return false; + } } - void IDisposable.Dispose() + bool ICascadingValueSupplier.CanSupplyValue(in CascadingParameterInfo parameterInfo) + => TryGetProvider(in parameterInfo, out var provider) + && provider.CanSupplyValue(_bindingContext, parameterInfo); + + void ICascadingValueSupplier.Subscribe(ComponentState subscriber, in CascadingParameterInfo parameterInfo) { - Navigation.LocationChanged -= HandleLocationChanged; + // We expect there to always be a provider at this point, because CanSupplyValue must have returned true. + var provider = GetProviderOrThrow(parameterInfo); + + if (!provider.AreValuesFixed) + { + provider.Subscribe(subscriber); + } } - bool ICascadingValueComponent.CanSupplyValue(Type valueType, string? valueName) + void ICascadingValueSupplier.Unsubscribe(ComponentState subscriber, in CascadingParameterInfo parameterInfo) { - var formName = string.IsNullOrEmpty(valueName) ? - (_bindingContext?.Name) : - ModelBindingContext.Combine(_bindingContext, valueName); + // We expect there to always be a provider at this point, because CanSupplyValue must have returned true. + var provider = GetProviderOrThrow(parameterInfo); - if (_bindingInfo != null && - string.Equals(_bindingInfo.FormName, formName, StringComparison.Ordinal) && - _bindingInfo.ValueType.Equals(valueType)) + if (!provider.AreValuesFixed) { - // We already bound the value, but some component might have been destroyed and - // re-created. If the type and name of the value that we bound are the same, - // we can provide the value that we bound. - return true; + provider.Unsubscribe(subscriber); } + } - // Can't supply the value if this context is for a form with a different name. - if (FormValueSupplier.CanBind(formName!, valueType)) - { - var bindingSucceeded = FormValueSupplier.TryBind(formName!, valueType, out var boundValue); - _bindingInfo = new BindingInfo(formName, valueType, bindingSucceeded, boundValue); - if (!bindingSucceeded) - { - // Report errors - } + object? ICascadingValueSupplier.GetCurrentValue(in CascadingParameterInfo parameterInfo) + => TryGetProvider(in parameterInfo, out var provider) + ? provider.GetCurrentValue(_bindingContext, parameterInfo) + : null; - return true; + private CascadingModelBindingProvider GetProviderOrThrow(in CascadingParameterInfo parameterInfo) + { + if (!TryGetProvider(parameterInfo, out var provider)) + { + throw new InvalidOperationException($"No model binding provider could be found for parameter '{parameterInfo.PropertyName}'."); } - return false; + return provider; } - void ICascadingValueComponent.Subscribe(ComponentState subscriber) + private bool TryGetProvider(in CascadingParameterInfo parameterInfo, [NotNullWhen(true)] out CascadingModelBindingProvider? result) { - throw new InvalidOperationException("Form values are always fixed."); - } + var attributeType = parameterInfo.Attribute.GetType(); - void ICascadingValueComponent.Unsubscribe(ComponentState subscriber) - { - throw new InvalidOperationException("Form values are always fixed."); - } + if (_providersByCascadingParameterAttributeType.TryGetValue(attributeType, out result)) + { + return result is not null; + } - object? ICascadingValueComponent.CurrentValue => _bindingInfo == null ? - throw new InvalidOperationException("Tried to access form value before it was bound.") : - _bindingInfo.BoundValue; + // We deliberately cache 'null' results to avoid searching for the same attribute type multiple times. + result = FindProviderForAttributeType(attributeType); + _providersByCascadingParameterAttributeType[attributeType] = result; + return result is not null; - bool ICascadingValueComponent.CurrentValueIsFixed => true; + CascadingModelBindingProvider? FindProviderForAttributeType(Type attributeType) + { + foreach (var provider in ModelBindingProviders) + { + if (provider.SupportsCascadingParameterAttributeType(attributeType)) + { + return provider; + } + } + + return null; + } + } - private record BindingInfo(string? FormName, Type ValueType, bool BindingResult, object? BoundValue); + void IDisposable.Dispose() + { + Navigation.LocationChanged -= HandleLocationChanged; + } } diff --git a/src/Components/Components/src/Binding/CascadingModelBindingProvider.cs b/src/Components/Components/src/Binding/CascadingModelBindingProvider.cs new file mode 100644 index 000000000000..4b75e496a3ce --- /dev/null +++ b/src/Components/Components/src/Binding/CascadingModelBindingProvider.cs @@ -0,0 +1,69 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Microsoft.AspNetCore.Components.Rendering; + +namespace Microsoft.AspNetCore.Components.Binding; + +/// +/// Provides values that get supplied to cascading parameters with . +/// +public abstract class CascadingModelBindingProvider +{ + /// + /// Gets whether values supplied by this instance will not change. + /// + protected internal abstract bool AreValuesFixed { get; } + + /// + /// Determines whether this instance can provide values for parameters annotated with the specified attribute type. + /// + /// The attribute type. + /// true if this instance can provide values for parameters annotated with the specified attribute type, otherwise false. + protected internal abstract bool SupportsCascadingParameterAttributeType(Type attributeType); + + /// + /// Determines whether this instance can provide values to parameters with the specified type. + /// + /// The parameter type. + /// true if this instance can provide values to parameters with the specified type, otherwise false. + protected internal abstract bool SupportsParameterType(Type parameterType); + + /// + /// Determines whether this instance can supply a value for the specified parameter. + /// + /// The current . + /// The for the component parameter. + /// true if a value can be supplied, otherwise false. + protected internal abstract bool CanSupplyValue(ModelBindingContext? bindingContext, in CascadingParameterInfo parameterInfo); + + /// + /// Gets the value for the specified parameter. + /// + /// The current . + /// The for the component parameter. + /// The value to supply to the parameter. + protected internal abstract object? GetCurrentValue(ModelBindingContext? bindingContext, in CascadingParameterInfo parameterInfo); + + /// + /// Subscribes to changes in supplied values, if they can change. + /// + /// + /// This method must be implemented if is false. + /// + /// The for the subscribing component. + protected internal virtual void Subscribe(ComponentState subscriber) + => throw new InvalidOperationException( + $"'{nameof(CascadingModelBindingProvider)}' instances that have non-fixed values must provide an implementation for '{nameof(Subscribe)}'."); + + /// + /// Unsubscribes from changes in supplied values, if they can change. + /// + /// + /// This method must be implemented if is false. + /// + /// The for the unsubscribing component. + protected internal virtual void Unsubscribe(ComponentState subscriber) + => throw new InvalidOperationException( + $"'{nameof(CascadingModelBindingProvider)}' instances that have non-fixed values must provide an implementation for '{nameof(Unsubscribe)}'."); +} diff --git a/src/Components/Components/src/Binding/CascadingQueryModelBindingProvider.cs b/src/Components/Components/src/Binding/CascadingQueryModelBindingProvider.cs new file mode 100644 index 000000000000..e6e9c976016b --- /dev/null +++ b/src/Components/Components/src/Binding/CascadingQueryModelBindingProvider.cs @@ -0,0 +1,138 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Microsoft.AspNetCore.Components.Rendering; +using Microsoft.AspNetCore.Components.Routing; + +namespace Microsoft.AspNetCore.Components.Binding; + +/// +/// Enables component parameters to be supplied from the query string with . +/// +public sealed class CascadingQueryModelBindingProvider : CascadingModelBindingProvider, IDisposable +{ + private readonly QueryParameterValueSupplier _queryParameterValueSupplier = new(); + private readonly NavigationManager _navigationManager; + + private HashSet? _subscribers; + private bool _isSubscribedToLocationChanges; + private bool _queryParametersMightHaveChanged = true; + + /// + protected internal override bool AreValuesFixed => false; + + /// + /// Constructs a new instance of . + /// + public CascadingQueryModelBindingProvider(NavigationManager navigationManager) + { + _navigationManager = navigationManager; + } + + /// + protected internal override bool SupportsCascadingParameterAttributeType(Type attributeType) + => attributeType == typeof(SupplyParameterFromQueryAttribute); + + /// + protected internal override bool SupportsParameterType(Type type) + => QueryParameterValueSupplier.CanSupplyValueForType(type); + + /// + protected internal override bool CanSupplyValue(ModelBindingContext? bindingContext, in CascadingParameterInfo parameterInfo) + // We can always supply a value; it'll just be null if there's no match. + => true; + + /// + protected internal override object? GetCurrentValue(ModelBindingContext? bindingContext, in CascadingParameterInfo parameterInfo) + { + if (_queryParametersMightHaveChanged) + { + _queryParametersMightHaveChanged = false; + UpdateQueryParameters(); + } + + var queryParameterName = parameterInfo.Attribute.Name ?? parameterInfo.PropertyName; + return _queryParameterValueSupplier.GetQueryParameterValue(parameterInfo.PropertyType, queryParameterName); + } + + /// + protected internal override void Subscribe(ComponentState subscriber) + { + SubscribeToLocationChanges(); + + _subscribers ??= new(); + _subscribers.Add(subscriber); + } + + /// + protected internal override void Unsubscribe(ComponentState subscriber) + { + _subscribers!.Remove(subscriber); + + if (_subscribers.Count == 0) + { + UnsubscribeFromLocationChanges(); + } + } + + private void UpdateQueryParameters() + { + var query = GetQueryString(_navigationManager.Uri); + + _queryParameterValueSupplier.ReadParametersFromQuery(query); + + static ReadOnlyMemory GetQueryString(string url) + { + var queryStartPos = url.IndexOf('?'); + + if (queryStartPos < 0) + { + return default; + } + + var queryEndPos = url.IndexOf('#', queryStartPos); + return url.AsMemory(queryStartPos..(queryEndPos < 0 ? url.Length : queryEndPos)); + } + } + + private void SubscribeToLocationChanges() + { + if (_isSubscribedToLocationChanges) + { + return; + } + + _isSubscribedToLocationChanges = true; + _queryParametersMightHaveChanged = true; + _navigationManager.LocationChanged += OnLocationChanged; + } + + private void UnsubscribeFromLocationChanges() + { + if (!_isSubscribedToLocationChanges) + { + return; + } + + _isSubscribedToLocationChanges = false; + _navigationManager.LocationChanged -= OnLocationChanged; + } + + private void OnLocationChanged(object? sender, LocationChangedEventArgs args) + { + _queryParametersMightHaveChanged = true; + + if (_subscribers is not null) + { + foreach (var subscriber in _subscribers) + { + subscriber.NotifyCascadingValueChanged(ParameterViewLifetime.Unbound); + } + } + } + + void IDisposable.Dispose() + { + UnsubscribeFromLocationChanges(); + } +} diff --git a/src/Components/Components/src/Binding/IFormValueSupplier.cs b/src/Components/Components/src/Binding/IFormValueSupplier.cs index b8696a224339..4b5403222409 100644 --- a/src/Components/Components/src/Binding/IFormValueSupplier.cs +++ b/src/Components/Components/src/Binding/IFormValueSupplier.cs @@ -6,7 +6,7 @@ namespace Microsoft.AspNetCore.Components.Binding; /// -/// Binds form data valuesto a model. +/// Binds form data values to a model. /// public interface IFormValueSupplier { diff --git a/src/Components/Components/src/CascadingParameterAttribute.cs b/src/Components/Components/src/CascadingParameterAttribute.cs index 70cb5998ff72..bb9be43a5b08 100644 --- a/src/Components/Components/src/CascadingParameterAttribute.cs +++ b/src/Components/Components/src/CascadingParameterAttribute.cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Components; /// supplies values with a compatible type and name. /// [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] -public sealed class CascadingParameterAttribute : Attribute +public sealed class CascadingParameterAttribute : CascadingParameterAttributeBase { /// /// If specified, the parameter value will be supplied by the closest @@ -20,5 +20,5 @@ public sealed class CascadingParameterAttribute : Attribute /// that supplies a value with a compatible /// type. /// - public string? Name { get; set; } + public override string? Name { get; set; } } diff --git a/src/Components/Components/src/CascadingParameterAttributeBase.cs b/src/Components/Components/src/CascadingParameterAttributeBase.cs new file mode 100644 index 000000000000..f85fbaa6cffc --- /dev/null +++ b/src/Components/Components/src/CascadingParameterAttributeBase.cs @@ -0,0 +1,16 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Microsoft.AspNetCore.Components; + +/// +/// Represents a parameter whose value cascades down the component hierarchy. +/// +public abstract class CascadingParameterAttributeBase : Attribute +{ + /// + /// Gets or sets the name for the parameter, which correlates to the name + /// of a cascading value. + /// + public abstract string? Name { get; set; } +} diff --git a/src/Components/Components/src/CascadingParameterInfo.cs b/src/Components/Components/src/CascadingParameterInfo.cs new file mode 100644 index 000000000000..2d8493ff70f4 --- /dev/null +++ b/src/Components/Components/src/CascadingParameterInfo.cs @@ -0,0 +1,32 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Microsoft.AspNetCore.Components; + +/// +/// Contains information about a cascading parameter. +/// +public readonly struct CascadingParameterInfo +{ + /// + /// Gets the property's attribute. + /// + public CascadingParameterAttributeBase Attribute { get; } + + /// + /// Gets the name of the parameter's property. + /// + public string PropertyName { get; } + + /// + /// Gets the type of the parameter's property. + /// + public Type PropertyType { get; } + + internal CascadingParameterInfo(CascadingParameterAttributeBase attribute, string propertyName, Type propertyType) + { + Attribute = attribute; + PropertyName = propertyName; + PropertyType = propertyType; + } +} diff --git a/src/Components/Components/src/CascadingParameterState.cs b/src/Components/Components/src/CascadingParameterState.cs index 7af4dc1b9cce..1c9b95b720b4 100644 --- a/src/Components/Components/src/CascadingParameterState.cs +++ b/src/Components/Components/src/CascadingParameterState.cs @@ -13,21 +13,21 @@ namespace Microsoft.AspNetCore.Components; internal readonly struct CascadingParameterState { - private static readonly ConcurrentDictionary _cachedInfos = new(); + private static readonly ConcurrentDictionary _cachedInfos = new(); - public string LocalValueName { get; } - public ICascadingValueComponent ValueSupplier { get; } + public CascadingParameterInfo ParameterInfo { get; } + public ICascadingValueSupplier ValueSupplier { get; } - public CascadingParameterState(string localValueName, ICascadingValueComponent valueSupplier) + public CascadingParameterState(in CascadingParameterInfo parameterInfo, ICascadingValueSupplier valueSupplier) { - LocalValueName = localValueName; + ParameterInfo = parameterInfo; ValueSupplier = valueSupplier; } public static IReadOnlyList FindCascadingParameters(ComponentState componentState) { var componentType = componentState.Component.GetType(); - var infos = GetReflectedCascadingParameterInfos(componentType); + var infos = GetCascadingParameterInfos(componentType); // For components known not to have any cascading parameters, bail out early if (infos.Length == 0) @@ -48,23 +48,21 @@ public static IReadOnlyList FindCascadingParameters(Com { // Although not all parameters might be matched, we know the maximum number resultStates ??= new List(infos.Length - infoIndex); - - resultStates.Add(new CascadingParameterState(info.ConsumerValueName, supplier)); + resultStates.Add(new CascadingParameterState(info, supplier)); } } return resultStates ?? (IReadOnlyList)Array.Empty(); } - private static ICascadingValueComponent? GetMatchingCascadingValueSupplier(in ReflectedCascadingParameterInfo info, ComponentState componentState) + private static ICascadingValueSupplier? GetMatchingCascadingValueSupplier(in CascadingParameterInfo info, ComponentState componentState) { var candidate = componentState; do { - if (candidate.Component is ICascadingValueComponent candidateSupplier - && candidateSupplier.CanSupplyValue(info.ValueType, info.SupplierValueName)) + if (candidate.Component is ICascadingValueSupplier valueSupplier && valueSupplier.CanSupplyValue(info)) { - return candidateSupplier; + return valueSupplier; } candidate = candidate.ParentComponentState; @@ -74,64 +72,37 @@ public static IReadOnlyList FindCascadingParameters(Com return null; } - private static ReflectedCascadingParameterInfo[] GetReflectedCascadingParameterInfos( + private static CascadingParameterInfo[] GetCascadingParameterInfos( [DynamicallyAccessedMembers(Component)] Type componentType) { if (!_cachedInfos.TryGetValue(componentType, out var infos)) { - infos = CreateReflectedCascadingParameterInfos(componentType); + infos = CreateCascadingParameterInfos(componentType); _cachedInfos[componentType] = infos; } return infos; } - private static ReflectedCascadingParameterInfo[] CreateReflectedCascadingParameterInfos( + private static CascadingParameterInfo[] CreateCascadingParameterInfos( [DynamicallyAccessedMembers(Component)] Type componentType) { - List? result = null; + List? result = null; var candidateProps = ComponentProperties.GetCandidateBindableProperties(componentType); foreach (var prop in candidateProps) { - var attribute = prop.GetCustomAttribute(); - if (attribute != null) + var cascadingParameterAttribute = prop.GetCustomAttributes() + .OfType().SingleOrDefault(); + if (cascadingParameterAttribute != null) { - result ??= new List(); - - result.Add(new ReflectedCascadingParameterInfo( - prop.Name, - prop.PropertyType, - attribute.Name)); - } - - var hostParameterAttribute = prop.GetCustomAttributes() - .OfType().SingleOrDefault(); - if (hostParameterAttribute != null) - { - result ??= new List(); - - result.Add(new ReflectedCascadingParameterInfo( + result ??= new List(); + result.Add(new CascadingParameterInfo( + cascadingParameterAttribute, prop.Name, - prop.PropertyType, - hostParameterAttribute.Name)); + prop.PropertyType)); } } - return result?.ToArray() ?? Array.Empty(); - } - - readonly struct ReflectedCascadingParameterInfo - { - public string ConsumerValueName { get; } - public string? SupplierValueName { get; } - public Type ValueType { get; } - - public ReflectedCascadingParameterInfo( - string consumerValueName, Type valueType, string? supplierValueName) - { - ConsumerValueName = consumerValueName; - SupplierValueName = supplierValueName; - ValueType = valueType; - } + return result?.ToArray() ?? Array.Empty(); } } diff --git a/src/Components/Components/src/CascadingValue.cs b/src/Components/Components/src/CascadingValue.cs index facb9821e415..a040894ac57c 100644 --- a/src/Components/Components/src/CascadingValue.cs +++ b/src/Components/Components/src/CascadingValue.cs @@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Components; /// /// A component that provides a cascading value to all descendant components. /// -public class CascadingValue : ICascadingValueComponent, IComponent +public class CascadingValue : ICascadingValueSupplier, IComponent { private RenderHandle _renderHandle; private HashSet? _subscribers; // Lazily instantiated @@ -41,10 +41,6 @@ public class CascadingValue : ICascadingValueComponent, IComponent /// [Parameter] public bool IsFixed { get; set; } - object? ICascadingValueComponent.CurrentValue => Value; - - bool ICascadingValueComponent.CurrentValueIsFixed => IsFixed; - /// public void Attach(RenderHandle renderHandle) { @@ -130,37 +126,39 @@ public Task SetParametersAsync(ParameterView parameters) return Task.CompletedTask; } - bool ICascadingValueComponent.CanSupplyValue(Type requestedType, string? requestedName) + bool ICascadingValueSupplier.CanSupplyValue(in CascadingParameterInfo parameterInfo) { - if (!requestedType.IsAssignableFrom(typeof(TValue))) + if (parameterInfo.Attribute is not CascadingParameterAttribute cascadingParameterAttribute || !parameterInfo.PropertyType.IsAssignableFrom(typeof(TValue))) { return false; } + // We only consider explicitly requested names, not the property name. + var requestedName = cascadingParameterAttribute.Name; + return (requestedName == null && Name == null) // Match on type alone || string.Equals(requestedName, Name, StringComparison.OrdinalIgnoreCase); // Also match on name } - void ICascadingValueComponent.Subscribe(ComponentState subscriber) + object? ICascadingValueSupplier.GetCurrentValue(in CascadingParameterInfo parameterInfo) + { + return Value; + } + + void ICascadingValueSupplier.Subscribe(ComponentState subscriber, in CascadingParameterInfo parameterInfo) { -#if DEBUG if (IsFixed) { // Should not be possible. User code cannot trigger this. // Checking only to catch possible future framework bugs. throw new InvalidOperationException($"Cannot subscribe to a {typeof(CascadingValue<>).Name} when {nameof(IsFixed)} is true."); } -#endif - - if (_subscribers == null) - { - _subscribers = new HashSet(); - } + _subscribers ??= new HashSet(); _subscribers.Add(subscriber); } - void ICascadingValueComponent.Unsubscribe(ComponentState subscriber) + void ICascadingValueSupplier.Unsubscribe(ComponentState subscriber, in CascadingParameterInfo parameterInfo) { _subscribers?.Remove(subscriber); } diff --git a/src/Components/Components/src/ICascadingValueComponent.cs b/src/Components/Components/src/ICascadingValueComponent.cs deleted file mode 100644 index b18735c86a9e..000000000000 --- a/src/Components/Components/src/ICascadingValueComponent.cs +++ /dev/null @@ -1,22 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.AspNetCore.Components.Rendering; - -namespace Microsoft.AspNetCore.Components; - -internal interface ICascadingValueComponent -{ - // This interface exists only so that CascadingParameterState has a way - // to work with all CascadingValue types regardless of T. - - bool CanSupplyValue(Type valueType, string? valueName); - - object? CurrentValue { get; } - - bool CurrentValueIsFixed { get; } - - void Subscribe(ComponentState subscriber); - - void Unsubscribe(ComponentState subscriber); -} diff --git a/src/Components/Components/src/ICascadingValueSupplier.cs b/src/Components/Components/src/ICascadingValueSupplier.cs new file mode 100644 index 000000000000..c535d9cfda16 --- /dev/null +++ b/src/Components/Components/src/ICascadingValueSupplier.cs @@ -0,0 +1,19 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Microsoft.AspNetCore.Components.Rendering; + +namespace Microsoft.AspNetCore.Components; + +internal interface ICascadingValueSupplier +{ + bool IsFixed { get; } + + bool CanSupplyValue(in CascadingParameterInfo parameterInfo); + + object? GetCurrentValue(in CascadingParameterInfo parameterInfo); + + void Subscribe(ComponentState subscriber, in CascadingParameterInfo parameterInfo); + + void Unsubscribe(ComponentState subscriber, in CascadingParameterInfo parameterInfo); +} diff --git a/src/Components/Components/src/IHostEnvironmentCascadingParameter.cs b/src/Components/Components/src/IHostEnvironmentCascadingParameter.cs deleted file mode 100644 index 8f407e0cdd5e..000000000000 --- a/src/Components/Components/src/IHostEnvironmentCascadingParameter.cs +++ /dev/null @@ -1,11 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -namespace Microsoft.AspNetCore.Components; - -// Marks a cascading parameter that can be offered via an attribute that is not -// directly defined in the Components assembly. For example [SupplyParameterFromForm]. -internal interface IHostEnvironmentCascadingParameter -{ - public string? Name { get; set; } -} diff --git a/src/Components/Components/src/ParameterView.cs b/src/Components/Components/src/ParameterView.cs index 37ba9c2dfbcd..1b3a25d635d1 100644 --- a/src/Components/Components/src/ParameterView.cs +++ b/src/Components/Components/src/ParameterView.cs @@ -423,7 +423,8 @@ public bool MoveNext() _currentIndex = nextIndex; var state = _cascadingParameters[_currentIndex]; - _current = new ParameterValue(state.LocalValueName, state.ValueSupplier.CurrentValue!, true); + var currentValue = state.ValueSupplier.GetCurrentValue(state.ParameterInfo); + _current = new ParameterValue(state.ParameterInfo.PropertyName, currentValue!, true); return true; } else diff --git a/src/Components/Components/src/PublicAPI.Unshipped.txt b/src/Components/Components/src/PublicAPI.Unshipped.txt index 625c0e05e595..f37e9e93b125 100644 --- a/src/Components/Components/src/PublicAPI.Unshipped.txt +++ b/src/Components/Components/src/PublicAPI.Unshipped.txt @@ -1,5 +1,16 @@ #nullable enable +abstract Microsoft.AspNetCore.Components.Binding.CascadingModelBindingProvider.AreValuesFixed.get -> bool +abstract Microsoft.AspNetCore.Components.Binding.CascadingModelBindingProvider.CanSupplyValue(Microsoft.AspNetCore.Components.ModelBindingContext? bindingContext, in Microsoft.AspNetCore.Components.CascadingParameterInfo parameterInfo) -> bool +abstract Microsoft.AspNetCore.Components.Binding.CascadingModelBindingProvider.GetCurrentValue(Microsoft.AspNetCore.Components.ModelBindingContext? bindingContext, in Microsoft.AspNetCore.Components.CascadingParameterInfo parameterInfo) -> object? +abstract Microsoft.AspNetCore.Components.Binding.CascadingModelBindingProvider.SupportsCascadingParameterAttributeType(System.Type! attributeType) -> bool +abstract Microsoft.AspNetCore.Components.Binding.CascadingModelBindingProvider.SupportsParameterType(System.Type! parameterType) -> bool +abstract Microsoft.AspNetCore.Components.CascadingParameterAttributeBase.Name.get -> string? +abstract Microsoft.AspNetCore.Components.CascadingParameterAttributeBase.Name.set -> void abstract Microsoft.AspNetCore.Components.RenderModeAttribute.Mode.get -> Microsoft.AspNetCore.Components.IComponentRenderMode! +Microsoft.AspNetCore.Components.Binding.CascadingModelBindingProvider +Microsoft.AspNetCore.Components.Binding.CascadingModelBindingProvider.CascadingModelBindingProvider() -> void +Microsoft.AspNetCore.Components.Binding.CascadingQueryModelBindingProvider +Microsoft.AspNetCore.Components.Binding.CascadingQueryModelBindingProvider.CascadingQueryModelBindingProvider(Microsoft.AspNetCore.Components.NavigationManager! navigationManager) -> void Microsoft.AspNetCore.Components.Binding.IFormValueSupplier Microsoft.AspNetCore.Components.Binding.IFormValueSupplier.CanBind(string! formName, System.Type! valueType) -> bool Microsoft.AspNetCore.Components.Binding.IFormValueSupplier.CanConvertSingleValue(System.Type! type) -> bool @@ -12,6 +23,13 @@ Microsoft.AspNetCore.Components.CascadingModelBinder.IsFixed.get -> bool Microsoft.AspNetCore.Components.CascadingModelBinder.IsFixed.set -> void Microsoft.AspNetCore.Components.CascadingModelBinder.Name.get -> string! Microsoft.AspNetCore.Components.CascadingModelBinder.Name.set -> void +Microsoft.AspNetCore.Components.CascadingParameterAttributeBase +Microsoft.AspNetCore.Components.CascadingParameterAttributeBase.CascadingParameterAttributeBase() -> void +Microsoft.AspNetCore.Components.CascadingParameterInfo +Microsoft.AspNetCore.Components.CascadingParameterInfo.Attribute.get -> Microsoft.AspNetCore.Components.CascadingParameterAttributeBase! +Microsoft.AspNetCore.Components.CascadingParameterInfo.CascadingParameterInfo() -> void +Microsoft.AspNetCore.Components.CascadingParameterInfo.PropertyName.get -> string! +Microsoft.AspNetCore.Components.CascadingParameterInfo.PropertyType.get -> System.Type! Microsoft.AspNetCore.Components.ComponentBase.DispatchExceptionAsync(System.Exception! exception) -> System.Threading.Tasks.Task! Microsoft.AspNetCore.Components.IComponentRenderMode Microsoft.AspNetCore.Components.Infrastructure.ComponentStatePersistenceManager.PersistStateAsync(Microsoft.AspNetCore.Components.IPersistentComponentStateStore! store, Microsoft.AspNetCore.Components.Dispatcher! dispatcher) -> System.Threading.Tasks.Task! @@ -60,10 +78,20 @@ Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.AddComponentParamete Microsoft.AspNetCore.Components.StreamRenderingAttribute Microsoft.AspNetCore.Components.StreamRenderingAttribute.Enabled.get -> bool Microsoft.AspNetCore.Components.StreamRenderingAttribute.StreamRenderingAttribute(bool enabled) -> void +*REMOVED*Microsoft.AspNetCore.Components.CascadingParameterAttribute.Name.get -> string? +*REMOVED*Microsoft.AspNetCore.Components.CascadingParameterAttribute.Name.set -> void +override Microsoft.AspNetCore.Components.CascadingParameterAttribute.Name.get -> string? +override Microsoft.AspNetCore.Components.CascadingParameterAttribute.Name.set -> void override Microsoft.AspNetCore.Components.EventCallback.GetHashCode() -> int override Microsoft.AspNetCore.Components.EventCallback.Equals(object? obj) -> bool override Microsoft.AspNetCore.Components.EventCallback.GetHashCode() -> int override Microsoft.AspNetCore.Components.EventCallback.Equals(object? obj) -> bool +*REMOVED*Microsoft.AspNetCore.Components.SupplyParameterFromQueryAttribute.Name.get -> string? +*REMOVED*Microsoft.AspNetCore.Components.SupplyParameterFromQueryAttribute.Name.set -> void +override Microsoft.AspNetCore.Components.SupplyParameterFromQueryAttribute.Name.get -> string? +override Microsoft.AspNetCore.Components.SupplyParameterFromQueryAttribute.Name.set -> void +virtual Microsoft.AspNetCore.Components.Binding.CascadingModelBindingProvider.Subscribe(Microsoft.AspNetCore.Components.Rendering.ComponentState! subscriber) -> void +virtual Microsoft.AspNetCore.Components.Binding.CascadingModelBindingProvider.Unsubscribe(Microsoft.AspNetCore.Components.Rendering.ComponentState! subscriber) -> void virtual Microsoft.AspNetCore.Components.Rendering.ComponentState.DisposeAsync() -> System.Threading.Tasks.ValueTask virtual Microsoft.AspNetCore.Components.RenderTree.Renderer.AddPendingTask(Microsoft.AspNetCore.Components.Rendering.ComponentState? componentState, System.Threading.Tasks.Task! task) -> void virtual Microsoft.AspNetCore.Components.RenderTree.Renderer.CreateComponentState(int componentId, Microsoft.AspNetCore.Components.IComponent! component, Microsoft.AspNetCore.Components.Rendering.ComponentState? parentComponentState) -> Microsoft.AspNetCore.Components.Rendering.ComponentState! diff --git a/src/Components/Components/src/Reflection/ComponentProperties.cs b/src/Components/Components/src/Reflection/ComponentProperties.cs index 9569e8e6a84e..507d5bcd353a 100644 --- a/src/Components/Components/src/Reflection/ComponentProperties.cs +++ b/src/Components/Components/src/Reflection/ComponentProperties.cs @@ -170,8 +170,7 @@ private static void ThrowForUnknownIncomingParameterName([DynamicallyAccessedMem if (propertyInfo != null) { if (!propertyInfo.IsDefined(typeof(ParameterAttribute)) && - !propertyInfo.IsDefined(typeof(CascadingParameterAttribute)) && - !propertyInfo.GetCustomAttributes().OfType().Any()) + !propertyInfo.GetCustomAttributes().OfType().Any()) { throw new InvalidOperationException( $"Object of type '{targetType.FullName}' has a property matching the name '{parameterName}', " + @@ -262,8 +261,7 @@ public WritersForType([DynamicallyAccessedMembers(Component)] Type targetType) foreach (var propertyInfo in GetCandidateBindableProperties(targetType)) { ParameterAttribute? parameterAttribute = null; - CascadingParameterAttribute? cascadingParameterAttribute = null; - IHostEnvironmentCascadingParameter? hostEnvironmentCascadingParameter = null; + CascadingParameterAttributeBase? cascadingParameterAttribute = null; var attributes = propertyInfo.GetCustomAttributes(); foreach (var attribute in attributes) @@ -273,18 +271,15 @@ public WritersForType([DynamicallyAccessedMembers(Component)] Type targetType) case ParameterAttribute parameter: parameterAttribute = parameter; break; - case CascadingParameterAttribute cascadingParameter: + case CascadingParameterAttributeBase cascadingParameter: cascadingParameterAttribute = cascadingParameter; break; - case IHostEnvironmentCascadingParameter hostEnvironmentAttribute: - hostEnvironmentCascadingParameter = hostEnvironmentAttribute; - break; default: break; } } - var isParameter = parameterAttribute != null || cascadingParameterAttribute != null || hostEnvironmentCascadingParameter != null; + var isParameter = parameterAttribute != null || cascadingParameterAttribute != null; if (!isParameter) { continue; @@ -299,7 +294,7 @@ public WritersForType([DynamicallyAccessedMembers(Component)] Type targetType) var propertySetter = new PropertySetter(targetType, propertyInfo) { - Cascading = cascadingParameterAttribute != null || hostEnvironmentCascadingParameter != null, + Cascading = cascadingParameterAttribute != null, }; if (_underlyingWriters.ContainsKey(propertyName)) diff --git a/src/Components/Components/src/RenderTree/Renderer.cs b/src/Components/Components/src/RenderTree/Renderer.cs index 187ffb6d8f79..9262cb7423c4 100644 --- a/src/Components/Components/src/RenderTree/Renderer.cs +++ b/src/Components/Components/src/RenderTree/Renderer.cs @@ -131,7 +131,6 @@ private async void RenderRootComponentsOnHotReload() // Before re-rendering the root component, also clear any well-known caches in the framework ComponentFactory.ClearCache(); ComponentProperties.ClearCache(); - Routing.QueryParameterValueSupplier.ClearCache(); await Dispatcher.InvokeAsync(() => { diff --git a/src/Components/Components/src/Rendering/ComponentState.cs b/src/Components/Components/src/Rendering/ComponentState.cs index f7de9f106215..c2b9276485a1 100644 --- a/src/Components/Components/src/Rendering/ComponentState.cs +++ b/src/Components/Components/src/Rendering/ComponentState.cs @@ -194,9 +194,9 @@ private bool AddCascadingParameterSubscriptions() for (var i = 0; i < numCascadingParameters; i++) { var valueSupplier = _cascadingParameters[i].ValueSupplier; - if (!valueSupplier.CurrentValueIsFixed) + if (!valueSupplier.IsFixed) { - valueSupplier.Subscribe(this); + valueSupplier.Subscribe(this, _cascadingParameters[i].ParameterInfo); hasSubscription = true; } } @@ -210,9 +210,9 @@ private void RemoveCascadingParameterSubscriptions() for (var i = 0; i < numCascadingParameters; i++) { var supplier = _cascadingParameters[i].ValueSupplier; - if (!supplier.CurrentValueIsFixed) + if (!supplier.IsFixed) { - supplier.Unsubscribe(this); + supplier.Unsubscribe(this, _cascadingParameters[i].ParameterInfo); } } } diff --git a/src/Components/Components/src/RouteView.cs b/src/Components/Components/src/RouteView.cs index 3d07cbc4f903..bb778771a09f 100644 --- a/src/Components/Components/src/RouteView.cs +++ b/src/Components/Components/src/RouteView.cs @@ -8,7 +8,6 @@ using System.Reflection; using Microsoft.AspNetCore.Components.HotReload; using Microsoft.AspNetCore.Components.Rendering; -using Microsoft.AspNetCore.Components.Routing; namespace Microsoft.AspNetCore.Components; @@ -103,23 +102,6 @@ void RenderPageCore(RenderTreeBuilder builder) builder.AddComponentParameter(1, kvp.Key, kvp.Value); } - var queryParameterSupplier = QueryParameterValueSupplier.ForType(RouteData.PageType); - if (queryParameterSupplier is not null) - { - // Since this component does accept some parameters from query, we must supply values for all of them, - // even if the querystring in the URI is empty. So don't skip the following logic. - var relativeUrl = NavigationManager.ToBaseRelativePath(NavigationManager.Uri); - var url = NavigationManager.Uri; - ReadOnlyMemory query = default; - var queryStartPos = url.IndexOf('?'); - if (queryStartPos >= 0) - { - var queryEndPos = url.IndexOf('#', queryStartPos); - query = url.AsMemory(queryStartPos..(queryEndPos < 0 ? url.Length : queryEndPos)); - } - queryParameterSupplier.RenderParametersFromQueryString(builder, query); - } - builder.CloseComponent(); } } diff --git a/src/Components/Components/src/Routing/QueryParameterValueSupplier.cs b/src/Components/Components/src/Routing/QueryParameterValueSupplier.cs index b217d09878ff..967169ee0191 100644 --- a/src/Components/Components/src/Routing/QueryParameterValueSupplier.cs +++ b/src/Components/Components/src/Routing/QueryParameterValueSupplier.cs @@ -1,189 +1,60 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Buffers; -using System.Collections.Concurrent; -using System.Diagnostics.CodeAnalysis; -using System.Reflection; -using Microsoft.AspNetCore.Components.Reflection; -using Microsoft.AspNetCore.Components.Rendering; +using System.Runtime.InteropServices; using Microsoft.AspNetCore.Internal; -using static Microsoft.AspNetCore.Internal.LinkerFlags; namespace Microsoft.AspNetCore.Components.Routing; internal sealed class QueryParameterValueSupplier { - public static void ClearCache() => _cacheByType.Clear(); + private readonly Dictionary, StringSegmentAccumulator> _queryParameterValuesByName = new(QueryParameterNameComparer.Instance); - private static readonly ConcurrentDictionary _cacheByType = new(); - - // These two arrays contain the same number of entries, and their corresponding positions refer to each other. - // Holding the info like this means we can use Array.BinarySearch with less custom implementation. - private readonly ReadOnlyMemory[] _queryParameterNames; - private readonly QueryParameterDestination[] _destinations; - - public static QueryParameterValueSupplier? ForType([DynamicallyAccessedMembers(Component)] Type componentType) + public void ReadParametersFromQuery(ReadOnlyMemory query) { - if (!_cacheByType.TryGetValue(componentType, out var instanceOrNull)) - { - // If the component doesn't have any query parameters, store a null value for it - // so we know the upstream code can't try to render query parameter frames for it. - var sortedMappings = GetSortedMappings(componentType); - instanceOrNull = sortedMappings == null ? null : new QueryParameterValueSupplier(sortedMappings); - _cacheByType.TryAdd(componentType, instanceOrNull); - } + _queryParameterValuesByName.Clear(); - return instanceOrNull; - } + var queryStringEnumerable = new QueryStringEnumerable(query); - private QueryParameterValueSupplier(QueryParameterMapping[] sortedMappings) - { - _queryParameterNames = new ReadOnlyMemory[sortedMappings.Length]; - _destinations = new QueryParameterDestination[sortedMappings.Length]; - for (var i = 0; i < sortedMappings.Length; i++) + foreach (var suppliedPair in queryStringEnumerable) { - ref var mapping = ref sortedMappings[i]; - _queryParameterNames[i] = mapping.QueryParameterName; - _destinations[i] = mapping.Destination; + var decodedName = suppliedPair.DecodeName(); + var decodedValue = suppliedPair.DecodeValue(); + + // This is safe because we don't mutate the dictionary while the ref local is in scope. + ref var values = ref CollectionsMarshal.GetValueRefOrAddDefault(_queryParameterValuesByName, decodedName, out _); + values.Add(decodedValue); } } - public void RenderParametersFromQueryString(RenderTreeBuilder builder, ReadOnlyMemory queryString) + public object? GetQueryParameterValue(Type targetType, string queryParameterName) { - // If there's no querystring contents, we can skip renting from the pool - if (queryString.IsEmpty) - { - for (var destinationIndex = 0; destinationIndex < _destinations.Length; destinationIndex++) - { - ref var destination = ref _destinations[destinationIndex]; - var blankValue = destination.IsArray ? destination.Parser.ParseMultiple(default, string.Empty) : null; - builder.AddComponentParameter(0, destination.ComponentParameterName, blankValue); - } - return; - } + var isArray = targetType.IsArray; + var elementType = isArray ? targetType.GetElementType()! : targetType; - // Temporary workspace in which we accumulate the data while walking the querystring. - var valuesByMapping = ArrayPool.Shared.Rent(_destinations.Length); - - try + if (!UrlValueConstraint.TryGetByTargetType(elementType, out var parser)) { - // Capture values by destination in a single pass through the querystring - var queryStringEnumerable = new QueryStringEnumerable(queryString); - foreach (var suppliedPair in queryStringEnumerable) - { - var decodedName = suppliedPair.DecodeName(); - var mappingIndex = Array.BinarySearch(_queryParameterNames, decodedName, QueryParameterNameComparer.Instance); - if (mappingIndex >= 0) - { - var decodedValue = suppliedPair.DecodeValue(); - - if (_destinations[mappingIndex].IsArray) - { - valuesByMapping[mappingIndex].Add(decodedValue); - } - else - { - valuesByMapping[mappingIndex].SetSingle(decodedValue); - } - } - } - - // Finally, emit the parameter attributes by parsing all the string segments and building arrays - for (var mappingIndex = 0; mappingIndex < _destinations.Length; mappingIndex++) - { - ref var destination = ref _destinations[mappingIndex]; - ref var values = ref valuesByMapping[mappingIndex]; + throw new InvalidOperationException($"Querystring values cannot be parsed as type '{elementType}'."); + } - var parsedValue = destination.IsArray - ? destination.Parser.ParseMultiple(values, destination.ComponentParameterName) - : values.Count == 0 - ? default - : destination.Parser.Parse(values[0].Span, destination.ComponentParameterName); + var values = _queryParameterValuesByName.GetValueOrDefault(queryParameterName.AsMemory()); - builder.AddComponentParameter(0, destination.ComponentParameterName, parsedValue); - } - } - finally + if (isArray) { - ArrayPool.Shared.Return(valuesByMapping, true); + return parser.ParseMultiple(values, queryParameterName); } - } - - private static QueryParameterMapping[]? GetSortedMappings([DynamicallyAccessedMembers(Component)] Type componentType) - { - var candidateProperties = MemberAssignment.GetPropertiesIncludingInherited(componentType, ComponentProperties.BindablePropertyFlags); - HashSet>? usedQueryParameterNames = null; - List? mappings = null; - foreach (var propertyInfo in candidateProperties) + if (values.Count > 0) { - if (!propertyInfo.IsDefined(typeof(ParameterAttribute))) - { - continue; - } - - var fromQueryAttribute = propertyInfo.GetCustomAttribute(); - if (fromQueryAttribute is not null) - { - // Found a parameter that's assignable from querystring - var componentParameterName = propertyInfo.Name; - var queryParameterName = (string.IsNullOrEmpty(fromQueryAttribute.Name) - ? componentParameterName - : fromQueryAttribute.Name).AsMemory(); - - // If it's an array type, capture that info and prepare to parse the element type - Type effectiveType = propertyInfo.PropertyType; - var isArray = false; - if (effectiveType.IsArray) - { - isArray = true; - effectiveType = effectiveType.GetElementType()!; - } - - if (!UrlValueConstraint.TryGetByTargetType(effectiveType, out var parser)) - { - throw new NotSupportedException($"Querystring values cannot be parsed as type '{propertyInfo.PropertyType}'."); - } - - // Add the destination for this component parameter name - usedQueryParameterNames ??= new(QueryParameterNameComparer.Instance); - if (usedQueryParameterNames.Contains(queryParameterName)) - { - throw new InvalidOperationException($"The component '{componentType}' declares more than one mapping for the query parameter '{queryParameterName}'."); - } - usedQueryParameterNames.Add(queryParameterName); - - mappings ??= new(); - mappings.Add(new QueryParameterMapping - { - QueryParameterName = queryParameterName, - Destination = new QueryParameterDestination(componentParameterName, parser, isArray) - }); - } + return parser.Parse(values[0].Span, queryParameterName); } - mappings?.Sort((a, b) => QueryParameterNameComparer.Instance.Compare(a.QueryParameterName, b.QueryParameterName)); - return mappings?.ToArray(); - } - - private readonly struct QueryParameterMapping - { - public ReadOnlyMemory QueryParameterName { get; init; } - public QueryParameterDestination Destination { get; init; } + return default; } - private readonly struct QueryParameterDestination + public static bool CanSupplyValueForType(Type targetType) { - public readonly string ComponentParameterName; - public readonly UrlValueConstraint Parser; - public readonly bool IsArray; - - public QueryParameterDestination(string componentParameterName, UrlValueConstraint parser, bool isArray) - { - ComponentParameterName = componentParameterName; - Parser = parser; - IsArray = isArray; - } + var elementType = targetType.IsArray ? targetType.GetElementType()! : targetType; + return UrlValueConstraint.TryGetByTargetType(elementType, out _); } } diff --git a/src/Components/Components/src/SupplyParameterFromQueryAttribute.cs b/src/Components/Components/src/SupplyParameterFromQueryAttribute.cs index f88fe737c598..ffae75576ff7 100644 --- a/src/Components/Components/src/SupplyParameterFromQueryAttribute.cs +++ b/src/Components/Components/src/SupplyParameterFromQueryAttribute.cs @@ -8,11 +8,11 @@ namespace Microsoft.AspNetCore.Components; /// current URL querystring. They may also supply further values if the URL querystring changes. /// [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] -public sealed class SupplyParameterFromQueryAttribute : Attribute +public sealed class SupplyParameterFromQueryAttribute : CascadingParameterAttributeBase { /// /// Gets or sets the name of the querystring parameter. If null, the querystring /// parameter is assumed to have the same name as the associated property. /// - public string? Name { get; set; } + public override string? Name { get; set; } } diff --git a/src/Components/Components/test/CascadingModelBinderTest.cs b/src/Components/Components/test/CascadingModelBinderTest.cs index c20703b51d8f..48a6f5ecff15 100644 --- a/src/Components/Components/test/CascadingModelBinderTest.cs +++ b/src/Components/Components/test/CascadingModelBinderTest.cs @@ -20,6 +20,7 @@ public CascadingModelBinderTest() _navigationManager = new TestNavigationManager(); serviceCollection.AddSingleton(_navigationManager); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); var services = serviceCollection.BuildServiceProvider(); _renderer = new TestRenderer(services); } diff --git a/src/Components/Components/test/CascadingParameterStateTest.cs b/src/Components/Components/test/CascadingParameterStateTest.cs index 6edf09f31e21..89a1a0148402 100644 --- a/src/Components/Components/test/CascadingParameterStateTest.cs +++ b/src/Components/Components/test/CascadingParameterStateTest.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Diagnostics.CodeAnalysis; using Microsoft.AspNetCore.Components.Binding; using Microsoft.AspNetCore.Components.Rendering; using Microsoft.AspNetCore.Components.Test.Helpers; @@ -83,7 +82,7 @@ public void FindCascadingParameters_IfHasPartialMatchesInAncestors_ReturnsMatche // Assert Assert.Collection(result, match => { - Assert.Equal(nameof(ComponentWithCascadingParams.CascadingParam2), match.LocalValueName); + Assert.Equal(nameof(ComponentWithCascadingParams.CascadingParam2), match.ParameterInfo.PropertyName); Assert.Same(states[1].Component, match.ValueSupplier); }); } @@ -103,15 +102,15 @@ public void FindCascadingParameters_IfHasMultipleMatchesInAncestors_ReturnsMatch var result = CascadingParameterState.FindCascadingParameters(states.Last()); // Assert - Assert.Collection(result.OrderBy(x => x.LocalValueName), + Assert.Collection(result.OrderBy(x => x.ParameterInfo.PropertyName), match => { - Assert.Equal(nameof(ComponentWithCascadingParams.CascadingParam1), match.LocalValueName); + Assert.Equal(nameof(ComponentWithCascadingParams.CascadingParam1), match.ParameterInfo.PropertyName); Assert.Same(states[3].Component, match.ValueSupplier); }, match => { - Assert.Equal(nameof(ComponentWithCascadingParams.CascadingParam2), match.LocalValueName); + Assert.Equal(nameof(ComponentWithCascadingParams.CascadingParam2), match.ParameterInfo.PropertyName); Assert.Same(states[1].Component, match.ValueSupplier); }); } @@ -129,15 +128,15 @@ public void FindCascadingParameters_InheritedParameters_ReturnsMatches() var result = CascadingParameterState.FindCascadingParameters(states.Last()); // Assert - Assert.Collection(result.OrderBy(x => x.LocalValueName), + Assert.Collection(result.OrderBy(x => x.ParameterInfo.PropertyName), match => { - Assert.Equal(nameof(ComponentWithCascadingParams.CascadingParam1), match.LocalValueName); + Assert.Equal(nameof(ComponentWithCascadingParams.CascadingParam1), match.ParameterInfo.PropertyName); Assert.Same(states[0].Component, match.ValueSupplier); }, match => { - Assert.Equal(nameof(ComponentWithInheritedCascadingParams.CascadingParam3), match.LocalValueName); + Assert.Equal(nameof(ComponentWithInheritedCascadingParams.CascadingParam3), match.ParameterInfo.PropertyName); Assert.Same(states[1].Component, match.ValueSupplier); }); } @@ -156,7 +155,7 @@ public void FindCascadingParameters_ComponentRequestsBaseType_ReturnsMatches() // Assert Assert.Collection(result, match => { - Assert.Equal(nameof(ComponentWithGenericCascadingParam.LocalName), match.LocalValueName); + Assert.Equal(nameof(ComponentWithGenericCascadingParam.LocalName), match.ParameterInfo.PropertyName); Assert.Same(states[0].Component, match.ValueSupplier); }); } @@ -175,7 +174,7 @@ public void FindCascadingParameters_ComponentRequestsImplementedInterface_Return // Assert Assert.Collection(result, match => { - Assert.Equal(nameof(ComponentWithGenericCascadingParam.LocalName), match.LocalValueName); + Assert.Equal(nameof(ComponentWithGenericCascadingParam.LocalName), match.ParameterInfo.PropertyName); Assert.Same(states[0].Component, match.ValueSupplier); }); } @@ -209,7 +208,7 @@ public void FindCascadingParameters_TypeAssignmentIsValidForNullValue_ReturnsMat // Assert Assert.Collection(result, match => { - Assert.Equal(nameof(ComponentWithGenericCascadingParam.LocalName), match.LocalValueName); + Assert.Equal(nameof(ComponentWithGenericCascadingParam.LocalName), match.ParameterInfo.PropertyName); Assert.Same(states[0].Component, match.ValueSupplier); }); } @@ -303,7 +302,7 @@ public void FindCascadingParameters_MatchingNameAndType_ReturnsMatches() // Assert Assert.Collection(result, match => { - Assert.Equal(nameof(ComponentWithNamedCascadingParam.SomeLocalName), match.LocalValueName); + Assert.Equal(nameof(ComponentWithNamedCascadingParam.SomeLocalName), match.ParameterInfo.PropertyName); Assert.Same(states[0].Component, match.ValueSupplier); }); } @@ -323,15 +322,15 @@ public void FindCascadingParameters_MultipleMatchingAncestors_ReturnsClosestMatc var result = CascadingParameterState.FindCascadingParameters(states.Last()); // Assert - Assert.Collection(result.OrderBy(x => x.LocalValueName), + Assert.Collection(result.OrderBy(x => x.ParameterInfo.PropertyName), match => { - Assert.Equal(nameof(ComponentWithCascadingParams.CascadingParam1), match.LocalValueName); + Assert.Equal(nameof(ComponentWithCascadingParams.CascadingParam1), match.ParameterInfo.PropertyName); Assert.Same(states[2].Component, match.ValueSupplier); }, match => { - Assert.Equal(nameof(ComponentWithCascadingParams.CascadingParam2), match.LocalValueName); + Assert.Equal(nameof(ComponentWithCascadingParams.CascadingParam2), match.ParameterInfo.PropertyName); Assert.Same(states[3].Component, match.ValueSupplier); }); } @@ -349,12 +348,12 @@ public void FindCascadingParameters_CanOverrideNonNullValueWithNull() var result = CascadingParameterState.FindCascadingParameters(states.Last()); // Assert - Assert.Collection(result.OrderBy(x => x.LocalValueName), + Assert.Collection(result.OrderBy(x => x.ParameterInfo.PropertyName), match => { - Assert.Equal(nameof(ComponentWithCascadingParams.CascadingParam1), match.LocalValueName); + Assert.Equal(nameof(ComponentWithCascadingParams.CascadingParam1), match.ParameterInfo.PropertyName); Assert.Same(states[1].Component, match.ValueSupplier); - Assert.Null(match.ValueSupplier.CurrentValue); + Assert.Null(match.ValueSupplier.GetCurrentValue(match.ParameterInfo)); }); } @@ -362,15 +361,14 @@ public void FindCascadingParameters_CanOverrideNonNullValueWithNull() public void FindCascadingParameters_HandlesSupplyParameterFromFormValues() { // Arrange + var provider = new TestCascadingFormModelBindingProvider + { + FormName = "", + CurrentValue = "some value", + }; var cascadingModelBinder = new CascadingModelBinder { - FormValueSupplier = new TestFormValueSupplier() - { - FormName = "", - ValueType = typeof(string), - BindResult = true, - BoundValue = "some value" - }, + ModelBindingProviders = new[] { provider }, Navigation = Mock.Of(), Name = "" }; @@ -393,17 +391,16 @@ public void FindCascadingParameters_HandlesSupplyParameterFromFormValues() public void FindCascadingParameters_HandlesSupplyParameterFromFormValues_WithName() { // Arrange + var provider = new TestCascadingFormModelBindingProvider + { + FormName = "some-name", + CurrentValue = "some value", + }; var cascadingModelBinder = new CascadingModelBinder { - FormValueSupplier = new TestFormValueSupplier() - { - FormName = "some-name", - ValueType = typeof(string), - BindResult = true, - BoundValue = "some value" - }, + ModelBindingProviders = new[] { provider }, Navigation = new TestNavigationManager(), - Name = "" + Name = "some-name" }; cascadingModelBinder.UpdateBindingInformation("https://localhost/"); @@ -519,32 +516,25 @@ class CascadingValueTypeBaseClass { } class CascadingValueTypeDerivedClass : CascadingValueTypeBaseClass, ICascadingValueTypeDerivedClassInterface { } interface ICascadingValueTypeDerivedClassInterface { } - private class TestFormValueSupplier : IFormValueSupplier + private class TestCascadingFormModelBindingProvider : CascadingModelBindingProvider { - public string FormName { get; set; } + public required string FormName { get; init; } - public Type ValueType { get; set; } + public required string CurrentValue { get; init; } - public object BoundValue { get; set; } + protected internal override bool AreValuesFixed => true; - public bool BindResult { get; set; } + protected internal override bool CanSupplyValue(ModelBindingContext bindingContext, in CascadingParameterInfo parameterInfo) + => string.Equals(bindingContext.Name, FormName, StringComparison.Ordinal); - public bool CanBind(string formName, Type valueType) - { - return string.Equals(formName, FormName, StringComparison.Ordinal) && - valueType == ValueType; - } + protected internal override object GetCurrentValue(ModelBindingContext bindingContext, in CascadingParameterInfo parameterInfo) + => CurrentValue; - public bool CanConvertSingleValue(Type type) - { - return type == ValueType; - } + protected internal override bool SupportsCascadingParameterAttributeType(Type attributeType) + => attributeType == typeof(SupplyParameterFromFormAttribute); - public bool TryBind(string formName, Type valueType, [NotNullWhen(true)] out object boundValue) - { - boundValue = BoundValue; - return BindResult; - } + protected internal override bool SupportsParameterType(Type parameterType) + => parameterType == typeof(string); } class TestNavigationManager : NavigationManager @@ -557,11 +547,11 @@ public TestNavigationManager() } [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] -public sealed class SupplyParameterFromFormAttribute : Attribute, IHostEnvironmentCascadingParameter +public sealed class SupplyParameterFromFormAttribute : CascadingParameterAttributeBase { /// /// Gets or sets the name for the parameter. The name is used to match /// the form data and decide whether or not the value needs to be bound. /// - public string Name { get; set; } + public override string Name { get; set; } } diff --git a/src/Components/Components/test/CascadingParameterTest.cs b/src/Components/Components/test/CascadingParameterTest.cs index 0330b92fede7..ba97eeb110f0 100644 --- a/src/Components/Components/test/CascadingParameterTest.cs +++ b/src/Components/Components/test/CascadingParameterTest.cs @@ -384,6 +384,59 @@ public void ParameterViewSuppliedWithCascadingParametersCannotBeUsedAfterSynchro Assert.Equal($"The {nameof(ParameterView)} instance can no longer be read because it has expired. {nameof(ParameterView)} can only be read synchronously and must not be stored for later use.", ex.Message); } + [Fact] + public void CanSupplyCascadingValuesForSpecificCascadingParameterAttributeType() + { + // Arrange + var renderer = new TestRenderer(); + var component = new TestComponent(builder => + { + builder.OpenComponent>(0); + builder.AddComponentParameter(1, "Value", "Hello 1"); + builder.AddComponentParameter(2, "ChildContent", new RenderFragment(builder => + { + builder.OpenComponent>(0); + builder.AddComponentParameter(1, "Value", "Hello 2"); + builder.AddComponentParameter(2, "ChildContent", new RenderFragment(builder => + { + builder.OpenComponent(0); + builder.CloseComponent(); + builder.OpenComponent(1); + builder.CloseComponent(); + })); + builder.CloseComponent(); + })); + builder.CloseComponent(); + }); + + // Act/Assert + var componentId = renderer.AssignRootComponentId(component); + component.TriggerRender(); + var batch = renderer.Batches.Single(); + var nestedComponent1 = FindComponent(batch, out var nestedComponentId1); + var nestedComponent2 = FindComponent(batch, out var nestedComponentId2); + var nestedComponentDiff1 = batch.DiffsByComponentId[nestedComponentId1].Single(); + var nestedComponentDiff2 = batch.DiffsByComponentId[nestedComponentId2].Single(); + + // The nested components were rendered with the correct parameters + Assert.Collection(nestedComponentDiff1.Edits, + edit => + { + Assert.Equal(RenderTreeEditType.PrependFrame, edit.Type); + AssertFrame.Text( + batch.ReferenceFrames[edit.ReferenceFrameIndex], + "Value 1 is 'Hello 1'."); + }); + Assert.Collection(nestedComponentDiff2.Edits, + edit => + { + Assert.Equal(RenderTreeEditType.PrependFrame, edit.Type); + AssertFrame.Text( + batch.ReferenceFrames[edit.ReferenceFrameIndex], + "Value 2 is 'Hello 2'."); + }); + } + private static T FindComponent(CapturedBatch batch, out int componentId) { var componentFrame = batch.ReferenceFrames.Single( @@ -441,4 +494,79 @@ class SecondCascadingParameterConsumerComponent : CascadingParameterCons { [CascadingParameter] T2 SecondCascadingParameter { get; set; } } + + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] + class CustomCascadingParameter1Attribute : CascadingParameterAttributeBase + { + public override string Name { get; set; } + } + + [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] + class CustomCascadingParameter2Attribute : CascadingParameterAttributeBase + { + public override string Name { get; set; } + } + + class CustomCascadingValueProducer : AutoRenderComponent, ICascadingValueSupplier + { + [Parameter] public object Value { get; set; } + + [Parameter] public RenderFragment ChildContent { get; set; } + + bool ICascadingValueSupplier.IsFixed => true; + + protected override void BuildRenderTree(RenderTreeBuilder builder) + { + builder.AddContent(0, ChildContent); + } + + bool ICascadingValueSupplier.CanSupplyValue(in CascadingParameterInfo parameterInfo) + { + if (parameterInfo.Attribute is not TAttribute || + parameterInfo.PropertyType != typeof(object) || + parameterInfo.PropertyName != nameof(Value)) + { + return false; + } + + return true; + } + + object ICascadingValueSupplier.GetCurrentValue(in CascadingParameterInfo cascadingParameterState) + { + return Value; + } + + void ICascadingValueSupplier.Subscribe(ComponentState subscriber, in CascadingParameterInfo parameterInfo) + { + throw new NotImplementedException(); + } + + void ICascadingValueSupplier.Unsubscribe(ComponentState subscriber, in CascadingParameterInfo parameterInfo) + { + throw new NotImplementedException(); + } + } + + class CustomCascadingValueConsumer1 : AutoRenderComponent + { + [CustomCascadingParameter1(Name = nameof(Value))] + public object Value { get; set; } + + protected override void BuildRenderTree(RenderTreeBuilder builder) + { + builder.AddContent(0, $"Value 1 is '{Value}'."); + } + } + + class CustomCascadingValueConsumer2 : AutoRenderComponent + { + [CustomCascadingParameter2(Name = nameof(Value))] + public object Value { get; set; } + + protected override void BuildRenderTree(RenderTreeBuilder builder) + { + builder.AddContent(0, $"Value 2 is '{Value}'."); + } + } } diff --git a/src/Components/Components/test/ParameterViewTest.Assignment.cs b/src/Components/Components/test/ParameterViewTest.Assignment.cs index bcc032c7e080..a85b6d9cd03e 100644 --- a/src/Components/Components/test/ParameterViewTest.Assignment.cs +++ b/src/Components/Components/test/ParameterViewTest.Assignment.cs @@ -646,11 +646,10 @@ class HasNonPublicCascadingParameter class ParameterViewBuilder : IEnumerable { - private readonly List<(string Name, object Value, bool Cascading)> _keyValuePairs - = new List<(string, object, bool)>(); + private readonly List<(string Name, object Value, bool Cascading)> _parameters = new(); public void Add(string name, object value, bool cascading = false) - => _keyValuePairs.Add((name, value, cascading)); + => _parameters.Add((name, value, cascading)); public IEnumerator GetEnumerator() => throw new NotImplementedException(); @@ -660,11 +659,11 @@ public ParameterView Build() var builder = new RenderTreeBuilder(); builder.OpenComponent(0); - foreach (var kvp in _keyValuePairs) + foreach (var (name, value, cascading) in _parameters) { - if (!kvp.Cascading) + if (!cascading) { - builder.AddComponentParameter(1, kvp.Name, kvp.Value); + builder.AddComponentParameter(1, name, value); } } builder.CloseComponent(); @@ -672,11 +671,11 @@ public ParameterView Build() var view = new ParameterView(ParameterViewLifetime.Unbound, builder.GetFrames().Array, ownerIndex: 0); var cascadingParameters = new List(); - foreach (var kvp in _keyValuePairs) + foreach (var (name, value, cascading) in _parameters) { - if (kvp.Cascading) + if (cascading) { - cascadingParameters.Add(new CascadingParameterState(kvp.Name, new TestCascadingValueProvider(kvp.Value))); + cascadingParameters.Add(new CascadingParameterState(new(null, name, value.GetType()), new TestCascadingValueProvider(value))); } } @@ -684,28 +683,33 @@ public ParameterView Build() } } - private class TestCascadingValueProvider : ICascadingValueComponent + private class TestCascadingValueProvider : ICascadingValueSupplier { + private readonly object _value; + public TestCascadingValueProvider(object value) { - CurrentValue = value; + _value = value; } - public object CurrentValue { get; } - - public bool CurrentValueIsFixed => throw new NotImplementedException(); + public bool IsFixed => throw new NotImplementedException(); - public bool CanSupplyValue(Type valueType, string valueName) + public bool CanSupplyValue(in CascadingParameterInfo parameterInfo) { throw new NotImplementedException(); } - public void Subscribe(ComponentState subscriber) + public object GetCurrentValue(in CascadingParameterInfo parameterInfo) + { + return _value; + } + + public void Subscribe(ComponentState subscriber, in CascadingParameterInfo parameterInfo) { throw new NotImplementedException(); } - public void Unsubscribe(ComponentState subscriber) + public void Unsubscribe(ComponentState subscriber, in CascadingParameterInfo parameterInfo) { throw new NotImplementedException(); } diff --git a/src/Components/Components/test/ParameterViewTest.cs b/src/Components/Components/test/ParameterViewTest.cs index 740359e5cb0a..e4a358d491cc 100644 --- a/src/Components/Components/test/ParameterViewTest.cs +++ b/src/Components/Components/test/ParameterViewTest.cs @@ -95,8 +95,8 @@ public void EnumerationIncludesCascadingParameters() RenderTreeFrame.Attribute(1, "attribute 1", attribute1Value) }, 0).WithCascadingParameters(new List { - new CascadingParameterState("attribute 2", new TestCascadingValue(attribute2Value)), - new CascadingParameterState("attribute 3", new TestCascadingValue(attribute3Value)), + new CascadingParameterState(new(null, "attribute 2", attribute2Value.GetType()), new TestCascadingValue(attribute2Value)), + new CascadingParameterState(new(null, "attribute 3", attribute3Value.GetType()), new TestCascadingValue(attribute3Value)), }); // Assert @@ -190,7 +190,7 @@ public void CanGetValueOrDefault_WithNonExistingValue() RenderTreeFrame.Attribute(1, "some other entry", new object()) }, 0).WithCascadingParameters(new List { - new CascadingParameterState("another entry", new TestCascadingValue(null)) + new CascadingParameterState(new(null, "another entry", typeof(object)), new TestCascadingValue(null)) }); // Act @@ -305,9 +305,9 @@ public void CanGetValueOrDefault_WithMatchingCascadingParameter() RenderTreeFrame.Attribute(1, "unrelated value", new object()) }, 0).WithCascadingParameters(new List { - new CascadingParameterState("unrelated value 2", new TestCascadingValue(null)), - new CascadingParameterState("my entry", new TestCascadingValue(myEntryValue)), - new CascadingParameterState("unrelated value 3", new TestCascadingValue(null)), + new CascadingParameterState(new(null, "unrelated value 2", typeof(object)), new TestCascadingValue(null)), + new CascadingParameterState(new(null, "my entry", myEntryValue.GetType()), new TestCascadingValue(myEntryValue)), + new CascadingParameterState(new(null, "unrelated value 3", typeof(object)), new TestCascadingValue(null)), }); // Act @@ -595,24 +595,27 @@ public Task SetParametersAsync(ParameterView parameters) => throw new NotImplementedException(); } - private class TestCascadingValue : ICascadingValueComponent + private class TestCascadingValue : ICascadingValueSupplier { + private readonly object _value; + public TestCascadingValue(object value) { - CurrentValue = value; + _value = value; } - public object CurrentValue { get; } - - public bool CurrentValueIsFixed => false; + public bool IsFixed => false; - public bool CanSupplyValue(Type valueType, string valueName) + public bool CanSupplyValue(in CascadingParameterInfo parameterInfo) => throw new NotImplementedException(); - public void Subscribe(ComponentState subscriber) + public object GetCurrentValue(in CascadingParameterInfo parameterInfo) + => _value; + + public void Subscribe(ComponentState subscriber, in CascadingParameterInfo parameterInfo) => throw new NotImplementedException(); - public void Unsubscribe(ComponentState subscriber) + public void Unsubscribe(ComponentState subscriber, in CascadingParameterInfo parameterInfo) => throw new NotImplementedException(); } } diff --git a/src/Components/Components/test/RouteViewTest.cs b/src/Components/Components/test/RouteViewTest.cs index c791d7243363..f7bdad0d3445 100644 --- a/src/Components/Components/test/RouteViewTest.cs +++ b/src/Components/Components/test/RouteViewTest.cs @@ -22,6 +22,7 @@ public RouteViewTest() _navigationManager = new RouteViewTestNavigationManager(); serviceCollection.AddSingleton(_navigationManager); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); var services = serviceCollection.BuildServiceProvider(); _renderer = new TestRenderer(services); diff --git a/src/Components/Components/test/Routing/QueryParameterValueSupplierTest.cs b/src/Components/Components/test/Routing/QueryParameterValueSupplierTest.cs index e96bd3a9deab..631b35b76ddd 100644 --- a/src/Components/Components/test/Routing/QueryParameterValueSupplierTest.cs +++ b/src/Components/Components/test/Routing/QueryParameterValueSupplierTest.cs @@ -1,98 +1,53 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.AspNetCore.Components.Rendering; +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. namespace Microsoft.AspNetCore.Components.Routing; public class QueryParameterValueSupplierTest { - private class NoQueryParameters : ComponentBase { } - - [Fact] - public void ComponentWithNoQueryParametersHasNoSupplier() - { - Assert.Null(QueryParameterValueSupplier.ForType(typeof(NoQueryParameters))); - } - - private class IgnorableProperties : ComponentBase - { - [Parameter] public string Invalid1 { get; set; } - [SupplyParameterFromQuery] public string Invalid2 { get; set; } - [Parameter, SupplyParameterFromQuery] public string Valid { get; set; } - [Parameter] public object InvalidAndUnsupportedType { get; set; } - } - - [Fact] - public void SuppliesParametersOnlyForPropertiesWithMatchingAttributes() - { - var query = $"?{nameof(IgnorableProperties.Invalid1)}=a&{nameof(IgnorableProperties.Invalid2)}=b&{nameof(IgnorableProperties.Valid)}=c"; - Assert.Collection(GetSuppliedParameters(query), - AssertKeyValuePair(nameof(IgnorableProperties.Valid), "c")); - } - - private class ValidTypes : ComponentBase - { - [Parameter, SupplyParameterFromQuery] public bool BoolVal { get; set; } - [Parameter, SupplyParameterFromQuery] public DateTime DateTimeVal { get; set; } - [Parameter, SupplyParameterFromQuery] public decimal DecimalVal { get; set; } - [Parameter, SupplyParameterFromQuery] public double DoubleVal { get; set; } - [Parameter, SupplyParameterFromQuery] public float FloatVal { get; set; } - [Parameter, SupplyParameterFromQuery] public Guid GuidVal { get; set; } - [Parameter, SupplyParameterFromQuery] public int IntVal { get; set; } - [Parameter, SupplyParameterFromQuery] public long LongVal { get; set; } - [Parameter, SupplyParameterFromQuery] public string StringVal { get; set; } - - [Parameter, SupplyParameterFromQuery] public bool? NullableBoolVal { get; set; } - [Parameter, SupplyParameterFromQuery] public DateTime? NullableDateTimeVal { get; set; } - [Parameter, SupplyParameterFromQuery] public decimal? NullableDecimalVal { get; set; } - [Parameter, SupplyParameterFromQuery] public double? NullableDoubleVal { get; set; } - [Parameter, SupplyParameterFromQuery] public float? NullableFloatVal { get; set; } - [Parameter, SupplyParameterFromQuery] public Guid? NullableGuidVal { get; set; } - [Parameter, SupplyParameterFromQuery] public int? NullableIntVal { get; set; } - [Parameter, SupplyParameterFromQuery] public long? NullableLongVal { get; set; } - } + private readonly QueryParameterValueSupplier _supplier = new(); [Fact] public void SupportsExpectedValueTypes() { var query = - $"{nameof(ValidTypes.BoolVal)}=true&" + - $"{nameof(ValidTypes.DateTimeVal)}=2020-01-02+03:04:05.678-09:00&" + - $"{nameof(ValidTypes.DecimalVal)}=-1.234&" + - $"{nameof(ValidTypes.DoubleVal)}=-2.345&" + - $"{nameof(ValidTypes.FloatVal)}=-3.456&" + - $"{nameof(ValidTypes.GuidVal)}=9e7257ad-03aa-42c7-9819-be08b177fef9&" + - $"{nameof(ValidTypes.IntVal)}=-54321&" + - $"{nameof(ValidTypes.LongVal)}=-99987654321&" + - $"{nameof(ValidTypes.StringVal)}=Some+string+%26+more&" + - $"{nameof(ValidTypes.NullableBoolVal)}=true&" + - $"{nameof(ValidTypes.NullableDateTimeVal)}=2021-01-02+03:04:05.678Z&" + - $"{nameof(ValidTypes.NullableDecimalVal)}=1.234&" + - $"{nameof(ValidTypes.NullableDoubleVal)}=2.345&" + - $"{nameof(ValidTypes.NullableFloatVal)}=3.456&" + - $"{nameof(ValidTypes.NullableGuidVal)}=1e7257ad-03aa-42c7-9819-be08b177fef9&" + - $"{nameof(ValidTypes.NullableIntVal)}=54321&" + - $"{nameof(ValidTypes.NullableLongVal)}=99987654321&"; - - Assert.Collection(GetSuppliedParameters(query), - AssertKeyValuePair(nameof(ValidTypes.BoolVal), true), - AssertKeyValuePair(nameof(ValidTypes.DateTimeVal), new DateTimeOffset(2020, 1, 2, 3, 4, 5, 678, TimeSpan.FromHours(-9)).LocalDateTime), - AssertKeyValuePair(nameof(ValidTypes.DecimalVal), -1.234m), - AssertKeyValuePair(nameof(ValidTypes.DoubleVal), -2.345), - AssertKeyValuePair(nameof(ValidTypes.FloatVal), -3.456f), - AssertKeyValuePair(nameof(ValidTypes.GuidVal), new Guid("9e7257ad-03aa-42c7-9819-be08b177fef9")), - AssertKeyValuePair(nameof(ValidTypes.IntVal), -54321), - AssertKeyValuePair(nameof(ValidTypes.LongVal), -99987654321), - AssertKeyValuePair(nameof(ValidTypes.NullableBoolVal), true), - AssertKeyValuePair(nameof(ValidTypes.NullableDateTimeVal), new DateTime(2021, 1, 2, 3, 4, 5, 678, DateTimeKind.Utc).ToLocalTime()), - AssertKeyValuePair(nameof(ValidTypes.NullableDecimalVal), 1.234m), - AssertKeyValuePair(nameof(ValidTypes.NullableDoubleVal), 2.345), - AssertKeyValuePair(nameof(ValidTypes.NullableFloatVal), 3.456f), - AssertKeyValuePair(nameof(ValidTypes.NullableGuidVal), new Guid("1e7257ad-03aa-42c7-9819-be08b177fef9")), - AssertKeyValuePair(nameof(ValidTypes.NullableIntVal), 54321), - AssertKeyValuePair(nameof(ValidTypes.NullableLongVal), 99987654321), - AssertKeyValuePair(nameof(ValidTypes.StringVal), "Some string & more")); + $"BoolVal=true&" + + $"DateTimeVal=2020-01-02+03:04:05.678-09:00&" + + $"DecimalVal=-1.234&" + + $"DoubleVal=-2.345&" + + $"FloatVal=-3.456&" + + $"GuidVal=9e7257ad-03aa-42c7-9819-be08b177fef9&" + + $"IntVal=-54321&" + + $"LongVal=-99987654321&" + + $"StringVal=Some+string+%26+more&" + + $"NullableBoolVal=true&" + + $"NullableDateTimeVal=2021-01-02+03:04:05.678Z&" + + $"NullableDecimalVal=1.234&" + + $"NullableDoubleVal=2.345&" + + $"NullableFloatVal=3.456&" + + $"NullableGuidVal=1e7257ad-03aa-42c7-9819-be08b177fef9&" + + $"NullableIntVal=54321&" + + $"NullableLongVal=99987654321&"; + + ReadQuery(query); + + AssertKeyValuePair("BoolVal", true); + AssertKeyValuePair("DateTimeVal", new DateTimeOffset(2020, 1, 2, 3, 4, 5, 678, TimeSpan.FromHours(-9)).LocalDateTime); + AssertKeyValuePair("DecimalVal", -1.234m); + AssertKeyValuePair("DoubleVal", -2.345); + AssertKeyValuePair("FloatVal", -3.456f); + AssertKeyValuePair("GuidVal", new Guid("9e7257ad-03aa-42c7-9819-be08b177fef9")); + AssertKeyValuePair("IntVal", -54321); + AssertKeyValuePair("LongVal", -99987654321); + AssertKeyValuePair("NullableBoolVal", true); + AssertKeyValuePair("NullableDateTimeVal", new DateTime(2021, 1, 2, 3, 4, 5, 678, DateTimeKind.Utc).ToLocalTime()); + AssertKeyValuePair("NullableDecimalVal", 1.234m); + AssertKeyValuePair("NullableDoubleVal", 2.345); + AssertKeyValuePair("NullableFloatVal", 3.456f); + AssertKeyValuePair("NullableGuidVal", new Guid("1e7257ad-03aa-42c7-9819-be08b177fef9")); + AssertKeyValuePair("NullableIntVal", 54321); + AssertKeyValuePair("NullableLongVal", 99987654321); + AssertKeyValuePair("StringVal", "Some string & more"); } [Theory] @@ -101,92 +56,72 @@ public void SupportsExpectedValueTypes() [InlineData("?unrelated=123")] public void SuppliesNullForValueTypesIfNotSpecified(string query) { - // Although we could supply default(T) for missing values, there's precedent in the routing - // system for supplying null for missing route parameters. The component is then responsible - // for interpreting null as a blank value for the parameter, regardless of its type. To keep - // the rules aligned, we do the same thing for querystring parameters. - Assert.Collection(GetSuppliedParameters(query), - AssertKeyValuePair(nameof(ValidTypes.BoolVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.DateTimeVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.DecimalVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.DoubleVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.FloatVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.GuidVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.IntVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.LongVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.NullableBoolVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.NullableDateTimeVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.NullableDecimalVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.NullableDoubleVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.NullableFloatVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.NullableGuidVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.NullableIntVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.NullableLongVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.StringVal), (object)null)); - } - - private class ValidArrayTypes : ComponentBase - { - [Parameter, SupplyParameterFromQuery] public bool[] BoolVals { get; set; } - [Parameter, SupplyParameterFromQuery] public DateTime[] DateTimeVals { get; set; } - [Parameter, SupplyParameterFromQuery] public decimal[] DecimalVals { get; set; } - [Parameter, SupplyParameterFromQuery] public double[] DoubleVals { get; set; } - [Parameter, SupplyParameterFromQuery] public float[] FloatVals { get; set; } - [Parameter, SupplyParameterFromQuery] public Guid[] GuidVals { get; set; } - [Parameter, SupplyParameterFromQuery] public int[] IntVals { get; set; } - [Parameter, SupplyParameterFromQuery] public long[] LongVals { get; set; } - [Parameter, SupplyParameterFromQuery] public string[] StringVals { get; set; } - - [Parameter, SupplyParameterFromQuery] public bool?[] NullableBoolVals { get; set; } - [Parameter, SupplyParameterFromQuery] public DateTime?[] NullableDateTimeVals { get; set; } - [Parameter, SupplyParameterFromQuery] public decimal?[] NullableDecimalVals { get; set; } - [Parameter, SupplyParameterFromQuery] public double?[] NullableDoubleVals { get; set; } - [Parameter, SupplyParameterFromQuery] public float?[] NullableFloatVals { get; set; } - [Parameter, SupplyParameterFromQuery] public Guid?[] NullableGuidVals { get; set; } - [Parameter, SupplyParameterFromQuery] public int?[] NullableIntVals { get; set; } - [Parameter, SupplyParameterFromQuery] public long?[] NullableLongVals { get; set; } + ReadQuery(query); + + // Although we could supply default(T) for missing values, there's precedent in the routing + // system for supplying null for missing route parameters. The component is then responsible + // for interpreting null as a blank value for the parameter, regardless of its type. To keep + // the rules aligned, we do the same thing for querystring parameters. + AssertKeyValuePair("BoolVal", null); + AssertKeyValuePair("DateTimeVal", null); + AssertKeyValuePair("DecimalVal", null); + AssertKeyValuePair("DoubleVal", null); + AssertKeyValuePair("FloatVal", null); + AssertKeyValuePair("GuidVal", null); + AssertKeyValuePair("IntVal", null); + AssertKeyValuePair("LongVal", null); + AssertKeyValuePair("NullableBoolVal", null); + AssertKeyValuePair("NullableDateTimeVal", null); + AssertKeyValuePair("NullableDecimalVal", null); + AssertKeyValuePair("NullableDoubleVal", null); + AssertKeyValuePair("NullableFloatVal", null); + AssertKeyValuePair("NullableGuidVal", null); + AssertKeyValuePair("NullableIntVal", null); + AssertKeyValuePair("NullableLongVal", null); + AssertKeyValuePair("StringVal", null); } [Fact] public void SupportsExpectedArrayTypes() { var query = - $"{nameof(ValidArrayTypes.BoolVals)}=true&" + - $"{nameof(ValidArrayTypes.DateTimeVals)}=2020-01-02+03:04:05.678Z&" + - $"{nameof(ValidArrayTypes.DecimalVals)}=-1.234&" + - $"{nameof(ValidArrayTypes.DoubleVals)}=-2.345&" + - $"{nameof(ValidArrayTypes.FloatVals)}=-3.456&" + - $"{nameof(ValidArrayTypes.GuidVals)}=9e7257ad-03aa-42c7-9819-be08b177fef9&" + - $"{nameof(ValidArrayTypes.IntVals)}=-54321&" + - $"{nameof(ValidArrayTypes.LongVals)}=-99987654321&" + - $"{nameof(ValidArrayTypes.StringVals)}=Some+string+%26+more&" + - $"{nameof(ValidArrayTypes.NullableBoolVals)}=true&" + - $"{nameof(ValidArrayTypes.NullableDateTimeVals)}=2021-01-02+03:04:05.678Z&" + - $"{nameof(ValidArrayTypes.NullableDecimalVals)}=1.234&" + - $"{nameof(ValidArrayTypes.NullableDoubleVals)}=2.345&" + - $"{nameof(ValidArrayTypes.NullableFloatVals)}=3.456&" + - $"{nameof(ValidArrayTypes.NullableGuidVals)}=1e7257ad-03aa-42c7-9819-be08b177fef9&" + - $"{nameof(ValidArrayTypes.NullableIntVals)}=54321&" + - $"{nameof(ValidArrayTypes.NullableLongVals)}=99987654321&"; - - Assert.Collection(GetSuppliedParameters(query), - AssertKeyValuePair(nameof(ValidArrayTypes.BoolVals), new[] { true }), - AssertKeyValuePair(nameof(ValidArrayTypes.DateTimeVals), new[] { new DateTime(2020, 1, 2, 3, 4, 5, 678, DateTimeKind.Utc).ToLocalTime() }), - AssertKeyValuePair(nameof(ValidArrayTypes.DecimalVals), new[] { -1.234m }), - AssertKeyValuePair(nameof(ValidArrayTypes.DoubleVals), new[] { -2.345 }), - AssertKeyValuePair(nameof(ValidArrayTypes.FloatVals), new[] { -3.456f }), - AssertKeyValuePair(nameof(ValidArrayTypes.GuidVals), new[] { new Guid("9e7257ad-03aa-42c7-9819-be08b177fef9") }), - AssertKeyValuePair(nameof(ValidArrayTypes.IntVals), new[] { -54321 }), - AssertKeyValuePair(nameof(ValidArrayTypes.LongVals), new[] { -99987654321 }), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableBoolVals), new[] { true }), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableDateTimeVals), new[] { new DateTime(2021, 1, 2, 3, 4, 5, 678, DateTimeKind.Utc).ToLocalTime() }), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableDecimalVals), new[] { 1.234m }), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableDoubleVals), new[] { 2.345 }), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableFloatVals), new[] { 3.456f }), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableGuidVals), new[] { new Guid("1e7257ad-03aa-42c7-9819-be08b177fef9") }), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableIntVals), new[] { 54321 }), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableLongVals), new[] { 99987654321 }), - AssertKeyValuePair(nameof(ValidArrayTypes.StringVals), new[] { "Some string & more" })); + $"BoolVals=true&" + + $"DateTimeVals=2020-01-02+03:04:05.678Z&" + + $"DecimalVals=-1.234&" + + $"DoubleVals=-2.345&" + + $"FloatVals=-3.456&" + + $"GuidVals=9e7257ad-03aa-42c7-9819-be08b177fef9&" + + $"IntVals=-54321&" + + $"LongVals=-99987654321&" + + $"StringVals=Some+string+%26+more&" + + $"NullableBoolVals=true&" + + $"NullableDateTimeVals=2021-01-02+03:04:05.678Z&" + + $"NullableDecimalVals=1.234&" + + $"NullableDoubleVals=2.345&" + + $"NullableFloatVals=3.456&" + + $"NullableGuidVals=1e7257ad-03aa-42c7-9819-be08b177fef9&" + + $"NullableIntVals=54321&" + + $"NullableLongVals=99987654321&"; + + ReadQuery(query); + + AssertKeyValuePair("BoolVals", new[] { true }); + AssertKeyValuePair("DateTimeVals", new[] { new DateTime(2020, 1, 2, 3, 4, 5, 678, DateTimeKind.Utc).ToLocalTime() }); + AssertKeyValuePair("DecimalVals", new[] { -1.234m }); + AssertKeyValuePair("DoubleVals", new[] { -2.345 }); + AssertKeyValuePair("FloatVals", new[] { -3.456f }); + AssertKeyValuePair("GuidVals", new[] { new Guid("9e7257ad-03aa-42c7-9819-be08b177fef9") }); + AssertKeyValuePair("IntVals", new[] { -54321 }); + AssertKeyValuePair("LongVals", new[] { -99987654321 }); + AssertKeyValuePair("NullableBoolVals", new[] { true }); + AssertKeyValuePair("NullableDateTimeVals", new[] { new DateTime(2021, 1, 2, 3, 4, 5, 678, DateTimeKind.Utc).ToLocalTime() }); + AssertKeyValuePair("NullableDecimalVals", new[] { 1.234m }); + AssertKeyValuePair("NullableDoubleVals", new[] { 2.345 }); + AssertKeyValuePair("NullableFloatVals", new[] { 3.456f }); + AssertKeyValuePair("NullableGuidVals", new[] { new Guid("1e7257ad-03aa-42c7-9819-be08b177fef9") }); + AssertKeyValuePair("NullableIntVals", new[] { 54321 }); + AssertKeyValuePair("NullableLongVals", new[] { 99987654321 }); + AssertKeyValuePair("StringVals", new[] { "Some string & more" }); } [Theory] @@ -195,133 +130,91 @@ public void SupportsExpectedArrayTypes() [InlineData("?unrelated=123")] public void SuppliesEmptyArrayForArrayTypesIfNotSpecified(string query) { - Assert.Collection(GetSuppliedParameters(query), - AssertKeyValuePair(nameof(ValidArrayTypes.BoolVals), Array.Empty()), - AssertKeyValuePair(nameof(ValidArrayTypes.DateTimeVals), Array.Empty()), - AssertKeyValuePair(nameof(ValidArrayTypes.DecimalVals), Array.Empty()), - AssertKeyValuePair(nameof(ValidArrayTypes.DoubleVals), Array.Empty()), - AssertKeyValuePair(nameof(ValidArrayTypes.FloatVals), Array.Empty()), - AssertKeyValuePair(nameof(ValidArrayTypes.GuidVals), Array.Empty()), - AssertKeyValuePair(nameof(ValidArrayTypes.IntVals), Array.Empty()), - AssertKeyValuePair(nameof(ValidArrayTypes.LongVals), Array.Empty()), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableBoolVals), Array.Empty()), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableDateTimeVals), Array.Empty()), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableDecimalVals), Array.Empty()), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableDoubleVals), Array.Empty()), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableFloatVals), Array.Empty()), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableGuidVals), Array.Empty()), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableIntVals), Array.Empty()), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableLongVals), Array.Empty()), - AssertKeyValuePair(nameof(ValidArrayTypes.StringVals), Array.Empty())); - } - - class OverrideParameterName : ComponentBase - { - [Parameter, SupplyParameterFromQuery(Name = "anothername1")] public string Value1 { get; set; } - [Parameter, SupplyParameterFromQuery(Name = "anothername2")] public string Value2 { get; set; } - } - - [Fact] - public void CanOverrideParameterName() - { - var query = $"anothername1=Some+value+1&Value2=Some+value+2"; - Assert.Collection(GetSuppliedParameters(query), - // Because we specified the mapped name, we receive the value - AssertKeyValuePair(nameof(OverrideParameterName.Value1), "Some value 1"), - // If we specify the component parameter name directly, we do not receive the value - AssertKeyValuePair(nameof(OverrideParameterName.Value2), (object)null)); - } - - class MapSingleQueryParameterToMultipleProperties : ComponentBase - { - [Parameter, SupplyParameterFromQuery(Name = "a")] public int ValueAsInt { get; set; } - [Parameter, SupplyParameterFromQuery(Name = "b")] public DateTime ValueAsDateTime { get; set; } - [Parameter, SupplyParameterFromQuery(Name = "A")] public long ValueAsLong { get; set; } - } - - [Fact] - public void CannotMapSingleQueryParameterToMultipleProperties() - { - var ex = Assert.Throws( - () => QueryParameterValueSupplier.ForType(typeof(MapSingleQueryParameterToMultipleProperties))); - Assert.Contains("declares more than one mapping for the query parameter 'a'.", ex.Message, StringComparison.OrdinalIgnoreCase); - } - - class UnsupportedType : ComponentBase - { - [Parameter, SupplyParameterFromQuery] public int IntValid { get; set; } - [Parameter, SupplyParameterFromQuery] public object ObjectValue { get; set; } - } - - [Fact] - public void RejectsUnsupportedType() - { - var ex = Assert.Throws( - () => QueryParameterValueSupplier.ForType(typeof(UnsupportedType))); - Assert.Equal("Querystring values cannot be parsed as type 'System.Object'.", ex.Message); + ReadQuery(query); + + AssertKeyValuePair("BoolVals", Array.Empty()); + AssertKeyValuePair("DateTimeVals", Array.Empty()); + AssertKeyValuePair("DecimalVals", Array.Empty()); + AssertKeyValuePair("DoubleVals", Array.Empty()); + AssertKeyValuePair("FloatVals", Array.Empty()); + AssertKeyValuePair("GuidVals", Array.Empty()); + AssertKeyValuePair("IntVals", Array.Empty()); + AssertKeyValuePair("LongVals", Array.Empty()); + AssertKeyValuePair("NullableBoolVals", Array.Empty()); + AssertKeyValuePair("NullableDateTimeVals", Array.Empty()); + AssertKeyValuePair("NullableDecimalVals", Array.Empty()); + AssertKeyValuePair("NullableDoubleVals", Array.Empty()); + AssertKeyValuePair("NullableFloatVals", Array.Empty()); + AssertKeyValuePair("NullableGuidVals", Array.Empty()); + AssertKeyValuePair("NullableIntVals", Array.Empty()); + AssertKeyValuePair("NullableLongVals", Array.Empty()); + AssertKeyValuePair("StringVals", Array.Empty()); } [Theory] - [InlineData(nameof(ValidTypes.BoolVal), "abc", typeof(bool))] - [InlineData(nameof(ValidTypes.DateTimeVal), "2020-02-31", typeof(DateTime))] - [InlineData(nameof(ValidTypes.DecimalVal), "1.2.3", typeof(decimal))] - [InlineData(nameof(ValidTypes.DoubleVal), "1x", typeof(double))] - [InlineData(nameof(ValidTypes.FloatVal), "1e1000", typeof(float))] - [InlineData(nameof(ValidTypes.GuidVal), "123456-789-0", typeof(Guid))] - [InlineData(nameof(ValidTypes.IntVal), "5000000000", typeof(int))] - [InlineData(nameof(ValidTypes.LongVal), "this+is+a+long+value", typeof(long))] - [InlineData(nameof(ValidTypes.NullableBoolVal), "abc", typeof(bool?))] - [InlineData(nameof(ValidTypes.NullableDateTimeVal), "2020-02-31", typeof(DateTime?))] - [InlineData(nameof(ValidTypes.NullableDecimalVal), "1.2.3", typeof(decimal?))] - [InlineData(nameof(ValidTypes.NullableDoubleVal), "1x", typeof(double?))] - [InlineData(nameof(ValidTypes.NullableFloatVal), "1e1000", typeof(float?))] - [InlineData(nameof(ValidTypes.NullableGuidVal), "123456-789-0", typeof(Guid?))] - [InlineData(nameof(ValidTypes.NullableIntVal), "5000000000", typeof(int?))] - [InlineData(nameof(ValidTypes.NullableLongVal), "this+is+a+long+value", typeof(long?))] + [InlineData("BoolVal", "abc", typeof(bool))] + [InlineData("DateTimeVal", "2020-02-31", typeof(DateTime))] + [InlineData("DecimalVal", "1.2.3", typeof(decimal))] + [InlineData("DoubleVal", "1x", typeof(double))] + [InlineData("FloatVal", "1e1000", typeof(float))] + [InlineData("GuidVal", "123456-789-0", typeof(Guid))] + [InlineData("IntVal", "5000000000", typeof(int))] + [InlineData("LongVal", "this+is+a+long+value", typeof(long))] + [InlineData("NullableBoolVal", "abc", typeof(bool?))] + [InlineData("NullableDateTimeVal", "2020-02-31", typeof(DateTime?))] + [InlineData("NullableDecimalVal", "1.2.3", typeof(decimal?))] + [InlineData("NullableDoubleVal", "1x", typeof(double?))] + [InlineData("NullableFloatVal", "1e1000", typeof(float?))] + [InlineData("NullableGuidVal", "123456-789-0", typeof(Guid?))] + [InlineData("NullableIntVal", "5000000000", typeof(int?))] + [InlineData("NullableLongVal", "this+is+a+long+value", typeof(long?))] public void RejectsUnparseableValues(string key, string value, Type targetType) { - var ex = Assert.Throws( - () => GetSuppliedParameters($"?{key}={value}")); + ReadQuery($"?{key}={value}"); + + var ex = Assert.Throws(() => _supplier.GetQueryParameterValue(targetType, key)); Assert.Equal($"Cannot parse the value '{value.Replace('+', ' ')}' as type '{targetType}' for '{key}'.", ex.Message); } [Theory] - [InlineData(nameof(ValidArrayTypes.BoolVals), "true", "abc", typeof(bool))] - [InlineData(nameof(ValidArrayTypes.DateTimeVals), "2020-02-28", "2020-02-31", typeof(DateTime))] - [InlineData(nameof(ValidArrayTypes.DecimalVals), "1.23", "1.2.3", typeof(decimal))] - [InlineData(nameof(ValidArrayTypes.DoubleVals), "1", "1x", typeof(double))] - [InlineData(nameof(ValidArrayTypes.FloatVals), "1000", "1e1000", typeof(float))] - [InlineData(nameof(ValidArrayTypes.GuidVals), "9e7257ad-03aa-42c7-9819-be08b177fef9", "123456-789-0", typeof(Guid))] - [InlineData(nameof(ValidArrayTypes.IntVals), "5000000", "5000000000", typeof(int))] - [InlineData(nameof(ValidArrayTypes.LongVals), "-1234", "this+is+a+long+value", typeof(long))] - [InlineData(nameof(ValidArrayTypes.NullableBoolVals), "true", "abc", typeof(bool?))] - [InlineData(nameof(ValidArrayTypes.NullableDateTimeVals), "2020-02-28", "2020-02-31", typeof(DateTime?))] - [InlineData(nameof(ValidArrayTypes.NullableDecimalVals), "1.23", "1.2.3", typeof(decimal?))] - [InlineData(nameof(ValidArrayTypes.NullableDoubleVals), "1", "1x", typeof(double?))] - [InlineData(nameof(ValidArrayTypes.NullableFloatVals), "1000", "1e1000", typeof(float?))] - [InlineData(nameof(ValidArrayTypes.NullableGuidVals), "9e7257ad-03aa-42c7-9819-be08b177fef9", "123456-789-0", typeof(Guid?))] - [InlineData(nameof(ValidArrayTypes.NullableIntVals), "5000000", "5000000000", typeof(int?))] - [InlineData(nameof(ValidArrayTypes.NullableLongVals), "-1234", "this+is+a+long+value", typeof(long?))] + [InlineData("BoolVals", "true", "abc", typeof(bool))] + [InlineData("DateTimeVals", "2020-02-28", "2020-02-31", typeof(DateTime))] + [InlineData("DecimalVals", "1.23", "1.2.3", typeof(decimal))] + [InlineData("DoubleVals", "1", "1x", typeof(double))] + [InlineData("FloatVals", "1000", "1e1000", typeof(float))] + [InlineData("GuidVals", "9e7257ad-03aa-42c7-9819-be08b177fef9", "123456-789-0", typeof(Guid))] + [InlineData("IntVals", "5000000", "5000000000", typeof(int))] + [InlineData("LongVals", "-1234", "this+is+a+long+value", typeof(long))] + [InlineData("NullableBoolVals", "true", "abc", typeof(bool?))] + [InlineData("NullableDateTimeVals", "2020-02-28", "2020-02-31", typeof(DateTime?))] + [InlineData("NullableDecimalVals", "1.23", "1.2.3", typeof(decimal?))] + [InlineData("NullableDoubleVals", "1", "1x", typeof(double?))] + [InlineData("NullableFloatVals", "1000", "1e1000", typeof(float?))] + [InlineData("NullableGuidVals", "9e7257ad-03aa-42c7-9819-be08b177fef9", "123456-789-0", typeof(Guid?))] + [InlineData("NullableIntVals", "5000000", "5000000000", typeof(int?))] + [InlineData("NullableLongVals", "-1234", "this+is+a+long+value", typeof(long?))] public void RejectsUnparseableArrayEntries(string key, string validValue, string invalidValue, Type targetType) { - var ex = Assert.Throws( - () => GetSuppliedParameters($"?{key}={validValue}&{key}={invalidValue}")); + ReadQuery($"?{key}={validValue}&{key}={invalidValue}"); + + var ex = Assert.Throws(() => _supplier.GetQueryParameterValue(targetType.MakeArrayType(), key)); Assert.Equal($"Cannot parse the value '{invalidValue.Replace('+', ' ')}' as type '{targetType}' for '{key}'.", ex.Message); } [Theory] - [InlineData(nameof(ValidTypes.BoolVal), typeof(bool))] - [InlineData(nameof(ValidTypes.DateTimeVal), typeof(DateTime))] - [InlineData(nameof(ValidTypes.DecimalVal), typeof(decimal))] - [InlineData(nameof(ValidTypes.DoubleVal), typeof(double))] - [InlineData(nameof(ValidTypes.FloatVal), typeof(float))] - [InlineData(nameof(ValidTypes.GuidVal), typeof(Guid))] - [InlineData(nameof(ValidTypes.IntVal), typeof(int))] - [InlineData(nameof(ValidTypes.LongVal), typeof(long))] + [InlineData("BoolVal", typeof(bool))] + [InlineData("DateTimeVal", typeof(DateTime))] + [InlineData("DecimalVal", typeof(decimal))] + [InlineData("DoubleVal", typeof(double))] + [InlineData("FloatVal", typeof(float))] + [InlineData("GuidVal", typeof(Guid))] + [InlineData("IntVal", typeof(int))] + [InlineData("LongVal", typeof(long))] public void RejectsBlankValuesWhenNotNullable(string key, Type targetType) { - var ex = Assert.Throws( - () => GetSuppliedParameters($"?{nameof(ValidTypes.StringVal)}=somevalue&{key}=")); + ReadQuery($"?StringVal=somevalue&{key}="); + + var ex = Assert.Throws(() => _supplier.GetQueryParameterValue(targetType, key)); Assert.Equal($"Cannot parse the value '' as type '{targetType}' for '{key}'.", ex.Message); } @@ -329,23 +222,25 @@ public void RejectsBlankValuesWhenNotNullable(string key, Type targetType) public void AcceptsBlankValuesWhenNullable() { var query = - $"{nameof(ValidTypes.NullableBoolVal)}=&" + - $"{nameof(ValidTypes.NullableDateTimeVal)}=&" + - $"{nameof(ValidTypes.NullableDecimalVal)}=&" + - $"{nameof(ValidTypes.NullableDoubleVal)}=&" + - $"{nameof(ValidTypes.NullableFloatVal)}=&" + - $"{nameof(ValidTypes.NullableGuidVal)}=&" + - $"{nameof(ValidTypes.NullableIntVal)}=&" + - $"{nameof(ValidTypes.NullableLongVal)}=&"; - Assert.Collection(GetSuppliedParameters(query).Where(pair => pair.key.StartsWith("Nullable", StringComparison.Ordinal)), - AssertKeyValuePair(nameof(ValidTypes.NullableBoolVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.NullableDateTimeVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.NullableDecimalVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.NullableDoubleVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.NullableFloatVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.NullableGuidVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.NullableIntVal), (object)null), - AssertKeyValuePair(nameof(ValidTypes.NullableLongVal), (object)null)); + $"NullableBoolVal=&" + + $"NullableDateTimeVal=&" + + $"NullableDecimalVal=&" + + $"NullableDoubleVal=&" + + $"NullableFloatVal=&" + + $"NullableGuidVal=&" + + $"NullableIntVal=&" + + $"NullableLongVal=&"; + + ReadQuery(query); + + AssertKeyValuePair("NullableBoolVal", null); + AssertKeyValuePair("NullableDateTimeVal", null); + AssertKeyValuePair("NullableDecimalVal", null); + AssertKeyValuePair("NullableDoubleVal", null); + AssertKeyValuePair("NullableFloatVal", null); + AssertKeyValuePair("NullableGuidVal", null); + AssertKeyValuePair("NullableIntVal", null); + AssertKeyValuePair("NullableLongVal", null); } [Theory] @@ -353,35 +248,39 @@ public void AcceptsBlankValuesWhenNullable() [InlineData("=")] public void EmptyStringValuesAreSuppliedAsEmptyString(string queryPart) { - var query = $"?{nameof(ValidTypes.StringVal)}{queryPart}"; - var suppliedParameters = GetSuppliedParameters(query).ToDictionary(x => x.key, x => x.value); - Assert.Equal(string.Empty, suppliedParameters[nameof(ValidTypes.StringVal)]); + ReadQuery($"?StringVal{queryPart}"); + + Assert.Equal(string.Empty, _supplier.GetQueryParameterValue(typeof(string), "StringVal")); } [Fact] public void EmptyStringArrayValuesAreSuppliedAsEmptyStrings() { - var query = $"?{nameof(ValidArrayTypes.StringVals)}=a&" + - $"{nameof(ValidArrayTypes.StringVals)}&" + - $"{nameof(ValidArrayTypes.StringVals)}=&" + - $"{nameof(ValidArrayTypes.StringVals)}=b"; - var suppliedParameters = GetSuppliedParameters(query).ToDictionary(x => x.key, x => x.value); - Assert.Equal(new[] { "a", string.Empty, string.Empty, "b" }, suppliedParameters[nameof(ValidArrayTypes.StringVals)]); + var query = $"?StringVals=a&" + + $"StringVals&" + + $"StringVals=&" + + $"StringVals=b"; + + ReadQuery(query); + + Assert.Equal(new[] { "a", string.Empty, string.Empty, "b" }, _supplier.GetQueryParameterValue(typeof(string[]), "StringVals")); } [Theory] - [InlineData(nameof(ValidArrayTypes.BoolVals), typeof(bool))] - [InlineData(nameof(ValidArrayTypes.DateTimeVals), typeof(DateTime))] - [InlineData(nameof(ValidArrayTypes.DecimalVals), typeof(decimal))] - [InlineData(nameof(ValidArrayTypes.DoubleVals), typeof(double))] - [InlineData(nameof(ValidArrayTypes.FloatVals), typeof(float))] - [InlineData(nameof(ValidArrayTypes.GuidVals), typeof(Guid))] - [InlineData(nameof(ValidArrayTypes.IntVals), typeof(int))] - [InlineData(nameof(ValidArrayTypes.LongVals), typeof(long))] + [InlineData("BoolVals", typeof(bool))] + [InlineData("DateTimeVals", typeof(DateTime))] + [InlineData("DecimalVals", typeof(decimal))] + [InlineData("DoubleVals", typeof(double))] + [InlineData("FloatVals", typeof(float))] + [InlineData("GuidVals", typeof(Guid))] + [InlineData("IntVals", typeof(int))] + [InlineData("LongVals", typeof(long))] public void RejectsBlankArrayEntriesWhenNotNullable(string key, Type targetType) { + ReadQuery($"?StringVal=somevalue&{key}="); + var ex = Assert.Throws( - () => GetSuppliedParameters($"?{nameof(ValidTypes.StringVal)}=somevalue&{key}=")); + () => _supplier.GetQueryParameterValue(targetType, key)); Assert.Equal($"Cannot parse the value '' as type '{targetType}' for '{key}'.", ex.Message); } @@ -389,120 +288,65 @@ public void RejectsBlankArrayEntriesWhenNotNullable(string key, Type targetType) public void AcceptsBlankArrayEntriesWhenNullable() { var query = - $"{nameof(ValidArrayTypes.NullableBoolVals)}=&" + - $"{nameof(ValidArrayTypes.NullableDateTimeVals)}=&" + - $"{nameof(ValidArrayTypes.NullableDecimalVals)}=&" + - $"{nameof(ValidArrayTypes.NullableDoubleVals)}=&" + - $"{nameof(ValidArrayTypes.NullableFloatVals)}=&" + - $"{nameof(ValidArrayTypes.NullableGuidVals)}=&" + - $"{nameof(ValidArrayTypes.NullableIntVals)}=&" + - $"{nameof(ValidArrayTypes.NullableLongVals)}=&"; - Assert.Collection(GetSuppliedParameters(query).Where(pair => pair.key.StartsWith("Nullable", StringComparison.Ordinal)), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableBoolVals), new bool?[] { null }), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableDateTimeVals), new DateTime?[] { null }), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableDecimalVals), new decimal?[] { null }), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableDoubleVals), new double?[] { null }), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableFloatVals), new float?[] { null }), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableGuidVals), new Guid?[] { null }), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableIntVals), new int?[] { null }), - AssertKeyValuePair(nameof(ValidArrayTypes.NullableLongVals), new long?[] { null })); - } - - private class SpecialQueryParameterName : ComponentBase - { - public const string NameThatLooksEncoded = "name+that+looks+%5Bencoded%5D"; - [Parameter, SupplyParameterFromQuery(Name = NameThatLooksEncoded)] public string Key { get; set; } + $"NullableBoolVals=&" + + $"NullableDateTimeVals=&" + + $"NullableDecimalVals=&" + + $"NullableDoubleVals=&" + + $"NullableFloatVals=&" + + $"NullableGuidVals=&" + + $"NullableIntVals=&" + + $"NullableLongVals=&"; + + ReadQuery(query); + + AssertKeyValuePair("NullableBoolVals", new bool?[] { null }); + AssertKeyValuePair("NullableDateTimeVals", new DateTime?[] { null }); + AssertKeyValuePair("NullableDecimalVals", new decimal?[] { null }); + AssertKeyValuePair("NullableDoubleVals", new double?[] { null }); + AssertKeyValuePair("NullableFloatVals", new float?[] { null }); + AssertKeyValuePair("NullableGuidVals", new Guid?[] { null }); + AssertKeyValuePair("NullableIntVals", new int?[] { null }); + AssertKeyValuePair("NullableLongVals", new long?[] { null }); } [Fact] public void DecodesKeysAndValues() { - var encodedName = Uri.EscapeDataString(SpecialQueryParameterName.NameThatLooksEncoded); + var nameThatLooksEncoded = "name+that+looks+%5Bencoded%5D"; + var encodedName = Uri.EscapeDataString(nameThatLooksEncoded); var query = $"?{encodedName}=Some+%5Bencoded%5D+value"; - Assert.Collection(GetSuppliedParameters(query), - AssertKeyValuePair(nameof(SpecialQueryParameterName.Key), "Some [encoded] value")); - } - private class KeyCaseMatching : ComponentBase - { - [Parameter, SupplyParameterFromQuery] public int KeyOne { get; set; } - [Parameter, SupplyParameterFromQuery(Name = "keytwo")] public int KeyTwo { get; set; } + ReadQuery(query); + + AssertKeyValuePair(nameThatLooksEncoded, "Some [encoded] value"); } [Fact] public void MatchesKeysCaseInsensitively() { - var query = $"?KEYONE=1&KEYTWO=2"; - Assert.Collection(GetSuppliedParameters(query), - AssertKeyValuePair(nameof(KeyCaseMatching.KeyOne), 1), - AssertKeyValuePair(nameof(KeyCaseMatching.KeyTwo), 2)); - } + ReadQuery($"?KEYONE=1&KEYTWO=2"); - private class KeysWithNonAsciiChars : ComponentBase - { - [Parameter, SupplyParameterFromQuery] public string Имя_моей_собственности { get; set; } - [Parameter, SupplyParameterFromQuery(Name = "خاصية_أخرى")] public string AnotherProperty { get; set; } + AssertKeyValuePair("KeyOne", 1); + AssertKeyValuePair("KeyTwo", 2); } [Fact] public void MatchesKeysWithNonAsciiChars() { - var query = $"?{nameof(KeysWithNonAsciiChars.Имя_моей_собственности)}=first&خاصية_أخرى=second"; - var result = GetSuppliedParameters(query); - Assert.Collection(result, - AssertKeyValuePair(nameof(KeysWithNonAsciiChars.AnotherProperty), "second"), - AssertKeyValuePair(nameof(KeysWithNonAsciiChars.Имя_моей_собственности), "first")); - } - - private class SingleValueOverwriting : ComponentBase - { - [Parameter, SupplyParameterFromQuery] public int Age { get; set; } - [Parameter, SupplyParameterFromQuery] public int? Id { get; set; } - [Parameter, SupplyParameterFromQuery] public string Name { get; set; } - } + ReadQuery($"?Имя_моей_собственности=first&خاصية_أخرى=second"); - [Fact] - public void ForNonArrayValuesOnlyOneValueIsSupplied() - { - // For simplicity and speed, the value assignment logic doesn't check if the a single-valued destination is - // already populated, and just overwrites in a left-to-right manner. For nullable values it's possible to - // overwrite a value with null, or a string with empty. - Assert.Collection(GetSuppliedParameters($"?age=123&age=456&age=789&id=1&id&name=Bobbins&name"), - AssertKeyValuePair(nameof(SingleValueOverwriting.Age), 789), - AssertKeyValuePair(nameof(SingleValueOverwriting.Id), (int?)null), - AssertKeyValuePair(nameof(SingleValueOverwriting.Name), string.Empty)); + AssertKeyValuePair("خاصية_أخرى", "second"); + AssertKeyValuePair("Имя_моей_собственности", "first"); } - private static IEnumerable<(string key, object value)> GetSuppliedParameters(string query) where TComponent : IComponent + private void ReadQuery(string query) { - var supplier = QueryParameterValueSupplier.ForType(typeof(TComponent)); - using var builder = new RenderTreeBuilder(); - builder.OpenComponent(0); - supplier.RenderParametersFromQueryString(builder, query.AsMemory()); - builder.CloseComponent(); - - var frames = builder.GetFrames(); - return frames.Array.Take(frames.Count) - .Where(frame => frame.FrameType == RenderTree.RenderTreeFrameType.Attribute) - .Select(frame => (frame.AttributeName, frame.AttributeValue)) - .OrderBy(pair => pair.AttributeName) // The order isn't defined, so use alphabetical for tests - .ToList(); + _supplier.ReadParametersFromQuery(query.AsMemory()); } - private Action<(string key, object value)> AssertKeyValuePair(string expectedKey, T expectedValue) + private void AssertKeyValuePair(string key, object expectedValue) { - return pair => - { - Assert.Equal(expectedKey, pair.key); - if (expectedValue is null) - { - Assert.Null(pair.value); - } - else - { - Assert.IsType(expectedValue); - Assert.Equal(expectedValue, pair.value); - } - }; + var actualValue = _supplier.GetQueryParameterValue(typeof(T), key); + Assert.Equal(expectedValue, actualValue); } } diff --git a/src/Components/Endpoints/src/DependencyInjection/RazorComponentsServiceCollectionExtensions.cs b/src/Components/Endpoints/src/DependencyInjection/RazorComponentsServiceCollectionExtensions.cs index 8ef454f5bbf9..2e291faabbbf 100644 --- a/src/Components/Endpoints/src/DependencyInjection/RazorComponentsServiceCollectionExtensions.cs +++ b/src/Components/Endpoints/src/DependencyInjection/RazorComponentsServiceCollectionExtensions.cs @@ -58,6 +58,8 @@ public static IRazorComponentsBuilder AddRazorComponents(this IServiceCollection // Form handling services.TryAddScoped(); services.TryAddScoped(); + services.TryAddEnumerable(ServiceDescriptor.Scoped()); + services.TryAddEnumerable(ServiceDescriptor.Scoped()); return new DefaultRazorComponentsBuilder(services); } diff --git a/src/Components/Endpoints/test/RazorComponentsServiceCollectionExtensionsTest.cs b/src/Components/Endpoints/test/RazorComponentsServiceCollectionExtensionsTest.cs index 2d8026719787..3341e31d93e0 100644 --- a/src/Components/Endpoints/test/RazorComponentsServiceCollectionExtensionsTest.cs +++ b/src/Components/Endpoints/test/RazorComponentsServiceCollectionExtensionsTest.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Components.Binding; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Options; @@ -83,6 +84,11 @@ private Dictionary MultiRegistrationServiceTypes { return new Dictionary() { + [typeof(CascadingModelBindingProvider)] = new[] + { + typeof(CascadingFormModelBindingProvider), + typeof(CascadingQueryModelBindingProvider), + } }; } } diff --git a/src/Components/Web/src/Binding/CascadingFormModelBindingProvider.cs b/src/Components/Web/src/Binding/CascadingFormModelBindingProvider.cs new file mode 100644 index 000000000000..d2c28112453e --- /dev/null +++ b/src/Components/Web/src/Binding/CascadingFormModelBindingProvider.cs @@ -0,0 +1,64 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Microsoft.AspNetCore.Components.Binding; + +/// +/// Enables component parameters to be supplied from the query string with . +/// +public sealed class CascadingFormModelBindingProvider : CascadingModelBindingProvider +{ + private readonly IFormValueSupplier _formValueSupplier; + + /// + protected internal override bool AreValuesFixed => true; + + /// + /// Constructs a new instance of . + /// + /// The . + public CascadingFormModelBindingProvider(IFormValueSupplier formValueSupplier) + { + _formValueSupplier = formValueSupplier; + } + + /// + protected internal override bool SupportsCascadingParameterAttributeType(Type attributeType) + => attributeType == typeof(SupplyParameterFromFormAttribute); + + /// + protected internal override bool SupportsParameterType(Type type) + => _formValueSupplier.CanConvertSingleValue(type); + + /// + protected internal override bool CanSupplyValue(ModelBindingContext? bindingContext, in CascadingParameterInfo parameterInfo) + { + var (formName, valueType) = GetFormNameAndValueType(bindingContext, parameterInfo); + return _formValueSupplier.CanBind(formName!, valueType); + } + + /// + protected internal override object? GetCurrentValue(ModelBindingContext? bindingContext, in CascadingParameterInfo parameterInfo) + { + var (formName, valueType) = GetFormNameAndValueType(bindingContext, parameterInfo); + + if (!_formValueSupplier.TryBind(formName!, valueType, out var boundValue)) + { + // TODO: Report errors + return null; + } + + return boundValue; + } + + private static (string FormName, Type ValueType) GetFormNameAndValueType(ModelBindingContext? bindingContext, in CascadingParameterInfo parameterInfo) + { + var valueType = parameterInfo.PropertyType; + var valueName = parameterInfo.Attribute.Name; + var formName = string.IsNullOrEmpty(valueName) ? + (bindingContext?.Name) : + ModelBindingContext.Combine(bindingContext, valueName); + + return (formName!, valueType); + } +} diff --git a/src/Components/Web/src/PublicAPI.Unshipped.txt b/src/Components/Web/src/PublicAPI.Unshipped.txt index 780363a5e104..cb3b73f4a142 100644 --- a/src/Components/Web/src/PublicAPI.Unshipped.txt +++ b/src/Components/Web/src/PublicAPI.Unshipped.txt @@ -2,6 +2,8 @@ *REMOVED*override Microsoft.AspNetCore.Components.Forms.InputFile.OnInitialized() -> void abstract Microsoft.AspNetCore.Components.Forms.FormDataProvider.Entries.get -> System.Collections.Generic.IReadOnlyDictionary! abstract Microsoft.AspNetCore.Components.Forms.FormDataProvider.Name.get -> string? +Microsoft.AspNetCore.Components.Binding.CascadingFormModelBindingProvider +Microsoft.AspNetCore.Components.Binding.CascadingFormModelBindingProvider.CascadingFormModelBindingProvider(Microsoft.AspNetCore.Components.Binding.IFormValueSupplier! formValueSupplier) -> void Microsoft.AspNetCore.Components.Forms.FormDataProvider Microsoft.AspNetCore.Components.Forms.FormDataProvider.FormDataProvider() -> void Microsoft.AspNetCore.Components.Forms.FormDataProvider.IsFormDataAvailable.get -> bool @@ -18,8 +20,6 @@ Microsoft.AspNetCore.Components.HtmlRendering.Infrastructure.StaticHtmlRenderer. Microsoft.AspNetCore.Components.HtmlRendering.Infrastructure.StaticHtmlRenderer.StaticHtmlRenderer(System.IServiceProvider! serviceProvider, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void Microsoft.AspNetCore.Components.RenderTree.WebRenderer.WaitUntilAttachedAsync() -> System.Threading.Tasks.Task! Microsoft.AspNetCore.Components.SupplyParameterFromFormAttribute -Microsoft.AspNetCore.Components.SupplyParameterFromFormAttribute.Name.get -> string? -Microsoft.AspNetCore.Components.SupplyParameterFromFormAttribute.Name.set -> void Microsoft.AspNetCore.Components.SupplyParameterFromFormAttribute.SupplyParameterFromFormAttribute() -> void Microsoft.AspNetCore.Components.Web.AutoRenderMode Microsoft.AspNetCore.Components.Web.AutoRenderMode.AutoRenderMode() -> void @@ -65,6 +65,8 @@ Microsoft.AspNetCore.Components.Web.WebAssemblyRenderMode.WebAssemblyRenderMode( override Microsoft.AspNetCore.Components.HtmlRendering.Infrastructure.StaticHtmlRenderer.Dispatcher.get -> Microsoft.AspNetCore.Components.Dispatcher! override Microsoft.AspNetCore.Components.HtmlRendering.Infrastructure.StaticHtmlRenderer.HandleException(System.Exception! exception) -> void override Microsoft.AspNetCore.Components.HtmlRendering.Infrastructure.StaticHtmlRenderer.UpdateDisplayAsync(in Microsoft.AspNetCore.Components.RenderTree.RenderBatch renderBatch) -> System.Threading.Tasks.Task! +override Microsoft.AspNetCore.Components.SupplyParameterFromFormAttribute.Name.get -> string? +override Microsoft.AspNetCore.Components.SupplyParameterFromFormAttribute.Name.set -> void override Microsoft.AspNetCore.Components.Web.RenderModeAutoAttribute.Mode.get -> Microsoft.AspNetCore.Components.IComponentRenderMode! override Microsoft.AspNetCore.Components.Web.RenderModeServerAttribute.Mode.get -> Microsoft.AspNetCore.Components.IComponentRenderMode! override Microsoft.AspNetCore.Components.Web.RenderModeWebAssemblyAttribute.Mode.get -> Microsoft.AspNetCore.Components.IComponentRenderMode! diff --git a/src/Components/Web/src/SupplyParameterFromFormAttribute.cs b/src/Components/Web/src/SupplyParameterFromFormAttribute.cs index 2ae657c95583..be92c35bc25a 100644 --- a/src/Components/Web/src/SupplyParameterFromFormAttribute.cs +++ b/src/Components/Web/src/SupplyParameterFromFormAttribute.cs @@ -8,11 +8,11 @@ namespace Microsoft.AspNetCore.Components; /// the form data for the form with the specified name. /// [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] -public sealed class SupplyParameterFromFormAttribute : Attribute, IHostEnvironmentCascadingParameter +public sealed class SupplyParameterFromFormAttribute : CascadingParameterAttributeBase { /// /// Gets or sets the name for the parameter. The name is used to match /// the form data and decide whether or not the value needs to be bound. /// - public string? Name { get; set; } + public override string? Name { get; set; } } diff --git a/src/Components/Web/test/Forms/EditFormTest.cs b/src/Components/Web/test/Forms/EditFormTest.cs index 59f449e95a21..46f980eeaf7a 100644 --- a/src/Components/Web/test/Forms/EditFormTest.cs +++ b/src/Components/Web/test/Forms/EditFormTest.cs @@ -20,6 +20,8 @@ public EditFormTest() var services = new ServiceCollection(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); _testRenderer = new(services.BuildServiceProvider()); } diff --git a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHostBuilder.cs b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHostBuilder.cs index 3345d113eb4b..93b2b7e25e50 100644 --- a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHostBuilder.cs +++ b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHostBuilder.cs @@ -263,5 +263,6 @@ internal void InitializeDefaultServices() }); Services.AddSingleton(); Services.AddSingleton(); + Services.AddSingleton(); } } diff --git a/src/Components/WebView/WebView/src/ComponentsWebViewServiceCollectionExtensions.cs b/src/Components/WebView/WebView/src/ComponentsWebViewServiceCollectionExtensions.cs index e522547c6971..497a23cf0d2f 100644 --- a/src/Components/WebView/WebView/src/ComponentsWebViewServiceCollectionExtensions.cs +++ b/src/Components/WebView/WebView/src/ComponentsWebViewServiceCollectionExtensions.cs @@ -32,6 +32,7 @@ public static IServiceCollection AddBlazorWebView(this IServiceCollection servic services.TryAddScoped(); services.TryAddScoped(); services.TryAddScoped(); + services.TryAddEnumerable(ServiceDescriptor.Scoped()); return services; } diff --git a/src/Components/test/E2ETest/Tests/RoutingTest.cs b/src/Components/test/E2ETest/Tests/RoutingTest.cs index 85b074fa9dbf..228b4382476b 100644 --- a/src/Components/test/E2ETest/Tests/RoutingTest.cs +++ b/src/Components/test/E2ETest/Tests/RoutingTest.cs @@ -1451,11 +1451,13 @@ public void CanArriveAtQueryStringPageWithNoQuery() var app = Browser.MountTestComponent(); Assert.Equal("Hello Abc .", app.FindElement(By.Id("test-info")).Text); Assert.Equal("0", app.FindElement(By.Id("value-QueryInt")).Text); + Assert.Equal("0", app.FindElement(By.Id("value-nested-QueryInt")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-NullableDateTimeValue")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-NullableDateOnlyValue")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-NullableTimeOnlyValue")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-StringValue")).Text); Assert.Equal("0 values ()", app.FindElement(By.Id("value-LongValues")).Text); + Assert.Equal("0 values ()", app.FindElement(By.Id("value-nested-LongValues")).Text); AssertHighlightedLinks("With query parameters (none)"); } @@ -1468,11 +1470,13 @@ public void CanArriveAtQueryStringPageWithStringQuery() var app = Browser.MountTestComponent(); Assert.Equal("Hello Abc .", app.FindElement(By.Id("test-info")).Text); Assert.Equal("0", app.FindElement(By.Id("value-QueryInt")).Text); + Assert.Equal("0", app.FindElement(By.Id("value-nested-QueryInt")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-NullableDateTimeValue")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-NullableDateOnlyValue")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-NullableTimeOnlyValue")).Text); Assert.Equal("Hello there", app.FindElement(By.Id("value-StringValue")).Text); Assert.Equal("0 values ()", app.FindElement(By.Id("value-LongValues")).Text); + Assert.Equal("0 values ()", app.FindElement(By.Id("value-nested-LongValues")).Text); AssertHighlightedLinks("With query parameters (none)", "With query parameters (passing string value)"); } @@ -1488,11 +1492,13 @@ public void CanArriveAtQueryStringPageWithDateTimeQuery() var app = Browser.MountTestComponent(); Assert.Equal("Hello Abc .", app.FindElement(By.Id("test-info")).Text); Assert.Equal("0", app.FindElement(By.Id("value-QueryInt")).Text); + Assert.Equal("0", app.FindElement(By.Id("value-nested-QueryInt")).Text); Assert.Equal(dateTime.ToString("hh:mm:ss on yyyy-MM-dd", CultureInfo.InvariantCulture), app.FindElement(By.Id("value-NullableDateTimeValue")).Text); Assert.Equal(dateOnly.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture), app.FindElement(By.Id("value-NullableDateOnlyValue")).Text); Assert.Equal(timeOnly.ToString("hh:mm:ss", CultureInfo.InvariantCulture), app.FindElement(By.Id("value-NullableTimeOnlyValue")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-StringValue")).Text); Assert.Equal("0 values ()", app.FindElement(By.Id("value-LongValues")).Text); + Assert.Equal("0 values ()", app.FindElement(By.Id("value-nested-LongValues")).Text); AssertHighlightedLinks("With query parameters (none)", "With query parameters (passing Date Time values)"); } @@ -1507,11 +1513,13 @@ public void CanNavigateToQueryStringPageWithNoQuery() Assert.Equal("Hello Abc .", app.FindElement(By.Id("test-info")).Text); Assert.Equal("0", app.FindElement(By.Id("value-QueryInt")).Text); + Assert.Equal("0", app.FindElement(By.Id("value-nested-QueryInt")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-NullableDateTimeValue")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-NullableDateOnlyValue")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-NullableTimeOnlyValue")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-StringValue")).Text); Assert.Equal("0 values ()", app.FindElement(By.Id("value-LongValues")).Text); + Assert.Equal("0 values ()", app.FindElement(By.Id("value-nested-LongValues")).Text); AssertHighlightedLinks("With query parameters (none)"); } @@ -1527,11 +1535,13 @@ public void CanNavigateBetweenPagesWithQueryStrings() Browser.Equal("Hello Abc .", () => app.FindElement(By.Id("test-info")).Text); Assert.Equal("0", app.FindElement(By.Id("value-QueryInt")).Text); + Assert.Equal("0", app.FindElement(By.Id("value-nested-QueryInt")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-NullableDateTimeValue")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-NullableDateOnlyValue")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-NullableTimeOnlyValue")).Text); Assert.Equal("Hello there", app.FindElement(By.Id("value-StringValue")).Text); Assert.Equal("0 values ()", app.FindElement(By.Id("value-LongValues")).Text); + Assert.Equal("0 values ()", app.FindElement(By.Id("value-nested-LongValues")).Text); var instanceId = app.FindElement(By.Id("instance-id")).Text; Assert.True(!string.IsNullOrWhiteSpace(instanceId)); @@ -1540,22 +1550,26 @@ public void CanNavigateBetweenPagesWithQueryStrings() // We can also navigate to a different query while retaining the same component instance app.FindElement(By.LinkText("With IntValue and LongValues")).Click(); Browser.Equal("123", () => app.FindElement(By.Id("value-QueryInt")).Text); + Browser.Equal("123", () => app.FindElement(By.Id("value-nested-QueryInt")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-NullableDateTimeValue")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-NullableDateOnlyValue")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-NullableTimeOnlyValue")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-StringValue")).Text); Assert.Equal("3 values (50, 100, -20)", app.FindElement(By.Id("value-LongValues")).Text); + Assert.Equal("3 values (50, 100, -20)", app.FindElement(By.Id("value-nested-LongValues")).Text); Assert.Equal(instanceId, app.FindElement(By.Id("instance-id")).Text); AssertHighlightedLinks("With query parameters (none)"); // We can also click back to go the preceding query while retaining the same component instance Browser.Navigate().Back(); Browser.Equal("0", () => app.FindElement(By.Id("value-QueryInt")).Text); + Browser.Equal("0", () => app.FindElement(By.Id("value-nested-QueryInt")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-NullableDateTimeValue")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-NullableDateOnlyValue")).Text); Assert.Equal(string.Empty, app.FindElement(By.Id("value-NullableTimeOnlyValue")).Text); Assert.Equal("Hello there", app.FindElement(By.Id("value-StringValue")).Text); Assert.Equal("0 values ()", app.FindElement(By.Id("value-LongValues")).Text); + Assert.Equal("0 values ()", app.FindElement(By.Id("value-nested-LongValues")).Text); Assert.Equal(instanceId, app.FindElement(By.Id("instance-id")).Text); AssertHighlightedLinks("With query parameters (none)", "With query parameters (passing string value)"); } diff --git a/src/Components/test/testassets/BasicTestApp/RouterTest/NestedQueryParameters.razor b/src/Components/test/testassets/BasicTestApp/RouterTest/NestedQueryParameters.razor new file mode 100644 index 000000000000..475642b1bbd0 --- /dev/null +++ b/src/Components/test/testassets/BasicTestApp/RouterTest/NestedQueryParameters.razor @@ -0,0 +1,12 @@ +
+ Nested query parameters: +

Nested IntValue: @IntValue

+

Nested LongValues: @LongValues.Length values (@string.Join(", ", LongValues.Select(x => x.ToString()).ToArray()))

+
+ +@code +{ + [SupplyParameterFromQuery] public int IntValue { get ; set; } + + [SupplyParameterFromQuery(Name = "l")] public long[] LongValues { get ; set; } +} diff --git a/src/Components/test/testassets/BasicTestApp/RouterTest/WithQueryParameters.razor b/src/Components/test/testassets/BasicTestApp/RouterTest/WithQueryParameters.razor index 46a19b816bcc..14631cfe8fd0 100644 --- a/src/Components/test/testassets/BasicTestApp/RouterTest/WithQueryParameters.razor +++ b/src/Components/test/testassets/BasicTestApp/RouterTest/WithQueryParameters.razor @@ -7,6 +7,8 @@

StringValue: @StringValue

LongValues: @LongValues.Length values (@string.Join(", ", LongValues.Select(x => x.ToString()).ToArray()))

+ +

Instance ID: @instanceId

@@ -23,15 +25,15 @@ [Parameter] public string OptionalLastName { get ; set; } - [Parameter, SupplyParameterFromQuery] public int IntValue { get ; set; } + [SupplyParameterFromQuery] public int IntValue { get ; set; } - [Parameter, SupplyParameterFromQuery] public DateTime? NullableDateTimeValue { get ; set; } + [SupplyParameterFromQuery] public DateTime? NullableDateTimeValue { get ; set; } - [Parameter, SupplyParameterFromQuery] public DateOnly? NullableDateOnlyValue { get ; set; } + [SupplyParameterFromQuery] public DateOnly? NullableDateOnlyValue { get ; set; } - [Parameter, SupplyParameterFromQuery] public TimeOnly? NullableTimeOnlyValue { get ; set; } + [SupplyParameterFromQuery] public TimeOnly? NullableTimeOnlyValue { get ; set; } - [Parameter, SupplyParameterFromQuery] public string StringValue { get ; set; } + [SupplyParameterFromQuery] public string StringValue { get ; set; } - [Parameter, SupplyParameterFromQuery(Name = "l")] public long[] LongValues { get ; set; } + [SupplyParameterFromQuery(Name = "l")] public long[] LongValues { get ; set; } } From 974d15e3b021101ad702d898f15e63a17b9a7160 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Jun 2023 09:21:05 -0700 Subject: [PATCH 04/38] [main] (deps): Bump src/submodules/googletest (#48851) Bumps [src/submodules/googletest](https://github.com/google/googletest) from `334704d` to `18fa6a4`. - [Release notes](https://github.com/google/googletest/releases) - [Commits](https://github.com/google/googletest/compare/334704df263b480a3e9e7441ed3292a5e30a37ec...18fa6a4db32a30675c0b19bf72f8b5f693d21a23) --- updated-dependencies: - dependency-name: src/submodules/googletest dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/submodules/googletest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/submodules/googletest b/src/submodules/googletest index 334704df263b..18fa6a4db32a 160000 --- a/src/submodules/googletest +++ b/src/submodules/googletest @@ -1 +1 @@ -Subproject commit 334704df263b480a3e9e7441ed3292a5e30a37ec +Subproject commit 18fa6a4db32a30675c0b19bf72f8b5f693d21a23 From 90e8089a63108a66fe93841ceba0c1ce38aef005 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 16 Jun 2023 12:52:53 -0700 Subject: [PATCH 05/38] Update dependencies from https://github.com/dotnet/source-build-reference-packages build 20230615.1 (#48852) --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 418d3cfea5e6..ac8e8f495b1f 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -329,9 +329,9 @@ 9a1c3e1b7f0c8763d4c96e593961a61a72679a7b - + https://github.com/dotnet/source-build-reference-packages - f8ebadcc83f7fc8cfd5147078c87d6e583cb32f1 + b34c6434a7b422a79e104ef7f24cee0d6ddba3c5 diff --git a/eng/Versions.props b/eng/Versions.props index 1386b694e8cf..fa6c99c47139 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -162,7 +162,7 @@ 8.0.0-alpha.1.23305.2 - 8.0.0-alpha.1.23314.1 + 8.0.0-alpha.1.23315.1 7.0.0-preview.22423.2 From 70167f8b68e5a7f956db4591d4382df3b54b09d1 Mon Sep 17 00:00:00 2001 From: ashutoshjadhav9 <126747196+ashutoshjadhav9@users.noreply.github.com> Date: Sat, 17 Jun 2023 01:54:08 +0530 Subject: [PATCH 06/38] Added ppc64le architecture to support testcases on power machine. (#48638) --- .../src/Common/RuntimeArchitecture.cs | 3 ++- .../src/Common/RuntimeArchitectures.cs | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Hosting/Server.IntegrationTesting/src/Common/RuntimeArchitecture.cs b/src/Hosting/Server.IntegrationTesting/src/Common/RuntimeArchitecture.cs index 20194275c2fd..60c0b6d2de80 100644 --- a/src/Hosting/Server.IntegrationTesting/src/Common/RuntimeArchitecture.cs +++ b/src/Hosting/Server.IntegrationTesting/src/Common/RuntimeArchitecture.cs @@ -7,5 +7,6 @@ public enum RuntimeArchitecture { arm64, x64, - x86 + x86, + ppc64le //Power Architecture } diff --git a/src/Hosting/Server.IntegrationTesting/src/Common/RuntimeArchitectures.cs b/src/Hosting/Server.IntegrationTesting/src/Common/RuntimeArchitectures.cs index 5918fcd2554e..fc2eaafb1608 100644 --- a/src/Hosting/Server.IntegrationTesting/src/Common/RuntimeArchitectures.cs +++ b/src/Hosting/Server.IntegrationTesting/src/Common/RuntimeArchitectures.cs @@ -16,6 +16,7 @@ public static RuntimeArchitecture Current Architecture.Arm64 => RuntimeArchitecture.arm64, Architecture.X64 => RuntimeArchitecture.x64, Architecture.X86 => RuntimeArchitecture.x86, + Architecture.Ppc64le => RuntimeArchitecture.ppc64le, _ => throw new NotImplementedException($"Unknown RuntimeInformation.OSArchitecture: {RuntimeInformation.OSArchitecture.ToString()}"), }; } From 13ec6cbb5bd085eadd4eaa5584eb35f02ebff0c6 Mon Sep 17 00:00:00 2001 From: Mackinnon Buck Date: Fri, 16 Jun 2023 13:43:38 -0700 Subject: [PATCH 07/38] Update NuGet client dependencies (#48862) --- eng/SourceBuildPrebuiltBaseline.xml | 10 +++++----- eng/Version.Details.xml | 12 ++++++------ eng/Versions.props | 6 +++--- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/eng/SourceBuildPrebuiltBaseline.xml b/eng/SourceBuildPrebuiltBaseline.xml index ce0ed56ca4a6..ea5a86530de6 100644 --- a/eng/SourceBuildPrebuiltBaseline.xml +++ b/eng/SourceBuildPrebuiltBaseline.xml @@ -6,11 +6,11 @@ - - - - - + + + + + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ac8e8f495b1f..7386bc81ee60 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -385,17 +385,17 @@ https://github.com/dotnet/arcade f3952775e6d00a5b6f43b0615a8a766e095185eb - + https://github.com/nuget/nuget.client - 027ca8b8ef4b4dc94995f87b9c441d2bcf742c1d + 8fef55f5a55a3b4f2c96cd1a9b5ddc51d4b927f8 - + https://github.com/nuget/nuget.client - 027ca8b8ef4b4dc94995f87b9c441d2bcf742c1d + 8fef55f5a55a3b4f2c96cd1a9b5ddc51d4b927f8 - + https://github.com/nuget/nuget.client - 027ca8b8ef4b4dc94995f87b9c441d2bcf742c1d + 8fef55f5a55a3b4f2c96cd1a9b5ddc51d4b927f8 diff --git a/eng/Versions.props b/eng/Versions.props index fa6c99c47139..826ebf9da5cf 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -150,9 +150,9 @@ 4.4.0-4.22520.2 - 6.2.2 - 6.2.2 - 6.2.2 + 6.2.4 + 6.2.4 + 6.2.4 8.0.0-beta.23312.4 8.0.0-beta.23312.4 From dc9f64379b8c4b6807853381d11bb51a5afb9daf Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sat, 17 Jun 2023 13:16:54 +0000 Subject: [PATCH 08/38] Update dependencies from https://github.com/dotnet/runtime build 20230617.1 (#48867) [main] Update dependencies from dotnet/runtime --- eng/Version.Details.xml | 276 ++++++++++++++++++++-------------------- eng/Versions.props | 138 ++++++++++---------- 2 files changed, 207 insertions(+), 207 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 7386bc81ee60..64efba35e309 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -41,288 +41,288 @@ https://github.com/dotnet/efcore ef30eb29656f1924c289c29278192de79ea98b42 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 https://github.com/dotnet/source-build-externals 7f9ae67f86a5adc1d9bf2f22f4bf3ec05b6d7b68 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 https://github.com/dotnet/xdt @@ -355,9 +355,9 @@ - + https://github.com/dotnet/runtime - be6a1389c852fdc96a919769867fb3f3ddb0fbde + 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 https://github.com/dotnet/arcade diff --git a/eng/Versions.props b/eng/Versions.props index 826ebf9da5cf..a27fbeed7c9d 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -63,77 +63,77 @@ --> - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 - 8.0.0-preview.6.23316.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.1 8.0.0-preview.6.23315.1 8.0.0-preview.6.23315.1 From 9178b9b117e64ca75821db1927e4857714c5da97 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Sun, 18 Jun 2023 13:16:41 +0000 Subject: [PATCH 09/38] Update dependencies from https://github.com/dotnet/runtime build 20230617.4 (#48877) [main] Update dependencies from dotnet/runtime --- eng/Version.Details.xml | 276 ++++++++++++++++++++-------------------- eng/Versions.props | 138 ++++++++++---------- 2 files changed, 207 insertions(+), 207 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 64efba35e309..d60279a14ba4 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -41,288 +41,288 @@ https://github.com/dotnet/efcore ef30eb29656f1924c289c29278192de79ea98b42 - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a https://github.com/dotnet/source-build-externals 7f9ae67f86a5adc1d9bf2f22f4bf3ec05b6d7b68 - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a https://github.com/dotnet/xdt @@ -355,9 +355,9 @@ - + https://github.com/dotnet/runtime - 7e798a90bf9ac79c6d42760fa0760eea1b35ffe1 + 2c62994efb2495dcaef2312de3ab25ea4792b23a https://github.com/dotnet/arcade diff --git a/eng/Versions.props b/eng/Versions.props index a27fbeed7c9d..9519c5a34bf9 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -63,77 +63,77 @@ --> - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 - 8.0.0-preview.6.23317.1 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23317.4 8.0.0-preview.6.23315.1 8.0.0-preview.6.23315.1 From 85a61e0b9955907ecacbbe24137020eb431e234e Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 19 Jun 2023 13:45:28 +0000 Subject: [PATCH 10/38] Update dependencies from https://github.com/dotnet/arcade build 20230616.6 (#48895) [main] Update dependencies from dotnet/arcade - Coherency Updates: - Microsoft.SourceLink.GitHub: from 8.0.0-beta.23309.3 to 8.0.0-beta.23314.2 (parent: Microsoft.DotNet.Arcade.Sdk) --- eng/Version.Details.xml | 24 ++++++++++++------------ eng/Versions.props | 8 ++++---- eng/common/dotnet-install.sh | 4 ++++ global.json | 4 ++-- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index d60279a14ba4..5e108625507e 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -359,31 +359,31 @@ https://github.com/dotnet/runtime 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/arcade - f3952775e6d00a5b6f43b0615a8a766e095185eb + e2334b2be36919347923d0ec872a46acddb1e385 - + https://github.com/dotnet/sourcelink - 23bda65700e70b6697390dcc4e0f87e2dfbce63a + 4d2c8bf58e8cb7900ec2d9077c155572e2d3cd88 - + https://github.com/dotnet/arcade - f3952775e6d00a5b6f43b0615a8a766e095185eb + e2334b2be36919347923d0ec872a46acddb1e385 - + https://github.com/dotnet/arcade - f3952775e6d00a5b6f43b0615a8a766e095185eb + e2334b2be36919347923d0ec872a46acddb1e385 - + https://github.com/dotnet/arcade - f3952775e6d00a5b6f43b0615a8a766e095185eb + e2334b2be36919347923d0ec872a46acddb1e385 - + https://github.com/dotnet/arcade - f3952775e6d00a5b6f43b0615a8a766e095185eb + e2334b2be36919347923d0ec872a46acddb1e385 https://github.com/nuget/nuget.client diff --git a/eng/Versions.props b/eng/Versions.props index 9519c5a34bf9..5456292b626a 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -154,11 +154,11 @@ 6.2.4 6.2.4 - 8.0.0-beta.23312.4 - 8.0.0-beta.23312.4 - 8.0.0-beta.23312.4 + 8.0.0-beta.23316.6 + 8.0.0-beta.23316.6 + 8.0.0-beta.23316.6 - 8.0.0-beta.23309.3 + 8.0.0-beta.23314.2 8.0.0-alpha.1.23305.2 diff --git a/eng/common/dotnet-install.sh b/eng/common/dotnet-install.sh index abd045a3247f..7e69e3a9e24a 100755 --- a/eng/common/dotnet-install.sh +++ b/eng/common/dotnet-install.sh @@ -54,6 +54,10 @@ cpuname=$(uname -m) case $cpuname in arm64|aarch64) buildarch=arm64 + if [ "$(getconf LONG_BIT)" -lt 64 ]; then + # This is 32-bit OS running on 64-bit CPU (for example Raspberry Pi OS) + buildarch=arm + fi ;; loongarch64) buildarch=loongarch64 diff --git a/global.json b/global.json index 7089e5870f56..2a4bd537021d 100644 --- a/global.json +++ b/global.json @@ -27,7 +27,7 @@ }, "msbuild-sdks": { "Yarn.MSBuild": "1.22.10", - "Microsoft.DotNet.Arcade.Sdk": "8.0.0-beta.23312.4", - "Microsoft.DotNet.Helix.Sdk": "8.0.0-beta.23312.4" + "Microsoft.DotNet.Arcade.Sdk": "8.0.0-beta.23316.6", + "Microsoft.DotNet.Helix.Sdk": "8.0.0-beta.23316.6" } } From 8e2851f7d4ab42bd473fcd4489942de18d893312 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 19 Jun 2023 14:55:32 +0000 Subject: [PATCH 11/38] Update dependencies from https://github.com/dotnet/source-build-externals build 20230615.1 (#48896) [main] Update dependencies from dotnet/source-build-externals --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 5e108625507e..406f3747052e 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -189,9 +189,9 @@ https://github.com/dotnet/runtime 2c62994efb2495dcaef2312de3ab25ea4792b23a - + https://github.com/dotnet/source-build-externals - 7f9ae67f86a5adc1d9bf2f22f4bf3ec05b6d7b68 + 06913fc4c3fcb0065ee390d135fb766870d2c38a diff --git a/eng/Versions.props b/eng/Versions.props index 5456292b626a..4f7042736199 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -160,7 +160,7 @@ 8.0.0-beta.23314.2 - 8.0.0-alpha.1.23305.2 + 8.0.0-alpha.1.23315.1 8.0.0-alpha.1.23315.1 From f1da7a091c89d38a06e3d2c70521a1a288bf6f1c Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Tue, 20 Jun 2023 08:47:25 +0800 Subject: [PATCH 12/38] Remove route and method tags from rate limiting (#48707) --- .../RateLimiting/src/MetricsContext.cs | 6 +--- .../RateLimiting/src/RateLimitingMetrics.cs | 12 ++------ .../src/RateLimitingMiddleware.cs | 12 ++------ .../test/RateLimitingMetricsTests.cs | 28 ++++++++----------- 4 files changed, 18 insertions(+), 40 deletions(-) diff --git a/src/Middleware/RateLimiting/src/MetricsContext.cs b/src/Middleware/RateLimiting/src/MetricsContext.cs index 5a77cd9c4cd3..08e58c90cf32 100644 --- a/src/Middleware/RateLimiting/src/MetricsContext.cs +++ b/src/Middleware/RateLimiting/src/MetricsContext.cs @@ -6,16 +6,12 @@ namespace Microsoft.AspNetCore.RateLimiting; internal readonly struct MetricsContext { public readonly string? PolicyName; - public readonly string? Method; - public readonly string? Route; public readonly bool CurrentLeasedRequestsCounterEnabled; public readonly bool CurrentQueuedRequestsCounterEnabled; - public MetricsContext(string? policyName, string? method, string? route, bool currentLeasedRequestsCounterEnabled, bool currentQueuedRequestsCounterEnabled) + public MetricsContext(string? policyName, bool currentLeasedRequestsCounterEnabled, bool currentQueuedRequestsCounterEnabled) { PolicyName = policyName; - Method = method; - Route = route; CurrentLeasedRequestsCounterEnabled = currentLeasedRequestsCounterEnabled; CurrentQueuedRequestsCounterEnabled = currentQueuedRequestsCounterEnabled; } diff --git a/src/Middleware/RateLimiting/src/RateLimitingMetrics.cs b/src/Middleware/RateLimiting/src/RateLimitingMetrics.cs index 2e105f13e564..337fe5b23940 100644 --- a/src/Middleware/RateLimiting/src/RateLimitingMetrics.cs +++ b/src/Middleware/RateLimiting/src/RateLimitingMetrics.cs @@ -162,18 +162,10 @@ private static void InitializeRateLimitingTags(ref TagList tags, in MetricsConte { tags.Add("policy", metricsContext.PolicyName); } - if (metricsContext.Method is not null) - { - tags.Add("method", metricsContext.Method); - } - if (metricsContext.Route is not null) - { - tags.Add("route", metricsContext.Route); - } } - public MetricsContext CreateContext(string? policyName, string? method, string? route) + public MetricsContext CreateContext(string? policyName) { - return new MetricsContext(policyName, method, route, _currentLeasedRequestsCounter.Enabled, _currentQueuedRequestsCounter.Enabled); + return new MetricsContext(policyName, _currentLeasedRequestsCounter.Enabled, _currentQueuedRequestsCounter.Enabled); } } diff --git a/src/Middleware/RateLimiting/src/RateLimitingMiddleware.cs b/src/Middleware/RateLimiting/src/RateLimitingMiddleware.cs index 18c1e9bf1bd4..a1277888206e 100644 --- a/src/Middleware/RateLimiting/src/RateLimitingMiddleware.cs +++ b/src/Middleware/RateLimiting/src/RateLimitingMiddleware.cs @@ -4,7 +4,6 @@ using System.Diagnostics; using System.Threading.RateLimiting; using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Http.Metadata; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; @@ -78,15 +77,10 @@ public Task Invoke(HttpContext context) return _next(context); } - // Only include route and method if we have an endpoint with a route. - // A request always has a HTTP request, but it isn't useful unless combined with a route. - var route = endpoint?.Metadata.GetMetadata()?.Route; - var method = route is not null ? context.Request.Method : null; - - return InvokeInternal(context, enableRateLimitingAttribute, method, route); + return InvokeInternal(context, enableRateLimitingAttribute); } - private async Task InvokeInternal(HttpContext context, EnableRateLimitingAttribute? enableRateLimitingAttribute, string? method, string? route) + private async Task InvokeInternal(HttpContext context, EnableRateLimitingAttribute? enableRateLimitingAttribute) { var policyName = enableRateLimitingAttribute?.PolicyName; @@ -94,7 +88,7 @@ private async Task InvokeInternal(HttpContext context, EnableRateLimitingAttribu // This ensures that the state is consistent for the entire request. // For example, if a meter listener starts after a request is queued, when the request exits the queue // the requests queued counter won't go into a negative value. - var metricsContext = _metrics.CreateContext(policyName, method, route); + var metricsContext = _metrics.CreateContext(policyName); using var leaseContext = await TryAcquireAsync(context, metricsContext); diff --git a/src/Middleware/RateLimiting/test/RateLimitingMetricsTests.cs b/src/Middleware/RateLimiting/test/RateLimitingMetricsTests.cs index e0ab83ff035b..6ffd16e92a47 100644 --- a/src/Middleware/RateLimiting/test/RateLimitingMetricsTests.cs +++ b/src/Middleware/RateLimiting/test/RateLimitingMetricsTests.cs @@ -93,7 +93,7 @@ public async Task Metrics_Success() await syncPoint.WaitForSyncPoint().DefaultTimeout(); Assert.Collection(currentLeaseRequestsRecorder.GetMeasurements(), - m => AssertCounter(m, 1, null, null, null)); + m => AssertCounter(m, 1, null)); Assert.Empty(leaseRequestDurationRecorder.GetMeasurements()); syncPoint.Continue(); @@ -104,10 +104,10 @@ public async Task Metrics_Success() Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode); Assert.Collection(currentLeaseRequestsRecorder.GetMeasurements(), - m => AssertCounter(m, 1, null, null, null), - m => AssertCounter(m, -1, null, null, null)); + m => AssertCounter(m, 1, null), + m => AssertCounter(m, -1, null)); Assert.Collection(leaseRequestDurationRecorder.GetMeasurements(), - m => AssertDuration(m, null, null, null)); + m => AssertDuration(m, null)); Assert.Empty(currentRequestsQueuedRecorder.GetMeasurements()); Assert.Empty(queuedRequestDurationRecorder.GetMeasurements()); Assert.Empty(leaseFailedRequestsRecorder.GetMeasurements()); @@ -156,7 +156,7 @@ public async Task Metrics_ListenInMiddleOfRequest_CurrentLeasesNotDecreased() Assert.Empty(currentLeaseRequestsRecorder.GetMeasurements()); Assert.Collection(leaseRequestDurationRecorder.GetMeasurements(), - m => AssertDuration(m, null, null, null)); + m => AssertDuration(m, null)); } [Fact] @@ -214,7 +214,7 @@ public async Task Metrics_Queued() // Assert second request is queued. Assert.Collection(currentRequestsQueuedRecorder.GetMeasurements(), - m => AssertCounter(m, 1, "GET", "/", "concurrencyPolicy")); + m => AssertCounter(m, 1, "concurrencyPolicy")); Assert.Empty(queuedRequestDurationRecorder.GetMeasurements()); // Allow both requests to finish. @@ -224,10 +224,10 @@ public async Task Metrics_Queued() await middlewareTask2.DefaultTimeout(); Assert.Collection(currentRequestsQueuedRecorder.GetMeasurements(), - m => AssertCounter(m, 1, "GET", "/", "concurrencyPolicy"), - m => AssertCounter(m, -1, "GET", "/", "concurrencyPolicy")); + m => AssertCounter(m, 1, "concurrencyPolicy"), + m => AssertCounter(m, -1, "concurrencyPolicy")); Assert.Collection(queuedRequestDurationRecorder.GetMeasurements(), - m => AssertDuration(m, "GET", "/", "concurrencyPolicy")); + m => AssertDuration(m, "concurrencyPolicy")); } [Fact] @@ -296,22 +296,18 @@ public async Task Metrics_ListenInMiddleOfQueued_CurrentQueueNotDecreased() Assert.Empty(currentRequestsQueuedRecorder.GetMeasurements()); Assert.Collection(queuedRequestDurationRecorder.GetMeasurements(), - m => AssertDuration(m, "GET", "/", "concurrencyPolicy")); + m => AssertDuration(m, "concurrencyPolicy")); } - private static void AssertCounter(Measurement measurement, long value, string method, string route, string policy) + private static void AssertCounter(Measurement measurement, long value, string policy) { Assert.Equal(value, measurement.Value); - AssertTag(measurement.Tags, "method", method); - AssertTag(measurement.Tags, "route", route); AssertTag(measurement.Tags, "policy", policy); } - private static void AssertDuration(Measurement measurement, string method, string route, string policy) + private static void AssertDuration(Measurement measurement, string policy) { Assert.True(measurement.Value > 0); - AssertTag(measurement.Tags, "method", method); - AssertTag(measurement.Tags, "route", route); AssertTag(measurement.Tags, "policy", policy); } From 082795bc1a47eb20f92b721b988d6238896c2d6c Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 00:54:53 +0000 Subject: [PATCH 13/38] [main] Update dependencies from dotnet/runtime dotnet/efcore (#48894) [main] Update dependencies from dotnet/runtime dotnet/efcore - Remove unneded references to using Microsoft.Extensions.Diagnostics.Metrics --- eng/Version.Details.xml | 308 +++++++++--------- eng/Versions.props | 154 ++++----- .../src/GenericHost/GenericWebHostBuilder.cs | 1 - .../src/GenericHost/SlimWebHostBuilder.cs | 1 - src/Hosting/Hosting/src/WebHostBuilder.cs | 1 - .../RateLimiterServiceCollectionExtensions.cs | 1 - .../SignalRDependencyInjectionExtensions.cs | 1 - 7 files changed, 231 insertions(+), 236 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 406f3747052e..6eabc65cdab3 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -9,320 +9,320 @@ --> - + https://github.com/dotnet/efcore - ef30eb29656f1924c289c29278192de79ea98b42 + b0b202671f7879070423e95776edc014885335ad - + https://github.com/dotnet/efcore - ef30eb29656f1924c289c29278192de79ea98b42 + b0b202671f7879070423e95776edc014885335ad - + https://github.com/dotnet/efcore - ef30eb29656f1924c289c29278192de79ea98b42 + b0b202671f7879070423e95776edc014885335ad - + https://github.com/dotnet/efcore - ef30eb29656f1924c289c29278192de79ea98b42 + b0b202671f7879070423e95776edc014885335ad - + https://github.com/dotnet/efcore - ef30eb29656f1924c289c29278192de79ea98b42 + b0b202671f7879070423e95776edc014885335ad - + https://github.com/dotnet/efcore - ef30eb29656f1924c289c29278192de79ea98b42 + b0b202671f7879070423e95776edc014885335ad - + https://github.com/dotnet/efcore - ef30eb29656f1924c289c29278192de79ea98b42 + b0b202671f7879070423e95776edc014885335ad - + https://github.com/dotnet/efcore - ef30eb29656f1924c289c29278192de79ea98b42 + b0b202671f7879070423e95776edc014885335ad - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f https://github.com/dotnet/source-build-externals 06913fc4c3fcb0065ee390d135fb766870d2c38a - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f https://github.com/dotnet/xdt @@ -355,9 +355,9 @@ - + https://github.com/dotnet/runtime - 2c62994efb2495dcaef2312de3ab25ea4792b23a + 815953a12c822847095a843d69c610a9f895ae3f https://github.com/dotnet/arcade diff --git a/eng/Versions.props b/eng/Versions.props index 4f7042736199..d1e970c2f0b8 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -63,86 +63,86 @@ --> - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 - 8.0.0-preview.6.23317.4 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 + 8.0.0-preview.6.23318.9 - 8.0.0-preview.6.23315.1 - 8.0.0-preview.6.23315.1 - 8.0.0-preview.6.23315.1 - 8.0.0-preview.6.23315.1 - 8.0.0-preview.6.23315.1 - 8.0.0-preview.6.23315.1 - 8.0.0-preview.6.23315.1 - 8.0.0-preview.6.23315.1 + 8.0.0-preview.6.23319.5 + 8.0.0-preview.6.23319.5 + 8.0.0-preview.6.23319.5 + 8.0.0-preview.6.23319.5 + 8.0.0-preview.6.23319.5 + 8.0.0-preview.6.23319.5 + 8.0.0-preview.6.23319.5 + 8.0.0-preview.6.23319.5 4.4.0-4.22520.2 4.4.0-4.22520.2 diff --git a/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs b/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs index 45c7a0215aa6..c4c5488e958e 100644 --- a/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs +++ b/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs @@ -14,7 +14,6 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Diagnostics.Metrics; using Microsoft.Extensions.Hosting; namespace Microsoft.AspNetCore.Hosting; diff --git a/src/Hosting/Hosting/src/GenericHost/SlimWebHostBuilder.cs b/src/Hosting/Hosting/src/GenericHost/SlimWebHostBuilder.cs index 693f39a497c7..ff99aed202a7 100644 --- a/src/Hosting/Hosting/src/GenericHost/SlimWebHostBuilder.cs +++ b/src/Hosting/Hosting/src/GenericHost/SlimWebHostBuilder.cs @@ -11,7 +11,6 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Diagnostics.Metrics; using Microsoft.Extensions.Hosting; namespace Microsoft.AspNetCore.Hosting; diff --git a/src/Hosting/Hosting/src/WebHostBuilder.cs b/src/Hosting/Hosting/src/WebHostBuilder.cs index aff8235a7b80..f21d3593697e 100644 --- a/src/Hosting/Hosting/src/WebHostBuilder.cs +++ b/src/Hosting/Hosting/src/WebHostBuilder.cs @@ -12,7 +12,6 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Diagnostics.Metrics; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; diff --git a/src/Middleware/RateLimiting/src/RateLimiterServiceCollectionExtensions.cs b/src/Middleware/RateLimiting/src/RateLimiterServiceCollectionExtensions.cs index 404f6a5e9b8c..09f6f7ba7c5c 100644 --- a/src/Middleware/RateLimiting/src/RateLimiterServiceCollectionExtensions.cs +++ b/src/Middleware/RateLimiting/src/RateLimiterServiceCollectionExtensions.cs @@ -3,7 +3,6 @@ using Microsoft.AspNetCore.RateLimiting; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Diagnostics.Metrics; namespace Microsoft.AspNetCore.Builder; diff --git a/src/SignalR/server/SignalR/src/SignalRDependencyInjectionExtensions.cs b/src/SignalR/server/SignalR/src/SignalRDependencyInjectionExtensions.cs index 628fee8b5f12..ed613ec73f96 100644 --- a/src/SignalR/server/SignalR/src/SignalRDependencyInjectionExtensions.cs +++ b/src/SignalR/server/SignalR/src/SignalRDependencyInjectionExtensions.cs @@ -5,7 +5,6 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Diagnostics.Metrics; using Microsoft.Extensions.Options; namespace Microsoft.Extensions.DependencyInjection; From 477b22a7ed25e7943e9ae93404ca0609ecacd0b7 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Tue, 20 Jun 2023 11:24:33 +1000 Subject: [PATCH 14/38] Update dependencies from https://github.com/dotnet/source-build-reference-packages build 20230616.2 (#48869) Microsoft.SourceBuild.Intermediate.source-build-reference-packages From Version 8.0.0-alpha.1.23315.1 -> To Version 8.0.0-alpha.1.23316.2 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 6eabc65cdab3..c7b19af3f9a8 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -329,9 +329,9 @@ 9a1c3e1b7f0c8763d4c96e593961a61a72679a7b - + https://github.com/dotnet/source-build-reference-packages - b34c6434a7b422a79e104ef7f24cee0d6ddba3c5 + 3e92e7cead1e08476973f637007bb22cde7843ca diff --git a/eng/Versions.props b/eng/Versions.props index d1e970c2f0b8..74436a8eb639 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -162,7 +162,7 @@ 8.0.0-alpha.1.23315.1 - 8.0.0-alpha.1.23315.1 + 8.0.0-alpha.1.23316.2 7.0.0-preview.22423.2 From 5ca9116e320806b347f9d5823658c3fb35afcfe0 Mon Sep 17 00:00:00 2001 From: Mitch Denny Date: Tue, 20 Jun 2023 13:07:14 +1000 Subject: [PATCH 15/38] Call HttpContext.Abort() when WebSocket.Abort() is called. (#48892) * Call HttpContext.Abort() when WebSocket.Abort() is called. --- .../WebSockets/src/ServerWebSocket.cs | 80 +++++++ .../WebSockets/src/WebSocketMiddleware.cs | 4 +- .../UnitTests/WebSocketMiddlewareTests.cs | 208 ++++++++++++++---- 3 files changed, 248 insertions(+), 44 deletions(-) create mode 100644 src/Middleware/WebSockets/src/ServerWebSocket.cs diff --git a/src/Middleware/WebSockets/src/ServerWebSocket.cs b/src/Middleware/WebSockets/src/ServerWebSocket.cs new file mode 100644 index 000000000000..70be31cb0459 --- /dev/null +++ b/src/Middleware/WebSockets/src/ServerWebSocket.cs @@ -0,0 +1,80 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Net.WebSockets; +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.WebSockets; + +///

+/// Used in ASP.NET Core to wrap a WebSocket with its associated HttpContext so that when the WebSocket is aborted +/// the underlying HttpContext is aborted. All other methods are delegated to the underlying WebSocket. +/// +internal sealed class ServerWebSocket : WebSocket +{ + private readonly WebSocket _wrappedSocket; + private readonly HttpContext _context; + + internal ServerWebSocket(WebSocket wrappedSocket, HttpContext context) + { + ArgumentNullException.ThrowIfNull(wrappedSocket); + ArgumentNullException.ThrowIfNull(context); + + _wrappedSocket = wrappedSocket; + _context = context; + } + + public override WebSocketCloseStatus? CloseStatus => _wrappedSocket.CloseStatus; + + public override string? CloseStatusDescription => _wrappedSocket.CloseStatusDescription; + + public override WebSocketState State => _wrappedSocket.State; + + public override string? SubProtocol => _wrappedSocket.SubProtocol; + + public override void Abort() + { + _wrappedSocket.Abort(); + _context.Abort(); + } + + public override Task CloseAsync(WebSocketCloseStatus closeStatus, string? statusDescription, CancellationToken cancellationToken) + { + return _wrappedSocket.CloseAsync(closeStatus, statusDescription, cancellationToken); + } + + public override Task CloseOutputAsync(WebSocketCloseStatus closeStatus, string? statusDescription, CancellationToken cancellationToken) + { + return _wrappedSocket.CloseOutputAsync(closeStatus, statusDescription, cancellationToken); + } + + public override void Dispose() + { + _wrappedSocket.Dispose(); + } + + public override Task ReceiveAsync(ArraySegment buffer, CancellationToken cancellationToken) + { + return _wrappedSocket.ReceiveAsync(buffer, cancellationToken); + } + + public override ValueTask ReceiveAsync(Memory buffer, CancellationToken cancellationToken) + { + return _wrappedSocket.ReceiveAsync(buffer, cancellationToken); + } + + public override ValueTask SendAsync(ReadOnlyMemory buffer, WebSocketMessageType messageType, bool endOfMessage, CancellationToken cancellationToken) + { + return _wrappedSocket.SendAsync(buffer, messageType, endOfMessage, cancellationToken); + } + + public override ValueTask SendAsync(ReadOnlyMemory buffer, WebSocketMessageType messageType, WebSocketMessageFlags messageFlags, CancellationToken cancellationToken) + { + return _wrappedSocket.SendAsync(buffer, messageType, messageFlags, cancellationToken); + } + + public override Task SendAsync(ArraySegment buffer, WebSocketMessageType messageType, bool endOfMessage, CancellationToken cancellationToken) + { + return _wrappedSocket.SendAsync(buffer, messageType, endOfMessage, cancellationToken); + } +} diff --git a/src/Middleware/WebSockets/src/WebSocketMiddleware.cs b/src/Middleware/WebSockets/src/WebSocketMiddleware.cs index 5172bfa35bb0..10a28cb0c667 100644 --- a/src/Middleware/WebSockets/src/WebSocketMiddleware.cs +++ b/src/Middleware/WebSockets/src/WebSocketMiddleware.cs @@ -208,13 +208,15 @@ public async Task AcceptAsync(WebSocketAcceptContext acceptContext) // Disable request timeout, if there is one, after the websocket has been accepted _context.Features.Get()?.DisableTimeout(); - return WebSocket.CreateFromStream(opaqueTransport, new WebSocketCreationOptions() + var wrappedSocket = WebSocket.CreateFromStream(opaqueTransport, new WebSocketCreationOptions() { IsServer = true, KeepAliveInterval = keepAliveInterval, SubProtocol = subProtocol, DangerousDeflateOptions = deflateOptions }); + + return new ServerWebSocket(wrappedSocket, _context); } public static bool CheckSupportedWebSocketRequest(string method, IHeaderDictionary requestHeaders) diff --git a/src/Middleware/WebSockets/test/UnitTests/WebSocketMiddlewareTests.cs b/src/Middleware/WebSockets/test/UnitTests/WebSocketMiddlewareTests.cs index 7333332d262a..055b2f8f66a9 100644 --- a/src/Middleware/WebSockets/test/UnitTests/WebSocketMiddlewareTests.cs +++ b/src/Middleware/WebSockets/test/UnitTests/WebSocketMiddlewareTests.cs @@ -5,6 +5,7 @@ using System.Net.Http; using System.Net.WebSockets; using System.Text; +using Microsoft.AspNetCore.Connections; using Microsoft.AspNetCore.Http.Timeouts; using Microsoft.AspNetCore.Testing; using Microsoft.Net.Http.Headers; @@ -75,8 +76,8 @@ public async Task SendEmptyData_Success() using (var client = new ClientWebSocket()) { await client.ConnectAsync(new Uri($"ws://127.0.0.1:{port}/"), CancellationToken.None); - var orriginalData = new byte[0]; - await client.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + var originalData = new byte[0]; + await client.SendAsync(new ArraySegment(originalData), WebSocketMessageType.Binary, true, CancellationToken.None); } } } @@ -84,24 +85,24 @@ public async Task SendEmptyData_Success() [Fact] public async Task SendShortData_Success() { - var orriginalData = Encoding.UTF8.GetBytes("Hello World"); + var originalData = Encoding.UTF8.GetBytes("Hello World"); await using (var server = KestrelWebSocketHelpers.CreateServer(LoggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - var serverBuffer = new byte[orriginalData.Length]; + var serverBuffer = new byte[originalData.Length]; var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); Assert.True(result.EndOfMessage); - Assert.Equal(orriginalData.Length, result.Count); + Assert.Equal(originalData.Length, result.Count); Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - Assert.Equal(orriginalData, serverBuffer); + Assert.Equal(originalData, serverBuffer); })) { using (var client = new ClientWebSocket()) { await client.ConnectAsync(new Uri($"ws://127.0.0.1:{port}/"), CancellationToken.None); - await client.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + await client.SendAsync(new ArraySegment(originalData), WebSocketMessageType.Binary, true, CancellationToken.None); } } } @@ -109,24 +110,24 @@ public async Task SendShortData_Success() [Fact] public async Task SendMediumData_Success() { - var orriginalData = Encoding.UTF8.GetBytes(new string('a', 130)); + var originalData = Encoding.UTF8.GetBytes(new string('a', 130)); await using (var server = KestrelWebSocketHelpers.CreateServer(LoggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - var serverBuffer = new byte[orriginalData.Length]; + var serverBuffer = new byte[originalData.Length]; var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); Assert.True(result.EndOfMessage); - Assert.Equal(orriginalData.Length, result.Count); + Assert.Equal(originalData.Length, result.Count); Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - Assert.Equal(orriginalData, serverBuffer); + Assert.Equal(originalData, serverBuffer); })) { using (var client = new ClientWebSocket()) { await client.ConnectAsync(new Uri($"ws://127.0.0.1:{port}/"), CancellationToken.None); - await client.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + await client.SendAsync(new ArraySegment(originalData), WebSocketMessageType.Binary, true, CancellationToken.None); } } } @@ -135,18 +136,18 @@ public async Task SendMediumData_Success() public async Task SendLongData_Success() { var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - var orriginalData = Encoding.UTF8.GetBytes(new string('a', 0x1FFFF)); + var originalData = Encoding.UTF8.GetBytes(new string('a', 0x1FFFF)); await using (var server = KestrelWebSocketHelpers.CreateServer(LoggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - var serverBuffer = new byte[orriginalData.Length]; + var serverBuffer = new byte[originalData.Length]; var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); Assert.True(result.EndOfMessage); Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - Assert.Equal(orriginalData, serverBuffer); + Assert.Equal(originalData, serverBuffer); tcs.SetResult(); })) @@ -154,7 +155,7 @@ public async Task SendLongData_Success() using (var client = new ClientWebSocket()) { await client.ConnectAsync(new Uri($"ws://127.0.0.1:{port}/"), CancellationToken.None); - await client.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + await client.SendAsync(new ArraySegment(originalData), WebSocketMessageType.Binary, true, CancellationToken.None); } // Wait to close the server otherwise the app could throw if it takes longer than the shutdown timeout @@ -165,14 +166,14 @@ public async Task SendLongData_Success() [Fact] public async Task SendFragmentedData_Success() { - var orriginalData = Encoding.UTF8.GetBytes("Hello World"); + var originalData = Encoding.UTF8.GetBytes("Hello World"); var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); await using (var server = KestrelWebSocketHelpers.CreateServer(LoggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - var serverBuffer = new byte[orriginalData.Length]; + var serverBuffer = new byte[originalData.Length]; var result = await webSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); Assert.False(result.EndOfMessage); Assert.Equal(2, result.Count); @@ -195,19 +196,19 @@ public async Task SendFragmentedData_Success() totalReceived += result.Count; Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - Assert.Equal(orriginalData, serverBuffer); + Assert.Equal(originalData, serverBuffer); })) { using (var client = new ClientWebSocket()) { await client.ConnectAsync(new Uri($"ws://127.0.0.1:{port}/"), CancellationToken.None); - await client.SendAsync(new ArraySegment(orriginalData, 0, 2), WebSocketMessageType.Binary, false, CancellationToken.None); + await client.SendAsync(new ArraySegment(originalData, 0, 2), WebSocketMessageType.Binary, false, CancellationToken.None); await tcs.Task; tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - await client.SendAsync(new ArraySegment(orriginalData, 2, 2), WebSocketMessageType.Binary, false, CancellationToken.None); + await client.SendAsync(new ArraySegment(originalData, 2, 2), WebSocketMessageType.Binary, false, CancellationToken.None); await tcs.Task; tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - await client.SendAsync(new ArraySegment(orriginalData, 4, 7), WebSocketMessageType.Binary, true, CancellationToken.None); + await client.SendAsync(new ArraySegment(originalData, 4, 7), WebSocketMessageType.Binary, true, CancellationToken.None); } } } @@ -215,24 +216,24 @@ public async Task SendFragmentedData_Success() [Fact] public async Task ReceiveShortData_Success() { - var orriginalData = Encoding.UTF8.GetBytes("Hello World"); + var originalData = Encoding.UTF8.GetBytes("Hello World"); await using (var server = KestrelWebSocketHelpers.CreateServer(LoggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - await webSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + await webSocket.SendAsync(new ArraySegment(originalData), WebSocketMessageType.Binary, true, CancellationToken.None); })) { using (var client = new ClientWebSocket()) { await client.ConnectAsync(new Uri($"ws://127.0.0.1:{port}/"), CancellationToken.None); - var clientBuffer = new byte[orriginalData.Length]; + var clientBuffer = new byte[originalData.Length]; var result = await client.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); Assert.True(result.EndOfMessage); - Assert.Equal(orriginalData.Length, result.Count); + Assert.Equal(originalData.Length, result.Count); Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - Assert.Equal(orriginalData, clientBuffer); + Assert.Equal(originalData, clientBuffer); } } } @@ -240,24 +241,24 @@ public async Task ReceiveShortData_Success() [Fact] public async Task ReceiveMediumData_Success() { - var orriginalData = Encoding.UTF8.GetBytes(new string('a', 130)); + var originalData = Encoding.UTF8.GetBytes(new string('a', 130)); await using (var server = KestrelWebSocketHelpers.CreateServer(LoggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - await webSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + await webSocket.SendAsync(new ArraySegment(originalData), WebSocketMessageType.Binary, true, CancellationToken.None); })) { using (var client = new ClientWebSocket()) { await client.ConnectAsync(new Uri($"ws://127.0.0.1:{port}/"), CancellationToken.None); - var clientBuffer = new byte[orriginalData.Length]; + var clientBuffer = new byte[originalData.Length]; var result = await client.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); Assert.True(result.EndOfMessage); - Assert.Equal(orriginalData.Length, result.Count); + Assert.Equal(originalData.Length, result.Count); Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - Assert.Equal(orriginalData, clientBuffer); + Assert.Equal(originalData, clientBuffer); } } } @@ -265,19 +266,19 @@ public async Task ReceiveMediumData_Success() [Fact] public async Task ReceiveLongData() { - var orriginalData = Encoding.UTF8.GetBytes(new string('a', 0x1FFFF)); + var originalData = Encoding.UTF8.GetBytes(new string('a', 0x1FFFF)); await using (var server = KestrelWebSocketHelpers.CreateServer(LoggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - await webSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + await webSocket.SendAsync(new ArraySegment(originalData), WebSocketMessageType.Binary, true, CancellationToken.None); })) { using (var client = new ClientWebSocket()) { await client.ConnectAsync(new Uri($"ws://127.0.0.1:{port}/"), CancellationToken.None); - var clientBuffer = new byte[orriginalData.Length]; + var clientBuffer = new byte[originalData.Length]; WebSocketReceiveResult result; int receivedCount = 0; do @@ -288,9 +289,9 @@ public async Task ReceiveLongData() } while (!result.EndOfMessage); - Assert.Equal(orriginalData.Length, receivedCount); + Assert.Equal(originalData.Length, receivedCount); Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - Assert.Equal(orriginalData, clientBuffer); + Assert.Equal(originalData, clientBuffer); } } } @@ -298,21 +299,21 @@ public async Task ReceiveLongData() [Fact] public async Task ReceiveFragmentedData_Success() { - var orriginalData = Encoding.UTF8.GetBytes("Hello World"); + var originalData = Encoding.UTF8.GetBytes("Hello World"); await using (var server = KestrelWebSocketHelpers.CreateServer(LoggerFactory, out var port, async context => { Assert.True(context.WebSockets.IsWebSocketRequest); var webSocket = await context.WebSockets.AcceptWebSocketAsync(); - await webSocket.SendAsync(new ArraySegment(orriginalData, 0, 2), WebSocketMessageType.Binary, false, CancellationToken.None); - await webSocket.SendAsync(new ArraySegment(orriginalData, 2, 2), WebSocketMessageType.Binary, false, CancellationToken.None); - await webSocket.SendAsync(new ArraySegment(orriginalData, 4, 7), WebSocketMessageType.Binary, true, CancellationToken.None); + await webSocket.SendAsync(new ArraySegment(originalData, 0, 2), WebSocketMessageType.Binary, false, CancellationToken.None); + await webSocket.SendAsync(new ArraySegment(originalData, 2, 2), WebSocketMessageType.Binary, false, CancellationToken.None); + await webSocket.SendAsync(new ArraySegment(originalData, 4, 7), WebSocketMessageType.Binary, true, CancellationToken.None); })) { using (var client = new ClientWebSocket()) { await client.ConnectAsync(new Uri($"ws://127.0.0.1:{port}/"), CancellationToken.None); - var clientBuffer = new byte[orriginalData.Length]; + var clientBuffer = new byte[originalData.Length]; var result = await client.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); Assert.False(result.EndOfMessage); Assert.Equal(2, result.Count); @@ -333,7 +334,7 @@ public async Task ReceiveFragmentedData_Success() totalReceived += result.Count; Assert.Equal(WebSocketMessageType.Binary, result.MessageType); - Assert.Equal(orriginalData, clientBuffer); + Assert.Equal(originalData, clientBuffer); } } } @@ -496,6 +497,127 @@ public async Task CloseFromCloseReceived_Success() } } + [Fact] + public async Task WebSocket_Abort_Interrupts_Pending_ReceiveAsync() + { + WebSocket serverSocket = null; + + var socketWasAccepted = new ManualResetEventSlim(); + var socketWasAborted = new ManualResetEventSlim(); + var firstReceiveOccured = new ManualResetEventSlim(); + + await using (var server = KestrelWebSocketHelpers.CreateServer(LoggerFactory, out var port, async context => + { + Assert.True(context.WebSockets.IsWebSocketRequest); + serverSocket = await context.WebSockets.AcceptWebSocketAsync(); + socketWasAccepted.Set(); + + var serverBuffer = new byte[1024]; + + var finishedWithConnectionAborted = false; + + try + { + while (serverSocket.State is WebSocketState.Open or WebSocketState.CloseSent) + { + var response = await serverSocket.ReceiveAsync(serverBuffer, default); + firstReceiveOccured.Set(); + } + } + catch (ConnectionAbortedException) + { + socketWasAborted.Set(); + finishedWithConnectionAborted = true; + } + finally + { + Assert.True(finishedWithConnectionAborted); + } + })) + { + var clientBuffer = new byte[1024]; + + using (var client = new ClientWebSocket()) + { + await client.ConnectAsync(new Uri($"ws://127.0.0.1:{port}/"), CancellationToken.None); + + var socketWasAcceptedDidNotTimeout = socketWasAccepted.Wait(10000); + Assert.True(socketWasAcceptedDidNotTimeout, "Socket was not accepted within the allotted time."); + + await client.SendAsync(clientBuffer, WebSocketMessageType.Binary, false, default); + + var firstReceiveOccuredDidNotTimeout = firstReceiveOccured.Wait(10000); + Assert.True(firstReceiveOccuredDidNotTimeout, "First receive did not occur within the allotted time."); + + serverSocket.Abort(); + + var socketWasAbortedDidNotTimeout = socketWasAborted.Wait(1000); // Give it a second to process the abort. + Assert.True(socketWasAbortedDidNotTimeout, "Abort did not occur within the allotted time."); + } + } + } + + [Fact] + public async Task WebSocket_AllowsCancelling_Pending_ReceiveAsync_When_CancellationTokenProvided() + { + WebSocket serverSocket = null; + CancellationTokenSource cts = new CancellationTokenSource(); + + var socketWasAccepted = new ManualResetEventSlim(); + var operationWasCancelled = new ManualResetEventSlim(); + var firstReceiveOccured = new ManualResetEventSlim(); + + await using (var server = KestrelWebSocketHelpers.CreateServer(LoggerFactory, out var port, async context => + { + Assert.True(context.WebSockets.IsWebSocketRequest); + serverSocket = await context.WebSockets.AcceptWebSocketAsync(); + socketWasAccepted.Set(); + + var serverBuffer = new byte[1024]; + + var finishedWithOperationCancelled = false; + + try + { + while (serverSocket.State is WebSocketState.Open or WebSocketState.CloseSent) + { + var response = await serverSocket.ReceiveAsync(serverBuffer, cts.Token); + firstReceiveOccured.Set(); + } + } + catch (OperationCanceledException) + { + operationWasCancelled.Set(); + finishedWithOperationCancelled = true; + } + finally + { + Assert.True(finishedWithOperationCancelled); + } + })) + { + var clientBuffer = new byte[1024]; + + using (var client = new ClientWebSocket()) + { + await client.ConnectAsync(new Uri($"ws://127.0.0.1:{port}/"), CancellationToken.None); + + var socketWasAcceptedDidNotTimeout = socketWasAccepted.Wait(10000); + Assert.True(socketWasAcceptedDidNotTimeout, "Socket was not accepted within the allotted time."); + + await client.SendAsync(clientBuffer, WebSocketMessageType.Binary, false, default); + + var firstReceiveOccuredDidNotTimeout = firstReceiveOccured.Wait(10000); + Assert.True(firstReceiveOccuredDidNotTimeout, "First receive did not occur within the allotted time."); + + cts.Cancel(); + + var operationWasCancelledDidNotTimeout = operationWasCancelled.Wait(1000); // Give it a second to process the abort. + Assert.True(operationWasCancelledDidNotTimeout, "Cancel did not occur within the allotted time."); + } + } + } + [Theory] [InlineData(HttpStatusCode.OK, null)] [InlineData(HttpStatusCode.Forbidden, "")] From 8ec95de7a061ced9963729815085d9d77c76dd91 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Tue, 20 Jun 2023 16:27:27 +0100 Subject: [PATCH 16/38] Retain DOM nodes during streaming SSR updates (#48258) --- src/Components/Web.JS/.yarnrc | 1 + ...osoft.AspNetCore.Components.Web.JS.npmproj | 11 +- .../Web.JS/dist/Release/blazor.server.js | 2 +- .../Web.JS/dist/Release/blazor.web.js | 2 +- .../Web.JS/dist/Release/blazor.webview.js | 2 +- src/Components/Web.JS/jest.config.js | 201 ++ src/Components/Web.JS/package.json | 9 + src/Components/Web.JS/src/Boot.Web.ts | 2 +- .../Web.JS/src/Platform/SsrStartOptions.ts | 10 + .../Web.JS/src/Platform/WebStartOptions.ts | 2 + .../Web.JS/src/Rendering/BrowserRenderer.ts | 256 +- .../src/Rendering/DomMerging/AttributeSync.ts | 79 + .../src/Rendering/DomMerging/DomSync.ts | 172 + .../src/Rendering/DomMerging/EditScript.ts | 181 ++ .../src/Rendering/DomSpecialPropertyUtil.ts | 229 ++ .../src/Rendering/StreamingRendering.ts | 32 +- src/Components/Web.JS/test/DomSync.test.ts | 482 +++ .../Web.JS/test/EditDistance.test.ts | 80 + src/Components/Web.JS/yarn.lock | 2859 +++++++++++++---- .../StreamingRenderingTest.cs | 24 + 20 files changed, 3803 insertions(+), 833 deletions(-) create mode 100644 src/Components/Web.JS/.yarnrc create mode 100644 src/Components/Web.JS/jest.config.js create mode 100644 src/Components/Web.JS/src/Platform/SsrStartOptions.ts create mode 100644 src/Components/Web.JS/src/Rendering/DomMerging/AttributeSync.ts create mode 100644 src/Components/Web.JS/src/Rendering/DomMerging/DomSync.ts create mode 100644 src/Components/Web.JS/src/Rendering/DomMerging/EditScript.ts create mode 100644 src/Components/Web.JS/src/Rendering/DomSpecialPropertyUtil.ts create mode 100644 src/Components/Web.JS/test/DomSync.test.ts create mode 100644 src/Components/Web.JS/test/EditDistance.test.ts diff --git a/src/Components/Web.JS/.yarnrc b/src/Components/Web.JS/.yarnrc new file mode 100644 index 000000000000..3b7b0fb6c362 --- /dev/null +++ b/src/Components/Web.JS/.yarnrc @@ -0,0 +1 @@ +workspaces-experimental false diff --git a/src/Components/Web.JS/Microsoft.AspNetCore.Components.Web.JS.npmproj b/src/Components/Web.JS/Microsoft.AspNetCore.Components.Web.JS.npmproj index 87966e294fda..0d4b5ac4a634 100644 --- a/src/Components/Web.JS/Microsoft.AspNetCore.Components.Web.JS.npmproj +++ b/src/Components/Web.JS/Microsoft.AspNetCore.Components.Web.JS.npmproj @@ -1,11 +1,20 @@ - false --check-files + + true + false + + + false + + + + `); + const newContent = makeNewContent(``); + + expect(destination.startExclusive.nextSibling).not.toBe(destination.endExclusive); + + // Act + synchronizeDomContent(destination, newContent); + + // Assert + expect(destination.startExclusive.nextSibling).toBe(destination.endExclusive); + }); + + test('should insert everything if old content is empty', () => { + // Arrange + const destination = makeExistingContent(``); + const newContent = makeNewContent(` + Hello + Text node + `); + + expect(destination.startExclusive.nextSibling).toBe(destination.endExclusive); + + // Act + synchronizeDomContent(destination, newContent); + + // Assert + expect(destination.startExclusive.nextSibling).not.toBe(destination.endExclusive); + }); + + test('should retain text and comment nodes while inserting and deleting others, updating textContent in place', () => { + // Arrange + const destination = makeExistingContent(`FirstSecondThird`); + const newContent = makeNewContent(`First editedSecondThird edited`); + const oldNodes = toNodeArray(destination); + + // Act + synchronizeDomContent(destination, newContent); + const newNodes = toNodeArray(destination); + + // Assert + expect(newNodes.length).toBe(6); + expect(newNodes[0].textContent).toBe('inserted'); + expect(newNodes[1].textContent).toBe('First edited'); + expect(newNodes[2].textContent).toBe('comment1 edited'); + expect(newNodes[3].textContent).toBe('Second'); + expect(newNodes[4].textContent).toBe('comment2'); + expect(newNodes[5].textContent).toBe('Third edited'); + + expect(newNodes[1]).toBe(oldNodes[0]); + expect(newNodes[2]).toBe(oldNodes[1]); + expect(newNodes[3]).toBe(oldNodes[2]); + expect(newNodes[4]).toBe(oldNodes[3]); + expect(newNodes[5]).toBe(oldNodes[5]); + }); + + test('should retain elements when nothing has changed', () => { + // Arrange + const destination = makeExistingContent(``); + const newContent = makeNewContent(``); + const oldNodes = toNodeArray(destination); + + // Act + synchronizeDomContent(destination, newContent); + const newNodes = toNodeArray(destination); + + // Assert + assertSameContentsByIdentity(newNodes, oldNodes); + }); + + test('should retain elements when inserting new ones', () => { + // Arrange + const destination = makeExistingContent( + `` + + `` + + ``); + const newContent = makeNewContent( + `` + + `` + + `` + + `` + + `` + + ``); + const oldNodes = toNodeArray(destination); + + // Act + synchronizeDomContent(destination, newContent); + const newNodes = toNodeArray(destination) as Element[]; + + // Assert + expect(newNodes[0].tagName).toBe('NEW'); + expect(newNodes[1]).toBe(oldNodes[0]); + expect(newNodes[2].tagName).toBe('NEW'); + expect(newNodes[3]).toBe(oldNodes[1]); + expect(newNodes[4]).toBe(oldNodes[2]); + expect(newNodes[5].tagName).toBe('NEW'); + }); + + test('should retain elements when deleting some', () => { + // Arrange + const destination = makeExistingContent( + `` + + `` + + `` + + `` + + `` + + ``); + const newContent = makeNewContent( + `` + + `` + + ``); + const oldNodes = toNodeArray(destination); + + // Act + synchronizeDomContent(destination, newContent); + const newNodes = toNodeArray(destination) as Element[]; + + // Assert + expect(newNodes.length).toBe(3); + expect(newNodes[0]).toBe(oldNodes[1]); + expect(newNodes[1]).toBe(oldNodes[3]); + expect(newNodes[2]).toBe(oldNodes[4]); + }); + + test('should update attribute values, respecting namespaces', () => { + // Arrange + const destination = makeExistingContent( + ``); + const newContent = makeNewContent( + ``); + const targetNode = destination.startExclusive.nextSibling as Element; + const newContentNode = newContent.firstChild as Element; + + targetNode.setAttributeNS('http://example/namespace1', 'attributeWithNamespaceButNoPrefix', 'oldval 1'); + targetNode.setAttributeNS('http://example/namespace2', 'exampleprefix:attributeWithNamespaceAndPrefix', 'oldval 2'); + + newContentNode.setAttributeNS('http://example/namespace1', 'attributeWithNamespaceButNoPrefix', 'updatedval 1'); + newContentNode.setAttributeNS('http://example/namespace2', 'exampleprefix:attributeWithNamespaceAndPrefix', 'updatedval 2'); + + // Act + synchronizeDomContent(destination, newContent); + + // Assert + expect(destination.startExclusive.nextSibling).toBe(targetNode); // Preserved the element + const targetNodeAttribs = targetNode.attributes; + expect(targetNodeAttribs.length).toBe(5); + expect(targetNodeAttribs.getNamedItem('a')?.value).toBe('A updated'); + expect(targetNodeAttribs.getNamedItem('b')?.value).toBe('B'); + expect(targetNodeAttribs.getNamedItem('c')?.value).toBe('C updated'); + expect(targetNodeAttribs.getNamedItemNS('http://example/namespace1', 'attributeWithNamespaceButNoPrefix')?.value).toBe('updatedval 1'); + expect(targetNodeAttribs.getNamedItemNS('http://example/namespace2', 'attributeWithNamespaceAndPrefix')?.value).toBe('updatedval 2'); + expect(targetNodeAttribs.getNamedItemNS('http://example/namespace2', 'attributeWithNamespaceAndPrefix')?.name).toBe('exampleprefix:attributeWithNamespaceAndPrefix'); + }); + + test('should insert added attributes, including ones with namespace', () => { + // Arrange + const destination = makeExistingContent( + ``); + const newContent = makeNewContent( + ``); + const targetNode = destination.startExclusive.nextSibling as Element; + expect(targetNode.attributes.length).toBe(1); + + const newContentNode = newContent.firstChild as Element; + newContentNode.setAttributeNS('http://example/namespace1', 'attributeWithNamespaceButNoPrefix', 'new namespaced value 1'); + newContentNode.setAttributeNS('http://example/namespace2', 'exampleprefix:attributeWithNamespaceAndPrefix', 'new namespaced value 2'); + + // Act + synchronizeDomContent(destination, newContent); + + // Assert + expect(destination.startExclusive.nextSibling).toBe(targetNode); // Preserved the element + expect(newContentNode).not.toBe(targetNode); + const targetNodeAttribs = targetNode.attributes; + expect(targetNodeAttribs.length).toBe(5); + expect(targetNodeAttribs.getNamedItem('preserved')?.value).toBe('preserved value'); + expect(targetNodeAttribs.getNamedItem('added')?.value).toBe('added value 1'); + expect(targetNodeAttribs.getNamedItem('yetanother')?.value).toBe('added value 2'); + expect(targetNodeAttribs.getNamedItemNS('http://example/namespace1', 'attributeWithNamespaceButNoPrefix')?.value).toBe('new namespaced value 1'); + expect(targetNodeAttribs.getNamedItemNS('http://example/namespace2', 'attributeWithNamespaceAndPrefix')?.value).toBe('new namespaced value 2'); + expect(targetNodeAttribs.getNamedItemNS('http://example/namespace2', 'attributeWithNamespaceAndPrefix')?.name).toBe('exampleprefix:attributeWithNamespaceAndPrefix'); + }); + + test('should delete removed attributes, including ones with namespace', () => { + // Arrange + const destination = makeExistingContent( + ``); + const newContent = makeNewContent( + ``); + const targetNode = destination.startExclusive.nextSibling as Element; + const newContentNode = newContent.firstChild as Element; + + targetNode.setAttributeNS('http://example/namespace1', 'attributeWithNamespaceButNoPrefix', 'new namespaced value 1'); + targetNode.setAttributeNS('http://example/namespace2', 'exampleprefix:attributeWithNamespaceAndPrefix', 'new namespaced value 2'); + expect(targetNode.attributes.length).toBe(5); + + // Act + synchronizeDomContent(destination, newContent); + + // Assert + expect(destination.startExclusive.nextSibling).toBe(targetNode); // Preserved the element + expect(newContentNode).not.toBe(targetNode); + expect(targetNode.getAttributeNames()).toEqual(['preserved']); + expect(targetNode.getAttribute('preserved')).toBe('preserved value'); + }); + + test('should recurse into all elements', () => { + // Arrange + const destination = makeExistingContent( + `` + + `Text that will change` + + `Text that will be removed` + + `Any content` + + `` + + `` + + `` + + ``); + const newContent = makeNewContent( + `` + + `` + + `Text that was changed` + + `` + + `` + + `` + + `` + + `` + + `` + + `` + + ``); + const newContentHtml = toHtml(newContent); + const oldNodes = toNodeArray(destination); + const origRoot1 = oldNodes[0]; + const origRoot2 = oldNodes[1]; + const textThatWillChange = oldNodes[0].childNodes[0]; + const childWillRetain = oldNodes[0].childNodes[1]; + const anotherChildWillRetain = oldNodes[1].childNodes[0]; + + // Act + synchronizeDomContent(destination, newContent); + const newNodes = toNodeArray(destination) as Element[]; + + // Assert: we inserted and changed the right elements/textnodes/comments/attributes + expect(toHtml(newNodes)).toEqual(newContentHtml); + + // Assert: we retained the expected original nodes + expect(newNodes[0]).toBe(origRoot1); + expect(newNodes[0].childNodes[1]).toBe(textThatWillChange); + expect(newNodes[0].childNodes[2]).toBe(childWillRetain); + expect(newNodes[2]).toBe(origRoot2); + expect(newNodes[2].childNodes[0]).toBe(anotherChildWillRetain); + }); + + test('should update input element value property when not modified by user', () => { + // For input-like elements, what we mostly care about is the value *property*, + // not the attribute. When this property hasn't explicitly been written, it takes + // its value from the value attribute. However we do still also want to update + // the attribute to make the DOM as consistent as possible. + // + // This test aims to show that, in this situation prior to user edits, + // we update both the property and attribute to match the new content. + + // Arrange + const destination = makeExistingContent( + ``); + const newContent = makeNewContent( + ``); + const destinationNode = toNodeArray(destination)[0] as HTMLInputElement; + + // Act + synchronizeDomContent(destination, newContent); + + // Assert + expect(destinationNode.value).toEqual('changed'); + expect(destinationNode.getAttribute('value')).toEqual('changed'); + }); + + test('should update input element value when modified by user and changed in new content', () => { + // After an input-like element is edited (or equivalently, after something + // is written to its 'value' property), that element's 'value' property + // no longer stays in sync with the element's 'value' attribute. The property + // and attribute become independent, and the property is what actually + // reflects the UI state. + // + // This test aims to show that, in this situation after user edits, we still + // update both the property and attribute to match the new content. This + // means we are discarding the user's edit, which is desirable because the + // whole idea of DomSync is to ensure the UI state matches the new content + // and create an equivalent result to reloading the whole page. + + // Arrange + const destination = makeExistingContent( + ``); + const newContent = makeNewContent( + ``); + const destinationNode = toNodeArray(destination)[0] as HTMLInputElement; + destinationNode.value = 'edited by user'; + + // Act + synchronizeDomContent(destination, newContent); + + // Assert + expect(destinationNode.value).toEqual('changed'); + expect(destinationNode.getAttribute('value')).toEqual('changed'); + }); + + test('should update input element value when modified by user but unchanged in new content', () => { + // Equivalent to the test above, except the old and new content is identical + // (so by looking at the attributes alone it seems nothing has to be updated) + // and we are showing that it still reverts the user's edit + + // Arrange + const destination = makeExistingContent( + ``); + const newContent = makeNewContent( + ``); + const destinationNode = toNodeArray(destination)[0] as HTMLInputElement; + destinationNode.value = 'edited by user'; + + // Act + synchronizeDomContent(destination, newContent); + + // Assert + expect(destinationNode.value).toEqual('original'); + expect(destinationNode.getAttribute('value')).toEqual('original'); + }); + + test('should be able to add select with nonempty option value', () => { + // Shows that when inserting a completely new ` + + `` + + `` + + `` + + ``); + + // Act + synchronizeDomContent(destination, newContent); + + // Assert + const selectElem = destination.startExclusive.nextSibling; + expect(selectElem).toBeInstanceOf(HTMLSelectElement); + expect((selectElem as HTMLSelectElement).value).toBe('second'); + }); + + test('should be able to update select to a newly-added option value', () => { + // Shows that the introduction of an ` + + `` + + ``); + const newContent = makeNewContent( + ``); + const selectElem = destination.startExclusive.nextSibling as HTMLSelectElement; + selectElem.value = 'original2'; + + // Act + synchronizeDomContent(destination, newContent); + + // Assert + expect(selectElem).toBeInstanceOf(HTMLSelectElement); + expect((selectElem as HTMLSelectElement).value).toBe('new3'); + }); + + test('should be able to update an input range to a value outside the min/max of the old content', () => { + // This shows that the deferred value handling works. We can't actually assign the attributes/properties + // in the given order, because it would cause the value to exceed the max (as we have not yet updated the + // max). However it works anyway because of the deferred value assignment mechanism. + + // Arrange + const destination = makeExistingContent( + ``); + const newContent = makeNewContent( + ``); + const inputRange = destination.startExclusive.nextSibling as HTMLInputElement; + expect(inputRange.value).toBe('150'); + expect(inputRange.min).toBe('100'); + expect(inputRange.max).toBe('200'); + inputRange.value = '175'; + + // Act + synchronizeDomContent(destination, newContent); + + // Assert + expect(inputRange.value).toBe('1000'); + expect(inputRange.min).toBe('950'); + expect(inputRange.max).toBe('1050'); + }); +}); + +function makeExistingContent(html: string): CommentBoundedRange { + // Returns a structure like: + // Unrelated leading content + // + // Your HTML + // + // Unrelated trailing content + // (but without all the spacing, and no text in the comment nodes) + const parent = document.createElement('div'); + parent.innerHTML = html.trim(); + + const startComment = document.createComment(''); + const endComment = document.createComment(''); + + parent.appendChild(endComment); + parent.appendChild(document.createTextNode('Unrelated trailing content')); + + parent.insertBefore(startComment, parent.firstChild); + parent.insertBefore(document.createTextNode('Unrelated leading content'), parent.firstChild); + + return { startExclusive: startComment, endExclusive: endComment }; +} + +function makeNewContent(html: string): DocumentFragment { + const template = document.createElement('template'); + template.innerHTML = html; + return template.content; +} + +function toNodeArray(range: CommentBoundedRange): Node[] { + const result: Node[] = []; + let next = range.startExclusive.nextSibling!; + while (next !== range.endExclusive) { + result.push(next); + next = next.nextSibling!; + } + + return result; +} + +function toHtml(content: DocumentFragment | Node[]) { + let result = ''; + const nodes = content instanceof DocumentFragment ? content.childNodes : content; + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + switch (node.nodeType) { + case Node.ELEMENT_NODE: + result += (node as Element).outerHTML; + break; + case Node.TEXT_NODE: + result += node.textContent; + break; + case Node.COMMENT_NODE: + result += ``; + break; + default: + throw new Error(`Not implemented toHTML for node type ${node.nodeType}`); + } + } + return result; +} + +function assertSameContentsByIdentity(actual: T[], expected: T[]) { + if (actual.length !== expected.length) { + throw new Error(`Expected ${actual} to have length ${expected.length}, but found length ${actual.length}`); + } + + for (let i = 0; i < actual.length; i++) { + expect(actual[i]).toBe(expected[i]); + } +} diff --git a/src/Components/Web.JS/test/EditDistance.test.ts b/src/Components/Web.JS/test/EditDistance.test.ts new file mode 100644 index 000000000000..412426323e37 --- /dev/null +++ b/src/Components/Web.JS/test/EditDistance.test.ts @@ -0,0 +1,80 @@ +import { expect, test, describe } from '@jest/globals'; +import { computeEditScript, UpdateCost, ItemList, Operation } from '../src/Rendering/DomMerging/EditScript'; + +describe('EditDistance', () => { + test('should return no operations for empty arrays', () => { + const before = new ArrayItemList([]); + const after = new ArrayItemList([]); + const result = computeEditScript(before, after, exactEqualityComparer); + expect(result.skipCount).toBe(0); + expect(result.edits).toBeFalsy(); + }); + + test('should return insertions when all items are added', () => { + const before = new ArrayItemList([]); + const after = new ArrayItemList([1, 2, 3]); + const result = computeEditScript(before, after, exactEqualityComparer); + expect(result.skipCount).toBe(0); + expect(result.edits).toEqual([Operation.Insert, Operation.Insert, Operation.Insert]); + }); + + test('should return deletions when all items are removed', () => { + const before = new ArrayItemList([1, 2, 3]); + const after = new ArrayItemList([]); + const result = computeEditScript(before, after, exactEqualityComparer); + expect(result.skipCount).toBe(0); + expect(result.edits).toEqual([Operation.Delete, Operation.Delete, Operation.Delete]); + }); + + test('should return no edits for identical arrays', () => { + const before = new ArrayItemList([1, 2, 3]); + const after = new ArrayItemList([1, 2, 3]); + const result = computeEditScript(before, after, exactEqualityComparer); + expect(result.skipCount).toBe(3); + expect(result.edits).toBeFalsy(); + }); + + test('should return insert+delete for a replaced item', () => { + const before = new ArrayItemList([1]); + const after = new ArrayItemList([2]); + const result = computeEditScript(before, after, exactEqualityComparer); + expect(result.skipCount).toBe(0); + expect(result.edits).toEqual([Operation.Insert, Operation.Delete]); + }); + + test('should prefer to substitute rather than insert+delete when allowed', () => { + const before = new ArrayItemList([1, 2]); + const after = new ArrayItemList([3, 2]); + const result = computeEditScript(before, after, (a, b) => (a === b) ? UpdateCost.None : UpdateCost.Some); + expect(result.skipCount).toEqual(0); + expect(result.edits).toEqual([Operation.Update]); + }); + + test('should return correct operations for multiple mixed changes', () => { + const before = new ArrayItemList([1, 2, 3, 4]); + const after = new ArrayItemList([1, 3, 5, 4]); + const result = computeEditScript(before, after, exactEqualityComparer); + expect(result.skipCount).toEqual(1); + expect(result.edits).toEqual([Operation.Delete, Operation.Keep, Operation.Insert]); + }); +}); + +function exactEqualityComparer(a: T, b: T) { + return a === b ? UpdateCost.None : UpdateCost.Infinite; +} + +class ArrayItemList implements ItemList { + constructor(private items: T[]) { + this.length = items.length; + } + + length: number; + + item(index: number): T | null { + return this.items[index]; + } + + forEach(callbackfn: (value: T, key: number, parent: ItemList) => void, thisArg?: any): void { + this.items.forEach((item, key) => callbackfn(item, key, this)); + } +} diff --git a/src/Components/Web.JS/yarn.lock b/src/Components/Web.JS/yarn.lock index cd1402d5e5ed..8df68624fc1d 100644 --- a/src/Components/Web.JS/yarn.lock +++ b/src/Components/Web.JS/yarn.lock @@ -2,54 +2,55 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha1-VsEzgkeA3jF0rtWraDTzAmeQFU0= +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha1-mejhGFESi4cCzVfDNoTx0PJgtjA= dependencies: - "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha1-OyXTjIlgC6otzCGe36iKdOssQno= +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": + version "7.21.4" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" + integrity sha1-0PqeRBOsqB8rI7lEJ5e9oYJu2zk= dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": - version "7.20.14" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/compat-data/-/compat-data-7.20.14.tgz#4106fc8b755f3e3ee0a0a7c27dde5de1d2b2baf8" - integrity sha1-QQb8i3VfPj7goKfCfd5d4dKyuvg= - -"@babel/core@^7.16.7": - version "7.20.12" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" - integrity sha1-eTDbV0Q8ZxStIWlT0TVtrA64SW0= - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helpers" "^7.20.7" - "@babel/parser" "^7.20.7" +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.5": + version "7.21.7" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/compat-data/-/compat-data-7.21.7.tgz#61caffb60776e49a57ba61a88f02bedd8714f6bc" + integrity sha1-Ycr/tgd25JpXumGojwK+3YcU9rw= + +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.16.7": + version "7.21.8" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/core/-/core-7.21.8.tgz#2a8c7f0f53d60100ba4c32470ba0281c92aa9aa4" + integrity sha1-Kox/D1PWAQC6TDJHC6AoHJKqmqQ= + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.5" + "@babel/helper-compilation-targets" "^7.21.5" + "@babel/helper-module-transforms" "^7.21.5" + "@babel/helpers" "^7.21.5" + "@babel/parser" "^7.21.8" "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.12" - "@babel/types" "^7.20.7" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.2" semver "^6.3.0" -"@babel/generator@^7.20.7": - version "7.20.14" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/generator/-/generator-7.20.14.tgz#9fa772c9f86a46c6ac9b321039400712b96f64ce" - integrity sha1-n6dyyfhqRsasmzIQOUAHErlvZM4= +"@babel/generator@^7.21.5", "@babel/generator@^7.7.2": + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/generator/-/generator-7.21.5.tgz#c0c0e5449504c7b7de8236d99338c3e2a340745f" + integrity sha1-wMDlRJUEx7fegjbZkzjD4qNAdF8= dependencies: - "@babel/types" "^7.20.7" + "@babel/types" "^7.21.5" "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" "@babel/helper-annotate-as-pure@^7.18.6": @@ -60,45 +61,46 @@ "@babel/types" "^7.18.6" "@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" - integrity sha1-rNTt/XpWbR1R6pdd/zj9UpBpgbs= + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz#817f73b6c59726ab39f6ba18c234268a519e5abb" + integrity sha1-gX9ztsWXJqs59roYwjQmilGeWrs= dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/types" "^7.21.5" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": - version "7.20.7" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" - integrity sha1-ps0z6TYp9etHOwIarAXfYsTNCbs= +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.5": + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz#631e6cc784c7b660417421349aac304c94115366" + integrity sha1-Yx5sx4THtmBBdCE0mqwwTJQRU2Y= dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-validator-option" "^7.18.6" + "@babel/compat-data" "^7.21.5" + "@babel/helper-validator-option" "^7.21.0" browserslist "^4.21.3" lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": - version "7.20.12" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz#4349b928e79be05ed2d1643b20b99bb87c503819" - integrity sha1-Q0m5KOeb4F7S0WQ7ILmbuHxQOBk= +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": + version "7.21.8" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz#205b26330258625ef8869672ebca1e0dee5a0f02" + integrity sha1-IFsmMwJYYl74hpZy68oeDe5aDwI= dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-member-expression-to-functions" "^7.21.5" "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-replace-supers" "^7.21.5" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/helper-split-export-declaration" "^7.18.6" + semver "^6.3.0" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.20.5" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" - integrity sha1-XqebWZYqCewqzyCpY6AatNB2zMo= + version "7.21.8" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz#a7886f61c2e29e21fd4aaeaf1e473deba6b571dc" + integrity sha1-p4hvYcLiniH9Sq6vHkc966a1cdw= dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.2.1" + regexpu-core "^5.3.1" + semver "^6.3.0" "@babel/helper-define-polyfill-provider@^0.3.3": version "0.3.3" @@ -112,25 +114,18 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha1-DAzumzXSyhkEeHVoZbs1KEIvUb4= - -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" - integrity sha1-QfgijvCm8aA2uN/f7HzpT5prwJY= - dependencies: - "@babel/types" "^7.18.6" +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.21.5": + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz#c769afefd41d171836f7cb63e295bedf689d48ba" + integrity sha1-x2mv79QdFxg298tj4pW+32idSLo= -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha1-lBV07VOQaC6HLlLT84zp0b70ZIw= +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha1-1VKCmxDqnxIJaTBAI80GRfoAsbQ= dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" @@ -139,33 +134,33 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-member-expression-to-functions@^7.20.7": - version "7.20.7" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" - integrity sha1-pvJukZWCJ1qTw6pllHVtcbC7fwU= +"@babel/helper-member-expression-to-functions@^7.21.5": + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz#3b1a009af932e586af77c1030fba9ee0bde396c0" + integrity sha1-OxoAmvky5Yavd8EDD7qe4L3jlsA= dependencies: - "@babel/types" "^7.20.7" + "@babel/types" "^7.21.5" -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha1-Hj69u9CKrRQ3tCjFAgTbE8Wjym4= +"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": + version "7.21.4" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" + integrity sha1-rIiy92CTY3SJ5xipDOxs+KmwKa8= dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.21.4" -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": - version "7.20.11" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" - integrity sha1-30x69xPFV5OMUOo60BF6eUSy8bA= +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5": + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz#d937c82e9af68d31ab49039136a222b17ac0b420" + integrity sha1-2TfILpr2jTGrSQORNqIisXrAtCA= dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-simple-access" "^7.21.5" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-validator-identifier" "^7.19.1" "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.10" - "@babel/types" "^7.20.7" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -174,10 +169,10 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.20.2" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha1-0bkAB1KxjQh3z/haXDds5cMSFik= +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" + integrity sha1-NF8jd9BacgpOXs+jnL9EdKTa7VY= "@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" @@ -189,24 +184,24 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": - version "7.20.7" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" - integrity sha1-JD7NJyTSBxUyssitLw+fCDvK4zE= +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.21.5": + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz#a6ad005ba1c7d9bc2973dfde05a1bba7065dde3c" + integrity sha1-pq0AW6HH2bwpc9/eBaG7pwZd3jw= dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-member-expression-to-functions" "^7.21.5" "@babel/helper-optimise-call-expression" "^7.18.6" "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha1-CrRSaH/gws+x4rngAV3gf8LWLdk= +"@babel/helper-simple-access@^7.21.5": + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" + integrity sha1-1penlxpcOerDLH5jwJIcBsiiSe4= dependencies: - "@babel/types" "^7.20.2" + "@babel/types" "^7.21.5" "@babel/helper-skip-transparent-expression-wrappers@^7.20.0": version "7.20.0" @@ -222,20 +217,20 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha1-ONOstlS0cBqbd/sGFalvd1w6nmM= +"@babel/helper-string-parser@^7.21.5": + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" + integrity sha1-Kz7qZUQ8a9wxwi0DfGX20yO2sr0= "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha1-fuqDTPMpAf/cGn7lVeL5wn4knKI= -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha1-vw0rWlCbHzNgmeT/NuGmOqXbTbg= +"@babel/helper-validator-option@^7.21.0": + version "7.21.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha1-giTH4TrOS6/cQATaLPBk70JnMYA= "@babel/helper-wrap-function@^7.18.9": version "7.20.5" @@ -247,14 +242,14 @@ "@babel/traverse" "^7.20.5" "@babel/types" "^7.20.5" -"@babel/helpers@^7.20.7": - version "7.20.13" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helpers/-/helpers-7.20.13.tgz#e3cb731fb70dc5337134cadc24cbbad31cc87ad2" - integrity sha1-48tzH7cNxTNxNMrcJMu60xzIetI= +"@babel/helpers@^7.21.5": + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/helpers/-/helpers-7.21.5.tgz#5bac66e084d7a4d2d9696bdf0175a93f7fb63c08" + integrity sha1-W6xm4ITXpNLZaWvfAXWpP3+2PAg= dependencies: "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.13" - "@babel/types" "^7.20.7" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" "@babel/highlight@^7.18.6": version "7.18.6" @@ -265,10 +260,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.20.13", "@babel/parser@^7.20.7": - version "7.20.15" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89" - integrity sha1-7snzbY6vCUi7iMh6RnhLXun9DIk= +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8": + version "7.21.8" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/parser/-/parser-7.21.8.tgz#642af7d0333eab9c0ad70b14ac5e76dbde7bfdf8" + integrity sha1-ZCr30DM+q5wK1wsUrF522957/fg= "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" @@ -277,7 +272,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.20.7": version "7.20.7" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" integrity sha1-2chViSWFOaIqkBAzhTEBphmNTvE= @@ -286,7 +281,7 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" "@babel/plugin-proposal-optional-chaining" "^7.20.7" -"@babel/plugin-proposal-async-generator-functions@^7.20.1": +"@babel/plugin-proposal-async-generator-functions@^7.20.7": version "7.20.7" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" integrity sha1-v7cnbS1XPLZ7o3mYSiM04mK6UyY= @@ -304,12 +299,12 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.20.7" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz#92592e9029b13b15be0f7ce6a7aedc2879ca45a7" - integrity sha1-klkukCmxOxW+D3zmp67cKHnKRac= +"@babel/plugin-proposal-class-static-block@^7.21.0": + version "7.21.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" + integrity sha1-d73Wb7e2BfOmEwLSJL36z1VHl30= dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-create-class-features-plugin" "^7.21.0" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-class-static-block" "^7.14.5" @@ -337,7 +332,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": +"@babel/plugin-proposal-logical-assignment-operators@^7.20.7": version "7.20.7" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" integrity sha1-37yqj3tNN7Uei/tG2Upa6iu4nYM= @@ -361,7 +356,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.20.2": +"@babel/plugin-proposal-object-rest-spread@^7.20.7": version "7.20.7" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" integrity sha1-qmYpQO9CV3nHVTSlxB6dk27cOQo= @@ -380,10 +375,10 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": - version "7.20.7" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz#49f2b372519ab31728cc14115bb0998b15bfda55" - integrity sha1-SfKzclGasxcozBQRW7CZixW/2lU= +"@babel/plugin-proposal-optional-chaining@^7.20.7", "@babel/plugin-proposal-optional-chaining@^7.21.0": + version "7.21.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha1-iG9ciXjet9MPZ4suJDRrKHI00+o= dependencies: "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" @@ -397,13 +392,13 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.20.5" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz#309c7668f2263f1c711aa399b5a9a6291eef6135" - integrity sha1-MJx2aPImPxxxGqOZtammKR7vYTU= +"@babel/plugin-proposal-private-property-in-object@^7.21.0": + version "7.21.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" + integrity sha1-GUlr2Yg92Dwjx9f8RdzZrQLfodw= dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-create-class-features-plugin" "^7.21.0" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" @@ -422,7 +417,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.12.13": +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha1-TJpvZp9dDN8bkKFnHpoUa+UwDOo= + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha1-tcmHJ0xKOoK4lxR5aTGmtTVErhA= @@ -457,6 +459,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.19.0" +"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha1-7mATSMNw+jNNIge+FYd3SWUh/VE= + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" @@ -464,7 +473,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.21.4" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" + integrity sha1-8mTte/QP/J7COe2rwXpQxPW2/qI= + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha1-ypHvRjA1MESLkGZSusLp/plB9pk= @@ -478,7 +494,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.10.4": +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c= @@ -513,21 +529,28 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-top-level-await@^7.14.5": +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha1-wc/a3DWmRiQAAfBhOCR7dBw02Uw= dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.18.6": - version "7.20.7" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" - integrity sha1-vqMysOiy2rPa/lWhY9gidTGrBVE= +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.21.4" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz#2751948e9b7c6d771a8efa59340c15d4a2891ff8" + integrity sha1-J1GUjpt8bXcajvpZNAwV1KKJH/g= dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-async-to-generator@^7.18.6": +"@babel/plugin-transform-arrow-functions@^7.21.5": + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz#9bb42a53de447936a57ba256fbf537fc312b6929" + integrity sha1-m7QqU95EeTale6JW+/U3/DEraSk= + dependencies: + "@babel/helper-plugin-utils" "^7.21.5" + +"@babel/plugin-transform-async-to-generator@^7.20.7": version "7.20.7" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" integrity sha1-3+4YYjyMsx3reWqjyoTdqc6pQ1Q= @@ -543,40 +566,40 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoping@^7.20.2": - version "7.20.15" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz#3e1b2aa9cbbe1eb8d644c823141a9c5c2a22392d" - integrity sha1-Phsqqcu+HrjWRMgjFBqcXCoiOS0= +"@babel/plugin-transform-block-scoping@^7.21.0": + version "7.21.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" + integrity sha1-5ze5EDflGG7ha3bnrgkzWKVjTwI= dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-classes@^7.20.2": - version "7.20.7" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz#f438216f094f6bb31dc266ebfab8ff05aecad073" - integrity sha1-9DghbwlPa7Mdwmbr+rj/Ba7K0HM= +"@babel/plugin-transform-classes@^7.21.0": + version "7.21.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" + integrity sha1-9GnQsHpMWn27Ia+tnifle0cDFmU= dependencies: "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/helper-compilation-targets" "^7.20.7" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" + "@babel/helper-function-name" "^7.21.0" "@babel/helper-optimise-call-expression" "^7.18.6" "@babel/helper-plugin-utils" "^7.20.2" "@babel/helper-replace-supers" "^7.20.7" "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.18.9": - version "7.20.7" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" - integrity sha1-cEzC/RVdHJllUduCdtVbnUbk0Ko= +"@babel/plugin-transform-computed-properties@^7.21.5": + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz#3a2d8bb771cd2ef1cd736435f6552fe502e11b44" + integrity sha1-Oi2Lt3HNLvHNc2Q19lUv5QLhG0Q= dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/template" "^7.20.7" -"@babel/plugin-transform-destructuring@^7.20.2": - version "7.20.7" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454" - integrity sha1-i9pXj3FiDH3nyTr1kBVLozFBVFQ= +"@babel/plugin-transform-destructuring@^7.21.3": + version "7.21.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" + integrity sha1-c7RtD9Ec1u9X3qijgbEhX0lZ1AE= dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -603,12 +626,12 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-for-of@^7.18.8": - version "7.18.8" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" - integrity sha1-bvilCyROtqC9utDHxhh35OMAl8E= +"@babel/plugin-transform-for-of@^7.21.5": + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz#e890032b535f5a2e237a18535f56a9fdaa7b83fc" + integrity sha1-6JADK1NfWi4jehhTX1ap/ap7g/w= dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-function-name@^7.18.9": version "7.18.9" @@ -633,7 +656,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-modules-amd@^7.19.6": +"@babel/plugin-transform-modules-amd@^7.20.11": version "7.20.11" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" integrity sha1-PazMqOTMMJ8Dw6DEtB3Esm9VIUo= @@ -641,16 +664,16 @@ "@babel/helper-module-transforms" "^7.20.11" "@babel/helper-plugin-utils" "^7.20.2" -"@babel/plugin-transform-modules-commonjs@^7.19.6": - version "7.20.11" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz#8cb23010869bf7669fd4b3098598b6b2be6dc607" - integrity sha1-jLIwEIab92af1LMJhZi2sr5txgc= +"@babel/plugin-transform-modules-commonjs@^7.21.5": + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz#d69fb947eed51af91de82e4708f676864e5e47bc" + integrity sha1-1p+5R+7VGvkd6C5HCPZ2hk5eR7w= dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-module-transforms" "^7.21.5" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-simple-access" "^7.21.5" -"@babel/plugin-transform-modules-systemjs@^7.19.6": +"@babel/plugin-transform-modules-systemjs@^7.20.11": version "7.20.11" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" integrity sha1-Rn7Gu6a2pQY07qYcnCMmVNikaW4= @@ -668,7 +691,7 @@ "@babel/helper-module-transforms" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": +"@babel/plugin-transform-named-capturing-groups-regex@^7.20.5": version "7.20.5" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" integrity sha1-YmKY3WLqUdRSw75YsoXSMZW6aag= @@ -691,10 +714,10 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": - version "7.20.7" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f" - integrity sha1-DuNJ6dG8lueOOzenr0I6QHinCD8= +"@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.21.3": + version "7.21.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz#18fc4e797cf6d6d972cb8c411dbe8a809fa157db" + integrity sha1-GPxOeXz21tlyy4xBHb6KgJ+hV9s= dependencies: "@babel/helper-plugin-utils" "^7.20.2" @@ -705,12 +728,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-regenerator@^7.18.6": - version "7.20.5" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" - integrity sha1-V82liMf/t/T4SDzIO9zqAqkH8E0= +"@babel/plugin-transform-regenerator@^7.21.5": + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz#576c62f9923f94bcb1c855adc53561fd7913724e" + integrity sha1-V2xi+ZI/lLyxyFWtxTVh/XkTck4= dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.21.5" regenerator-transform "^0.15.1" "@babel/plugin-transform-reserved-words@^7.18.6": @@ -727,7 +750,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-spread@^7.19.0": +"@babel/plugin-transform-spread@^7.20.7": version "7.20.7" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" integrity sha1-wtg+C5nTv4PgexGZXuJL98oJQB4= @@ -756,12 +779,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" - integrity sha1-Hs+w7ag9CbvLd8CZcMLdVYMqokY= +"@babel/plugin-transform-unicode-escapes@^7.21.5": + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz#1e55ed6195259b0e9061d81f5ef45a9b009fb7f2" + integrity sha1-HlXtYZUlmw6QYdgfXvRamwCft/I= dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.21.5" "@babel/plugin-transform-unicode-regex@^7.18.6": version "7.18.6" @@ -772,30 +795,30 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/preset-env@^7.16.8": - version "7.20.2" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" - integrity sha1-mxZCqke7n0Oob5YwAReA2rf4ZQY= - dependencies: - "@babel/compat-data" "^7.20.1" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.18.6" + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/preset-env/-/preset-env-7.21.5.tgz#db2089d99efd2297716f018aeead815ac3decffb" + integrity sha1-2yCJ2Z79IpdxbwGK7q2BWsPez/s= + dependencies: + "@babel/compat-data" "^7.21.5" + "@babel/helper-compilation-targets" "^7.21.5" + "@babel/helper-plugin-utils" "^7.21.5" + "@babel/helper-validator-option" "^7.21.0" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.20.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.20.7" + "@babel/plugin-proposal-async-generator-functions" "^7.20.7" "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.21.0" "@babel/plugin-proposal-dynamic-import" "^7.18.6" "@babel/plugin-proposal-export-namespace-from" "^7.18.9" "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-logical-assignment-operators" "^7.20.7" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.2" + "@babel/plugin-proposal-object-rest-spread" "^7.20.7" "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-optional-chaining" "^7.21.0" "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.21.0" "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" @@ -803,6 +826,7 @@ "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -812,40 +836,40 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.18.6" - "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.21.5" + "@babel/plugin-transform-async-to-generator" "^7.20.7" "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.20.2" - "@babel/plugin-transform-classes" "^7.20.2" - "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.20.2" + "@babel/plugin-transform-block-scoping" "^7.21.0" + "@babel/plugin-transform-classes" "^7.21.0" + "@babel/plugin-transform-computed-properties" "^7.21.5" + "@babel/plugin-transform-destructuring" "^7.21.3" "@babel/plugin-transform-dotall-regex" "^7.18.6" "@babel/plugin-transform-duplicate-keys" "^7.18.9" "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-for-of" "^7.21.5" "@babel/plugin-transform-function-name" "^7.18.9" "@babel/plugin-transform-literals" "^7.18.9" "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.19.6" - "@babel/plugin-transform-modules-commonjs" "^7.19.6" - "@babel/plugin-transform-modules-systemjs" "^7.19.6" + "@babel/plugin-transform-modules-amd" "^7.20.11" + "@babel/plugin-transform-modules-commonjs" "^7.21.5" + "@babel/plugin-transform-modules-systemjs" "^7.20.11" "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.20.5" "@babel/plugin-transform-new-target" "^7.18.6" "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-parameters" "^7.21.3" "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.21.5" "@babel/plugin-transform-reserved-words" "^7.18.6" "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.19.0" + "@babel/plugin-transform-spread" "^7.20.7" "@babel/plugin-transform-sticky-regex" "^7.18.6" "@babel/plugin-transform-template-literals" "^7.18.9" "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-escapes" "^7.21.5" "@babel/plugin-transform-unicode-regex" "^7.18.6" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.20.2" + "@babel/types" "^7.21.5" babel-plugin-polyfill-corejs2 "^0.3.3" babel-plugin-polyfill-corejs3 "^0.6.0" babel-plugin-polyfill-regenerator "^0.4.1" @@ -869,13 +893,13 @@ integrity sha1-8LppsHXh8F+yglt/rZkeetuxgxA= "@babel/runtime@^7.8.4": - version "7.20.13" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" - integrity sha1-cFWrinz/K49gWL9q5F/4StKt7Us= + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/runtime/-/runtime-7.21.5.tgz#8492dddda9644ae3bda3b45eabe87382caee7200" + integrity sha1-hJLd3alkSuO9o7Req+hzgsrucgA= dependencies: regenerator-runtime "^0.13.11" -"@babel/template@^7.18.10", "@babel/template@^7.20.7": +"@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": version "7.20.7" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" integrity sha1-oVCQwoOag7AqqZbAtJlABYQf1ag= @@ -884,44 +908,61 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7": - version "7.20.13" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" - integrity sha1-gXwboT0RrMyolHi9VIGy0WjQdHM= +"@babel/traverse@^7.20.5", "@babel/traverse@^7.21.5", "@babel/traverse@^7.7.2": + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133" + integrity sha1-rSI2HTUqUVS0mCmdUjz3KZiksTM= dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.5" + "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-function-name" "^7.21.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.13" - "@babel/types" "^7.20.7" + "@babel/parser" "^7.21.5" + "@babel/types" "^7.21.5" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.4.4": - version "7.20.7" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" - integrity sha1-VOx14lIxhCP8B/tkTcalimTAm38= +"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.21.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" + integrity sha1-GN+9R8OdOQTV2z09wsyAvttg5bY= dependencies: - "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-string-parser" "^7.21.5" "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha1-daLotRy3WKdVPWgEpZMteqznXDk= + "@discoveryjs/json-ext@^0.5.0": version "0.5.7" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha1-HVcr+74Ut3BOC6Dzm3SBW4SHDXA= -"@eslint/eslintrc@^1.4.1": - version "1.4.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" - integrity sha1-r1h3IBmi0nG34tTCP/Tdy6PM+z4= +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha1-ojUU6Pua8SadX3eIqlVnmNYca1k= + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.5.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" + integrity sha1-zdNdzk+hqJpP1CsVmes1s69AiIQ= + +"@eslint/eslintrc@^2.0.3": + version "2.0.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" + integrity sha1-SRDbVQX01QPyd3S/NW43BIGKAzE= dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.4.0" + espree "^9.5.2" globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -929,6 +970,11 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/js@8.40.0": + version "8.40.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@eslint/js/-/js-8.40.0.tgz#3ba73359e11f5a7bd3e407f70b3528abfae69cec" + integrity sha1-O6czWeEfWnvT5Af3CzUoq/rmnOw= + "@humanwhocodes/config-array@^0.11.8": version "0.11.8" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" @@ -948,18 +994,236 @@ resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha1-tSBSnsIdjllFoYUd/Rwy6U45/0U= -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha1-5dLkUDBqlJHjvXfjI+ONev8xWZY= +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha1-/T2x1Z7PfPEh6AZQu4ZxL5tV7O0= dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha1-5F44TkuOwWvOL9kDr3hFD2v37Jg= + +"@jest/console@^29.5.0": + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" + integrity sha1-WTpsXA0/dWiYNfGztGiMT4VEy1c= + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + slash "^3.0.0" + +"@jest/core@^29.5.0": + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" + integrity sha1-dmdLlpBEhOghRhTRcmHMSR5fHwM= + dependencies: + "@jest/console" "^29.5.0" + "@jest/reporters" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.5.0" + jest-config "^29.5.0" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-resolve-dependencies "^29.5.0" + jest-runner "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + jest-watcher "^29.5.0" + micromatch "^4.0.4" + pretty-format "^29.5.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/create-cache-key-function@^27.4.2": + version "27.5.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz#7448fae15602ea95c828f5eceed35c202a820b31" + integrity sha1-dEj64VYC6pXIKPXs7tNcICqCCzE= + dependencies: + "@jest/types" "^27.5.1" + +"@jest/environment@^29.5.0": + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" + integrity sha1-kVLVYxfB/bGvOJxGZAunTvC7TGU= + dependencies: + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-mock "^29.5.0" + +"@jest/expect-utils@^29.5.0": + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" + integrity sha1-90+ta24g+SRYLcjsvyy4AP5DoDY= + dependencies: + jest-get-type "^29.4.3" + +"@jest/expect@^29.5.0": + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jest/expect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba" + integrity sha1-gJUvUxayPEg/vKQ2POgir3nDj7o= + dependencies: + expect "^29.5.0" + jest-snapshot "^29.5.0" + +"@jest/fake-timers@^29.5.0": + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" + integrity sha1-1NCewyhrPZDGC9zWbtKNNfG03Cw= + dependencies: + "@jest/types" "^29.5.0" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-util "^29.5.0" + +"@jest/globals@^29.5.0": + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" + integrity sha1-YWbAv8N0xYJoZ3U50MGB+cGDMpg= + dependencies: + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/types" "^29.5.0" + jest-mock "^29.5.0" + +"@jest/reporters@^29.5.0": + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" + integrity sha1-mF39kSkM143a5JFLp5Iby6vorJs= + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + jest-worker "^29.5.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + integrity sha1-Oc8bhGmvxAtvWiuqoUbjMsQVF4g= + dependencies: + "@sinclair/typebox" "^0.25.16" + +"@jest/source-map@^29.4.3": + version "29.4.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" + integrity sha1-/40Fy//4ddSnkatnm0Mz30eVHSA= + dependencies: + "@jridgewell/trace-mapping" "^0.3.15" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.5.0": + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jest/test-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408" + integrity sha1-fIVqbKhPRcw2kmpOnGtX8Zc/FAg= + dependencies: + "@jest/console" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.5.0": + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4" + integrity sha1-NNfYLTCBq9Uj293AOKPdy59tPMQ= + dependencies: + "@jest/test-result" "^29.5.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + slash "^3.0.0" + +"@jest/transform@^29.5.0": + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" + integrity sha1-z5yHLQll8MvTLxRYqkSisZiLAPk= + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha1-PHnsSoumHBcL+Te8+emKnfF17IA= + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jest/types@^29.5.0": + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" + integrity sha1-9Z75sDHO2DBHxnAycA2MgH1uFZM= + dependencies: + "@jest/schemas" "^29.4.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha1-wa7cYehT8rufXf5tRELTtWWyU7k= + version "0.3.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha1-fgLm6135AartsIUUIDsJZhQCQJg= dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" @@ -970,28 +1234,33 @@ resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha1-IgOxGMFXchrd/mnUe3BGVGMGbXg= -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": +"@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha1-fGz5mNbSC5FMClWpGuko/yWWXnI= "@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" - integrity sha1-9FNRqu1FJ6KYUS7HL4EEDJmFgPs= + version "0.3.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" + integrity sha1-gQgmVlnUwz5y/+FOM9bMXrWfL9o= dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha1-rdTJjTQUcqKJGQtCTvvbCWmRuyQ= -"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha1-eTBBJ3r5BzsJUaf+Dw2MTJjDaYU= +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha1-18bmdVx4VnqVHgSrUu8P0m3lnzI= + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha1-JXg7IIba9v8dy1PJJJrkgOTdTNY= dependencies: "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" @@ -1034,6 +1303,137 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@sinclair/typebox@^0.25.16": + version "0.25.24" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha1-jHaIVZl59wearK8xqogcOqQQtxg= + +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" + integrity sha1-vrQ0/oddllJl4EcizPwh3391XXI= + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.1.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@sinonjs/fake-timers/-/fake-timers-10.1.0.tgz#3595e42b3f0a7df80a9681cf58d8cb418eac1e99" + integrity sha1-NZXkKz8KffgKloHPWNjLQY6sHpk= + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@swc/core-darwin-arm64@1.3.58": + version "1.3.58" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.58.tgz#0d87c46a0d18ded014a8b3c212cc3303f0f9f44a" + integrity sha1-DYfEag0Y3tAUqLPCEswzA/D59Eo= + +"@swc/core-darwin-x64@1.3.58": + version "1.3.58" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@swc/core-darwin-x64/-/core-darwin-x64-1.3.58.tgz#5c2a73e0e688e3e4d71477994b7aec92ce1ee8fe" + integrity sha1-XCpz4OaI4+TXFHeZS3rsks4e6P4= + +"@swc/core-linux-arm-gnueabihf@1.3.58": + version "1.3.58" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.58.tgz#0c03afc6cf279562bd53a53e5191ed6608ae4779" + integrity sha1-DAOvxs8nlWK9U6U+UZHtZgiuR3k= + +"@swc/core-linux-arm64-gnu@1.3.58": + version "1.3.58" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.58.tgz#79797b0ede57803781146ecaa1cf521b979de2e4" + integrity sha1-eXl7Dt5XgDeBFG7Koc9SG5ed4uQ= + +"@swc/core-linux-arm64-musl@1.3.58": + version "1.3.58" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.58.tgz#4de5e07f1a16c0bcd789bf080fe74c164b499ad0" + integrity sha1-TeXgfxoWwLzXib8ID+dMFktJmtA= + +"@swc/core-linux-x64-gnu@1.3.58": + version "1.3.58" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.58.tgz#a924eecc77ef2035c6ff2d58e9631efd28b54027" + integrity sha1-qSTuzHfvIDXG/y1Y6WMe/Si1QCc= + +"@swc/core-linux-x64-musl@1.3.58": + version "1.3.58" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.58.tgz#b5d04049d3b404035cc0a261754d95a938f10323" + integrity sha1-tdBASdO0BANcwKJhdU2VqTjxAyM= + +"@swc/core-win32-arm64-msvc@1.3.58": + version "1.3.58" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.58.tgz#cb75b087b8a85eca6ef7a9fe22be8e13d91fcb1c" + integrity sha1-y3Wwh7ioXspu96n+Ir6OE9kfyxw= + +"@swc/core-win32-ia32-msvc@1.3.58": + version "1.3.58" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.58.tgz#f2cc7a0b451dd283110a7b1f57d3f1675b9f045a" + integrity sha1-8sx6C0Ud0oMRCnsfV9PxZ1ufBFo= + +"@swc/core-win32-x64-msvc@1.3.58": + version "1.3.58" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.58.tgz#5fb1c9a7b529fbb906868bb48a5545ed444b9ad9" + integrity sha1-X7HJp7Up+7kGhou0ilVF7URLmtk= + +"@swc/core@^1.3.58": + version "1.3.58" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@swc/core/-/core-1.3.58.tgz#3371c6c660694124c2f1cc60ce6b99fd3df3f8c3" + integrity sha1-M3HGxmBpQSTC8cxgzmuZ/T3z+MM= + optionalDependencies: + "@swc/core-darwin-arm64" "1.3.58" + "@swc/core-darwin-x64" "1.3.58" + "@swc/core-linux-arm-gnueabihf" "1.3.58" + "@swc/core-linux-arm64-gnu" "1.3.58" + "@swc/core-linux-arm64-musl" "1.3.58" + "@swc/core-linux-x64-gnu" "1.3.58" + "@swc/core-linux-x64-musl" "1.3.58" + "@swc/core-win32-arm64-msvc" "1.3.58" + "@swc/core-win32-ia32-msvc" "1.3.58" + "@swc/core-win32-x64-msvc" "1.3.58" + +"@swc/jest@^0.2.26": + version "0.2.26" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@swc/jest/-/jest-0.2.26.tgz#6ef2d6d31869e3aaddc132603bc21f2e4c57cc5d" + integrity sha1-bvLW0xhp46rdwTJgO8IfLkxXzF0= + dependencies: + "@jest/create-cache-key-function" "^27.4.2" + jsonc-parser "^3.2.0" + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha1-9UShSNOrNYAcH2M6dEH9h8LkhL8= + +"@types/babel__core@^7.1.14": + version "7.20.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" + integrity sha1-YbxaTK5QXOmOHjbFRF5L7gYNiJE= + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha1-HyDOTFsZkLN5ALY/BQGC0owkObc= + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha1-PRpI/Z1sDt/Vby/1eNrtSPNsiWk= + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.18.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/babel__traverse/-/babel__traverse-7.18.5.tgz#c107216842905afafd3b6e774f6f935da6f5db80" + integrity sha1-wQchaEKQWvr9O253T2+TXab124A= + dependencies: + "@babel/types" "^7.3.0" + "@types/dotnet@./@types/dotnet": version "1.0.0" @@ -1046,22 +1446,43 @@ "@types/estree" "*" "@types/eslint@*": - version "8.21.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/eslint/-/eslint-8.21.0.tgz#21724cfe12b96696feafab05829695d4d7bd7c48" - integrity sha1-IXJM/hK5Zpb+r6sFgpaV1Ne9fEg= + version "8.37.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/eslint/-/eslint-8.37.0.tgz#29cebc6c2a3ac7fea7113207bf5a828fdf4d7ef1" + integrity sha1-Kc68bCo6x/6nETIHv1qCj99NfvE= dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*": - version "1.0.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha1-X7LlNsGum/NTZu7Yeegn+lnKQcI= +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + integrity sha1-qiJ1CWLzvw5511PTzAZ/AQyV8ZQ= + +"@types/graceful-fs@^4.1.3": + version "4.1.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha1-4UsldqHCUCa38C7eHeO4TDoe/q4= + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha1-hGfUs8CHgF1jWASAiQeRJ3zjXEQ= + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha1-wUwk8Y6oGQwRjudWK3/5mjZVJoY= + dependencies: + "@types/istanbul-lib-coverage" "*" -"@types/estree@^0.0.51": - version "0.0.51" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha1-z9cJJKJaP9MrIY5eQg5ol+GsT0A= +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha1-kVP+mLuivVZaY63ZQ21vDX+EaP8= + dependencies: + "@types/istanbul-lib-report" "*" "@types/jsdom@^16.2.14": version "16.2.15" @@ -1072,234 +1493,272 @@ "@types/parse5" "^6.0.3" "@types/tough-cookie" "*" +"@types/jsdom@^20.0.0": + version "20.0.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" + integrity sha1-B8FLwZvS+RjBkpVBzarK6JR0SAg= + dependencies: + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^7.0.0" + "@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha1-1CG2xSejA398hEM/0sQingFoY9M= "@types/node@*": - version "18.13.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/node/-/node-18.13.0.tgz#0400d1e6ce87e9d3032c19eb6c58205b0d3f7850" - integrity sha1-BADR5s6H6dMDLBnrbFggWw0/eFA= + version "20.1.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/node/-/node-20.1.5.tgz#e94b604c67fc408f215fcbf3bd84d4743bf7f710" + integrity sha1-6UtgTGf8QI8hX8vzvYTUdDv39xA= "@types/parse5@^6.0.3": version "6.0.3" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" integrity sha1-cFuzSeeJ76BvQ/EozvUSQHU0JMs= +"@types/prettier@^2.1.5": + version "2.7.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + integrity sha1-bCMkZBzEugUKjHELKyUbN3WB+/A= + "@types/semver@^7.3.12": - version "7.3.13" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" - integrity sha1-2kv9c/Sb1UHSiSCrDivw7oD3HJE= + version "7.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" + integrity sha1-WRwc46cCxF7hX0ekKt5ywv14l4o= + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha1-IPGClPeX8iCbX2XI47XI6CYdEnw= "@types/tough-cookie@*": version "4.0.2" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" integrity sha1-Yoa0xyKNWKt4ZtGXFvNpbgOgk5c= -"@typescript-eslint/eslint-plugin@^5.26.0": - version "5.52.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz#5fb0d43574c2411f16ea80f5fc335b8eaa7b28a8" - integrity sha1-X7DUNXTCQR8W6oD1/DNbjqp7KKg= +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha1-DGDlN/p5D1+Ucu0ndsK3HsEXNRs= + +"@types/yargs@^16.0.0": + version "16.0.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/yargs/-/yargs-16.0.5.tgz#12cc86393985735a283e387936398c2f9e5f88e3" + integrity sha1-EsyGOTmFc1ooPjh5NjmML55fiOM= + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^17.0.8": + version "17.0.24" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" + integrity sha1-s++NUK1Kpq7PbdyXxYCgD1qhGQI= dependencies: - "@typescript-eslint/scope-manager" "5.52.0" - "@typescript-eslint/type-utils" "5.52.0" - "@typescript-eslint/utils" "5.52.0" + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^5.26.0": + version "5.59.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz#a350faef1baa1e961698240f922d8de1761a9e2b" + integrity sha1-o1D67xuqHpYWmCQPki2N4XYanis= + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.59.6" + "@typescript-eslint/type-utils" "5.59.6" + "@typescript-eslint/utils" "5.59.6" debug "^4.3.4" grapheme-splitter "^1.0.4" ignore "^5.2.0" natural-compare-lite "^1.4.0" - regexpp "^3.2.0" semver "^7.3.7" tsutils "^3.21.0" "@typescript-eslint/parser@^5.26.0": - version "5.52.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@typescript-eslint/parser/-/parser-5.52.0.tgz#73c136df6c0133f1d7870de7131ccf356f5be5a4" - integrity sha1-c8E232wBM/HXhw3nExzPNW9b5aQ= + version "5.59.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@typescript-eslint/parser/-/parser-5.59.6.tgz#bd36f71f5a529f828e20b627078d3ed6738dbb40" + integrity sha1-vTb3H1pSn4KOILYnB40+1nONu0A= dependencies: - "@typescript-eslint/scope-manager" "5.52.0" - "@typescript-eslint/types" "5.52.0" - "@typescript-eslint/typescript-estree" "5.52.0" + "@typescript-eslint/scope-manager" "5.59.6" + "@typescript-eslint/types" "5.59.6" + "@typescript-eslint/typescript-estree" "5.59.6" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.52.0": - version "5.52.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz#a993d89a0556ea16811db48eabd7c5b72dcb83d1" - integrity sha1-qZPYmgVW6haBHbSOq9fFty3Lg9E= +"@typescript-eslint/scope-manager@5.59.6": + version "5.59.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz#d43a3687aa4433868527cfe797eb267c6be35f19" + integrity sha1-1Do2h6pEM4aFJ8/nl+smfGvjXxk= dependencies: - "@typescript-eslint/types" "5.52.0" - "@typescript-eslint/visitor-keys" "5.52.0" + "@typescript-eslint/types" "5.59.6" + "@typescript-eslint/visitor-keys" "5.59.6" -"@typescript-eslint/type-utils@5.52.0": - version "5.52.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz#9fd28cd02e6f21f5109e35496df41893f33167aa" - integrity sha1-n9KM0C5vIfUQnjVJbfQYk/MxZ6o= +"@typescript-eslint/type-utils@5.59.6": + version "5.59.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz#37c51d2ae36127d8b81f32a0a4d2efae19277c48" + integrity sha1-N8UdKuNhJ9i4HzKgpNLvrhknfEg= dependencies: - "@typescript-eslint/typescript-estree" "5.52.0" - "@typescript-eslint/utils" "5.52.0" + "@typescript-eslint/typescript-estree" "5.59.6" + "@typescript-eslint/utils" "5.59.6" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.52.0": - version "5.52.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@typescript-eslint/types/-/types-5.52.0.tgz#19e9abc6afb5bd37a1a9bea877a1a836c0b3241b" - integrity sha1-Gemrxq+1vTehqb6od6GoNsCzJBs= +"@typescript-eslint/types@5.59.6": + version "5.59.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@typescript-eslint/types/-/types-5.59.6.tgz#5a6557a772af044afe890d77c6a07e8c23c2460b" + integrity sha1-WmVXp3KvBEr+iQ13xqB+jCPCRgs= -"@typescript-eslint/typescript-estree@5.52.0": - version "5.52.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz#6408cb3c2ccc01c03c278cb201cf07e73347dfca" - integrity sha1-ZAjLPCzMAcA8J4yyAc8H5zNH38o= +"@typescript-eslint/typescript-estree@5.59.6": + version "5.59.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz#2fb80522687bd3825504925ea7e1b8de7bb6251b" + integrity sha1-L7gFImh704JVBJJep+G43nu2JRs= dependencies: - "@typescript-eslint/types" "5.52.0" - "@typescript-eslint/visitor-keys" "5.52.0" + "@typescript-eslint/types" "5.59.6" + "@typescript-eslint/visitor-keys" "5.59.6" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.52.0": - version "5.52.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@typescript-eslint/utils/-/utils-5.52.0.tgz#b260bb5a8f6b00a0ed51db66bdba4ed5e4845a72" - integrity sha1-smC7Wo9rAKDtUdtmvbpO1eSEWnI= +"@typescript-eslint/utils@5.59.6": + version "5.59.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@typescript-eslint/utils/-/utils-5.59.6.tgz#82960fe23788113fc3b1f9d4663d6773b7907839" + integrity sha1-gpYP4jeIET/DsfnUZj1nc7eQeDk= dependencies: + "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.52.0" - "@typescript-eslint/types" "5.52.0" - "@typescript-eslint/typescript-estree" "5.52.0" + "@typescript-eslint/scope-manager" "5.59.6" + "@typescript-eslint/types" "5.59.6" + "@typescript-eslint/typescript-estree" "5.59.6" eslint-scope "^5.1.1" - eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.52.0": - version "5.52.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz#e38c971259f44f80cfe49d97dbffa38e3e75030f" - integrity sha1-44yXEln0T4DP5J2X2/+jjj51Aw8= +"@typescript-eslint/visitor-keys@5.59.6": + version "5.59.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz#673fccabf28943847d0c8e9e8d008e3ada7be6bb" + integrity sha1-Zz/Mq/KJQ4R9DI6ejQCOOtp75rs= dependencies: - "@typescript-eslint/types" "5.52.0" + "@typescript-eslint/types" "5.59.6" eslint-visitor-keys "^3.3.0" -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha1-K/12fq4aaZb0Mv9+jX/HVnnAtqc= +"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": + version "1.11.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" + integrity sha1-2wRlVdPEE/iWbKUKlRdqDixkLiQ= dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha1-9sYacF8P16auyqToGY8j2dwXnk8= +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha1-2svLla/xNcgmD3f6O0xf6mAKZDE= -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha1-GmMZLYeI5cASgAump6RscFKI/RY= +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha1-YTL2jErNWdzRQcRLGMvrvZ8vp2g= -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha1-gyqQDrREiEzemnytRn+BUA9eWrU= +"@webassemblyjs/helper-buffer@1.11.6": + version "1.11.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" + integrity sha1-tm1zxD4pb9XogAbxhST+sPLHwJM= -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha1-ZNgdohn7u6HjvRv8dPboxOEKYq4= +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha1-y85efgwb0yz0kFrkRO9kzqkZ8bU= dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha1-8ygkHkHnsZnQsgwY6IQpxEMyleE= +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha1-uy69s7g6om2bqtTEbUMVKDrNUek= -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha1-Ie4GWntjXzGec48N1zv72igcCXo= +"@webassemblyjs/helper-wasm-section@1.11.6": + version "1.11.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" + integrity sha1-/5fzhjxV7n9YD9XEGjgene9KpXc= dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha1-ljkp6bvQVwnn4SJDoJkYCBKZJhQ= +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha1-u2ZckdCxT//OsOOCmMMprwQ8bjo= dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha1-zoFLRVdOk9drrh+yZEq5zdlSeqU= +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha1-cOYOXoL5rIERi8JTgaCyg4kyQNc= dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha1-0fi3ZDaefG5rrjUOhU3smlnwo/8= - -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha1-rSBuv0v5WgWM6YgKjAksXeyBk9Y= - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha1-hsXqMEhJdZt9iMR6MvTwOa48j3Y= - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha1-ZXtMIgL0zzs0X4pMZGHIwkGJhfI= - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha1-hspzRTT0F+m9PGfHocddi+QfsZk= - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha1-0Mc77ajuxUJvEK6O9VzuXnCEwvA= - dependencies: - "@webassemblyjs/ast" "1.11.1" +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha1-kPi8NMVhWV/hVmA75yU8280Pq1o= + +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.11.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" + integrity sha1-xy+oIgUkybQWJJ89lMKVjf5wzqs= + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-opt" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/wast-printer" "1.11.6" + +"@webassemblyjs/wasm-gen@1.11.6": + version "1.11.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" + integrity sha1-+1KD4Oi0VRzE6cPA1xhKZfr3wmg= + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.11.6": + version "1.11.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" + integrity sha1-2aItZRJIQiykmLCaoyMqgQQUh8I= + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.11.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" + integrity sha1-u4U3jFJ9+CQASBK723hO6lORdKE= + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.11.6": + version "1.11.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" + integrity sha1-p7+N1+NirrFmj/Q/NcuEnxiO/yA= + dependencies: + "@webassemblyjs/ast" "1.11.6" "@xtuc/long" "4.2.2" "@webpack-cli/configtest@^1.2.0": @@ -1329,6 +1788,11 @@ resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0= +abab@^2.0.6: + version "2.0.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha1-QbgPLIcdGWhiFrgjCSMc/Tyz0pE= + abort-controller@^3.0.0: version "3.0.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -1336,21 +1800,41 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/acorn-globals/-/acorn-globals-7.0.1.tgz#0dbf05c44fa7c94332914c02066d5beff62c40c3" + integrity sha1-Db8FxE+nyUMykUwCBm1b7/YsQMM= + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha1-uitZOc5iwjjbbZPYHJsRGym4Vek= + version "1.9.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha1-UHJ2JJ1oR5fITgc074SGAzTPsaw= acorn-jsx@^5.3.2: version "5.3.2" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha1-ftW7VZCLOy8bxVxq8WU7rafweTc= -acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: +acorn-walk@^8.0.2: + version "8.2.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha1-dBIQ8uJCZFRQiFOi9E0KuDt/acE= + +acorn@^8.1.0, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.1: version "8.8.2" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha1-Gy8l2wKvllOZuXdrDCw5EnbTfEo= +agent-base@6: + version "6.0.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha1-Sf/1hXfP7j83F2/qtMIuAPhtf3c= + dependencies: + debug "4" + ajv-keywords@^3.5.2: version "3.5.2" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" @@ -1366,6 +1850,13 @@ ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha1-ayKR0dt9mLZSHV8e+kLQ86n+tl4= + dependencies: + type-fest "^0.21.3" + ansi-regex@^5.0.1: version "5.0.1" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -1385,6 +1876,26 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha1-B0SWkK1Fd30ZJKwquy/IiV26g2s= + +anymatch@^3.0.3: + version "3.1.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha1-eQxYsZuhcgqEIFtXxhjVrYUklz4= + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE= + dependencies: + sprintf-js "~1.0.2" + argparse@^2.0.1: version "2.0.1" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -1395,6 +1906,45 @@ array-union@^2.1.0: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha1-t5hCCtvrHego2ErNii4j0+/oXo0= +asynckit@^0.4.0: + version "0.4.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +babel-jest@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" + integrity sha1-P+PdsQkZjnixyI+evezV5PwvUKU= + dependencies: + "@jest/transform" "^29.5.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.5.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha1-+ojsWSMv2bTjbbvFQKjsmptH2nM= + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" + integrity sha1-qX20N5NvRB7BlpkMlzjUuIU4YYo= + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + babel-plugin-polyfill-corejs2@^0.3.3: version "0.3.3" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" @@ -1419,6 +1969,32 @@ babel-plugin-polyfill-regenerator@^0.4.1: dependencies: "@babel/helper-define-polyfill-provider" "^0.3.3" +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha1-tDmSObibKgEfndvj5PQB/EDP9zs= + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" + integrity sha1-V7yMyICXr3/2patZ0c0p1SpZFuI= + dependencies: + babel-plugin-jest-hoist "^29.5.0" + babel-preset-current-node-syntax "^1.0.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -1449,6 +2025,13 @@ browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.5: node-releases "^2.0.8" update-browserslist-db "^1.0.10" +bser@2.1.1: + version "2.1.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha1-5nh9og7OnQeZhTPP2d5vXDj0vAU= + dependencies: + node-int64 "^0.4.0" + buffer-from@^1.0.0: version "1.1.2" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -1459,10 +2042,20 @@ callsites@^3.0.0: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M= +camelcase@^5.3.1: + version "5.3.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA= + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha1-VoW5XrIJrJwMF3Rnd4ychN9Yupo= + caniuse-lite@^1.0.30001449: - version "1.0.30001451" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz#2e197c698fc1373d63e1406d6607ea4617c613f1" - integrity sha1-Lhl8aY/BNz1j4UBtZgfqRhfGE/E= + version "1.0.30001487" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/caniuse-lite/-/caniuse-lite-1.0.30001487.tgz#d882d1a34d89c11aea53b8cdc791931bdab5fe1b" + integrity sha1-2ILRo02JwRrqU7jNx5GTG9q1/hs= chalk@^2.0.0: version "2.4.2" @@ -1481,11 +2074,26 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +char-regex@^1.0.2: + version "1.0.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha1-10Q1giYhf5ge1Y9Hmx1rzClUXc8= + chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha1-EBXs7UdB4V0GZkqVfbv1DQQeJqw= +ci-info@^3.2.0: + version "3.8.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha1-gUCCZaU4DJKfC8Zl1iJWYozp75E= + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha1-n4S6MkSlEvOlTlJ36O70xImGTkA= + cliui@^7.0.2: version "7.0.4" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -1495,6 +2103,15 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha1-DASwddsCy/5g3I5s8vVIaxo2CKo= + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clone-deep@^4.0.1: version "4.0.1" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -1504,6 +2121,16 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" +co@^4.6.0: + version "4.6.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha1-zCyOlPwYu9/+ZNZTRXDIpnOyf1k= + color-convert@^1.9.0: version "1.9.3" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -1529,9 +2156,16 @@ color-name@~1.1.4: integrity sha1-wqCah6y95pVD3m9j+jmVyCbFNqI= colorette@^2.0.14: - version "2.0.19" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha1-zfBE9HrUGg9LVrOg1bTm4aLVp5g= + version "2.0.20" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha1-nreT5oMwZ/cjWQL807CZF6AAqVo= + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha1-w9RaizT9cwYxoRCoolIGgrMdWn8= + dependencies: + delayed-stream "~1.0.0" commander@^2.20.0: version "2.20.3" @@ -1548,15 +2182,20 @@ concat-map@0.0.1: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -convert-source-map@^1.7.0: +convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.9.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha1-f6rmI1P7QhM2bQypg1jSLoNosF8= +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha1-S1YPZJ/E6RjdCrdc9JYei8iC2Co= + core-js-compat@^3.25.1: - version "3.28.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/core-js-compat/-/core-js-compat-3.28.0.tgz#c08456d854608a7264530a2afa281fadf20ecee6" - integrity sha1-wIRW2FRginJkUwoq+igfrfIOzuY= + version "3.30.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/core-js-compat/-/core-js-compat-3.30.2.tgz#83f136e375babdb8c80ad3c22d67c69098c1dd8b" + integrity sha1-g/E243W6vbjICtPCLWfGkJjB3Ys= dependencies: browserslist "^4.21.5" @@ -1569,18 +2208,74 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +cssom@^0.5.0: + version "0.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" + integrity sha1-0lT6ks2Lb72DgRufuu00ZjzBfDY= + +cssom@~0.3.6: + version "0.3.8" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha1-nxJ29bK0Y/IRTT8sdSUK+MGjb0o= + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha1-/2ZaDdvcMYZLCWR/NBY0Q9kLCFI= + dependencies: + cssom "~0.3.6" + +data-urls@^3.0.2: + version "3.0.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" + integrity sha1-nPJKR3riK871zV9vC/vB0tO+kUM= + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha1-Exn2V5NX8jONMzfSzdSRS7XcyGU= dependencies: ms "2.1.2" -deep-is@^0.1.3: +decimal.js@^10.4.2: + version "10.4.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + integrity sha1-EEQJKITSRdG39lcl+krUxveBzCM= + +dedent@^0.7.0: + version "0.7.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha1-pvLc5hL63S7x9Rm3NVHxfoUZmDE= +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha1-RLXyFHzTsA1LVhN2hZZvJv0l3Uo= + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha1-V29d/GOuGhkv8ZLYrTr2MImRtlE= + +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha1-kxS8H6vgkmf/7KnLr8RX2EmaE/I= + dir-glob@^3.0.1: version "3.0.1" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -1595,33 +2290,57 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +domexception@^4.0.0: + version "4.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + integrity sha1-StG+VsytyG/HbQMzU5magDfQNnM= + dependencies: + webidl-conversions "^7.0.0" + electron-to-chromium@^1.4.284: - version "1.4.295" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/electron-to-chromium/-/electron-to-chromium-1.4.295.tgz#911d5df67542bf7554336142eb302c5ec90bba66" - integrity sha1-kR1d9nVCv3VUM2FC6zAsXskLumY= + version "1.4.396" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/electron-to-chromium/-/electron-to-chromium-1.4.396.tgz#3d3664eb58d86376fbe2fece3705f68ca197205c" + integrity sha1-PTZk61jYY3b74v7ONwX2jKGXIFw= + +emittery@^0.13.1: + version "0.13.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha1-wEuMNFdJDghHrlH87Tr1LTOOPa0= emoji-regex@^8.0.0: version "8.0.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc= -enhanced-resolve@^5.0.0, enhanced-resolve@^5.10.0: - version "5.12.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" - integrity sha1-MA4ckCKPW1cMTTW6vyY/bacVVjQ= +enhanced-resolve@^5.0.0, enhanced-resolve@^5.14.0: + version "5.14.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz#0b6c676c8a3266c99fa281e4433a706f5c0c61c4" + integrity sha1-C2xnbIoyZsmfooHkQzpwb1wMYcQ= dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" +entities@^4.4.0: + version "4.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha1-XSaOpecRPsdMTQM7eepaNaSI+0g= + envinfo@^7.7.3: version "7.8.1" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" integrity sha1-Bjd+Pl9NN5/qesWS1a2JJ+DE1HU= -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha1-bxPbAMw4QXE32vdDZvU1yOtDjxk= +error-ex@^1.3.1: + version "1.3.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha1-tKxAZIEH/c3PriQvQovqihTU8b8= + dependencies: + is-arrayish "^0.2.1" + +es-module-lexer@^1.2.1: + version "1.2.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" + integrity sha1-ujA4MfY+ajlJg/3i+XrXeyIyRSc= escalade@^3.1.1: version "3.1.1" @@ -1633,11 +2352,28 @@ escape-string-regexp@^1.0.5: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha1-owME6Z2qMuI7L9IPUbq9B8/8o0Q= + escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ= +escodegen@^2.0.0: + version "2.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha1-XjKxKDPoqo+jXhvwvvqJOASEx90= + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-plugin-header@^3.1.1: version "3.1.1" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz#6ce512432d57675265fac47292b50d1eff11acd6" @@ -1651,37 +2387,28 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha1-//NIlML2XlIm0wQaxIC0UToWNkI= +eslint-scope@^7.2.0: + version "7.2.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" + integrity sha1-8h69r9oCNS8QNjS5bdR9n4HKEXs= dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha1-iuuvrOc0W7M1WdsKHxOh0tSMNnI= - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha1-9lMoJZMFknOSyTjtROsKXJsr0wM= - -eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha1-9kgPprHzDv4tGWiqisdFuGJGmCY= +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" + integrity sha1-wixI9IlC0IyoJMxSYhGuQAR4qZQ= eslint@^8.16.0: - version "8.34.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/eslint/-/eslint-8.34.0.tgz#fe0ab0ef478104c1f9ebc5537e303d25a8fb22d6" - integrity sha1-/gqw70eBBMH568VTfjA9Jaj7ItY= - dependencies: - "@eslint/eslintrc" "^1.4.1" + version "8.40.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/eslint/-/eslint-8.40.0.tgz#a564cd0099f38542c4e9a2f630fa45bf33bc42a4" + integrity sha1-pWTNAJnzhULE6aL2MPpFvzO8QqQ= + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.3" + "@eslint/js" "8.40.0" "@humanwhocodes/config-array" "^0.11.8" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -1691,11 +2418,10 @@ eslint@^8.16.0: debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.4.0" - esquery "^1.4.0" + eslint-scope "^7.2.0" + eslint-visitor-keys "^3.4.1" + espree "^9.5.2" + esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" @@ -1716,24 +2442,28 @@ eslint@^8.16.0: minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.1" - regexpp "^3.2.0" strip-ansi "^6.0.1" strip-json-comments "^3.1.0" text-table "^0.2.0" -espree@^9.4.0: - version "9.4.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" - integrity sha1-UdYJJhVWeiws/3gzRF43wowAZb0= +espree@^9.5.2: + version "9.5.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" + integrity sha1-6ZTn3DOggqeoLc6vEog6gpNTIVs= dependencies: acorn "^8.8.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.1" -esquery@^1.4.0: - version "1.4.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha1-IUj/w4uC6McFff7UhCWz5h8PJKU= +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha1-E7BM2z5sXRnfkatph6hpVhmwqnE= + +esquery@^1.4.2: + version "1.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha1-bOF3ON6Fd2lO3XNhxXGCrIyw2ws= dependencies: estraverse "^5.1.0" @@ -1774,6 +2504,37 @@ eventsource@^2.0.2: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/eventsource/-/eventsource-2.0.2.tgz#76dfcc02930fb2ff339520b6d290da573a9e8508" integrity sha1-dt/MApMPsv8zlSC20pDaVzqehQg= +execa@^5.0.0: + version "5.1.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha1-+ArZy/Qpj3vR1MlVXCHpN0HEEd0= + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expect@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" + integrity sha1-aMBQkVbLKgrbiGXUE7E37qrmgvc= + dependencies: + "@jest/expect-utils" "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -1790,12 +2551,12 @@ fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM= -fast-levenshtein@^2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -1812,6 +2573,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha1-6VJO5rXHfp5QAa8PhfOtu4YjJVw= + dependencies: + bser "2.1.1" + fetch-cookie@^2.0.3: version "2.1.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/fetch-cookie/-/fetch-cookie-2.1.0.tgz#6e127909912f9e527533b045aab555c06b33801b" @@ -1834,7 +2602,7 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -find-up@^4.0.0: +find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk= @@ -1863,16 +2631,30 @@ flatted@^3.1.0: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha1-YJ85IHy2FLidB2W0d8stQ3+/l4c= +form-data@^4.0.0: + version "4.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha1-k5Gdrq82HuUpWEubMWZNwSyfpFI= + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + fp-ts@^2.6.1: - version "2.13.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/fp-ts/-/fp-ts-2.13.1.tgz#1bf2b24136cca154846af16752dc29e8fa506f2a" - integrity sha1-G/KyQTbMoVSEavFnUtwp6PpQbyo= + version "2.15.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/fp-ts/-/fp-ts-2.15.0.tgz#ed1ff6fc9a072176ec2310e20e814077bb391545" + integrity sha1-7R/2/JoHIXbsIxDiDoFAd7s5FUU= fs.realpath@^1.0.0: version "1.0.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +fsevents@^2.3.2: + version "2.3.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro= + function-bind@^1.1.1: version "1.1.1" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -1888,6 +2670,16 @@ get-caller-file@^2.0.5: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha1-T5RBKoLbMvNuOwuXQfipf+sDH34= +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha1-jeLYA8/0TfO8bEVuZmizbDkm4Ro= + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha1-omLY7vZ6ztV8KFKtYWdSakPL97c= + glob-parent@^5.1.2: version "5.1.2" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -1907,7 +2699,7 @@ glob-to-regexp@^0.4.1: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha1-x1KXCHyFG5pXi9IX3VmpL1n+VG4= -glob@^7.1.3: +glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha1-uN8PuAK7+o6JvR2Ti04WV47UTys= @@ -1944,9 +2736,9 @@ globby@^11.1.0: slash "^3.0.0" graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha1-FH06AG2kyjzhRyjHrvwofDZ9emw= + version "4.2.11" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha1-QYPk6L8Iu24Fu7L30uDI9xLKQOM= grapheme-splitter@^1.0.4: version "1.0.4" @@ -1970,6 +2762,47 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + integrity sha1-LLGozw21JBR3blsqegTV3ZgVjek= + dependencies: + whatwg-encoding "^2.0.0" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha1-39YAJ9o2o238viNiYsAKWCJoFFM= + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha1-USmAAgNSDUNPFCvHj/PBcIAPK0M= + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha1-xZ7yJKBP6LdU89sAY6Jeow0ABdY= + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha1-3JH8ukLk0G5Kuu0zs+ejwC9RTqA= + +iconv-lite@0.6.3: + version "0.6.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha1-pS+AvzjaGVLrXGgXkHGYcaGnJQE= + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ignore@^5.2.0: version "5.2.4" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" @@ -2037,10 +2870,15 @@ io-ts@^2.2.13: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/io-ts/-/io-ts-2.2.20.tgz#be42b75f6668a2c44f706f72ee6e4c906777c7f5" integrity sha1-vkK3X2ZoosRPcG9y7m5MkGd3x/U= -is-core-module@^2.9.0: - version "2.11.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha1-rUyz44Y+gUUjyW8/WNJsxXD/AUQ= +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-core-module@^2.11.0: + version "2.12.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4" + integrity sha1-Nq1i9vc8glP9ZHJRehJIPPA+fsQ= dependencies: has "^1.0.3" @@ -2054,6 +2892,11 @@ is-fullwidth-code-point@^3.0.0: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0= +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha1-fRQK3DiarzARqPKipM+m+q3/sRg= + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -2078,6 +2921,16 @@ is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha1-Fx7W8Z46xVQ5Tt94yqBXhKRb67U= + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha1-+sHj1TuXrVqdCunO8jifWBClwHc= + isexe@^2.0.0: version "2.0.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -2088,6 +2941,413 @@ isobject@^3.0.1: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha1-GJ55CdCjn6Wj361bA/cZR3cBkdM= + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha1-0QyIhcISVXThwjHKyt+VVnXhzj0= + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha1-dRj+UupE3jcvRgp2tezan/tz2KY= + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha1-iV86cJ/PujTG3lpCk5Ai8+Q1hVE= + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha1-zJpqslyyVlmBDkeF7Z2ft0JXi64= + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" + integrity sha1-6IeG3Ki/KqiZ7Er3ZE4W2dz5sj4= + dependencies: + execa "^5.0.0" + p-limit "^3.1.0" + +jest-circus@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" + integrity sha1-tZJpiUSedb/w1ZlEuuCDydf7cxc= + dependencies: + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^29.5.0" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + p-limit "^3.1.0" + pretty-format "^29.5.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" + integrity sha1-s0wgptNZaPPuR6dDf/jlPghrSmc= + dependencies: + "@jest/core" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + prompts "^2.0.1" + yargs "^17.3.1" + +jest-config@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" + integrity sha1-PMly+uyMiq6prhWMaUVBt583SNo= + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.5.0" + "@jest/types" "^29.5.0" + babel-jest "^29.5.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.5.0" + jest-environment-node "^29.5.0" + jest-get-type "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-runner "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.5.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" + integrity sha1-4Ng6WOtUUdzB+mGxw+5Oj1opDWM= + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-docblock@^29.4.3: + version "29.4.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" + integrity sha1-kFBaqJUUocfc7qwRI9955BRjbqg= + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" + integrity sha1-/G5wFPg+rGjiK3GVWY3oVUwuXAY= + dependencies: + "@jest/types" "^29.5.0" + chalk "^4.0.0" + jest-get-type "^29.4.3" + jest-util "^29.5.0" + pretty-format "^29.5.0" + +jest-environment-jsdom@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz#cfe86ebaf1453f3297b5ff3470fbe94739c960cb" + integrity sha1-z+huuvFFPzKXtf80cPvpRznJYMs= + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/jsdom" "^20.0.0" + "@types/node" "*" + jest-mock "^29.5.0" + jest-util "^29.5.0" + jsdom "^20.0.0" + +jest-environment-node@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" + integrity sha1-8XIZ0PDMDmjgcnxYt5LAQOMyyWc= + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-mock "^29.5.0" + jest-util "^29.5.0" + +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + integrity sha1-GrelIHyZUWEQC1GHFZyoLdSLPdU= + +jest-haste-map@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" + integrity sha1-ab1n3JAS1uJyPyCpRQmelysulN4= + dependencies: + "@jest/types" "^29.5.0" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + jest-worker "^29.5.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-junit@^16.0.0: + version "16.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-junit/-/jest-junit-16.0.0.tgz#d838e8c561cf9fdd7eb54f63020777eee4136785" + integrity sha1-2DjoxWHPn91+tU9jAgd37uQTZ4U= + dependencies: + mkdirp "^1.0.4" + strip-ansi "^6.0.1" + uuid "^8.3.2" + xml "^1.0.1" + +jest-leak-detector@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" + integrity sha1-z0veqWFccrrEo6e6fnkw+cBhDIw= + dependencies: + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-matcher-utils@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" + integrity sha1-2Vevf4wGksVFNmZwViGtSrwsWcU= + dependencies: + chalk "^4.0.0" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-message-util@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" + integrity sha1-H3dsrDrKMyq43S47QWJUNQhckA4= + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.5.0" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.5.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" + integrity sha1-JuIXK8xx2LAZUIH/HxRqx+FRiu0= + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-util "^29.5.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha1-kwsVRhZNStWTfVVA5xHU041MrS4= + +jest-regex-util@^29.4.3: + version "29.4.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" + integrity sha1-pCYWFB4MrgUs+jLBaZRdAMCqC7g= + +jest-resolve-dependencies@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" + integrity sha1-8OoplVmW9JeIv3CZYFKqmOe+/uQ= + dependencies: + jest-regex-util "^29.4.3" + jest-snapshot "^29.5.0" + +jest-resolve@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" + integrity sha1-sFPMla0dX2Mn8KyKrp+YeVR17Nw= + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.5.0" + jest-validate "^29.5.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" + integrity sha1-alfCgusO90l3jURMHXWManaTtvg= + dependencies: + "@jest/console" "^29.5.0" + "@jest/environment" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.4.3" + jest-environment-node "^29.5.0" + jest-haste-map "^29.5.0" + jest-leak-detector "^29.5.0" + jest-message-util "^29.5.0" + jest-resolve "^29.5.0" + jest-runtime "^29.5.0" + jest-util "^29.5.0" + jest-watcher "^29.5.0" + jest-worker "^29.5.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" + integrity sha1-yD+UPuDB2n65H6GBsIEevVmwNCA= + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/globals" "^29.5.0" + "@jest/source-map" "^29.4.3" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" + integrity sha1-ycHOAzHltjzUROL5WlWnO4Sx6M4= + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.5.0" + graceful-fs "^4.2.9" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + natural-compare "^1.4.0" + pretty-format "^29.5.0" + semver "^7.3.5" + +jest-util@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" + integrity sha1-JKTT2S/DnOkEJTEbI8J6bg7xa48= + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" + integrity sha1-jlqPNheNQORxONwAhmpfO9mRb/w= + dependencies: + "@jest/types" "^29.5.0" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.4.3" + leven "^3.1.0" + pretty-format "^29.5.0" + +jest-watcher@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" + integrity sha1-z38PlJgoumXdu7RcdDo4Kk2RE2M= + dependencies: + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.5.0" + string-length "^4.0.1" + jest-worker@^27.4.5: version "27.5.1" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" @@ -2097,16 +3357,44 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" +jest-worker@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" + integrity sha1-va77BoEb0zhNk/AJdVAU2Ky0YV0= + dependencies: + "@types/node" "*" + jest-util "^29.5.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jest/-/jest-29.5.0.tgz#f75157622f5ce7ad53028f2f8888ab53e1f1f24e" + integrity sha1-91FXYi9c561TAo8viIirU+Hx8k4= + dependencies: + "@jest/core" "^29.5.0" + "@jest/types" "^29.5.0" + import-local "^3.0.2" + jest-cli "^29.5.0" + js-sdsl@^4.1.4: - version "4.3.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711" - integrity sha1-ru/jKkUfeviEJbEf219YyQrh1xE= + version "4.4.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" + integrity sha1-i0N9vmQtqpV2BAC2AjeO2P/qhDA= js-tokens@^4.0.0: version "4.0.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha1-GSA/tZmR35jjoocFDUZHzerzJJk= +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha1-2ugS/bOCX6MGYJqHFzg8UMNqBTc= + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@^4.1.0: version "4.1.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -2114,6 +3402,38 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsdom@^20.0.0: + version "20.0.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" + integrity sha1-iGpBuh1HJvZ6iFgCjJlIn+1q1Ns= + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -2124,7 +3444,7 @@ jsesc@~0.5.0: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json-parse-even-better-errors@^2.3.1: +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0= @@ -2144,11 +3464,26 @@ json5@^2.2.2: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha1-eM1vGhm9wStz21rQxh79ZsHikoM= +jsonc-parser@^3.2.0: + version "3.2.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha1-Mf8/TCuXk/icZyEmJ8UcY5T4jnY= + kind-of@^6.0.2: version "6.0.3" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0= +kleur@^3.0.3: + version "3.0.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha1-p5yezIbuHOP6YgbRIWxQHxR/wH4= + +leven@^3.1.0: + version "3.1.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha1-d4kd6DQGTMy6gq54QrtrFKE+1/I= + levn@^0.4.1: version "0.4.1" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -2157,6 +3492,19 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +levn@~0.3.0: + version "0.3.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha1-7KKE910pZQeTCdwK2SVauy68FjI= + loader-runner@^4.2.0: version "4.3.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" @@ -2200,6 +3548,20 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +make-dir@^3.0.0: + version "3.1.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8= + dependencies: + semver "^6.0.0" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha1-Pl3SB5qC6BLpg8xmEMSiyw6qgBo= + dependencies: + tmpl "1.0.5" + merge-stream@^2.0.0: version "2.0.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -2223,20 +3585,30 @@ mime-db@1.52.0: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha1-u6vNwChZ9JhzAchW4zh85exDv3A= -mime-types@^2.1.27: +mime-types@^2.1.12, mime-types@^2.1.27: version "2.1.35" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha1-OBqHG2KnNEUGYK497uRIE/cNlZo= dependencies: mime-db "1.52.0" -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs= + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha1-Gc0ZS/0+Qo8EmnCBfAONiatL41s= dependencies: brace-expansion "^1.1.7" +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha1-PrXtYmInVteaXw4qIh3+utdcL34= + ms@2.1.2: version "2.1.2" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -2258,17 +3630,39 @@ neo-async@^2.6.2: integrity sha1-tKr7k+OustgXTKU88WOrfXMIMF8= node-fetch@^2.6.7: - version "2.6.9" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" - integrity sha1-fH90S1zG61/UBODHqf7GMKVWV+Y= + version "2.6.11" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" + integrity sha1-zef8cd7vMTHvgKc4kZ+Znm7f/yU= dependencies: whatwg-url "^5.0.0" +node-int64@^0.4.0: + version "0.4.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + node-releases@^2.0.8: version "2.0.10" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" integrity sha1-wxHrrjtqFIyJsYE/18TTwCTvU38= +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU= + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha1-t+zR5e1T2o43pV4cImnguX7XSOo= + dependencies: + path-key "^3.0.0" + +nwsapi@^2.2.2: + version "2.2.4" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/nwsapi/-/nwsapi-2.2.4.tgz#fd59d5e904e8e1f03c25a7d5a15cfa16c714a1e5" + integrity sha1-/VnV6QTo4fA8JafVoVz6FscUoeU= + once@^1.3.0: version "1.4.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -2276,6 +3670,25 @@ once@^1.3.0: dependencies: wrappy "1" +onetime@^5.1.2: + version "5.1.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4= + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha1-hPodA2/p08fiHZmIS2ARZ+yPtJU= + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + optionator@^0.9.1: version "0.9.1" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -2295,7 +3708,7 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2: +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha1-4drMvnjQ0TiMoYxk/qOOPlfjcGs= @@ -2328,6 +3741,23 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-json@^5.2.0: + version "5.2.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha1-x2/Gbe5UIxyWKyK8yKcs8vmXU80= + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5@^7.0.0, parse5@^7.1.1: + version "7.1.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha1-Bza+u/13eTgjJAojt/xeAQt/jjI= + dependencies: + entities "^4.4.0" + path-exists@^4.0.0: version "4.0.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -2338,7 +3768,7 @@ path-is-absolute@^1.0.0: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-key@^3.1.0: +path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U= @@ -2358,7 +3788,7 @@ picocolors@^1.0.0: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha1-y1vcdP8/UYkiNur3nWi8RFZKuBw= -picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha1-O6ODNzNkbZ0+SZWUbBNlpn+wekI= @@ -2368,6 +3798,11 @@ pify@^5.0.0: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" integrity sha1-H17KP16H6+wozG1UoOSq8ArMEn8= +pirates@^4.0.4: + version "4.0.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha1-/uw1LqXDJo+yOjfHAqsWmfNaXzs= + pkg-dir@^4.2.0: version "4.2.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" @@ -2380,6 +3815,28 @@ prelude-ls@^1.2.1: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha1-3rxkidem5rDnYRiIzsiAM30xY5Y= +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +pretty-format@^29.5.0: + version "29.5.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" + integrity sha1-KDE0509w4uPnIpM23g5PzpTM3lo= + dependencies: + "@jest/schemas" "^29.4.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +prompts@^2.0.1: + version "2.4.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha1-e1fnOzpIAprRDr1E90sBcipMsGk= + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + psl@^1.1.33: version "1.9.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" @@ -2390,6 +3847,11 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha1-9n+mfJTaj00M//mBruQRgGQZm48= +pure-rand@^6.0.0: + version "6.0.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" + integrity sha1-qcLdyum2jXNqgWMDbwiKJ4HIswY= + querystringify@^2.1.1: version "2.2.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" @@ -2407,6 +3869,11 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" +react-is@^18.0.0: + version "18.2.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha1-GZQx7qqi4J+GQn77tPFHPttHYJs= + rechoir@^0.7.0: version "0.7.1" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" @@ -2438,15 +3905,10 @@ regenerator-transform@^0.15.1: dependencies: "@babel/runtime" "^7.8.4" -regexpp@^3.2.0: - version "3.2.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha1-BCWido2PI7rXDKS5BGH6LxIT4bI= - -regexpu-core@^5.2.1: - version "5.3.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/regexpu-core/-/regexpu-core-5.3.0.tgz#4d0d044b76fedbad6238703ae84bfdedee2cf074" - integrity sha1-TQ0ES3b+261iOHA66Ev97e4s8HQ= +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha1-EaKwaITzUnrsPpPbv0o7lYqVVGs= dependencies: "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" @@ -2489,12 +3951,17 @@ resolve-from@^5.0.0: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha1-w1IlhD3493bfIcV1V7wIfp39/Gk= -resolve@^1.14.2, resolve@^1.9.0: - version "1.22.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha1-J8suu1P5GrtJRwqSi7p1WAZqwXc= +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha1-+Mk0uOahP1OeOLcJji42E08B6AA= + +resolve@^1.14.2, resolve@^1.20.0, resolve@^1.9.0: + version "1.22.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha1-DtCUPU4wGGeVV2bJ8+GubQHGhF8= dependencies: - is-core-module "^2.9.0" + is-core-module "^2.11.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -2522,10 +3989,22 @@ safe-buffer@^5.1.0: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= -schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha1-vHTEtraZXB2I92qLd76nIZ4MgoE= +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo= + +saxes@^6.0.0: + version "6.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + integrity sha1-/ltKR2jfTxSiAbG6amXB89mYjMU= + dependencies: + xmlchars "^2.2.0" + +schema-utils@^3.1.1, schema-utils@^3.1.2: + version "3.1.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/schema-utils/-/schema-utils-3.1.2.tgz#36c10abca6f7577aeae136c804b0c741edeadc99" + integrity sha1-NsEKvKb3V3rq4TbIBLDHQe3q3Jk= dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" @@ -2536,19 +4015,19 @@ semver-compare@^1.0.0: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= -semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0= -semver@^7.3.4, semver@^7.3.7: - version "7.3.8" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha1-B6eP6vs/ezI0fXJeM95+Ki32d5g= +semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: + version "7.5.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" + integrity sha1-yQxNYxz3RyDkayHB036gft+rkew= dependencies: lru-cache "^6.0.0" -serialize-javascript@^6.0.0: +serialize-javascript@^6.0.1: version "6.0.1" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" integrity sha1-sgbvsnw9oLCra1L0jRcLeZZFjlw= @@ -2556,9 +4035,9 @@ serialize-javascript@^6.0.0: randombytes "^2.1.0" set-cookie-parser@^2.4.8: - version "2.5.1" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz#ddd3e9a566b0e8e0862aca974a6ac0e01349430b" - integrity sha1-3dPppWaw6OCGKsqXSmrA4BNJQws= + version "2.6.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz#131921e50f62ff1a66a461d7d62d7b21d5d15a51" + integrity sha1-Exkh5Q9i/xpmpGHX1i17IdXRWlE= shallow-clone@^3.0.0: version "3.0.1" @@ -2579,11 +4058,29 @@ shebang-regex@^3.0.0: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI= +signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha1-qaF2f4r4QVURTqq9c/mSc8j1mtk= + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha1-E01oEpd1ZDfMBcoBNw06elcQde0= + slash@^3.0.0: version "3.0.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ= +source-map-support@0.5.13: + version "0.5.13" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha1-MbJKnC5zwt6FBmwP631Edn7VKTI= + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-support@~0.5.20: version "0.5.21" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -2592,12 +4089,32 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha1-dHIq8y6WFOnCh6jQu95IteLxomM= -string-width@^4.1.0, string-width@^4.2.0: +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha1-qvB0gWnAL8M8gjKrzPkz9Uocw08= + dependencies: + escape-string-regexp "^2.0.0" + +string-length@^4.0.1: + version "4.0.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha1-qKjce9XBqCubPIuH4SX2aHG25Xo= + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA= @@ -2613,6 +4130,16 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha1-nDUFwdtFvO3KPZz3oW9cWqOQGHg= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0= + strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -2644,37 +4171,56 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha1-btpL00SjyUrqN21MwxvHcxEDngk= +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha1-QwY30ki6d+B4iDlR+5qg7tfGP6I= + tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha1-GWenPvQGCoLxKrlq+G1S/bdu7KA= -terser-webpack-plugin@^5.1.3: - version "5.3.6" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" - integrity sha1-VZCuwxqjxvdxzhsazKYGOeqzGVw= +terser-webpack-plugin@^5.3.7: + version "5.3.8" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/terser-webpack-plugin/-/terser-webpack-plugin-5.3.8.tgz#415e03d2508f7de63d59eca85c5d102838f06610" + integrity sha1-QV4D0lCPfeY9WeyoXF0QKDjwZhA= dependencies: - "@jridgewell/trace-mapping" "^0.3.14" + "@jridgewell/trace-mapping" "^0.3.17" jest-worker "^27.4.5" schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - terser "^5.14.1" + serialize-javascript "^6.0.1" + terser "^5.16.8" -terser@^5.14.1, terser@^5.14.2: - version "5.16.3" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/terser/-/terser-5.16.3.tgz#3266017a9b682edfe019b8ecddd2abaae7b39c6b" - integrity sha1-MmYBeptoLt/gGbjs3dKrqueznGs= +terser@^5.14.2, terser@^5.16.8: + version "5.17.4" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/terser/-/terser-5.17.4.tgz#b0c2d94897dfeba43213ed5f90ed117270a2c696" + integrity sha1-sMLZSJff66QyE+1fkO0RcnCixpY= dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" commander "^2.20.0" source-map-support "~0.5.20" +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha1-BKhphmHYBepvopO2y55jrARO8V4= + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + text-table@^0.2.0: version "0.2.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +tmpl@1.0.5: + version "1.0.5" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha1-hoPguQK7nCDE9ybjwLafNlGMB8w= + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -2687,7 +4233,7 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -tough-cookie@^4.0.0: +tough-cookie@^4.0.0, tough-cookie@^4.1.2: version "4.1.2" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" integrity sha1-5T6EuF8k4LZd1Sb0ZijbbIX2uHQ= @@ -2697,6 +4243,13 @@ tough-cookie@^4.0.0: universalify "^0.2.0" url-parse "^1.5.3" +tr46@^3.0.0: + version "3.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" + integrity sha1-VVxOKXqVBhfo7t3vYzyH1NnWy/k= + dependencies: + punycode "^2.1.1" + tr46@~0.0.3: version "0.0.3" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -2731,11 +4284,28 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-check@~0.3.2: + version "0.3.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw= + type-fest@^0.20.2: version "0.20.2" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha1-G/IH9LKPkVg2ZstfvTJ4hzAc1fQ= +type-fest@^0.21.3: + version "0.21.3" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha1-0mCiSwGYQ24TP6JqUkptZfo7Ljc= + typescript@^4.5.4: version "4.9.5" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" @@ -2770,9 +4340,9 @@ universalify@^0.2.0: integrity sha1-ZFF2BWb6hXU0dFqx3elS0bF2G+A= update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha1-D1S4dlRXJvF9AM2aJWHm2t6UP/M= + version "1.0.11" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha1-mipkGtKQeuezYWUG9Ll3hR21uUA= dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -2792,6 +4362,34 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" +uuid@^8.3.2: + version "8.3.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha1-gNW1ztJxu5r2xEXyGhoExgbO++I= + +v8-to-istanbul@^9.0.1: + version "9.1.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" + integrity sha1-G4PtTjl/WMhcJmpXD8JVi1/rkmU= + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + +w3c-xmlserializer@^4.0.0: + version "4.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + integrity sha1-rr3ISSDYBiIpNuPNzkCOMkiKMHM= + dependencies: + xml-name-validator "^4.0.0" + +walker@^1.0.8: + version "1.0.8" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha1-vUmNtHev5XPcBBhfAR06uKjXZT8= + dependencies: + makeerror "1.0.12" + watchpack@^2.4.0: version "2.4.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" @@ -2805,6 +4403,11 @@ webidl-conversions@^3.0.0: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + integrity sha1-JWtOGIK+feu/AdBfCqIDl3jqCAo= + webpack-cli@^4.9.2: version "4.10.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" @@ -2837,21 +4440,21 @@ webpack-sources@^3.2.3: integrity sha1-LU2quEUf1LJAzCcFX/agwszqDN4= webpack@^5.72.1: - version "5.75.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/webpack/-/webpack-5.75.0.tgz#1e440468647b2505860e94c9ff3e44d5b582c152" - integrity sha1-HkQEaGR7JQWGDpTJ/z5E1bWCwVI= + version "5.82.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/webpack/-/webpack-5.82.1.tgz#8f38c78e53467556e8a89054ebd3ef6e9f67dbab" + integrity sha1-jzjHjlNGdVboqJBU69Pvbp9n26s= dependencies: "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" acorn "^8.7.1" acorn-import-assertions "^1.7.6" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" + enhanced-resolve "^5.14.0" + es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" @@ -2860,12 +4463,32 @@ webpack@^5.72.1: loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.0" + schema-utils "^3.1.2" tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" + terser-webpack-plugin "^5.3.7" watchpack "^2.4.0" webpack-sources "^3.2.3" +whatwg-encoding@^2.0.0: + version "2.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + integrity sha1-52NfWX/YcCCFhiaAWicp+naYrFM= + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + integrity sha1-X6GnYjhn/xr2yj3HKta4pCCL66c= + +whatwg-url@^11.0.0: + version "11.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" + integrity sha1-CoSe67X68hGbkBu3b9eVwoSNQBg= + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -2882,11 +4505,11 @@ which@^2.0.1: isexe "^2.0.0" wildcard@^2.0.0: - version "2.0.0" - resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha1-p30g5SAMb6qsl55LOq3Hs91/j+w= + version "2.0.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha1-WrENAkhxmJVINrY0n3T/+WHhD2c= -word-wrap@^1.2.3: +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha1-YQY29rH3A4kb00dxzLF/uTtHB5w= @@ -2905,11 +4528,39 @@ wrappy@1: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha1-qd8Brlt3hYoCf9LoB2juQzVV/P0= + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + ws@^7.4.5: version "7.5.9" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha1-VPp9sp9MfOxosd3TqJ3gmZQrtZE= +ws@^8.11.0: + version "8.13.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha1-mp+5L5PPQVEqBzXI9N0JuKEhHNA= + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + integrity sha1-eaAG4uYxSahgDxVDDwpHJdFSSDU= + +xml@^1.0.1: + version "1.0.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" + integrity sha1-eLpyAgApxbyHuKgaPPzXS0ovweU= + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha1-Bg/hvLf5x2/ioX24apvDq4lCEMs= + y18n@^5.0.5: version "5.0.8" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -2930,6 +4581,11 @@ yargs-parser@^20.2.2: resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha1-LrfcOwKJcY/ClfNidThFxBoMlO4= +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha1-kJa87r+ZDSG7MfqVFuDt4pSnfTU= + yargs@^16.2.0: version "16.2.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" @@ -2943,6 +4599,19 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.3.1: + version "17.7.2" + resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha1-mR3zmspnWhkrgW4eA2P5110qomk= + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" diff --git a/src/Components/test/E2ETest/ServerRenderingTests/StreamingRenderingTest.cs b/src/Components/test/E2ETest/ServerRenderingTests/StreamingRenderingTest.cs index 9210d566a504..9fad0a29a14f 100644 --- a/src/Components/test/E2ETest/ServerRenderingTests/StreamingRenderingTest.cs +++ b/src/Components/test/E2ETest/ServerRenderingTests/StreamingRenderingTest.cs @@ -65,4 +65,28 @@ public void CanPerformStreamingRendering() Browser.FindElement(By.Id("end-response-link")).Click(); Browser.Equal("Finished", () => getStatusText().Text); } + + [Fact] + public void RetainsDomNodesDuringStreamingRenderingUpdates() + { + Navigate($"{ServerPathBase}/streaming"); + + // Initial "waiting" state + var originalH1Elem = Browser.Exists(By.TagName("h1")); + var originalStatusElem = Browser.Exists(By.Id("status")); + Assert.Equal("Streaming Rendering", originalH1Elem.Text); + Assert.Equal("Waiting for more...", originalStatusElem.Text); + + // Add an item; see the old elements were retained + Browser.FindElement(By.Id("add-item-link")).Click(); + var originalLi = Browser.Exists(By.TagName("li")); + Assert.Equal(originalH1Elem.Location, Browser.Exists(By.TagName("h1")).Location); + Assert.Equal(originalStatusElem.Location, Browser.Exists(By.Id("status")).Location); + + // Make a further change; see elements (including dynamically added ones) are still retained + // even if their text was updated + Browser.FindElement(By.Id("end-response-link")).Click(); + Browser.Equal("Finished", () => originalStatusElem.Text); + Assert.Equal(originalLi.Location, Browser.Exists(By.TagName("li")).Location); + } } From 74bd96325a9bce4834da0dfed5e28e8f990a6477 Mon Sep 17 00:00:00 2001 From: Thays Grazia Date: Tue, 20 Jun 2023 12:38:26 -0300 Subject: [PATCH 17/38] [wasm][debugging] Enable debugging when Device Toolbar is enabled and Iphone is selected (#48527) * Enable debugging when Device Toolbar is enabled and Iphone is selected * fix change --- src/Components/Web.JS/src/Platform/Mono/MonoDebugger.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Components/Web.JS/src/Platform/Mono/MonoDebugger.ts b/src/Components/Web.JS/src/Platform/Mono/MonoDebugger.ts index 2f1ddfbb1e28..57cd33de460a 100644 --- a/src/Components/Web.JS/src/Platform/Mono/MonoDebugger.ts +++ b/src/Components/Web.JS/src/Platform/Mono/MonoDebugger.ts @@ -6,7 +6,7 @@ import { WebAssemblyResourceLoader } from '../WebAssemblyResourceLoader'; const navigatorUA = navigator as MonoNavigatorUserAgent; const brands = navigatorUA.userAgentData && navigatorUA.userAgentData.brands; // eslint-disable-next-line @typescript-eslint/no-explicit-any -const currentBrowserIsChromeOrEdge = brands +const currentBrowserIsChromeOrEdge = brands && brands.length > 0 ? brands.some(b => b.brand === 'Google Chrome' || b.brand === 'Microsoft Edge' || b.brand === 'Chromium') : (window as any).chrome; const platform = navigatorUA.userAgentData?.platform ?? navigator.platform; From 6e515a2c51748b64994cfc12864008a3ee5568f8 Mon Sep 17 00:00:00 2001 From: Surayya Huseyn Zada <114938397+surayya-MS@users.noreply.github.com> Date: Tue, 20 Jun 2023 17:42:29 +0200 Subject: [PATCH 18/38] Sections with other features (#48518) * Added LogicalParentComponentState to fix how CascadingParameters, ErrorBoundary and StreamingRendering interact with Sections * Changed the way SectionOutlet renders content --------- Co-authored-by: Steve Sanderson --- .../Components/src/CascadingParameterState.cs | 2 +- .../Components/src/PublicAPI.Unshipped.txt | 1 + .../Components/src/RenderTree/Renderer.cs | 5 +- .../src/Rendering/ComponentState.cs | 21 ++++ .../src/Sections/ISectionContentProvider.cs | 9 -- .../src/Sections/ISectionContentSubscriber.cs | 9 -- .../Components/src/Sections/SectionContent.cs | 6 +- .../Components/src/Sections/SectionOutlet.cs | 55 +++++++-- .../src/Sections/SectionRegistry.cs | 32 ++--- .../src/Rendering/EndpointComponentState.cs | 2 +- .../SectionsWithStreamingRenderingTest.cs | 68 +++++++++++ .../test/E2ETest/Tests/SectionsTest.cs | 12 +- .../SectionsWithCascadingParametersTest.cs | 110 ++++++++++++++++++ .../Tests/SectionsWithErrorBoundaryTest.cs | 107 +++++++++++++++++ .../test/testassets/BasicTestApp/Index.razor | 2 + .../ComponentThatThrowsException.razor | 2 + .../SectionsWithCascadingParameters.razor | 56 +++++++++ .../SectionsWithErrorBoundary.razor | 58 +++++++++ .../TextComponentWithCascadingParameter.razor | 9 ++ .../RazorComponentEndpointsStartup.cs | 2 +- .../Components/DisableStreaming.razor | 5 + .../Components/EnableStreaming.razor | 5 + ...otEnabledStreamingRenderingComponent.razor | 70 +++++++++++ .../SectionsWithStreamingRendering.razor | 21 ++++ .../Pages/StreamingRendering.razor | 71 +---------- 25 files changed, 616 insertions(+), 124 deletions(-) delete mode 100644 src/Components/Components/src/Sections/ISectionContentProvider.cs delete mode 100644 src/Components/Components/src/Sections/ISectionContentSubscriber.cs create mode 100644 src/Components/test/E2ETest/ServerRenderingTests/SectionsWithStreamingRenderingTest.cs create mode 100644 src/Components/test/E2ETest/Tests/SectionsWithCascadingParametersTest.cs create mode 100644 src/Components/test/E2ETest/Tests/SectionsWithErrorBoundaryTest.cs create mode 100644 src/Components/test/testassets/BasicTestApp/SectionsTest/ComponentThatThrowsException.razor create mode 100644 src/Components/test/testassets/BasicTestApp/SectionsTest/SectionsWithCascadingParameters.razor create mode 100644 src/Components/test/testassets/BasicTestApp/SectionsTest/SectionsWithErrorBoundary.razor create mode 100644 src/Components/test/testassets/BasicTestApp/SectionsTest/TextComponentWithCascadingParameter.razor create mode 100644 src/Components/test/testassets/Components.TestServer/RazorComponents/Components/DisableStreaming.razor create mode 100644 src/Components/test/testassets/Components.TestServer/RazorComponents/Components/EnableStreaming.razor create mode 100644 src/Components/test/testassets/Components.TestServer/RazorComponents/Components/NotEnabledStreamingRenderingComponent.razor create mode 100644 src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/SectionsWithStreamingRendering.razor diff --git a/src/Components/Components/src/CascadingParameterState.cs b/src/Components/Components/src/CascadingParameterState.cs index 1c9b95b720b4..da3ba05c5dc4 100644 --- a/src/Components/Components/src/CascadingParameterState.cs +++ b/src/Components/Components/src/CascadingParameterState.cs @@ -65,7 +65,7 @@ public static IReadOnlyList FindCascadingParameters(Com return valueSupplier; } - candidate = candidate.ParentComponentState; + candidate = candidate.LogicalParentComponentState; } while (candidate != null); // No match diff --git a/src/Components/Components/src/PublicAPI.Unshipped.txt b/src/Components/Components/src/PublicAPI.Unshipped.txt index f37e9e93b125..b751281fb1ca 100644 --- a/src/Components/Components/src/PublicAPI.Unshipped.txt +++ b/src/Components/Components/src/PublicAPI.Unshipped.txt @@ -41,6 +41,7 @@ Microsoft.AspNetCore.Components.ParameterView.ToDictionary() -> System.Collectio Microsoft.AspNetCore.Components.RenderHandle.DispatchExceptionAsync(System.Exception! exception) -> System.Threading.Tasks.Task! *REMOVED*Microsoft.AspNetCore.Components.NavigationManager.ToAbsoluteUri(string! relativeUri) -> System.Uri! Microsoft.AspNetCore.Components.NavigationManager.ToAbsoluteUri(string? relativeUri) -> System.Uri! +Microsoft.AspNetCore.Components.Rendering.ComponentState.LogicalParentComponentState.get -> Microsoft.AspNetCore.Components.Rendering.ComponentState? Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.SetEventHandlerName(string! eventHandlerName) -> void *REMOVED*Microsoft.AspNetCore.Components.RouteData.RouteData(System.Type! pageType, System.Collections.Generic.IReadOnlyDictionary! routeValues) -> void *REMOVED*Microsoft.AspNetCore.Components.RouteData.RouteValues.get -> System.Collections.Generic.IReadOnlyDictionary! diff --git a/src/Components/Components/src/RenderTree/Renderer.cs b/src/Components/Components/src/RenderTree/Renderer.cs index 9262cb7423c4..badbcb669daf 100644 --- a/src/Components/Components/src/RenderTree/Renderer.cs +++ b/src/Components/Components/src/RenderTree/Renderer.cs @@ -126,6 +126,9 @@ private static IComponentActivator GetComponentActivatorOrDefault(IServiceProvid protected ComponentState GetComponentState(int componentId) => GetRequiredComponentState(componentId); + internal ComponentState GetComponentState(IComponent component) + => _componentStateByComponent.GetValueOrDefault(component); + private async void RenderRootComponentsOnHotReload() { // Before re-rendering the root component, also clear any well-known caches in the framework @@ -1038,7 +1041,7 @@ private void HandleExceptionViaErrorBoundary(Exception error, ComponentState? er return; // Handled successfully } - candidate = candidate.ParentComponentState; + candidate = candidate.LogicalParentComponentState; } // It's unhandled, so treat as fatal diff --git a/src/Components/Components/src/Rendering/ComponentState.cs b/src/Components/Components/src/Rendering/ComponentState.cs index c2b9276485a1..a98adba82b0f 100644 --- a/src/Components/Components/src/Rendering/ComponentState.cs +++ b/src/Components/Components/src/Rendering/ComponentState.cs @@ -3,6 +3,7 @@ using System.Diagnostics; using Microsoft.AspNetCore.Components.RenderTree; +using Microsoft.AspNetCore.Components.Sections; namespace Microsoft.AspNetCore.Components.Rendering; @@ -34,6 +35,9 @@ public ComponentState(Renderer renderer, int componentId, IComponent component, ComponentId = componentId; ParentComponentState = parentComponentState; Component = component ?? throw new ArgumentNullException(nameof(component)); + LogicalParentComponentState = component is SectionOutlet.SectionOutletContentRenderer + ? (GetSectionOutletLogicalParent(renderer, (SectionOutlet)parentComponentState!.Component) ?? parentComponentState) + : parentComponentState; _renderer = renderer ?? throw new ArgumentNullException(nameof(renderer)); _cascadingParameters = CascadingParameterState.FindCascadingParameters(this); CurrentRenderTree = new RenderTreeBuilder(); @@ -46,6 +50,18 @@ public ComponentState(Renderer renderer, int componentId, IComponent component, } } + private static ComponentState? GetSectionOutletLogicalParent(Renderer renderer, SectionOutlet sectionOutlet) + { + // This will return null if the SectionOutlet is not currently rendering any content + if (sectionOutlet.CurrentLogicalParent is { } logicalParent + && renderer.GetComponentState(logicalParent) is { } logicalParentComponentState) + { + return logicalParentComponentState; + } + + return null; + } + /// /// Gets the component ID. /// @@ -61,6 +77,11 @@ public ComponentState(Renderer renderer, int componentId, IComponent component, /// public ComponentState? ParentComponentState { get; } + /// + /// Gets the of the logical parent component, or null if this is a root component. + /// + public ComponentState? LogicalParentComponentState { get; } + internal RenderTreeBuilder CurrentRenderTree { get; set; } internal void RenderIntoBatch(RenderBatchBuilder batchBuilder, RenderFragment renderFragment, out Exception? renderFragmentException) diff --git a/src/Components/Components/src/Sections/ISectionContentProvider.cs b/src/Components/Components/src/Sections/ISectionContentProvider.cs deleted file mode 100644 index 093e4f8e06b3..000000000000 --- a/src/Components/Components/src/Sections/ISectionContentProvider.cs +++ /dev/null @@ -1,9 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -namespace Microsoft.AspNetCore.Components.Sections; - -internal interface ISectionContentProvider -{ - RenderFragment? Content { get; } -} diff --git a/src/Components/Components/src/Sections/ISectionContentSubscriber.cs b/src/Components/Components/src/Sections/ISectionContentSubscriber.cs deleted file mode 100644 index eb87f5557465..000000000000 --- a/src/Components/Components/src/Sections/ISectionContentSubscriber.cs +++ /dev/null @@ -1,9 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -namespace Microsoft.AspNetCore.Components.Sections; - -internal interface ISectionContentSubscriber -{ - void ContentChanged(RenderFragment? content); -} diff --git a/src/Components/Components/src/Sections/SectionContent.cs b/src/Components/Components/src/Sections/SectionContent.cs index 6929434b4292..c2d402ff6d97 100644 --- a/src/Components/Components/src/Sections/SectionContent.cs +++ b/src/Components/Components/src/Sections/SectionContent.cs @@ -6,7 +6,7 @@ namespace Microsoft.AspNetCore.Components.Sections; /// /// Provides content to components with matching s. /// -public sealed class SectionContent : ISectionContentProvider, IComponent, IDisposable +public sealed class SectionContent : IComponent, IDisposable { private object? _registeredIdentifier; private bool? _registeredIsDefaultContent; @@ -35,8 +35,6 @@ public sealed class SectionContent : ISectionContentProvider, IComponent, IDispo /// [Parameter] public RenderFragment? ChildContent { get; set; } - RenderFragment? ISectionContentProvider.Content => ChildContent; - void IComponent.Attach(RenderHandle renderHandle) { _registry = renderHandle.Dispatcher.SectionRegistry; @@ -79,7 +77,7 @@ Task IComponent.SetParametersAsync(ParameterView parameters) _registeredIsDefaultContent = IsDefaultContent; } - _registry.NotifyContentChanged(identifier, this); + _registry.NotifyContentProviderChanged(identifier, this); return Task.CompletedTask; } diff --git a/src/Components/Components/src/Sections/SectionOutlet.cs b/src/Components/Components/src/Sections/SectionOutlet.cs index f8595f8f1d35..89b014d907d7 100644 --- a/src/Components/Components/src/Sections/SectionOutlet.cs +++ b/src/Components/Components/src/Sections/SectionOutlet.cs @@ -1,20 +1,20 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using Microsoft.AspNetCore.Components.Rendering; + namespace Microsoft.AspNetCore.Components.Sections; /// /// Renders content provided by components with matching s. /// -[StreamRendering(true)] // Because the content may be provided by a streaming component -public sealed class SectionOutlet : ISectionContentSubscriber, IComponent, IDisposable +public sealed class SectionOutlet : IComponent, IDisposable { private static readonly RenderFragment _emptyRenderFragment = _ => { }; - private object? _subscribedIdentifier; private RenderHandle _renderHandle; private SectionRegistry _registry = default!; - private RenderFragment? _content; + private SectionContent? _currentContentProvider; /// /// Gets or sets the ID that determines which instances will provide @@ -28,6 +28,8 @@ public sealed class SectionOutlet : ISectionContentSubscriber, IComponent, IDisp /// [Parameter] public object? SectionId { get; set; } + internal IComponent? CurrentLogicalParent => _currentContentProvider; + void IComponent.Attach(RenderHandle renderHandle) { _renderHandle = renderHandle; @@ -73,9 +75,9 @@ Task IComponent.SetParametersAsync(ParameterView parameters) return Task.CompletedTask; } - void ISectionContentSubscriber.ContentChanged(RenderFragment? content) + internal void ContentUpdated(SectionContent? provider) { - _content = content; + _currentContentProvider = provider; RenderContent(); } @@ -89,7 +91,17 @@ private void RenderContent() return; } - _renderHandle.Render(_content ?? _emptyRenderFragment); + _renderHandle.Render(BuildRenderTree); + } + + private void BuildRenderTree(RenderTreeBuilder builder) + { + var fragment = _currentContentProvider?.ChildContent ?? _emptyRenderFragment; + + builder.OpenComponent(0); + builder.SetKey(fragment); + builder.AddComponentParameter(1, SectionOutletContentRenderer.ContentParameterName, fragment); + builder.CloseComponent(); } /// @@ -100,4 +112,33 @@ public void Dispose() _registry.Unsubscribe(_subscribedIdentifier); } } + + // This component simply renders the RenderFragment it is given + // The reason for rendering SectionOutlet output via this component is so that + // [1] We can use @key to guarantee that we only preserve descendant component + // instances when they come from the same SectionContent, not unrelated ones + // [2] We know that whenever the SectionContent is changed to another one, there + // will be a new ComponentState established to represent this intermediate + // component, and it will already have the correct LogicalParentComponentState + // so anything computed from this (e.g., whether or not streaming rendering is + // enabled) will be freshly re-evaluated, without that information having to + // change in place on an existing ComponentState. + internal sealed class SectionOutletContentRenderer : IComponent + { + public const string ContentParameterName = "content"; + + private RenderHandle _renderHandle; + + public void Attach(RenderHandle renderHandle) + { + _renderHandle = renderHandle; + } + + public Task SetParametersAsync(ParameterView parameters) + { + var fragment = parameters.GetValueOrDefault(ContentParameterName)!; + _renderHandle.Render(fragment); + return Task.CompletedTask; + } + } } diff --git a/src/Components/Components/src/Sections/SectionRegistry.cs b/src/Components/Components/src/Sections/SectionRegistry.cs index 3e5a0908c5d1..d722034cf993 100644 --- a/src/Components/Components/src/Sections/SectionRegistry.cs +++ b/src/Components/Components/src/Sections/SectionRegistry.cs @@ -5,10 +5,10 @@ namespace Microsoft.AspNetCore.Components.Sections; internal sealed class SectionRegistry { - private readonly Dictionary _subscribersByIdentifier = new(); - private readonly Dictionary> _providersByIdentifier = new(); + private readonly Dictionary _subscribersByIdentifier = new(); + private readonly Dictionary> _providersByIdentifier = new(); - public void AddProvider(object identifier, ISectionContentProvider provider, bool isDefaultProvider) + public void AddProvider(object identifier, SectionContent provider, bool isDefaultProvider) { if (!_providersByIdentifier.TryGetValue(identifier, out var providers)) { @@ -26,7 +26,7 @@ public void AddProvider(object identifier, ISectionContentProvider provider, boo } } - public void RemoveProvider(object identifier, ISectionContentProvider provider) + public void RemoveProvider(object identifier, SectionContent provider) { if (!_providersByIdentifier.TryGetValue(identifier, out var providers)) { @@ -46,12 +46,12 @@ public void RemoveProvider(object identifier, ISectionContentProvider provider) { // We just removed the most recently added provider, meaning we need to change // the current content to that of second most recently added provider. - var content = GetCurrentProviderContentOrDefault(providers); - NotifyContentChangedForSubscriber(identifier, content); + var contentProvider = GetCurrentProviderContentOrDefault(providers); + NotifyContentChangedForSubscriber(identifier, contentProvider); } } - public void Subscribe(object identifier, ISectionContentSubscriber subscriber) + public void Subscribe(object identifier, SectionOutlet subscriber) { if (_subscribersByIdentifier.ContainsKey(identifier)) { @@ -59,8 +59,8 @@ public void Subscribe(object identifier, ISectionContentSubscriber subscriber) } // Notify the new subscriber with any existing content. - var content = GetCurrentProviderContentOrDefault(identifier); - subscriber.ContentChanged(content); + var provider = GetCurrentProviderContentOrDefault(identifier); + subscriber.ContentUpdated(provider); _subscribersByIdentifier.Add(identifier, subscriber); } @@ -73,7 +73,7 @@ public void Unsubscribe(object identifier) } } - public void NotifyContentChanged(object identifier, ISectionContentProvider provider) + public void NotifyContentProviderChanged(object identifier, SectionContent provider) { if (!_providersByIdentifier.TryGetValue(identifier, out var providers)) { @@ -84,25 +84,25 @@ public void NotifyContentChanged(object identifier, ISectionContentProvider prov // most recently added provider changes. if (providers.Count != 0 && providers[^1] == provider) { - NotifyContentChangedForSubscriber(identifier, provider.Content); + NotifyContentChangedForSubscriber(identifier, provider); } } - private static RenderFragment? GetCurrentProviderContentOrDefault(List providers) + private static SectionContent? GetCurrentProviderContentOrDefault(List providers) => providers.Count != 0 - ? providers[^1].Content + ? providers[^1] : null; - private RenderFragment? GetCurrentProviderContentOrDefault(object identifier) + private SectionContent? GetCurrentProviderContentOrDefault(object identifier) => _providersByIdentifier.TryGetValue(identifier, out var existingList) ? GetCurrentProviderContentOrDefault(existingList) : null; - private void NotifyContentChangedForSubscriber(object identifier, RenderFragment? content) + private void NotifyContentChangedForSubscriber(object identifier, SectionContent? provider) { if (_subscribersByIdentifier.TryGetValue(identifier, out var subscriber)) { - subscriber.ContentChanged(content); + subscriber.ContentUpdated(provider); } } } diff --git a/src/Components/Endpoints/src/Rendering/EndpointComponentState.cs b/src/Components/Endpoints/src/Rendering/EndpointComponentState.cs index 784ec09bcb1d..5ff3e11be8fe 100644 --- a/src/Components/Endpoints/src/Rendering/EndpointComponentState.cs +++ b/src/Components/Endpoints/src/Rendering/EndpointComponentState.cs @@ -28,7 +28,7 @@ public EndpointComponentState(Renderer renderer, int componentId, IComponent com } else { - var parentEndpointComponentState = (EndpointComponentState?)parentComponentState; + var parentEndpointComponentState = (EndpointComponentState?)LogicalParentComponentState; StreamRendering = parentEndpointComponentState?.StreamRendering ?? false; } } diff --git a/src/Components/test/E2ETest/ServerRenderingTests/SectionsWithStreamingRenderingTest.cs b/src/Components/test/E2ETest/ServerRenderingTests/SectionsWithStreamingRenderingTest.cs new file mode 100644 index 000000000000..914655379abf --- /dev/null +++ b/src/Components/test/E2ETest/ServerRenderingTests/SectionsWithStreamingRenderingTest.cs @@ -0,0 +1,68 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Components.TestServer.RazorComponents; +using Microsoft.AspNetCore.Components.E2ETest.Infrastructure; +using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures; +using Microsoft.AspNetCore.E2ETesting; +using OpenQA.Selenium; +using TestServer; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Components.E2ETests.ServerRenderingTests; + +public class SectionsWithStreamingRenderingTest : ServerTestBase>> +{ + public SectionsWithStreamingRenderingTest( + BrowserFixture browserFixture, + BasicTestAppServerSiteFixture> serverFixture, + ITestOutputHelper output) + : base(browserFixture, serverFixture, output) + { + } + + public override Task InitializeAsync() + => InitializeAsync(BrowserFixture.StreamingContext); + + [Fact] + public void StreamingRenderingForSectionOutletContentIsDeterminedByMatchingSectionContent() + { + Navigate($"{ServerPathBase}/sections-with-streaming"); + + Browser.Equal("Sections with Streaming", () => Browser.Exists(By.TagName("h1")).Text); + + // Second SectionContent overrides the content and StreamingRendering attribute for SectionOutlet + + Browser.DoesNotExist(By.Id("first-section-content")); + + CanPerformStreamingRendering(); + } + + private void CanPerformStreamingRendering() + { + // Initial "waiting" state + var getStatusText = () => Browser.Exists(By.Id("status")); + var getDisplayedItems = () => Browser.FindElements(By.TagName("li")); + Assert.Equal("Waiting for more...", getStatusText().Text); + Assert.Empty(getDisplayedItems()); + + // Can add items + for (var i = 1; i <= 3; i++) + { + // Each time we click, there's another streaming render batch and the UI is updated + Browser.FindElement(By.Id("add-item-link")).Click(); + Browser.Collection(getDisplayedItems, Enumerable.Range(1, i).Select>(index => + { + return actualItem => Assert.Equal($"Item {index}", actualItem.Text); + }).ToArray()); + Assert.Equal("Waiting for more...", getStatusText().Text); + + // These are insta-removed so they don't pollute anything + Browser.DoesNotExist(By.TagName("blazor-ssr")); + } + + // Can finish the response + Browser.FindElement(By.Id("end-response-link")).Click(); + Browser.Equal("Finished", () => getStatusText().Text); + } +} diff --git a/src/Components/test/E2ETest/Tests/SectionsTest.cs b/src/Components/test/E2ETest/Tests/SectionsTest.cs index 14766324bd13..7dcfc25e2d2d 100644 --- a/src/Components/test/E2ETest/Tests/SectionsTest.cs +++ b/src/Components/test/E2ETest/Tests/SectionsTest.cs @@ -31,7 +31,7 @@ protected override void InitializeAsyncCore() } [Fact] - public void RenderTwoSectionOutletsWithSameSectionId_TrowsException() + public void RenderTwoSectionOutletsWithSameSectionId_ThrowsException() { _appElement.FindElement(By.Id("section-outlet-same-id")).Click(); @@ -43,7 +43,7 @@ public void RenderTwoSectionOutletsWithSameSectionId_TrowsException() } [Fact] - public void RenderTwoSectionOutletsWithSameSectionName_TrowsException() + public void RenderTwoSectionOutletsWithSameSectionName_ThrowsException() { _appElement.FindElement(By.Id("section-outlet-same-name")).Click(); @@ -55,7 +55,7 @@ public void RenderTwoSectionOutletsWithSameSectionName_TrowsException() } [Fact] - public void RenderTwoSectionOutletsWithEqualSectionNameToSectionId_TrowsException() + public void RenderTwoSectionOutletsWithEqualSectionNameToSectionId_ThrowsException() { _appElement.FindElement(By.Id("section-outlet-equal-name-id")).Click(); @@ -67,7 +67,7 @@ public void RenderTwoSectionOutletsWithEqualSectionNameToSectionId_TrowsExceptio } [Fact] - public void RenderSectionOutletWithSectionNameAndSectionId_TrowsException() + public void RenderSectionOutletWithSectionNameAndSectionId_ThrowsException() { _appElement.FindElement(By.Id("section-outlet-with-name-id")).Click(); @@ -79,7 +79,7 @@ public void RenderSectionOutletWithSectionNameAndSectionId_TrowsException() } [Fact] - public void RenderSectionOutletWithoutSectionNameAndSectionId_TrowsException() + public void RenderSectionOutletWithoutSectionNameAndSectionId_ThrowsException() { _appElement.FindElement(By.Id("section-outlet-without-name-id")).Click(); @@ -156,7 +156,7 @@ public void SectionContentWithSectionNameGetsDisposed_OldSectionOutletNoLongerRe } [Fact] - public void SectionOutletWithSectionNameGetsDisposed_ContentDissapears() + public void SectionOutletWithSectionNameGetsDisposed_ContentDisappears() { // Render Counter and change its id so the content is rendered in second SectionOutlet _appElement.FindElement(By.Id("counter-render-section-content")).Click(); diff --git a/src/Components/test/E2ETest/Tests/SectionsWithCascadingParametersTest.cs b/src/Components/test/E2ETest/Tests/SectionsWithCascadingParametersTest.cs new file mode 100644 index 000000000000..a0a010122c16 --- /dev/null +++ b/src/Components/test/E2ETest/Tests/SectionsWithCascadingParametersTest.cs @@ -0,0 +1,110 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using BasicTestApp; +using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures; +using Microsoft.AspNetCore.Components.E2ETest.Infrastructure; +using Microsoft.AspNetCore.E2ETesting; +using Xunit.Abstractions; +using Microsoft.AspNetCore.Components.E2ETest; +using OpenQA.Selenium; +using Microsoft.AspNetCore.Components.Sections; + +namespace Microsoft.AspNetCore.Components.E2ETests.Tests; + +public class SectionsWithCascadingParametersTest : ServerTestBase> +{ + public SectionsWithCascadingParametersTest + (BrowserFixture browserFixture, + ToggleExecutionModeServerFixture serverFixture, + ITestOutputHelper output) + : base(browserFixture, serverFixture, output) + { + } + + protected override void InitializeAsyncCore() + { + Navigate(ServerPathBase, noReload: _serverFixture.ExecutionMode == ExecutionMode.Client); + Browser.MountTestComponent(); + } + + [Fact] + public void RenderSectionContent_CascadingParameterForSectionOutletIsDeterminedByMatchingSectionContent() + { + // Doesn't matter if SectionOutlet is rendered before or after SectionContent + Browser.FindElement(By.Id("render-section-outlet")).Click(); + Browser.FindElement(By.Id("render-second-section-content")).Click(); + + Browser.Equal("Second Section with additional text for second section", () => Browser.Exists(By.TagName("p")).Text); + } + + [Fact] + public void ChangeCascadingValueForSectionContent_CascadingValueForSectionOutletIsDeterminedByMatchingSectionContent() + { + Browser.FindElement(By.Id("render-first-section-content")).Click(); + Browser.FindElement(By.Id("render-section-outlet")).Click(); + + Browser.FindElement(By.Id("change-cascading-value")).Click(); + + Browser.Equal("First Section with additional text for second section", () => Browser.Exists(By.TagName("p")).Text); + } + + [Fact] + public void RenderTwoSectionContentsWithSameId_CascadingParameterForSectionOutletIsDeterminedByLastRenderedSectionContent() + { + Browser.FindElement(By.Id("render-second-section-content")).Click(); + Browser.FindElement(By.Id("render-first-section-content")).Click(); + Browser.FindElement(By.Id("render-section-outlet")).Click(); + + Browser.Equal("First Section with additional text for first section", () => Browser.Exists(By.TagName("p")).Text); + } + + [Fact] + public void SecondSectionContentIdChanged_CascadingParameterForSectionOutletIsDeterminedByFirstSectionContent() + { + Browser.FindElement(By.Id("render-section-outlet")).Click(); + Browser.FindElement(By.Id("render-first-section-content")).Click(); + Browser.FindElement(By.Id("render-second-section-content")).Click(); + + Browser.FindElement(By.Id("change-second-section-content-id")).Click(); + + Browser.Equal("First Section with additional text for first section", () => Browser.Exists(By.TagName("p")).Text); + } + + [Fact] + public void SecondSectionContentDisposed_CascadingParameterForSectionOutletIsDeterminedByFirstSectionContent() + { + Browser.FindElement(By.Id("render-first-section-content")).Click(); + Browser.FindElement(By.Id("render-second-section-content")).Click(); + Browser.FindElement(By.Id("render-section-outlet")).Click(); + + Browser.FindElement(By.Id("dispose-second-section-content")).Click(); + + Browser.Equal("First Section with additional text for first section", () => Browser.Exists(By.TagName("p")).Text); + } + + [Fact] + public void FirstSectionContentDisposedThenRenderSecondSectionContent_CascadingParameterForSectionOutletIsDeterminedBySecondSectionContent() + { + Browser.FindElement(By.Id("render-section-outlet")).Click(); + Browser.FindElement(By.Id("render-first-section-content")).Click(); + + Browser.FindElement(By.Id("dispose-first-section-content")).Click(); + Browser.FindElement(By.Id("render-second-section-content")).Click(); + + Browser.Equal("Second Section with additional text for second section", () => Browser.Exists(By.TagName("p")).Text); + } + + [Fact] + public void SectionOutletIdChanged_CascadingParameterForSectionOutletIsDeterminedByMatchingSectionContent() + { + Browser.FindElement(By.Id("render-section-outlet")).Click(); + Browser.FindElement(By.Id("render-first-section-content")).Click(); + Browser.FindElement(By.Id("change-second-section-content-id")).Click(); + Browser.FindElement(By.Id("render-second-section-content")).Click(); + + Browser.FindElement(By.Id("change-section-outlet-id")).Click(); + + Browser.Equal("Second Section with additional text for second section", () => Browser.Exists(By.TagName("p")).Text); + } +} diff --git a/src/Components/test/E2ETest/Tests/SectionsWithErrorBoundaryTest.cs b/src/Components/test/E2ETest/Tests/SectionsWithErrorBoundaryTest.cs new file mode 100644 index 000000000000..3bd735cac6f7 --- /dev/null +++ b/src/Components/test/E2ETest/Tests/SectionsWithErrorBoundaryTest.cs @@ -0,0 +1,107 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using BasicTestApp; +using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures; +using Microsoft.AspNetCore.Components.E2ETest.Infrastructure; +using Microsoft.AspNetCore.E2ETesting; +using Xunit.Abstractions; +using Microsoft.AspNetCore.Components.E2ETest; +using OpenQA.Selenium; +using Microsoft.AspNetCore.Components.Sections; + +namespace Microsoft.AspNetCore.Components.E2ETests.Tests; + +public class SectionsWithErrorBoundaryTest : ServerTestBase> +{ + public SectionsWithErrorBoundaryTest + (BrowserFixture browserFixture, + ToggleExecutionModeServerFixture serverFixture, + ITestOutputHelper output) + : base(browserFixture, serverFixture, output) + { + } + + protected override void InitializeAsyncCore() + { + Navigate(ServerPathBase, noReload: _serverFixture.ExecutionMode == ExecutionMode.Client); + Browser.MountTestComponent(); + } + + [Fact] + public void RenderSectionContent_ErrorBoundaryForSectionOutletContentIsDeterminedByMatchingSectionContent() + { + // Doesn't matter if SectionOutlet is rendered before or after SectionContent + Browser.FindElement(By.Id("render-section-outlet")).Click(); + Browser.FindElement(By.Id("render-second-section-content")).Click(); + + Browser.FindElement(By.Id("error-button")).Click(); + + Browser.Equal("Sorry!", () => Browser.Exists(By.TagName("p")).Text); + } + + [Fact] + public void RenderTwoSectionContentsWithSameId_ErrorBoundaryForSectionOutletIsDeterminedByLastRenderedSectionContent() + { + // show that after second sc error thrown then first is now rendered and is functional + Browser.FindElement(By.Id("render-second-section-content")).Click(); + Browser.FindElement(By.Id("render-first-section-content")).Click(); + Browser.FindElement(By.Id("render-section-outlet")).Click(); + + Browser.FindElement(By.Id("error-button")).Click(); + + Browser.Exists(By.ClassName("blazor-error-boundary")); + } + + [Fact] + public void SecondSectionContentIdChanged_ErrorBoundaryForSectionOutletIsDeterminedByFirstSectionContent() + { + Browser.FindElement(By.Id("render-second-section-content")).Click(); + Browser.FindElement(By.Id("render-first-section-content")).Click(); + Browser.FindElement(By.Id("render-section-outlet")).Click(); + + Browser.FindElement(By.Id("error-button")).Click(); + + Browser.Exists(By.ClassName("blazor-error-boundary")); + } + + [Fact] + public void SecondSectionContentDisposed_ErrorBoundaryForSectionOutletIsDeterminedByFirstSectionContent() + { + Browser.FindElement(By.Id("render-first-section-content")).Click(); + Browser.FindElement(By.Id("render-second-section-content")).Click(); + Browser.FindElement(By.Id("render-section-outlet")).Click(); + + Browser.FindElement(By.Id("dispose-second-section-content")).Click(); + Browser.FindElement(By.Id("error-button")).Click(); + + Browser.Exists(By.ClassName("blazor-error-boundary")); + } + + [Fact] + public void FirstSectionContentDisposedThenRenderSecondSectionContent_ErrorBoundaryForSectionOutletIsDeterminedBySecondSectionContent() + { + Browser.FindElement(By.Id("render-section-outlet")).Click(); + Browser.FindElement(By.Id("render-first-section-content")).Click(); + + Browser.FindElement(By.Id("dispose-first-section-content")).Click(); + Browser.FindElement(By.Id("render-second-section-content")).Click(); + Browser.FindElement(By.Id("error-button")).Click(); + + Browser.Equal("Sorry!", () => Browser.Exists(By.TagName("p")).Text); + } + + [Fact] + public void SectionOutletIdChanged_ErrorBoundaryForSectionOutletIsDeterminedByMatchingSectionContent() + { + Browser.FindElement(By.Id("render-section-outlet")).Click(); + Browser.FindElement(By.Id("render-first-section-content")).Click(); + Browser.FindElement(By.Id("change-second-section-content-id")).Click(); + Browser.FindElement(By.Id("render-second-section-content")).Click(); + + Browser.FindElement(By.Id("change-section-outlet-id")).Click(); + Browser.FindElement(By.Id("error-button")).Click(); + + Browser.Equal("Sorry!", () => Browser.Exists(By.TagName("p")).Text); + } +} diff --git a/src/Components/test/testassets/BasicTestApp/Index.razor b/src/Components/test/testassets/BasicTestApp/Index.razor index ef0d905db26f..97d0bf35d865 100644 --- a/src/Components/test/testassets/BasicTestApp/Index.razor +++ b/src/Components/test/testassets/BasicTestApp/Index.razor @@ -107,6 +107,8 @@ + + @System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription diff --git a/src/Components/test/testassets/BasicTestApp/SectionsTest/ComponentThatThrowsException.razor b/src/Components/test/testassets/BasicTestApp/SectionsTest/ComponentThatThrowsException.razor new file mode 100644 index 000000000000..154cb2cf4848 --- /dev/null +++ b/src/Components/test/testassets/BasicTestApp/SectionsTest/ComponentThatThrowsException.razor @@ -0,0 +1,2 @@ + + diff --git a/src/Components/test/testassets/BasicTestApp/SectionsTest/SectionsWithCascadingParameters.razor b/src/Components/test/testassets/BasicTestApp/SectionsTest/SectionsWithCascadingParameters.razor new file mode 100644 index 000000000000..dd2e1e8ca53d --- /dev/null +++ b/src/Components/test/testassets/BasicTestApp/SectionsTest/SectionsWithCascadingParameters.razor @@ -0,0 +1,56 @@ +@using Microsoft.AspNetCore.Components.Sections + + +
+ +
+ +
+ +
+ +
+ +
+ +
+ + +@if (SectionOutletIsRendered) +{ + +} + +@if (FirstSectionContentIsRendered) +{ + + + + + +} + +@if (SecondSectionContentIsRendered) +{ + + + + + +} + +@code { + private string AdditionalTextForFirstSection = "with additional text for first section"; + private string AdditionalTextForSecondSection = "with additional text for second section"; + + private bool FirstSectionContentIsRendered = false; + private bool SecondSectionContentIsRendered = false; + private bool SectionOutletIsRendered = false; + + private static string id = "csc-section-test"; + private static object anotherId = new(); + + private object SectionOutletId = id; + private object SecondSectionContentId = id; + +} diff --git a/src/Components/test/testassets/BasicTestApp/SectionsTest/SectionsWithErrorBoundary.razor b/src/Components/test/testassets/BasicTestApp/SectionsTest/SectionsWithErrorBoundary.razor new file mode 100644 index 000000000000..6edb00c7c309 --- /dev/null +++ b/src/Components/test/testassets/BasicTestApp/SectionsTest/SectionsWithErrorBoundary.razor @@ -0,0 +1,58 @@ +@using Microsoft.AspNetCore.Components.Sections + + +
+ +
+ +
+ +
+ +
+ +
+ + + +@if (SectionOutletIsRendered) +{ + +} + +@if (FirstSectionContentIsRendered) +{ + + +

First Section

+ +
+
+} + +@if (SecondSectionContentIsRendered) +{ + + + +

Second Section

+ +
+
+ +

Sorry!

+
+
+} + +@code { + private bool FirstSectionContentIsRendered = false; + private bool SecondSectionContentIsRendered = false; + private bool SectionOutletIsRendered = false; + + private static string id = "errb-section-test"; + private static object anotherId = new(); + + private object SectionOutletId = id; + private object SecondSectionContentId = id; +} diff --git a/src/Components/test/testassets/BasicTestApp/SectionsTest/TextComponentWithCascadingParameter.razor b/src/Components/test/testassets/BasicTestApp/SectionsTest/TextComponentWithCascadingParameter.razor new file mode 100644 index 000000000000..0000841c1322 --- /dev/null +++ b/src/Components/test/testassets/BasicTestApp/SectionsTest/TextComponentWithCascadingParameter.razor @@ -0,0 +1,9 @@ +

@Text @AdditionalText

+ +@code { + [Parameter] + public string Text { get; set; } + + [CascadingParameter] + public string AdditionalText { get; set; } +} diff --git a/src/Components/test/testassets/Components.TestServer/RazorComponentEndpointsStartup.cs b/src/Components/test/testassets/Components.TestServer/RazorComponentEndpointsStartup.cs index 0da1eb13c0cd..32c59cdf7420 100644 --- a/src/Components/test/testassets/Components.TestServer/RazorComponentEndpointsStartup.cs +++ b/src/Components/test/testassets/Components.TestServer/RazorComponentEndpointsStartup.cs @@ -54,7 +54,7 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) .AddServerRenderMode() .AddWebAssemblyRenderMode(); - StreamingRendering.MapEndpoints(endpoints); + NotEnabledStreamingRenderingComponent.MapEndpoints(endpoints); StreamingRenderingForm.MapEndpoints(endpoints); }); }); diff --git a/src/Components/test/testassets/Components.TestServer/RazorComponents/Components/DisableStreaming.razor b/src/Components/test/testassets/Components.TestServer/RazorComponents/Components/DisableStreaming.razor new file mode 100644 index 000000000000..b0f772fb506c --- /dev/null +++ b/src/Components/test/testassets/Components.TestServer/RazorComponents/Components/DisableStreaming.razor @@ -0,0 +1,5 @@ +@attribute [StreamRendering(false)] +@ChildContent +@code { + [Parameter] public RenderFragment ChildContent { get; set; } +} diff --git a/src/Components/test/testassets/Components.TestServer/RazorComponents/Components/EnableStreaming.razor b/src/Components/test/testassets/Components.TestServer/RazorComponents/Components/EnableStreaming.razor new file mode 100644 index 000000000000..01697350947a --- /dev/null +++ b/src/Components/test/testassets/Components.TestServer/RazorComponents/Components/EnableStreaming.razor @@ -0,0 +1,5 @@ +@attribute [StreamRendering(true)] +@ChildContent +@code { + [Parameter] public RenderFragment ChildContent { get; set; } +} diff --git a/src/Components/test/testassets/Components.TestServer/RazorComponents/Components/NotEnabledStreamingRenderingComponent.razor b/src/Components/test/testassets/Components.TestServer/RazorComponents/Components/NotEnabledStreamingRenderingComponent.razor new file mode 100644 index 000000000000..f4f30c154f10 --- /dev/null +++ b/src/Components/test/testassets/Components.TestServer/RazorComponents/Components/NotEnabledStreamingRenderingComponent.razor @@ -0,0 +1,70 @@ +@using System.IO.Pipelines; +@using System.Threading.Channels; + +

+ Every time you make a request to add item, we'll + add an item to this streaming response. +

+

+ Complete the response by visiting end response. +

+ +
    + @foreach (var item in items) + { +
  • @item
  • + } +
+ +

+ @if (finished) + { + Finished + } + else + { + Waiting for more... + } +

+ +@code { + // Caution: Don't use statics like this in real apps. This is only for an E2E test. If you did this + // in production, different users/requests could interfere with each other. + static Channel StreamingDataChannel; + static int StreamingDataChannelCount; + + const string AddItemUrl = "streaming/add-item"; + const string EndResponseUrl = "streaming/end-response"; + + bool finished; + List items = new(); + + protected override async Task OnInitializedAsync() + { + StreamingDataChannel = Channel.CreateUnbounded(); + StreamingDataChannelCount = 0; + + await foreach (var item in StreamingDataChannel.Reader.ReadAllAsync()) + { + items.Add(item); + StateHasChanged(); + } + + finished = true; + } + + public static void MapEndpoints(IEndpointRouteBuilder endpoints) + { + endpoints.MapGet(AddItemUrl, () => + { + StreamingDataChannel.Writer.TryWrite($"Item {++StreamingDataChannelCount}"); + return "Added item"; + }); + + endpoints.MapGet(EndResponseUrl, () => + { + StreamingDataChannel.Writer.Complete(); + return "Response ended"; + }); + } +} diff --git a/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/SectionsWithStreamingRendering.razor b/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/SectionsWithStreamingRendering.razor new file mode 100644 index 000000000000..5711e9bc577d --- /dev/null +++ b/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/SectionsWithStreamingRendering.razor @@ -0,0 +1,21 @@ +@page "/sections-with-streaming" +@using Microsoft.AspNetCore.Components.Sections + +

Sections with Streaming

+ + + + + + + +

First Section Content

+
+
+ + + + + + + diff --git a/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/StreamingRendering.razor b/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/StreamingRendering.razor index a15d7ec3793a..8baaa0bd6acc 100644 --- a/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/StreamingRendering.razor +++ b/src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/StreamingRendering.razor @@ -1,74 +1,7 @@ @page "/streaming" -@using System.IO.Pipelines; -@using System.Threading.Channels; + @attribute [StreamRendering(true)]

Streaming Rendering

-

- Every time you make a request to add item, we'll - add an item to this streaming response. -

-

- Complete the response by visiting end response. -

- -
    - @foreach (var item in items) - { -
  • @item
  • - } -
- -

- @if (finished) - { - Finished - } - else - { - Waiting for more... - } -

- -@code { - // Caution: Don't use statics like this in real apps. This is only for an E2E test. If you did this - // in production, different users/requests could interfere with each other. - static Channel StreamingDataChannel; - static int StreamingDataChannelCount; - - const string AddItemUrl = "streaming/add-item"; - const string EndResponseUrl = "streaming/end-response"; - - bool finished; - List items = new(); - - protected override async Task OnInitializedAsync() - { - StreamingDataChannel = Channel.CreateUnbounded(); - StreamingDataChannelCount = 0; - - await foreach (var item in StreamingDataChannel.Reader.ReadAllAsync()) - { - items.Add(item); - StateHasChanged(); - } - - finished = true; - } - - public static void MapEndpoints(IEndpointRouteBuilder endpoints) - { - endpoints.MapGet(AddItemUrl, () => - { - StreamingDataChannel.Writer.TryWrite($"Item {++StreamingDataChannelCount}"); - return "Added item"; - }); - - endpoints.MapGet(EndResponseUrl, () => - { - StreamingDataChannel.Writer.Complete(); - return "Response ended"; - }); - } -} + From 4f1e7fb977644b6f481a78d6d6baed847b34795f Mon Sep 17 00:00:00 2001 From: David Acker Date: Tue, 20 Jun 2023 12:35:01 -0400 Subject: [PATCH 19/38] Skip on Mono for non-NetFramework test (#48864) --- src/Testing/src/xunit/FrameworkSkipConditionAttribute.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Testing/src/xunit/FrameworkSkipConditionAttribute.cs b/src/Testing/src/xunit/FrameworkSkipConditionAttribute.cs index cf64bd2e8b63..7801849f91ed 100644 --- a/src/Testing/src/xunit/FrameworkSkipConditionAttribute.cs +++ b/src/Testing/src/xunit/FrameworkSkipConditionAttribute.cs @@ -32,13 +32,13 @@ private static bool CanRunOnThisFramework(RuntimeFrameworks excludedFrameworks) return true; } -#if NETFRAMEWORK if (excludedFrameworks.HasFlag(RuntimeFrameworks.Mono) && TestPlatformHelper.IsMono) { return false; } +#if NETFRAMEWORK if (excludedFrameworks.HasFlag(RuntimeFrameworks.CLR)) { return false; From 392a0902fe2293fd8ba23976c2c594f47fb05e2c Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Tue, 20 Jun 2023 11:12:33 -0700 Subject: [PATCH 20/38] Improve GetAuthenticationStateAsync exception message (#48812) --- .../Server/src/Circuits/ServerAuthenticationStateProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Components/Server/src/Circuits/ServerAuthenticationStateProvider.cs b/src/Components/Server/src/Circuits/ServerAuthenticationStateProvider.cs index b3d5b67f50d2..26e3512c177e 100644 --- a/src/Components/Server/src/Circuits/ServerAuthenticationStateProvider.cs +++ b/src/Components/Server/src/Circuits/ServerAuthenticationStateProvider.cs @@ -15,7 +15,7 @@ public class ServerAuthenticationStateProvider : AuthenticationStateProvider, IH /// public override Task GetAuthenticationStateAsync() => _authenticationStateTask - ?? throw new InvalidOperationException($"{nameof(GetAuthenticationStateAsync)} was called before {nameof(SetAuthenticationState)}."); + ?? throw new InvalidOperationException($"Do not call {nameof(GetAuthenticationStateAsync)} outside of the DI scope for a Razor component. Typically, this means you can call it only within a Razor component or inside another DI service that is resolved for a Razor component."); /// public void SetAuthenticationState(Task authenticationStateTask) From 32a8b7bc2288f062091ef68481c1e63b526c98c1 Mon Sep 17 00:00:00 2001 From: Iustin Date: Tue, 20 Jun 2023 22:49:36 +0300 Subject: [PATCH 21/38] Updated the AddPolicyRegistry extension methods to use TryAdd and TryAddEnumerable internally (#47821) * Added TryAddPolicyRegistry extension methods for IPolicyRegistry * Added missing using statement * Undone changes on PublicAPI.Shipped.txt * Added the TryAddPolicyRegistry extension methods to the PublicAPI.Unshipped.txt * Updated the AddPolicyRegistry extension methods to use TryAdd and TryAddEnumerable internally * Trigger again build pipeline * Updated the AddPolicyRegistry extension methods to fix failing unit tests * Updated the AddPolicyRegistry extension methods and added unit tests * Revert global.json changes * Revert global.json changes to latest version * Revert global.json changes to latest version * Fixed unit tests * Added missing using statement in unit tests * Updated only the parameterless AddPolicyRegistry overload to an add-if-missing operation * Cleanup. Added missing space --------- Co-authored-by: Iustin Micu --- .../PollyServiceCollectionExtensions.cs | 26 ++++++--- .../PollyHttpClientBuilderExtensionsTest.cs | 58 +++++++++++++++++++ 2 files changed, 76 insertions(+), 8 deletions(-) diff --git a/src/HttpClientFactory/Polly/src/DependencyInjection/PollyServiceCollectionExtensions.cs b/src/HttpClientFactory/Polly/src/DependencyInjection/PollyServiceCollectionExtensions.cs index a6e22291fe54..fa00c02d4bec 100644 --- a/src/HttpClientFactory/Polly/src/DependencyInjection/PollyServiceCollectionExtensions.cs +++ b/src/HttpClientFactory/Polly/src/DependencyInjection/PollyServiceCollectionExtensions.cs @@ -3,6 +3,7 @@ using System; using Polly.Registry; +using Microsoft.Extensions.DependencyInjection.Extensions; namespace Microsoft.Extensions.DependencyInjection; @@ -15,10 +16,11 @@ public static class PollyServiceCollectionExtensions /// /// Registers an empty in the service collection with service types /// , , and - /// and returns the newly created registry. + /// if the service types haven't already been registered + /// and returns the existing or newly created registry. /// /// The . - /// The newly created . + /// The existing or newly created . public static IPolicyRegistry AddPolicyRegistry(this IServiceCollection services) { if (services == null) @@ -26,13 +28,21 @@ public static IPolicyRegistry AddPolicyRegistry(this IServiceCollection throw new ArgumentNullException(nameof(services)); } - // Create an empty registry, register and return it as an instance. This is the best way to get a - // single instance registered using all the interfaces. - var registry = new PolicyRegistry(); + // Get existing registry or an empty instance + var registry = services.BuildServiceProvider().GetService>(); + if (registry == null) + { + registry = new PolicyRegistry(); + } - services.AddSingleton>(registry); - services.AddSingleton>(registry); - services.AddSingleton>(registry); + // Try to register for the missing interfaces + services.TryAddEnumerable(ServiceDescriptor.Singleton>(registry)); + services.TryAddEnumerable(ServiceDescriptor.Singleton>(registry)); + + if (registry is IConcurrentPolicyRegistry concurrentRegistry) + { + services.TryAddEnumerable(ServiceDescriptor.Singleton>(concurrentRegistry)); + } return registry; } diff --git a/src/HttpClientFactory/Polly/test/DependencyInjection/PollyHttpClientBuilderExtensionsTest.cs b/src/HttpClientFactory/Polly/test/DependencyInjection/PollyHttpClientBuilderExtensionsTest.cs index b0889ac7a454..0dc29491984d 100644 --- a/src/HttpClientFactory/Polly/test/DependencyInjection/PollyHttpClientBuilderExtensionsTest.cs +++ b/src/HttpClientFactory/Polly/test/DependencyInjection/PollyHttpClientBuilderExtensionsTest.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Net; using System.Net.Http; using System.Threading; @@ -522,6 +523,63 @@ public void AddPolicyHandlerFromRegistry_WithConfigureDelegate_AddsPolicyRegistr Assert.Same(registry, services.GetService>()); } + [Fact] + public void AddPolicyRegistry_DoesNotOverrideOrAddExtraRegistrations() + { + // Arrange + var serviceCollection = new ServiceCollection(); + + // Act 1 + var existingRegistry = serviceCollection.AddPolicyRegistry(); + + // Act 2 + var registry = serviceCollection.AddPolicyRegistry(); + var services = serviceCollection.BuildServiceProvider(); + + // Assert + Assert.NotNull(existingRegistry); + Assert.Same(existingRegistry, registry); + + Assert.Same(existingRegistry, services.GetService>()); + Assert.Same(existingRegistry, services.GetService>()); + Assert.Same(existingRegistry, services.GetService>()); + + Assert.Single(serviceCollection, sd => sd.ServiceType == typeof(IPolicyRegistry)); + Assert.Single(serviceCollection, sd => sd.ServiceType == typeof(IReadOnlyPolicyRegistry)); + Assert.Single(serviceCollection, sd => sd.ServiceType == typeof(IConcurrentPolicyRegistry)); + } + + [Theory] + [InlineData(typeof(IPolicyRegistry))] + [InlineData(typeof(IReadOnlyPolicyRegistry))] + [InlineData(typeof(IConcurrentPolicyRegistry))] + public void AddPolicyRegistry_AddsOnlyMissingRegistrations(Type missingType) + { + // Arrange + var serviceCollection = new ServiceCollection(); + var registry = new PolicyRegistry(); + var policyTypes = new List + { + typeof(IPolicyRegistry), + typeof(IReadOnlyPolicyRegistry), + typeof(IConcurrentPolicyRegistry) + }; + + // Act 1 + foreach (var policyType in policyTypes.Where(x => x != missingType)) + { + serviceCollection.AddSingleton(policyType, registry); + } + + // Act 2 + serviceCollection.AddPolicyRegistry(); + + // Assert + Assert.Single(serviceCollection, sd => sd.ServiceType == typeof(IPolicyRegistry)); + Assert.Single(serviceCollection, sd => sd.ServiceType == typeof(IReadOnlyPolicyRegistry)); + Assert.Single(serviceCollection, sd => sd.ServiceType == typeof(IConcurrentPolicyRegistry)); + } + // Throws an exception or fails on even numbered requests, otherwise succeeds. private class FaultyMessageHandler : DelegatingHandler { From 53845260d1ffa1a90fe4c499142bc6709dddeacf Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Tue, 20 Jun 2023 23:34:41 +0100 Subject: [PATCH 22/38] Progressively enhanced navigation (#48899) --- .../src/RazorComponentEndpointInvoker.cs | 1 + .../EndpointHtmlRenderer.Prerendering.cs | 20 ++ .../EndpointHtmlRenderer.Streaming.cs | 45 +++- .../Results/RazorComponentResultExecutor.cs | 2 + .../test/RazorComponentResultExecutorTest.cs | 10 +- ...ingComponentThatThrowsAsynchronously.razor | 2 +- .../Web.JS/dist/Release/blazor.server.js | 2 +- .../Web.JS/dist/Release/blazor.web.js | 2 +- .../Web.JS/dist/Release/blazor.webview.js | 2 +- src/Components/Web.JS/src/Boot.Web.ts | 26 ++- .../src/Rendering/DomMerging/AttributeSync.ts | 2 +- .../src/Rendering/DomMerging/DomSync.ts | 14 +- .../src/Rendering/StreamingRendering.ts | 24 +++ .../src/Services/NavigationEnhancement.ts | 201 ++++++++++++++++++ .../Web.JS/src/Services/NavigationManager.ts | 97 +-------- .../Web.JS/src/Services/NavigationUtils.ts | 102 +++++++++ src/Components/Web.JS/test/DomSync.test.ts | 24 +++ .../EnhancedNavigationTest.cs | 152 +++++++++++++ .../StreamingRenderingTest.cs | 63 +++++- .../RazorComponentEndpointsStartup.cs | 16 ++ .../RazorComponents/App.razor | 2 +- .../Pages/PageForScrollingToHash.razor | 27 +++ .../Pages/PageThatRedirects.razor | 10 + .../PageThatRedirectsWhileStreaming.razor | 13 ++ .../Pages/PageThatThrowsWhileStreaming.razor | 10 + .../RazorComponents/Shared/MainLayout.razor | 16 ++ 26 files changed, 758 insertions(+), 127 deletions(-) create mode 100644 src/Components/Web.JS/src/Services/NavigationEnhancement.ts create mode 100644 src/Components/Web.JS/src/Services/NavigationUtils.ts create mode 100644 src/Components/test/E2ETest/ServerRenderingTests/EnhancedNavigationTest.cs create mode 100644 src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/PageForScrollingToHash.razor create mode 100644 src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/PageThatRedirects.razor create mode 100644 src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/PageThatRedirectsWhileStreaming.razor create mode 100644 src/Components/test/testassets/Components.TestServer/RazorComponents/Pages/PageThatThrowsWhileStreaming.razor create mode 100644 src/Components/test/testassets/Components.TestServer/RazorComponents/Shared/MainLayout.razor diff --git a/src/Components/Endpoints/src/RazorComponentEndpointInvoker.cs b/src/Components/Endpoints/src/RazorComponentEndpointInvoker.cs index 3dba4acecea6..5b5244aa23a1 100644 --- a/src/Components/Endpoints/src/RazorComponentEndpointInvoker.cs +++ b/src/Components/Endpoints/src/RazorComponentEndpointInvoker.cs @@ -34,6 +34,7 @@ public Task RenderComponent() private async Task RenderComponentCore() { _context.Response.ContentType = RazorComponentResultExecutor.DefaultContentType; + _renderer.InitializeStreamingRenderingFraming(_context); if (!await TryValidateRequestAsync(out var isPost, out var handler)) { diff --git a/src/Components/Endpoints/src/Rendering/EndpointHtmlRenderer.Prerendering.cs b/src/Components/Endpoints/src/Rendering/EndpointHtmlRenderer.Prerendering.cs index 7337adb65e1b..eb0c205cbea1 100644 --- a/src/Components/Endpoints/src/Rendering/EndpointHtmlRenderer.Prerendering.cs +++ b/src/Components/Endpoints/src/Rendering/EndpointHtmlRenderer.Prerendering.cs @@ -147,6 +147,15 @@ private static ValueTask HandleNavigationExcept "Navigation commands can not be issued during server-side prerendering after the response from the server has started. Applications must buffer the" + "response and avoid using features like FlushAsync() before all components on the page have been rendered to prevent failed navigation commands."); } + else if (IsPossibleExternalDestination(httpContext.Request, navigationException.Location) && httpContext.Request.Headers.ContainsKey("blazor-enhanced-nav")) + { + // It's unsafe to do a 301/302/etc to an external destination when this was requested via fetch, because + // assuming it doesn't expose CORS headers, we won't be allowed to follow the redirection nor will + // we even find out what the destination URL would have been. But since it's our own JS code making this + // fetch request, we can have a custom protocol for describing the URL we wanted to redirect to. + httpContext.Response.Headers.Add("blazor-enhanced-nav-redirect-location", navigationException.Location); + return new ValueTask(PrerenderedComponentHtmlContent.Empty); + } else { httpContext.Response.Redirect(navigationException.Location); @@ -154,6 +163,17 @@ private static ValueTask HandleNavigationExcept } } + private static bool IsPossibleExternalDestination(HttpRequest request, string destinationUrl) + { + if (!Uri.TryCreate(destinationUrl, UriKind.Absolute, out var absoluteUri)) + { + return false; + } + + return absoluteUri.Scheme != request.Scheme + || absoluteUri.Authority != request.Host.Value; + } + internal static ServerComponentInvocationSequence GetOrCreateInvocationId(HttpContext httpContext) { if (!httpContext.Items.TryGetValue(ComponentSequenceKey, out var result)) diff --git a/src/Components/Endpoints/src/Rendering/EndpointHtmlRenderer.Streaming.cs b/src/Components/Endpoints/src/Rendering/EndpointHtmlRenderer.Streaming.cs index 90fabc379eb0..6301b123cdc4 100644 --- a/src/Components/Endpoints/src/Rendering/EndpointHtmlRenderer.Streaming.cs +++ b/src/Components/Endpoints/src/Rendering/EndpointHtmlRenderer.Streaming.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Runtime.InteropServices; +using System.Text.Encodings.Web; using Microsoft.AspNetCore.Components.RenderTree; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; @@ -13,8 +14,25 @@ namespace Microsoft.AspNetCore.Components.Endpoints; internal partial class EndpointHtmlRenderer { + private const string _progressivelyEnhancedNavRequestHeaderName = "blazor-enhanced-nav"; + private const string _streamingRenderingFramingHeaderName = "ssr-framing"; private TextWriter? _streamingUpdatesWriter; private HashSet? _visitedComponentIdsInCurrentStreamingBatch; + private string? _ssrFramingCommentMarkup; + + public void InitializeStreamingRenderingFraming(HttpContext httpContext) + { + if (httpContext.Request.Headers.ContainsKey(_progressivelyEnhancedNavRequestHeaderName)) + { + var id = Guid.NewGuid().ToString(); + httpContext.Response.Headers.Add(_streamingRenderingFramingHeaderName, id); + _ssrFramingCommentMarkup = $""; + } + else + { + _ssrFramingCommentMarkup = string.Empty; + } + } public async Task SendStreamingUpdatesAsync(HttpContext httpContext, Task untilTaskCompleted, TextWriter writer) { @@ -26,10 +44,16 @@ public async Task SendStreamingUpdatesAsync(HttpContext httpContext, Task untilT throw new InvalidOperationException($"{nameof(SendStreamingUpdatesAsync)} can only be called once."); } + if (_ssrFramingCommentMarkup is null) + { + throw new InvalidOperationException("Cannot begin streaming rendering because no framing header was set."); + } + _streamingUpdatesWriter = writer; try { + await writer.WriteAsync(_ssrFramingCommentMarkup); await writer.FlushAsync(); // Make sure the initial HTML was sent await untilTaskCompleted; } @@ -39,10 +63,12 @@ public async Task SendStreamingUpdatesAsync(HttpContext httpContext, Task untilT } catch (Exception ex) { + // Theoretically it might be possible to let the error middleware run, capture the output, + // then emit it in a special format so the JS code can display the error page. However + // for now we're not going to support that and will simply emit a message. HandleExceptionAfterResponseStarted(_httpContext, writer, ex); - - // The rest of the pipeline can treat this as a regular unhandled exception - // TODO: Is this really right? I think we'll terminate the response in an invalid way. + await writer.FlushAsync(); // Important otherwise the client won't receive the error message, as we're about to fail the pipeline + await _httpContext.Response.CompleteAsync(); throw; } } @@ -115,6 +141,7 @@ private void SendBatchAsStreamingUpdate(in RenderBatch renderBatch, TextWriter w } writer.Write(""); + writer.Write(_ssrFramingCommentMarkup); } } @@ -143,16 +170,16 @@ private static void HandleExceptionAfterResponseStarted(HttpContext httpContext, ? exception.ToString() : "There was an unhandled exception on the current request. For more details turn on detailed exceptions by setting 'DetailedErrors: true' in 'appSettings.Development.json'"; - writer.Write(""); + writer.Write(""); } private static void HandleNavigationAfterResponseStarted(TextWriter writer, string destinationUrl) { - writer.Write(""); + writer.Write(""); } protected override void WriteComponentHtml(int componentId, TextWriter output) diff --git a/src/Components/Endpoints/src/Results/RazorComponentResultExecutor.cs b/src/Components/Endpoints/src/Results/RazorComponentResultExecutor.cs index 9d61e92544a9..764ecdbe8d5f 100644 --- a/src/Components/Endpoints/src/Results/RazorComponentResultExecutor.cs +++ b/src/Components/Endpoints/src/Results/RazorComponentResultExecutor.cs @@ -51,6 +51,8 @@ internal static Task RenderComponentToResponse( var endpointHtmlRenderer = httpContext.RequestServices.GetRequiredService(); return endpointHtmlRenderer.Dispatcher.InvokeAsync(async () => { + endpointHtmlRenderer.InitializeStreamingRenderingFraming(httpContext); + // We could pool these dictionary instances if we wanted, and possibly even the ParameterView // backing buffers could come from a pool like they do during rendering. var hostParameters = ParameterView.FromDictionary(new Dictionary diff --git a/src/Components/Endpoints/test/RazorComponentResultExecutorTest.cs b/src/Components/Endpoints/test/RazorComponentResultExecutorTest.cs index 8a62f594a33b..7effacb7070e 100644 --- a/src/Components/Endpoints/test/RazorComponentResultExecutorTest.cs +++ b/src/Components/Endpoints/test/RazorComponentResultExecutorTest.cs @@ -224,7 +224,7 @@ await RazorComponentResultExecutor.RenderComponentToResponse( // Assert Assert.Equal( - $"Some output\n", + $"Some output\n", MaskComponentIds(GetStringContent(responseBody))); } @@ -269,8 +269,8 @@ public async Task OnUnhandledExceptionAfterResponseStarted_WithStreamingOn_Emits httpContext.Response.Body = responseBody; var expectedResponseExceptionInfo = isDevelopmentEnvironment - ? "System.InvalidTimeZoneException: Test message" - : "There was an unhandled exception on the current request. For more details turn on detailed exceptions by setting 'DetailedErrors: true' in 'appSettings.Development.json'"; + ? "System.InvalidTimeZoneException: Test message with <b>markup</b>" + : "There was an unhandled exception on the current request. For more details turn on detailed exceptions by setting 'DetailedErrors: true' in 'appSettings.Development.json'"; // Act var ex = await Assert.ThrowsAsync(() => RazorComponentResultExecutor.RenderComponentToResponse( @@ -278,9 +278,9 @@ public async Task OnUnhandledExceptionAfterResponseStarted_WithStreamingOn_Emits null, preventStreamingRendering: false)); // Assert - Assert.Contains("Test message", ex.Message); + Assert.Contains("Test message with markup", ex.Message); Assert.Contains( - $"Some output\n